pm is a task tracker that lives in markdown files and speaks MCP. Your coding agent - Claude Code, Codex, any MCP client - reads and updates your tasks as a side effect of the conversation; you keep a kanban TUI, a web cockpit and grep. One Go binary, files under ~/.claude/pm/, no cloud, no database, no account.
- Files you can read. A task is one markdown file with YAML frontmatter next to its project's
project.yaml. Each field has a write rule that survives many sessions: the brief overwrites, links merge, the Spec zone is rewritten in place, the Log zone only ever grows.grepworks,gitworks, any editor is a client. data-model.md - An MCP server.
pm mcpgives the agent 14 tools: context at session start, tasks, projects, journals, timeline. Stdio, so any MCP client can register it; Claude Code and Codex are the two with an install recipe below. It runs on an output budget, because a rollup paid at every session start is paid every time. mcp.md - A board.
pmopens a kanban TUI with per-project tabs and vim keys: eight views, from the columns to a live worker transcript, and a launch menu that starts a Claude Code, Codex or executor session on a task and links it back. board.md - A cockpit.
pm serveis a JSON API plus a React app. Its home screen is Today: one attention queue computed from local files - failed runs, work that landed with no acceptance, tasks waiting on a person, stuck projects. A change feed answers "what happened since yesterday evening" from pm's files,gitand GitHub. No auth, no TLS; bind it to localhost. cockpit.md - Solo: one session, a queue, nobody watching. The cockpit's Runs screen starts a Claude Code background session (
claude --bg, Claude Code 2.1.272 or newer) in the project's checkout with the/soloskill and the queue you typed; you canclaude attachto it from any terminal. pm reads the shift's state file and report back from.shift/, lists the shift under/runs, shows the report at/solo/<project>/<shift>and keeps a closed shift on Today for 14 days. The skill itself - the per-task procedure and its guard hook - lives in mbalazy/claude-skills, not in this repository. solo-and-batch.md - Batches and epics through headless workers.
pm run-epicdrives a tracker's subtasks through isolatedclaude -pworkers, one fresh process per sub. Integration mode merges them onto one epic branch and ends in one draft PR; independent mode (epic_mode: independent) gives every sub its own branch off the base, pushes whatever carries commits and merges nothing.pm finishruns the acceptance as a third run kind, chained automatically withfinish_mode: auto. Worktree slots, hook-enforced review, a verification baseline. Frozen in favour of solo since 2026-09-09 and hidden in the cockpit unlesscockpit.show_executoris on; complete from the CLI and the board. executor.md - Two records a project keeps. A journal of how one repeatedly-troublesome subsystem actually behaves, and a timeline of what happened to the project, with state snapshots whose every line says whether it was verified or assumed. journals-and-timeline.md
- A CLI for all of it. Every surface above is reachable from the shell, and
pm today --jsonis the cockpit's queue byte for byte. cli.md
PM_DATA_DIR relocates the data directory, so nothing below touches ~/.claude.
export PM_DATA_DIR=$(mktemp -d)
pm init # create the data directory
pm projects add demo --path "$PWD" # one project per repo
pm add demo "Try pm for a day" # -> demo-1
pm mv demo demo-1 doing
pm list # the table
pm context # the rollup an agent reads at startup
cat "$PM_DATA_DIR"/demo/demo-1-*.md # ... which is this file
pm board # the TUI; q, then q again, leavesGo 1.24+ and git, plus gh for pull requests. The MCP server works with any MCP client; the parts that launch agents - the board's launch menu, solo, the executor - drive the Claude Code CLI (the board can also launch Codex).
go install github.com/mbalazy/pm-cli/cmd/pm@latestThe binary lands in $(go env GOBIN), or $(go env GOPATH)/bin when that is empty; put it on your PATH. The cockpit's front end is a Node build, so it is in the binary only after make install-full from a clone; a go install binary serves the API and says so on its front page.
Then register the MCP server with your client and give the agent its usage contract. For Claude Code:
claude mcp add --transport stdio --scope user pm -- pm mcp
pm docs guide >> ~/.claude/CLAUDE.mdFor Codex:
codex mcp add pm -- pm mcp
pm docs guide >> ~/.codex/AGENTS.mdThe first line writes [mcp_servers.pm] with command = "pm" and args = ["mcp"] into ~/.codex/config.toml; if pm is not on the PATH Codex launches with, put the full path in command. Codex asks before every tool call unless told otherwise, and pm's read tools are safe to wave through, so a [mcp_servers.pm.tools.<tool>] block with approval_mode = "approve" per tool (or default_tools_approval_mode on the server) is the setting most people end up with. The guide goes into whichever AGENTS.md Codex reads for the project: ~/.codex/AGENTS.md for every project, or the repository's own.
The second line is not optional for either client: the MCP server gives the agent the tools, the guide gives it the workflow - when to record what, the brief format, the Spec/Log write rules, and who closes a task. One block, wrapped in <!-- pm:agent-guide:start/end --> markers, the same bytes for every client (pm docs claude is the older name and still works); to refresh it after an upgrade, delete the block and append again.
Finally, one project per repo:
pm projects add <slug> --path /path/to/repo--path matters: cwd auto-detection matches against it, so a project without one is never found from its own repo. After that you mostly stop operating pm by hand: "add a task: fix the login flow", "what am I working on?", "save a brief, I'm done for today".
The procedures the agent follows when nobody watches are not in this binary: /solo, the acceptance pm finish runs, the simulator and browser verification live in mbalazy/claude-skills. Without them a launch starts a session with nothing to follow, so install them once - install.sh links every skill into ~/.claude/skills (or the config dir in CLAUDE_CONFIG_DIR) and a git pull there updates them in place:
git clone https://github.com/mbalazy/claude-skills
./claude-skills/install.shpm executor doctor <project> warns while solo or batch-finish-auto is missing, and so does the cockpit's launch preview.
A personal tool, in daily use since February 2026; releases are one line each in CHANGELOG.md. One machine, one user: no sync, no account, no API key - the agent parts drive the claude CLI, so they run on a Claude subscription. Developed on macOS; CI runs the suite on Linux, but the desktop bits are untested there. Not looking for contributions, though bug reports are welcome. Versions promise each other nothing, except that task files stay readable: markdown.
| docs/cli.md | every command and flag |
| docs/data-model.md | the files: task fields and write rules, project.yaml, config.yaml, the attention queue |
| docs/mcp.md | the 14 tools as a reference |
| docs/board.md | the TUI: views, keys, launchers |
| docs/cockpit.md | pm serve: screens, routes, then the design record |
| docs/journals-and-timeline.md | the two per-project records |
| docs/solo-and-batch.md | solo shifts and executor batches: how to start one, where the result shows up |
| docs/executor.md | the executor: manual, then internals |
| docs/development.md | build, test, CI, release |
| docs/design-log.md | why the rules are what they are |
| docs/README.md | the index, with the two files the binary embeds for the agent |
Developed with Claude Code; CLAUDE.md is the agent's working memory and doubles as the contributor guide.