savepoint 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/.claude/settings.local.json +4 -1
  2. package/.savepoint/Design.md +22 -17
  3. package/.savepoint/audit/v1/E01/proposals.md +168 -0
  4. package/.savepoint/audit/v1/E01/snapshot.md +78 -0
  5. package/.savepoint/audit/{E01-go-setup → v1/E01-go-setup}/proposals.md +7 -7
  6. package/.savepoint/audit/{E01-go-setup → v1/E01-go-setup}/snapshot.md +2 -2
  7. package/.savepoint/audit/{E01-scaffolding → v1/E01-scaffolding}/proposals/AGENTS.md +5 -5
  8. package/.savepoint/audit/{E02-data-readers → v1/E02-data-readers}/proposals.md +20 -20
  9. package/.savepoint/audit/{E02-data-readers → v1/E02-data-readers}/snapshot.md +1 -1
  10. package/.savepoint/audit/{E03-board-tui-core → v1/E03-board-tui-core}/proposals.md +11 -11
  11. package/.savepoint/audit/{E03-board-tui-core → v1/E03-board-tui-core}/snapshot.md +1 -1
  12. package/.savepoint/audit/{E04-board-components → v1/E04-board-components}/proposals.md +14 -14
  13. package/.savepoint/audit/{E04-board-components → v1/E04-board-components}/snapshot.md +1 -1
  14. package/.savepoint/audit/{E05-init-command → v1/E05-init-command}/snapshot.md +1 -1
  15. package/.savepoint/audit/{E05-phase-transitions → v1/E05-phase-transitions}/proposals.md +4 -4
  16. package/.savepoint/audit/{E05-phase-transitions → v1/E05-phase-transitions}/snapshot.md +1 -1
  17. package/.savepoint/audit/{E06-atari-noir-layout → v1/E06-atari-noir-layout}/proposals.md +2 -2
  18. package/.savepoint/audit/{E07-audit-pipeline → v1/E07-audit-pipeline}/snapshot.md +6 -6
  19. package/.savepoint/audit/v1.1/E02-cross-platform-compatibility/proposals.md +114 -0
  20. package/.savepoint/audit/v1.1/E02-cross-platform-compatibility/snapshot.md +41 -0
  21. package/.savepoint/audit/v1.1/E04-epic-navigation/proposals.md +156 -0
  22. package/.savepoint/audit/v1.1/E04-epic-navigation/snapshot.md +48 -0
  23. package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T001-init-module.md +1 -1
  24. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T005-layout.md +1 -1
  25. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T002-card.md +1 -1
  26. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T006-help-overlay.md +1 -1
  27. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/{Design.md → E06-Detail.md} +5 -3
  28. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T002-header-and-dividers.md +1 -1
  29. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T003-footer-status-bar.md +1 -1
  30. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T004-component-refinement.md +1 -1
  31. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T010-auto-refresh-watcher.md +2 -0
  32. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/{Design.md → E01-Detail.md} +9 -1
  33. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/{T007-next-activity-header.md → T001-next-activity-header.md} +13 -12
  34. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T002-rename-epic-design-files.md +9 -9
  35. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T003-rename-release-prd.md +2 -2
  36. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T004-update-instruction-files.md +13 -12
  37. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T005-update-cross-references.md +14 -13
  38. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T006-column-and-detail-scrolling.md +25 -15
  39. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T007-column-focus-border-stability.md +57 -0
  40. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/{Design.md → E02-Detail.md} +12 -3
  41. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T001-fix-makefile.md +11 -8
  42. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T002-linux-build-target.md +12 -7
  43. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T003-macos-build-target.md +9 -5
  44. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T004-smoke-tests-and-artifacts.md +30 -9
  45. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md +32 -0
  46. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T001-border-resize-fix.md +40 -0
  47. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T002-next-activity-below-header.md +64 -0
  48. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T003-checkbox-rendering-fix.md +56 -0
  49. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T005-unify-status-glyphs.md +65 -0
  50. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T006-forced-256-color-profile.md +36 -0
  51. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Detail.md +51 -0
  52. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T001-sidebar-focusable-navigation.md +65 -0
  53. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T002-epic-detail-overlay.md +73 -0
  54. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T003-epic-status-glyphs.md +73 -0
  55. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Detail.md +45 -0
  56. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T001-update-agents-md.md +34 -0
  57. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T002-update-router-md.md +30 -0
  58. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T003-update-design-md.md +33 -0
  59. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T004-implement-m-hotkey.md +88 -0
  60. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T005-update-help-overlay.md +30 -0
  61. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T006-tests-and-quality-gates.md +46 -0
  62. package/.savepoint/releases/v1.1/v1.1-PRD.md +79 -0
  63. package/.savepoint/router.md +33 -105
  64. package/AGENTS.md +56 -113
  65. package/Makefile +19 -3
  66. package/README.md +6 -5
  67. package/agent-skills/savepoint-audit/SKILL.md +6 -6
  68. package/agent-skills/savepoint-build-task/SKILL.md +2 -2
  69. package/agent-skills/savepoint-create-plan/SKILL.md +3 -3
  70. package/agent-skills/savepoint-create-task/SKILL.md +2 -2
  71. package/agent-skills/savepoint-draft-prd/SKILL.md +1 -1
  72. package/agent-skills/savepoint-system-design/SKILL.md +1 -1
  73. package/internal/board/board.go +43 -27
  74. package/internal/board/board_test.go +71 -0
  75. package/internal/board/card.go +34 -3
  76. package/internal/board/card_test.go +105 -12
  77. package/internal/board/column.go +40 -5
  78. package/internal/board/column_test.go +60 -13
  79. package/internal/board/detail.go +107 -25
  80. package/internal/board/detail_test.go +117 -26
  81. package/internal/board/epic_panel.go +105 -8
  82. package/internal/board/epic_panel_test.go +343 -5
  83. package/internal/board/layout.go +12 -2
  84. package/internal/board/layout_test.go +17 -0
  85. package/internal/board/model.go +141 -24
  86. package/internal/board/render_policy_test.go +77 -0
  87. package/internal/board/status.go +23 -0
  88. package/internal/board/update.go +276 -8
  89. package/internal/board/update_test.go +166 -0
  90. package/internal/board/view.go +131 -17
  91. package/internal/board/view_test.go +159 -1
  92. package/internal/board/watch.go +24 -6
  93. package/internal/buildtool/main.go +219 -0
  94. package/internal/data/parser.go +8 -0
  95. package/internal/data/parser_test.go +35 -0
  96. package/internal/data/task.go +10 -0
  97. package/internal/styles/palette.go +3 -3
  98. package/internal/styles/styles.go +39 -12
  99. package/main.go +9 -0
  100. package/package.json +1 -1
  101. package/savepoint +0 -0
  102. package/savepoint.exe +0 -0
  103. package/templates/project/.savepoint/router.md +6 -5
  104. package/templates/project/AGENTS.md +47 -101
  105. package/templates/prompts/audit-reconciliation.prompt.md +6 -6
  106. package/templates/prompts/epic-design.prompt.md +3 -3
  107. package/templates/prompts/task-breakdown.prompt.md +1 -1
  108. package/templates/prompts/task-building.prompt.md +1 -1
  109. package/templates/prompts/task-planning.prompt.md +1 -1
  110. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T001-border-resize-fix.md +0 -36
  111. package/main.exe +0 -0
  112. /package/.savepoint/audit/{E01-scaffolding → v1/E01-scaffolding}/proposals/Design.md +0 -0
  113. /package/.savepoint/audit/{E01-scaffolding → v1/E01-scaffolding}/proposals/epic-Design.md +0 -0
  114. /package/.savepoint/audit/{E01-scaffolding → v1/E01-scaffolding}/proposals/quality-review.md +0 -0
  115. /package/.savepoint/audit/{E01-scaffolding → v1/E01-scaffolding}/snapshot.md +0 -0
  116. /package/.savepoint/audit/{E02-data-model → v1/E02-data-model}/snapshot.md +0 -0
  117. /package/.savepoint/audit/{E03-cli-foundation → v1/E03-cli-foundation}/snapshot.md +0 -0
  118. /package/.savepoint/audit/{E04-templates-and-prompts → v1/E04-templates-and-prompts}/snapshot.md +0 -0
  119. /package/.savepoint/audit/{E06-atari-noir-layout → v1/E06-atari-noir-layout}/snapshot.md +0 -0
  120. /package/.savepoint/audit/{E06-tui-board → v1/E06-tui-board}/snapshot.md +0 -0
  121. /package/.savepoint/audit/{E08-board-workflow-cleanup → v1/E08-board-workflow-cleanup}/snapshot.md +0 -0
  122. /package/.savepoint/releases/v1/epics/E01-go-setup/{Design.md → E01-Detail.md} +0 -0
  123. /package/.savepoint/releases/v1/epics/E02-data-readers/{Design.md → E02-Detail.md} +0 -0
  124. /package/.savepoint/releases/v1/epics/E03-board-tui-core/{Design.md → E03-Detail.md} +0 -0
  125. /package/.savepoint/releases/v1/epics/E04-board-components/{Design.md → E04-Detail.md} +0 -0
  126. /package/.savepoint/releases/v1/epics/E05-phase-transitions/{Design.md → E05-Detail.md} +0 -0
  127. /package/.savepoint/releases/v1/{PRD.md → v1-PRD.md} +0 -0
@@ -0,0 +1,88 @@
1
+ ---
2
+ id: E05-tasking-permissions/T004-implement-m-hotkey
3
+ status: done
4
+ objective: "Implement TUI `m` hotkey that explicitly sets the router's task from the currently focused task"
5
+ depends_on: ["E05-tasking-permissions/T002-update-router-md", "E05-tasking-permissions/T005-add-help-entry"]
6
+ ---
7
+
8
+ # T004: Implement TUI `m` hotkey
9
+
10
+ ## Acceptance Criteria
11
+
12
+ - Pressing `m` in the TUI board (when no overlay is open) reads the currently focused task and updates `router.md` with:
13
+ - `release`: from focused task
14
+ - `epic`: from focused task
15
+ - `task`: full task ID
16
+ - `state`: `task-building` (or `audit-pending` if last uncompleted task in epic)
17
+ - Pressing `m` when no task is focused does nothing
18
+ - Pressing `m` when focused on a `done` task does nothing (or shows status message)
19
+ - Router `task` field in `writeRouterReleaseEpic` is now set explicitly (currently it writes release+epic only)
20
+ - The `m` key does NOT work when any overlay is open (consistent with other board keys)
21
+ - The `m` key displays a status message confirming the router update: "Router set to {release} {epic}/{task}" or "Audit pending for {epic}" if last task
22
+
23
+ ## Implementation Plan
24
+
25
+ - [x] Add `writeRouterTask(task data.Task)` method to `model.go`: reads current router, sets release/epic/task/state fields, writes via `data.WriteRouterState`
26
+ - [x] Add `m` key handler in `update.go` main switch (before epic panel routing, like `q`/`e`/`r`/`?`)
27
+ - [x] Handler: calls `focusedTask()` to get current task, calls `m.writeRouterTask()`, sets `m.StatusMessage` on success/error
28
+ - [x] Detect "last uncompleted task in epic" logic: scan `m.AllTasks` for the same epic, check if any are not done
29
+ - [x] Update `writeRouterReleaseEpic()` is unchanged (still only writes release+epic, used by navigation)
30
+ - [x] Run `make build && make test` to verify
31
+
32
+ ## Strategic Visual Rework Plan
33
+
34
+ This task is reopened because the `m` hotkey work exposed router-priority and board rendering paths where terminal color fallback behavior still makes the TUI look patchy between black and gray. Do not continue with incremental one-widget fixes. Apply one bottom-up rendering policy.
35
+
36
+ - [x] Force Lipgloss to a deterministic 256-color profile before board rendering starts.
37
+ - [x] Change black 256-color fallbacks for Background, Surface, and Surface 2 to the same actual ANSI256 black value.
38
+ - [x] Centralize the background policy in `internal/styles/styles.go`: TUI surfaces emit no explicit background escapes; terminal default background remains the single source of truth.
39
+ - [x] Remove or avoid explicit background fills from nested panels/cards where they create padded gray bars.
40
+ - [x] Normalize focus borders across task columns, task cards, overlays, and epic sidebar. Prefer single-line box borders if rounded borders continue rendering as dash bars in Warp.
41
+ - [x] Add regression tests that fail if rendered board/card/router-priority output emits explicit background escapes.
42
+ - [x] Verify representative board states in both Windows Terminal and Warp after code tests pass.
43
+
44
+ ## Context Log
45
+
46
+ Files read:
47
+ - .savepoint/router.md
48
+ - .savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Detail.md
49
+ - .savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T004-implement-m-hotkey.md
50
+ - internal/board/model.go
51
+ - internal/board/update.go
52
+ - internal/board/update_test.go
53
+ - internal/board/board.go
54
+ - internal/board/view.go
55
+ - internal/board/column_test.go
56
+ - internal/board/view_test.go
57
+ - internal/board/render_policy_test.go
58
+ - internal/styles/palette.go
59
+ - internal/styles/styles.go
60
+ - internal/data/router.go
61
+ - internal/data/write.go
62
+
63
+ Estimated input tokens: 12000
64
+
65
+ Notes:
66
+ - Focused task comes from `m.Tasks[m.FocusedColumn][m.FocusedTask]`
67
+ - Router state derivation: if all other tasks in the same epic+release are `done`, set `state: audit-pending` and clear `task`; otherwise `state: task-building` with the task ID
68
+ - Focused test: `go test ./internal/board` passed
69
+ - Quality gate: `make build` could not run because `make` is unavailable in this shell
70
+ - Quality gate equivalent: `go run ./internal/buildtool build` passed
71
+ - Quality gate equivalent: `go test ./...` passed
72
+ - Strategic color rework: `lipgloss.SetColorProfile(termenv.ANSI256)` is set before board rendering.
73
+ - Strategic color rework: Background, Surface, and Surface 2 ANSI256 fallbacks now all use `16`.
74
+ - Strategic color rework: nested task/card/panel text no longer paints gray background fills; root-level full-width lines also avoid explicit background escapes.
75
+ - Strategic border rework: rounded borders replaced with single-line borders to avoid Warp dash-bar artifacts.
76
+ - Regression scan: no `RoundedBorder`, rounded border glyphs, or ANSI256 gray background fallback codes (`232`/`233`) remain under `internal/`.
77
+ - Remaining manual check: visually compare representative board states in Windows Terminal and Warp.
78
+ - Follow-up color consistency pass: removed explicit background painting from `Divider`, `HeaderFrame`, `BoardFrame`, and `RootLine`; this avoids mixing terminal-default cells with `48;5;16` cells after nested style resets.
79
+ - Regression tightened: `internal/board/render_policy_test.go` now fails on any `48;` background escape or basic black `40m` escape across board, card, detail, release/epic dropdown, and help render paths.
80
+ - Focused test: `go test ./internal/board` passed after the no-background policy change.
81
+ - Quality gate: `make build` still cannot run because `make` is unavailable in this shell.
82
+ - Quality gate equivalent: `go run ./internal/buildtool build` passed after the no-background policy change.
83
+ - Quality gate equivalent: `go test ./...` passed after the no-background policy change.
84
+ - Manual verification: user confirmed closeout after the PowerShell/Warp color consistency pass.
85
+ - Closeout focused test: `go test ./internal/board` passed.
86
+ - Closeout quality gate: `make build` failed because `make` is unavailable in this shell.
87
+ - Closeout quality gate equivalent: `go run ./internal/buildtool build` passed.
88
+ - Closeout quality gate equivalent: `go test ./...` passed.
@@ -0,0 +1,30 @@
1
+ ---
2
+ id: E05-tasking-permissions/T005-update-help-overlay
3
+ status: planned
4
+ objective: "Add `m` key binding to the TUI help overlay"
5
+ depends_on: ["E05-tasking-permissions/T004-implement-m-hotkey"]
6
+ ---
7
+
8
+ # T005: Update Help Overlay
9
+
10
+ ## Acceptance Criteria
11
+
12
+ - Help overlay (`?` key) shows `m` key binding: "m: update router"
13
+ - Key binding appears with consistent styling in the shortcuts list
14
+ - No other help entries modified
15
+
16
+ ## Implementation Plan
17
+
18
+ - [ ] Add `helpRow("m", "update router")` to `RenderHelp` in `help.go`
19
+ - [ ] Run `make build && make test` to verify
20
+
21
+ ## Context Log
22
+
23
+ Files read:
24
+ - .savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Detail.md
25
+ - .savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T005-update-help-overlay.md
26
+ - internal/board/help.go
27
+
28
+ Estimated input tokens: 2000
29
+
30
+ Notes:
@@ -0,0 +1,46 @@
1
+ ---
2
+ id: E05-tasking-permissions/T006-tests-and-quality-gates
3
+ status: planned
4
+ objective: "Write unit tests for the `m` hotkey router update logic and verify quality gates pass"
5
+ depends_on: ["E05-tasking-permissions/T004-implement-m-hotkey", "E05-tasking-permissions/T005-update-help-overlay"]
6
+ ---
7
+
8
+ # T006: Tests & Quality Gates
9
+
10
+ ## Acceptance Criteria
11
+
12
+ - Unit tests for `writeRouterTask()` covering:
13
+ - Focused task → router updated with release/epic/task/state
14
+ - Last uncompleted task → router shows `audit-pending`
15
+ - Focused `done` task → no-op
16
+ - Unit test for `m` key handler in update_test.go:
17
+ - Pressing `m` updates the model's StatusMessage
18
+ - Unit test for help overlay:
19
+ - `RenderHelp` output contains `m: update router`
20
+ - `go build -o savepoint main.go` passes
21
+ - `go test ./...` passes
22
+
23
+ ## Implementation Plan
24
+
25
+ - [ ] Add `writeRouterTask_test.go` (or add to model_test.go) for router state derivation
26
+ - [ ] Add `m` key test to update_test.go
27
+ - [ ] Add help overlay test to help_test.go (if none exists, add basic test)
28
+ - [ ] Run `go build -o savepoint main.go`
29
+ - [ ] Run `go test ./...`
30
+ - [ ] Fix any failures
31
+
32
+ ## Context Log
33
+
34
+ Files read:
35
+ - .savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Detail.md
36
+ - .savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T006-tests-and-quality-gates.md
37
+ - internal/board/model.go
38
+ - internal/board/update.go
39
+ - internal/board/help.go
40
+ - internal/board/update_test.go
41
+ - internal/board/model_test.go
42
+ - internal/board/help_test.go
43
+
44
+ Estimated input tokens: 4000
45
+
46
+ Notes:
@@ -0,0 +1,79 @@
1
+ ---
2
+ version: 1.1
3
+ name: "Board Polish & Navigation"
4
+ status: in_progress
5
+ ---
6
+
7
+ # Release v1.1 — Board Polish & Navigation
8
+
9
+ ## Overview
10
+
11
+ v1.1 is the "love what you look at" release. It takes the functional board from v1 and makes it polished, reliable, and pleasant to navigate. The four epics cover layout robustness, multi-platform tooling, visual refinement, and a new epic navigation paradigm.
12
+
13
+ **v1 delivered:** a working Kanban board with phase transitions.
14
+ **v1.1 delivers:** a board that doesn't flicker on resize, builds everywhere, looks intentional, and treats epics as first-class navigable objects.
15
+
16
+ ## What ships in v1.1
17
+
18
+ 1. **TUI Optimisation (E01)** ✅ *Audited and complete*
19
+ - Next Activity indicator in header
20
+ - Naming conventions reconciled (Design.md → E##-Detail.md, PRD.md → v1-PRD.md)
21
+ - Virtual viewport scrolling for columns and detail overlay
22
+ - Column focus border stability — no content shift when switching columns
23
+ - All 7 tasks done
24
+
25
+ 2. **Cross-Platform Compatibility (E02)** — *Not started*
26
+ - `make build`, `test`, `clean` work on Windows, Linux, macOS
27
+ - Linux amd64 + arm64 and macOS amd64 + arm64 build targets
28
+ - Smoke tests and versioned release artifacts
29
+ - 4 tasks planned
30
+
31
+ 3. **UI Visual Refinement (E03)** — *Not started*
32
+ - Right-border clipping fixed on terminal resize
33
+ - Next Activity as a dedicated line below header with phase-aligned styling
34
+ - Checkbox rendering at sentence boundaries
35
+ - Width arithmetic audit — content fills available space exactly
36
+ - 4 tasks planned
37
+
38
+ 4. **Epic Navigation (E04)** — *Not started*
39
+ - Epic sidebar becomes a focusable, navigable component
40
+ - ↑/↓ to navigate epics, ←/→ to enter/exit sidebar
41
+ - Enter opens an "Epic Detail" overlay showing E##-Detail.md content
42
+ - Existing `E` key dropdown retained
43
+ - 2 tasks planned
44
+
45
+ 5. **Tasking Permissions & Router Updates (E05)** — *Not started*
46
+ - Agents can only set `status: in_progress`; user alone sets `done` or retreats
47
+ - New TUI `m` hotkey explicitly updates router to the focused task
48
+ - Router update decoupled from navigation — browse without side effects
49
+ - Last task in epic detected → router shows `audit-pending`
50
+ - 6 tasks planned
51
+
52
+ ## Epic breakdown
53
+
54
+ | # | Epic | Status | Tasks |
55
+ |---|------|--------|-------|
56
+ | 01 | TUI Optimisation | Audited | 7/7 done |
57
+ | 02 | Cross-Platform Compatibility | Planned | 0/4 done |
58
+ | 03 | UI Visual Refinement | Planned | 0/4 done |
59
+ | 04 | Epic Navigation | Designing | 0/2 done |
60
+ | 05 | Tasking Permissions & Router Updates | Planned | 0/6 done |
61
+
62
+ ## Success criteria
63
+
64
+ - `make build` and `make test` pass on Windows, Linux, and macOS
65
+ - Terminal resize at any width ≥ 40 produces no visual corruption
66
+ - Content fills the available terminal width exactly at every breakpoint
67
+ - Epic sidebar is navigable with ↑/↓, and Enter shows a detail overlay
68
+ - All existing v1 functionality is preserved unchanged
69
+ - `go build ./...` and `go test ./...` pass
70
+
71
+ ## Known issues
72
+
73
+ - E03 has `Design.md` instead of the expected `E03-Detail.md` — rename to match convention (tracked in E01/T002 scope, may need a follow-up task)
74
+
75
+ ## Risks
76
+
77
+ - **Build tooling scope creep.** E02 is pure Makefile work, but smoke-testing on non-Windows requires either CI or manual verification on actual Linux/macOS.
78
+ - **Naming convention holdout.** E03's `Design.md` may cause discovery or rendering issues if the board ever reads `E##-Detail.md` by pattern. Low priority — handled as a rename task if needed.
79
+ - **Epic panel is ≥120 only.** E04's features require a wide terminal — users on narrow terminals still use the `E` key dropdown.
@@ -1,136 +1,64 @@
1
1
  # Agent State Machine
2
2
 
3
- This file routes the agent based on the project's current state. Read this whenever you start a session.
3
+ ## Read order
4
4
 
5
- ## Read order on every session
5
+ 1. This file (router.md)
6
+ 2. Current state → next action
7
+ 3. Active epic E##-Detail.md
8
+ 4. Active task file
6
9
 
7
- 1. This file (you are here)
8
- 2. The current state below to know what to do next
9
- 3. The active epic Design
10
- 4. The active task file, when a task is selected
11
-
12
- Read `.savepoint/PRD.md` only for project vision changes. Read `.savepoint/Design.md` only for architecture changes or audit closeout. Read `.savepoint/releases/v1/PRD.md` only for release planning or epic-order questions.
13
-
14
- **Conditional read (token discipline):** if your active task touches **TUI rendering, theme, or visual design**, also read `.savepoint/visual-identity.md` after Design.md. Otherwise skip it — it's ~1.8K tokens you don't need.
10
+ Read `.savepoint/PRD.md` only for vision changes. Read `.savepoint/Design.md` only for architecture/audit.
15
11
 
16
12
  ## Current state
17
13
 
18
14
  ```yaml
19
15
  state: task-building
20
16
  release: v1.1
21
- epic: E01-tui-optimisation
22
- task: E01-tui-optimisation/T001-border-resize-fix
23
- next_action: Build v1.1 E01 T001 border resize fix.
17
+ epic: E05-tasking-permissions
18
+ task: E05-tasking-permissions/T005-update-help-overlay
19
+ next_action: Build E05-tasking-permissions/T005-update-help-overlay.
24
20
  ```
25
21
 
26
- ## State → next action
27
-
28
- <!-- AGENT: Read the state above. Find the matching block below. Follow it. -->
29
-
30
- ### `state: pre-implementation`
31
-
32
- The project has its PRD and Design locked but no epics defined yet.
33
-
34
- **Next action:**
35
-
36
- 1. Read `.savepoint/releases/v1/PRD.md` — the v1 release scope (epic list lives there).
37
- 2. Help the user define the epics list and confirm priority.
38
- 3. For each epic in order, create the directory `.savepoint/releases/v1/epics/E##-{epic-name}/` with a `Design.md` stub.
39
- 4. When epic E01 (scaffolding) is created, transition to `state: epic-design` for that epic.
40
-
41
- **Do not** start writing code. We are still in planning.
42
-
43
- ### `state: epic-design`
44
-
45
- An epic exists but its `Design.md` is empty or a stub.
46
-
47
- **Next action:** Walk the user through filling out the epic's `Design.md`:
48
-
49
- - What is this epic adding to the system?
50
- - What components / files does it touch?
51
- - What's the architectural delta vs the current state?
52
-
53
- When complete, transition to `state: epic-task-breakdown` for this epic.
54
-
55
- ### `state: epic-task-breakdown`
22
+ ## State → action
56
23
 
57
- Epic Design exists but tasks are missing or not fully planned.
24
+ ### pre-implementation
58
25
 
59
- **Next action:**
26
+ PRD + Design locked, no epics yet.
60
27
 
61
- 1. Re-read the epic Design.
62
- 2. Create or update the full epic task list — each task **independently buildable**, **objective-led**, with declared `depends_on`.
63
- 3. Each task file lives at `.savepoint/releases/v1/epics/{E##-epic}/tasks/TNNN-slug.md` with frontmatter:
64
- ```yaml
65
- ---
66
- id: {E##-epic}/TNNN-slug
67
- status: planned
68
- objective: "<one sentence>"
69
- depends_on: []
70
- ---
71
- ```
72
- 4. In the same pass, write each task's `## Implementation Plan` as inline `- [ ]` checkboxes.
73
- 5. When every task is planned, transition to `state: task-building` for the first unblocked task.
28
+ **Next:** 1) Read release PRD for epic list, 2) Define + confirm epic order, 3) Create epic stubs. Transition to `epic-design` for E01.
74
29
 
75
- ### `state: task-planning`
30
+ ### epic-design
76
31
 
77
- Reserved for repair or late-added tasks. Normal epic planning happens during `state: epic-task-breakdown`.
32
+ Epic E##-Detail.md is empty/stub.
78
33
 
79
- **Next action:** Read the task's `objective`. Write the implementation plan as inline `- [ ]` checkboxes under a `## Implementation Plan` heading. Set `status: planned`. Stop.
34
+ **Next:** Define what this epic adds, files it touches, and architectural delta. Then transition to `epic-task-breakdown`.
80
35
 
81
- ### `state: task-building`
36
+ ### epic-task-breakdown
82
37
 
83
- Task is `in_progress`. All `depends_on` are `done`.
38
+ Epic exists, tasks missing.
84
39
 
85
- **Next action:** Execute the plan. Tick checkboxes as you complete them. Edit code per the **Code Style** rules in `AGENTS.md`. When all checkboxes tick, set `status: review` and stop.
40
+ **Next:** 1) Re-read epic, 2) Create task files at `tasks/TNNN-slug.md` with `status: planned`, `objective`, `depends_on`, 3) Add `## Implementation Plan` checkboxes per task. When all planned first unblocked task.
86
41
 
87
- ### `state: audit-pending`
42
+ ### task-planning
88
43
 
89
- The last task in an epic is `done`. Audit must run before the next epic starts.
44
+ Reserved for repair/late tasks.
90
45
 
91
- **Next action:** Confirm `.savepoint/audit/{E##-epic}/snapshot.md` exists. If it is missing while the audit CLI is still unavailable, create one manual snapshot from the known epic scope once; do not search broadly for replacement inputs. Then read the snapshot, read the epic's `Design.md`, and read only the files listed as changed. Write one patch-shaped proposal bundle to `.savepoint/audit/{E##-epic}/proposals.md`:
46
+ **Next:** Write implementation plan, set `status: planned`, stop.
92
47
 
93
- - `Design.md` section — merge only the epic delta into project architecture.
94
- - `AGENTS.md` section — refresh Codebase Map entries from changed-module metadata; preserve existing rows.
95
- - `epic-Design.md` section — add "implemented as:" notes and deltas from the original plan.
96
- - `Quality Review` section — semantic-review findings against the 10 Code Style rules (advisory only).
97
-
98
- Prefer delta-only edits (`Insert After`, `Replace`, `Delete`) anchored to exact text. Do not quote and replace entire large sections unless the whole section genuinely changed.
99
-
100
- Proposal format:
101
-
102
- ```md
103
- ## Target File
104
-
105
- `path/to/file.md`
106
-
107
- ## Replace
108
-
109
- <exact old heading, marker, or section>
110
-
111
- ## With
112
-
113
- <new content>
114
- ```
115
-
116
- Quality review section format:
117
-
118
- ```md
119
- ## Must Fix Before Close
120
-
121
- ## Carry Forward
122
-
123
- ## Already Fixed
124
- ```
48
+ ### task-building
125
49
 
126
- After proposals are approved, apply approved proposals to live files, mark the epic `Design.md` as `status: audited`, update project `Design.md` `last_audited`, refresh `AGENTS.md` Codebase Map, and advance this router to the next epic state.
50
+ Task `in_progress`, depends satisfied.
127
51
 
128
- Stop. The user reviews proposals in the TUI before commit actions.
52
+ **Next:** Execute plan, tick checkboxes, run quality gates, set `status: done`, update router to next task or `audit-pending`. Stop.
129
53
 
130
- ## Capability check
54
+ ### audit-pending
131
55
 
132
- If you are not Claude Opus / Gemini 2.5 Pro / GPT-5.5 / equivalent, surface a warning to the user:
56
+ Epic complete, needs audit before next epic.
133
57
 
134
- > _"Heads up I'm running on a lighter model. Savepoint's planning steps work best with top-tier models because the embedded prompts are detailed. I'll do my best, but consider switching the model for PRD/Design/Task-breakdown steps."_
58
+ **Next:** Read snapshot + epic E##-Detail.md + changed files. Write proposals to `.savepoint/audit/{release}/{E##-epic}/proposals.md`:
59
+ - Design.md delta
60
+ - AGENTS.md Codebase Map refresh
61
+ - Epic detail "implemented as" notes
62
+ - Quality review against Code Style rules
135
63
 
136
- Then proceed.
64
+ After user approves: apply proposals, mark epic `status: audited`, update Design.md `last_audited`, advance router.
package/AGENTS.md CHANGED
@@ -1,141 +1,84 @@
1
1
  # Agents Guide
2
2
 
3
- Welcome, AI agent. This project (`savepoint`) uses its own conventions to manage its own build. You are about to dogfood the workflow.
4
-
5
3
  ## Workflow
6
4
 
7
- Before doing anything, read `.savepoint/router.md`. That file routes you to the next file based on the project's current state.
8
-
9
- **Available Custom Skills:**
10
- Savepoint ships with skills that define your role at each stage.
11
- - `draft-prd`: Acts as a strict Product Manager to interrogate the user and write the PRD.
12
- - `system-design`: Acts as a Staff Engineer mapping the architecture.
13
- - `create-plan` / `create-task`: Acts as a Technical PM breaking work into Epics and ACs.
14
- - `build-task`: Acts as the disciplined execution engine writing code and logging drift.
15
- - `audit`: Acts as the QA Lead reconciling code with documentation.
16
-
17
- **Skill Activation (CRITICAL):**
18
- When you read `.savepoint/router.md`, you MUST activate the corresponding agent skill for the current state before taking any action. Use the `activate_skill` tool (or equivalent) for the appropriate phase:
19
- - `state: draft-prd` -> Activate the `draft-prd` skill.
20
- - `state: design` -> Activate the `system-design` skill.
21
- - `state: planning` -> Activate the `create-plan` skill.
22
- - `state: task-breakdown` -> Activate the `create-task` skill.
23
- - `state: in-progress` -> Activate the `build-task` skill.
24
- - `state: audit-pending` -> Activate the `audit` skill.
25
-
26
- When you are about to write code, you must first read, in order:
27
-
28
- 1. `.savepoint/router.md` — current state and next action
29
- 2. The active epic Design: `.savepoint/releases/v1/epics/{E##-epic}/Design.md`
30
- 3. The active task file: `.savepoint/releases/v1/epics/{E##-epic}/tasks/{T###}-*.md`
31
- 4. Directly touched source/test files
32
-
33
- Read `.savepoint/PRD.md` only for project vision changes, major scope questions, or when the router explicitly asks for it.
34
- Read `.savepoint/Design.md` only when the task changes architecture or audit state. Read `.savepoint/releases/v1/PRD.md` only when planning epics, changing release scope, or resolving epic order.
35
-
36
- **Conditional read:** if the active task touches TUI implementation, also read `agent-skills/ink-tui-design/SKILL.md` as the execution guide. If it touches TUI rendering, theme, or visual design, also read `.savepoint/visual-identity.md` as the visual guardrails. Otherwise skip the extra files — they are tokens you do not need.
37
-
38
- **Do not load files outside the current task scope** unless the task requires it. Token discipline is the wedge of this product; we honor it on ourselves.
39
-
40
- Planning and implementation are separate handoffs:
41
-
42
- - Epic task breakdown and detailed task planning happen together in one pass by one planning agent.
43
- - Each task file must be independently buildable, objective-led, include explicit `depends_on` IDs, contain `## Acceptance Criteria` (observable outcomes) before `## Implementation Plan` (build checklist), and include a `## Context Log` for files read, estimated input tokens, and notes.
44
- - Implementation happens one task at a time and may be handed to any agent. Clear context between tasks by default; rehydrate only from the router, active epic Design, active task file, and directly touched source/test files.
45
- - During implementation, run focused tests for the touched behavior first; reserve the full quality-gate suite for task closeout.
5
+ 1. Read `.savepoint/router.md` state + next action
6
+ 2. Activate skill per table below
7
+ 3. Read: router → epic → task → source files
46
8
 
47
- - After all tasks in an epic are `done`, hand the epic back for audit.
48
- - Any explicit audit request overrides the normal handoff timing for that epic. Persist the audit to `.savepoint/audit/{E##-epic}/snapshot.md` and `.savepoint/audit/{E##-epic}/proposals.md` before replying; do not stop at chat-only findings.
9
+ ## Skill Activation
49
10
 
50
- ## Task Status Canon
11
+ | State | Skill |
12
+ |-------|-------|
13
+ | pre-implementation | savepoint-draft-prd |
14
+ | epic-design | savepoint-system-design |
15
+ | epic-task-breakdown | savepoint-create-task |
16
+ | task-building | savepoint-build-task |
17
+ | audit-pending | savepoint-audit |
51
18
 
52
- Task frontmatter `status` must be exactly one of `planned`, `in_progress`, or `done`.
19
+ Use `skill` tool.
53
20
 
54
- Active task phase is represented separately with `phase: build`, `phase: test`, or `phase: audit`, and `phase` is only valid when `status: in_progress`.
21
+ Read `.savepoint/PRD.md` only for vision changes, `.savepoint/Design.md` only for architecture/audit.
55
22
 
56
- Never write `todo`, `doing`, `blocked`, `review`, `audit`, or phase names into `status`. If a task is blocked, keep its canonical status and document the blocker in the body.
23
+ ## Task Status
57
24
 
58
- ## Task Completion Protocol
25
+ - `status`: only `planned`, `in_progress`, or `done`
26
+ - `phase` (build/test/audit): only when `status: in_progress`
27
+ - Never: todo, doing, blocked, review, audit
59
28
 
60
- When a task reaches `status: done`, you MUST:
29
+ ## Implementation
61
30
 
62
- 1. Verify every `## Acceptance Criteria` line has a passing test or verified manual outcome. A task is not done until its acceptance criteria are satisfied, not merely its implementation checkboxes ticked.
63
- 2. Tick all checkboxes in the `## Implementation Plan`.
64
- 3. Fill the `## Context Log` (files read, estimated input tokens, notes).
65
- 4. Run the full quality-gate suite (`make build && make test`). Record the result in the Context Log.
66
- 5. If any gate fails, fix it or document the blocker in the task file before setting `status: done`.
67
- 6. Set the task frontmatter to `status: done`.
68
- 7. Update `router.md` with the next action (next unblocked task, or `audit-pending` if all tasks done).
69
- 8. **Stop. Prompt the user:**
70
- > "Task {id} is done. Quality gates: {pass/fail list}. Router updated to {next_action}. Review the changes, then tell me to continue."
31
+ 1. Read task's `## Acceptance Criteria` + `## Implementation Plan`
32
+ 2. Execute in order, tick checkboxes
33
+ 3. Verify every AC has passing test/outcome
34
+ 4. Run quality gates (build + test)
35
+ 5. Update task: tick boxes, fill `## Context Log`, set `status: done`
36
+ 6. Update router.md: next task or `audit-pending`
37
+ 7. **Stop. Prompt user before continuing.**
71
38
 
72
- **Do not start the next task. Do not advance past this point without user acknowledgment.**
39
+ ## Drift Check
73
40
 
74
- ## Task Closeout Meta-Check
41
+ - New files/modules not in Codebase Map?
42
+ - Architecture changed from Design.md?
75
43
 
76
- After marking a task `done` and before prompting the user, ask yourself:
44
+ If yes append `## Drift Notes` to task file.
77
45
 
78
- - Did this task add new source files, modules, or exports not in the Codebase Map?
79
- - Did this task change the architecture from what `.savepoint/Design.md` describes?
46
+ ## Audit Handoff
80
47
 
81
- If yes, append a `## Drift Notes` section to the task file:
82
- - `Drift: {file} added, not yet in Codebase Map.`
83
- - `Drift: {section} in Design.md may need update.`
48
+ The agent that builds an epic **must not audit it**. Start a fresh session.
84
49
 
85
- Drift notes are lightweight annotations. They do **not** replace the epic audit. They flag what the next audit should reconcile.
86
-
87
- ## Audit Handoff Rule
88
-
89
- The agent session that builds an epic **must not** run its audit. Audit requires fresh eyes.
90
-
91
- When all tasks in an epic are `done`:
92
- 1. Update `router.md` to `state: audit-pending` for that epic.
93
- 2. Stop. Tell the user: "Epic {id} is complete. Start a new agent session for the audit."
94
- 3. The user starts a fresh session. The new agent reads `router.md`, sees `audit-pending`, and follows the audit-reconciliation instructions.
50
+ ## Code Style
95
51
 
96
- **If you are in the same session that built the epic, you must not audit it.**
52
+ 1. One job per file
53
+ 2. One-sentence functions
54
+ 3. Test branches
55
+ 4. Types are documentation
56
+ 5. Build, don't speculate
57
+ 6. Errors at boundaries
58
+ 7. One source of truth
59
+ 8. Comments explain WHY
60
+ 9. Content in data files
61
+ 10. Small diffs
97
62
 
98
- ## Build / Test / Run
63
+ ## Build
99
64
 
100
65
  ```bash
101
- make build # go build -o savepoint main.go
102
- make test # go test ./...
103
- make run # go run main.go
104
- make clean # rm -f savepoint
66
+ make build && make test
105
67
  ```
106
68
 
107
- ## Code Style
108
-
109
- 1. **One job per file.** If a file does two things, split it.
110
- 2. **One-sentence rule.** If you can't describe a function in one sentence, refactor.
111
- 3. **Test what branches.** Logic with if/else/switch gets a test. Pure rendering: skip.
112
- 4. **Types are documentation.** No `any`. Let the compiler help.
113
- 5. **Build, don't speculate.** No code for hypothetical futures.
114
- 6. **Errors at boundaries.** Handle failure where data enters or leaves the system.
115
- 7. **One source of truth.** State lives in one place. No syncing copies.
116
- 8. **Comments explain WHY,** not what. If removing the comment wouldn't confuse a future reader, delete it.
117
- 9. **Content in data files.** Markdown/JSON/YAML, not strings in code.
118
- 10. **Small diffs.** Each task touches as few files as possible.
119
-
120
69
  ## Codebase Map
121
70
 
122
- | Module | Purpose |
123
- | ------------------------------------ | ---------------------------------------------------------------------------------------------------- |
124
- | `main.go` | CLI Entrypoint and root command wiring |
125
- | `internal/board/` | TUI board models, layout, rendering, overlays, task transitions, router priority markers, and fsnotify refresh |
126
- | `internal/data/` | Task/router/config models, frontmatter parsing, checklist state parsing, mtime-guarded writes, discovery, and generic file readers |
127
- | `internal/styles/` | Atari-Noir palette constants, terminal color fallbacks, shared TUI styles, semantic glyph/tag styles, and footer/header styling |
128
- | `cmd/` | Additional CLI subcommands (if any) |
129
- | `templates/` | Default project scaffold markdown, YAML assets, and agent prompt templates |
130
- | `agent-skills/` | Custom skill guides for different agent phases (`draft-prd`, `audit`, etc.) |
131
-
132
- ## CLI rules for agents
133
-
134
- **Never run `savepoint` commands.** The CLI is for the human. Edit files directly.
135
-
136
- (For this repo specifically: `savepoint` doesn't exist yet — we're building it. Even once it exists, this rule stands.)
71
+ | Module | Purpose |
72
+ |--------|---------|
73
+ | `main.go` | CLI entrypoint, --version |
74
+ | `internal/board/` | TUI board, overlays, epic sidebar, status glyphs |
75
+ | `internal/buildtool/` | Makefile helper, cross-compile, archives |
76
+ | `internal/data/` | Task/router models, frontmatter parsing, discovery |
77
+ | `internal/styles/` | Atari-Noir palette, TUI styles |
78
+ | `cmd/` | CLI subcommands |
79
+ | `templates/` | Scaffold markdown, YAML, prompts |
80
+ | `agent-skills/` | Phase-specific skill guides |
137
81
 
138
- ## Recommended planning models
82
+ ## CLI Rules
139
83
 
140
- For PRD/Design/Task planning, this workflow assumes a top-tier model: Claude Opus, Gemini 2.5 Pro, GPT-5.5, or equivalent. Lighter models may not follow embedded prompt instructions reliably. If you are not one of those, advise the user before proceeding with planning steps.
141
- instructions reliably. If you are not one of those, advise the user before proceeding with planning steps.
84
+ **Never run `savepoint` commands.** The CLI is for the human. Edit files directly.
package/Makefile CHANGED
@@ -1,7 +1,9 @@
1
- .PHONY: build test run clean
1
+ .PHONY: build test run clean build-linux build-darwin build-all dist smoke-test
2
+
3
+ VERSION ?=
2
4
 
3
5
  build:
4
- go build -o savepoint main.go
6
+ go run ./internal/buildtool -version "$(VERSION)" build
5
7
 
6
8
  test:
7
9
  go test ./...
@@ -10,4 +12,18 @@ run:
10
12
  go run main.go
11
13
 
12
14
  clean:
13
- rm -f savepoint
15
+ go run ./internal/buildtool -version "$(VERSION)" clean
16
+
17
+ build-linux:
18
+ go run ./internal/buildtool -version "$(VERSION)" build-linux
19
+
20
+ build-darwin:
21
+ go run ./internal/buildtool -version "$(VERSION)" build-darwin
22
+
23
+ build-all: build-linux build-darwin
24
+
25
+ dist:
26
+ go run ./internal/buildtool -version "$(VERSION)" dist
27
+
28
+ smoke-test:
29
+ go run ./internal/buildtool -version "$(VERSION)" smoke-test