Fleet Management
Fleet management (shipwright fleet) lets you run autonomous daemons across all your repositories simultaneously. Define your repos in a config file, start them with one command, and monitor everything from a unified dashboard.
How It Works
- You define a
fleet-config.jsonlisting your repositories and per-repo overrides shipwright fleet startspawns a daemon for each repo in its own tmux session- Each daemon watches GitHub issues independently, running pipelines as issues arrive
shipwright fleet statusshows a unified dashboard across all reposshipwright fleet metricsaggregates DORA metrics fleet-wide
Quick Start
# Generate a fleet config (auto-detects sibling repos)shipwright fleet init
# Edit the config to add/remove reposvim .claude/fleet-config.json
# Start all daemonsshipwright fleet start
# View the fleet dashboardshipwright fleet status
# Aggregate DORA metrics across all reposshipwright fleet metrics
# Stop everythingshipwright fleet stopFleet Configuration
After running shipwright fleet init, a config file is created at .claude/fleet-config.json:
{ "repos": [ { "path": "/path/to/api", "template": "autonomous", "max_parallel": 2 }, { "path": "/path/to/web", "template": "standard" }, { "path": "/path/to/mobile" } ], "defaults": { "watch_label": "ready-to-build", "pipeline_template": "autonomous", "max_parallel": 2, "model": "opus" }, "shared_events": true}Each repo inherits from defaults but can override any field:
| Field | Default | Description |
|---|---|---|
path | (required) | Absolute path to the repo |
template | "autonomous" | Pipeline template for this repo |
max_parallel | 2 | Max concurrent pipelines per repo |
watch_label | "ready-to-build" | GitHub issue label to watch |
model | "opus" | Claude model to use |
Worker Pool
The fleet supports a shared worker pool that distributes workers across repos proportionally to demand:
{ "worker_pool": { "enabled": true, "total_workers": 12, "rebalance_interval_seconds": 120 }}When enabled, a background rebalancer redistributes workers every N seconds. Repos with more queued issues receive more workers. Each repo always gets at least 1 worker.
Commands
| Command | Description |
|---|---|
shipwright fleet init | Generate fleet-config.json with auto-detected repos |
shipwright fleet start | Start a daemon for every configured repo |
shipwright fleet stop | Gracefully stop all fleet daemons |
shipwright fleet status | Show fleet dashboard with per-repo status |
shipwright fleet metrics | Aggregate DORA metrics across all repos |
Options
| Flag | Description |
|---|---|
--config <path> | Path to fleet config (default: .claude/fleet-config.json) |
--period <days> | Metrics period in days (default: 7) |
--json | Output metrics as JSON |
Fleet Dashboard
shipwright fleet status displays a live table showing each repo’s health:
REPO STATUS ACTIVE QUEUED DONE LAST POLL ──────────────────────────────────────────────────────────────────────────── ● api running 1 0 12 14:32:10 ● web running 0 2 8 14:32:08 ● mobile stopped - - - -
Total: 3 repos 2 running 1 stoppedAggregate Metrics
shipwright fleet metrics rolls up DORA data from the shared events log across all repos:
# 30-day aggregate with per-repo breakdownshipwright fleet metrics --period 30
# JSON output for CI dashboardsshipwright fleet metrics --jsonThe per-repo breakdown shows completed pipelines, pass/fail counts, deployment frequency per week, and change failure rate for each repository.
Tips
- Auto-detection —
fleet initscans sibling directories for git repos, so run it from a directory alongside your projects. - Existing configs respected — If a repo already has a
daemon-config.json, the fleet won’t overwrite it. - Shared events — When
shared_eventsistrue, all repos write to the same events log, enabling cross-repo DORA aggregation. - tmux sessions — Each repo gets a tmux session named
shipwright-fleet-<repo>. Attach withtmux attach -t shipwright-fleet-apito debug.