Run a Plane board with a team of agent roles: a PM, parallel engineers, blind testers and a ticket writer. Each engineer takes one ticket into its own git worktree and environment slot and opens a PR; a tester checks it blind in the browser, then reviews the code and adds tests; the PM claims tickets oldest first, merges approved PRs in groups, confirms CI and deploy, and moves tickets to Done. Roles can run on other coding CLIs too, picked per spawn by task kind and remaining budget, with an outcomes log that promotes the executor that does best. Needs a Plane MCP server and the GitHub CLI.
version
1.0.0
updated
2026-10-09
works in
every conformant agent
needs
git · node
cost
free · uses your own account
license
MIT
Say this you do not type commands, you ask
“run the board”
“work the tickets”
“work PROJ-12”
“test PR 212”
“write a ticket for this”
“ship the queue on my own”
“plane fleet”
Once it is installed, that is the whole interface. Your agent picks the skill
up on its own and runs whatever it needs to. The commands further down are there for anyone who
would rather drive it themselves.
Install pick your agent
Requirements what to install, and why
Install the plugin, or link skills/plane-fleet (and, if you like, each roles/<name>) into
your agent's skills folder.
Set the three Plane variables in the environment your agent starts from.
In each repo, let the PM or solo role write .plane/config.json on first run, or write it
from references/config-schema.md. Keep private values (client contact, server names,
timezone) in ~/.config/plane-fleet/projects/<repo-name>.json instead of the repo.
Optional: give engineers and testers environment slots (fleet.slots and
fleet.slot_recipe) so they can run the app and check their work in a browser.
Examples copy and go
Changelog what changed, newest first
1.0.0
Added
Five roles that work a Plane board together: a PM that claims tickets oldest first and runs the merge queue, engineers that each take one ticket to a draft PR in their own worktree and environment slot, testers that check a PR blind in the browser and then add tests, a ticket writer, and a solo mode for one session.
Project config in .plane/config.json, with a private per-user override for client contacts, server names and timezone, and run-lane.sh config to print the merged result.
Executors: any role can run as a sub-session or as a background lane on another coding CLI, picked per spawn by role, task kind and remaining budget. Lanes write a result.json with status, report line, duration and token use, and never commit on their own.
One budget pacer for every executor: a hard stop and a pace rule on each meter, pacer-off and pace-off switches, and a lane that has no budget exits as deferred with a resume time.
One outcomes log for all projects, a scoreboard per role, task kind and executor, and automatic promotion or demotion of executors, written to a decisions file the owner can veto.
A hook that holds new fleet sub-sessions when the usage window is ahead of pace.
A Plane MCP server declared by the plugin, run from source with uvx.
An agent that has this installed reads CHANGELOG.md in the skill folder.
The same history is at changelog.json,
and every tool's releases are at /updates.json.
Roles
Role
File
Ends at
PM
roles/team-pm/SKILL.md
merged, deployed, CI/CD green, Done, client told
engineer
roles/team-engineer/SKILL.md
draft PR open, browser-reviewed, ticket In Review
tester
roles/team-tester/SKILL.md
Approved (label qa-approved) or Rework
ticket writer
roles/team-ticket-writer/SKILL.md
new ticket in Todo with an investigate gate
solo
roles/solo-ship/SKILL.md
the whole loop in one session, ticket by ticket
The entry point is SKILL.md, which routes a request to the right role. The roles are full
skills in their own right: you can link roles/team-pm into your skills folder as team-pm and
call it directly. Each role finds the shared files by resolving the plugin folder physically, so
a symlinked install works.
Requirements
A Plane MCP server named plane with the resource tools workitem, workitem_comment,
workitem_relation, workitem_attachment, state and label, each taking an action. The
plugin declares one in .mcp.json: the
itqanlab/plane-mcp-server fork, run from source
with uvx, pinned to a commit until the fork has a release tag. It reads three environment
variables:
PLANE_API_KEY: Workspace Settings → API tokens
PLANE_WORKSPACE_SLUG
PLANE_BASE_URL: only for a self-hosted Plane (default https://api.plane.so)
git, the GitHub CLI gh (signed in), python3, and node 18 or newer.
An agent that can start sub-sessions for the PM role. Without one, use the solo role, or run
one engineer or tester role by hand.
uv for the MCP server (uvx).
Executors, budget and the outcomes log
Every role runs as a sub-session by default. A role can also run on another coding CLI as a
background lane:
scripts/lanes/run-lane.sh pick --role engineer --kind api --cwd <repo>
scripts/lanes/run-lane.sh codex --model <model> --role engineer --ticket PROJ-12 \
--cwd <repo> --brief brief.md --out /tmp/PROJ-12-engineer
scripts/lanes/run-lane.sh budget # one line: Claude 46% (5h) · Codex 20% (wk) · Ollama ok
scripts/lanes/run-lane.sh stats # first-pass rate per role, task kind and executor
scripts/lanes/run-lane.sh apply # promote or demote executors, logged for veto
references/executors.md has the whole design. In short:
Registry.references/executors.json lists executors, models, roles, task kinds and
ranked candidates (champion first). It ships Claude-only. Opt in to other CLIs in
~/.config/plane-fleet/executors.json.
Selection. Mostly the champion, about one pick in five a challenger, never an experiment
for schema, money, concurrency, urgent work or a second attempt.
Budget. One pacer for every executor: a hard stop and a pace rule on each meter. The
Claude meter is a statusline relay file you point it at. Codex reads its own session logs.
Services with no usage API get a lane counter and back-off on 429.
Outcomes. One log for all projects at ~/.config/plane-fleet/executor-outcomes.jsonl,
tagged by project, back-filled as tickets move.
User-level state lives in ~/.config/plane-fleet/, or wherever PLANE_FLEET_HOME points.
Other coding CLIs
CLI
Needs
Codex
the codex CLI, signed in, and the two profiles from references/codex-profiles/ copied into $CODEX_HOME
opencode
the opencode CLI and a provider in its config, for example an OpenAI-compatible ollama-cloud provider with baseURLhttps://ollama.com/v1 and apiKey{env:OLLAMA_API_KEY}
Engineer and tester lanes on Codex run with full access, because Codex's sandbox keeps every
.git path read-only and a lane must commit. opencode has no OS sandbox; give it read-only
roles.
The usage pacer hook
hooks/usage-pacer.py runs before every sub-session spawn, through the plugin's
hooks/hooks.json. It holds new fleet sessions when the Claude window is ahead of pace or past
the hard stop. Without a meter configured it judges nothing. Turn it off with
touch ~/.config/plane-fleet/pacer-off, or keep only the hard stop with pace-off.