Skip to main content

The directory tree IS the process state. A tiny library for filesystem-shaped agent processes.

Project description

pmstate

PyPI CI Python

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 cat a 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: a procurement flow in 28 lines

from pmstate import Node, Log, Table, Tree
from pmstate import ClaudeHarness

def quote_view(events):
    """Vendor quotes received and pending approval."""
    pending = [e for e in events if e["type"] == "quote.received"
               and not any(a["data"]["quote_id"] == e["id"]
                           for a in events if a["type"] == "quote.approved")]
    return {"pending_count": len(pending), "latest": pending[-1] if pending else None}

def procurement_rollup(children):
    return {
        "open_quotes": children["quotes"]["pending_count"],
        "open_lpos":   children["lpos"]["count"],
        "blocked":     children["quotes"]["pending_count"] > 5,
    }

procurement = Node(
    "procurement",
    description="Vendor quotes, LPOs, approvals.",
    reducer=procurement_rollup,
    children=[
        Node("quotes", state=Log("state/quotes.jsonl"), view=quote_view),
        Node("lpos",   state=Log("state/lpos.jsonl")),
        Node("vendors", state=Table("state/vendors.json")),
    ],
)

tree = Tree("project_alpha", root=Node("active", children=[procurement]))
ClaudeHarness(tree).run()

That is the full procurement flow. One custom view, one reducer, three leaves. The agent gets four tools (list_tree, get_state, find_state, read_log), discovers the structure on its own, and answers questions like "what's blocking us?" by reading the rolled-up state.

Concepts

  • Node — a named position in the tree. May own state (a Log or Table), a view (function: events → dict), a reducer (function: children's views → dict), and children.
  • 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) and prune(path) for runtime mutation.
  • Harness — adapter that wires the four agent tools into an LLM runtime. v0.1 ships ClaudeHarness; the surface is harness-agnostic.

Quickstart

New to pmstate? Walk through QUICKSTART.md — a 10-minute guide that builds a working agent-navigable process tree from scratch (no procurement domain knowledge required). Layman-friendly: every concept is explained inline, every step has runnable code.

Already comfortable? A larger end-to-end example lives at 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?"

The agent navigates the procurement subtree, calls the four pmstate tools, and answers from the rolled-up view. Costs a few cents per run.

Status

v0.1 alpha. Open but not supported. One user (Laterite). 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

pmstate-0.1.1.tar.gz (139.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pmstate-0.1.1-py3-none-any.whl (21.7 kB view details)

Uploaded Python 3

File details

Details for the file pmstate-0.1.1.tar.gz.

File metadata

  • Download URL: pmstate-0.1.1.tar.gz
  • Upload date:
  • Size: 139.1 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

Hashes for pmstate-0.1.1.tar.gz
Algorithm Hash digest
SHA256 b01f72a2e8a775d61560323246d90d9ad20d5dce6455f0dedb0cdc3e3ceeb498
MD5 b0abca244e58e2b0540f68745176e634
BLAKE2b-256 e57d533acba891b2eb0c6bdcb242accdc6b45c2752157bc4387415ced5b15af5

See more details on using hashes here.

File details

Details for the file pmstate-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: pmstate-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 21.7 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

Hashes for pmstate-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 cade2c8be361f7b609275f175fb3e8e4e7fde1c17f46267341bf1190ae299c15
MD5 cb2ec0f52455b1264e9150a93fe40c31
BLAKE2b-256 4b3daaadceaf8a1f2e5666098abb7fbcf8aefccd534c9648ec7d24d05c27b99c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page