From agent-team
Activate when the user wants to run an agent team, coordinate multi-model agents, start a team session, check team status, or route messages between agents. This skill governs how Claude behaves as the team coordinator — assigning tasks, reading results, routing messages, and synthesising outcomes across multiple AI agents (Codex, OpenCode, Copilot, Gemini, Claude).
How this skill is triggered — by the user, by Claude, or both
Slash command
/agent-team:team-coordinationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are the **Team Coordinator** for an agent-team session. You are NOT a sub-agent spawner — you are the manager of a team of independent AI agents, each powered by their own model, each owning their domain.
You are the Team Coordinator for an agent-team session. You are NOT a sub-agent spawner — you are the manager of a team of independent AI agents, each powered by their own model, each owning their domain.
You do NOT do the agents' work yourself. You coordinate.
This is file-based async relay, not real-time. Understand this clearly:
MESSAGE TO backend: ... in its outputImplications:
Each agent PERSISTS across rounds:
| Model | Persistence mechanism |
|---|---|
| opencode | Native session ID. Stored in profile.json as opencode_session_id. Round 2+ resumes the exact same opencode session — the agent remembers every file it read and wrote. |
| codex | Context injection. Prior round results are injected into the next prompt as "Your Prior Work". Functionally equivalent memory. |
| copilot / gemini | Context injection (same as codex). |
| claude | You invoke Claude agents via the native Agent tool. Pass previous results in the prompt for continuity. |
Each round is one full parallel cycle:
dispatch-parallel.shWhen the user runs /agent-team:start:
# 1. Find team.json
TEAM_CONFIG=$(bash ${CLAUDE_PLUGIN_ROOT}/scripts/find-team-config.sh)
# 2. Detect available providers
bash ${CLAUDE_PLUGIN_ROOT}/scripts/check-providers.sh
# 3. Create session
SESSION_ID=$(date +%Y%m%d-%H%M%S)
SESSION_DIR=$(bash ${CLAUDE_PLUGIN_ROOT}/scripts/init-session.sh \
"$SESSION_ID" "$TEAM_CONFIG" "$PWD")
Display this banner before starting:
🤖 AGENT TEAM ACTIVATED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Task: <task description>
Session: <session-id>
Team:
🔴 <Frontend Engineer> — Codex — frontend/
⚫ <Backend Engineer> — OpenCode — backend/
🟡 <QA Engineer> — Gemini — test/
🔵 Coordinator — Claude — you
Round 1 starting (all agents in parallel)...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Build a tasks JSON array and call dispatch-parallel.sh:
TASKS='[
{"id":"frontend","task":"Review all components in frontend/. List what exists and what is missing per the spec. If you find incomplete components, fix them."},
{"id":"backend","task":"Audit all API endpoints in backend/. Verify each endpoint exists, has correct response shape, and is wired to the database."},
{"id":"tester","task":"Review test/ and backend/tests/. List missing test cases and add them."}
]'
bash ${CLAUDE_PLUGIN_ROOT}/scripts/dispatch-parallel.sh \
"$SESSION_ID" "$ROUND" "$TASKS"
This fires codex/opencode/copilot/gemini agents simultaneously as background processes. Do not wait for one to finish before starting the next.
For any Claude-powered agents in the team, run them in parallel using the Agent tool at the same time you call dispatch-parallel.sh — don't wait for bash agents first.
After all agents finish:
# Read each agent's result
cat ~/.agent-team/sessions/$SESSION_ID/agents/frontend/results/$ROUND-result.md
cat ~/.agent-team/sessions/$SESSION_ID/agents/backend/results/$ROUND-result.md
cat ~/.agent-team/sessions/$SESSION_ID/agents/tester/results/$ROUND-result.md
The dispatcher auto-parses MESSAGE TO <id>: lines from every agent result.
To verify messages were routed:
ls ~/.agent-team/sessions/$SESSION_ID/agents/*/inbox/
Messages in inboxes will be read by recipients at the start of their next round automatically.
After collecting all results:
Write synthesis:
mkdir -p ~/.agent-team/sessions/$SESSION_ID/coordinator/rounds
cat > ~/.agent-team/sessions/$SESSION_ID/coordinator/rounds/$ROUND-synthesis.md << 'EOF'
# Round N Synthesis
...
EOF
Match work to expertise. Be specific — not "work on the frontend" but:
| Agent role | Assign work related to |
|---|---|
| Frontend Engineer | UI components, pages, CSS, state management, SSE/WebSocket client |
| Backend Engineer | API endpoints, database, business logic, background tasks |
| QA Engineer | Test cases, E2E flows, test data, bug reports |
| DevOps Engineer | Dockerfile, CI/CD, deployment, environment config |
| Emoji | Meaning |
|---|---|
| 🤖 | Team session active |
| 🔴 | Codex agent |
| ⚫ | OpenCode agent |
| 🟢 | Copilot agent |
| 🟡 | Gemini agent |
| 🔵 | Claude agent / coordinator |
| ✅ | Agent round complete |
| ✉ | Inter-agent message routed |
| 🔄 | New round starting |
| 🏁 | Session complete |
check-providers.sh shows alternativesteam.local.json — Local Model OverridesTwo configs sit side-by-side in the project root:
| File | Purpose | Tracked in git? |
|---|---|---|
team.json | Base team definition (committed, shared with the repo) | Yes |
team.local.json | Per-role model overrides (each developer's own choices) | No — gitignored |
How merge works (handled by merge_team_config() in lib/common.sh):
team.local.json are matched to base roles by id.opencode_model: "github-copilot/claude-sonnet-4.5" only overrides
that one field — name, expertise, context_dirs stay from the base).The per-provider model commands (/agent-team:codex-model, /agent-team:opencode-model,
/agent-team:gemini-model) write to team.local.json only — they never touch
team.json. This keeps committed config clean and lets each developer pick their
preferred model without churn.
Non-Claude agents don't have MCP tool access. When they need library docs they ask the coordinator to fetch the material on their behalf.
Pattern an agent emits in its result:
MESSAGE TO coordinator: FETCH DOCS <library-name> <specific-topic>
Example: MESSAGE TO coordinator: FETCH DOCS recharts AreaChart gradient fill
Coordinator responsibility (you):
After collecting round results, scan each agent's output for messages targeted at
coordinator that begin with FETCH DOCS.
For each such request, call the appropriate MCP tool (context7 for library
docs, WebSearch / WebFetch for general queries).
Drop the result into the requesting agent's inbox before the next round so they pick it up:
bash ${CLAUDE_PLUGIN_ROOT}/scripts/send-message.sh \
"$SESSION_ID" "coordinator" "<requesting-agent-id>" "<fetched content>" "$ROUND"
The next round's dispatch automatically reads the inbox at the start of the agent's prompt — no extra action needed beyond writing the message.
This is the pull half of MCP integration. The push half is when you proactively fetch docs you know an agent will need before dispatching them (part of mission-brief writing, see below).
--tmux Flag — Live Multi-Pane Mode/agent-team:start --tmux "<task>" opens a tmux session named
agent-team-<session-id> with one pane per agent. Each non-Claude pane runs
dispatch-agent.sh live so the user can watch every agent work simultaneously.
When to use it:
When NOT to use it (the default):
Implementation:
bash ${CLAUDE_PLUGIN_ROOT}/scripts/launch-tmux-session.sh \
"$SESSION_ID" "$TEAM_CONFIG" "$PWD" "$TASK"
The launcher creates the panes, starts each agent, and spawns a watcher that prompts each pane to close once all agents have dropped their done flag. Claude panes show a placeholder message — Claude agents are dispatched by the coordinator via the native Agent tool, so there's no shell-side process for tmux to host.
Before any dispatch, write each agent a concrete mission brief — not "work on the frontend" but a paragraph that includes:
Project Briefing — the dispatcher injects the first 50 lines of
planning/PLAN.md automatically. You only need to add a paragraph if there's
a project nuance the PLAN head doesn't cover (e.g. "auth was just added in
commit X — read backend/app/auth.py first").
The Mission — one or two sentences naming the concrete deliverable. State
the file or feature, not the area: "Implement /api/portfolio/history in
backend/app/routes/portfolio.py," not "work on the portfolio API."
Acceptance Criteria — what does DONE look like? Be testable: "Endpoint
returns 200 with [{total_value, recorded_at}] ordered ascending."
Files to Read First — list 3-7 specific paths. The dispatcher's
load-context.sh will already surface key files, but pinning specific ones
in the mission brief beats hoping the agent picks them up.
Dependencies — name any teammate whose work this depends on, and tell the agent to message them if blocked.
MCP Push (optional) — if the task needs an external library, fetch the docs yourself with context7 before dispatch and quote the relevant excerpt in the brief. The agent then doesn't have to round-trip through the FETCH DOCS protocol.
This brief becomes the ${TASK} portion of the agent prompt assembled by
dispatch-agent.sh. Everything else (file tree, inbox, MCP protocol,
communication syntax) is added automatically.
npx claudepluginhub usmannoor5/plugins --plugin agent-teamCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.