Orchestrate teams of AI coding agents in tmux
Project description
Orchestrate teams of AI coding agents working in parallel inside tmux sessions.
A team lead agent runs interactively and delegates tasks to worker agents (Claude, Codex, Gemini) in separate tmux windows. Workers can run in interactive or oneshot mode, with per-worker provider, model, and working-directory overrides.
User ──> team CLI ──> tmux session
├── window 0: lead
├── window 1: fix-auth
├── window 2: add-tests
└── ...
Demo
Installation
Requires Python 3.11+ and tmux.
pip install agentic-team
Or install from source with uv:
git clone https://github.com/guenp/agentic-team.git
cd agentic-team
uv sync
You also need at least one provider CLI installed and already authenticated:
claudecodexgemini
agentic-team does not install or log in those CLIs for you. See docs/providers.md for the exact flags, resume support, system-prompt behavior, permission handling, and provider-specific caveats.
5-minute first run
- Install
tmuxandagentic-team. - Install one provider CLI from its official docs.
- Authenticate that provider.
- Verify the environment with
team doctor. - Start the team.
# tmux is required
brew install tmux
# or: sudo apt install tmux
# install one provider CLI
# Claude Code: https://docs.anthropic.com/en/docs/claude-code
# Codex CLI: https://github.com/openai/codex
# Gemini CLI: https://github.com/google-gemini/gemini-cli
# authenticate the provider you plan to use
claude auth login
# or: codex login
# Gemini: configure GEMINI_API_KEY / GOOGLE_API_KEY, or complete Gemini CLI auth
# verify tmux + provider install/auth
team doctor --provider claude
# if exactly one provider is installed and authenticated, team init auto-detects it
team init myproject --working-dir ~/repos/myproject
# otherwise pass --provider claude|codex|gemini
Quick start
# Initialize a team (provider auto-detected when only one is viable)
team init myproject --working-dir ~/repos/myproject
# or choose explicitly
team init myproject --provider claude --working-dir ~/repos/myproject
# Send a task to the lead
team "fix the auth bug and add tests for the login flow"
# Inspect progress
team status
team logs
# Attach to the tmux session
team attach
Example team status output:
Team: myproject (claude)
Worker Status Mode Task
────────────── ───────── ─────────── ──────────────────────────────
lead active interactive —
fix-auth active interactive Fix the login bug
add-tests done oneshot Add regression tests
The lead agent receives a generated team-lead prompt when the provider supports system-prompt injection. Today that means Claude; Codex and Gemini leads run with provider-specific CLI flags only.
How to use it: talk to the lead
The primary workflow is conversational delegation — you talk to the lead agent like a project manager, and it breaks down work, spawns workers, monitors progress, and synthesizes results.
Starting a session
From your terminal:
team init myproject --provider claude --working-dir ~/repos/myproject
Or from inside Claude Code, use the /team skill:
/team start a new team for ~/repos/myproject
Either way you get a lead agent running in a tmux session, ready to take instructions.
Delegating work with natural language
Once the lead is running, send it tasks in plain English. The lead decides how many workers to spawn, what each one does, and coordinates the results.
# One-liner delegation
team "review all open PRs, fix any issues, and merge them"
# Or attach and chat interactively
team attach
From Claude Code:
/team review all open PRs and merge the ones that are ready
The lead will:
- Analyze the request and break it into discrete tasks
- Spawn workers — one per PR, one per bug fix, etc.
- Monitor each worker's progress via
team status - Read logs to check worker output when they finish
- Synthesize results and report back to you
Example: reviewing and merging PRs
Here is a realistic interaction showing the conversational flow:
You: /team review all 4 open PRs, fix any issues, and merge them in order
Lead: I'll spawn 4 workers to review the PRs in parallel.
[spawns worker: review-pr-1]
[spawns worker: review-pr-2]
[spawns worker: review-pr-3]
[spawns worker: review-pr-4]
Lead: All 4 reviews are done. PRs #1 and #3 are clean.
PR #2 has a failing test — spawning a worker to fix it.
PR #4 has a merge conflict — spawning a worker to resolve it.
[spawns worker: fix-pr-2]
[spawns worker: fix-pr-4]
Lead: Fixes are in. Merging in order: #1, #2, #3, #4.
All 4 PRs merged successfully. Here's the summary:
- PR #1: Added auth middleware — merged cleanly
- PR #2: Fixed login bug (test fix applied) — merged
- PR #3: Updated docs — merged cleanly
- PR #4: Refactored config (conflict resolved) — merged
You stay in control — you can redirect the lead at any time:
You: skip PR #4 for now, just merge the first three
You: also tag a release after merging
You: what's the status on the test fix for PR #2?
Example: multi-step release workflow
You: /team run the full release process — review PRs, merge them,
bump the version, update the changelog, and tag a release
Lead: Starting with PR review. I see 3 open PRs.
[spawns 3 review workers]
...
All PRs reviewed and merged.
Now bumping version to v0.3.0 and updating CHANGELOG.md.
[spawns worker: bump-version]
...
Version bumped. Creating git tag v0.3.0 and pushing.
Release complete. Summary: ...
Checking on progress
While the lead is working, you can check status from another terminal:
team status # table of all workers and their states
team logs # recent output from all workers
team standup # ask the lead for a markdown summary
team attach --multi # tiled tmux view of all workers
Command quick reference
Global options:
team [--version] [-T TEAM] COMMAND [ARGS]...
TEAM_NAME=<team> team COMMAND [ARGS]...
-T/--team and TEAM_NAME select a specific team instead of the active team.
Team lifecycle
# Verify tmux, provider auth, and the active lead session
team doctor [--provider claude|codex|gemini]
# Initialize a new team
team init NAME [-p claude|codex|gemini] [-m MODEL]
[--worker-mode oneshot|interactive]
[--permissions auto|default|dangerously-skip-permissions]
[--max-workers INTEGER] [-C DIRECTORY]
team list
team stop [NAME]
Lead interaction
team "PROMPT..."
team send PROMPT...
team attach [-w WINDOW] [-m]
team standup [--timeout INTEGER] [-v]
Worker management
team spawn-worker -t TASK [--mode oneshot|interactive]
[--provider claude|codex|gemini] [--model MODEL]
[-n NAME] [-C DIRECTORY] [-r SESSION_ID]
team status [WORKER_NAME] [-v]
team logs [WORKER_NAME] [-n TAIL] [-a]
team send-to-worker WORKER_NAME MESSAGE...
team resume WORKER_NAME PROMPT...
team stop-worker WORKER_NAME
team wait [-t TIMEOUT] [-i INTERVAL]
team clear
Task files
team run TASK_FILE [-l LIMIT] [--dry-run] [--rerun]
team sync TASK_FILE
The full command reference is in docs/commands.md.
Task files
Task files are markdown checklists. Headings set a working-directory context, and trailing (key: value) overrides customize individual tasks.
## ~/repos/backend
- [ ] Fix the login bug
- [ ] Add regression tests (provider: codex, mode: oneshot)
- [ ] Update docs screenshots (dir: ~/repos/docs-site, name: docs-shots)
team run tasks.md
team sync tasks.md
team run tasks.md --rerun
Supported inline keys today are:
providermodemodelnameworking_dirdir
The full parser and writeback rules are in docs/task-files.md.
Managing multiple teams
team list
team -T other-team status
TEAM_NAME=other-team team logs lead
team init makes the new team active. -T and TEAM_NAME let you inspect another team without changing the active symlink. Full details are in docs/multiple-teams.md.
How it works
team initsaves a team config, creates~/.agentic-team/logs/<team>/<timestamp>/, and starts the lead in tmux sessionteam-<name>.team spawn-workerorteam runbuilds provider-specific commands fromsrc/agentic_team/models.pyandsrc/agentic_team/agents.py.- New interactive workers receive their first prompt only after
capture-paneshows a ready screen; that queued prompt lives under~/.agentic-team/state/<team>/pending_prompts/. team statusrefreshes worker state by checking tmux panes, provider-specific idle signals, and Claude oneshot session IDs.team logsreads the current session log file first, then falls back to tmux pane capture when the file is empty or unavailable.
Runtime layout
~/.agentic-team/
├── teams/
│ └── myproject.toml
├── state/
│ └── myproject/
│ ├── workers.toml
│ ├── pending_prompts/
│ ├── multi_targets
│ └── standup.md
├── logs/
│ └── myproject/
│ ├── 20260415-003621/
│ │ ├── lead.log
│ │ ├── fix-auth.log
│ │ └── add-tests.log
│ └── current -> 20260415-003621
└── active -> state/myproject
Further reading
- docs/getting-started.md
- docs/providers.md
- docs/multiple-teams.md
- docs/commands.md
- docs/task-files.md
- docs/examples.md
- docs/operations.md
- docs/architecture.md
- demo/lead-workflow.md — full walkthrough of the interactive lead workflow
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agentic_team-0.3.0.tar.gz.
File metadata
- Download URL: agentic_team-0.3.0.tar.gz
- Upload date:
- Size: 12.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb549498af5f4a2535cf819f92ba39d5afde6e00ca125540d34ad8db199b0c21
|
|
| MD5 |
7c15639ef19fe2d9f64a772209575ca4
|
|
| BLAKE2b-256 |
ddceea53dd22301d7a7a120a40f3380be16cdc33c223697e3e5c669965d1925b
|
Provenance
The following attestation bundles were made for agentic_team-0.3.0.tar.gz:
Publisher:
publish.yml on guenp/agentic-team
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agentic_team-0.3.0.tar.gz -
Subject digest:
bb549498af5f4a2535cf819f92ba39d5afde6e00ca125540d34ad8db199b0c21 - Sigstore transparency entry: 1308622072
- Sigstore integration time:
-
Permalink:
guenp/agentic-team@dab24d6f5bd272e73c916e0fb5671c1ca4aaecd1 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/guenp
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@dab24d6f5bd272e73c916e0fb5671c1ca4aaecd1 -
Trigger Event:
push
-
Statement type:
File details
Details for the file agentic_team-0.3.0-py3-none-any.whl.
File metadata
- Download URL: agentic_team-0.3.0-py3-none-any.whl
- Upload date:
- Size: 47.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
97bb9cdb522386a6a9432a545939456d830ed5934f0194443a06203096fcad7c
|
|
| MD5 |
2fbd59e436e3c4de1548855270e8b09e
|
|
| BLAKE2b-256 |
57f72236d0889608a58f73d6899249e289a11296b72fb9177c7e3ede8850e087
|
Provenance
The following attestation bundles were made for agentic_team-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on guenp/agentic-team
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agentic_team-0.3.0-py3-none-any.whl -
Subject digest:
97bb9cdb522386a6a9432a545939456d830ed5934f0194443a06203096fcad7c - Sigstore transparency entry: 1308622166
- Sigstore integration time:
-
Permalink:
guenp/agentic-team@dab24d6f5bd272e73c916e0fb5671c1ca4aaecd1 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/guenp
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@dab24d6f5bd272e73c916e0fb5671c1ca4aaecd1 -
Trigger Event:
push
-
Statement type: