Repository navigation
Description
Part of #2438 (a follow-up from the Claude Code end-to-end test). Feeds #2443.
Problem
The Squad + Claude Code end-to-end test (BRICKBREAK, from an empty repo) used a prototype team dashboard: a Board, a Roadmap ("who's working when") and a Conversation view of the coordinator and each member subagent. It made the multi-agent behaviour easy to follow, which the terminal does not.
The prototype only works on logs captured by hand: it reads claude -p --output-format stream-json --verbose output saved with tee. Normal interactive users never produce that, so as it stands it can't ship.
The prototype is on branch squad/2443-claude-plugin under prototypes/claude-dashboard/ (server.mjs and index.html; no tests).
What Claude Code already writes
Claude Code keeps every session on disk, interactive or headless, so no capture is needed:
~/.claude/projects/<encoded-cwd>/<session-id>.jsonl: the main (coordinator) transcript. Lines havetype(user,assistant,system,attachment, …),uuid/parentUuid,timestamp,sessionId,cwdandgitBranch. Stop-hook runs show up assystem/stop_hook_summary.<session-id>/subagents/agent-<id>.jsonl: one transcript per subagent run.<session-id>/subagents/agent-<id>.meta.json:agentType(the member, e.g.pinky),description,toolUseId(links back to the coordinator'sAgenttool call),requestShape(backgroundor not), the chosen model andfinished.
These are internal Claude Code files, not a documented API, so the reader must be tolerant: skip unknown line types, and fail visibly (not silently) if the layout changes.
What needs to be done
- A transcript reader that turns a session directory into the same normalized events the prototype uses (
session,dispatch,start,progress,tool,say,hook,end,result), with one lane per member (agentType) plus the coordinator. - Follow the files while they grow (new lines, new subagent files), and stream the updates to the page over SSE, as the prototype does.
- Pick the session: by default the newest session for the current repo (encode the cwd the way Claude Code does); allow
--session <id>; and handle--continueruns, which append to the same session. - Keep the existing stream-json input as a second source, for headless and CI runs (
squad watch --executeuses it). - Map names through the team roster (
.squad/team.md), so members show with their cast names and roles; unknown subagent types fall back to their type (for examplegeneral-purpose). - Bind to
127.0.0.1only, and treat transcript content as untrusted: escape everything rendered, and don't render links or HTML from it. - Tests: unit tests for the reader against a small checked-in fixture session (trimmed and scrubbed: no real paths, tokens or prompts), covering parallel background members, a
--continuesecond turn, a hook event, and an unknown line type. Consider reusing the golden-trace fixture approach from test(backend): run the golden trace live on the claude-agent-sdk harness (#2441) #2452.
Done when
- Running the dashboard in a repo with an active or past Claude Code Squad session shows the team without any extra flags on
claude. - The reader has tests, and the prototype's behaviour (lanes, background shells owned by a member, coordinator comments, light/dark) is kept.
- The page stays local-only and escapes all transcript content.
Activity
github-actions commentedon Nov 10, 2026
📋 Assigned to observability-dev (Observability Engineer)
Issue: #2459 — Claude team dashboard: read live Claude Code sessions instead of captured stream-json
observability-dev will pick this up in the next Copilot session.
fix(claude): address plugin and dashboard Copilot review feedback
fix(dashboard): start over when a transcript is rewritten shorter (#2459