Team Management
Team Management
Section titled “Team Management”Create, manage, and shut down agent teams. This skill covers team lifecycle from creation through cleanup.
Experimental: Agent teams are disabled by default. Enable with
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMSin your settings.json or environment.
Related skills:
- Orchestrating - Primitives overview and quick reference
- Task System - Managing work items and dependencies
- Messaging - Communication between agents
- Agent Types - Choosing the right agent for each role
- Spawn Backends - How teammates run (in-process, tmux, iTerm2)
- Error Handling - Troubleshooting and recovery
Core Architecture
Section titled “Core Architecture”A team consists of:
- Leader (you) - Creates team, spawns workers, coordinates work
- Teammates (spawned agents) - Execute tasks, report back
- Task List - Shared work queue with dependencies
- Inboxes - JSON files for inter-agent messaging
File Structure
Section titled “File Structure”~/.claude/teams/{team-name}/├── config.json # Team metadata and member list└── inboxes/ ├── team-lead.json # Leader's inbox ├── worker-1.json # Worker 1's inbox └── worker-2.json # Worker 2's inbox
~/.claude/tasks/{team-name}/├── 1.json # Task #1├── 2.json # Task #2└── 3.json # Task #3Team Config Structure
Section titled “Team Config Structure”{ "name": "my-project", "description": "Working on feature X", "leadAgentId": "team-lead@my-project", "createdAt": 1706000000000, "members": [ { "agentId": "team-lead@my-project", "name": "team-lead", "agentType": "team-lead", "color": "#4A90D9", "joinedAt": 1706000000000, "backendType": "in-process" }, { "agentId": "worker-1@my-project", "name": "worker-1", "agentType": "Explore", "model": "haiku", "prompt": "Analyze the codebase structure...", "color": "#D94A4A", "planModeRequired": false, "joinedAt": 1706000001000, "tmuxPaneId": "in-process", "cwd": "/Users/me/project", "backendType": "in-process" } ]}Two Ways to Spawn Agents
Section titled “Two Ways to Spawn Agents”Method 1: Task Tool (Subagents)
Section titled “Method 1: Task Tool (Subagents)”Use Task for short-lived, focused work that returns a result:
Task({ subagent_type: "Explore", description: "Find auth files", prompt: "Find all authentication-related files in this codebase", model: "haiku" // Optional: haiku, sonnet, opus})Characteristics:
- Runs synchronously (blocks until complete) or async with
run_in_background: true - Returns result directly to you
- No team membership required
- Best for: searches, analysis, focused research
Method 2: Task Tool + team_name + name (Teammates)
Section titled “Method 2: Task Tool + team_name + name (Teammates)”Use Task with team_name and name to spawn persistent teammates:
// First create a teamTeamCreate({ team_name: "my-project", description: "Working on feature X" })
// Then spawn a teammate into that teamTask({ team_name: "my-project", // Required: which team to join name: "security-reviewer", // Required: teammate's name subagent_type: "general-purpose", prompt: "Review all authentication code for vulnerabilities. Send findings to team-lead.", run_in_background: true // Teammates usually run in background})Characteristics:
- Joins team, appears in
config.json - Communicates via inbox messages
- Can claim tasks from shared task list
- Persists until shutdown
- Best for: parallel work, ongoing collaboration, pipeline stages
Key Difference
Section titled “Key Difference”| Aspect | Task (subagent) | Task + team_name + name (teammate) |
|---|---|---|
| Lifespan | Until task complete | Until shutdown requested |
| Communication | Return value | Inbox messages |
| Task access | None | Shared task list |
| Team membership | No | Yes |
| Coordination | One-off | Ongoing |
Creating a Team
Section titled “Creating a Team”TeamCreate
Section titled “TeamCreate”TeamCreate({ team_name: "feature-auth", description: "Implementing OAuth2 authentication"})Creates:
~/.claude/teams/feature-auth/config.json~/.claude/tasks/feature-auth/directory- You become the team leader
Constraint: One team per session. Clean up the current team before starting a new one.
Delegate Mode
Section titled “Delegate Mode”By default, the lead may start implementing tasks itself instead of waiting for teammates. Delegate mode restricts the lead to coordination-only tools: spawning, messaging, shutting down teammates, and managing tasks.
When to use: When you want the lead to focus entirely on orchestration (breaking down work, assigning tasks, synthesizing results) without touching code directly.
How to enable: Start a team first, then press Shift+Tab to cycle into delegate mode.
Permissions Model
Section titled “Permissions Model”- Teammates start with the lead’s permission settings
- If the lead runs with
--dangerously-skip-permissions, all teammates do too - You can change individual teammate modes after spawning
- You cannot set per-teammate modes at spawn time
Environment Variables
Section titled “Environment Variables”Spawned teammates automatically receive these:
CLAUDE_CODE_TEAM_NAME="my-project"CLAUDE_CODE_AGENT_ID="worker-1@my-project"CLAUDE_CODE_AGENT_NAME="worker-1"CLAUDE_CODE_AGENT_TYPE="Explore"CLAUDE_CODE_AGENT_COLOR="#4A90D9"CLAUDE_CODE_PLAN_MODE_REQUIRED="false"CLAUDE_CODE_PARENT_SESSION_ID="session-xyz"Using in prompts:
Task({ team_name: "my-project", name: "worker", subagent_type: "general-purpose", prompt: "Your name is $CLAUDE_CODE_AGENT_NAME. Use it when sending messages."})Plan Approval
Section titled “Plan Approval”For complex or risky tasks, require teammates to plan before implementing:
Task({ team_name: "careful-work", name: "architect", subagent_type: "Plan", prompt: "Design an implementation plan for adding OAuth2 authentication", mode: "plan", // Requires plan approval run_in_background: true})When the teammate finishes planning, they send a plan_approval_request to the lead. The lead reviews and either approves or rejects with feedback. If rejected, the teammate stays in plan mode, revises based on feedback, and resubmits.
See Messaging for plan approval tool syntax.
Graceful Shutdown
Section titled “Graceful Shutdown”Always follow this sequence:
// 1. Request shutdown for all teammatesSendMessage({ type: "shutdown_request", recipient: "worker-1", content: "All tasks complete" })SendMessage({ type: "shutdown_request", recipient: "worker-2", content: "All tasks complete" })
// 2. Wait for shutdown approvals// Teammates respond with: SendMessage({ type: "shutdown_response", request_id: "...", approve: true })
// 3. Only then cleanupTeamDelete()Shutdown behavior: Teammates finish their current request or tool call before shutting down, which can take time.
Crashed teammates: Teammates have a 5-minute heartbeat timeout. If a teammate crashes:
- They are automatically marked as inactive after timeout
- Their tasks remain in the task list
- Another teammate can claim their tasks
- Cleanup will work after timeout expires
Cleanup
Section titled “Cleanup”TeamDelete
Section titled “TeamDelete”TeamDelete()Removes:
~/.claude/teams/{team-name}/directory~/.claude/tasks/{team-name}/directory
IMPORTANT:
- Will fail if teammates are still active. Use shutdown first.
- Always use the lead to clean up. Teammates should not run cleanup because their team context may not resolve correctly.
Discovering Team Members
Section titled “Discovering Team Members”Teammates can read the team config file to discover other team members:
cat ~/.claude/teams/{team-name}/config.jsonThe config contains a members array with each teammate’s:
name- Human-readable name (always use this for messaging and task assignment)agentId- Unique identifier (for reference only)agentType- Role/type of the agent
IMPORTANT: Always refer to teammates by their name (e.g., “team-lead”, “researcher”, “tester”).