Multi-agent orchestration CLI. Define a pipeline of AI agents, give them a requirement, and watch them run in parallel or in sequence based on the dependency graph you declare.
multiclaw orchestrates agents from any installed provider. Every provider talks
to multiclaw over the same Agent Client Protocol (ACP)
— the underlying runtime is always acp; the provider is the agent product you
choose. Install one or more:
| Provider | CLI | Install |
|---|---|---|
| OpenCode | opencode |
npm install -g opencode |
| Claude | claude-agent-acp (bundled) |
install the Claude Code CLI (claude) and run claude to log in |
| Codex | codex-acp (bundled) |
install the Codex CLI (codex) and run codex login |
| Cursor | cursor-agent |
curl https://cursor.com/install | bash |
multiclaw init auto-detects which providers are installed and only offers those;
multiclaw doctor shows the full picture (installed versions, auth hints, available
models). Codex and Cursor need an API key or login before they can run.
npm install -g multiclaw# 1. Scaffold a config in the current directory
multiclaw init
# 2. Open the interactive console
multiclaw
# ...or run a single orchestration headlessly
multiclaw run "Build a REST API for a todo list"multiclaw with no subcommand opens a full-screen terminal console. Use multiclaw run for
headless execution (CI, piped output).
Interactive scaffold. Creates multiclaw.config.ts in the current directory.
Prompts:
- Project name — defaults to the current directory name
- Preset — pipeline template (see Presets)
- Provider — which agent product to use (
claude,opencode,codex,cursor). Only installed providers are offered; missing ones are listed with install hints. - Work directory — where agents read and write files
Options:
| Option | Description |
|---|---|
--force |
Overwrite an existing multiclaw.config.ts |
Diagnose the local environment: which providers are installed (with versions), what auth each needs, how many models each exposes, and whether the current config's agents all resolve to an installed provider. Exits non-zero if no provider is available.
multiclaw doctor # full environment check
multiclaw doctor --config ./multiclaw.config.ts # also validates the configRuns the orchestration defined in your config file.
| Option | Description |
|---|---|
--config <path> |
Path to config file. Auto-discovers multiclaw.config.ts if omitted. |
--dry-run |
Preview the routed plan without running the pipeline. |
--resume [path] |
Resume a previous run, continuing agent sessions. Defaults to the latest run. |
The <requirement> string is injected into every agent's prompt as {{requirement}}.
Each run creates an isolated timestamped subdirectory inside workDir (e.g. workspace/.multiclaw/runs/run-2026-10-08T12-00-00-<execution-id>), so a one-shot run can never collide with anything else on disk. The interactive console uses the shared project directory — see Interactive console.
Upgrade multiclaw to the latest version.
Interactively clean up saved sessions and old run directories.
| Option | Description |
|---|---|
--sessions |
Prune saved sessions only (non-interactive) |
--runs |
Prune all run directories only (non-interactive) |
--all |
Prune everything (non-interactive) |
--dry-run |
Show what would be deleted without deleting |
--yes |
Skip the confirmation prompt |
Two ideas keep configs short and provider-agnostic:
runtimevsprovider. The runtime is the protocol multiclaw uses to talk to an agent — today that is alwaysacp(the Agent Client Protocol). The provider is the agent product (claude,opencode,codex,cursor). Soruntimeis a constant;provideris the thing you pick.- Model tiers. Instead of hard-coding a model that only exists on one provider, an agent declares a tier —
strong,balanced, orfast. The built-in catalog maps each tier to a concrete model id per provider (e.g.strong→opuson Claude,opencode/exo-freeon OpenCode). That way the same preset runs unchanged on any provider; switching providers just changes the resolved model.
Resolution order for an agent's model:
agent.model(explicit id) → 2.agent.models[provider]→ 3. legacyagent.models["acp"]→agent.modelTier(catalog-resolved) → 5.config.defaults.model→ 6. the provider's default model.
A single defaults: { provider, model } block at the top of the config supplies steps 2/5 for every agent, so you rarely repeat yourself.
// multiclaw.config.ts
import { defineConfig, agents } from "multiclaw"
export default defineConfig({
name: "My Project",
workDir: "./workspace",
// Variables available as {{key}} in every agent's taskPrompt.
// `requirement` is automatically injected from the CLI argument.
context: {
projectName: "My App",
},
logDir: "./logs", // optional; default: workDir/.multiclaw/logs
continueOnError: false, // optional; keep running if an agent fails
maxConcurrency: 4, // optional; max agents running at once
// Project-wide defaults applied to every agent that doesn't override them.
// One line replaces repeating provider/model across all preset agents.
defaults: {
provider: "claude", // which agent product runs the team
model: "sonnet", // default model (overridable per agent)
},
agents: [
{
id: "architect", // unique identifier, used in dependsOn
name: "Architect", // display name
icon: "◆", // optional; shown in the console
provider: "claude", // optional; default: config.defaults.provider
modelTier: "strong", // optional; "strong" | "balanced" | "fast"
model: "opus", // optional; overrides tier/default for this agent
systemPrompt: "You are a software architect.", // optional
taskPrompt: `Design the system for {{requirement}}.
Read the brief at {{file:brief.md}} and write architecture.md.`,
permissions: { mode: "ask" }, // optional; overrides the project mode here
dependsOn: [], // optional; list of agent ids this agent waits for
timeout: 1_800_000, // optional; ms, default: 1 800 000 (30 min)
retries: 0, // optional; retry count on failure, default: 0
workDir: "architect", // optional; subdirectory relative to global workDir
},
{
id: "developer",
name: "Developer",
model: "sonnet", // override model for this agent
taskPrompt: "Read architecture.md and implement the code.",
dependsOn: ["architect"],
},
],
})| Field | Type | Required | Description |
|---|---|---|---|
name |
string | ✓ | Project name, shown in the console header. |
workDir |
string | ✓ | Base directory where agents read and write files. Every console turn shares it. |
agents |
AgentDefinition[] | ✓ | The agent pipeline (see Agent fields below). |
defaults |
object | Project-wide { provider?, model?, command?, permissions? } applied to every agent that does not override them. Keeps generated configs short. |
|
context |
Record<string, string> | Variables available as {{key}} in every prompt. requirement is injected automatically. |
|
logDir |
string | Log output directory. Default: workDir/.multiclaw/logs. |
|
continueOnError |
boolean | Keep running when an agent fails. Default: false. |
|
maxConcurrency |
number | Max agents running in parallel. Default: unlimited. | |
permissions |
object | Permission mode: { mode: "auto" | "ask" | "deny", onRequest? }. "auto" approves every tool request, "ask" escalates each one to onRequest, "deny" refuses all of them. Default: "auto" for run, "ask" in the console. |
Top-level reviewGates turns pipeline reviewers into approval gates. Each policy names a reviewer, repairAgents and maxRepairRounds; the reviewer's dependsOn locates the gate. Rejected work runs the selected repair agents sequentially and is reviewed again before downstream work starts. Include tester in code-review repairs to revalidate code changes. Each gate retains its own budget across nested retesting and handoff rerouting.
New backend, frontend and fullstack configs enable their review gates with three repair rounds. Existing configs must opt in. The original review still supports a reserved final reviewer. Invalid verdicts and exhausted budgets block delivery; reports and console history preserve every gate's verdicts. See the configuration and verification record.
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | ✓ | Unique identifier. Used in dependsOn. |
name |
string | ✓ | Display name shown in the agent list. |
taskPrompt |
string | ✓ | Prompt sent to the AI runtime. Supports template variables. |
systemPrompt |
string | Optional system prompt prepended to taskPrompt. |
|
icon |
string | Unicode icon shown next to the agent name. | |
description |
string | One-line role, shown beside the agent's name on the console's first screen. Every built-in preset sets one. | |
provider |
string | Agent product this agent runs on: claude, opencode, codex, or cursor. Defaults to config.defaults.provider. All providers speak the same acp runtime. |
|
runtime |
string | Legacy. Always "acp" today. Use provider instead. Retained for backward compatibility. |
|
modelTier |
"strong" | "balanced" | "fast" |
Declares the capability this agent needs; the catalog maps each tier to a provider-specific model id. Ignored when model is set. |
|
model |
string | Override the model id for this agent (provider-specific, e.g. "opus", "sonnet", "haiku" for Claude). Takes precedence over modelTier and models. |
|
models |
Record<string, string> | Map of provider id (or the legacy "acp") to a model id, e.g. { claude: "sonnet", opencode: "opencode/big-pickle" }. Used when model/modelTier are unset. |
|
permissions |
{ mode: "auto" | "ask" | "deny" } |
Approval mode for this agent's tool calls. Overrides permissions and defaults.permissions. |
|
dependsOn |
string[] | Agent ids that must complete before this agent starts. | |
timeout |
number | Per-attempt timeout in ms. Default: 1800000 (30 min); set a larger value for longer tasks. |
|
retries |
number | Number of retry attempts on failure. Default: 0. |
|
workDir |
string | Subdirectory (relative to global workDir) for this agent's CWD. |
For longer development tasks, override the agent timeout, for example to 60 minutes:
agents.backendDeveloper({ timeout: 60 * 60 * 1000 })Two syntaxes are supported in taskPrompt and systemPrompt:
| Syntax | Replaced with |
|---|---|
{{key}} |
The value of context.key (or requirement from the CLI). |
{{file:path/to/file}} |
The contents of that file, resolved relative to workDir. |
{{pipelineAgents}} |
List of all agents running in this pipeline (id: name). Auto-injected; useful for the architect to decompose tasks per agent. |
Agents are grouped into stages by their dependency graph (topological sort). All agents within the same stage run concurrently. maxConcurrency caps how many run at once globally.
Stage 1: product-manager
Stage 2: architect
Stage 3: backend-developer │ ui-designer ← parallel
Stage 4: code-reviewer │ devops ← parallel
Run multiclaw to open the Ink terminal UI. It opens a blank chat with sessions on the left; the first message creates the session. --resume opens a specific chat, and --resume focuses the list. Missing IDs are errors.
The central chat always talks to the permanent coordinator. The team panel is hidden by default; viewing an agent never changes the main input recipient. Narrow terminals use temporary session and team viewers.
| Key | Action |
|---|---|
| Ctrl+B | Focus sessions; arrows select, Enter opens |
| Ctrl+T | Open/focus team; arrows select an agent |
| Ctrl+G | Focus the current permission, question or checkpoint |
| Esc | Return to chat without answering a request |
| Shift+Tab | Cycle this chat's permission mode |
| Ctrl+C | Cancel the current chat's work |
| Ctrl+D | Stop all work, save and exit |
| Ctrl+V | Paste clipboard text or an image |
| Alt+Backspace | Remove the last attached image |
| Up/Down, PageUp/PageDown | Scroll focused output |
| ? on an empty input | Help |
Pasting or dropping an absolute PNG, JPEG, GIF or WebP path attaches the image, including quoted paths and escaped spaces. The prompt shows an attachment count; type your message and press Enter, or send the image alone. Image paths are never slash commands. Attachments stay with their chat draft when switching sessions.
During execution the coordinator answers progress questions and directs additional requirements to individual agents. Independent new work is queued. Explicit replacement stops current work before dispatching its replacement; ambiguous instructions trigger clarification.
Dependencies still govern execution. Supplements update the requirement revision; affected implementation, downstream tests and reviews are reworked before completion. Providers without live injection receive supplements after the current call. Delivered does not mean implemented. Unknown delivery is retained and never automatically replayed.
Each chat owns its coordinator/worker bindings, queue, drafts and interactions. Switching keeps work running. Chats execute concurrently in the same workDir without file conflict arbitration; maxConcurrency applies per chat. Permissions and structured questions require explicit request controls, not ordinary replies. Background requests mark their original session as needing input.
| Command | Action |
|---|---|
| /new | Open a blank chat; other chats continue |
| /focus [agent] | Inspect an agent in the team panel |
| /steer | Supplement a specific agent |
| /mode auto / ask / deny | Change this chat's live permission mode |
| /retry [agent] | Retry known work with a fixed agent set |
| /replay [turn] | Run a recorded requirement again while idle |
| /edit | Copy the latest requirement into the draft |
| /search [text], /latest | Search output or return to its tail |
| /verbose | Toggle tool details |
| /pause, /continue | Pause or resume queued work |
| /export [path] | Export the chat as Markdown |
Stop running work before deleting its chat; deletion requires confirmation. Exiting waits for cleanup and saving. After interruption, runtime continuity is unknown and queued work stays paused until explicit continuation. Provider RPCs do not survive restart.
Journals use version 2. Older or damaged journals are unsupported and retained without overwriting. No history migration is provided. /sessions and multiclaw sessions are removed; use the sidebar or multiclaw prune.
After each run, all generated files are written under workDir/.multiclaw/runs/run-<timestamp>-<execution-id>/ (or logDir if set):
workDir/
└── .multiclaw/
└── runs/
└── run-2026-10-08T12-00-00-<execution-id>/
├── <agent output files> ← files agents write (e.g. architecture.md)
└── logs/
├── <agentId>.log ← raw stdout per agent
└── report.json ← full orchestration result
| File | Contents |
|---|---|
<agentId>.log |
Raw stdout from that agent's process |
report.json |
Full orchestration result (status, duration, output per agent) |
The log path is printed to the terminal at the start of every run.
Presets are pipeline templates you can pick during multiclaw init:
| Preset | Pipeline | Agents |
|---|---|---|
backend |
Product Manager → Architect → Arch Design Reviewer → Backend Developer → Tester → Code Reviewer → DevOps | 7 |
frontend |
Architect → UI Designer → UI Design Reviewer → Frontend Developer → Tester → Code Reviewer | 6 |
fullstack |
Product Manager → Architect → Arch Design Reviewer → Backend Developer + UI Designer → UI Design Reviewer → Frontend Developer → Tester → Code Reviewer → DevOps | 10 |
The coordinator permanently owns conversation, clarification, routing and summaries, outside the team. It cannot be disabled or customized. Provider, command and model come from project defaults, with normal fallback when absent.
Remove legacy leader and useLeader configuration. agents.leader() and --no-leader are no longer supported. Fixed-agent retry/resume preserves its execution set and still produces a summary. Summary failure never overwrites execution or acceptance facts.
When the architect agent is in your pipeline, it produces three outputs:
- architecture.md — architecture plan and module breakdown
- api-spec.md — complete API specification
- task-plan.json — structured task breakdown for all implementation agents in the pipeline
The task-plan.json file helps coordinate work across parallel agents by explicitly assigning scope to each agent. Each implementation agent (backend-developer, frontend-developer, ui-designer, devops, tester, etc.) reads this file to understand its specific responsibilities and dependencies.
Example task-plan.json:
{
"projectName": "My App",
"requirement": "Build a todo list API with React UI",
"tasks": [
{
"id": "backend-developer",
"title": "REST API",
"scope": "Implement all endpoints per api-spec.md",
"dependsOn": []
},
{
"id": "frontend-developer",
"title": "React UI",
"scope": "Build React components following ui-design.md",
"dependsOn": []
},
{
"id": "devops",
"title": "Deployment",
"scope": "Containerize and set up CI/CD",
"dependsOn": ["backend-developer", "frontend-developer"]
}
]
}Without a selected planner, agents execute their configured dependencies and scope directly. Existing design files may provide context; missing files do not block work or require architecture documents to be created.
See examples/dev-team/ for a working three-agent pipeline (Architect → Developer → Reviewer) using a single defaults.provider.
cd examples/dev-team
pnpm dev # opens the interactive console
pnpm run run # ...or one headless runFor a team where each agent runs on a different provider (e.g. OpenCode for
implementation, Claude for architecture and review), see
examples/mixed-provider/. The core supports mixing
providers per agent; multiclaw init (v1) generates one shared defaults.provider.
See CONTRIBUTING.md for the development workflow and quality gates.
See RELEASING.md for how the packages are versioned and released — including how
release notes are generated from pull request titles.