English · 简体中文
Two skills that turn a spec into finished branches: /route classifies and splits its tickets
across your Claude and Codex subscriptions, /crew runs them as unattended waves of tmux child
agents.
mattpocock-skills grilling → to-spec → to-tickets → implement one ticket at a time
AgentCrew grilling → to-spec → route → crew the whole frontier at once
AgentCrew is an aggregating enhancement of mattpocock-skills:
it keeps grilling and to-spec exactly as they are and replaces the back half of the pipeline.
/route invokes /mattpocock-skills:to-tickets under a routing overlay, so ticket granularity and
routing are one approval; /crew runs the routed tickets. The Matt-first principle governs every
integration question — the overlay only adds rules, and where AgentCrew's needs and Matt's skills
tension, Matt's experience wins.
One real run, cut to 30 seconds.
/routeproposing a five-ticket split and taking a revision; the wave table with one child per vendor and each reviewed by the other lane; wave 2 running with both monitors armed; and the report — five tickets completed oncrew/textkitin 30m 17s across three waves. AgentCrew built by AgentCrew: this is the run that accepted this release.
Hand it a spec at night; find an integration branch to review and a decision log in the morning. Short of destroying data, it pushes everything forward on its own.
| Skill | Takes | Gives back |
|---|---|---|
/route <feature-dir> |
a spec, with or without tickets | every ticket carrying a ## Routing section — workflow, executor, model, effort, and a review lane on the reviewed workflows |
/crew <feature-dir> |
routed tickets | an integration branch crew/<slug>, a report.md with a per-ticket duration table, and a machine log of everything the run did |
/route has two modes, decided by what the feature directory holds. A spec with no tickets is cut
and routed in one pass; a feature that already has tickets is routed and nothing is cut, so you can
adopt AgentCrew on work already in flight. Routing is a suggestion: one table, one checkpoint, and
nothing is written until you approve it.
/crew gives each ticket its own git worktree and its own tmux window, so unattended never means
invisible — you can attach to any child and take over mid-run. Children escalate over the
cross-session message channel and report a full 40-character commit sha, which the coordinator
verifies before merging. The base branch is untouched for the whole run; the final merge is yours.
- Claude Code, with the mattpocock-skills plugin
installed —
/routeinvokes/to-tickets, and the setup wizard sends you to/setup-matt-pocock-skillswhen your repo has no issue-tracker convention document. - tmux — children run as windows of the coordinator's session.
- Python 3.11+ — the config validator and the Codex bridge.
- For Codex tickets: the Codex CLI, and the
aiohttppackage installed for the Python interpreter Claude Code runs. - For reviewed tickets — every
tddandrefactorticket: Review-Switch, installed so that itsreview-bridgecommand is on yourPATH. AgentCrew ships no review implementation of its own and calls that command across a process boundary (docs/adr/0020-review-switch-owns-the-review-agentcrew-owns-the-reviewer.md), so a run whose wave table carries a review lane stops in preflight until it is installed.
Every repo you use AgentCrew in also needs docs/agents/issue-tracker.md: both skills read it to
learn where tickets live and where status is written back, and neither has a fallback.
A project may also configure a base gate as an argv list: for example,
[preflight] gate = ["python3", "scripts/test.py"]. AgentCrew snapshots the selected local base
tip into a dedicated Crew worktree, then runs the gate there without a shell before any child is
launched. It never fetches or moves the local base branch. With no gate, the run proceeds and both
the machine log and final report say
base gate: none configured; a skipped gate is never reported as a pass.
/plugin marketplace add okqixiaobao727-design/agentcrew-dev-skills
/plugin install agentcrew-dev-skills@agentcrew-dev-skills
To run from a local checkout instead — to read the skills, or to edit them — clone the repo and add the clone as the marketplace:
git clone https://github.com/okqixiaobao727-design/agentcrew-dev-skills.git/plugin marketplace add ./agentcrew-dev-skills
/plugin install agentcrew-dev-skills@agentcrew-dev-skills
/route <feature-dir>in your project. A repo with noagentcrew.tomlat its root starts at the setup wizard, which settles the issue-tracker convention document and then copies the shipped defaults — comments and all — toagentcrew.tomlat your repo root. Ask for the wizard any time to reconfigure.- Read the table
/routeprints. One row per ticket — workflow, executor, model, effort, review lane, and the test that decided each — headed by the config file the cells resolved from. Revise until it is right; it writes only once you approve. /crew <feature-dir>. It rebuilds the wave table from what the tickets now carry, asks once, then runs: a worktree and a tmux window per ticket, waves cut from the dependency frontier, each landed branch merged intocrew/<slug>before the next wave is cut.- Review the integration branch and
report.md, then merge it yourself.
To check a config file you have edited by hand:
python3 scripts/validate_plugin_tree.py --config agentcrew.tomlIt prints one line per problem and exits non-zero. A case your file leaves out is not a problem: the shipped defaults answer every case, so a project file carries only the cells it overrides.
The configurable surface lives in agentcrew.toml at your repo root. The classification logic —
six workflows, core vs non-core, complex vs routine — is fixed product opinion: you configure the
outcomes, not the decision procedure. The shipped, commented defaults are
config/agentcrew.default.toml.
Every cell carries the same three fields:
| Field | Value |
|---|---|
executor |
claude or codex — the vendor that runs the ticket |
model |
passed verbatim to that vendor's launch command, so a Codex model is its full slug |
effort |
passed verbatim too — the reasoning effort the vendor is launched at |
| Cell | The case it answers | Shipped default |
|---|---|---|
implementer.tdd-refactor.core-complex |
reviewed code whose design decisions downstream couples to, crossing modules or leaving the approach open | claude / claude-opus-5 / medium |
implementer.tdd-refactor.core-routine |
the same coupling, contained and specified | claude / claude-opus-5 / medium |
implementer.tdd-refactor.non-core-complex |
nothing couples to its design decisions, but the work is intricate | claude / claude-opus-5 / medium |
implementer.tdd-refactor.non-core-routine |
contained, specified, and nothing downstream depends on how it is built | codex / gpt-5.6-luna / max |
implementer.direct.any |
prose, docs, skill copy, config — every difficulty | claude / claude-opus-5 / medium |
implementer.spike.directed-collection |
the questions are enumerable up front, each naming its verification method, with no recommendation in the deliverable | codex / gpt-5.6-luna / max |
implementer.spike.open-exploration |
any one of those three missing | claude / claude-opus-5 / medium |
implementer.ops.mechanical |
an action against an environment, run and recorded | codex / gpt-5.6-luna / max |
implementer.ops.acceptance-judgement |
the same run, ending in a judgement of the result | claude / claude-opus-5 / medium |
implementer.acceptance.any |
finishing needs a human, so the agent prepares and hands over | claude / claude-opus-5 / medium |
The three tdd-refactor cells that share a default are listed separately so any one of them can be
retargeted on its own.
tdd and refactor are the only workflows whose diff a review can catch anything in, so they are
the only ones that carry a reviewer. The quadrant that chose the implementer chooses the reviewer,
whose vendor, model and effort are configured independently. The shipped lanes remain cross-vendor,
but a project may retarget any cell to a same-vendor lane; either relationship always launches a
fresh Reviewer session through Review-Switch rather than reusing the Implementer's session.
| Cell | Shipped default |
|---|---|
reviewer.core-complex |
codex / gpt-5.6-sol / medium |
reviewer.core-routine |
codex / gpt-5.6-luna / max |
reviewer.non-core-complex |
codex / gpt-5.6-luna / max |
reviewer.non-core-routine |
claude / claude-opus-5 / medium |
A finding the coordinator rules a diagnosis — cause, approach or reach still open — becomes a
ticket this run inserts into itself as the next Wave to launch, whose child diagnoses it before
implementing it (ADR-0028). No classification session runs mid-run, so this cell is that
classification's standing answer. It is one cell rather than a table because the case is always
the same one, and it carries a workflow on top of the three fields every cell above carries,
because nothing upstream chose one.
| Field | What it answers | Shipped default |
|---|---|---|
workflow |
which of the six workflows the ticket is worked under | tdd |
executor |
the vendor that runs it | claude |
model |
its full model ID, never an alias | claude-opus-5 |
effort |
the reasoning effort it is launched at | medium |
review |
its Review lane's own executor, model and effort, read on the two workflows that carry a Review line and ignored on the four that carry none |
codex / gpt-5.6-luna / max |
This cell is inherited field by field rather than whole: name only the fields you retarget, and the
rest stay as shipped. There is deliberately no account key — which subscription pays is not a
fact about the kind of work, so a queued ticket names none and runs on the coordinator's own
account. A file that puts an account here stops the run in preflight rather than binding one.
[queued]
effort = "high"
[queued.review]
effort = "xhigh"Both fields are empty by default, and both empty means a child launches exactly as it would with no hook at all.
| Field | Value |
|---|---|
command |
a shell command run once per child at launch, in that child's working directory — wire it to whatever notification or session-tracking system you already run |
env |
a table of string environment variables added to every child's environment, and to the hook command's |
The command also receives two variables naming the child that launched:
| Variable | Value |
|---|---|
AGENTCREW_CHILD_CWD |
the child's working directory |
AGENTCREW_CHILD_TMUX_TARGET |
the tmux window or pane the child runs in, empty for a child that has none |
The command is a courtesy to what you already run: one that fails or hangs leaves the launch itself standing, and the run records what it printed.
[hooks.on-child-launch]
command = "notify-send 'AgentCrew child launched' \"$AGENTCREW_CHILD_CWD\""
[hooks.on-child-launch.env]
MY_PROJECT_MODE = "unattended"surface |
What the run does |
|---|---|
window |
gives the run its own tmux window, as it always has — the default |
pin |
skips that window and draws the same frame into the coordinator's Claude Code statusline, so there is nothing to close when the run ends |
both |
runs each, deduping toasts through the run's one toast state |
[dashboard]
surface = "window"What the pinned dashboard is and how it is wired into Claude Code is in
docs/monitor-dashboard.md.
gate is a non-empty argv list, not a shell command string. After the cheap read-only preflight
checks, the Driver creates <repo>/.claude/worktrees/crew-<run-slug> at the selected local base
branch's current committed tip, checks out the Integration branch there, and runs the gate in that
Crew worktree. Exit 0 passes. Any other exit status stops the fresh run as preflight-failed,
removes that not-yet-active Crew worktree and its fresh Integration branch, leaves the invoking
checkout unchanged, and shows the command, exit status, and output tail in the preflight notice.
AgentCrew sets no timeout and does not parse test-runner output; the configured command owns both
concerns.
Once active, all Wave merges use the recorded Crew worktree. The invoking checkout may switch
branches or gain edits without affecting the Run. Completion, failure, and interruption retain the
Crew worktree and Integration branch for inspection; only the explicit confirmed clear command
removes them. Ticket worktrees remain siblings under the same ignored worktree root.
Like every other value in the run section, the gate argv is read once from the project's config at start; fixing the local base snapshot does not re-read any run configuration. The machine log records the captured argv that was actually executed.
[preflight]
gate = ["python3", "scripts/test.py"]The key is optional and has no shipped active default. A fresh run with no key records
base gate: none configured; adopting an existing run never executes the gate again.
A mechanical merge conflict — two children inserting at the same point, neither rewriting the other's work — is resolved by the merge driver itself, at no cost. The one it will not rewrite, where the file's own text carries a line that reads as a conflict marker, goes to a headless session under a hard budget cap before anything reaches the coordinator. Pick a cheap model: the rung exists to keep mechanical work off the expensive one. A full model ID, never an alias, and no default — a run whose config names none stops in preflight.
[repair]
model = "claude-sonnet-5"Which of the two exercised trackers a run's close operation and its recorded undo are those of:
github, where a ticket is an issue reached through gh, or local, where a ticket is a markdown
file whose Status: line carries what a label carries on github. No default, and any other value
stops the run in preflight rather than reaching a CLI nobody named.
[tracker]
kind = "local"A ticket may name the account it runs on: a named Claude Code login whose subscription that ticket's children spend. This section declares the names this repository expects, never a path — the name-to-profile-directory map is a machine-level file. Both are optional, and a project on one subscription leaves this section out and creates no file.
[accounts]
names = ["work", "side"]What an account is, where the registry lives, what a ticket naming an unregistered one does, and
why an unauthenticated profile surfaces at the verification timeout are in
docs/accounts.md.
Both skills read your repo's docs/agents/issue-tracker.md and hard-code no tracker.
| Tracker | Status |
|---|---|
| GitHub Issues | Supported. Tickets are issues; /crew closes each completed one and clears the label that marks it available for pickup |
| Local markdown files | Supported. /route writes ticket files only, and /crew flips each ticket's Status: line instead of closing an issue — no remote required |
| GitLab, Jira, Linear, anything else | Untested. Both skills follow whatever your convention document describes, and this release has never been run against them. That is the whole of the support statement |
python3 scripts/validate_plugin_tree.py validates a plugin tree — manifest, skill slots, config
defaults, self-referential paths — and lints it for residue that has no business in a public repo:
private bridge paths, private environment tokens, spend figures, and the skill's retired name.
That lint also rejects personal identifiers, which it cannot guess: your machine nicknames, your
account names. List yours one per line in .agentcrew-local-identifiers at the tree root — the file
is gitignored, so your list stays yours — or set AGENTCREW_LOCAL_IDENTIFIERS to a comma-separated
list, which covers every checkout at once and wins over the file. Configure none and that one rule
stays inert; the other four still run.
- The Codex bridge —
codex_bridge.pyis copied in as it stands; a rewrite is planned. - The mattpocock-skills dependency — required today, optional later.
docs/design.md— the architecture, the red line, and the rejected alternatives.docs/glossary.md— the vocabulary both skills speak.docs/accounts.md— running a wave's tickets on more than one Claude subscription: the registry, what a ticket names, and what each failure path says.docs/dogfooding-run.md— the run in the demo above: what it did, what it found, and what it left open.docs/cost-baseline.md— the measured predecessor run ADR-0001 was decided on: where a coordinator's money actually goes, and what a future run is graded against.config/agentcrew.default.toml— the shipped defaults, commented.
MIT — see LICENSE.
