Skip to content

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

  1. You define a fleet-config.json listing your repositories and per-repo overrides
  2. shipwright fleet start spawns a daemon for each repo in its own tmux session
  3. Each daemon watches GitHub issues independently, running pipelines as issues arrive
  4. shipwright fleet status shows a unified dashboard across all repos
  5. shipwright fleet metrics aggregates DORA metrics fleet-wide

Quick Start

Terminal window
# Generate a fleet config (auto-detects sibling repos)
shipwright fleet init
# Edit the config to add/remove repos
vim .claude/fleet-config.json
# Start all daemons
shipwright fleet start
# View the fleet dashboard
shipwright fleet status
# Aggregate DORA metrics across all repos
shipwright fleet metrics
# Stop everything
shipwright fleet stop

Fleet 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:

FieldDefaultDescription
path(required)Absolute path to the repo
template"autonomous"Pipeline template for this repo
max_parallel2Max 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

CommandDescription
shipwright fleet initGenerate fleet-config.json with auto-detected repos
shipwright fleet startStart a daemon for every configured repo
shipwright fleet stopGracefully stop all fleet daemons
shipwright fleet statusShow fleet dashboard with per-repo status
shipwright fleet metricsAggregate DORA metrics across all repos

Options

FlagDescription
--config <path>Path to fleet config (default: .claude/fleet-config.json)
--period <days>Metrics period in days (default: 7)
--jsonOutput 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 stopped

Aggregate Metrics

shipwright fleet metrics rolls up DORA data from the shared events log across all repos:

Terminal window
# 30-day aggregate with per-repo breakdown
shipwright fleet metrics --period 30
# JSON output for CI dashboards
shipwright fleet metrics --json

The per-repo breakdown shows completed pipelines, pass/fail counts, deployment frequency per week, and change failure rate for each repository.

Tips

  • Auto-detectionfleet init scans 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_events is true, 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 with tmux attach -t shipwright-fleet-api to debug.