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,243 +0,0 @@
1
- package data
2
-
3
- import (
4
- "fmt"
5
- "strings"
6
-
7
- "gopkg.in/yaml.v3"
8
- )
9
-
10
- type Parser struct{}
11
-
12
- func NewParser() *Parser {
13
- return &Parser{}
14
- }
15
-
16
- func (p *Parser) ParseFrontmatter(content string) (map[string]any, error) {
17
- frontmatter, err := extractFrontmatter(content)
18
- if err != nil {
19
- return nil, err
20
- }
21
-
22
- var result map[string]any
23
- if err := yaml.Unmarshal([]byte(frontmatter), &result); err != nil {
24
- return nil, fmt.Errorf("failed to parse YAML: %w", err)
25
- }
26
-
27
- return result, nil
28
- }
29
-
30
- func (p *Parser) ParseTaskFile(path string, content string) (*Task, error) {
31
- frontmatter, err := extractFrontmatter(content)
32
- if err != nil {
33
- return nil, fmt.Errorf("parse error for %s: %w", path, err)
34
- }
35
-
36
- var fields taskFrontmatter
37
- if err := yaml.Unmarshal([]byte(frontmatter), &fields); err != nil {
38
- return nil, fmt.Errorf("parse error for %s: failed to parse YAML: %w", path, err)
39
- }
40
-
41
- rawColumn := firstColumn(fields.Column, fields.Status)
42
- task := &Task{
43
- ID: fields.ID,
44
- Title: firstNonEmpty(fields.Title, fields.Objective),
45
- Description: fields.Description,
46
- Epic: firstNonEmpty(fields.Epic, extractEpicFromID(fields.ID)),
47
- Release: firstNonEmpty(fields.Release, "v1"),
48
- Column: normalizeColumn(rawColumn),
49
- Stage: firstStage(fields.Phase, fields.Stage),
50
- Priority: fields.Priority,
51
- Points: fields.Points,
52
- Tags: fields.Tags,
53
- Acceptance: firstList(fields.Acceptance, extractChecklistSection(content, "## Acceptance Criteria")),
54
- Checklist: extractChecklistItems(content, "## Implementation Plan"),
55
- Notes: fields.Notes,
56
- DependsOn: fields.DependsOn,
57
- Progress: fields.Progress,
58
- }
59
-
60
- if err := validateParsedTaskLifecycle(rawColumn, *task); err != nil {
61
- return nil, fmt.Errorf("parse error for %s: %w", path, err)
62
- }
63
-
64
- if task.Column == ColumnInProgress && task.Stage == "" {
65
- task.Stage = StageBuild
66
- }
67
-
68
- return task, nil
69
- }
70
-
71
- type taskFrontmatter struct {
72
- ID string `yaml:"id"`
73
- Title string `yaml:"title"`
74
- Objective string `yaml:"objective"`
75
- Description string `yaml:"description"`
76
- Epic string `yaml:"epic"`
77
- Release string `yaml:"release"`
78
- Status ColumnType `yaml:"status"`
79
- Column ColumnType `yaml:"column"`
80
- Phase ProgressStage `yaml:"phase"`
81
- Stage ProgressStage `yaml:"stage"`
82
- Priority string `yaml:"priority"`
83
- Points int `yaml:"points"`
84
- Tags []string `yaml:"tags"`
85
- Acceptance []string `yaml:"acceptance"`
86
- Notes string `yaml:"notes"`
87
- DependsOn []string `yaml:"depends_on"`
88
- Progress Progress `yaml:"progress"`
89
- }
90
-
91
- // normalizeLineEndings replaces Windows (CRLF) and legacy Mac (CR) line endings with LF.
92
- func normalizeLineEndings(s string) string {
93
- s = strings.ReplaceAll(s, "\r\n", "\n")
94
- return strings.ReplaceAll(s, "\r", "\n")
95
- }
96
-
97
- func extractFrontmatter(content string) (string, error) {
98
- normalized := normalizeLineEndings(content)
99
- if !strings.HasPrefix(normalized, "---\n") {
100
- return "", ErrNoFrontmatter
101
- }
102
-
103
- end := strings.Index(normalized[len("---\n"):], "\n---")
104
- if end == -1 {
105
- return "", ErrNoClosingFrontmatter
106
- }
107
-
108
- return strings.TrimSpace(normalized[len("---\n") : len("---\n")+end]), nil
109
- }
110
-
111
- func extractEpicFromID(id string) string {
112
- parts := strings.Split(id, "/")
113
- if len(parts) >= 1 {
114
- return parts[0]
115
- }
116
- return ""
117
- }
118
-
119
- func firstNonEmpty(values ...string) string {
120
- for _, value := range values {
121
- if value != "" {
122
- return value
123
- }
124
- }
125
- return ""
126
- }
127
-
128
- func firstColumn(values ...ColumnType) ColumnType {
129
- for _, value := range values {
130
- if value != "" {
131
- return value
132
- }
133
- }
134
- return ""
135
- }
136
-
137
- func normalizeColumn(value ColumnType) ColumnType {
138
- switch value {
139
- case "", legacyTodoColumn:
140
- return ColumnPlanned
141
- case ColumnPlanned, ColumnInProgress, ColumnDone:
142
- return value
143
- default:
144
- return value
145
- }
146
- }
147
-
148
- const legacyTodoColumn ColumnType = "todo"
149
-
150
- func validateParsedTaskLifecycle(rawColumn ColumnType, task Task) error {
151
- if rawColumn != "" && rawColumn != legacyTodoColumn && !IsCanonicalColumn(rawColumn) {
152
- return fmt.Errorf("invalid task status %q: use planned, in_progress, or done. Add 'status: planned' or 'status: in_progress' to task frontmatter", rawColumn)
153
- }
154
- if task.Column == ColumnInProgress && !IsCanonicalStage(task.Stage) && task.Stage != "" {
155
- return fmt.Errorf("invalid phase %q: use build, test, or audit. Add 'phase: build' to task frontmatter", task.Stage)
156
- }
157
- if task.Column != ColumnInProgress && task.Stage != "" {
158
- return nil
159
- }
160
- return nil
161
- }
162
-
163
- func firstStage(values ...ProgressStage) ProgressStage {
164
- for _, value := range values {
165
- if value != "" {
166
- return value
167
- }
168
- }
169
- return ""
170
- }
171
-
172
- func firstList(values ...[]string) []string {
173
- for _, value := range values {
174
- if len(value) > 0 {
175
- return value
176
- }
177
- }
178
- return nil
179
- }
180
-
181
- func extractChecklistItems(content, heading string) []CheckItem {
182
- normalized := normalizeLineEndings(content)
183
- start := strings.Index(normalized, heading)
184
- if start == -1 {
185
- return nil
186
- }
187
-
188
- section := normalized[start+len(heading):]
189
- if next := strings.Index(section, "\n## "); next != -1 {
190
- section = section[:next]
191
- }
192
-
193
- items := []CheckItem{}
194
- var current *CheckItem
195
- for _, line := range strings.Split(section, "\n") {
196
- trimmed := strings.TrimSpace(line)
197
- if strings.HasPrefix(trimmed, "- [x] ") {
198
- items = append(items, CheckItem{Text: strings.TrimSpace(trimmed[6:]), Done: true})
199
- current = &items[len(items)-1]
200
- continue
201
- }
202
- if strings.HasPrefix(trimmed, "- [ ] ") {
203
- items = append(items, CheckItem{Text: strings.TrimSpace(trimmed[6:]), Done: false})
204
- current = &items[len(items)-1]
205
- continue
206
- }
207
- if strings.HasPrefix(trimmed, "- ") {
208
- items = append(items, CheckItem{Text: strings.TrimSpace(trimmed[2:]), Done: false})
209
- current = &items[len(items)-1]
210
- continue
211
- }
212
- if trimmed != "" && current != nil {
213
- current.Text = strings.TrimSpace(current.Text + " " + trimmed)
214
- }
215
- }
216
- return items
217
- }
218
-
219
- func extractChecklistSection(content, heading string) []string {
220
- normalized := normalizeLineEndings(content)
221
- start := strings.Index(normalized, heading)
222
- if start == -1 {
223
- return nil
224
- }
225
-
226
- section := normalized[start+len(heading):]
227
- if next := strings.Index(section, "\n## "); next != -1 {
228
- section = section[:next]
229
- }
230
-
231
- items := []string{}
232
- for _, line := range strings.Split(section, "\n") {
233
- trimmed := strings.TrimSpace(line)
234
- if strings.HasPrefix(trimmed, "- [ ] ") || strings.HasPrefix(trimmed, "- [x] ") {
235
- items = append(items, strings.TrimSpace(trimmed[6:]))
236
- continue
237
- }
238
- if strings.HasPrefix(trimmed, "- ") {
239
- items = append(items, strings.TrimSpace(trimmed[2:]))
240
- }
241
- }
242
- return items
243
- }
@@ -1,281 +0,0 @@
1
- package data
2
-
3
- import (
4
- "testing"
5
- )
6
-
7
- func TestParseFrontmatter(t *testing.T) {
8
- p := NewParser()
9
- content := `---
10
- id: E01/T001
11
- status: done
12
- objective: "Test objective"
13
- depends_on: []
14
- ---
15
-
16
- body content here`
17
-
18
- result, err := p.ParseFrontmatter(content)
19
- if err != nil {
20
- t.Fatalf("ParseFrontmatter() error = %v", err)
21
- }
22
-
23
- if result["id"] != "E01/T001" {
24
- t.Errorf("ParseFrontmatter() id = %v, want E01/T001", result["id"])
25
- }
26
- if result["objective"] != "Test objective" {
27
- t.Errorf("ParseFrontmatter() objective = %v, want Test objective", result["objective"])
28
- }
29
- }
30
-
31
- func TestParseFrontmatterMissing(t *testing.T) {
32
- p := NewParser()
33
- content := `# No frontmatter here`
34
-
35
- _, err := p.ParseFrontmatter(content)
36
- if err == nil {
37
- t.Error("ParseFrontmatter() expected error for missing frontmatter")
38
- }
39
- }
40
-
41
- func TestParseFrontmatterMalformedYAML(t *testing.T) {
42
- p := NewParser()
43
- content := `---
44
- id: [broken
45
- ---
46
-
47
- # Task description`
48
-
49
- _, err := p.ParseFrontmatter(content)
50
- if err == nil {
51
- t.Fatal("ParseFrontmatter() expected malformed YAML error")
52
- }
53
- }
54
-
55
- func TestParseTaskFile(t *testing.T) {
56
- p := NewParser()
57
- content := `---
58
- id: E02/T001
59
- status: in_progress
60
- phase: test
61
- objective: "Define Task struct"
62
- description: "Build the task model"
63
- priority: high
64
- points: 3
65
- tags: [data, parser]
66
- acceptance:
67
- - parses metadata
68
- notes: "Keep it small"
69
- depends_on: [E01/T003]
70
- ---
71
-
72
- # Task description`
73
-
74
- task, err := p.ParseTaskFile("test.md", content)
75
- if err != nil {
76
- t.Fatalf("ParseTaskFile() error = %v", err)
77
- }
78
-
79
- if task.ID != "E02/T001" {
80
- t.Errorf("Task.ID = %v, want E02/T001", task.ID)
81
- }
82
- if task.Title != "Define Task struct" {
83
- t.Errorf("Task.Title = %v, want Define Task struct", task.Title)
84
- }
85
- if task.Epic != "E02" {
86
- t.Errorf("Task.Epic = %v, want E02", task.Epic)
87
- }
88
- if task.Release != "v1" {
89
- t.Errorf("Task.Release = %v, want v1", task.Release)
90
- }
91
- if task.Column != ColumnInProgress {
92
- t.Errorf("Task.Column = %v, want %v", task.Column, ColumnInProgress)
93
- }
94
- if task.Stage != StageTest {
95
- t.Errorf("Task.Stage = %v, want %v", task.Stage, StageTest)
96
- }
97
- if len(task.DependsOn) != 1 || task.DependsOn[0] != "E01/T003" {
98
- t.Errorf("Task.DependsOn = %v, want [E01/T003]", task.DependsOn)
99
- }
100
- if task.Priority != "high" || task.Points != 3 {
101
- t.Errorf("Task priority/points = %v/%v, want high/3", task.Priority, task.Points)
102
- }
103
- if len(task.Tags) != 2 || task.Tags[0] != "data" || task.Tags[1] != "parser" {
104
- t.Errorf("Task.Tags = %v, want [data parser]", task.Tags)
105
- }
106
- if len(task.Acceptance) != 1 || task.Acceptance[0] != "parses metadata" {
107
- t.Errorf("Task.Acceptance = %v, want [parses metadata]", task.Acceptance)
108
- }
109
- if task.Notes != "Keep it small" {
110
- t.Errorf("Task.Notes = %v, want Keep it small", task.Notes)
111
- }
112
- }
113
-
114
- func TestParseTaskFile_normalizesLegacyTodoStatusToPlanned(t *testing.T) {
115
- p := NewParser()
116
- content := `---
117
- id: E06/T001
118
- status: todo
119
- objective: "Style the board"
120
- ---
121
-
122
- # Task`
123
-
124
- task, err := p.ParseTaskFile("test.md", content)
125
- if err != nil {
126
- t.Fatalf("ParseTaskFile() error = %v", err)
127
- }
128
- if task.Column != ColumnPlanned {
129
- t.Errorf("Task.Column = %v, want %v", task.Column, ColumnPlanned)
130
- }
131
- }
132
-
133
- func TestParseTaskFile_rejectsUnknownStatus(t *testing.T) {
134
- p := NewParser()
135
- content := `---
136
- id: E06/T001
137
- status: review
138
- objective: "Style the board"
139
- ---
140
-
141
- # Task`
142
-
143
- _, err := p.ParseTaskFile("test.md", content)
144
- if err == nil {
145
- t.Fatal("ParseTaskFile() expected unknown status error")
146
- }
147
- }
148
-
149
- func TestParseTaskFile_allowsPhaseOutsideInProgress(t *testing.T) {
150
- p := NewParser()
151
- content := `---
152
- id: E06/T001
153
- status: planned
154
- phase: build
155
- objective: "Style the board"
156
- ---
157
-
158
- # Task`
159
-
160
- _, err := p.ParseTaskFile("test.md", content)
161
- if err != nil {
162
- t.Fatalf("ParseTaskFile() error = %v, want no error for legacy phase field", err)
163
- }
164
- }
165
-
166
- func TestParseTaskFile_includesDefaultBuildForInProgress(t *testing.T) {
167
- p := NewParser()
168
- content := `---
169
- id: E06/T001
170
- status: in_progress
171
- objective: "Style the board"
172
- ---
173
-
174
- # Task`
175
-
176
- task, err := p.ParseTaskFile("test.md", content)
177
- if err != nil {
178
- t.Fatalf("ParseTaskFile() error = %v", err)
179
- }
180
- if task.Stage != StageBuild {
181
- t.Fatalf("ParseTaskFile() expected StageBuild default, got %q", task.Stage)
182
- }
183
- }
184
-
185
- func TestParseTaskFile_prefersPhaseOverLegacyStage(t *testing.T) {
186
- p := NewParser()
187
- content := `---
188
- id: E06/T001
189
- status: in_progress
190
- stage: build
191
- phase: test
192
- objective: "Style the board"
193
- ---
194
-
195
- # Task`
196
-
197
- task, err := p.ParseTaskFile("test.md", content)
198
- if err != nil {
199
- t.Fatalf("ParseTaskFile() error = %v", err)
200
- }
201
- if task.Stage != StageTest {
202
- t.Fatalf("Task.Stage = %q, want test from phase", task.Stage)
203
- }
204
- }
205
-
206
- func TestParseTaskFile_extractsMarkdownAcceptanceAndChecklist(t *testing.T) {
207
- p := NewParser()
208
- content := `---
209
- id: E06/T001
210
- status: planned
211
- objective: "Style the board"
212
- ---
213
-
214
- # Task
215
-
216
- ## Acceptance Criteria
217
-
218
- - First criterion.
219
- - Second criterion.
220
-
221
- ## Implementation Plan
222
-
223
- - [ ] First checklist item.
224
- - [x] Second checklist item.
225
-
226
- ## Context Log
227
-
228
- Notes here.`
229
-
230
- task, err := p.ParseTaskFile("test.md", content)
231
- if err != nil {
232
- t.Fatalf("ParseTaskFile() error = %v", err)
233
- }
234
- if len(task.Acceptance) != 2 || task.Acceptance[0] != "First criterion." || task.Acceptance[1] != "Second criterion." {
235
- t.Errorf("Task.Acceptance = %v, want markdown criteria", task.Acceptance)
236
- }
237
- if len(task.Checklist) != 2 {
238
- t.Fatalf("Task.Checklist len = %d, want 2", len(task.Checklist))
239
- }
240
- if task.Checklist[0].Text != "First checklist item." || task.Checklist[0].Done {
241
- t.Errorf("Task.Checklist[0] = %+v, want {Text:\"First checklist item.\", Done:false}", task.Checklist[0])
242
- }
243
- if task.Checklist[1].Text != "Second checklist item." || !task.Checklist[1].Done {
244
- t.Errorf("Task.Checklist[1] = %+v, want {Text:\"Second checklist item.\", Done:true}", task.Checklist[1])
245
- }
246
- }
247
-
248
- func TestParseTaskFile_joinsHardWrappedChecklistItems(t *testing.T) {
249
- p := NewParser()
250
- content := `---
251
- id: E06/T001
252
- status: planned
253
- objective: "Style the board"
254
- ---
255
-
256
- # Task
257
-
258
- ## Implementation Plan
259
-
260
- - [ ] First sentence spans across a hard markdown line break
261
- before it ends. Second sentence stays in the same checklist item.
262
- - [x] Already checked sentence wraps
263
- without becoming another checklist item.
264
- `
265
-
266
- task, err := p.ParseTaskFile("test.md", content)
267
- if err != nil {
268
- t.Fatalf("ParseTaskFile() error = %v", err)
269
- }
270
- if len(task.Checklist) != 2 {
271
- t.Fatalf("Task.Checklist len = %d, want 2", len(task.Checklist))
272
- }
273
- wantFirst := "First sentence spans across a hard markdown line break before it ends. Second sentence stays in the same checklist item."
274
- if task.Checklist[0].Text != wantFirst || task.Checklist[0].Done {
275
- t.Errorf("Task.Checklist[0] = %+v, want text %q and Done=false", task.Checklist[0], wantFirst)
276
- }
277
- wantSecond := "Already checked sentence wraps without becoming another checklist item."
278
- if task.Checklist[1].Text != wantSecond || !task.Checklist[1].Done {
279
- t.Errorf("Task.Checklist[1] = %+v, want text %q and Done=true", task.Checklist[1], wantSecond)
280
- }
281
- }
@@ -1,52 +0,0 @@
1
- package data
2
-
3
- import (
4
- "fmt"
5
- "strings"
6
-
7
- "gopkg.in/yaml.v3"
8
- )
9
-
10
- const stateBlockStart = "## Current state"
11
- const stateBlockEnd = "```"
12
-
13
- type RouterState struct {
14
- State string `yaml:"state"`
15
- Release string `yaml:"release"`
16
- Epic string `yaml:"epic"`
17
- Task string `yaml:"task"`
18
- NextAction string `yaml:"next_action"`
19
- }
20
-
21
- type RouterReader struct{}
22
-
23
- func NewRouterReader() *RouterReader {
24
- return &RouterReader{}
25
- }
26
-
27
- func (r *RouterReader) ReadState(content string) (*RouterState, error) {
28
- startIdx := strings.Index(content, stateBlockStart)
29
- if startIdx == -1 {
30
- return nil, fmt.Errorf("no Current state block found")
31
- }
32
-
33
- yamlStart := strings.Index(content[startIdx:], "```yaml")
34
- if yamlStart == -1 {
35
- return nil, fmt.Errorf("no yaml code block found")
36
- }
37
-
38
- yamlStart += startIdx + len("```yaml")
39
- yamlEnd := strings.Index(content[yamlStart:], "```")
40
- if yamlEnd == -1 {
41
- return nil, fmt.Errorf("no closing code block found")
42
- }
43
-
44
- yamlContent := strings.TrimSpace(content[yamlStart : yamlStart+yamlEnd])
45
-
46
- var state RouterState
47
- if err := yaml.Unmarshal([]byte(yamlContent), &state); err != nil {
48
- return nil, fmt.Errorf("failed to parse router YAML: %w", err)
49
- }
50
-
51
- return &state, nil
52
- }
@@ -1,35 +0,0 @@
1
- package data
2
-
3
- import (
4
- "testing"
5
- )
6
-
7
- func TestRouterReaderReadState(t *testing.T) {
8
- r := NewRouterReader()
9
- content := "## Current state\n\n```yaml\nstate: building\nrelease: v1\nepic: E01-go-setup\ntask: E01-go-setup/T002-entrypoint\nnext_action: \"Start T002-entrypoint\"\n```\n"
10
-
11
- state, err := r.ReadState(content)
12
- if err != nil {
13
- t.Fatalf("ReadState() error = %v", err)
14
- }
15
-
16
- if state.State != "building" {
17
- t.Errorf("State = %v, want building", state.State)
18
- }
19
- if state.Epic != "E01-go-setup" {
20
- t.Errorf("Epic = %v, want E01-go-setup", state.Epic)
21
- }
22
- if state.Task != "E01-go-setup/T002-entrypoint" {
23
- t.Errorf("Task = %v, want E01-go-setup/T002-entrypoint", state.Task)
24
- }
25
- }
26
-
27
- func TestRouterReaderMissing(t *testing.T) {
28
- r := NewRouterReader()
29
- content := "# No state block here"
30
-
31
- _, err := r.ReadState(content)
32
- if err == nil {
33
- t.Error("ReadState() expected error for missing state block")
34
- }
35
- }
@@ -1,57 +0,0 @@
1
- package data
2
-
3
- import (
4
- "fmt"
5
- "time"
6
- )
7
-
8
- type CheckItem struct {
9
- Text string
10
- Done bool
11
- }
12
-
13
- type ColumnType string
14
-
15
- const (
16
- ColumnPlanned ColumnType = "planned"
17
- ColumnInProgress ColumnType = "in_progress"
18
- ColumnDone ColumnType = "done"
19
- )
20
-
21
- type ProgressStage string
22
-
23
- const (
24
- StageBuild ProgressStage = "build"
25
- StageTest ProgressStage = "test"
26
- StageAudit ProgressStage = "audit"
27
- )
28
-
29
- type Progress struct {
30
- Stage ProgressStage `yaml:"stage"`
31
- Started bool `yaml:"started"`
32
- }
33
-
34
- type Task struct {
35
- ID string `yaml:"id"`
36
- Title string `yaml:"title"`
37
- Description string `yaml:"description,omitempty"`
38
- Status string `yaml:"status,omitempty"`
39
- Epic string `yaml:"epic"`
40
- Release string `yaml:"release"`
41
- Column ColumnType `yaml:"column"`
42
- Stage ProgressStage `yaml:"stage,omitempty"`
43
- Priority string `yaml:"priority,omitempty"`
44
- Points int `yaml:"points,omitempty"`
45
- Tags []string `yaml:"tags,omitempty"`
46
- Acceptance []string `yaml:"acceptance,omitempty"`
47
- Checklist []CheckItem `yaml:"checklist,omitempty"`
48
- Notes string `yaml:"notes,omitempty"`
49
- DependsOn []string `yaml:"depends_on,omitempty"`
50
- Progress Progress `yaml:"progress,omitempty"`
51
- Path string `yaml:"-"`
52
- Mtime time.Time `yaml:"-"`
53
- }
54
-
55
- func (t Task) String() string {
56
- return fmt.Sprintf("Task(%s)", t.ID)
57
- }