Put Claude Code and GitHub Copilot in structured debate inside VS Code, so they converge on a root cause before any edit — breaking the single-agent "guess → patch → analyze → repeat" loop on complex codebases.
You invoke @tag-team <problem> in the Copilot Chat panel. The extension acts as a
mediator:
- Proposal round (parallel) — Claude (via the
claude -pCLI, with file/terminal tools) and Copilot (via the VS Code Language Model API) each return a structured proposal: a committed root-cause hypothesis, a proposed change, confidence, and open questions. They cannot hand back a patch without first naming a root cause. - Cross-critique — each model is shown the other's proposal and must refute it with evidence or concede. This is the loop-breaker: it forces engagement with an outside view instead of re-patching its own guess.
- Convergence / checkpoint — when both agree (or after
turnCaprounds) the mediator pauses and shows you the agreed diagnosis. You approve. - Apply — on
/apply, Claude (the only side with autonomous file tools) makes the edit. A design doc is saved to.tagteam/session.md.
| Concern | Choice |
|---|---|
| Role split | Symmetric debate; only Claude edits files |
| UI | Copilot Chat participant (@tag-team) |
| Claude auth | claude -p CLI on your Pro/Max subscription (no API key) |
| Control | Selectable — checkpointed or auto-resolve (see Settings) |
- VS Code ≥ 1.95
- GitHub Copilot installed and signed in (provides the second model)
- Claude Code CLI installed and logged in. Run
claudeonce in a terminal to log in. Ifclaudeis not on the PATH VS Code sees, settagTeam.claudePathto its absolute path (e.g.~/.claude/local/claude).
npm install
npm run package:vsixThen press F5 ("Run Tag-Team Extension") to open an Extension Development Host.
Run the packaging command below to produce the distributable VSIX:
npm run package:vsixThe generated file will be written to the project root as tag-team-llm-<version>.vsix.
| Setting | Default | Purpose |
|---|---|---|
tagTeam.claudePath |
claude |
Path to the Claude CLI |
tagTeam.claudeModel |
(blank) | Optional --model override |
tagTeam.copilotFamily |
gpt-4o |
Copilot model family |
tagTeam.turnCap |
3 |
Max debate rounds before checkpoint |
tagTeam.autoResolve |
false |
When true, Claude applies the change automatically once both models agree on a root cause. If they never agree, you still decide. |
tagTeam.claudeTimeoutMs |
180000 |
Per-turn Claude timeout |
Even if tagTeam.autoResolve is false, you can force auto-resolve for a single debate using the /auto-resolve slash command:
@tag-team /auto-resolve why does the login hang on refresh?
Type @tag-team / in Copilot Chat and the available commands will autocomplete. If the models agree on a root cause, Claude will apply the change immediately. If they never agree (even after turnCap rounds), you'll still get the tie-break prompt.
- The Copilot model is text-only here; it shapes the plan but does not edit files.
- Copilot may not return strict JSON — parsing is tolerant; Claude is schema-enforced.
- Headless Claude turns add latency; keep
turnCaplow for fast iteration.