Multi-agent orchestration CLI — your agents, all together
Rust
122
166 commits
updated Jul 28, 2026
Terraform-style agent operations for AI coding tools. Define your agent team, run repeatable workflows, track every artifact and gate, and move from messy terminal sessions to versioned engineering operations.
cargo install tutti
Tutti is the operations layer above Claude Code, Codex, Aider, OpenClaw, and API-direct agents. It gives each agent a role, worktree, workflow, audit trail, and dashboard so issue intake, implementation, review, CI, and merge gates happen as repeatable "org code" in tutti.toml.
Agent SDKs help you build agents. Tutti helps you run agent work.

Factory floor: 3 agents working simultaneously, work-item dots flowing through the pipeline, dispatch panel to trigger runs from the browser.

Agent Focus Mode: live terminal output, token usage stats (985K input, 41.6M cache read), prompt bar to send instructions.
cargo install tutti # install the CLI (requires Rust)
cd your-project
tt init --template rust-cli # generate a Rust CLI agent-ops config
tt run --list # see workflows generated for this repo
tt run verify --strict # first successful workflow: cargo test + clippy
tt up # launch your persistent agent team
tt serve --port 4040 # inspect runs, agents, logs, and handoffs
Or pick a template explicitly:
tt init --template gstack-startup # 5-agent interactive SDLC team
tt init --template rust-cli # 3-agent Rust project team
tt init --template minimal # 2-agent starter
Prerequisites: Rust toolchain, tmux, and at least one AI coding CLI installed for agent sessions (Claude Code, Codex, or Aider). Command-only workflows such as the Rust template's verify can run before you launch agents. For non-Rust repos, start with tt init or tt init --template minimal, then add the smallest verification command your project already trusts.
Tutti models the engineering loop as pluggable operational stages:
The built-in Tutti-for-Tutti workflow uses GitHub issue intake and CodeRabbit review because that is the first concrete adapter pair. It is not the product boundary. The product boundary is the loop.
tutti.toml: roles, runtimes, workflows, hooks, gates, and policiestutti.toml:4040 — factory-floor view of all agents with real-time SSE updates, state-driven visuals (working/idle/stopped/blocked), and workflow run trackingtutti.toml file you can review, fork, and move.Tutti is strongest when coordination is the bottleneck, not raw model quality:
A single agent is often the better choice when the repo is small, the task is tightly coupled, or the coordination tax would outweigh any throughput gain.
Your agent team topology is defined in tutti.toml — who does what, which runtime, what workflows:
[workspace]
name = "my-project"
[roles]
implementer = "claude-code"
tester = "claude-code"
reviewer = "codex"
[[agent]]
name = "implementer"
role = "implementer"
[[agent]]
name = "tester"
role = "tester"
[[workflow]]
name = "verify"
[[workflow.step]]
type = "prompt"
agent = "tester"
text = "Run the test suite and report results."
wait_for_idle = true
Swap claude-code for codex in [roles] and every agent using that role switches runtime — no per-agent edits. Version it. Share it. Fork someone else's.
# Install from crates.io
cargo install tutti
# Or install from source
git clone https://github.com/nutthouse/tutti.git
cd tutti
cargo install --path . --locked
# Initialize in your project
cd your-project
tt init
# Edit your team config
$EDITOR tutti.toml
# Launch
tt up
If tt is not found after install, add Cargo bin to your shell PATH:
echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
init, up, down, status, voices, watch, switch, diff, detect, land, review, send, handoff, attach, peek, logs, usage, run, verify, doctor, permissions, workspaces, issue-claimModelProvider, OpenAI-compatible provider, tool execution loop, policy gate, SQLite event logtt init --template gstack-startup generates a fully configured team from built-in or custom templates, with repo auto-detection[roles] table maps logical roles to runtimes — swap providers without editing every agentartifact_glob/artifact_name/office-hours) wait for artifact files instead of idle detection, enabling human-in-the-loop workflowsdepends_on)tt workspaces, tt up --all, tt down --all)tt usage for API profiles (plan = "api") from local Claude Code + Codex session logsmax_concurrent launch guardrails per profile (tt up refuses launches above limit)[[tool_pack]] declarations + tt doctor prerequisite checks (commands/env/profile/runtime)[budget]) with pre-exec checks on tt up/send/run/verifytt issue-claim acquire|heartbeat|release|sweep for autonomous SDLC loopstt permissions suggest <workflow> for batch command pre-approvaltt run --dry-run --json includes literal command strings for pre-validationtt handoff apply) hardening and richer packet templatestt run --direct)docs/WHY_TUTTI.mddocs/AGENT_INTEGRATION_CONTRACT.mddocs/OPENCLAW_SKILL_CONTRACT.mdskills/openclaw/SKILL.mdintegrations/openclaw/README.mddocs/pr-review-loop.mdVERSIONING.mdThe team topology file. This is the "org code" — it defines your agent team as a versionable, forkable configuration.
[workspace]
name = "my-project"
description = "My project workspace"
[workspace.auth]
default_profile = "claude-personal" # profile from ~/.config/tutti/config.toml
[defaults]
worktree = true
runtime = "claude-code"
[launch]
mode = "auto" # safe | auto | unattended
policy = "constrained" # constrained | bypass
[budget]
mode = "warn" # warn | enforce
warn_threshold_pct = 80
workspace_weekly_tokens = 5000000
[budget.agent_weekly_tokens]
backend = 2000000
frontend = 1500000
[[agent]]
name = "backend"
runtime = "claude-code" # or "codex", "aider", "gemini-cli", etc.
scope = "src/api/**"
prompt = "You own the API layer. Use existing patterns. Track work in bd."
fresh_worktree = true # optional: reset this agent worktree on each tt up
[[agent]]
name = "frontend"
runtime = "claude-code"
scope = "src/app/**"
prompt = "You own the UI. Follow existing component patterns."
[[agent]]
name = "tests"
runtime = "codex"
scope = "tests/**"
prompt = "Write and maintain tests. Run the test suite after changes."
depends_on = ["backend", "frontend"]
[[workflow]]
name = "verify-app"
schedule = "*/30 * * * *"
[[workflow.step]]
id = "verify"
type = "command"
run = "cargo test --quiet"
cwd = "workspace"
subdir = "backend" # optional workspace-relative command directory
fail_mode = "closed"
output_json = ".tutti/state/verify.json"
[[workflow.step]]
type = "ensure_running"
agent = "backend"
[[workflow.step]]
type = "prompt"
agent = "conductor"
text = "Summarize anomalies from latest snapshot and propose dispatch actions."
inject_files = [".tutti/state/snapshot.json"]
[[workflow.step]]
type = "workflow"
workflow = "verify-app"
strict = true
fail_mode = "closed"
[[workflow.step]]
type = "review"
agent = "backend"
reviewer = "reviewer"
depends_on = [4]
[[workflow.step]]
type = "land"
agent = "backend"
force = true
depends_on = [5]
[[hook]]
event = "workflow_complete"
workflow_source = "observe_cycle"
workflow_name = "verify-app"
run = "echo scheduled verify completed"
Profiles are configured globally in ~/.config/tutti/config.toml:
[[profile]]
name = "claude-personal"
provider = "anthropic"
command = "claude"
max_concurrent = 5
plan = "max"
reset_day = "monday"
weekly_hours = 45.0
tt usage scans and aggregates usage only for profiles with plan = "api".
tt permissions is opt-in and reads [permissions] from ~/.config/tutti/config.toml.
With default launch mode (auto), constrained non-interactive runs require [permissions] allow rules.
For prompt steps that need workspace artifacts, use inject_files = ["relative/path.json"] to copy files into the target agent's working tree before the prompt is sent.
Prompt steps can capture artifacts with artifact_glob and artifact_name — after the prompt step completes, tutti globs for new files and registers them as step outputs. Downstream steps reference artifacts via inject_files = ["{{output.artifact_name.path}}"] or {{output.artifact_name.path}} in prompt text. Glob patterns support ~, {slug}, {workspace}, and {agent} interpolation.
For command steps that should run under a workspace subpath, use subdir = "relative/path" instead of shell cd ... &&.
Use depends_on = [<step-number>, ...] on workflow steps to unlock dependency-aware execution; independent ensure_running/review/land steps run in parallel waves.
Budget guardrails are API-only: when [budget] is configured and the workspace profile has plan = "api", Tutti checks budget caps before up/send/run/verify, emits budget.threshold / budget.blocked control events, and either warns or blocks based on budget.mode.
Optional tool packs can be declared per workspace and validated with tt doctor:
[[tool_pack]]
name = "analytics"
required_commands = ["bq", "jq"]
required_env = ["GCP_PROJECT"]
Each running agent instance is a voice — the musical term for an individual part in an ensemble. tt voices lists what's playing.
A tutti.toml file is an arrangement — the configuration that tells each voice what to play and when. Share arrangements, fork them, adapt them to your project.
A movement is a phase of work — a logical grouping of tasks across agents. "Build the auth system" might be one movement containing work across backend, frontend, and test voices.
Reusable prompt components and skills are phrases. A phrase might be a CLAUDE.md snippet, a testing methodology, a code style guide, or an architectural pattern. Publish and share phrases through the community registry.
tt up / tt down)tt diff <agent>)tt land <agent>)tt land <agent> --force, with temporary stash/restore)tt land <agent> --pr)tt review <agent>)tt send --auto_up --wait --output)tt init --template <name> generates tutti.toml from built-in or custom templatesgstack-startup (5-agent interactive SDLC), rust-cli (3-agent with verify workflow), minimal (2-agent fallback)detect (any-match) and detect_all (all-match) file patterns; tt init without --template scans the repo and suggests the best match[roles] table — agents declare role = "planner" instead of hardcoding runtimes; resolution order: explicit runtime > role lookup > defaults{{project_name}} variable substitution in template config body# template: name version) in generated config, propagated to AutomationRunRecordartifact_glob and artifact_name — after a step completes, tutti globs for new files matching the patterninject_files = ["{{output.artifact_name.path}}"] — files are copied into the target agent's worktreeartifact_glob is set without wait_for_idle, tutti polls for the artifact file every 5s instead of idle-detecting, enabling interactive skills (e.g. /office-hours) where the agent waits for human input~, {slug}, {workspace}, and {agent} interpolationtt run / tt verify reusable workflow execution with persisted run records.tutti/state/workflow-checkpoints/<run_id>.json + tt run --resume <run_id>prompt, command, ensure_running, workflow (nested), review, landreview/land steps auto-start required sessions when they are not already runningland steps enforce a merge gate. Today the built-in gate targets GitHub PRs, required checks, and resolved review threads; the stage model is designed for other review systems.workflow_complete hooks for deterministic chainingpersistent = false sessions at workflow endtt serve local control API endpoints:
/v1/health, /v1/status, /v1/voices, /v1/workflows, /v1/runs, /v1/ops, /v1/logs, /v1/handoffs, /v1/policy-decisions, /v1/events/v1/events?cursor=<RFC3339 timestamp>&workspace=<name>/v1/events/stream?cursor=<RFC3339 timestamp>&workspace=<name>agent.started, agent.stopped, agent.working, agent.idle, agent.auth_failed, workflow.started, workflow.completed, workflow.failed, handoff events)/v1/actions/up|down|send|run|verify|review|landok/action/error/datasend action returns structured send result (waited, completion_source, captured_output)Idempotency-Key header (or idempotency_key request field)tt usage, API profiles only)PLAN + live CTX plus quick attach/peek flowtt logs).tutti/state/run-telemetry.jsonlModelProvider adapter (built)tt run --direct workflow wiring (planned)tt replay for API-direct run inspection (planned)tt handoff generate <agent> creates markdown packets in .tutti/handoffs/tt handoff apply <agent> injects latest packet into a running agent sessiontt handoff list [--agent ...] [--json] for packet discoverytt watch (and post-tt up) when CTX crosses configured handoff threshold:4040 with real-time SSE updates[resilience].retry_*)[resilience].provider_down_strategy = "rotate_profile" or rate_limit_strategy)tt serve (cooldown-throttled restart + strategy-aware profile rotation)tt watch (cooldown-throttled restart + strategy-aware profile rotation)plan, reset_day, weekly_hours)max_concurrent) enforced by tt uptt profiles command (planned)~/.config/tutti/config.toml under [permissions]git status, cargo test) and/or Claude tool names (Read, Edit, Write)tt permissions check <command...> evaluates command prefixes against policytt permissions export --runtime claude emits a Claude settings scaffoldtt up auto-wires constrained non-interactive policy for Claude sessionstt up fails with guidance.tutti/state/policy-decisions.jsonl and exposed via /v1/policy-decisions[[tool_pack]] blocks in tutti.toml (required_commands, required_env)tt doctor reports pass/warn/fail for tmux, profile wiring, runtime binaries, and tool-pack prerequisitestt doctor also probes running agents for auth health (auth/<agent> checks)tt doctor validates serve readiness (serve/state_dir, serve/events_log, serve/scheduler, serve/port).github/workflows/ci.yml) runs headless tt doctor --strict + tt run smoke-check --stricttt browse to explore what others are running┌──────────────────────────────────────────┐
│ tt (CLI) │
│ init · run · up · serve · review · land │
├──────────────────────────────────────────┤
│ Agent Ops Core │
│ topology · workflows · gates · policies │
├─────────────────────┬────────────────────┤
│ CLI-Agent Path │ API-Direct Path │
│ Claude/Codex/Aider │ ModelProvider │
│ tmux · worktrees │ tools · policy │
├─────────────────────┴────────────────────┤
│ State + Artifacts │
│ ledgers · checkpoints · outputs · events │
├──────────────────────────────────────────┤
│ Observability │
│ logs · run telemetry · status · replay │
├──────────────────────────────────────────┤
│ Dashboard / Control API │
│ Web UI · REST API · SSE event stream │
└──────────────────────────────────────────┘
| Runtime | Status | Notes |
|---|---|---|
| Claude Code | ✅ Primary | Full support including context monitoring |
| Codex CLI | ✅ Supported | Token tracking via local Codex session logs |
| Aider | ✅ Supported | Model-agnostic |
| OpenClaw | ✅ Supported | Native runtime adapter (runtime = "openclaw") |
| Gemini CLI | 🔜 Planned | |
| Custom | 🔜 Planned | Any CLI agent via adapter interface |
BYOS: Bring Your Own Subscription. In CLI-agent mode, Tutti uses whatever tools you already have installed and authenticated. If you can run claude in your terminal, Tutti can orchestrate it. API-direct mode is explicit and configured separately.
Org code is real code. How you structure your agent team is as important as the code they write. It should be versioned, reviewed, and iterable — just like infrastructure-as-code or CI/CD pipelines.
Operations beat demos. A good agent demo writes code once. A good agent operation can be rerun, inspected, reviewed, resumed, and trusted.
Adapters, not a walled garden. GitHub and CodeRabbit are useful first integrations. The model is intake, execution, review, gate, record. Other issue trackers, agent tools, and review systems should fit the same loop.
Start simple, scale up. One agent in a tutti.toml is fine. You don't need five agents and a complex topology on day one. Tutti should make even a single agent session better through observability and handoff support, then earn the right to add more agents when the work naturally separates.
Tutti is early. If this resonates with how you work, we want to hear from you.
tt init, tt up, tt down, tt status, tt voices, tt watch, tt switch, tt diff, tt detect, tt land, tt review, tt send, tt handoff, tt attach, tt peek, tt logs, tt usage, tt run, tt verify, tt doctor, tt permissions, tt workspaces)tt usage profile/workspace capacity reportingtt permissions suggest for batch workflow pre-approvalcargo install tutti)tt run --direct CLI wiringMIT
In music, tutti means "all together" — the moment every voice in the ensemble plays as one. That's what your agents should feel like.
Rust
90.2%
JavaScript
3.1%
Python
2.4%
HTML
1.8%
CSS
1.7%
Multi-agent orchestration CLI — your agents, all together
Rust
122
166 commits
updated Jul 28, 2026
Terraform-style agent operations for AI coding tools. Define your agent team, run repeatable workflows, track every artifact and gate, and move from messy terminal sessions to versioned engineering operations.
cargo install tutti
Tutti is the operations layer above Claude Code, Codex, Aider, OpenClaw, and API-direct agents. It gives each agent a role, worktree, workflow, audit trail, and dashboard so issue intake, implementation, review, CI, and merge gates happen as repeatable "org code" in tutti.toml.
Agent SDKs help you build agents. Tutti helps you run agent work.

Factory floor: 3 agents working simultaneously, work-item dots flowing through the pipeline, dispatch panel to trigger runs from the browser.

Agent Focus Mode: live terminal output, token usage stats (985K input, 41.6M cache read), prompt bar to send instructions.
cargo install tutti # install the CLI (requires Rust)
cd your-project
tt init --template rust-cli # generate a Rust CLI agent-ops config
tt run --list # see workflows generated for this repo
tt run verify --strict # first successful workflow: cargo test + clippy
tt up # launch your persistent agent team
tt serve --port 4040 # inspect runs, agents, logs, and handoffs
Or pick a template explicitly:
tt init --template gstack-startup # 5-agent interactive SDLC team
tt init --template rust-cli # 3-agent Rust project team
tt init --template minimal # 2-agent starter
Prerequisites: Rust toolchain, tmux, and at least one AI coding CLI installed for agent sessions (Claude Code, Codex, or Aider). Command-only workflows such as the Rust template's verify can run before you launch agents. For non-Rust repos, start with tt init or tt init --template minimal, then add the smallest verification command your project already trusts.
Tutti models the engineering loop as pluggable operational stages:
The built-in Tutti-for-Tutti workflow uses GitHub issue intake and CodeRabbit review because that is the first concrete adapter pair. It is not the product boundary. The product boundary is the loop.
tutti.toml: roles, runtimes, workflows, hooks, gates, and policiestutti.toml:4040 — factory-floor view of all agents with real-time SSE updates, state-driven visuals (working/idle/stopped/blocked), and workflow run trackingtutti.toml file you can review, fork, and move.Tutti is strongest when coordination is the bottleneck, not raw model quality:
A single agent is often the better choice when the repo is small, the task is tightly coupled, or the coordination tax would outweigh any throughput gain.
Your agent team topology is defined in tutti.toml — who does what, which runtime, what workflows:
[workspace]
name = "my-project"
[roles]
implementer = "claude-code"
tester = "claude-code"
reviewer = "codex"
[[agent]]
name = "implementer"
role = "implementer"
[[agent]]
name = "tester"
role = "tester"
[[workflow]]
name = "verify"
[[workflow.step]]
type = "prompt"
agent = "tester"
text = "Run the test suite and report results."
wait_for_idle = true
Swap claude-code for codex in [roles] and every agent using that role switches runtime — no per-agent edits. Version it. Share it. Fork someone else's.
# Install from crates.io
cargo install tutti
# Or install from source
git clone https://github.com/nutthouse/tutti.git
cd tutti
cargo install --path . --locked
# Initialize in your project
cd your-project
tt init
# Edit your team config
$EDITOR tutti.toml
# Launch
tt up
If tt is not found after install, add Cargo bin to your shell PATH:
echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
init, up, down, status, voices, watch, switch, diff, detect, land, review, send, handoff, attach, peek, logs, usage, run, verify, doctor, permissions, workspaces, issue-claimModelProvider, OpenAI-compatible provider, tool execution loop, policy gate, SQLite event logtt init --template gstack-startup generates a fully configured team from built-in or custom templates, with repo auto-detection[roles] table maps logical roles to runtimes — swap providers without editing every agentartifact_glob/artifact_name/office-hours) wait for artifact files instead of idle detection, enabling human-in-the-loop workflowsdepends_on)tt workspaces, tt up --all, tt down --all)tt usage for API profiles (plan = "api") from local Claude Code + Codex session logsmax_concurrent launch guardrails per profile (tt up refuses launches above limit)[[tool_pack]] declarations + tt doctor prerequisite checks (commands/env/profile/runtime)[budget]) with pre-exec checks on tt up/send/run/verifytt issue-claim acquire|heartbeat|release|sweep for autonomous SDLC loopstt permissions suggest <workflow> for batch command pre-approvaltt run --dry-run --json includes literal command strings for pre-validationtt handoff apply) hardening and richer packet templatestt run --direct)docs/WHY_TUTTI.mddocs/AGENT_INTEGRATION_CONTRACT.mddocs/OPENCLAW_SKILL_CONTRACT.mdskills/openclaw/SKILL.mdintegrations/openclaw/README.mddocs/pr-review-loop.mdVERSIONING.mdThe team topology file. This is the "org code" — it defines your agent team as a versionable, forkable configuration.
[workspace]
name = "my-project"
description = "My project workspace"
[workspace.auth]
default_profile = "claude-personal" # profile from ~/.config/tutti/config.toml
[defaults]
worktree = true
runtime = "claude-code"
[launch]
mode = "auto" # safe | auto | unattended
policy = "constrained" # constrained | bypass
[budget]
mode = "warn" # warn | enforce
warn_threshold_pct = 80
workspace_weekly_tokens = 5000000
[budget.agent_weekly_tokens]
backend = 2000000
frontend = 1500000
[[agent]]
name = "backend"
runtime = "claude-code" # or "codex", "aider", "gemini-cli", etc.
scope = "src/api/**"
prompt = "You own the API layer. Use existing patterns. Track work in bd."
fresh_worktree = true # optional: reset this agent worktree on each tt up
[[agent]]
name = "frontend"
runtime = "claude-code"
scope = "src/app/**"
prompt = "You own the UI. Follow existing component patterns."
[[agent]]
name = "tests"
runtime = "codex"
scope = "tests/**"
prompt = "Write and maintain tests. Run the test suite after changes."
depends_on = ["backend", "frontend"]
[[workflow]]
name = "verify-app"
schedule = "*/30 * * * *"
[[workflow.step]]
id = "verify"
type = "command"
run = "cargo test --quiet"
cwd = "workspace"
subdir = "backend" # optional workspace-relative command directory
fail_mode = "closed"
output_json = ".tutti/state/verify.json"
[[workflow.step]]
type = "ensure_running"
agent = "backend"
[[workflow.step]]
type = "prompt"
agent = "conductor"
text = "Summarize anomalies from latest snapshot and propose dispatch actions."
inject_files = [".tutti/state/snapshot.json"]
[[workflow.step]]
type = "workflow"
workflow = "verify-app"
strict = true
fail_mode = "closed"
[[workflow.step]]
type = "review"
agent = "backend"
reviewer = "reviewer"
depends_on = [4]
[[workflow.step]]
type = "land"
agent = "backend"
force = true
depends_on = [5]
[[hook]]
event = "workflow_complete"
workflow_source = "observe_cycle"
workflow_name = "verify-app"
run = "echo scheduled verify completed"
Profiles are configured globally in ~/.config/tutti/config.toml:
[[profile]]
name = "claude-personal"
provider = "anthropic"
command = "claude"
max_concurrent = 5
plan = "max"
reset_day = "monday"
weekly_hours = 45.0
tt usage scans and aggregates usage only for profiles with plan = "api".
tt permissions is opt-in and reads [permissions] from ~/.config/tutti/config.toml.
With default launch mode (auto), constrained non-interactive runs require [permissions] allow rules.
For prompt steps that need workspace artifacts, use inject_files = ["relative/path.json"] to copy files into the target agent's working tree before the prompt is sent.
Prompt steps can capture artifacts with artifact_glob and artifact_name — after the prompt step completes, tutti globs for new files and registers them as step outputs. Downstream steps reference artifacts via inject_files = ["{{output.artifact_name.path}}"] or {{output.artifact_name.path}} in prompt text. Glob patterns support ~, {slug}, {workspace}, and {agent} interpolation.
For command steps that should run under a workspace subpath, use subdir = "relative/path" instead of shell cd ... &&.
Use depends_on = [<step-number>, ...] on workflow steps to unlock dependency-aware execution; independent ensure_running/review/land steps run in parallel waves.
Budget guardrails are API-only: when [budget] is configured and the workspace profile has plan = "api", Tutti checks budget caps before up/send/run/verify, emits budget.threshold / budget.blocked control events, and either warns or blocks based on budget.mode.
Optional tool packs can be declared per workspace and validated with tt doctor:
[[tool_pack]]
name = "analytics"
required_commands = ["bq", "jq"]
required_env = ["GCP_PROJECT"]
Each running agent instance is a voice — the musical term for an individual part in an ensemble. tt voices lists what's playing.
A tutti.toml file is an arrangement — the configuration that tells each voice what to play and when. Share arrangements, fork them, adapt them to your project.
A movement is a phase of work — a logical grouping of tasks across agents. "Build the auth system" might be one movement containing work across backend, frontend, and test voices.
Reusable prompt components and skills are phrases. A phrase might be a CLAUDE.md snippet, a testing methodology, a code style guide, or an architectural pattern. Publish and share phrases through the community registry.
tt up / tt down)tt diff <agent>)tt land <agent>)tt land <agent> --force, with temporary stash/restore)tt land <agent> --pr)tt review <agent>)tt send --auto_up --wait --output)tt init --template <name> generates tutti.toml from built-in or custom templatesgstack-startup (5-agent interactive SDLC), rust-cli (3-agent with verify workflow), minimal (2-agent fallback)detect (any-match) and detect_all (all-match) file patterns; tt init without --template scans the repo and suggests the best match[roles] table — agents declare role = "planner" instead of hardcoding runtimes; resolution order: explicit runtime > role lookup > defaults{{project_name}} variable substitution in template config body# template: name version) in generated config, propagated to AutomationRunRecordartifact_glob and artifact_name — after a step completes, tutti globs for new files matching the patterninject_files = ["{{output.artifact_name.path}}"] — files are copied into the target agent's worktreeartifact_glob is set without wait_for_idle, tutti polls for the artifact file every 5s instead of idle-detecting, enabling interactive skills (e.g. /office-hours) where the agent waits for human input~, {slug}, {workspace}, and {agent} interpolationtt run / tt verify reusable workflow execution with persisted run records.tutti/state/workflow-checkpoints/<run_id>.json + tt run --resume <run_id>prompt, command, ensure_running, workflow (nested), review, landreview/land steps auto-start required sessions when they are not already runningland steps enforce a merge gate. Today the built-in gate targets GitHub PRs, required checks, and resolved review threads; the stage model is designed for other review systems.workflow_complete hooks for deterministic chainingpersistent = false sessions at workflow endtt serve local control API endpoints:
/v1/health, /v1/status, /v1/voices, /v1/workflows, /v1/runs, /v1/ops, /v1/logs, /v1/handoffs, /v1/policy-decisions, /v1/events/v1/events?cursor=<RFC3339 timestamp>&workspace=<name>/v1/events/stream?cursor=<RFC3339 timestamp>&workspace=<name>agent.started, agent.stopped, agent.working, agent.idle, agent.auth_failed, workflow.started, workflow.completed, workflow.failed, handoff events)/v1/actions/up|down|send|run|verify|review|landok/action/error/datasend action returns structured send result (waited, completion_source, captured_output)Idempotency-Key header (or idempotency_key request field)tt usage, API profiles only)PLAN + live CTX plus quick attach/peek flowtt logs).tutti/state/run-telemetry.jsonlModelProvider adapter (built)tt run --direct workflow wiring (planned)tt replay for API-direct run inspection (planned)tt handoff generate <agent> creates markdown packets in .tutti/handoffs/tt handoff apply <agent> injects latest packet into a running agent sessiontt handoff list [--agent ...] [--json] for packet discoverytt watch (and post-tt up) when CTX crosses configured handoff threshold:4040 with real-time SSE updates[resilience].retry_*)[resilience].provider_down_strategy = "rotate_profile" or rate_limit_strategy)tt serve (cooldown-throttled restart + strategy-aware profile rotation)tt watch (cooldown-throttled restart + strategy-aware profile rotation)plan, reset_day, weekly_hours)max_concurrent) enforced by tt uptt profiles command (planned)~/.config/tutti/config.toml under [permissions]git status, cargo test) and/or Claude tool names (Read, Edit, Write)tt permissions check <command...> evaluates command prefixes against policytt permissions export --runtime claude emits a Claude settings scaffoldtt up auto-wires constrained non-interactive policy for Claude sessionstt up fails with guidance.tutti/state/policy-decisions.jsonl and exposed via /v1/policy-decisions[[tool_pack]] blocks in tutti.toml (required_commands, required_env)tt doctor reports pass/warn/fail for tmux, profile wiring, runtime binaries, and tool-pack prerequisitestt doctor also probes running agents for auth health (auth/<agent> checks)tt doctor validates serve readiness (serve/state_dir, serve/events_log, serve/scheduler, serve/port).github/workflows/ci.yml) runs headless tt doctor --strict + tt run smoke-check --stricttt browse to explore what others are running┌──────────────────────────────────────────┐
│ tt (CLI) │
│ init · run · up · serve · review · land │
├──────────────────────────────────────────┤
│ Agent Ops Core │
│ topology · workflows · gates · policies │
├─────────────────────┬────────────────────┤
│ CLI-Agent Path │ API-Direct Path │
│ Claude/Codex/Aider │ ModelProvider │
│ tmux · worktrees │ tools · policy │
├─────────────────────┴────────────────────┤
│ State + Artifacts │
│ ledgers · checkpoints · outputs · events │
├──────────────────────────────────────────┤
│ Observability │
│ logs · run telemetry · status · replay │
├──────────────────────────────────────────┤
│ Dashboard / Control API │
│ Web UI · REST API · SSE event stream │
└──────────────────────────────────────────┘
| Runtime | Status | Notes |
|---|---|---|
| Claude Code | ✅ Primary | Full support including context monitoring |
| Codex CLI | ✅ Supported | Token tracking via local Codex session logs |
| Aider | ✅ Supported | Model-agnostic |
| OpenClaw | ✅ Supported | Native runtime adapter (runtime = "openclaw") |
| Gemini CLI | 🔜 Planned | |
| Custom | 🔜 Planned | Any CLI agent via adapter interface |
BYOS: Bring Your Own Subscription. In CLI-agent mode, Tutti uses whatever tools you already have installed and authenticated. If you can run claude in your terminal, Tutti can orchestrate it. API-direct mode is explicit and configured separately.
Org code is real code. How you structure your agent team is as important as the code they write. It should be versioned, reviewed, and iterable — just like infrastructure-as-code or CI/CD pipelines.
Operations beat demos. A good agent demo writes code once. A good agent operation can be rerun, inspected, reviewed, resumed, and trusted.
Adapters, not a walled garden. GitHub and CodeRabbit are useful first integrations. The model is intake, execution, review, gate, record. Other issue trackers, agent tools, and review systems should fit the same loop.
Start simple, scale up. One agent in a tutti.toml is fine. You don't need five agents and a complex topology on day one. Tutti should make even a single agent session better through observability and handoff support, then earn the right to add more agents when the work naturally separates.
Tutti is early. If this resonates with how you work, we want to hear from you.
tt init, tt up, tt down, tt status, tt voices, tt watch, tt switch, tt diff, tt detect, tt land, tt review, tt send, tt handoff, tt attach, tt peek, tt logs, tt usage, tt run, tt verify, tt doctor, tt permissions, tt workspaces)tt usage profile/workspace capacity reportingtt permissions suggest for batch workflow pre-approvalcargo install tutti)tt run --direct CLI wiringMIT
In music, tutti means "all together" — the moment every voice in the ensemble plays as one. That's what your agents should feel like.
Rust
90.2%
JavaScript
3.1%
Python
2.4%
HTML
1.8%
CSS
1.7%