Skip to content

Add a session Kanban board - #2

Merged
viannaanalyst merged 12 commits into
mainfrom
feat/session-kanban
Sep 15, 2026
Merged

viannaanalyst merged 12 commits into
mainfrom
feat/session-kanban

Conversation

@viannaanalyst

Copy link
Copy Markdown
Owner

What

Adds a session Kanban board: a new full-screen surface where sessions sit in automatic columns and the only manual transition is archive/unarchive.

  • Columns (automatic) — Working (turn in flight) / Needs you (approval or question pending, or a turn that finished while unfocused) / Idle / Archived. Precedence archived → working → needs_you → idle, sorted pinned-first then by recency. Cards carry the reason (Waiting for you / Finished).
  • Scope toggle — current project (default) or all projects; all-projects cards show the project name.
  • Cards — title, harness icon, repo/branch, relative time, pinned mark, working spinner; click opens the session and closes the board; hover exposes archive/unarchive.
  • Drag — drop a card on Archived to archive it, drag it back out to unarchive. 5px threshold, pointer capture only after the threshold (so plain clicks still open), Escape cancels, click suppressed after a drop, data-no-drag targets ignored.
  • Entry points — a "Kanban" rail action directly below Inbox and a View menu item on both the in-app menu and the native macOS menu.

No schema or persistence changes: archiving uses the existing session_set_archived path, and the board is derived state (no polling).

Implementation notes

  • src/lib/sessionBoard.ts — pure classifier over the canonical merged session list plus the existing live signal sets (busySessionIds, approvalSessionIds, unseenFinishedIds); excludes ephemeral inboxAsk sessions and orchestration workers.
  • src/lib/kanbanDrag.ts — pure drop-target helpers (kanbanColumnFromPoint, boardDropOutcome).
  • src/surfaces/KanbanView.tsx — the surface (header, scope toggle, columns, cards, drag gesture).
  • src/App.tsx — surface lifecycle parity with Inbox/Notes: mutual exclusion, keyboard guards, back navigation, hidden/inert workspace, usage-footer suppression. While the board is open the previously active session counts as unfocused, so a turn that finishes then shows up as "Finished" (and its approval/question banner can fire).
  • pt-BR translations for every new string.

Tests

  • Web: npm run check:web — 230 files / 2395 tests passed, tsc --noEmit clean.
  • Rust: npm run check:rust — fmt clean, clippy -D warnings clean, 310 tests passed.
  • New coverage: sessionBoard.test.ts (precedence, needs-you reasons, scope filter, sorting, worker exclusion), kanbanDrag.test.ts (drop matrix, hit test), KanbanView.test.ts (columns, badges, empty hints, all-projects names), ProjectRail.test.ts (rail entry order).

Stacked PR

This branch is based on feat/pr-write-actions (#1). Merge #1 first, or retarget this PR to main after #1 lands.

Pending before merge

  • Manual dev-mode walkthrough on real sessions: watch columns move while an agent works and finishes unfocused, click-to-open, drag archive/unarchive with Escape and post-drag click, all-projects toggle, and archived rows persisting across a restart.

@viannaanalyst viannaanalyst mentioned this pull request Sep 15, 2026
1 task
@viannaanalyst
viannaanalyst changed the base branch from feat/pr-write-actions to main September 15, 2026 02:54
@viannaanalyst
viannaanalyst merged commit 0745e66 into main Sep 15, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant