Use these text colors consistently, from strongest to weakest emphasis:
accentwarning(only for attention/error states)- default/plain text
muteddim
accent- selected row prefix/text
- selected preview title
muted- page title (
Tasks) - global top/bottom borders
- row metadata (status/type)
- page title (
dim- keyboard helper text (primary + secondary)
- footer divider
- select-list scroll info
warning- no-match/search warning text
- default/plain
- non-selected row title and summary body
accent- focused field labels (
Title,Description) - editing status in title area
- save success status (
✓ Saved) - selected-task arrow prefix
- focused field border color
- focused field labels (
muted- page title base (
Tasks) - unfocused field labels
- blurred field borders
- page title base (
dim- keyboard helper lines
- global top/bottom borders
- footer divider
warning- save failure status
- default/plain
- form field content text
- Keep list/show visual hierarchy aligned.
- Keep keyboard helper spacing/padding symmetric across pages.
- Keep selected task identity formatting shared via view-model helpers (avoid duplicate formatting logic).
- Prefer extracting reusable rendering/formatting primitives over repeating inline style logic.
To add a backend adapter, create one file in src/backend/adapters/ with a default export that satisfies TaskAdapterInitializer.
Required shape:
id: stringisApplicable(): boolean(detect if adapter should be used in current workspace)initialize(pi)returning aTaskAdapterwith:statusMap(internal camelCase status -> backend status)taskTypes(toggle order, first is default)priorities(highest-first order, middle is default)- optional
priorityHotkeys(key -> priority, overrides default1..Nrank hotkeys) list,show,update,create
Resolution behavior:
PI_TASKS_BACKENDselects adapter byid- otherwise the first adapter with
isApplicable() === trueis used - if none apply, first loaded adapter is used as fallback
Keep backend-specific field mapping inside adapter files only (e.g. beads issue_type, in_progress, created_at, due_at), and keep app-level types in task-oriented camelCase (taskType, inProgress, createdAt, dueAt).
- stable list layout with aligned task identity/meta and fixed-height description preview
- unified task form architecture for both Edit and Create pages
- create flow that keeps editing context after initial save and updates the same task on subsequent saves
- keyboard-first interaction model with intent-based shortcuts and consistent list/show navigation behavior
- mvc-like architecture: control flow designed for concise, maintainable extension code
- inline header save feedback states with optional status icons
- shared view-model formatting primitives to keep list/show/create rendering in sync
- task serialization and work handoff prompt generation