flagship project, open source
pm cli
project management is a context problem. pm cli keeps goals, tasks, acceptance criteria and decisions in one record that people and agents share, in a plain folder or hosted, with or without git. every change lands in an append-only history, so a fresh session can read what happened and carry on.
demonstration
one task, two sessions
the first agent session creates a task, records a decision and stops. a second session starts with no chat history at all. everything it needs is in the repository.
the project is synthetic; the output is real, recorded with pm 2026.10.18. item ids differ on every run.
session 1: create the task with its acceptance criteria.
pm create task "Rate-limit the public orders API" --ac "Clients over 100 requests/min per API key receive 429 with Retry-After" --ac "Limits hold across all replicas" id: "shop-o0z1" status: "open" changed_field_count: 11 claim it and start work.
pm claim shop-o0z1 --start id: "shop-o0z1" action: "start_task" … claimed_by: "agent-one" …record the decision and the rejected alternative.
pm comments shop-o0z1 "Decision: shared token bucket in Redis. Rejected in-memory counters: each of the 3 replicas would allow its own 100/min." comments[1]{created_at, author, text}: "2026-10-18T 19:09:13.058Z", agent-one, "Decision: shared token bucket in Redis. Rejected in-memory counters: each of the 3 replicas would allow its own 100/ min." … leave a note for whoever continues, then stop.
pm comments shop-o0z1 "Next: middleware is written; integration test for Retry-After still missing." comments[1]{created_at,author, text}: "2026-10-18T 19:09:16.295Z", agent-one, "Next: middleware is written; integration test for Retry-After still missing." … session 1 ends. only the repository carries over.
session 2, fresh: a fresh session asks what is in progress.
pm list --status in_progress items[1]{id,status, type, title}: shop-o0z1, in_progress, Task, Rate-limit the public orders API … it reads the criteria, the decision and the open step.
pm get shop-o0z1 --fields title,status, acceptance_criteria, comments title: "Rate-limit the public orders API" status: "in_progress" acceptance_criteria: "Clients over 100 requests/ min per API key receive 429 with Retry-After; Limits hold across all replicas" comments[2]{created_at, author, text}: "2026-10-18T 19:09:13.058Z", agent-one, "Decision: shared token bucket in Redis. Rejected in-memory counters: each of the 3 replicas would allow its own 100/ min." "2026-10-18T 19:09:16.295Z", agent-one, "Next: middleware is written; integration test for Retry-After still missing." … it records the outcome and closes the task.
pm close shop-o0z1 "Retry-After integration test added and passing" --resolution "Redis token bucket middleware plus integration test" --expected "429 with Retry-After above 100/min on every replica" --actual "Request 101 across 3 replicas returned 429 with Retry-After" id: "shop-o0z1" status: "closed" … close_reason: "Retry-After integration test added and passing" every step stays in the item history.
pm history shop-o0z1 compact_history[8]{index,ts, op, author, patch_ops, …}: 1, "2026-10-18T 19:09:07.303Z", create, agent-one, 11, … 2, "2026-10-18T 19:09:10.152Z", claim, agent-one, 3, … … 4, "2026-10-18T 19:09:13.058Z", comment_add, agent-one, 2, … 5, "2026-10-18T 19:09:16.297Z", comment_add, agent-one, 2, … 6, "2026-10-18T 19:09:18.294Z", release, agent-one, 3, … 7, "2026-10-18T 19:09:25.381Z", claim, agent-two, 3, … 8, "2026-10-18T 19:09:28.630Z", close, agent-two, 9, … …
recorded 18 oct 2026 with pm 2026.10.18. lines marked … are trimmed.
try it yourself
run the same handoff
install the cli, then run these commands in an empty git repository. use a second terminal for session 2: nothing but the files in the repository carries over.
npm install -g @unbrained/ pm-clirequires node.js 22.18 or newer.
# Session 1
export PM_AUTHOR=agent-one
pm init shop --defaults --agent-guidance skip --workspace .
pm create task "Rate-limit the public orders API" --ac "Clients over 100 requests/ min per API key receive 429 with Retry-After" --ac "Limits hold across all replicas"
pm claim <id> --start
pm comments <id> "Decision: shared token bucket in Redis. Rejected in-memory counters: each of the 3 replicas would allow its own 100/ min."
pm comments <id> "Next: middleware is written; integration test for Retry-After still missing."
pm release <id>
# Session 2: a new terminal, no shared history
export PM_AUTHOR=agent-two
pm list --status in_progress
pm get <id> --fields title, status, acceptance_criteria, comments
pm claim <id>
pm close <id> "Retry-After integration test added and passing" --resolution "Redis token bucket middleware plus integration test" --expected "429 with Retry-After above 100/ min on every replica" --actual "Request 101 across 3 replicas returned 429 with Retry-After"
pm history <id>replace <id> with the id that pm create prints.
ecosystem
beyond the terminal
the cli keeps the record as plain text in any folder, in a git repository or not. the same tracker also runs hosted, shared live from the browser, chatgpt or any mcp client, and public trackers are searchable.
- documentationpm-cli
.unbrained.devquickstart, command reference, package catalog and changelog. - browserpm-web
.unbrained.devboards, lists and item history in the browser, live for the whole team. - chatgpt and codexpm-gpt
.unbrained.devread, plan and update hosted pm projects from chatgpt and codex. - any mcp clientpm-mcp
.unbrained.deva remote mcp endpoint with oauth for coding agents and ides. - public searchpm-search
.unbrained.devfind decisions, tasks and fixes in the pm items of public repositories, pinned to the exact commit.