pma
Maintenance across many repositories from one place.
Status: every stage of the design: lint, scan, matrix, health, agent dispatch with review and ship, Issues sync, notes, the deps signal, and a TUI. claude, opencode and omp come as worker templates; any coding agent with a headless mode is a record rather than a code change.
Workflows -- a graph of agents over a project, specified in JSON or a Rhai script -- are in progress: a document is read, costed and stored, and a pass runs every node a rule decides. A node an agent decides is planned and priced, and spends nothing until you approve it. Design: workflows.md.
Install
From a clone: make install.
Requirements:
-
macOS or Linux. The database location is derived from
HOME. -
Rust 1.89 or later, and a C compiler: SQLite is compiled in.
-
gitonPATH. -
gh, authenticated, for CI status. Without it, CI is recorded as unknown and left out of health;pma scan --offlineskips GitHub on purpose. Also for fix-CI dispatch,publish = pr, andpma sync. -
A coding agent for
pma dispatch:claude,opencodeoromp, logged in or holding its own provider key.pmaruns agents and is not an API client, soANTHROPIC_API_KEY,OPENAI_API_KEYandOPENROUTER_API_KEYare inherited by the agent from your session; what it strips is what lets a child push.
TODO.md format
-
-
-
The section gives the priority. A finished item is ticked where it stands; pma prune removes finished items. A ### heading inside a section groups the items below it. Trailing #tag, due:YYYY-MM-DD and gh:N (a linked issue) are optional. The full rules are in the design.
Commands
Output is path:line: severity: message. Exit status is 1 when any file has an error or cannot be read. Warnings alone exit 0.
matrix and status read the last scan; they do not rescan. Only tiered projects appear in them.
A target that names one task fails when that task cannot run. One that names many passes each over with its reason and dispatches the rest. -a and -m outrank pma config agent, pma config model and any applied route; without -m the agent picks its own model, and pma config model applies only to the agent it was set alongside.
Each run gets a worktree of the remote default branch under ~/.config/pma/worktrees, so a dirty clone is never touched. The agent runs without push credentials. pma then runs the project's tests itself: set the command with pma config projects.cynn.verify "make check", or let it be detected. Limits: max_parallel, batch_budget, agent_budget, timeout. publish is pr by default; pma config publish push pushes to the default branch instead. A run shipped as a PR stays pr-open until the PR is merged or closed, and its task is not dispatched again meanwhile.
A preset names a worker, a model and the arguments that configure it. Effort is arguments rather than a field, because what expresses it differs per agent. Highest first: -a and -m, then -p, then an applied route, then pma config preset, then pma config agent.
dispatch, ship, and review --reject or --rework hold a lock on session.lock, so only one of them runs at a time; an open task list holds it too. Other commands, including pma review to watch a batch, can run alongside. The agent may edit files and run the verify command; other shell commands are denied unless your Claude Code settings allow them. pma ship resumes after a failure without publishing twice.
Each ## Critical item gets an issue labelled pma:critical, and gh:N is written into its line. An item whose issue is closed is ticked. TODO.md edits are left uncommitted; scripts/commit_todo.py commits them.
The database is ~/.config/pma/projects.db, or $PMA_HOME/projects.db. Dates are compared as UTC calendar days.
Development