Skip to content

Commit 699589d

Browse files
bradygasterclaudeCopilot
authored
feat(claude): Squad Claude Code plugin and team dashboard (#2443, #2459, #2460) (#2463)
* chore(prototype): Claude Code team dashboard from the end-to-end test A prototype of the multi-agent dashboard used in the Squad + Claude Code end-to-end run (BRICKBREAK). server.mjs tails `claude -p --output-format stream-json --verbose` logs, maps each member subagent (and the background shells it owns) to a lane, and streams the timeline over SSE. index.html shows it as a GitHub-style Board, Roadmap ("who's working when") and Conversation view, with light and dark themes. Prototype only: it reads captured stream-json logs, not live sessions, and has no tests. Saved here so the plugin work (#2443) can build on it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(matrix): record the Claude plugin MCP approval measurement (#2443) Claude Code 2.1.318, clean environment: a squad_state server supplied by a plugin connects with no approval prompt and no --mcp-config, interactively and headless, from the repo root and a package subfolder. A project .mcp.json server still prompts interactively (default: continue without); headless -p now connects it without the flag. The plugin's settings.json agent makes squad:squad the main agent with no --agent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(claude): Claude projection v3, plugin mode (#2443) With "claudePlugin": true in .squad/config.json (squad init --client claude --claude-plugin, squad upgrade --[no-]claude-plugin), the Squad Claude Code plugin carries the coordinator, skills, hooks and squad_state MCP server. The projection then writes only per-repository files: member subagents (with the plugin MCP prefix), the CLAUDE.md block, the .gitignore lines and two .claude/settings.json keys: agent "squad:squad" so a plain `claude` starts the plugin coordinator, and squad_state in disabledMcpjsonServers so the project .mcp.json entry is not loaded twice or prompted for. It removes the Squad-owned coordinator, skills and hook handlers and leaves .mcp.json alone. Without plugin mode the output is unchanged apart from the version in the generated note. Plugin hooks take --plugin, defer when the project settings already have Squad handlers, and treat squad:squad as the coordinator. buildClaudePlugin and buildClaudeMarketplace in claude-plugin.ts generate the plugin. Spec: harness adapters §5 (v3), §7.4 (plugin mode), §13 (settings keys). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(claude): Squad Claude Code plugin and marketplace (#2443) plugins/squad/ is generated from the SDK by scripts/build-claude-plugin.mjs (--check reports drift) and listed in .claude-plugin/marketplace.json, so `claude plugin marketplace add github/squad` then `claude plugin install squad@squad` installs it. It bundles the coordinator (squad:squad), the coordinator and template skills, /squad:ralph, /squad:cast, /squad:ceremony and /squad:status, the advisory hooks and the squad_state MCP server, all run through a launcher that finds the project's Squad CLI, one on PATH, or the matching npx version. bin/squad puts squad on the Bash tool's PATH. test/claude-plugin.test.ts rebuilds the plugin from source and requires the committed tree to match. Checked live with --plugin-dir on Claude Code 2.1.318: the coordinator is the main agent, plugin:squad:squad_state connects without an approval prompt, the skills and commands load, the advisory SessionStart hook adds context and a member subagent runs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(dashboard): read Claude Code session transcripts (#2459) Dashboard events from the session JSONL Claude Code writes for every session, plus each subagent transcript and its meta file, following appends (including --continue turns). stream-json logs stay as a second source. Unknown and internal line types are skipped and only counted. Tested against a scrubbed real session: parallel background members, a --continue turn with a foreground member, hook events and an unknown line type. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(dashboard): start a member once when its meta file comes first (#2459) Claude Code can write a subagent's .meta.json before the dispatch line reaches the main transcript. The reader now registers subagents on discovery and starts a lane from the meta file only if no dispatch arrived by the next poll, so each member starts exactly once. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(dashboard): local dashboard server, `squad dashboard` and /squad:dashboard (#2460) Moves the prototype dashboard into the CLI: - dashboard/server.ts serves the page and an SSE event stream on 127.0.0.1 only, rejects other Host headers (DNS rebinding), and sends a CSP with no inline script; transcript text goes out as JSON data and the page escapes it. - dashboard-ui/ is the prototype's page split into index.html, app.css and app.js, with the repo and roster read from /meta. - `squad dashboard [stop | status] [--detach] [--open] [--port] [--session] [--stream]` follows the newest Claude Code session in the directory, reuses a running dashboard, and keeps its state under the Squad home so /squad:dashboard (Claude's Bash has its own TMPDIR) and a terminal find the same instance; it also checks the default ports. - The plugin gains /squad:dashboard, allowed to run only `squad dashboard`, and never passes the user's words to the shell. - prototypes/claude-dashboard is removed. No runtime dependencies beyond Node. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(claude): install the Squad plugin and use the dashboard (#2443, #2460) New features/claude-code-plugin page: marketplace install, init with --claude-plugin, what the plugin provides, and the team dashboard (/squad:dashboard and `squad dashboard`). README, the CLI reference, the multi-client scenario and the spec point to it; changesets for the plugin and the dashboard. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(claude): keep the help budget and the retired-term gate green (#2443, #2460) - The plugin coordinator said "a global Squad CLI", which the retired-symbol gate reads as the retired global squad; it now says "a globally installed Squad CLI". - `--claude-plugin` joins the `--client` help lines and `dashboard` takes one line; the help budget grows by one for the new command. - command-help's documented-subcommand list includes `dashboard`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(changelog): Claude Code as a first-class host (#2438) Unreleased notes for the whole Claude Code track: the Squad plugin and plugin mode, `squad dashboard` and /squad:dashboard, member subagents, native skills and the slimmer coordinator, advisory hooks, the watch runner, and the first real execution harnesses, with their PRs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(changelog): plan the Claude Code notes as the preview.5 headline (#2438) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): spell-check word and CodeQL test-code alerts (#2463) Add Mcpjson (disabledMcpjsonServers) to cspell, escape the session id before building a regex in the fixture scrubber, and make the page test's inline-script check case-insensitive. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(claude): ship the plugin's bin/ launchers (#2443) The repository-wide bin/ ignore (for .NET output) kept plugins/squad/bin/squad and squad.cmd out of git, so a marketplace install, which clones the repo, had no squad command. Un-ignore the plugin's bin/, commit both launchers (squad as 100755), and fail both the plugin test and build --check when a generated file is untracked or ignored. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(claude): commands call the plugin launcher; launcher skips an older CLI (#2443) Commands use "${CLAUDE_PLUGIN_ROOT}/bin/squad" so they always go through the launcher's version check instead of picking up an older global CLI that Claude Code put earlier on PATH. The launcher now also reads BUNDLE-INFO.json and the nested app/node_modules package.json, so Homebrew cask bundles are detected and skipped when they are older than the plugin. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(claude): keep the retired-term gate green in launcher test names (#2443) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(claude): address plugin and dashboard Copilot review feedback Preserve plugin settings and prior MCP ownership; support direct init and watch callers; avoid shell reparsing and launcher recursion; skip disabled hooks; preserve transcript bytes, reset reconnects and reap unused dashboards. Part of #2443, #2459, #2460. Addresses review feedback on #2463. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: c8c234f1-ee3b-49e1-9406-11d4a2238c23 * fix(dashboard): start over when a transcript is rewritten shorter (#2459) JsonlTail restarted at byte zero after a truncation, but the transcript source kept its member runs, so a run that had ended never ended again and the page showed a finished member as in progress. Now any rewind (main or member transcript) drops the source's state and replays every file from the start, and the server clears its history and tells the page to start over. Addresses review feedback on #2463. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(dashboard): one dashboard per directory, even when started twice at once (#2460) Checking for a running dashboard and starting one were separate steps, so two concurrent `squad dashboard` starts both served, and `stop` found only one. A lock file beside the state file, created exclusively, now makes check-and-start one step: a second start waits, then reports the running dashboard; a lock left by a dead process is taken over. A detached start accepts the dashboard that won the race. Addresses review feedback on #2463. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(claude): dashboard runs only its three commands; Ralph's scope is fenced as data (#2443) /squad:dashboard's allowed-tools now lists the three exact invocations (stop, status, --detach --open) instead of `dashboard:*`, and its prompt takes only the first argument word, which selects one of them. /squad:ralph keeps its free-text scope but passes it between markers, as data that can only narrow the work or set a stop condition. Checked live (claude-haiku-5-5): start and status run with no prompt; an argument asking for another command was denied by the permission rules. Addresses review feedback on #2463. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(skills): gh-auth-isolation pushes without a token in the URL The skill showed pushing to a personal repo with the token in the git URL (and once in the remote), which leaks it to shell history, process listings, tool logs and .git/config. The examples now pass the token through GH_TOKEN to gh's credential helper for the one command. Updated in the canonical .squad-templates copy, its mirrors and the Claude plugin. Addresses review feedback on #2463. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(claude): the launcher's npx fallback is opt-in (SQUAD_ALLOW_NPX=1) (#2443) With no suitable Squad CLI, the plugin launcher ran `npx -y @bradygaster/squad-cli@<version>`, so a slash command or hook could download and run code without the user asking. It now fails with install instructions unless SQUAD_ALLOW_NPX=1 is set (in the shell or Claude Code's settings env). The coordinator text, plugin README, docs, changelog and changeset say so. Addresses review feedback on #2463. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(claude): /squad:cast and /squad:ceremony pass their arguments as fenced data (#2443) The cast request and ceremony name now sit between markers, as data the coordinator takes only names, roles, a project description or a ceremony name from, never instructions. Neither command pre-approves any tool, so every Bash call still goes through the user's permission settings; a test keeps $ARGUMENTS fenced in every command and allowed-tools on the dashboard only. Addresses review feedback on #2463. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(claude): /squad:ralph takes only fixed argument words (#2443) The command no longer puts $ARGUMENTS in its prompt. It reads $0 and $1 and matches each exactly against go, status, idle, issues, prs and skip-ci; any other word is ignored and reported. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: c8c234f1-ee3b-49e1-9406-11d4a2238c23
1 parent 675c9e9 commit 699589d

136 files changed

Lines changed: 13649 additions & 160 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.changeset/claude-code-plugin.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
"@bradygaster/squad-sdk": minor
3+
"@bradygaster/squad-cli": minor
4+
---
5+
6+
Squad ships as a Claude Code plugin (`claude plugin marketplace add github/squad`, then `claude plugin install squad@squad`). The plugin carries the coordinator, the `squad_state` MCP server (no `.mcp.json` approval or `--mcp-config`), skills, advisory hooks and the `/squad:ralph`, `/squad:cast`, `/squad:ceremony`, `/squad:status` and `/squad:dashboard` commands. `squad init --client claude --claude-plugin` (or `upgrade`) records `claudePlugin` in `.squad/config.json` and then writes only the member subagents, the `CLAUDE.md` block and the `agent` and `disabledMcpjsonServers` settings.
7+
8+
Preserve user settings and former project MCP ownership across plugin-mode transitions, support plugin-mode watch sessions and direct init callers, skip disabled plugin hooks before CLI startup, and safely forward launcher and mesh-sync arguments. Dashboard tails preserve split UTF-8 characters, reconnects reset replayed state, and unused servers shut down after five minutes. The launcher's `npx` fallback is opt-in (`SQUAD_ALLOW_NPX=1`); without it, a missing CLI fails with install instructions. Starting a dashboard is serialized per directory, and a transcript rewritten shorter starts the page over.

‎.changeset/claude-dashboard.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@bradygaster/squad-cli": minor
3+
---
4+
5+
New `squad dashboard` (and `/squad:dashboard` in the Claude Code plugin): a live local page of the coordinator and each member at work, read from the Claude Code session transcripts for the directory (or `--stream` stream-json logs). It listens on 127.0.0.1 only, rejects other Host headers, sends a CSP with no inline script, and runs one instance per directory (`stop`, `status`, `--detach`, `--open`, `--session`, `--port`). No dependencies beyond Node.js.

‎.claude-plugin/marketplace.json‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"name": "squad",
3+
"owner": {
4+
"name": "Brady Gaster",
5+
"url": "https://github.com/bradygaster"
6+
},
7+
"metadata": {
8+
"description": "The Squad plugin for Claude Code."
9+
},
10+
"plugins": [
11+
{
12+
"name": "squad",
13+
"source": "./plugins/squad",
14+
"description": "Squad for Claude Code: a coordinator that routes work to a team of specialist subagents, with shared team state in the squad_state MCP server.",
15+
"version": "2.0.0-preview.4",
16+
"homepage": "https://github.com/github/squad",
17+
"license": "MIT"
18+
}
19+
]
20+
}

‎.copilot/skills/distributed-mesh/sync-mesh.sh‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,18 @@ for squad in $(jq -r '.squads | to_entries[] | select(.value.zone == "remote-opa
9191
auth=$(jq -r ".squads.\"$squad\".auth // \"\"" "$MESH_JSON")
9292

9393
mkdir -p "$target"
94-
auth_flag=""
94+
curl_args=(--silent --fail)
95+
header=""
9596
if [ "$auth" = "bearer" ]; then
9697
token_var="$(echo "${squad}" | tr '[:lower:]-' '[:upper:]_')_TOKEN"
97-
[ -n "${!token_var:-}" ] && auth_flag="--header \"Authorization: Bearer ${!token_var}\""
98+
token=$(printenv "$token_var" || true)
99+
if [ -n "$token" ]; then
100+
curl_args+=(--header @-)
101+
header="Authorization: Bearer $token"
102+
fi
98103
fi
99104

100-
eval curl --silent --fail $auth_flag "$source" -o "$target/SUMMARY.md" 2>/dev/null \
105+
printf '%s\n' "$header" | curl "${curl_args[@]}" --url "$source" -o "$target/SUMMARY.md" 2>/dev/null \
101106
|| echo "# ${squad} — unavailable ($(date))" > "$target/SUMMARY.md"
102107
done
103108

‎.gitattributes‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,9 @@ Dockerfile.* text eol=lf
6262

6363
# Charter conformance binds exact document bytes across platform checkouts.
6464
docs/specification/charter-v0.1.md text eol=lf
65-
scripts/release/manifest.schema.json text eol=lf
65+
scripts/release/manifest.schema.json text eol=lf
66+
# Squad: the Claude Code plugin is generated by scripts/build-claude-plugin.mjs and
67+
# checked byte-for-byte by test/claude-plugin.test.ts; bin/squad has a shebang and
68+
# no extension. Pin LF so Windows checkouts neither break it nor drift (#2443).
69+
plugins/** text eol=lf
70+
.claude-plugin/** text eol=lf

‎.gitignore‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ docs/tests/screenshots/
4242

4343
# .NET build output
4444
bin/
45+
# ...but the Claude plugin's launchers ship in the repo (marketplace installs clone it)
46+
!plugins/squad/bin/
4547
obj/
4648
artifacts/
4749

‎.squad-templates/skills/distributed-mesh/sync-mesh.sh‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,18 @@ for squad in $(jq -r '.squads | to_entries[] | select(.value.zone == "remote-opa
9191
auth=$(jq -r ".squads.\"$squad\".auth // \"\"" "$MESH_JSON")
9292

9393
mkdir -p "$target"
94-
auth_flag=""
94+
curl_args=(--silent --fail)
95+
header=""
9596
if [ "$auth" = "bearer" ]; then
9697
token_var="$(echo "${squad}" | tr '[:lower:]-' '[:upper:]_')_TOKEN"
97-
[ -n "${!token_var:-}" ] && auth_flag="--header \"Authorization: Bearer ${!token_var}\""
98+
token=$(printenv "$token_var" || true)
99+
if [ -n "$token" ]; then
100+
curl_args+=(--header @-)
101+
header="Authorization: Bearer $token"
102+
fi
98103
fi
99104

100-
eval curl --silent --fail $auth_flag "$source" -o "$target/SUMMARY.md" 2>/dev/null \
105+
printf '%s\n' "$header" | curl "${curl_args[@]}" --url "$source" -o "$target/SUMMARY.md" 2>/dev/null \
101106
|| echo "# ${squad} — unavailable ($(date))" > "$target/SUMMARY.md"
102107
done
103108

‎.squad-templates/skills/gh-auth-isolation/SKILL.md‎

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,14 @@ gh auth token --user corpalias_enterprise
5050
The most common scenario: your shell defaults to the EMU account, but you need to push to a personal GitHub repo.
5151

5252
```bash
53-
# 1. Extract the personal token
54-
$token = gh auth token --user personaluser
55-
56-
# 2. Push using token-authenticated HTTPS
57-
git push https://personaluser:$token@github.com/personaluser/repo.git branch-name
53+
# Push as the personal account for this one command: gh's credential helper hands git the
54+
# token from GH_TOKEN, so it never appears in a URL, a remote or the command line
55+
GH_TOKEN="$(gh auth token --user personaluser)" \
56+
git -c credential.helper= -c 'credential.helper=!gh auth git-credential' \
57+
push https://github.com/personaluser/repo.git branch-name
5858
```
5959

60-
**Why this works:** `gh auth token --user` reads from `gh`'s credential store without switching the active account. The token is used inline for a single operation and never persisted.
60+
**Why this works:** `gh auth token --user` reads from `gh`'s credential store without switching the active account. The token lives only in that one command's environment: `credential.helper=` clears the stored (EMU) helper for this command, and `gh auth git-credential` answers git's credential request with `GH_TOKEN`. Never put a token in a git URL: it shows up in shell history, process listings, tool logs and `.git/config`.
6161

6262
### Create PRs on Personal Forks
6363

@@ -128,12 +128,9 @@ alias ghe='gh'
128128
# Agent needs to push to personaluser.github.io (personal repo)
129129
# Default gh auth is corpalias_enterprise (EMU)
130130
131-
$token = gh auth token --user personaluser
132-
git remote set-url origin https://personaluser:$token@github.com/personaluser/personaluser.github.io.git
133-
git push origin main
134-
135-
# Clean up — don't leave token in remote URL
136-
git remote set-url origin https://github.com/personaluser/personaluser.github.io.git
131+
$env:GH_TOKEN = gh auth token --user personaluser
132+
git -c credential.helper= -c 'credential.helper=!gh auth git-credential' push origin main
133+
Remove-Item Env:GH_TOKEN # the token never touches the remote URL
137134
```
138135

139136
### ✓ Correct: Agent creates a PR from personal fork to upstream
@@ -167,9 +164,10 @@ git push https://personaluser:ghp_xxxxxxxxxxxx@github.com/personaluser/repo.git
167164
```bash
168165
# Always verify which account has access before operations
169166
gh auth status
170-
# If wrong account, use token extraction:
171-
$token = gh auth token --user personaluser
172-
git push https://personaluser:$token@github.com/personaluser/repo.git main
167+
# If wrong account, hand git the personal token for this one push:
168+
GH_TOKEN="$(gh auth token --user personaluser)" \
169+
git -c credential.helper= -c 'credential.helper=!gh auth git-credential' \
170+
push https://github.com/personaluser/repo.git main
173171
```
174172

175173
## Anti-Patterns

‎CHANGELOG.md‎

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,62 @@ All notable changes to this project will be documented in this file.
1010
- `squad upgrade --self --dry-run` reports the planned upgrade without installing it. `squad upgrade --state-backend orphan --dry-run` also avoids backend migration, source deletion, config changes and hook installation (#2303, #2295). Available in `v2.0.0-preview.2` and later previews, not stable `v1.1.0`.
1111
- `squad memory` and `memory.*` share the backend-aware governed store (#2317, #2316), so CLI writes and MCP searches use the same storage. Available in `v2.0.0-preview.3` and later previews, not stable `v1.1.0`. Transactional existing-memory backend migration (#2425, #2439) is available in `v2.0.0-preview.4`.
1212

13+
### Claude Code as a first-class host (#2438)
14+
15+
Planned as the headline of `v2.0.0-preview.5`.
16+
17+
Claude Code is the first host after GitHub Copilot where Squad uses the host's own features (subagents, hooks, skills, plugins and the Claude Agent SDK) instead of the shared minimum. Every addition goes through the host projection contract in `squad-client-harness-adapters/v0.2` (§4–§5, §13) and the charter extension rules, and the same `.squad/` team still drives Copilot and the other hosts unchanged. It also ships the SDK's first real `HarnessAdapter`, which makes Claude the non-Copilot host that the two v0.2 profiles (harness-adapters §15.1, backend-decoupling §14.4) need before they can be promoted. Promoting them is still pending.
18+
19+
#### Added
20+
21+
- **Squad plugin for Claude Code** (#2443, #2463). Install it with `claude plugin marketplace add github/squad`, then `claude plugin install squad@squad --scope project`. The plugin is generated from the SDK (`plugins/squad/`, by `scripts/build-claude-plugin.mjs`, with a `--check` gate in tests) and published through `.claude-plugin/marketplace.json`. It carries:
22+
- the coordinator, as the `squad:squad` agent
23+
- the `squad_state` MCP server. It needs no `.mcp.json` approval and no `--mcp-config`, including in headless `claude -p` runs; a recorded measurement in the host feature matrix backs this.
24+
- the coordinator's on-demand skills and Squad's template skills, as `/squad:<skill>`
25+
- the slash commands `/squad:ralph`, `/squad:cast`, `/squad:ceremony`, `/squad:status` and `/squad:dashboard`
26+
- the advisory governance hooks
27+
- a launcher that the slash commands, hooks and MCP server call by path, also on the Bash tool's PATH as `squad`. It runs, in order, `SQUAD_CLI`, the project's `@bradygaster/squad-cli` or a `squad` on PATH, and skips a project or PATH install older than the plugin. With none, it fails with install instructions. It runs the plugin's pinned version through `npx` only when `SQUAD_ALLOW_NPX=1` is set, because that downloads and runs code.
28+
- **Plugin mode for the Claude projection** (#2443, #2463). `squad init --client claude --claude-plugin` (or `squad upgrade --claude-plugin`) records `"claudePlugin": true` in `.squad/config.json`. Squad then writes only the per-repository files: the member subagents, the `CLAUDE.md` block, and two keys in `.claude/settings.json`:
29+
- `agent`, so a plain `claude` starts the coordinator
30+
- `disabledMcpjsonServers`, so the project's `.mcp.json` copy of `squad_state` neither prompts nor duplicates the plugin's tools
31+
32+
`--no-claude-plugin` switches back to the full projection. The Claude projection is now version 3 (`CLAUDE_PROJECTION_VERSION`).
33+
- **`squad dashboard` and `/squad:dashboard`** (#2459, #2460, #2463). A live local page shows the coordinator and every member at work: who was dispatched and why, which members run in the background and in parallel, each member's tool calls, summaries and results, hook events, and each prompt of a `--continue` session.
34+
- **What it reads.** The Claude Code session transcripts for the current directory, including each member's own subagent transcript. It reads them incrementally, follows the newest session and moves to a new one when it starts. `--session <id>` pins one, and `--stream <file>` reads `claude -p --output-format stream-json` logs instead. Unknown transcript line types are skipped and their content is never shown.
35+
- **Local only.** It listens on `127.0.0.1` only (from port 4280; `--port` picks one) and rejects any other `Host` header, which protects against DNS rebinding. It sends a Content Security Policy that allows no inline script and no other origin, and transcript text is always rendered as text, never markup.
36+
- **One per directory.** `stop`, `status`, `--detach`, `--open` and `--json` manage it, and running it again shows the instance already running. Its state lives in `~/.squad/dashboards/` (or under `SQUAD_HOME`), so `/squad:dashboard` inside Claude Code and `squad dashboard` in a terminal find the same instance.
37+
- **Safe from the plugin.** `/squad:dashboard` may run only `squad dashboard`, and never passes your words to the shell.
38+
- **No new dependencies.** It needs only Node.js. It replaces the prototype that was used during the end-to-end test.
39+
- **Member subagents** (#2450). Each team member, built-ins included, is projected from its charter as its own subagent in `.claude/agents/<member>.md`.
40+
- Model, reasoning effort and the new `X-squad-host-claude` charter extension (`Tools`, `Isolation`) map onto the subagent's frontmatter.
41+
- The coordinator routes to named members and selects a model per spawn through Claude Code's `Agent` tool, using `run_in_background` and `isolation: "worktree"`.
42+
- `squad cast` refreshes member files, and the files of removed members are deleted.
43+
- A user-authored file at a member path is never overwritten; it is reported as `skipped`.
44+
- **Native skills and a smaller coordinator** (#2450). Squad's template skills are projected into `.claude/skills/`, except where a team skill of the same name exists. Init Mode, Ralph mode, ceremonies, GitHub Issues mode and PRD mode now load on demand from generated `squad-coordinator-*` skills instead of sitting in the always-loaded prompt.
45+
- **Advisory governance hooks** (#2450). They're opt-in, with `"claudeHooks": "advisory"`. They:
46+
- give the coordinator session context
47+
- warn a locked-out member who edits work under review
48+
- add a handoff summary after each member finishes
49+
- remind the coordinator to run Scribe
50+
51+
They never block a tool call. New commands: `squad lockout` records reviewer lockouts in `.squad/governance/lockouts.json`, and `squad hook claude <Event>` runs the hooks.
52+
- **Claude Code runner for `squad watch --execute`** (#2450). `--agent-preset claude` (or `watch.agentPreset: "claude"`) runs each round as `claude -p … --agent squad --output-format stream-json`.
53+
- It uses a private, `squad_state`-only MCP config, never the repository's `.mcp.json`.
54+
- It checks for the coordinator and the `claude` CLI before starting, and treats an error result as a failed round.
55+
- `watch.claudeFlags` is limited to model, permission-mode, effort and turn-limit flags.
56+
- **First real execution harnesses** (#2441, #2451), experimental, in `@bradygaster/squad-sdk/backend`:
57+
- `ClaudeAgentSdkHarness` runs conversation turns on the Claude Agent SDK. Broker approvals go through `canUseTool`: each is bound to a hash, they arrive one at a time, and a deny ends the turn. `@anthropic-ai/claude-agent-sdk` is an optional peer dependency.
58+
- `CopilotSdkHarness` does the same on `@github/copilot-sdk`.
59+
- Both share an approval queue and a turn lifecycle, and their state survives restarts. Approval records hold a redacted summary, never the tool input.
60+
- `squad state-mcp --experimental-backend` registers the Claude harness only when its SDK is installed. `SQUAD_BACKEND_HARNESSES` selects the harnesses or turns them off.
61+
- New docs: [Squad for Claude Code (plugin)](docs/src/content/docs/features/claude-code-plugin.md). The README, CLI reference, multi-client scenario and adapter spec link to it.
62+
63+
#### Changed
64+
65+
- The Claude coordinator names Claude Code's `Agent` subagent tool (formerly `Task`). The Claude Code spec, docs and host feature matrix now match the code, and host-projection regression guards keep them that way (#2440, #2445).
66+
- Every generated Claude Markdown file states its projection version. Files from earlier projections are still recognised as Squad's and upgraded in place, and rolling back the `CLAUDE.md`, `AGENTS.md` and `GEMINI.md` blocks restores the original bytes exactly (#2450).
67+
- Copilot output, `.github/agents/squad.agent.md` and the projections for other hosts are unchanged.
68+
1369
## [2.0.0-preview.4] - 2026-11-09
1470

1571
Fourth Squad 2.0 preview. This release completes the repository migration to `github/squad` across published npm and NuGet package metadata, runtime links, templates, documentation, and `gh-aw` workflow package identity, adds transactional governed-memory backend migration with source-branch casting ownership, and includes memory lock coordination and Copilot SDK runtime compatibility fixes. npm continues to use `insider` as the canonical dist-tag with `preview` as a compatibility alias; `latest` remains on 1.1.0.

‎README.md‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,17 @@ squad init --client claude,opencode # or: --client all
134134
squad upgrade --client codex # add a host later; refreshes every configured host
135135
```
136136

137-
Each host gets a native coordinator file plus MCP wiring; your own settings in `.mcp.json`, `opencode.json` and the like are never clobbered. See [Using Squad across clients](docs/src/content/docs/scenarios/using-squad-across-clients.md), [Squad 2.0 architecture](docs/src/content/docs/concepts/squad-2-0-architecture.md), and the [multi-client quickstart](docs/tutorials/multi-client-quickstart.md).
137+
Each host gets a native coordinator file plus MCP wiring; your own settings in `.mcp.json`, `opencode.json` and the like are never clobbered.
138+
139+
In Claude Code, Squad also installs as a plugin that carries the coordinator, `squad_state`, skills, hooks and slash commands, including `/squad:dashboard`, a live local page of the team at work (also `squad dashboard`):
140+
141+
```bash
142+
claude plugin marketplace add github/squad
143+
claude plugin install squad@squad --scope project
144+
squad init --client claude --claude-plugin
145+
```
146+
147+
See [Squad for Claude Code (plugin)](docs/src/content/docs/features/claude-code-plugin.md). See [Using Squad across clients](docs/src/content/docs/scenarios/using-squad-across-clients.md), [Squad 2.0 architecture](docs/src/content/docs/concepts/squad-2-0-architecture.md), and the [multi-client quickstart](docs/tutorials/multi-client-quickstart.md).
138148

139149
---
140150

@@ -193,6 +203,7 @@ Say **"squad commands"** in chat to see a categorized menu of common operations
193203
| `squad upstream add\|remove\|list\|sync` | Manage upstream Squad sources |
194204
| `squad nap` | Context hygiene — compress, prune, archive; use `--deep` for aggressive compression, `--dry-run` to preview changes |
195205
| `squad aspire` | Open Aspire dashboard for observability |
206+
| `squad dashboard` | Live local page of the team's Claude Code sessions on 127.0.0.1; `stop`, `status`, `--detach`, `--open`, `--session <id>`, `--stream <file>` |
196207
| `squad scrub-emails [directory]` | Remove email addresses from Squad state files (default: `.squad/`) |
197208

198209
---

0 commit comments

Comments
 (0)