savepoint 1.0.4 → 1.0.7

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 (425) hide show
  1. package/package.json +11 -4
  2. package/savepoint.exe +0 -0
  3. package/.claude/settings.local.json +0 -38
  4. package/.github/workflows/ci.yml +0 -20
  5. package/.golangci.yml +0 -11
  6. package/.prettierignore +0 -4
  7. package/.savepoint/Design.md +0 -207
  8. package/.savepoint/PRD.md +0 -58
  9. package/.savepoint/config.yml +0 -27
  10. package/.savepoint/releases/v1/epics/E01-go-setup/E01-Detail.md +0 -39
  11. package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T001-init-module.md +0 -42
  12. package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T002-entrypoint.md +0 -23
  13. package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T003-directory-structure.md +0 -24
  14. package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T004-makefile.md +0 -23
  15. package/.savepoint/releases/v1/epics/E02-data-readers/E02-Detail.md +0 -61
  16. package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T001-task-struct.md +0 -29
  17. package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T002-frontmatter-parser.md +0 -30
  18. package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T003-router-reader.md +0 -29
  19. package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T004-config-reader.md +0 -29
  20. package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T005-discovery.md +0 -30
  21. package/.savepoint/releases/v1/epics/E03-board-tui-core/E03-Detail.md +0 -38
  22. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T001-model.md +0 -29
  23. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T002-update-loop.md +0 -30
  24. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T003-view.md +0 -34
  25. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T004-styles.md +0 -29
  26. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T005-layout.md +0 -42
  27. package/.savepoint/releases/v1/epics/E04-board-components/E04-Detail.md +0 -44
  28. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T001-column.md +0 -34
  29. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T002-card.md +0 -33
  30. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T003-epic-panel.md +0 -49
  31. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T004-detail-overlay.md +0 -40
  32. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T005-release-dropdown.md +0 -33
  33. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T006-help-overlay.md +0 -34
  34. package/.savepoint/releases/v1/epics/E05-phase-transitions/E05-Detail.md +0 -38
  35. package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T001-phase-stepping.md +0 -29
  36. package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T002-gates.md +0 -31
  37. package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T003-write-task.md +0 -31
  38. package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T004-write-router.md +0 -31
  39. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/E06-Detail.md +0 -62
  40. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T001-color-system.md +0 -39
  41. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T002-header-and-dividers.md +0 -52
  42. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T003-footer-status-bar.md +0 -52
  43. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T004-component-refinement.md +0 -53
  44. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T005-restore-nav-hints.md +0 -39
  45. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T007-detail-card-fixes.md +0 -36
  46. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T008-checkbox-states.md +0 -40
  47. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T009-router-priority-marker.md +0 -48
  48. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T010-auto-refresh-watcher.md +0 -66
  49. package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/Design.md +0 -39
  50. package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T001-archive-epics.md +0 -20
  51. package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T002-rewrite-prd.md +0 -22
  52. package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T003-create-epic-stubs.md +0 -24
  53. package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T004-update-router.md +0 -22
  54. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/Design.md +0 -118
  55. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/handoff.md +0 -9
  56. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T001-package-baseline.md +0 -45
  57. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T002-typescript-build.md +0 -48
  58. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T003-vitest-smoke.md +0 -43
  59. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T004-lint-format-gates.md +0 -45
  60. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T005-scaffold-verification.md +0 -40
  61. package/.savepoint/releases/v1/epics/_archived/E02-data-model/Design.md +0 -142
  62. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T001-domain-ids-status.md +0 -27
  63. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T002-markdown-frontmatter-boundary.md +0 -28
  64. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T003-task-documents.md +0 -29
  65. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T004-release-epic-router-config-readers.md +0 -30
  66. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T005-dependency-validation.md +0 -29
  67. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T006-epic-task-set-reader.md +0 -29
  68. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T007-quality-gates.md +0 -31
  69. package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/Design.md +0 -40
  70. package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T001-phase-types.md +0 -27
  71. package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T002-phase-frontmatter.md +0 -25
  72. package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T003-simplify-config.md +0 -26
  73. package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T004-simplify-router-domain.md +0 -24
  74. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/Design.md +0 -122
  75. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T001-argument-parser-contract.md +0 -28
  76. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T002-help-text-generation.md +0 -28
  77. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T003-terminal-environment-detection.md +0 -27
  78. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T004-command-stub-modules.md +0 -29
  79. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T005-cli-runner-dispatch.md +0 -34
  80. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T006-entrypoint-quality-gates.md +0 -32
  81. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/Design.md +0 -43
  82. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T001-strip-args.md +0 -26
  83. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T002-strip-help.md +0 -23
  84. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T003-strip-run.md +0 -23
  85. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T004-delete-commands.md +0 -24
  86. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T005-update-cli-tests.md +0 -22
  87. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/Design.md +0 -48
  88. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T001-board-data-phases.md +0 -26
  89. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T002-phase-rendering.md +0 -28
  90. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T003-detail-pane-phases.md +0 -27
  91. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T004-phase-transitions.md +0 -42
  92. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T005-phase-gates.md +0 -24
  93. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T006-phase-write-back.md +0 -24
  94. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T007-remove-audit-flow.md +0 -27
  95. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T008-board-tests.md +0 -25
  96. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/Design.md +0 -85
  97. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T001-project-template-assets.md +0 -17
  98. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T002-release-and-prompt-assets.md +0 -20
  99. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T003-template-registry-renderer.md +0 -22
  100. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T004-template-integrity-tests.md +0 -17
  101. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T005-template-closeout-quality-gates.md +0 -16
  102. package/.savepoint/releases/v1/epics/_archived/E05-init-command/Design.md +0 -88
  103. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T001-init-cli-contract.md +0 -22
  104. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T002-target-validation.md +0 -23
  105. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T003-scaffold-writer.md +0 -24
  106. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T004-magic-prompt-and-clipboard.md +0 -23
  107. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T005-dev-deps-install-option.md +0 -24
  108. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T006-init-command-integration.md +0 -28
  109. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/Design.md +0 -53
  110. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T001-delete-dead-src.md +0 -23
  111. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T002-delete-dead-tests.md +0 -26
  112. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T003-delete-assets.md +0 -25
  113. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T004-clean-savepoint.md +0 -28
  114. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T005-rewrite-agents-md.md +0 -28
  115. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T006-clean-package-json.md +0 -23
  116. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T007-verify.md +0 -25
  117. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/Design.md +0 -104
  118. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T001-board-command-data.md +0 -23
  119. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T002-board-view-state.md +0 -24
  120. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T003-transition-gates-and-writes.md +0 -25
  121. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T004-terminal-theme.md +0 -23
  122. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T005-ink-board-ui.md +0 -26
  123. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T006-board-integration-audit-entry.md +0 -24
  124. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/Design.md +0 -88
  125. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T001-audit-cli-contract.md +0 -23
  126. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T002-quality-gate-runner.md +0 -23
  127. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T003-snapshot-and-prompt.md +0 -23
  128. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T004-audit-orchestration-router.md +0 -27
  129. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T005-proposal-validation-apply.md +0 -25
  130. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T006-audit-review-state.md +0 -24
  131. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T007-audit-review-ui.md +0 -26
  132. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T008-audit-pipeline-integration.md +0 -24
  133. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/Design.md +0 -103
  134. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T001-acceptance-criteria-model.md +0 -30
  135. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T002-release-task-set-reader.md +0 -33
  136. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T003-board-data-and-plain-output.md +0 -34
  137. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T004-board-selection-state.md +0 -33
  138. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T005-ink-board-layout-cleanup.md +0 -37
  139. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T006-task-detail-popup.md +0 -36
  140. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T007-templates-acceptance-criteria.md +0 -34
  141. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T008-board-workflow-integration.md +0 -41
  142. package/.savepoint/releases/v1/epics/_archived/E09-doctor-command/Design.md +0 -70
  143. package/.savepoint/releases/v1/epics/_archived/E10-docs-and-packaging/Design.md +0 -68
  144. package/.savepoint/releases/v1/epics/_archived/E11-release-validation/Design.md +0 -68
  145. package/.savepoint/releases/v1/v1-PRD.md +0 -66
  146. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/E01-Detail.md +0 -40
  147. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T001-next-activity-header.md +0 -56
  148. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T002-rename-epic-design-files.md +0 -38
  149. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T003-rename-release-prd.md +0 -28
  150. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T004-update-instruction-files.md +0 -51
  151. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T005-update-cross-references.md +0 -45
  152. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T006-column-and-detail-scrolling.md +0 -68
  153. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T007-column-focus-border-stability.md +0 -57
  154. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/E02-Audit.md +0 -124
  155. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/E02-Detail.md +0 -49
  156. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T001-fix-makefile.md +0 -37
  157. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T002-linux-build-target.md +0 -38
  158. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T003-macos-build-target.md +0 -36
  159. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T004-smoke-tests-and-artifacts.md +0 -59
  160. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Audit.md +0 -195
  161. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md +0 -45
  162. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T001-border-resize-fix.md +0 -40
  163. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T002-next-activity-below-header.md +0 -64
  164. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T003-checkbox-rendering-fix.md +0 -56
  165. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T005-unify-status-glyphs.md +0 -65
  166. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T006-forced-256-color-profile.md +0 -36
  167. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Audit.md +0 -167
  168. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Detail.md +0 -51
  169. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T001-sidebar-focusable-navigation.md +0 -65
  170. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T002-epic-detail-overlay.md +0 -73
  171. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T003-epic-status-glyphs.md +0 -73
  172. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Audit.md +0 -237
  173. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Detail.md +0 -54
  174. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T001-update-agents-md.md +0 -45
  175. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T002-update-router-md.md +0 -40
  176. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T003-update-design-md.md +0 -47
  177. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T004-implement-m-hotkey.md +0 -98
  178. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T005-update-help-overlay.md +0 -33
  179. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T006-tests-and-quality-gates.md +0 -62
  180. package/.savepoint/releases/v1.1/epics/E06-audit-command/E06-Audit.md +0 -56
  181. package/.savepoint/releases/v1.1/epics/E06-audit-command/E06-Detail.md +0 -63
  182. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T005-proposals.md +0 -44
  183. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T007-apply-close.md +0 -35
  184. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T009-integration.md +0 -40
  185. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T010-audit-file-migration.md +0 -45
  186. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T011-model-tab-state.md +0 -26
  187. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T012-epic-audit-render.md +0 -33
  188. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T013-handle-tab-keys.md +0 -34
  189. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T014-tab-indicator.md +0 -33
  190. package/.savepoint/releases/v1.1/epics/E07-init-command/E07-Audit.md +0 -336
  191. package/.savepoint/releases/v1.1/epics/E07-init-command/E07-Detail.md +0 -61
  192. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T001-cli-entrypoint.md +0 -37
  193. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T002-target-validation.md +0 -28
  194. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T003-scaffold-writer.md +0 -46
  195. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T004-atomic-writes.md +0 -27
  196. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T005-magic-prompt.md +0 -25
  197. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T006-clipboard.md +0 -26
  198. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T007-integration-test.md +0 -26
  199. package/.savepoint/releases/v1.1/epics/E08-board-command/E08-Audit.md +0 -333
  200. package/.savepoint/releases/v1.1/epics/E08-board-command/E08-Detail.md +0 -68
  201. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T001-cli-entrypoint.md +0 -26
  202. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T002-non-tty-fallback.md +0 -27
  203. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T003-tui-app-shell.md +0 -28
  204. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T004-board-model.md +0 -29
  205. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T005-detail-pane.md +0 -27
  206. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T006-status-transitions.md +0 -29
  207. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T007-theme-fallbacks.md +0 -29
  208. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T008-integration-test.md +0 -27
  209. package/.savepoint/releases/v1.1/epics/E09-doctor-command/E09-Audit.md +0 -207
  210. package/.savepoint/releases/v1.1/epics/E09-doctor-command/E09-Detail.md +0 -65
  211. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T001-cli-entrypoint.md +0 -24
  212. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T002-config-router-validation.md +0 -28
  213. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T003-structure-checks.md +0 -29
  214. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T004-dependency-checks.md +0 -27
  215. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T005-audit-orphan-checks.md +0 -28
  216. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T006-quality-gates-report.md +0 -31
  217. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/E11-Detail.md +0 -36
  218. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T001-debug-logging.md +0 -25
  219. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T002-increase-debounce.md +0 -21
  220. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T003-error-handling.md +0 -22
  221. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T004-test-verify.md +0 -29
  222. package/.savepoint/releases/v1.1/epics/E12-validation-fix/E12-Audit.md +0 -444
  223. package/.savepoint/releases/v1.1/epics/E12-validation-fix/E12-Detail.md +0 -45
  224. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T001-default-phase.md +0 -35
  225. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T002-default-status.md +0 -19
  226. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T003-better-errors.md +0 -29
  227. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T004-validate-on-write.md +0 -25
  228. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T005-tests.md +0 -37
  229. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/E13-Audit.md +0 -118
  230. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/E13-Detail.md +0 -73
  231. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T001-safe-cleanup.md +0 -66
  232. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T002-bug-fixes.md +0 -35
  233. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T003-centralize-duplication.md +0 -60
  234. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T004-infrastructure.md +0 -33
  235. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T005-decompose-update.md +0 -37
  236. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T006-async-io.md +0 -40
  237. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T007-test-coverage.md +0 -37
  238. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/E14-Audit.md +0 -267
  239. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/E14-Detail.md +0 -54
  240. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T001-group-model.md +0 -39
  241. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T002-data-interfaces.md +0 -42
  242. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T003-discover-orphans.md +0 -33
  243. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T004-epic-panel-headings.md +0 -35
  244. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T005-shell-tokenization.md +0 -27
  245. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T006-unify-enums.md +0 -29
  246. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T007-testutil-package.md +0 -28
  247. package/.savepoint/releases/v1.1/epics/E15-hardening/E15-Audit.md +0 -272
  248. package/.savepoint/releases/v1.1/epics/E15-hardening/E15-Detail.md +0 -60
  249. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T001-benchmarks.md +0 -31
  250. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T002-fuzz-targets.md +0 -34
  251. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T003-debug-flag.md +0 -30
  252. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T004-dist-checksums.md +0 -27
  253. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T005-windows-targets.md +0 -28
  254. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T006-abbreviation-splitting.md +0 -26
  255. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T007-root-test-allowlist.md +0 -33
  256. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T008-ci-and-release-automation.md +0 -46
  257. package/.savepoint/releases/v1.1/epics/_archived/T001-cli-entrypoint.md +0 -25
  258. package/.savepoint/releases/v1.1/epics/_archived/T002-quality-gates.md +0 -27
  259. package/.savepoint/releases/v1.1/epics/_archived/T003-snapshot.md +0 -27
  260. package/.savepoint/releases/v1.1/epics/_archived/T004-ai-reconcile.md +0 -29
  261. package/.savepoint/releases/v1.1/epics/_archived/T006-tui-review.md +0 -31
  262. package/.savepoint/releases/v1.1/epics/_archived/T008-skip-handling.md +0 -34
  263. package/.savepoint/releases/v1.1/v1.1-PRD.md +0 -139
  264. package/.savepoint/router.md +0 -57
  265. package/.savepoint/visual-identity.md +0 -125
  266. package/AGENTS.md +0 -99
  267. package/CLAUDE.md +0 -1
  268. package/GEMINI.md +0 -1
  269. package/Makefile +0 -31
  270. package/agent-skills/ink-tui-design/SKILL.md +0 -309
  271. package/agent-skills/ink-tui-design/references/component-patterns.md +0 -371
  272. package/agent-skills/ink-tui-design/references/hooks-guide.md +0 -436
  273. package/agent-skills/ink-tui-design/references/ink-gotchas.md +0 -330
  274. package/agent-skills/ink-tui-design/references/testing-patterns.md +0 -384
  275. package/agent-skills/savepoint-audit/SKILL.md +0 -87
  276. package/agent-skills/savepoint-build-task/SKILL.md +0 -44
  277. package/agent-skills/savepoint-create-plan/SKILL.md +0 -33
  278. package/agent-skills/savepoint-create-task/SKILL.md +0 -44
  279. package/agent-skills/savepoint-draft-prd/SKILL.md +0 -37
  280. package/agent-skills/savepoint-system-design/SKILL.md +0 -38
  281. package/agent-skills/superpowers/brainstorming/SKILL.md +0 -165
  282. package/agent-skills/superpowers/brainstorming/visual-companion.md +0 -304
  283. package/agent-skills/superpowers/dispatching-parallel-agents/SKILL.md +0 -193
  284. package/agent-skills/superpowers/executing-plans/SKILL.md +0 -77
  285. package/agent-skills/superpowers/finishing-a-development-branch/SKILL.md +0 -213
  286. package/agent-skills/superpowers/receiving-code-review/SKILL.md +0 -226
  287. package/agent-skills/superpowers/requesting-code-review/SKILL.md +0 -115
  288. package/agent-skills/superpowers/requesting-code-review/code-reviewer.md +0 -160
  289. package/agent-skills/superpowers/subagent-driven-development/SKILL.md +0 -292
  290. package/agent-skills/superpowers/subagent-driven-development/code-quality-reviewer-prompt.md +0 -27
  291. package/agent-skills/superpowers/subagent-driven-development/implementer-prompt.md +0 -113
  292. package/agent-skills/superpowers/subagent-driven-development/spec-reviewer-prompt.md +0 -61
  293. package/agent-skills/superpowers/systematic-debugging/SKILL.md +0 -305
  294. package/agent-skills/superpowers/systematic-debugging/condition-based-waiting.md +0 -122
  295. package/agent-skills/superpowers/systematic-debugging/defense-in-depth.md +0 -130
  296. package/agent-skills/superpowers/systematic-debugging/root-cause-tracing.md +0 -183
  297. package/agent-skills/superpowers/test-driven-development/SKILL.md +0 -389
  298. package/agent-skills/superpowers/test-driven-development/testing-anti-patterns.md +0 -317
  299. package/agent-skills/superpowers/verification-before-completion/SKILL.md +0 -147
  300. package/agent-skills/superpowers/writing-plans/SKILL.md +0 -159
  301. package/agent-skills/superpowers/writing-plans/plan-document-reviewer-prompt.md +0 -49
  302. package/agent_skills_test.go +0 -91
  303. package/assets/banner.png +0 -0
  304. package/assets/logo.png +0 -0
  305. package/assets/strawman.png +0 -0
  306. package/cmd/board.go +0 -59
  307. package/cmd/board_test.go +0 -137
  308. package/cmd/doctor.go +0 -53
  309. package/cmd/doctor_test.go +0 -146
  310. package/cmd/init.go +0 -63
  311. package/cmd/init_test.go +0 -104
  312. package/go.mod +0 -36
  313. package/go.sum +0 -75
  314. package/internal/board/board.go +0 -181
  315. package/internal/board/board_test.go +0 -168
  316. package/internal/board/card.go +0 -129
  317. package/internal/board/card_test.go +0 -287
  318. package/internal/board/column.go +0 -156
  319. package/internal/board/column_test.go +0 -210
  320. package/internal/board/debug.go +0 -26
  321. package/internal/board/debug_test.go +0 -108
  322. package/internal/board/detail.go +0 -218
  323. package/internal/board/detail_test.go +0 -388
  324. package/internal/board/epic_panel.go +0 -264
  325. package/internal/board/epic_panel_test.go +0 -869
  326. package/internal/board/help.go +0 -41
  327. package/internal/board/help_test.go +0 -86
  328. package/internal/board/integration_test.go +0 -266
  329. package/internal/board/interfaces.go +0 -65
  330. package/internal/board/interfaces_test.go +0 -114
  331. package/internal/board/io.go +0 -93
  332. package/internal/board/layout.go +0 -68
  333. package/internal/board/layout_test.go +0 -106
  334. package/internal/board/model.go +0 -235
  335. package/internal/board/model_test.go +0 -67
  336. package/internal/board/plain.go +0 -88
  337. package/internal/board/plain_test.go +0 -117
  338. package/internal/board/release.go +0 -34
  339. package/internal/board/release_test.go +0 -177
  340. package/internal/board/render_policy_test.go +0 -77
  341. package/internal/board/status.go +0 -23
  342. package/internal/board/theme.go +0 -24
  343. package/internal/board/theme_test.go +0 -31
  344. package/internal/board/transitions.go +0 -113
  345. package/internal/board/transitions_test.go +0 -164
  346. package/internal/board/tui.go +0 -32
  347. package/internal/board/update.go +0 -575
  348. package/internal/board/update_test.go +0 -602
  349. package/internal/board/util.go +0 -76
  350. package/internal/board/view.go +0 -317
  351. package/internal/board/view_test.go +0 -377
  352. package/internal/board/watch.go +0 -136
  353. package/internal/buildtool/main.go +0 -249
  354. package/internal/buildtool/main_test.go +0 -224
  355. package/internal/data/config.go +0 -101
  356. package/internal/data/config_test.go +0 -122
  357. package/internal/data/discover.go +0 -178
  358. package/internal/data/discover_test.go +0 -130
  359. package/internal/data/errors.go +0 -13
  360. package/internal/data/fuzz_test.go +0 -75
  361. package/internal/data/lifecycle.go +0 -44
  362. package/internal/data/lifecycle_test.go +0 -41
  363. package/internal/data/parser.go +0 -243
  364. package/internal/data/parser_test.go +0 -281
  365. package/internal/data/router.go +0 -52
  366. package/internal/data/router_test.go +0 -35
  367. package/internal/data/task.go +0 -57
  368. package/internal/data/task_test.go +0 -51
  369. package/internal/data/testdata/fuzz/FuzzSplitFrontmatterBody/68eb66b0fe91e7e3 +0 -2
  370. package/internal/data/write.go +0 -221
  371. package/internal/data/write_test.go +0 -623
  372. package/internal/doctor/checks.go +0 -567
  373. package/internal/doctor/checks_test.go +0 -716
  374. package/internal/doctor/gates.go +0 -193
  375. package/internal/doctor/gates_test.go +0 -166
  376. package/internal/doctor/interfaces.go +0 -64
  377. package/internal/doctor/interfaces_test.go +0 -104
  378. package/internal/doctor/repairs.go +0 -80
  379. package/internal/doctor/repairs_test.go +0 -81
  380. package/internal/doctor/report.go +0 -157
  381. package/internal/doctor/report_test.go +0 -89
  382. package/internal/init/clipboard.go +0 -146
  383. package/internal/init/clipboard_test.go +0 -74
  384. package/internal/init/install.go +0 -16
  385. package/internal/init/integration_test.go +0 -197
  386. package/internal/init/prompt.go +0 -14
  387. package/internal/init/prompt_test.go +0 -77
  388. package/internal/init/scaffold.go +0 -59
  389. package/internal/init/scaffold_test.go +0 -179
  390. package/internal/init/template_freshness_test.go +0 -56
  391. package/internal/init/validate.go +0 -85
  392. package/internal/init/validate_test.go +0 -141
  393. package/internal/init/write.go +0 -73
  394. package/internal/init/write_test.go +0 -91
  395. package/internal/styles/palette.go +0 -49
  396. package/internal/styles/styles.go +0 -139
  397. package/internal/styles/styles_test.go +0 -133
  398. package/internal/testutil/fixture.go +0 -113
  399. package/internal/testutil/fs.go +0 -26
  400. package/main.go +0 -136
  401. package/project-audit/audit_report_glm_5.1.md +0 -411
  402. package/project-audit/audit_report_opus_4.6.md +0 -406
  403. package/project-audit/consolidated-audit-report.md +0 -456
  404. package/scripts/vitest-preload.cjs +0 -95
  405. package/templates/project/.savepoint/Design.md +0 -47
  406. package/templates/project/.savepoint/PRD.md +0 -34
  407. package/templates/project/.savepoint/config.yml +0 -27
  408. package/templates/project/.savepoint/router.md +0 -153
  409. package/templates/project/.savepoint/visual-identity.md +0 -122
  410. package/templates/project/AGENTS.md +0 -88
  411. package/templates/project/agent-skills/savepoint-audit/SKILL.md +0 -87
  412. package/templates/project/agent-skills/savepoint-build-task/SKILL.md +0 -44
  413. package/templates/project/agent-skills/savepoint-create-plan/SKILL.md +0 -33
  414. package/templates/project/agent-skills/savepoint-create-task/SKILL.md +0 -44
  415. package/templates/project/agent-skills/savepoint-draft-prd/SKILL.md +0 -37
  416. package/templates/project/agent-skills/savepoint-system-design/SKILL.md +0 -38
  417. package/templates/prompts/audit-reconciliation.prompt.md +0 -72
  418. package/templates/prompts/design.prompt.md +0 -45
  419. package/templates/prompts/epic-design.prompt.md +0 -43
  420. package/templates/prompts/magic-prompt.prompt.md +0 -7
  421. package/templates/prompts/prd.prompt.md +0 -42
  422. package/templates/prompts/task-breakdown.prompt.md +0 -54
  423. package/templates/prompts/task-building.prompt.md +0 -38
  424. package/templates/prompts/task-planning.prompt.md +0 -53
  425. package/templates/release/v1/PRD.md +0 -37
@@ -1,177 +0,0 @@
1
- package board
2
-
3
- import (
4
- "strings"
5
- "testing"
6
-
7
- tea "github.com/charmbracelet/bubbletea"
8
- "github.com/opencode/savepoint/internal/data"
9
- )
10
-
11
- func TestRenderReleaseDropdown_showsReleases(t *testing.T) {
12
- releases := []string{"v1", "v2", "v3"}
13
- out := RenderReleaseDropdown(releases, 0, 40)
14
- for _, r := range releases {
15
- if !strings.Contains(out, r) {
16
- t.Errorf("output missing release %q", r)
17
- }
18
- }
19
- }
20
-
21
- func TestRenderReleaseDropdown_marksCurrentCursor(t *testing.T) {
22
- releases := []string{"v1", "v2"}
23
- out := RenderReleaseDropdown(releases, 1, 40)
24
- if !strings.Contains(out, releaseActiveMarker) {
25
- t.Error("output missing active marker")
26
- }
27
- }
28
-
29
- func TestRenderReleaseDropdown_emptyList(t *testing.T) {
30
- out := RenderReleaseDropdown(nil, 0, 40)
31
- if !strings.Contains(out, "(none)") {
32
- t.Error("expected '(none)' for empty releases")
33
- }
34
- }
35
-
36
- func TestRenderReleaseDropdown_hintsPresent(t *testing.T) {
37
- out := RenderReleaseDropdown([]string{"v1"}, 0, 40)
38
- if !strings.Contains(out, "esc:cancel") {
39
- t.Error("expected hint text in dropdown")
40
- }
41
- }
42
-
43
- func TestSliceIndexRelease_found(t *testing.T) {
44
- releases := []string{"v1", "v2", "v3"}
45
- if got := sliceIndex(releases, "v2"); got != 1 {
46
- t.Errorf("sliceIndex = %d, want 1", got)
47
- }
48
- }
49
-
50
- func TestSliceIndexRelease_notFound(t *testing.T) {
51
- releases := []string{"v1", "v2"}
52
- if got := sliceIndex(releases, "v9"); got != 0 {
53
- t.Errorf("sliceIndex = %d, want 0", got)
54
- }
55
- }
56
-
57
- func TestUpdate_rOpensReleaseOverlay(t *testing.T) {
58
- m := NewModel(nil, "v1", "E03")
59
- m.Releases = []string{"v1", "v2"}
60
- got, _ := m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune("r")})
61
- updated := requireModel(t, got)
62
- if updated.Overlay != OverlayRelease {
63
- t.Errorf("Overlay = %q, want %q", updated.Overlay, OverlayRelease)
64
- }
65
- }
66
-
67
- func TestUpdate_rSetsCursorToCurrentRelease(t *testing.T) {
68
- m := NewModel(nil, "v2", "E03")
69
- m.Releases = []string{"v1", "v2", "v3"}
70
- got, _ := m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune("r")})
71
- updated := requireModel(t, got)
72
- if updated.ReleaseCursor != 1 {
73
- t.Errorf("ReleaseCursor = %d, want 1", updated.ReleaseCursor)
74
- }
75
- }
76
-
77
- func TestUpdate_escClosesReleaseOverlay(t *testing.T) {
78
- m := NewModel(nil, "v1", "E03")
79
- m.Overlay = OverlayRelease
80
- got, _ := m.Update(tea.KeyMsg{Type: tea.KeyEsc})
81
- updated := requireModel(t, got)
82
- if updated.Overlay != OverlayNone {
83
- t.Errorf("Overlay = %q, want empty", updated.Overlay)
84
- }
85
- }
86
-
87
- func TestUpdate_releaseNavDown(t *testing.T) {
88
- m := NewModel(nil, "v1", "E03")
89
- m.Releases = []string{"v1", "v2"}
90
- m.Overlay = OverlayRelease
91
- m.ReleaseCursor = 0
92
- got, _ := m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune("j")})
93
- updated := requireModel(t, got)
94
- if updated.ReleaseCursor != 1 {
95
- t.Errorf("ReleaseCursor = %d, want 1", updated.ReleaseCursor)
96
- }
97
- }
98
-
99
- func TestUpdate_releaseNavUp(t *testing.T) {
100
- m := NewModel(nil, "v1", "E03")
101
- m.Releases = []string{"v1", "v2"}
102
- m.Overlay = OverlayRelease
103
- m.ReleaseCursor = 1
104
- got, _ := m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune("k")})
105
- updated := requireModel(t, got)
106
- if updated.ReleaseCursor != 0 {
107
- t.Errorf("ReleaseCursor = %d, want 0", updated.ReleaseCursor)
108
- }
109
- }
110
-
111
- func TestUpdate_releaseEnterSelects(t *testing.T) {
112
- tasks := []data.Task{
113
- {ID: "T1", Epic: "E03", Release: "v1", Column: data.ColumnPlanned},
114
- {ID: "T2", Epic: "E03", Release: "v2", Column: data.ColumnPlanned},
115
- }
116
- m := NewModel(tasks, "v1", "E03")
117
- m.Releases = []string{"v1", "v2"}
118
- m.Overlay = OverlayRelease
119
- m.ReleaseCursor = 1
120
- got, _ := m.Update(tea.KeyMsg{Type: tea.KeyEnter})
121
- updated := requireModel(t, got)
122
- if updated.SelectedRelease != "v2" {
123
- t.Errorf("SelectedRelease = %q, want %q", updated.SelectedRelease, "v2")
124
- }
125
- if updated.Overlay != OverlayNone {
126
- t.Errorf("Overlay = %q, want empty after selection", updated.Overlay)
127
- }
128
- if got := len(updated.Tasks[data.ColumnPlanned]); got != 1 {
129
- t.Errorf("planned task count = %d, want 1 after release selection", got)
130
- }
131
- if updated.Tasks[data.ColumnPlanned][0].ID != "T2" {
132
- t.Errorf("visible task = %q, want T2", updated.Tasks[data.ColumnPlanned][0].ID)
133
- }
134
- }
135
-
136
- func TestUpdate_releaseEnterRefreshesEpics(t *testing.T) {
137
- tasks := []data.Task{
138
- {ID: "T1", Epic: "E01", Release: "v1", Column: data.ColumnPlanned},
139
- {ID: "T2", Epic: "E03", Release: "v2", Column: data.ColumnPlanned},
140
- }
141
- m := NewModel(tasks, "v1", "E01")
142
- m.Releases = []string{"v1", "v2"}
143
- m.ReleaseEpics = map[string][]string{
144
- "v1": []string{"E01"},
145
- "v2": []string{"E03"},
146
- }
147
- m.Overlay = OverlayRelease
148
- m.ReleaseCursor = 1
149
-
150
- got, _ := m.Update(tea.KeyMsg{Type: tea.KeyEnter})
151
- updated := requireModel(t, got)
152
-
153
- if updated.SelectedEpic != "E03" {
154
- t.Errorf("SelectedEpic = %q, want E03", updated.SelectedEpic)
155
- }
156
- if len(updated.Epics) != 1 || updated.Epics[0] != "E03" {
157
- t.Errorf("Epics = %v, want [E03]", updated.Epics)
158
- }
159
- if got := len(updated.Tasks[data.ColumnPlanned]); got != 1 {
160
- t.Fatalf("planned task count = %d, want 1", got)
161
- }
162
- if updated.Tasks[data.ColumnPlanned][0].ID != "T2" {
163
- t.Errorf("visible task = %q, want T2", updated.Tasks[data.ColumnPlanned][0].ID)
164
- }
165
- }
166
-
167
- func TestView_releaseDropdownKeepsBoardBehind(t *testing.T) {
168
- m := NewModel(nil, "v1", "E03")
169
- m.Width = 100
170
- m.Height = 24
171
- m.Overlay = OverlayRelease
172
- m.Releases = []string{"v1", "v2"}
173
- got := m.View()
174
- if !strings.Contains(got, "S A V E P O I N T") {
175
- t.Error("View() with OverlayRelease should keep board visible behind overlay")
176
- }
177
- }
@@ -1,77 +0,0 @@
1
- package board
2
-
3
- import (
4
- "strings"
5
- "testing"
6
-
7
- "github.com/charmbracelet/lipgloss"
8
- "github.com/muesli/termenv"
9
- "github.com/opencode/savepoint/internal/data"
10
- )
11
-
12
- func TestRenderPolicy_noBackgroundEscapes(t *testing.T) {
13
- lipgloss.SetColorProfile(termenv.ANSI256)
14
-
15
- task := data.Task{
16
- ID: "E05-tasking-permissions/T004-implement-m-hotkey",
17
- Title: "Implement router priority",
18
- Release: "v1.1",
19
- Epic: "E05-tasking-permissions",
20
- Column: data.ColumnInProgress,
21
- Stage: data.StageBuild,
22
- }
23
- m := NewModel([]data.Task{
24
- {
25
- ID: task.ID,
26
- Title: task.Title,
27
- Release: task.Release,
28
- Epic: task.Epic,
29
- Column: task.Column,
30
- Stage: task.Stage,
31
- },
32
- }, "v1.1", "E05-tasking-permissions")
33
- m.Width = 120
34
- m.Height = 30
35
- m.FocusedColumn = data.ColumnInProgress
36
- m.RouterState = &data.RouterState{
37
- State: "task-building",
38
- Release: "v1.1",
39
- Epic: "E05-tasking-permissions",
40
- Task: "E05-tasking-permissions/T004-implement-m-hotkey",
41
- NextAction: "Build E05-tasking-permissions/T004-implement-m-hotkey.",
42
- }
43
-
44
- cases := map[string]string{
45
- "board": m.View(),
46
- "card": RenderCard(task, 30, true, m.RouterState),
47
- "detail": RenderDetail(task, 60, m.RouterState, 0, 0),
48
- "epic dropdown": RenderEpicDropdown([]string{"E05-tasking-permissions"}, 0, 40),
49
- "release dropdown": RenderReleaseDropdown([]string{"v1.1"}, 0, 40),
50
- "help": RenderHelp(60),
51
- }
52
- for name, got := range cases {
53
- assertNoBackgroundEscapes(t, name, got)
54
- }
55
- }
56
-
57
- func assertNoBackgroundEscapes(t *testing.T, name, got string) {
58
- t.Helper()
59
- for _, escape := range []string{"\x1b[48;", "\x1b[40m"} {
60
- if strings.Contains(got, escape) {
61
- t.Fatalf("%s emitted background escape prefix %q in %q", name, escape, got)
62
- }
63
- }
64
- }
65
-
66
- func TestRenderPolicy_usesSingleLineBorders(t *testing.T) {
67
- m := NewModel([]data.Task{{ID: "T001", Title: "Task", Column: data.ColumnPlanned}}, "v1", "E01")
68
- m.Width = 120
69
- got := m.View()
70
-
71
- if strings.Contains(got, "╭") || strings.Contains(got, "╮") || strings.Contains(got, "╰") || strings.Contains(got, "╯") {
72
- t.Fatalf("View should use single-line borders, got rounded border glyphs in %q", got)
73
- }
74
- if !strings.Contains(got, "┌") || !strings.Contains(got, "┐") || !strings.Contains(got, "└") || !strings.Contains(got, "┘") {
75
- t.Fatalf("View missing expected single-line border glyphs in %q", got)
76
- }
77
- }
@@ -1,23 +0,0 @@
1
- package board
2
-
3
- import (
4
- "github.com/opencode/savepoint/internal/data"
5
- "github.com/opencode/savepoint/internal/styles"
6
- )
7
-
8
- const statusGlyphDefault = " "
9
-
10
- func statusGlyph(status string) string {
11
- switch status {
12
- case string(data.ColumnPlanned):
13
- return styles.CardMeta.Render("○")
14
- case string(data.ColumnInProgress):
15
- return styles.GlyphBuild.Render("▶")
16
- case string(data.ColumnDone):
17
- return styles.TagDone.Render("◉")
18
- case "audited":
19
- return styles.TagDone.Render("✓")
20
- default:
21
- return statusGlyphDefault
22
- }
23
- }
@@ -1,24 +0,0 @@
1
- package board
2
-
3
- import (
4
- "os"
5
-
6
- "github.com/charmbracelet/lipgloss"
7
- "github.com/muesli/termenv"
8
- )
9
-
10
- // applyColorProfile detects terminal color support and configures lipgloss.
11
- // Priority: NO_COLOR → COLORTERM env hint → termenv auto-detect.
12
- func applyColorProfile() {
13
- lipgloss.SetColorProfile(detectProfile())
14
- }
15
-
16
- func detectProfile() termenv.Profile {
17
- if os.Getenv("NO_COLOR") != "" {
18
- return termenv.Ascii
19
- }
20
- if c := os.Getenv("COLORTERM"); c == "truecolor" || c == "24bit" {
21
- return termenv.TrueColor
22
- }
23
- return termenv.ColorProfile()
24
- }
@@ -1,31 +0,0 @@
1
- package board
2
-
3
- import (
4
- "testing"
5
-
6
- "github.com/muesli/termenv"
7
- )
8
-
9
- func TestDetectProfileNOCOLOR(t *testing.T) {
10
- t.Setenv("NO_COLOR", "1")
11
- t.Setenv("COLORTERM", "")
12
- if got := detectProfile(); got != termenv.Ascii {
13
- t.Fatalf("want Ascii, got %v", got)
14
- }
15
- }
16
-
17
- func TestDetectProfileTruecolor(t *testing.T) {
18
- t.Setenv("NO_COLOR", "")
19
- t.Setenv("COLORTERM", "truecolor")
20
- if got := detectProfile(); got != termenv.TrueColor {
21
- t.Fatalf("want TrueColor, got %v", got)
22
- }
23
- }
24
-
25
- func TestDetectProfile24bit(t *testing.T) {
26
- t.Setenv("NO_COLOR", "")
27
- t.Setenv("COLORTERM", "24bit")
28
- if got := detectProfile(); got != termenv.TrueColor {
29
- t.Fatalf("want TrueColor, got %v", got)
30
- }
31
- }
@@ -1,113 +0,0 @@
1
- package board
2
-
3
- import (
4
- "fmt"
5
-
6
- "github.com/opencode/savepoint/internal/data"
7
- )
8
-
9
- // Advance moves a task forward through the phase lifecycle.
10
- func Advance(t *data.Task) {
11
- stage := t.Stage
12
- if stage == "" {
13
- stage = data.StageBuild
14
- }
15
- switch t.Column {
16
- case data.ColumnPlanned:
17
- t.Column = data.ColumnInProgress
18
- t.Stage = data.StageBuild
19
- case data.ColumnInProgress:
20
- switch stage {
21
- case data.StageBuild:
22
- t.Stage = data.StageTest
23
- case data.StageTest:
24
- t.Stage = data.StageAudit
25
- case data.StageAudit:
26
- t.Column = data.ColumnDone
27
- t.Stage = ""
28
- }
29
- }
30
- t.Status = string(t.Column)
31
- }
32
-
33
- // Retreat moves a task backward through the phase lifecycle.
34
- func Retreat(t *data.Task) {
35
- stage := t.Stage
36
- if stage == "" {
37
- stage = data.StageBuild
38
- }
39
- switch t.Column {
40
- case data.ColumnDone:
41
- t.Column = data.ColumnInProgress
42
- t.Stage = data.StageAudit
43
- case data.ColumnInProgress:
44
- switch stage {
45
- case data.StageAudit:
46
- t.Stage = data.StageTest
47
- case data.StageTest:
48
- t.Stage = data.StageBuild
49
- case data.StageBuild:
50
- t.Column = data.ColumnPlanned
51
- t.Stage = ""
52
- }
53
- }
54
- t.Status = string(t.Column)
55
- }
56
-
57
- func taskTransitionMessage(prefix string, task data.Task) string {
58
- if task.Column == data.ColumnInProgress {
59
- return fmt.Sprintf("%s %s to %s", prefix, shortID(task.ID), task.Stage)
60
- }
61
- return fmt.Sprintf("%s %s to %s", prefix, shortID(task.ID), task.Column)
62
- }
63
-
64
- // CanAdvance checks whether a task is allowed to advance to its next phase.
65
- // It validates phase adjacency and dependency completion.
66
- // Returns (true, "") if allowed, or (false, reason) if blocked.
67
- func CanAdvance(t *data.Task, allTasks []data.Task) (bool, string) {
68
- switch t.Column {
69
- case data.ColumnPlanned:
70
- return dependenciesDone(t, allTasks)
71
- case data.ColumnInProgress:
72
- stage := t.Stage
73
- if stage == "" {
74
- stage = data.StageBuild
75
- }
76
- switch stage {
77
- case data.StageBuild:
78
- return true, ""
79
- case data.StageTest:
80
- return true, ""
81
- case data.StageAudit:
82
- return dependenciesDone(t, allTasks)
83
- default:
84
- return false, fmt.Sprintf("unknown stage %q", stage)
85
- }
86
- case data.ColumnDone:
87
- return false, "task is already done"
88
- default:
89
- return false, fmt.Sprintf("unknown column %q", t.Column)
90
- }
91
- }
92
-
93
- func dependenciesDone(t *data.Task, allTasks []data.Task) (bool, string) {
94
- for _, depID := range t.DependsOn {
95
- dep := findTask(depID, allTasks)
96
- if dep == nil {
97
- return false, fmt.Sprintf("dependency %q not found", depID)
98
- }
99
- if dep.Column != data.ColumnDone {
100
- return false, fmt.Sprintf("dependency %q is not done", depID)
101
- }
102
- }
103
- return true, ""
104
- }
105
-
106
- func findTask(id string, tasks []data.Task) *data.Task {
107
- for i := range tasks {
108
- if tasks[i].ID == id {
109
- return &tasks[i]
110
- }
111
- }
112
- return nil
113
- }
@@ -1,164 +0,0 @@
1
- package board
2
-
3
- import (
4
- "testing"
5
-
6
- "github.com/opencode/savepoint/internal/data"
7
- )
8
-
9
- func TestAdvance(t *testing.T) {
10
- tests := []struct {
11
- name string
12
- initialCol data.ColumnType
13
- initialSt data.ProgressStage
14
- expectCol data.ColumnType
15
- expectSt data.ProgressStage
16
- }{
17
- {"planned to in_progress/build", data.ColumnPlanned, "", data.ColumnInProgress, data.StageBuild},
18
- {"in_progress/build to test", data.ColumnInProgress, data.StageBuild, data.ColumnInProgress, data.StageTest},
19
- {"in_progress/test to audit", data.ColumnInProgress, data.StageTest, data.ColumnInProgress, data.StageAudit},
20
- {"in_progress/audit to done", data.ColumnInProgress, data.StageAudit, data.ColumnDone, ""},
21
- }
22
-
23
- for _, tt := range tests {
24
- t.Run(tt.name, func(t *testing.T) {
25
- task := data.Task{Column: tt.initialCol, Stage: tt.initialSt}
26
- Advance(&task)
27
- if task.Column != tt.expectCol || task.Stage != tt.expectSt {
28
- t.Errorf("Advance() = %v/%v, want %v/%v", task.Column, task.Stage, tt.expectCol, tt.expectSt)
29
- }
30
- if task.Status != string(tt.expectCol) {
31
- t.Errorf("Advance() status = %q, want %q", task.Status, tt.expectCol)
32
- }
33
- })
34
- }
35
- }
36
-
37
- func TestRetreat(t *testing.T) {
38
- tests := []struct {
39
- name string
40
- initialCol data.ColumnType
41
- initialSt data.ProgressStage
42
- expectCol data.ColumnType
43
- expectSt data.ProgressStage
44
- }{
45
- {"done to in_progress/audit", data.ColumnDone, "", data.ColumnInProgress, data.StageAudit},
46
- {"in_progress/audit to test", data.ColumnInProgress, data.StageAudit, data.ColumnInProgress, data.StageTest},
47
- {"in_progress/test to build", data.ColumnInProgress, data.StageTest, data.ColumnInProgress, data.StageBuild},
48
- {"in_progress/build to planned", data.ColumnInProgress, data.StageBuild, data.ColumnPlanned, ""},
49
- }
50
-
51
- for _, tt := range tests {
52
- t.Run(tt.name, func(t *testing.T) {
53
- task := data.Task{Status: string(tt.initialCol), Column: tt.initialCol, Stage: tt.initialSt}
54
- Retreat(&task)
55
- if task.Column != tt.expectCol || task.Stage != tt.expectSt {
56
- t.Errorf("Retreat() = %v/%v, want %v/%v", task.Column, task.Stage, tt.expectCol, tt.expectSt)
57
- }
58
- if task.Status != string(tt.expectCol) {
59
- t.Errorf("Retreat() status = %q, want %q", task.Status, tt.expectCol)
60
- }
61
- })
62
- }
63
- }
64
-
65
- func TestCanAdvance_plannedAllowedWhenDependenciesDone(t *testing.T) {
66
- allTasks := []data.Task{
67
- {ID: "T1", Column: data.ColumnPlanned, DependsOn: []string{"T2"}},
68
- {ID: "T2", Column: data.ColumnDone},
69
- }
70
- ok, reason := CanAdvance(&allTasks[0], allTasks)
71
- if !ok {
72
- t.Errorf("CanAdvance(planned with done dep) = false %q, want true", reason)
73
- }
74
- }
75
-
76
- func TestCanAdvance_plannedBlockedByDependency(t *testing.T) {
77
- allTasks := []data.Task{
78
- {ID: "T1", Column: data.ColumnPlanned, DependsOn: []string{"T2"}},
79
- {ID: "T2", Column: data.ColumnInProgress},
80
- }
81
- ok, reason := CanAdvance(&allTasks[0], allTasks)
82
- if ok {
83
- t.Fatal("CanAdvance(planned with unfinished dep) = true, want false")
84
- }
85
- if reason != "dependency \"T2\" is not done" {
86
- t.Errorf("reason = %q, want dependency warning", reason)
87
- }
88
- }
89
-
90
- func TestCanAdvance_buildAlwaysAllowed(t *testing.T) {
91
- task := data.Task{ID: "T1", Column: data.ColumnInProgress, Stage: data.StageBuild}
92
- ok, reason := CanAdvance(&task, nil)
93
- if !ok {
94
- t.Errorf("CanAdvance(build) = false %q, want true", reason)
95
- }
96
- }
97
-
98
- func TestCanAdvance_testAlwaysAllowed(t *testing.T) {
99
- task := data.Task{ID: "T1", Column: data.ColumnInProgress, Stage: data.StageTest}
100
- ok, reason := CanAdvance(&task, nil)
101
- if !ok {
102
- t.Errorf("CanAdvance(test) = false %q, want true", reason)
103
- }
104
- }
105
-
106
- func TestCanAdvance_auditDoneBlockedByDependency(t *testing.T) {
107
- allTasks := []data.Task{
108
- {ID: "T1", Column: data.ColumnInProgress, Stage: data.StageAudit, DependsOn: []string{"T2"}},
109
- {ID: "T2", Column: data.ColumnInProgress, Stage: data.StageBuild},
110
- }
111
- ok, reason := CanAdvance(&allTasks[0], allTasks)
112
- if ok {
113
- t.Fatal("CanAdvance(audit with undep) = true, want false")
114
- }
115
- if reason == "" {
116
- t.Fatal("expected non-empty reason string")
117
- }
118
- }
119
-
120
- func TestCanAdvance_auditDoneAllowedWhenDepsDone(t *testing.T) {
121
- allTasks := []data.Task{
122
- {ID: "T1", Column: data.ColumnInProgress, Stage: data.StageAudit, DependsOn: []string{"T2"}},
123
- {ID: "T2", Column: data.ColumnDone},
124
- }
125
- ok, reason := CanAdvance(&allTasks[0], allTasks)
126
- if !ok {
127
- t.Errorf("CanAdvance(audit with dep done) = false %q, want true", reason)
128
- }
129
- }
130
-
131
- func TestCanAdvance_doneBlocked(t *testing.T) {
132
- task := data.Task{ID: "T1", Column: data.ColumnDone}
133
- ok, reason := CanAdvance(&task, nil)
134
- if ok {
135
- t.Fatal("CanAdvance(done) = true, want false")
136
- }
137
- if reason == "" {
138
- t.Fatal("expected non-empty reason string")
139
- }
140
- }
141
-
142
- func TestCanAdvance_unknownStageBlocked(t *testing.T) {
143
- task := data.Task{ID: "T1", Column: data.ColumnInProgress, Stage: "invalid"}
144
- ok, reason := CanAdvance(&task, nil)
145
- if ok {
146
- t.Fatal("CanAdvance(unknown stage) = true, want false")
147
- }
148
- if reason == "" {
149
- t.Fatal("expected non-empty reason string")
150
- }
151
- }
152
-
153
- func TestCanAdvance_auditDepsNotFoundBlocked(t *testing.T) {
154
- allTasks := []data.Task{
155
- {ID: "T1", Column: data.ColumnInProgress, Stage: data.StageAudit, DependsOn: []string{"T2"}},
156
- }
157
- ok, reason := CanAdvance(&allTasks[0], allTasks)
158
- if ok {
159
- t.Fatal("CanAdvance(audit missing dep) = true, want false")
160
- }
161
- if reason == "" {
162
- t.Fatal("expected non-empty reason string")
163
- }
164
- }
@@ -1,32 +0,0 @@
1
- package board
2
-
3
- import (
4
- "fmt"
5
- "os"
6
- "path/filepath"
7
-
8
- tea "github.com/charmbracelet/bubbletea"
9
- )
10
-
11
- // RunTUI launches the Bubble Tea board with optional release/epic filters.
12
- func RunTUI(release, epic string) error {
13
- model, err := newProjectModel(".", release, epic)
14
- if err != nil {
15
- return err
16
- }
17
-
18
- cfg, err := model.Dependencies.ConfigReader.Read(filepath.Join(model.Root, "config.yml"))
19
- if err != nil {
20
- return err
21
- }
22
- model.Theme = cfg.Theme
23
-
24
- applyColorProfile()
25
-
26
- p := tea.NewProgram(model, tea.WithAltScreen())
27
- if _, err := p.Run(); err != nil {
28
- fmt.Fprintf(os.Stderr, "Error: %v\n", err)
29
- return err
30
- }
31
- return nil
32
- }