Repository navigation
Description
This was generated by AI during triage.
Summary
A kanban board per project that shows what each agent in it is doing. A project is a session group, or every session sharing a repo, worktrees included. Columns are states, cards are agents, and each card says what that agent is working on now. The question it answers is "where does each part of this project stand?", which a terminal grid can't answer once a project has four or more agents.
How this differs from the related issues
| Issue | What it gives | What's missing for this |
|---|---|---|
| #57 Workspace Overview | one card per session, tiled, with last output lines | flat across all sessions, no grouping by state, no "current task" |
| #154 activity indicator + timeline | a Working state per session, plus history of when |
it's the data source this board needs, not a board |
| #132 / #125 MCP fleet + chat | agents can read the fleet and talk to each other | a human-facing view of the same thing |
| #138 Team Bus | agents push their own title/colour/status | a natural source for the card's "doing now" line |
This view could be built on #57's card component, or replace #57 outright (#57 would become this board with grouping turned off). That's for the maintainer to decide.
Proposed behaviour
v1: columns are agent states, cards are agents
| Column | Driven by |
|---|---|
| Working | #154's Working state |
| Needs approval | IsWaitingForApproval (exists) |
| Needs input | IsWaitingForInput (exists) |
| Idle | none of the above for N minutes |
| Asleep | dormant sessions, collapsed by default |
Each card shows:
- accent stripe, name, branch and dirty marker (all existing);
- doing now: one line, taking the best source available:
- a status the agent pushed itself (Team Bus Team Bus: let an agent add/edit its own session's run commands, not just title/color/status #138 / OSC 9001
title); - for Claude sessions, the
in_progressitem of the agent's current todo list, read from the session transcript under~/.claude/projects/(ClaudeSessionServicealready locates it to find the--resumeid); - otherwise the last non-blank output line;
- a status the agent pushed itself (Team Bus Team Bus: let an agent add/edit its own session's run commands, not just title/color/status #138 / OSC 9001
- time in the current column ("waiting 12 min"). Combined with the Needs columns, this is the thing that makes the board useful: it shows who has been blocked on you the longest.
Interactions:
- clicking a card focuses that session;
- right-clicking a card opens the same menu as the sidebar row;
- no dragging between columns: the column is observed state, not something the user sets.
Scope selector: a group (reusing SessionGroup), a repo (RepoRoot, which merges worktrees of one repo), or All.
v2: columns are tasks
Gather every agent's todo list into To do / In progress / Done, with each card tagged by the agent that owns it. This is the board people usually mean by "kanban", but it depends entirely on reading todo lists (Claude only, unless other harnesses publish theirs via #132), so it comes second.
Constraints
- It can't be drawn over the terminal grid. WebView2 is an
HwndHost(CLAUDE.md, "Session Spinners"). The board must either collapseTerminalGridwhile it's shown, asShutdownOverlayand Add Workspace Overview view: status cards with activity + output preview #57 do, or open as its own window. A separate window has a real advantage here: it can sit on a second monitor and stay live. - The UI thread is a hot path (see the issue perf: coalesce per-session PTY output dispatcher posts to prevent UI starvation #70 history and PR fix(perf): take three blocking paths off the UI thread and the thread pool #160). State changes must update cards in place, never rebuild the board, and transcript reads must be throttled and run off the UI thread.
- Transcript parsing reads an undocumented Claude Code file format. Treat it as best-effort: a parse failure falls back to source 3, never to an error.
Open decisions
- Separate window or a grid-replacing view? This also decides Add Workspace Overview view: status cards with activity + output preview #57's fate.
- Is the transcript todo list an acceptable dependency, or should v1 rely only on what agents push themselves (Team Bus: let an agent add/edit its own session's run commands, not just title/color/status #138) plus output?
- Which default scope: the active session's group, or its repo?
Depends on #154 (Working state). Related: #57, #132, #125, #138, #151.
Activity
AThraen commentedon Nov 10, 2026
Update: the data exists now (#190), and Herdr's board answers open decision 1
It no longer depends on #154. #190 shipped OSC 7501, so each session already exposes:
AgentState(Idle / Working / Blocked / Done / Error);IsWorkingandWorkProgress;Message.Sessions that report nothing fall back to
IsWaitingForInput/IsWaitingForApproval.Prior art: Herdr's
boardlayoutHerdr's board layout is Apache-2.0 and about 100 lines of JS. It is driven by the same OSC 7501 status:
Its layout is a third option we didn't list: the board docked above the live terminal grid. In CSM that is a fixed-height WPF row above
TerminalGrid. The board never overlaps a WebView2, so there is no airspace problem and nothing needs collapsing. You keep the overview and the workspace on screen at the same time. I'd recommend this over a separate window or a view that replaces the grid. It also resolves #57: the board becomes the overview.Revised v1
Blocked(orange stripe for permission),Error(red), heuristic waitingIsWorking, with aWorkProgress% on the cardDone, until acknowledgedMessagecomes first. The todo list read from the transcript (source 2 above) is now only for sessions that don't report.AgentStatechanges. Unlike Herdr's, it can survive a restart if persisted.FocusSession, so the grid below shows that session. Ctrl+Tab can follow board order.PropertyChanged, and the board is never rebuilt. See the UI-thread rules from perf: coalesce per-session PTY output dispatcher posts to prevent UI starvation #70 and fix(perf): take three blocking paths off the UI thread and the thread pool #160.Gaps