savepoint 1.0.1 → 1.0.3

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 (278) hide show
  1. package/.claude/settings.local.json +15 -1
  2. package/.golangci.yml +11 -0
  3. package/.savepoint/Design.md +52 -46
  4. package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T001-init-module.md +1 -1
  5. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T005-layout.md +1 -1
  6. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T002-card.md +1 -1
  7. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T006-help-overlay.md +1 -1
  8. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/{Design.md → E06-Detail.md} +5 -3
  9. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T002-header-and-dividers.md +1 -1
  10. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T003-footer-status-bar.md +1 -1
  11. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T004-component-refinement.md +1 -1
  12. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T010-auto-refresh-watcher.md +2 -0
  13. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/{Design.md → E01-Detail.md} +9 -1
  14. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/{T007-next-activity-header.md → T001-next-activity-header.md} +13 -12
  15. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T002-rename-epic-design-files.md +9 -9
  16. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T003-rename-release-prd.md +2 -2
  17. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T004-update-instruction-files.md +13 -12
  18. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T005-update-cross-references.md +14 -13
  19. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T006-column-and-detail-scrolling.md +25 -15
  20. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T007-column-focus-border-stability.md +57 -0
  21. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/E02-Audit.md +124 -0
  22. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/{Design.md → E02-Detail.md} +12 -3
  23. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T001-fix-makefile.md +11 -8
  24. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T002-linux-build-target.md +12 -7
  25. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T003-macos-build-target.md +9 -5
  26. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T004-smoke-tests-and-artifacts.md +30 -9
  27. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Audit.md +195 -0
  28. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md +45 -0
  29. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T001-border-resize-fix.md +40 -0
  30. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T002-next-activity-below-header.md +64 -0
  31. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T003-checkbox-rendering-fix.md +56 -0
  32. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T005-unify-status-glyphs.md +65 -0
  33. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T006-forced-256-color-profile.md +36 -0
  34. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Audit.md +167 -0
  35. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Detail.md +51 -0
  36. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T001-sidebar-focusable-navigation.md +65 -0
  37. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T002-epic-detail-overlay.md +73 -0
  38. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T003-epic-status-glyphs.md +73 -0
  39. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Audit.md +237 -0
  40. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Detail.md +54 -0
  41. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T001-update-agents-md.md +45 -0
  42. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T002-update-router-md.md +40 -0
  43. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T003-update-design-md.md +47 -0
  44. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T004-implement-m-hotkey.md +98 -0
  45. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T005-update-help-overlay.md +33 -0
  46. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T006-tests-and-quality-gates.md +62 -0
  47. package/.savepoint/releases/v1.1/epics/E06-audit-command/E06-Audit.md +56 -0
  48. package/.savepoint/releases/v1.1/epics/E06-audit-command/E06-Detail.md +63 -0
  49. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T005-proposals.md +44 -0
  50. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T007-apply-close.md +35 -0
  51. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T009-integration.md +40 -0
  52. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T010-audit-file-migration.md +45 -0
  53. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T011-model-tab-state.md +26 -0
  54. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T012-epic-audit-render.md +33 -0
  55. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T013-handle-tab-keys.md +34 -0
  56. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T014-tab-indicator.md +33 -0
  57. package/.savepoint/releases/v1.1/epics/E07-init-command/E07-Audit.md +336 -0
  58. package/.savepoint/releases/v1.1/epics/E07-init-command/E07-Detail.md +61 -0
  59. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T001-cli-entrypoint.md +37 -0
  60. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T002-target-validation.md +28 -0
  61. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T003-scaffold-writer.md +46 -0
  62. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T004-atomic-writes.md +27 -0
  63. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T005-magic-prompt.md +25 -0
  64. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T006-clipboard.md +26 -0
  65. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T007-integration-test.md +26 -0
  66. package/.savepoint/releases/v1.1/epics/E08-board-command/E08-Audit.md +333 -0
  67. package/.savepoint/releases/v1.1/epics/E08-board-command/E08-Detail.md +68 -0
  68. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T001-cli-entrypoint.md +26 -0
  69. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T002-non-tty-fallback.md +27 -0
  70. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T003-tui-app-shell.md +28 -0
  71. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T004-board-model.md +29 -0
  72. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T005-detail-pane.md +27 -0
  73. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T006-status-transitions.md +29 -0
  74. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T007-theme-fallbacks.md +29 -0
  75. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T008-integration-test.md +27 -0
  76. package/.savepoint/releases/v1.1/epics/E09-doctor-command/E09-Audit.md +207 -0
  77. package/.savepoint/releases/v1.1/epics/E09-doctor-command/E09-Detail.md +65 -0
  78. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T001-cli-entrypoint.md +24 -0
  79. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T002-config-router-validation.md +28 -0
  80. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T003-structure-checks.md +29 -0
  81. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T004-dependency-checks.md +27 -0
  82. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T005-audit-orphan-checks.md +28 -0
  83. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T006-quality-gates-report.md +31 -0
  84. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/E11-Detail.md +36 -0
  85. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T001-debug-logging.md +25 -0
  86. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T002-increase-debounce.md +21 -0
  87. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T003-error-handling.md +22 -0
  88. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T004-test-verify.md +29 -0
  89. package/.savepoint/releases/v1.1/epics/E12-validation-fix/E12-Audit.md +444 -0
  90. package/.savepoint/releases/v1.1/epics/E12-validation-fix/E12-Detail.md +45 -0
  91. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T001-default-phase.md +35 -0
  92. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T002-default-status.md +19 -0
  93. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T003-better-errors.md +29 -0
  94. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T004-validate-on-write.md +25 -0
  95. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T005-tests.md +37 -0
  96. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/E13-Audit.md +118 -0
  97. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/E13-Detail.md +73 -0
  98. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T001-safe-cleanup.md +66 -0
  99. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T002-bug-fixes.md +35 -0
  100. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T003-centralize-duplication.md +60 -0
  101. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T004-infrastructure.md +33 -0
  102. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T005-decompose-update.md +37 -0
  103. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T006-async-io.md +40 -0
  104. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T007-test-coverage.md +37 -0
  105. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/E14-Audit.md +267 -0
  106. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/E14-Detail.md +54 -0
  107. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T001-group-model.md +39 -0
  108. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T002-data-interfaces.md +42 -0
  109. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T003-discover-orphans.md +33 -0
  110. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T004-epic-panel-headings.md +35 -0
  111. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T005-shell-tokenization.md +27 -0
  112. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T006-unify-enums.md +29 -0
  113. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T007-testutil-package.md +28 -0
  114. package/.savepoint/releases/v1.1/epics/E15-hardening/E15-Detail.md +43 -0
  115. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T001-benchmarks.md +31 -0
  116. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T002-fuzz-targets.md +28 -0
  117. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T003-debug-flag.md +30 -0
  118. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T004-dist-checksums.md +27 -0
  119. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T005-windows-targets.md +28 -0
  120. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T006-abbreviation-splitting.md +26 -0
  121. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T007-root-test-allowlist.md +28 -0
  122. package/.savepoint/releases/v1.1/epics/_archived/T001-cli-entrypoint.md +25 -0
  123. package/.savepoint/releases/v1.1/epics/_archived/T002-quality-gates.md +27 -0
  124. package/.savepoint/releases/v1.1/epics/_archived/T003-snapshot.md +27 -0
  125. package/.savepoint/releases/v1.1/epics/_archived/T004-ai-reconcile.md +29 -0
  126. package/.savepoint/releases/v1.1/epics/_archived/T006-tui-review.md +31 -0
  127. package/.savepoint/releases/v1.1/epics/_archived/T008-skip-handling.md +34 -0
  128. package/.savepoint/releases/v1.1/v1.1-PRD.md +139 -0
  129. package/.savepoint/router.md +29 -108
  130. package/AGENTS.md +69 -111
  131. package/Makefile +19 -3
  132. package/README.md +6 -6
  133. package/agent-skills/savepoint-audit/SKILL.md +87 -35
  134. package/agent-skills/savepoint-build-task/SKILL.md +9 -4
  135. package/agent-skills/savepoint-create-plan/SKILL.md +10 -5
  136. package/agent-skills/savepoint-create-task/SKILL.md +44 -31
  137. package/agent-skills/savepoint-draft-prd/SKILL.md +8 -3
  138. package/agent-skills/savepoint-system-design/SKILL.md +8 -3
  139. package/agent_skills_test.go +91 -0
  140. package/cmd/board.go +59 -0
  141. package/cmd/board_test.go +137 -0
  142. package/cmd/doctor.go +53 -0
  143. package/cmd/doctor_test.go +146 -0
  144. package/cmd/init.go +63 -0
  145. package/cmd/init_test.go +104 -0
  146. package/internal/board/board.go +69 -49
  147. package/internal/board/board_test.go +83 -67
  148. package/internal/board/card.go +71 -20
  149. package/internal/board/card_test.go +141 -12
  150. package/internal/board/column.go +77 -11
  151. package/internal/board/column_test.go +63 -13
  152. package/internal/board/detail.go +107 -72
  153. package/internal/board/detail_test.go +117 -26
  154. package/internal/board/epic_panel.go +211 -18
  155. package/internal/board/epic_panel_test.go +637 -14
  156. package/internal/board/help.go +1 -0
  157. package/internal/board/help_test.go +1 -0
  158. package/internal/board/integration_test.go +266 -0
  159. package/internal/board/interfaces.go +65 -0
  160. package/internal/board/interfaces_test.go +114 -0
  161. package/internal/board/io.go +93 -0
  162. package/internal/board/layout.go +12 -2
  163. package/internal/board/layout_test.go +17 -0
  164. package/internal/board/model.go +130 -52
  165. package/internal/board/plain.go +88 -0
  166. package/internal/board/plain_test.go +117 -0
  167. package/internal/board/release.go +1 -9
  168. package/internal/board/release_test.go +6 -6
  169. package/internal/board/render_policy_test.go +77 -0
  170. package/internal/board/status.go +23 -0
  171. package/internal/board/theme.go +24 -0
  172. package/internal/board/theme_test.go +31 -0
  173. package/internal/board/transitions.go +113 -88
  174. package/internal/board/transitions_test.go +164 -141
  175. package/internal/board/tui.go +32 -0
  176. package/internal/board/update.go +472 -94
  177. package/internal/board/update_test.go +447 -0
  178. package/internal/board/util.go +76 -0
  179. package/internal/board/view.go +139 -22
  180. package/internal/board/view_test.go +171 -3
  181. package/internal/board/watch.go +57 -9
  182. package/internal/buildtool/main.go +211 -0
  183. package/internal/buildtool/main_test.go +46 -0
  184. package/internal/data/config.go +17 -3
  185. package/internal/data/config_test.go +49 -0
  186. package/internal/data/discover.go +26 -0
  187. package/internal/data/discover_test.go +34 -10
  188. package/internal/data/errors.go +4 -0
  189. package/internal/data/lifecycle.go +13 -6
  190. package/internal/data/lifecycle_test.go +14 -11
  191. package/internal/data/parser.go +29 -6
  192. package/internal/data/parser_test.go +66 -7
  193. package/internal/data/task.go +1 -0
  194. package/internal/data/write.go +85 -11
  195. package/internal/data/write_test.go +167 -0
  196. package/internal/doctor/checks.go +567 -0
  197. package/internal/doctor/checks_test.go +716 -0
  198. package/internal/doctor/gates.go +193 -0
  199. package/internal/doctor/gates_test.go +166 -0
  200. package/internal/doctor/interfaces.go +64 -0
  201. package/internal/doctor/interfaces_test.go +104 -0
  202. package/internal/doctor/repairs.go +80 -0
  203. package/internal/doctor/repairs_test.go +81 -0
  204. package/internal/doctor/report.go +157 -0
  205. package/internal/doctor/report_test.go +89 -0
  206. package/internal/init/clipboard.go +146 -0
  207. package/internal/init/clipboard_test.go +74 -0
  208. package/internal/init/install.go +16 -0
  209. package/internal/init/integration_test.go +197 -0
  210. package/internal/init/prompt.go +14 -0
  211. package/internal/init/prompt_test.go +77 -0
  212. package/internal/init/scaffold.go +59 -0
  213. package/internal/init/scaffold_test.go +179 -0
  214. package/internal/init/template_freshness_test.go +56 -0
  215. package/internal/init/validate.go +85 -0
  216. package/internal/init/validate_test.go +141 -0
  217. package/internal/init/write.go +73 -0
  218. package/internal/init/write_test.go +91 -0
  219. package/internal/styles/palette.go +3 -3
  220. package/internal/styles/styles.go +39 -12
  221. package/internal/styles/styles_test.go +133 -0
  222. package/internal/testutil/fixture.go +113 -0
  223. package/internal/testutil/fs.go +26 -0
  224. package/main.go +107 -1
  225. package/package.json +2 -2
  226. package/project-audit/audit_report_glm_5.1.md +411 -0
  227. package/project-audit/audit_report_opus_4.6 +406 -0
  228. package/project-audit/consolidated-audit-report.md +456 -0
  229. package/savepoint +0 -0
  230. package/templates/project/.savepoint/Design.md +2 -2
  231. package/templates/project/.savepoint/router.md +15 -14
  232. package/templates/project/AGENTS.md +56 -98
  233. package/templates/project/agent-skills/savepoint-audit/SKILL.md +87 -0
  234. package/templates/project/agent-skills/savepoint-build-task/SKILL.md +44 -0
  235. package/templates/project/agent-skills/savepoint-create-plan/SKILL.md +33 -0
  236. package/templates/project/agent-skills/savepoint-create-task/SKILL.md +44 -0
  237. package/templates/project/agent-skills/savepoint-draft-prd/SKILL.md +37 -0
  238. package/templates/project/agent-skills/savepoint-system-design/SKILL.md +38 -0
  239. package/templates/prompts/audit-reconciliation.prompt.md +35 -30
  240. package/templates/prompts/design.prompt.md +3 -1
  241. package/templates/prompts/epic-design.prompt.md +3 -3
  242. package/templates/prompts/task-breakdown.prompt.md +1 -1
  243. package/templates/prompts/task-building.prompt.md +1 -1
  244. package/templates/prompts/task-planning.prompt.md +1 -1
  245. package/.savepoint/audit/E01-go-setup/proposals.md +0 -166
  246. package/.savepoint/audit/E01-go-setup/snapshot.md +0 -71
  247. package/.savepoint/audit/E01-scaffolding/proposals/AGENTS.md +0 -66
  248. package/.savepoint/audit/E01-scaffolding/proposals/Design.md +0 -210
  249. package/.savepoint/audit/E01-scaffolding/proposals/epic-Design.md +0 -117
  250. package/.savepoint/audit/E01-scaffolding/proposals/quality-review.md +0 -101
  251. package/.savepoint/audit/E01-scaffolding/snapshot.md +0 -54
  252. package/.savepoint/audit/E02-data-model/snapshot.md +0 -128
  253. package/.savepoint/audit/E02-data-readers/proposals.md +0 -123
  254. package/.savepoint/audit/E02-data-readers/snapshot.md +0 -54
  255. package/.savepoint/audit/E03-board-tui-core/proposals.md +0 -146
  256. package/.savepoint/audit/E03-board-tui-core/snapshot.md +0 -57
  257. package/.savepoint/audit/E03-cli-foundation/snapshot.md +0 -106
  258. package/.savepoint/audit/E04-board-components/proposals.md +0 -118
  259. package/.savepoint/audit/E04-board-components/snapshot.md +0 -77
  260. package/.savepoint/audit/E04-templates-and-prompts/snapshot.md +0 -115
  261. package/.savepoint/audit/E05-init-command/snapshot.md +0 -125
  262. package/.savepoint/audit/E05-phase-transitions/proposals.md +0 -83
  263. package/.savepoint/audit/E05-phase-transitions/snapshot.md +0 -36
  264. package/.savepoint/audit/E06-atari-noir-layout/proposals.md +0 -130
  265. package/.savepoint/audit/E06-atari-noir-layout/snapshot.md +0 -84
  266. package/.savepoint/audit/E06-tui-board/snapshot.md +0 -64
  267. package/.savepoint/audit/E07-audit-pipeline/snapshot.md +0 -165
  268. package/.savepoint/audit/E08-board-workflow-cleanup/snapshot.md +0 -65
  269. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T001-border-resize-fix.md +0 -36
  270. package/ink-cli-ui-design.zip +0 -0
  271. package/main.exe +0 -0
  272. package/savepoint.exe +0 -0
  273. /package/.savepoint/releases/v1/epics/E01-go-setup/{Design.md → E01-Detail.md} +0 -0
  274. /package/.savepoint/releases/v1/epics/E02-data-readers/{Design.md → E02-Detail.md} +0 -0
  275. /package/.savepoint/releases/v1/epics/E03-board-tui-core/{Design.md → E03-Detail.md} +0 -0
  276. /package/.savepoint/releases/v1/epics/E04-board-components/{Design.md → E04-Detail.md} +0 -0
  277. /package/.savepoint/releases/v1/epics/E05-phase-transitions/{Design.md → E05-Detail.md} +0 -0
  278. /package/.savepoint/releases/v1/{PRD.md → v1-PRD.md} +0 -0
@@ -0,0 +1,45 @@
1
+ ---
2
+ type: epic-design
3
+ status: audited
4
+ ---
5
+
6
+ # Epic E03: UI Visual Refinement
7
+
8
+ ## Purpose
9
+
10
+ Polish the Atari-Noir TUI rendering across Next Activity indicator repositioning below the header with phase-aligned styling, checkbox rendering at sentence boundaries (not line breaks), unify icon/glyph determination across task cards and the epic sidebar, and force a consistent 256-color terminal profile for reliable cross-terminal rendering.
11
+
12
+ ## Definition of Done
13
+
14
+ - Next Activity renders as a dedicated line below the header with phase-aligned coloring
15
+ - Checkboxes render at sentence starts, not at line break positions
16
+ - ~~Total content width equals available space at every breakpoint with no underflow~~ (absorbed into T001, which is marked done; existing layout tests pass)
17
+ - Task card and epic sidebar glyphs are determined by a shared helper, unified on the same status→glyph mapping
18
+ - Terminal color profile is forced to 256-color, ensuring consistent background rendering on all terminals including PowerShell
19
+
20
+ ## Components and files
21
+
22
+ | Path | Purpose |
23
+ |------|---------|
24
+ | `internal/board/layout.go` | Width arithmetic, layout breakpoints, min width guard (stable — existing implementation verified) |
25
+ | `internal/board/view.go` | Header rendering, Next Activity line, checkbox rendering point |
26
+ | `internal/board/update.go` | Resize handling, terminal dimension clamping |
27
+ | `internal/styles/styles.go` | Phase-aligned styles for Next Activity |
28
+ | `internal/data/router.go` | RouterState model |
29
+ | `internal/data/task.go` | Task markdown parsing for checkbox placement |
30
+ | `internal/board/status.go` | Shared status glyph mapping helper (new) |
31
+ | `internal/board/card.go` | Task card glyph determination (updated for shared helper) |
32
+ | `internal/board/board.go` | Board startup; sets the Lipgloss color profile to ANSI256 before model initialization |
33
+ | `internal/board/view_test.go` | Header, formatting, and checkbox tests |
34
+
35
+ ## Implemented As
36
+
37
+ - `internal/board/view.go` renders `next_action` as a separate line below the header through `renderNextActivityLine`, using existing footer phase styles for `PLAN`, `BUILD`, and `AUDIT`.
38
+ - `internal/board/layout.go` accounts for the optional Next Activity line when calculating board chrome and content height.
39
+ - `internal/data/parser.go` joins hard-wrapped checklist continuation lines before rendering so markdown wrap points do not create duplicate checklist items.
40
+ - `internal/board/detail.go` splits checklist item text on semantic sentence boundaries and emits one `[ ]` or `[x]` marker per sentence.
41
+ - `internal/data/task.go` adds `Task.Status` plus status constants, including `audited`, for shared board glyph rendering.
42
+ - `internal/board/status.go` centralizes the planned, in-progress, done, and audited status glyph mapping used by task cards and the epic sidebar.
43
+ - `internal/board/card.go` uses explicit `Task.Status` when present, while preserving the legacy column/stage glyph fallback for older task data.
44
+ - `internal/board/epic_panel.go` delegates epic status glyph rendering to the shared status helper.
45
+ - `internal/board/board.go` sets Lipgloss to the ANSI256 color profile at board startup. This satisfies the deterministic 256-color rendering intent, although the implementation lives at the board boundary instead of `main.go`.
@@ -0,0 +1,40 @@
1
+ ---
2
+ id: E03-ui-visual-refinement/T001-border-resize-fix
3
+ status: done
4
+ objective: "Fix right-border clipping and ensure clean rendering on terminal resize"
5
+ depends_on: []
6
+ ---
7
+
8
+ # T001: Fix Right-Border Clipping and Resize Robustness
9
+
10
+ ## Acceptance Criteria
11
+
12
+ - The board frame right border (`│` or rounded corner) is always visible at any terminal width ≥ 40 chars
13
+ - Reducing terminal width below a breakpoint (120→119, 80→79) does not leave stray pixels or broken border artifacts
14
+ - Reducing to very narrow widths (< 50) degrades gracefully (no visual corruption)
15
+ - Expanding terminal width back renders cleanly with no leftover characters from previous dimensions
16
+ - All existing layout breakpoints (120/80) still function correctly
17
+ - At every layout breakpoint (120+, 80–119, 40–79), total rendered column width + borders + padding equals the available terminal width with zero underflow
18
+ - Column widths are calculated as `floor(innerWidth / colCount)` and the remainder is distributed as 1 extra column to the first `remainder` columns
19
+ - The board frame overhead (left border + inter-column separators + right border) is exactly accounted for in every breakpoint
20
+ - Reducing terminal width by 1 character removes exactly 1 column of content (no more, no less)
21
+ - All existing layout tests pass
22
+
23
+ ## Implementation Plan
24
+
25
+ - [x] Verified — no artifacts observed. Existing layout.go + tests satisfy acceptance criteria.
26
+
27
+ ## Context Log
28
+
29
+ Files read:
30
+ - `internal/board/layout.go`
31
+ - `internal/board/view.go`
32
+ - `internal/board/update.go`
33
+ - `internal/board/layout_test.go`
34
+
35
+ Estimated input tokens: 800
36
+
37
+ Notes:
38
+ - Consolidated from former T001 + T004 (duplicate width arithmetic scopes).
39
+ - Former T004 at `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T004-width-arithmetic-audit.md` has been deleted.
40
+ - Moved from `E06-atari-noir-layout/T006-border-resize-fix` (release v1) to `E03-ui-visual-refinement` (release v1.1).
@@ -0,0 +1,64 @@
1
+ ---
2
+ id: E03-ui-visual-refinement/T002-next-activity-below-header
3
+ status: done
4
+ objective: "Reposition Next Activity below header as a dedicated line with phase-aligned styling"
5
+ depends_on:
6
+ - E03-ui-visual-refinement/T001-border-resize-fix
7
+ ---
8
+
9
+ # T002: Reposition Next Activity Below Header with Phase-Aligned Styling
10
+
11
+ ## Acceptance Criteria
12
+
13
+ - Next Activity renders as a dedicated full-width line immediately below the header bar
14
+ - The line is hidden (not rendered) when no activity is active or router state is idle
15
+ - The line uses `phase:` prefix mapped to existing footer phase styles:
16
+ - `task-building` → FooterPhaseBuild (orange + bold)
17
+ - `audit-pending` → FooterPhaseAudit (green + bold)
18
+ - `pre-implementation` / `epic-design` / `epic-task-breakdown` → FooterPhasePlan (purple + bold)
19
+ - Format: `"PLAN: Build T010 (E06) v1"` — phase prefix in styled tag, activity text follows
20
+ - Activity text is the `next_action` value from router state (already populated)
21
+ - At narrow widths (< 60 chars), the line truncates gracefully: `"PLAN: Build T0…"`
22
+ - Existing header layout is preserved — nothing shifts or wraps incorrectly
23
+
24
+ ## Implementation Plan
25
+
26
+ - [x] Read `internal/board/view.go` — locate current header rendering and any existing Next Activity right-aligned logic
27
+ - [x] Read `internal/styles/styles.go` — verify FooterPhaseBuild/FooterPhaseAudit/FooterPhasePlan are available for reuse, or add them if missing
28
+ - [x] Read `internal/data/router.go` — confirm RouterState model exposes `state` and `next_action` fields
29
+ - [x] Edit `internal/board/view.go` — add `renderNextActivityLine(state)` that returns a styled string using phase-mapped style
30
+ - [x] Edit `internal/board/view.go` — insert the rendered line immediately after header output in the `View()` function
31
+ - [x] Edit `internal/board/layout.go` — adjust vertical layout height calculation to account for the new line
32
+ - [x] Add tests in `internal/board/view_test.go` — verify phase mapping, truncation, and hidden state
33
+ - [x] Run `make build && make test` to verify no regressions
34
+
35
+ ## Context Log
36
+
37
+ Files read:
38
+ - `.savepoint/router.md`
39
+ - `agent-skills/savepoint-build-task/SKILL.md`
40
+ - `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Design.md`
41
+ - `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T002-next-activity-below-header.md`
42
+ - `.savepoint/visual-identity.md`
43
+ - `agent-skills/ink-tui-design/SKILL.md`
44
+ - `internal/board/view.go`
45
+ - `internal/board/layout.go`
46
+ - `internal/styles/styles.go`
47
+ - `internal/data/router.go`
48
+ - `internal/board/view_test.go`
49
+ - `internal/board/layout_test.go`
50
+
51
+ Files edited:
52
+ - `internal/board/view.go`
53
+ - `internal/board/layout.go`
54
+ - `internal/board/view_test.go`
55
+ - `internal/board/layout_test.go`
56
+ - `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T002-next-activity-below-header.md`
57
+ - `.savepoint/router.md`
58
+
59
+ Estimated input tokens: 9800
60
+
61
+ Notes:
62
+ - Key design decision from user: placement below header as dedicated line (not right-aligned in header); reuse existing FooterPhase* styles
63
+ - Acceptance criteria verified by `go test ./internal/board` covering dedicated line ordering, hidden nil/idle/empty states, phase tag mapping, `next_action` text, narrow truncation, and header preservation.
64
+ - Quality gates: `make build` could not run because `make` is not installed in this Windows shell. Equivalent `go run ./internal/buildtool build` passed. Equivalent `go test ./...` passed.
@@ -0,0 +1,56 @@
1
+ ---
2
+ id: E03-ui-visual-refinement/T003-checkbox-rendering-fix
3
+ status: done
4
+ objective: "Fix checkbox rendering to place checkboxes at sentence start, not at line break positions"
5
+ depends_on:
6
+ - E03-ui-visual-refinement/T001-border-resize-fix
7
+ ---
8
+
9
+ # T003: Fix Checkbox Rendering — Place at Sentence Start
10
+
11
+ ## Acceptance Criteria
12
+
13
+ - Checkboxes (`[ ]` / `[x]`) render at the beginning of each task description sentence, not at arbitrary line-break positions
14
+ - If a task description is hard-wrapped in markdown at column 80, the checkbox appears only once per sentence
15
+ - Multi-sentence tasks show one checkbox per sentence, visually aligned at column 0 of each sentence
16
+ - Already-checked tasks show `[x]` at sentence start consistently
17
+ - No duplicate checkboxes for the same sentence
18
+ - Single-sentence tasks (most common case) render exactly one checkbox at the start, unchanged from current behavior
19
+
20
+ ## Implementation Plan
21
+
22
+ - [x] Read `internal/data/task.go` — locate the markdown parsing / TUI rendering path for task descriptions
23
+ - [x] Read `internal/board/view.go` — locate where task items are rendered in the board columns
24
+ - [x] Identify the parsing layer — this is likely where markdown task body text is split into the displayed description string before being passed to rendering
25
+ - [x] Edit the identified file(s) — change the sentence-splitting logic to split on sentence boundaries (`. `, `!\n`, `?\n`) rather than on hard line breaks
26
+ - [x] In the rendering layer, emit one checkbox per sentence start, aligned to column 0 of each sentence block
27
+ - [x] Add tests in the relevant test file for sentence-boundary detection, single-sentence, multi-sentence, and hard-wrapped cases
28
+ - [x] Run `make build && make test` to verify no regressions
29
+
30
+ ## Context Log
31
+
32
+ Files read:
33
+ - `internal/data/task.go`
34
+ - `internal/data/parser.go`
35
+ - `internal/data/parser_test.go`
36
+ - `internal/board/view.go`
37
+ - `internal/board/detail.go`
38
+ - `internal/board/detail_test.go`
39
+ - `agent-skills/savepoint-build-task/SKILL.md`
40
+ - `agent-skills/ink-tui-design/SKILL.md`
41
+ - `.savepoint/visual-identity.md`
42
+
43
+ Files edited:
44
+ - `internal/data/parser.go`
45
+ - `internal/data/parser_test.go`
46
+ - `internal/board/detail.go`
47
+ - `internal/board/detail_test.go`
48
+
49
+ Estimated input tokens: 8,500
50
+
51
+ Notes:
52
+ - Parser now joins hard-wrapped continuation lines into the current checklist item.
53
+ - Detail rendering now splits checklist item text into semantic sentences and emits `[ ]` / `[x]` only at sentence starts; wrapped continuation lines are indented under the sentence text.
54
+ - Focused tests: `go test ./internal/data ./internal/board` passed.
55
+ - Required literal quality gate: `make build` could not run because `make` is not installed in this PowerShell environment.
56
+ - Equivalent gates: `go run ./internal/buildtool build` passed; `go test ./...` passed.
@@ -0,0 +1,65 @@
1
+ ---
2
+ id: E03-ui-visual-refinement/T005-unify-status-glyphs
3
+ status: done
4
+ objective: "Unify icon/glyph determination across task cards and epic sidebar via a shared statusGlyph helper with backward compatibility"
5
+ depends_on: []
6
+ ---
7
+
8
+ # T005: Unify Task Status Glyph Determination
9
+
10
+ ## Acceptance Criteria
11
+
12
+ - A new `status` field is added to the `data.Task` struct (one of: `planned`, `in_progress`, `done`, `audited`)
13
+ - A shared `statusGlyph(status string) (styled string)` helper exists in `internal/board/status.go` that maps status strings to the same glyph+style used by the epic sidebar
14
+ - `RenderCard` in `card.go` uses the unified helper when `Task.Status` is set, otherwise falls back to the existing Column+Stage logic with identical behavior
15
+ - The epic sidebar's `epicSidebarGlyph` function is refactored to call the shared `statusGlyph` helper instead of its own switch
16
+ - All existing tests pass without modification
17
+ - New tests cover the explicit `Status` path for each status value
18
+ - No changes to existing task files are required
19
+ - `make build && make test` pass
20
+
21
+ ## Implementation Plan
22
+
23
+ - [x] Read `internal/data/task.go` — study Task struct and existing columns/stage types
24
+ - [x] Read `internal/board/card.go` — study current RenderCard glyph determination path
25
+ - [x] Read `internal/board/epic_panel.go` — study epicSidebarGlyph for extraction opportunity
26
+ - [x] Edit `internal/data/task.go` — add `Status string` field to Task struct and Status constants
27
+ - [x] Create `internal/board/status.go` — shared `statusGlyph(status string) string` function with the unified glyph mapping
28
+ - [x] Edit `internal/board/epic_panel.go` — refactor `epicSidebarGlyph` to call the shared `statusGlyph`
29
+ - [x] Edit `internal/board/card.go` — update `RenderCard` to use `statusGlyph` when Status is set, else existing backward-compat path
30
+ - [x] Edit `internal/board/card_test.go` — add tests for explicit Status path (planned/in_progress/done/audited)
31
+ - [x] Run `make build && make test` to verify no regressions
32
+
33
+ ## Context Log
34
+
35
+ Files read:
36
+ - `.savepoint/router.md`
37
+ - `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md`
38
+ - `.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T005-unify-status-glyphs.md`
39
+ - `agent-skills/savepoint-build-task/SKILL.md`
40
+ - `agent-skills/ink-tui-design/SKILL.md`
41
+ - `.savepoint/visual-identity.md`
42
+ - `internal/data/task.go`
43
+ - `internal/data/parser.go`
44
+ - `internal/data/write.go`
45
+ - `internal/data/task_test.go`
46
+ - `internal/board/card.go`
47
+ - `internal/board/epic_panel.go`
48
+ - `internal/styles/styles.go`
49
+ - `internal/board/card_test.go`
50
+ - `internal/board/epic_panel_test.go`
51
+ - `.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T003-epic-status-glyphs.md`
52
+
53
+ Estimated input tokens: 11000
54
+
55
+ Notes:
56
+ - Option A approach: backward compatible when `Status` is unset
57
+ - The unified glyph mapping matches epic sidebar: planned→○, in_progress→▶, done→◉, audited→✓
58
+ - Old `Column`+`Stage` path reproduces exact current behavior (▣/◇/◆ with column-level overrides)
59
+ - `go test ./internal/board ./internal/data` initially hit a sandbox AppData build-cache permission error; rerun outside the sandbox passed.
60
+ - Literal `make build && make test` could not run because `make` is not installed in this Windows shell.
61
+ - Equivalent quality gates passed: `go run ./internal/buildtool build`; `go test ./...`.
62
+
63
+ ## Drift Notes
64
+
65
+ - Drift: `internal/board/status.go` added, not yet in Codebase Map.
@@ -0,0 +1,36 @@
1
+ ---
2
+ id: E03-ui-visual-refinement/T006-forced-256-color-profile
3
+ status: done
4
+ objective: "Force 256-color terminal profile at init to ensure consistent background rendering across all terminals"
5
+ depends_on: []
6
+ ---
7
+
8
+ # T006: Forced 256-Color Profile for Terminal Consistency
9
+
10
+ ## Acceptance Criteria
11
+
12
+ - On startup, `lipgloss` is configured to use `Force256Color` profile instead of relying on terminal detection
13
+ - The board's background renders as uniform black (`"#000000"` / ANSI256 `"232"`) on every color-capable terminal including PowerShell, CMD, Windows Terminal, VS Code terminal, and all Unix terminals
14
+ - No color artifacts or background mismatches are visible when running on PowerShell
15
+ - Existing style definitions using TrueColor hex values still resolve correctly via Lipgloss's 256-color fallback
16
+ - `make build && make test` pass with no regressions
17
+
18
+ ## Implementation Plan
19
+
20
+ - [x] Read board startup flow and identify where to inject profile forcing
21
+ - [x] Edit `internal/board/board.go` — add `lipgloss.SetColorProfile(termenv.ANSI256)` before model initialization
22
+ - [x] Run equivalent build and test gates in this Windows shell
23
+
24
+ ## Context Log
25
+
26
+ Files read:
27
+ - `main.go`
28
+ - `internal/styles/palette.go`
29
+ - `internal/styles/styles.go`
30
+
31
+ Estimated input tokens: 400
32
+
33
+ Notes:
34
+ - `lipgloss.Force256Color` is supported on all Go platforms and all color-capable terminals
35
+ - This is a single-line change — no new dependencies or imports beyond the existing `github.com/charmbracelet/lipgloss` package
36
+ - TrueColor hex values (`"#000000"`) are mapped to nearest 256-color values (`"232"`) via palette.go's `color()` helper; these are already configured
@@ -0,0 +1,167 @@
1
+ ---
2
+ type: audit-findings
3
+ audited: 2026-05-02
4
+ ---
5
+
6
+ # Audit Findings: E04 Epic Navigation
7
+
8
+ ## Main Findings
9
+
10
+ E04 verified the wide-screen epic navigation work: focusable epic sidebar, purple epic focus styling, epic detail overlay, and epic status glyph loading from epic detail frontmatter.
11
+
12
+ The audit found no must-fix product issue before close. Carry-forward notes were limited to documenting accepted overlay filtering behavior, the permissive epic detail file fallback, and a minor unused sidebar paging helper.
13
+
14
+ ## Code Style Review
15
+
16
+
17
+ - [ ] One job per file
18
+ - [ ] One-sentence functions
19
+ - [ ] Test branches
20
+ - [ ] Types are documentation
21
+ - [ ] Build, don't speculate
22
+ - [ ] Errors at boundaries
23
+ - [ ] One source of truth
24
+ - [ ] Comments explain WHY
25
+ - [ ] Content in data files
26
+ - [ ] Small diffs
27
+
28
+ ## Proposed Changes
29
+
30
+ ### Target File
31
+
32
+ `.savepoint/Design.md`
33
+
34
+ ### Replace
35
+
36
+ ```yaml
37
+ last_audited: E01-tui-optimisation (2026-05-02)
38
+ ```
39
+
40
+ ### With
41
+
42
+ ```yaml
43
+ last_audited: E04-epic-navigation (2026-05-02)
44
+ ```
45
+
46
+ ---
47
+
48
+ ### Target File
49
+
50
+ `.savepoint/Design.md`
51
+
52
+ ### Replace
53
+
54
+ ```md
55
+ - **Board command** (`savepoint board`) reads project state, renders the Atari-Noir TUI board, supports release/epic filtering, detail overlays, task status transitions with mtime-guarded writes, release/epic-scoped router priority markers, fsnotify-based task auto-refresh (epic E06), header Next Activity display, height-aware column/detail viewport scrolling, and stable focused/unfocused column border geometry (v1.1 E01).
56
+ ```
57
+
58
+ ### With
59
+
60
+ ```md
61
+ - **Board command** (`savepoint board`) reads project state, renders the Atari-Noir TUI board, supports release/epic filtering, detail overlays, task status transitions with mtime-guarded writes, release/epic-scoped router priority markers, fsnotify-based task auto-refresh (epic E06), header Next Activity display, height-aware column/detail viewport scrolling, stable focused/unfocused column border geometry (v1.1 E01), and a focusable wide-screen epic sidebar with purple epic focus, epic detail overlays, and status glyphs loaded from epic detail frontmatter (v1.1 E04).
62
+ ```
63
+
64
+ ---
65
+
66
+ ### Target File
67
+
68
+ `.savepoint/Design.md`
69
+
70
+ ### Replace
71
+
72
+ ```md
73
+ **Layout:** single screen with a 3-column task board (`planned`, `in_progress`, `done`), optional epic sidebar on wide terminals, centered overlays for release/epic/help/task detail, static Atari-Noir header/footer, full-width dividers, uniform black TUI backgrounds, and navigation hints. The header can show a compact right-aligned Next Activity value from router state. Columns and detail overlays use height-aware viewport slicing with subtle above/more scroll indicators. Focused and unfocused columns preserve the same rounded-border geometry so focus changes do not shift content. Non-TTY output remains a plain table fallback.
74
+ ```
75
+
76
+ ### With
77
+
78
+ ```md
79
+ **Layout:** single screen with a 3-column task board (`planned`, `in_progress`, `done`), optional epic sidebar on wide terminals, centered overlays for release/epic/help/task/epic-detail views, static Atari-Noir header/footer, full-width dividers, uniform black TUI backgrounds, and navigation hints. The header can show a compact right-aligned Next Activity value from router state. Columns and detail overlays use height-aware viewport slicing with subtle above/more scroll indicators. Focused and unfocused columns preserve the same rounded-border geometry so focus changes do not shift content. On terminals at least 120 columns wide, the epic sidebar is focusable from the Planned column; it uses the purple epic accent for focused panel borders, focused epic labels, and epic detail overlays while task-column focus remains orange. Non-TTY output remains a plain table fallback.
80
+ ```
81
+
82
+ ---
83
+
84
+ ### Target File
85
+
86
+ `.savepoint/Design.md`
87
+
88
+ ### Replace
89
+
90
+ ```md
91
+ **Board persistence and refresh:** task status transitions write canonical task frontmatter through `internal/data.WriteTaskStatus` with mtime conflict checks. The board treats `Model.Root` as the `.savepoint` directory, watches `.savepoint/releases/` recursively with fsnotify, adds watches for newly-created release/epic/task directories, and reloads task plus release/epic index data after debounced file changes. Router priority markers match release + epic + task, not only the short `T###` value; completed cards render with the orange build glyph even if they previously matched router priority.
92
+ ```
93
+
94
+ ### With
95
+
96
+ ```md
97
+ **Board persistence and refresh:** task status transitions write canonical task frontmatter through `internal/data.WriteTaskStatus` with mtime conflict checks. The board treats `Model.Root` as the `.savepoint` directory, watches `.savepoint/releases/` recursively with fsnotify, adds watches for newly-created release/epic/task directories, and reloads task plus release/epic index data plus epic status metadata after debounced file changes. Router priority markers match release + epic + task, not only the short `T###` value; completed cards render with the orange build glyph even if they previously matched router priority. Epic status glyphs are cached from each epic's `E##-Detail.md` frontmatter and shown in the wide epic sidebar only.
98
+ ```
99
+
100
+ ---
101
+
102
+ ### Target File
103
+
104
+ `AGENTS.md`
105
+
106
+ ### Replace
107
+
108
+ ```md
109
+ | `internal/board/` | TUI board models, layout, rendering, overlays, task transitions, router priority markers, and fsnotify refresh |
110
+ | `internal/data/` | Task/router/config models, frontmatter parsing, checklist state parsing, mtime-guarded writes, discovery, and generic file readers |
111
+ | `internal/styles/` | Atari-Noir palette constants, terminal color fallbacks, shared TUI styles, stable column border styles, scroll indicators, semantic glyph/tag styles, and footer/header styling |
112
+ ```
113
+
114
+ ### With
115
+
116
+ ```md
117
+ | `internal/board/` | TUI board models, layout, rendering, overlays, focusable epic sidebar navigation, epic detail overlays, epic status glyph loading, task transitions, router priority markers, and fsnotify refresh |
118
+ | `internal/data/` | Task/router/config models, frontmatter parsing, checklist state parsing, mtime-guarded writes, discovery, and generic file readers |
119
+ | `internal/styles/` | Atari-Noir palette constants, terminal color fallbacks, shared TUI styles, stable column border styles, scroll indicators, purple epic navigation/detail styles, semantic glyph/tag styles, and footer/header styling |
120
+ ```
121
+
122
+ ---
123
+
124
+ ### Target File
125
+
126
+ `.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Detail.md`
127
+
128
+ ### Replace
129
+
130
+ ```yaml
131
+ status: planned
132
+ ```
133
+
134
+ ### With
135
+
136
+ ```yaml
137
+ status: audited
138
+ ```
139
+
140
+ ---
141
+
142
+ ### Target File
143
+
144
+ `.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Detail.md`
145
+
146
+ ### Replace
147
+
148
+ ```md
149
+ ## Architectural notes
150
+ ```
151
+
152
+ ### With
153
+
154
+ ```md
155
+ ## Implemented as
156
+
157
+ - `internal/board/model.go` adds `EpicPanelFocus`, `EpicPanelCursor`, `EpicDetailOffset`, `EpicDetailContent`, and `EpicStatus` model state.
158
+ - `internal/board/update.go` handles global keys before epic-panel routing, focuses the panel from the Planned column on wide layouts, changes the selected epic during panel cursor movement, writes router release/epic state, and opens the epic detail overlay on Enter.
159
+ - `internal/board/epic_panel.go` renders the purple-accented epic sidebar focus state, purple epic detail overlay, markdown detail body, and side-panel-only status glyph prefixes.
160
+ - `internal/board/board.go` loads epic status frontmatter during board-data loading; `internal/board/watch.go` carries that status map through reloads.
161
+ - Epic navigation deliberately uses `VibePurple` (`#B1A1DF`) for focused epic panel borders, focused epic labels, epic detail overlays, and epic/audit accents, while task-column focus remains Atari Orange.
162
+ - Implementation deviation: T001 originally said Enter in epic-panel focus selected the focused epic. The final behavior from T002 is that up/down selects and filters immediately, while Enter opens the epic detail overlay.
163
+
164
+ ## Architectural notes
165
+ ```
166
+
167
+ ---
@@ -0,0 +1,51 @@
1
+ ---
2
+ type: epic-design
3
+ status: audited
4
+ ---
5
+
6
+ # Epic E04: Epic Navigation
7
+
8
+ ## Purpose
9
+
10
+ Make the epic sidebar an active, focusable UI component. The sidebar currently lists epics as static text — the only way to switch epics is through the `E` key dropdown popup. This epic gives the sidebar parity with task columns: ↑/↓ navigation, focus highlighting, and an Enter-triggered "Epic Detail" overlay.
11
+
12
+ ## Definition of Done
13
+
14
+ - Epic sidebar is focusable — left arrow from `Planned` column moves focus to sidebar
15
+ - In sidebar focus: ↑/↓ navigates through epics, right arrow returns to column view
16
+ - Focused epic filters tasks in all three columns (same filtering as current `SelectedEpic`)
17
+ - A focused epic entry in the sidebar is visually distinct from unfocused ones
18
+ - Enter on a focused epic opens an "Epic Detail" overlay showing the epic's `E##-Detail.md` content
19
+ - Overlay supports scrolling (↑/↓, PgUp/PgDown) identical to task detail overlay
20
+ - `E` key dropdown behavior is preserved unchanged
21
+ - All above works only when epic panel is visible (≥120 terminal width)
22
+
23
+ ## Components and files
24
+
25
+ | Path | Purpose |
26
+ |------|---------|
27
+ | `internal/board/model.go` | Add `EpicPanelFocus`, `EpicPanelCursor`, `EpicDetailOffset`, `EpicDetailContent` state |
28
+ | `internal/board/update.go` | Handle left arrow to enter panel, ↑/↓ within, Enter to open detail, right arrow to exit |
29
+ | `internal/board/view.go` | Pass focus/cursor to `RenderEpicSidebar`, render epic detail overlay |
30
+ | `internal/board/epic_panel.go` | Update `RenderEpicSidebar` for focus/cursor, add `RenderEpicDetail` |
31
+ | `internal/board/detail.go` | Reuse `visibleDetailLines`, `WrapText`, scroll helpers for epic detail |
32
+ | `internal/board/board.go` | Load epic status from detail files in `loadBoardData` |
33
+ | `internal/board/watch.go` | Carry `epicStatuses` in `reloadMsg` for dynamic reloads |
34
+ | `internal/data/parser.go` | Reuse `ParseFrontmatter` to extract status YAML field |
35
+
36
+ ## Architectural notes
37
+
38
+ - `EpicPanelFocus bool` is a lightweight flag replacing the need for a new column type
39
+ - The epic detail overlay content is read from `E##-Detail.md` on the filesystem when Enter is pressed (not pre-loaded)
40
+ - Detail file path is deterministic: `{root}/releases/{release}/epics/{epic-slug}/{shortID}-Detail.md`
41
+ - If the detail file is missing, the overlay shows a "(no detail available)" message
42
+ - Column selection, task selection, and existing overlay behavior are completely unchanged
43
+
44
+ ## Implemented as
45
+
46
+ - `internal/board/model.go` adds `EpicPanelFocus`, `EpicPanelCursor`, `EpicDetailOffset`, `EpicDetailContent`, and `EpicStatus` model state.
47
+ - `internal/board/update.go` handles global keys before epic-panel routing, focuses the panel from the Planned column on wide layouts, changes the selected epic during panel cursor movement, writes router release/epic state, and opens the epic detail overlay on Enter.
48
+ - `internal/board/epic_panel.go` renders the purple-accented epic sidebar focus state, purple epic detail overlay, markdown detail body, and side-panel-only status glyph prefixes.
49
+ - `internal/board/board.go` loads epic status frontmatter during board-data loading; `internal/board/watch.go` carries that status map through reloads.
50
+ - Epic navigation deliberately uses `VibePurple` (`#B1A1DF`) for focused epic panel borders, focused epic labels, epic detail overlays, and epic/audit accents, while task-column focus remains Atari Orange.
51
+ - Implementation deviation: T001 originally said Enter in epic-panel focus selected the focused epic. The final behavior from T002 is that up/down selects and filters immediately, while Enter opens the epic detail overlay.
@@ -0,0 +1,65 @@
1
+ ---
2
+ id: E04-epic-navigation/T001-sidebar-focusable-navigation
3
+ status: done
4
+ objective: "Make the epic sidebar focusable with up/down navigation to select epics"
5
+ depends_on: []
6
+ ---
7
+
8
+ # T001: Sidebar Focusable Navigation
9
+
10
+ ## Acceptance Criteria
11
+
12
+ - Left arrow (`←`/`h`) from the `Planned` column moves keyboard focus to the epic panel (when panel is visible at ≥120 width)
13
+ - In epic panel focus mode, `↑`/`k` moves the cursor up through the epic list (clamped to bounds)
14
+ - In epic panel focus mode, `↓`/`j` moves the cursor down through the epic list (clamped to bounds)
15
+ - The focused epic entry in the sidebar is highlighted with the same focused style used in task columns
16
+ - `Enter` in epic panel focus mode selects the focused epic: tasks are filtered to that epic, and focus remains in the panel
17
+ - Right arrow (`→`/`l`) from epic panel focus exits back to the `Planned` column with `FocusedTask=0`
18
+ - The existing `E` key dropdown overlay still works unchanged
19
+ - When no epics exist in the current release, the panel shows no navigable cursor
20
+ - All navigation is blocked when any overlay is open (existing behavior)
21
+
22
+ ## Implementation Plan
23
+
24
+ - [x] Add `EpicPanelFocus bool` and `EpicPanelCursor int` to `Model` in `model.go`
25
+ - [x] Add `EpicPanelFocus` tracking to `refreshEpicsForRelease()` — clamp cursor and clear focus if epics list becomes empty
26
+ - [x] In `update.go` — before the `switch msg.String()` block, check `m.Overlay == OverlayNone && m.EpicPanelFocus` and route to a new `updateEpicPanel` method
27
+ - [x] In `updateEpicPanel` — handle `up`/`k` (decrement cursor), `down`/`j` (increment cursor), `enter` (call `m.selectEpicPanelEpic()`), `right`/`l` (exit to Planned column), `left`/`h` (no-op or wrap)
28
+ - [x] In `update.go` main switch — handle `left`/`h` when `FocusedColumn == Planned` by setting `EpicPanelFocus = true` (only when epic panel is visible, i.e. `CalculateLayout(m.Width, m.Height).EpicPanelVisible`)
29
+
30
+ - [x] Add `m.selectEpicPanelEpic()` method: set `m.SelectedEpic = m.Epics[m.EpicPanelCursor]`, reset `m.FocusedTask = 0`, `m.DetailOffset = 0`, call `m.refreshTasks()`, call `m.ensureFocusedTaskVisible()`, write router state
31
+ - [x] Update `epic_panel.go` — update `RenderEpicSidebar` signature to accept `focus bool, cursor int` params; when focused, render the item at cursor with `styles.TaskItemFocused` and `epicActiveMarker`; when not focused, keep current rendering with `SelectedEpic` marker
32
+ - [x] Update `view.go` — pass `m.EpicPanelFocus` and `m.EpicPanelCursor` to `RenderEpicSidebar` in `renderEpicPanel`
33
+ - [x] Add `m.epicPanelPageSize()` helper returning `m.Height / 2` (or similar) for eventual PgUp/PgDown support
34
+ - [x] Run `make build && make test` to verify no regressions
35
+
36
+ ## Context Log
37
+
38
+ Files read:
39
+ - `.savepoint/router.md`
40
+ - `agent-skills/savepoint-build-task/SKILL.md`
41
+ - `agent-skills/ink-tui-design/SKILL.md`
42
+ - `.savepoint/visual-identity.md`
43
+ - `.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Detail.md`
44
+ - `.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T001-sidebar-focusable-navigation.md`
45
+ - `internal/board/model.go`
46
+ - `internal/board/update.go`
47
+ - `internal/board/view.go`
48
+ - `internal/board/epic_panel.go`
49
+ - `internal/board/layout.go`
50
+ - `internal/board/board.go`
51
+ - `internal/board/epic_panel_test.go`
52
+ - `internal/board/update_test.go`
53
+ - `internal/board/model_test.go`
54
+ - `internal/board/view_test.go`
55
+
56
+ Estimated input tokens: 12000
57
+
58
+ Notes:
59
+ - Model's `EpicCursor` field (used in dropdown) is distinct from new `EpicPanelCursor`
60
+ - The epic panel visibility is determined by `layout.EpicPanelVisible` in `CalculateLayout`
61
+ - Focused board tests: `go test ./internal/board` passed.
62
+ - Required quality gate `make build && make test`: failed to start because `make` is not installed in this shell.
63
+ - Equivalent quality gates: `go build -o savepoint main.go` passed; `go test ./...` passed.
64
+ - Follow-up fix after manual review: epic panel focus now renders with the focused panel border and focused title so entering the sidebar is visually apparent even when the cursor starts on the already selected epic. Re-ran `go test ./internal/board`, `go build -o savepoint main.go`, and `go test ./...`; all passed.
65
+ - Follow-up input-routing fix: global `q`, `e`, `r`, and `?` keys now run before epic-panel-specific key handling, so quit and dropdown overlays still work when the epic panel is focused. Added regression tests for `q`, `e`, and `r` from epic panel focus. Re-ran `go test ./internal/board`, `go build -o savepoint main.go`, and `go test ./...`; all passed.