The directory tree IS the process state. A tiny library for filesystem-shaped agent processes.
Project description
pmstate
The directory tree IS the process state.
A tiny Python library for agent-driven processes that live on the filesystem. Each node in your process tree owns a slice of state on disk — an append-only event log or a JSON table. The agent navigates, reads, spawns, and prunes the same way a human navigates a project folder.
No DSL. No decorators. No compile step. Plain attrs-shaped values, plain
JSON on disk, and a four-tool surface any LLM harness can drive.
Why
Most agent frameworks treat process state as opaque blobs in a vector store
or workflow engine. pmstate flips it: the tree of folders and files is
the state. That means:
- An agent can
ls-style introspect what's happening at any depth. - Branches spawn and die at runtime — no recompile.
- Every event is a CloudEvents-shaped JSON line. Replayable, auditable, human-readable.
- A human can
cata log file and see exactly what the agent saw.
Install
pip install pmstate # core
pip install pmstate[claude-sdk] # with the Claude Agent SDK harness
Example: build a hiring tracker in three commands
# 1. Edit pmstate.yaml to describe your tree (see docs/spec-authoring.md)
pmstate init # writes pmstate.example.yaml
$EDITOR pmstate.example.yaml && mv pmstate.example.yaml pmstate.yaml
# 2. Generate the project (tree.py, views.py, reducers.py, AGENTS.md, …)
pmstate init --from-spec pmstate.yaml my-process
cd my-process
# 3. Seed deterministic events and ask a question
pmstate seed --n 30
pmstate run "what's pending?"
# 4. Record real state changes via the generated add.py
python add.py candidate-advanced --leaf offers --from interviews --to offers --note "looked strong" --causationid seed-000002
That's the full loop. The agent gets four tools (list_tree, get_state,
find_state, read_log), reads the rolled-up state, and answers questions
like "what's blocking us?". One custom view, one reducer, the directory
tree on disk is the state.
Driving from Claude Code
pmstate.yaml is the source of truth. To translate a natural-language
request into a working tree, point Claude Code (or any orchestrating agent)
at [docs/spec-authoring.md](docs/spec-authoring.md). It documents the
schema and includes three worked examples (linear pipeline, kanban, log +
rollup hierarchy) plus a 5-rule recipe.
Concepts
- Node — a named position in the tree. May own
state(aLogorTable), aview(function: events → dict), areducer(function: children's views → dict), andchildren. - Log — append-only JSONL of CloudEvents-shaped events.
- Table — JSON document for slowly-changing reference data.
- Tree — the wrapper that gives you
spawn(parent, child)andprune(path)for runtime mutation. - Harness — adapter that wires the four agent tools into an LLM runtime.
Ships
ClaudeHarnesstoday; the surface is harness-agnostic.
Quickstart
New to pmstate? Walk through [QUICKSTART.md](QUICKSTART.md) — a
10-minute guide that builds a working agent-navigable process tree from
scratch using the CLI. Every concept is explained inline; every step has
runnable code. The original "write the seven files yourself" path is
preserved as an appendix.
The full CLI reference lives at [docs/cli.md](docs/cli.md); the
agent-facing spec authoring guide is at
[docs/spec-authoring.md](docs/spec-authoring.md).
A larger end-to-end example lives at
[examples/procurement/](examples/procurement/). After installing the
claude-sdk extra and setting ANTHROPIC_API_KEY:
git clone https://github.com/matshoppenbrouwers/pmstate
cd pmstate
uv sync --all-extras
uv run python -m examples.procurement.seed_data
uv run python examples/procurement/run.py "what is pending in procurement?"
Status
v0.2 alpha. Open but not supported. API will break
without warning. PRs not yet accepted. Stars welcome.
License
MIT.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pmstate-0.2.1.tar.gz.
File metadata
- Download URL: pmstate-0.2.1.tar.gz
- Upload date:
- Size: 163.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.9 {"installer":{"name":"uv","version":"0.11.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ea8fb18ea04b4c6c78698020915d8bb313764b842ce0d1941df4fa1913082f01
|
|
| MD5 |
5a5913281c175c3312ff175682ce5d09
|
|
| BLAKE2b-256 |
b965baa70c366c654a092a54fb2b4aaf28a0f385a20a401b7b786b4b41f433fe
|
File details
Details for the file pmstate-0.2.1-py3-none-any.whl.
File metadata
- Download URL: pmstate-0.2.1-py3-none-any.whl
- Upload date:
- Size: 38.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.9 {"installer":{"name":"uv","version":"0.11.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b1dda513d2eea7a3949561671c09a5f90f177e6cd531f890b55d7836265144c
|
|
| MD5 |
c1e39cc76b835bd0e0d58e54e51ee58e
|
|
| BLAKE2b-256 |
133b04ad8ea43923031e3db8979f74614a469e85d50fdb4f739352c8889091e9
|