fleet
cute project to manage multiple coding agents without getting overwhelmed
the idea
inspired by kun chen's "first mate" setup.
there are a few major pain points when working with multiple coding agents in the same repo:
- one agent can touch a file that another agent is reading and confuse them
- one agent's git actions can interfere with another's and mess up your git state, thus confusing you
- when one file is modified by multiple agents each working on distinct things, it becomes hard to commit it to git cleanly. it's unnatural to commit specific line edits of a file (maybe your agent can do it, but it will spend precious tokens figuring it out)
these pain points are of the "stepping on each other's shoes" category, which is a communication problem. there are many ideas out there to solve inter-agent communication, but this is not one of them. instead, the aim is to avoid all of that noise by providing each agent with their own worktree. there's no longer a need for agents to communicate if you just isolate all of them!
there is another category of problem, which occurs somewhere between the keyboard and the chair. that is, the human brain gets tired, loses focus, and starts a slow meltdown process due to constant context switching. at optimal conditions with good focus, a human can juggle maybe 3 or 4 tasks concurrently, but beyond that (and even at that level of concurrency), you need some tools to help you out.
this project features two thematic solutions:
- a worktree-isolation alias for spinning up a worker-agent in a git worktree with one command (and handling safe teardown once it's done)
- a coordinator agent, named the "quartermaster", which monitors the agents and assists the human in context switching and managing the worker-agents.
LLM dump below, with my editorials in (a.g. ... ) (those are my initials, not latin for anything):
Roles
- Workers — agents, each in its own worktree, holding a NATO callsign drawn at
random (
delta,romeo, …). Each self-manages its lane and owns all of its own git operations. Claude Code workers show their callsign in the status line, so split panes stay tellable apart. - Quartermaster (
fleet qm) — a manager agent that reads every worker's context, summarizes for you, relays your directives down, and tells you who needs attention. - Dashboard (
fleet watch) — a live, read-only, at-a-glance board.
You stay in control: you recruit and brief each worker, work hands-on with one at a time, and lean on the Quartermaster to manage the rest.
Install
uv tool install fleet-workflow # or: pipx install fleet-workflow
For local development:
uv tool install --editable . # or: pipx install --editable .
State lives under ~/.claude/projects/<project-slug>/fleet/, outside your repo, so every worktree shares one view and your repo stays
clean. It follows CLAUDE_CONFIG_DIR when that is set, so a work-scoped agent keeps its
own fleet. Set FLEET_STATE_HOME to relocate it.
Upgrading from a version that stored state under ~/.claude-work? fleet migrate
moves a project's state to wherever the current config dir puts it (--dry-run to
preview). Until you do, the old location is still read, so nothing disappears.
Choosing your agent
fleet is agnostic about how you launch your coding agent — you tell it the command.
Pass --agent per invocation, or set FLEET_AGENT once as your default:
fleet recruit --agent "claude" # your personal agent
fleet recruit --agent "claude-work" # a work-scoped wrapper (a.g. i have a separate claude alias for my work account)
export FLEET_AGENT="claude" # or set a default and just run `fleet recruit`
If you don't set either, fleet recruit provisions the worktree and prints the cd
line for you to launch the agent yourself.
Use
New here? Run fleet --guide for a linear walkthrough in your terminal, or read
GUIDE.md for the same thing on the page. This section is the short form.
# once per project
fleet init
# recruit a worker (provisions a worktree and launches your chosen agent in it)
fleet recruit --agent "<your-agent-command>"
# supervise
fleet watch # live dashboard
fleet qm --agent "<your-agent-command>" # talk to the Quartermaster
# the worker keeps its own state fresh
fleet sync --stage execution --status running --next "backfill 400 SKUs"
fleet inbox # read directives from the QM
fleet done # tear down + archive when finished
Worktree backends
- plain (default) — stock
git worktree, zero dependencies. - treehouse (strict opt-in,
--provider treehouse) — leases pooled worktrees from the treehouse CLI for build-cache and dependency reuse across sessions. fleet takes a durable lease (get --lease) tagged with the callsign as lease holder, so the pool will not hand the worktree to anyone else or prune it untilfleet donereturns it. Verified against treehouse's CLI contract by source inspection; not yet exercised against a live install. (a.g. i came across this when watching kun chen's agentic setup video, which inspired this project, but i haven't really tried it. i have a philosophy of not using things until i encounter the problem/painpoint that prompted someone to build it. it seems like nowadays agents can manage their own worktrees just fine, and i don't really care too much about the worktree provision time... yet...)
Command reference
| Command | Who | What |
|---|---|---|
fleet --guide |
you | linear walkthrough for a first run |
fleet init |
you | install prompts + scaffold state |
fleet migrate [--dry-run] |
you | move state written by an older version |
fleet recruit [--agent] [--provider] |
you | provision a worktree + launch a worker |
fleet qm [--agent] |
you | launch the Quartermaster |
fleet watch [--interval] |
you | live dashboard |
fleet ls [--porcelain] |
you / QM | compact one-line-per-worker roster |
fleet status [--verbose] |
QM | one-shot readout |
fleet inspect <callsign> |
QM | one worker's full file + mail |
fleet msg <callsign|all> "…" |
QM | async directive to a worker |
fleet dismiss <callsign> [--force] |
you / QM | stand down a worker from outside its worktree |
fleet sync [flags] |
worker | update own state |
fleet inbox [--all] |
worker | drain mailbox |
fleet done [--force] |
worker | teardown + archive |
fleet done refuses to tear down a worktree with uncommitted changes — including
untracked files — and lists what is at stake, so you never have to check before
standing a worker down. Pass --force to discard the work deliberately.
fleet done runs from inside a worktree, which is no help when the agent never
started. fleet dismiss <callsign> stands a worker down from anywhere in the repo,
under the same rules. fleet recruit also resolves your agent command before
provisioning, so a command your shell cannot run fails with nothing left behind.
Development
uv tool install --editable .
python -m pytest
The suite drives the real CLI against throwaway git repos, with FLEET_STATE_HOME
redirected into a tmp dir so it never touches your own fleet state. Tests live in
tests/ and are not shipped in the wheel.
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fleet_workflow-0.2.1.tar.gz.
File metadata
- Download URL: fleet_workflow-0.2.1.tar.gz
- Upload date:
- Size: 46.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
90a6dadc8f3e352d44dceb66bff090d74c86cf35c92bbd32f39928f7e1afce49
|
|
| MD5 |
6cdb73b90ffa2d23ff9ba10d4cc5d782
|
|
| BLAKE2b-256 |
d8716b3e8719e208a9ead4dae2db30ff315586fe31b39c40ef8e99425f1fd70c
|
File details
Details for the file fleet_workflow-0.2.1-py3-none-any.whl.
File metadata
- Download URL: fleet_workflow-0.2.1-py3-none-any.whl
- Upload date:
- Size: 35.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48c63f3ab7c269345b192c2a7d0f49950d0fbcb2f51521cc0edafa5207853a47
|
|
| MD5 |
fe3a8efb6065fa5a17bc9757d46c6c80
|
|
| BLAKE2b-256 |
d9870df6ffa6010b88ee4e934aa481588ae8d80a29fe105d24e2b029b9aff2ea
|