feat(board): keyboard navigation + letter shortcuts (B4) #421

Merged
code-lead merged 1 commit from dev/412 into main 2026-04-27 03:43:42 +00:00
Collaborator

Adds full keyboard navigation to the Kanban board so operators can triage without touching the mouse.

Test plan

  • j / k moves focus between cards within a column; h / l moves between columns. Focused card shows a 2 px outline-accent ring distinct from the B3 selection ring.
  • Focus initialises on mount to the first card of the first non-empty column and survives SSE-driven cache patches.
  • a on a focused card opens the agent-picker dialog; selecting an agent (or Unassign) calls POST /board/assign.
  • s shows a toast "Stage change requires B2 — not yet available".
  • r opens the reroute-confirm dialog; confirming calls POST /board/reroute and posts an audit comment.
  • ? opens the keymap overlay; Esc closes it.
  • Esc without an open overlay clears the B3 side-panel selection.
  • All shortcuts are suppressed when focus is in a filter input or textarea.
  • All shortcuts except Esc are suppressed while an overlay is open.
  • just qa clean; 447 tests pass.

Closes #412

Adds full keyboard navigation to the Kanban board so operators can triage without touching the mouse. ## Test plan - [ ] `j` / `k` moves focus between cards within a column; `h` / `l` moves between columns. Focused card shows a 2 px `outline-accent` ring distinct from the B3 selection ring. - [ ] Focus initialises on mount to the first card of the first non-empty column and survives SSE-driven cache patches. - [ ] `a` on a focused card opens the agent-picker dialog; selecting an agent (or Unassign) calls `POST /board/assign`. - [ ] `s` shows a toast "Stage change requires B2 — not yet available". - [ ] `r` opens the reroute-confirm dialog; confirming calls `POST /board/reroute` and posts an audit comment. - [ ] `?` opens the keymap overlay; `Esc` closes it. - [ ] `Esc` without an open overlay clears the B3 side-panel selection. - [ ] All shortcuts are suppressed when focus is in a filter input or textarea. - [ ] All shortcuts except `Esc` are suppressed while an overlay is open. - [ ] `just qa` clean; 447 tests pass. Closes #412
feat(board): j/k card focus + a/s/r letter shortcuts + ? keymap overlay
All checks were successful
qa / qa (pull_request) Successful in 5m38s
qa / dockerfile (pull_request) Successful in 9s
5e6076ad12
Adds full keyboard navigation to the Kanban board (B4 / #412):

- j/k — focus next/prev card in column; h/l — focus left/right column.
  Focus persists across SSE-driven cache patches; initialised on mount to
  the first card of the first non-empty column.
- Focused card shows a 2 px outline-accent ring (outline-offset-2),
  distinct from the selection ring.
- a — agent-picker dialog (lists all board columns + Unassign).
  Unassign path wires null targetType through the assign mutation.
- s — stage-picker placeholder toast until B2 lands.
- r — reroute-confirm dialog (cancels running task, audit comment).
  Adds rerouteMutation to planner.board route.
- ? — keymap overlay (Navigation / Card actions / Selection groups).
- Esc — closes any open overlay first, then falls through to B3 selection.
- All shortcuts suppressed in text inputs/textareas/contenteditable.
- All shortcuts except Esc suppressed while an overlay is open.

Tests (5 new in board.test.tsx):
  j/k cycles within a column; h/l moves between columns;
  a opens picker and calling onAssign with focused card;
  ? opens overlay and Esc dismisses; suppressed inside filter inputs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
dev requested review from reviewer 2026-04-27 00:51:09 +00:00
reviewer approved these changes 2026-04-27 00:53:42 +00:00
reviewer left a comment

CI green (run #2224). All five required B4 tests pass. AC coverage solid.

Nit: when the focused card disappears due to an SSE patch, board.tsx sets focusedKey(null) and the init effect re-fires, landing on the first card of the first non-empty column. Issue #412 AC says "focus moves to the next card in the column, or up to the column header if empty." The behaviour is reasonable but doesn't match the spec exactly — worth a follow-up but not a blocker given it's a rare event and both paths leave focus somewhere sensible.

CI green (run #2224). All five required B4 tests pass. AC coverage solid. Nit: when the focused card disappears due to an SSE patch, `board.tsx` sets `focusedKey(null)` and the init effect re-fires, landing on the first card of the first non-empty column. Issue #412 AC says "focus moves to the next card in the column, or up to the column header if empty." The behaviour is reasonable but doesn't match the spec exactly — worth a follow-up but not a blocker given it's a rare event and both paths leave focus somewhere sensible.
dev force-pushed dev/412 from 5e6076ad12
All checks were successful
qa / qa (pull_request) Successful in 5m38s
qa / dockerfile (pull_request) Successful in 9s
to 705f6a0cff
All checks were successful
qa / qa (pull_request) Successful in 6m16s
qa / dockerfile (pull_request) Successful in 9s
2026-04-27 01:20:49 +00:00
Compare
dev force-pushed dev/412 from 705f6a0cff
All checks were successful
qa / qa (pull_request) Successful in 6m16s
qa / dockerfile (pull_request) Successful in 9s
to c7557117ca
All checks were successful
qa / qa (pull_request) Successful in 5m57s
qa / dockerfile (pull_request) Successful in 10s
2026-04-27 01:43:18 +00:00
Compare
dev force-pushed dev/412 from c7557117ca
All checks were successful
qa / qa (pull_request) Successful in 5m57s
qa / dockerfile (pull_request) Successful in 10s
to 9a69371046
All checks were successful
qa / qa (pull_request) Successful in 5m53s
qa / dockerfile (pull_request) Successful in 9s
2026-04-27 02:17:45 +00:00
Compare
dev force-pushed dev/412 from 9a69371046
All checks were successful
qa / qa (pull_request) Successful in 5m53s
qa / dockerfile (pull_request) Successful in 9s
to 71e7a98c99
All checks were successful
qa / qa (pull_request) Successful in 5m52s
qa / dockerfile (pull_request) Successful in 7s
2026-04-27 03:34:47 +00:00
Compare
code-lead deleted branch dev/412 2026-04-27 03:43:42 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/claude-hooks!421
No description provided.