Skip to content
Conduit

mcp server

fleet-commander

PM dashboard for orchestrating Claude Code agent teams working on GitHub issues

hubertciebiada/fleet-commandercommunitylistedunreviewed

Set up

Runs on your computer. Pick your agent and operating system.

Before you start

  • Node.js 20 or newer
~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "fleet-commander": {
      "command": "npx",
      "args": [
        "-y",
        "fleet-commander-ai"
      ]
    }
  }
}

same format Cursor, GitHub Copilot CLI, Junie, JetBrains AI Assistant, Augment (Auggie CLI), Factory Droid, Kiro, Devin CLI +12

Values in angle brackets are placeholders. Restart Claude Desktop after editing its config.Claude Desktop docs

README

synced Oct 22, 2026

CI npm version License Node.js TypeScript PRs Welcome

Fleet Commander

One-click dashboard for orchestrating multiple Claude Code agent teams across repositories.

Launch, monitor, message, and shut down 15+ parallel AI agents from a single control plane.

Note: The npm package name is fleet-commander-ai (the npm package name differs from the repo name). CLI binary commands remain fleet-commander and fleet-commander-mcp.


Why Fleet Commander?

Running 15+ parallel Claude Code agents across multiple repos is chaos without a control plane. You lose track of which teams are working on what, miss CI failures, and have no way to intervene when an agent gets stuck.

CapabilityWhat it does
LaunchOne-click team launch per GitHub issue. FIFO queue with per-project concurrency limits.
MonitorReal-time SSE dashboard with status, phase, PR state, CI checks, and Gantt timeline.
MessageSend instructions to running agents via stdin pipe. Editable PM message templates.
TrackGitHub polling every 30s for PRs, CI status, and merges. Auto-merge support.
DetectIdle detection at 5 minutes, stuck detection at 10 minutes. Automatic status transitions.
ScaleMultiple projects (repos), each with independent team slots, queues, and prompt files.

Quick Start

Prerequisites

  • Node.js 20+
  • GitHub CLI -- authenticated (gh auth login)

Option A: Install from npm (recommended)

npm install -g fleet-commander-ai

Once installed, run fleet-commander to start the server on port 4680 and open the dashboard.

Or run without installing:

npx fleet-commander-ai

Option B: Clone from source

git clone https://github.com/hubertciebiada/fleet-commander.git
cd fleet-commander
npm run launch

This installs dependencies, builds the project, starts the server on port 4680, and opens your browser.

Windows shortcut

Double-click fleet-commander.bat

First steps

  1. Add a project -- Open the Projects view (/projects), click Add Project, and enter your repo path and GitHub slug (e.g., org/repo). Click Install to deploy hooks.
  2. Launch a team -- Open the Issue Tree (/issues), find an issue, and click the Play button. Fleet Commander creates a worktree, spawns a Claude Code agent, and starts working.

Screenshots


Architecture

graph TB
  Browser["React 19 SPA<br/>Dark Theme"] -->|"SSE + REST"| Server["Fastify :4680"]
  Server --> TeamMgr["Team Manager<br/>spawn / stdin / stdout"]
  Server --> EventCol["Event Collector<br/>hook events"]
  Server --> GitPoller["GitHub Poller<br/>PR / CI / merge"]
  Server --> IssueFetch["Issue Fetcher<br/>GraphQL, 60s cache"]
  Server --> StuckDet["Stuck Detector<br/>idle 5min / stuck 10min"]
  Server --> SSE["SSE Broker<br/>14 event types"]
  Server --> DB[("SQLite<br/>fleet.db, WAL")]
  TeamMgr -->|"spawn + stdin pipe"| CC["Claude Code<br/>stream-json"]
  CC -->|"hooks POST"| EventCol
  GitPoller -->|"gh CLI"| GitHub["GitHub API"]

Hook Events

Claude Code agent sessions fire lifecycle hooks (session start, tool use, notifications, errors, session end). Fleet Commander installs shell scripts into each project repo that POST these events back to the server. All hooks are fire-and-forget -- they exit 0 regardless of whether the POST succeeds, so they never block the agent.

Stdin/Stdout Pipes

Each agent team is a child_process.spawn() of claude with --input-format stream-json --output-format stream-json. Fleet Commander holds the stdin pipe open to send messages (PM instructions, CI results, merge notifications) and reads stdout for real-time output streaming. The stdout stream is parsed and broadcast to the dashboard via SSE.

SSE Push

The SSE Broker manages long-lived connections from the React dashboard. It emits 14 event types (team status changes, output chunks, PR updates, usage snapshots, heartbeats, etc.) so the UI updates in real time without polling. A 30-second heartbeat keeps connections alive through proxies.

GitHub Polling

The GitHub Poller runs every 30 seconds and uses the gh CLI (not Octokit) to check for PR state changes, CI check results, and merge status. When it detects a change, it updates the database and broadcasts an SSE event. This is how the dashboard knows when CI passes or a PR is merged.


Team Lifecycle

stateDiagram-v2
  [*] --> queued
  queued --> launching
  launching --> running
  running --> idle : 5 min no events
  running --> done : session ends normally
  running --> failed : process crashes
  idle --> running : new event received
  idle --> stuck : 10 min no events
  stuck --> running : new event received
  done --> [*]
  failed --> [*]

Walkthrough

  1. Queued -- A team is created for an issue and placed in the FIFO queue. It waits here until a slot opens (per-project concurrency limit).
  2. Launching -- A slot is available. Fleet Commander creates a git worktree, spawns a Claude Code process, and waits for the first event. If no event arrives within the launch timeout (default 5 min), the team is marked failed.
  3. Running -- The agent is actively working. Hook events stream in, output is captured, and the dashboard shows real-time progress.
  4. Idle -- No hook events for 5 minutes. The team is flagged but continues running. Any new event transitions it back to running.
  5. Stuck -- No hook events for 5 minutes (from idle). The team is flagged for PM attention. A message can be sent via stdin to nudge the agent. Any new event transitions it back to running.
  6. Done / Failed -- The session ends normally (done) or the process crashes / exits non-zero (failed). The worktree and branch can be cleaned up from the Projects view.

CI flow: PR detected -> CI green/red -> message to team via stdin -> PR merged -> team marked done


Configuration

All settings have sensible defaults. Override via environment variables:

VariableDefaultDescription
PORT4680Server port
FLEET_HOST0.0.0.0Network interface to bind to
FLEET_IDLE_THRESHOLD_MIN5Minutes before a team is marked idle
FLEET_STUCK_THRESHOLD_MIN10Minutes before a team is marked stuck
FLEET_LAUNCH_TIMEOUT_MIN5Minutes before a launching team is marked failed
FLEET_MAX_CI_FAILURES3Unique CI failure types before blocking
FLEET_EARLY_CRASH_THRESHOLD_SEC120Seconds before a SubagentStop is considered an early crash
FLEET_EARLY_CRASH_MIN_TOOLS5Minimum tool-use events for a subagent to be considered healthy
FLEET_GITHUB_POLL_MS30000GitHub polling interval (ms)
FLEET_DB_PATHPlatform data dirSQLite database file path (e.g. %APPDATA%/fleet-commander/fleet.db on Windows)
FLEET_TERMINALautoWindows terminal preference: auto, wt, or cmd
FLEET_CLAUDE_CMDclaudeClaude Code CLI command
FLEET_SKIP_PERMISSIONStrueSkip CC permission prompts (--dangerously-skip-permissions)
LOG_LEVELinfoServer log level

Built With

LayerTechnology
ServerFastify 5 on Node.js 20+
ClientReact 19 with Vite 6
LanguageTypeScript 5.7
DatabaseSQLite via better-sqlite3, WAL mode
StylingTailwind CSS (GitHub-dark theme)
Real-timeServer-Sent Events (SSE)
Agent interfaceClaude Code CLI (--input-format stream-json, --output-format stream-json)
GitHubgh CLI for all GitHub operations
TestingVitest, Testing Library

MCP Integration

Fleet Commander exposes tools via the Model Context Protocol over stdio transport. This allows Claude Code (or any MCP-compatible client) to query fleet state, launch teams, send messages, and inspect timelines programmatically.

# Add as an MCP server in Claude Code
claude mcp add fleet-commander -- node bin/fleet-commander-mcp.js

Or add a .mcp.json to your project root:

{
  "mcpServers": {
    "fleet-commander": {
      "command": "node",
      "args": ["bin/fleet-commander-mcp.js"],
      "cwd": "/path/to/fleet-commander"
    }
  }
}

All MCP tools use the fleet_ prefix (e.g., fleet_system_health, fleet_list_teams, fleet_send_message). See docs/mcp.md for the full tool reference and developer guide.


Views

ViewPathWhat it shows
Fleet Grid/Team table with status, phase, PR, CI, duration. Toggle to Gantt timeline.
Issue Tree/issuesGitHub issue hierarchy with search. Play button launches a team per issue.
Usage/usageFour progress bars: daily, weekly, Sonnet, and extra usage percentages.
Projects/projectsCRUD for projects. Install status, cleanup, prompt editor.
Lifecycle/lifecycleTeam state machine diagram + editable PM message templates.
Settings/settingsRead-only viewer for current server configuration.

Development

CommandDescription
npm run devStart dev server + Vite HMR
npm run buildProduction build (tsc + vite)
npm startProduction server (node dist/server/index.js)
npm testRun all tests (vitest)
npm run test:clientClient-only tests
npm run test:e2eEnd-to-end smoke test
npm run launchAuto-install, build, open browser
npm run capture-screenshotsGenerate screenshots with Playwright

Contributing

Contributions are welcome. To get started:

  1. Fork the repository
  2. Create a branch from main (git checkout -b feat/your-feature)
  3. Make your changes and add tests
  4. Run the test suite (npm test)
  5. Commit with a clear message (git commit -m "Add your feature")
  6. Push to your fork (git push origin feat/your-feature)
  7. Open a Pull Request against main

Please follow the existing code style and conventions. See CLAUDE.md for project-specific guidelines.


License

Apache-2.0


Star History Chart

↑↓ navigate openesc close