Multi-Board Architecture

BoardsScreen grid, board switching, and how each board scopes its own task pool via db_path

BoardsScreen board grid + New Board useBoards() · GET /api/hermes-kanban/boards ACTIVE Engineering db_path: kanban-engineering.db Todo 4 Run 2 Done 8 click → BoardDrawer Research db_path: kanban-research.db Todo 1 Done 3 click → BoardDrawer Ops db_path: kanban-ops.db Block 1 Done 5 click → BoardDrawer + create board NewBoardDialog BoardDrawer Overview Edit name · description · color picker · per-column task counts Switch to board Delete Archive Edit tab → inline name/description/color · PATCH /api/hermes-kanban/boards/:slug NewBoardDialog name · description · color · POST /api/hermes-kanban/boards response: { board: BoardMeta, current: slug } new board auto-becomes active Active Board current slug in context fetchSwitchBoard(slug) POST …/switch Hermes gateway kanban plugin · :9119 sets current board slug db_path routing kanban-engineering.db ← current kanban-research.db kanban-ops.db each board = isolated SQLite task pool · no cross-contamination Scoped task views Board view (TasksScreen) Swim view (SwimView) Timeline view re-scope API Endpoints GET /api/hermes-kanban/boards ?include_archived=true · KanbanBoardsListResponse POST /api/hermes-kanban/boards CreateBoardInput → { board: BoardMeta, current } POST /api/hermes-kanban/boards/:slug/switch → { current: slug } · sets active board PATCH /api/hermes-kanban/boards/:slug UpdateBoardInput → { board: BoardMeta } DELETE /api/hermes-kanban/boards/:slug ?delete=true (hard) or soft archive BoardMeta shape slug: string name: string description?: string color?: string db_path: string ← per-board SQLite TanStack Query hooks useBoards(includeArchived?) useCreateBoard() · useMutation useUpdateBoard() · useDeleteBoard() onSuccess → queryClient.invalidateQueries boardsKeys.list(…) re-fetches grid Hermes Switch UI · Multi-Board Architecture · /api/hermes-kanban/boards/*

BoardsScreen

  • · Grid of BoardCard components
  • · Active board visually distinguished with ACTIVE badge
  • · Click card → BoardDrawer slide-in panel
  • · + New Board → NewBoardDialog
  • · Archived boards hidden by default (toggle to show)

Board switching

  • · POST …/:slug/switch → { current: slug }
  • · Gateway updates active board context
  • · All task views re-scope to new board's db_path
  • · Each board is an isolated SQLite file
  • · No cross-contamination between boards

BoardDrawer

  • · Overview tab: name, description, color, task counts
  • · Switch to board / Delete / Archive actions
  • · Edit tab: inline PATCH form
  • · Task breakdown per column shown in Overview

BoardMeta + db_path

  • · Each BoardMeta carries its own db_path string
  • · Kanban plugin routes task queries to that file
  • · useBoards() fetches via TanStack Query
  • · Mutations invalidate boardsKeys.list cache