sdk/examples/plugins/agents-squad/README.md
Spin up background subagents from any Cline SDK agent. Each subagent runs as its own session with its own provider, model, and system prompt — useful for parallel recon, planning, implementation, and review.
import { ClineCore } from "@cline/core";
const cline = await ClineCore.create({ backendMode: "auto" });
await cline.start({
config: {
providerId: "cline",
modelId: "anthropic/claude-sonnet-4.6",
cwd: process.cwd(),
enableTools: true,
systemPrompt: "You are a coding assistant with access to subagents.",
pluginPaths: ["./examples/plugins/agents-squad"],
},
prompt: "Use subagents to investigate and refactor this repo.",
interactive: true,
});
Pass the plugin directory as the path. The loader reads package.json and discovers entry points from the cline.plugins field.
| Tool | Purpose |
|---|---|
start_subagent | Start a subagent in the background and return a session ID immediately. |
message_subagent | Send a follow-up message to a running subagent. |
get_subagent | Poll status, output, or error for a subagent session. |
list_agent_presets | List bundled, global, and project agent presets. |
list_skills / get_skill | Discover and load loadable skill instructions. |
save_handoff / read_handoff | Share text between subagents in the same conversation. |
start_subagent accepts preset and/or instructions. When preset is omitted it defaults to phantom (configurable via CLINE_SUBAGENT_DEFAULT_PRESET).
| Agent | Model | Role |
|---|---|---|
phantom | google/gemini-3-flash-preview | Fast codebase recon — maps structure, surfaces conventions, never implements. |
oracle | anthropic/claude-opus-4.6 | Opinionated planning — challenges assumptions and produces execution-ready plans. |
anvil | anthropic/claude-opus-4.6 | Surgical implementation — reads before writing, stays in scope, reports exact diffs. |
inquisitor | openai/gpt-5.5 | Adversarial review — finds bugs, severity-ranks findings. |
parent → start_subagent(preset: "phantom", task: "Map the auth module")
→ phantom: save_handoff("auth/recon.md", ...)
→ start_subagent(preset: "oracle", task: "Plan refactor from auth/recon.md")
→ oracle: save_handoff("auth/plan.md", ...)
→ start_subagent(preset: "anvil", task: "Execute auth/plan.md")
→ start_subagent(preset: "inquisitor", task: "Review anvil's changes")
Drop a Markdown file with YAML frontmatter into one of these directories. Project overrides global, global overrides bundled (by name).
| Kind | Bundled | Global | Project |
|---|---|---|---|
| Agents | agents/ next to index.ts | ~/.cline/data/settings/agents/ | <cwd>/.cline/agents/ |
| Skills | skills/ next to index.ts | ~/.cline/data/settings/skills/ | <cwd>/.cline/skills/ |
Agent file:
---
name: my-agent
description: One-line description shown in list_agent_presets
providerId: cline
modelId: anthropic/claude-sonnet-4.6
cwd: ./src
maxIterations: 25
---
You are a specialized agent that...
Skill file:
---
name: my-skill
description: What this skill teaches
---
When performing this task, follow these steps...
Skills are reusable instructions any agent can pull in at runtime via get_skill. Bundled skills include code-review, test-generation, refactoring, debugging, api-design, migration, and documentation.
Subagents in the same conversation share a small file store, scoped to the conversation ID:
save_handoff({ path, content }) — writes a fileread_handoff({ path }) — reads it backFiles live under ~/.cline/data/plugins/subagents/handoffs/<conversationId>/. Paths are validated to prevent traversal.
All optional. Environment variables override defaults:
| Variable | Default |
|---|---|
CLINE_SUBAGENT_PROVIDER_ID | cline |
CLINE_SUBAGENT_MODEL_ID | anthropic/claude-sonnet-4.6 |
CLINE_SUBAGENT_DEFAULT_PRESET | phantom |
CLINE_SUBAGENTS_BACKEND_MODE | auto (auto | hub | local) |
CLINE_SUBAGENT_CWD | process.cwd() |
CLINE_DATA_DIR | ~/.cline/data |
Each subagent is a full Cline SDK session created via ClineCore.create(...). start_subagent resolves the preset, merges any overrides, starts a non-interactive session, and returns the session ID immediately. The first turn runs in the background; when it finishes (or fails) the result is stored and — unless notifyParent: false — pushed back to the parent session as a steer message. The parent can also poll with get_subagent.