One chat that runs your coding agents: a task list, full harnesses in cmux worktrees, and only the decisions come back to you
Tell it what you want, or hand it a ticket. It keeps the list, starts Claude Code, Codex or Cursor on each task in its own worktree, and brings you plans to approve and PRs to merge.
Setup, every command, and how a task gets from a message to a merged PR.
You need Node 24+, with git, gh, claude and cmux on your PATH. codex and the Cursor CLI (agent) are optional extra harnesses.
npm install -g cmux-captain
captain installcaptain install adds the skills the chat and workers need, then tells you what is missing.
# A project: a task folder tied to one repo, with a WIP limit
captain init rebuild --repo ~/code/app --wip 4
# Then open Claude Code in its own cmux workspace and run /captain.
# Talk to it: "rebuild billing settings, same behaviour as the old app", "pick up TIG-430",
# "what needs me?". It runs the commands below for you.
captain add "rebuild billing settings" # a task from a message (or: captain add TIG-430)
captain start t-1 --harness codex # worktree + cmux workspace + agent
captain status # NEEDS YOU / READY TO MERGE / CAPTAIN'S MOVE / WORKING
captain review t-1 # the other vendor reviews the PR
captain done t-1 # close it once merged- What gets started: the chat shows you a card for every batch of tasks, with the harness and model it picked. Nothing starts before your yes.
- Risky plans: tasks touching auth, billing, data migrations or releases run in Claude Code plan mode and wait for
captain approve. - How much is in flight:
startrefuses past the WIP limit, because every started task is a PR you have to review. - The merge: a task is READY TO MERGE only when CI is green, a fresh-context verifier passed its definition of done, and a model from the other vendor reviewed the PR. Merging stays yours.
- Tasks are plain markdown files in
~/captain/<project>/tasks/. The chat maintains them, and you can edit them. - Status is derived live from cmux, git and GitHub every time. There is no daemon, so there is nothing to restart or go stale.
- Set
LINEAR_API_KEYorDONEBEAR_TOKENto add tasks from tickets.
MIT
Crafted by Matthew Blode