savepoint 1.0.3 → 1.0.6

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 (418) hide show
  1. package/package.json +10 -3
  2. package/{savepoint → savepoint.exe} +0 -0
  3. package/.claude/settings.local.json +0 -38
  4. package/.golangci.yml +0 -11
  5. package/.prettierignore +0 -4
  6. package/.savepoint/Design.md +0 -206
  7. package/.savepoint/PRD.md +0 -58
  8. package/.savepoint/config.yml +0 -27
  9. package/.savepoint/releases/v1/epics/E01-go-setup/E01-Detail.md +0 -39
  10. package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T001-init-module.md +0 -42
  11. package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T002-entrypoint.md +0 -23
  12. package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T003-directory-structure.md +0 -24
  13. package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T004-makefile.md +0 -23
  14. package/.savepoint/releases/v1/epics/E02-data-readers/E02-Detail.md +0 -61
  15. package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T001-task-struct.md +0 -29
  16. package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T002-frontmatter-parser.md +0 -30
  17. package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T003-router-reader.md +0 -29
  18. package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T004-config-reader.md +0 -29
  19. package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T005-discovery.md +0 -30
  20. package/.savepoint/releases/v1/epics/E03-board-tui-core/E03-Detail.md +0 -38
  21. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T001-model.md +0 -29
  22. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T002-update-loop.md +0 -30
  23. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T003-view.md +0 -34
  24. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T004-styles.md +0 -29
  25. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T005-layout.md +0 -42
  26. package/.savepoint/releases/v1/epics/E04-board-components/E04-Detail.md +0 -44
  27. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T001-column.md +0 -34
  28. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T002-card.md +0 -33
  29. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T003-epic-panel.md +0 -49
  30. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T004-detail-overlay.md +0 -40
  31. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T005-release-dropdown.md +0 -33
  32. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T006-help-overlay.md +0 -34
  33. package/.savepoint/releases/v1/epics/E05-phase-transitions/E05-Detail.md +0 -38
  34. package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T001-phase-stepping.md +0 -29
  35. package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T002-gates.md +0 -31
  36. package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T003-write-task.md +0 -31
  37. package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T004-write-router.md +0 -31
  38. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/E06-Detail.md +0 -62
  39. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T001-color-system.md +0 -39
  40. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T002-header-and-dividers.md +0 -52
  41. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T003-footer-status-bar.md +0 -52
  42. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T004-component-refinement.md +0 -53
  43. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T005-restore-nav-hints.md +0 -39
  44. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T007-detail-card-fixes.md +0 -36
  45. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T008-checkbox-states.md +0 -40
  46. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T009-router-priority-marker.md +0 -48
  47. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T010-auto-refresh-watcher.md +0 -66
  48. package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/Design.md +0 -39
  49. package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T001-archive-epics.md +0 -20
  50. package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T002-rewrite-prd.md +0 -22
  51. package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T003-create-epic-stubs.md +0 -24
  52. package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T004-update-router.md +0 -22
  53. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/Design.md +0 -118
  54. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/handoff.md +0 -9
  55. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T001-package-baseline.md +0 -45
  56. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T002-typescript-build.md +0 -48
  57. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T003-vitest-smoke.md +0 -43
  58. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T004-lint-format-gates.md +0 -45
  59. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T005-scaffold-verification.md +0 -40
  60. package/.savepoint/releases/v1/epics/_archived/E02-data-model/Design.md +0 -142
  61. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T001-domain-ids-status.md +0 -27
  62. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T002-markdown-frontmatter-boundary.md +0 -28
  63. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T003-task-documents.md +0 -29
  64. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T004-release-epic-router-config-readers.md +0 -30
  65. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T005-dependency-validation.md +0 -29
  66. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T006-epic-task-set-reader.md +0 -29
  67. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T007-quality-gates.md +0 -31
  68. package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/Design.md +0 -40
  69. package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T001-phase-types.md +0 -27
  70. package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T002-phase-frontmatter.md +0 -25
  71. package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T003-simplify-config.md +0 -26
  72. package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T004-simplify-router-domain.md +0 -24
  73. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/Design.md +0 -122
  74. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T001-argument-parser-contract.md +0 -28
  75. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T002-help-text-generation.md +0 -28
  76. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T003-terminal-environment-detection.md +0 -27
  77. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T004-command-stub-modules.md +0 -29
  78. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T005-cli-runner-dispatch.md +0 -34
  79. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T006-entrypoint-quality-gates.md +0 -32
  80. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/Design.md +0 -43
  81. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T001-strip-args.md +0 -26
  82. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T002-strip-help.md +0 -23
  83. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T003-strip-run.md +0 -23
  84. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T004-delete-commands.md +0 -24
  85. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T005-update-cli-tests.md +0 -22
  86. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/Design.md +0 -48
  87. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T001-board-data-phases.md +0 -26
  88. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T002-phase-rendering.md +0 -28
  89. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T003-detail-pane-phases.md +0 -27
  90. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T004-phase-transitions.md +0 -42
  91. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T005-phase-gates.md +0 -24
  92. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T006-phase-write-back.md +0 -24
  93. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T007-remove-audit-flow.md +0 -27
  94. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T008-board-tests.md +0 -25
  95. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/Design.md +0 -85
  96. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T001-project-template-assets.md +0 -17
  97. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T002-release-and-prompt-assets.md +0 -20
  98. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T003-template-registry-renderer.md +0 -22
  99. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T004-template-integrity-tests.md +0 -17
  100. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T005-template-closeout-quality-gates.md +0 -16
  101. package/.savepoint/releases/v1/epics/_archived/E05-init-command/Design.md +0 -88
  102. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T001-init-cli-contract.md +0 -22
  103. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T002-target-validation.md +0 -23
  104. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T003-scaffold-writer.md +0 -24
  105. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T004-magic-prompt-and-clipboard.md +0 -23
  106. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T005-dev-deps-install-option.md +0 -24
  107. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T006-init-command-integration.md +0 -28
  108. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/Design.md +0 -53
  109. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T001-delete-dead-src.md +0 -23
  110. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T002-delete-dead-tests.md +0 -26
  111. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T003-delete-assets.md +0 -25
  112. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T004-clean-savepoint.md +0 -28
  113. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T005-rewrite-agents-md.md +0 -28
  114. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T006-clean-package-json.md +0 -23
  115. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T007-verify.md +0 -25
  116. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/Design.md +0 -104
  117. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T001-board-command-data.md +0 -23
  118. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T002-board-view-state.md +0 -24
  119. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T003-transition-gates-and-writes.md +0 -25
  120. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T004-terminal-theme.md +0 -23
  121. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T005-ink-board-ui.md +0 -26
  122. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T006-board-integration-audit-entry.md +0 -24
  123. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/Design.md +0 -88
  124. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T001-audit-cli-contract.md +0 -23
  125. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T002-quality-gate-runner.md +0 -23
  126. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T003-snapshot-and-prompt.md +0 -23
  127. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T004-audit-orchestration-router.md +0 -27
  128. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T005-proposal-validation-apply.md +0 -25
  129. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T006-audit-review-state.md +0 -24
  130. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T007-audit-review-ui.md +0 -26
  131. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T008-audit-pipeline-integration.md +0 -24
  132. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/Design.md +0 -103
  133. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T001-acceptance-criteria-model.md +0 -30
  134. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T002-release-task-set-reader.md +0 -33
  135. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T003-board-data-and-plain-output.md +0 -34
  136. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T004-board-selection-state.md +0 -33
  137. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T005-ink-board-layout-cleanup.md +0 -37
  138. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T006-task-detail-popup.md +0 -36
  139. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T007-templates-acceptance-criteria.md +0 -34
  140. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T008-board-workflow-integration.md +0 -41
  141. package/.savepoint/releases/v1/epics/_archived/E09-doctor-command/Design.md +0 -70
  142. package/.savepoint/releases/v1/epics/_archived/E10-docs-and-packaging/Design.md +0 -68
  143. package/.savepoint/releases/v1/epics/_archived/E11-release-validation/Design.md +0 -68
  144. package/.savepoint/releases/v1/v1-PRD.md +0 -66
  145. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/E01-Detail.md +0 -40
  146. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T001-next-activity-header.md +0 -56
  147. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T002-rename-epic-design-files.md +0 -38
  148. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T003-rename-release-prd.md +0 -28
  149. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T004-update-instruction-files.md +0 -51
  150. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T005-update-cross-references.md +0 -45
  151. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T006-column-and-detail-scrolling.md +0 -68
  152. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T007-column-focus-border-stability.md +0 -57
  153. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/E02-Audit.md +0 -124
  154. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/E02-Detail.md +0 -49
  155. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T001-fix-makefile.md +0 -37
  156. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T002-linux-build-target.md +0 -38
  157. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T003-macos-build-target.md +0 -36
  158. package/.savepoint/releases/v1.1/epics/E02-cross-platform-compatibility/tasks/T004-smoke-tests-and-artifacts.md +0 -59
  159. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Audit.md +0 -195
  160. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md +0 -45
  161. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T001-border-resize-fix.md +0 -40
  162. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T002-next-activity-below-header.md +0 -64
  163. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T003-checkbox-rendering-fix.md +0 -56
  164. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T005-unify-status-glyphs.md +0 -65
  165. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T006-forced-256-color-profile.md +0 -36
  166. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Audit.md +0 -167
  167. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/E04-Detail.md +0 -51
  168. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T001-sidebar-focusable-navigation.md +0 -65
  169. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T002-epic-detail-overlay.md +0 -73
  170. package/.savepoint/releases/v1.1/epics/E04-epic-navigation/tasks/T003-epic-status-glyphs.md +0 -73
  171. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Audit.md +0 -237
  172. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Detail.md +0 -54
  173. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T001-update-agents-md.md +0 -45
  174. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T002-update-router-md.md +0 -40
  175. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T003-update-design-md.md +0 -47
  176. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T004-implement-m-hotkey.md +0 -98
  177. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T005-update-help-overlay.md +0 -33
  178. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T006-tests-and-quality-gates.md +0 -62
  179. package/.savepoint/releases/v1.1/epics/E06-audit-command/E06-Audit.md +0 -56
  180. package/.savepoint/releases/v1.1/epics/E06-audit-command/E06-Detail.md +0 -63
  181. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T005-proposals.md +0 -44
  182. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T007-apply-close.md +0 -35
  183. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T009-integration.md +0 -40
  184. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T010-audit-file-migration.md +0 -45
  185. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T011-model-tab-state.md +0 -26
  186. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T012-epic-audit-render.md +0 -33
  187. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T013-handle-tab-keys.md +0 -34
  188. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T014-tab-indicator.md +0 -33
  189. package/.savepoint/releases/v1.1/epics/E07-init-command/E07-Audit.md +0 -336
  190. package/.savepoint/releases/v1.1/epics/E07-init-command/E07-Detail.md +0 -61
  191. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T001-cli-entrypoint.md +0 -37
  192. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T002-target-validation.md +0 -28
  193. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T003-scaffold-writer.md +0 -46
  194. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T004-atomic-writes.md +0 -27
  195. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T005-magic-prompt.md +0 -25
  196. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T006-clipboard.md +0 -26
  197. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T007-integration-test.md +0 -26
  198. package/.savepoint/releases/v1.1/epics/E08-board-command/E08-Audit.md +0 -333
  199. package/.savepoint/releases/v1.1/epics/E08-board-command/E08-Detail.md +0 -68
  200. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T001-cli-entrypoint.md +0 -26
  201. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T002-non-tty-fallback.md +0 -27
  202. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T003-tui-app-shell.md +0 -28
  203. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T004-board-model.md +0 -29
  204. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T005-detail-pane.md +0 -27
  205. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T006-status-transitions.md +0 -29
  206. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T007-theme-fallbacks.md +0 -29
  207. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T008-integration-test.md +0 -27
  208. package/.savepoint/releases/v1.1/epics/E09-doctor-command/E09-Audit.md +0 -207
  209. package/.savepoint/releases/v1.1/epics/E09-doctor-command/E09-Detail.md +0 -65
  210. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T001-cli-entrypoint.md +0 -24
  211. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T002-config-router-validation.md +0 -28
  212. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T003-structure-checks.md +0 -29
  213. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T004-dependency-checks.md +0 -27
  214. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T005-audit-orphan-checks.md +0 -28
  215. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T006-quality-gates-report.md +0 -31
  216. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/E11-Detail.md +0 -36
  217. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T001-debug-logging.md +0 -25
  218. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T002-increase-debounce.md +0 -21
  219. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T003-error-handling.md +0 -22
  220. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T004-test-verify.md +0 -29
  221. package/.savepoint/releases/v1.1/epics/E12-validation-fix/E12-Audit.md +0 -444
  222. package/.savepoint/releases/v1.1/epics/E12-validation-fix/E12-Detail.md +0 -45
  223. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T001-default-phase.md +0 -35
  224. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T002-default-status.md +0 -19
  225. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T003-better-errors.md +0 -29
  226. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T004-validate-on-write.md +0 -25
  227. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T005-tests.md +0 -37
  228. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/E13-Audit.md +0 -118
  229. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/E13-Detail.md +0 -73
  230. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T001-safe-cleanup.md +0 -66
  231. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T002-bug-fixes.md +0 -35
  232. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T003-centralize-duplication.md +0 -60
  233. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T004-infrastructure.md +0 -33
  234. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T005-decompose-update.md +0 -37
  235. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T006-async-io.md +0 -40
  236. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T007-test-coverage.md +0 -37
  237. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/E14-Audit.md +0 -267
  238. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/E14-Detail.md +0 -54
  239. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T001-group-model.md +0 -39
  240. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T002-data-interfaces.md +0 -42
  241. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T003-discover-orphans.md +0 -33
  242. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T004-epic-panel-headings.md +0 -35
  243. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T005-shell-tokenization.md +0 -27
  244. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T006-unify-enums.md +0 -29
  245. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T007-testutil-package.md +0 -28
  246. package/.savepoint/releases/v1.1/epics/E15-hardening/E15-Detail.md +0 -43
  247. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T001-benchmarks.md +0 -31
  248. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T002-fuzz-targets.md +0 -28
  249. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T003-debug-flag.md +0 -30
  250. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T004-dist-checksums.md +0 -27
  251. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T005-windows-targets.md +0 -28
  252. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T006-abbreviation-splitting.md +0 -26
  253. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T007-root-test-allowlist.md +0 -28
  254. package/.savepoint/releases/v1.1/epics/_archived/T001-cli-entrypoint.md +0 -25
  255. package/.savepoint/releases/v1.1/epics/_archived/T002-quality-gates.md +0 -27
  256. package/.savepoint/releases/v1.1/epics/_archived/T003-snapshot.md +0 -27
  257. package/.savepoint/releases/v1.1/epics/_archived/T004-ai-reconcile.md +0 -29
  258. package/.savepoint/releases/v1.1/epics/_archived/T006-tui-review.md +0 -31
  259. package/.savepoint/releases/v1.1/epics/_archived/T008-skip-handling.md +0 -34
  260. package/.savepoint/releases/v1.1/v1.1-PRD.md +0 -139
  261. package/.savepoint/router.md +0 -57
  262. package/.savepoint/visual-identity.md +0 -125
  263. package/AGENTS.md +0 -99
  264. package/CLAUDE.md +0 -1
  265. package/GEMINI.md +0 -1
  266. package/Makefile +0 -29
  267. package/agent-skills/ink-tui-design/SKILL.md +0 -309
  268. package/agent-skills/ink-tui-design/references/component-patterns.md +0 -371
  269. package/agent-skills/ink-tui-design/references/hooks-guide.md +0 -436
  270. package/agent-skills/ink-tui-design/references/ink-gotchas.md +0 -330
  271. package/agent-skills/ink-tui-design/references/testing-patterns.md +0 -384
  272. package/agent-skills/savepoint-audit/SKILL.md +0 -87
  273. package/agent-skills/savepoint-build-task/SKILL.md +0 -44
  274. package/agent-skills/savepoint-create-plan/SKILL.md +0 -33
  275. package/agent-skills/savepoint-create-task/SKILL.md +0 -44
  276. package/agent-skills/savepoint-draft-prd/SKILL.md +0 -37
  277. package/agent-skills/savepoint-system-design/SKILL.md +0 -38
  278. package/agent-skills/superpowers/brainstorming/SKILL.md +0 -165
  279. package/agent-skills/superpowers/brainstorming/visual-companion.md +0 -304
  280. package/agent-skills/superpowers/dispatching-parallel-agents/SKILL.md +0 -193
  281. package/agent-skills/superpowers/executing-plans/SKILL.md +0 -77
  282. package/agent-skills/superpowers/finishing-a-development-branch/SKILL.md +0 -213
  283. package/agent-skills/superpowers/receiving-code-review/SKILL.md +0 -226
  284. package/agent-skills/superpowers/requesting-code-review/SKILL.md +0 -115
  285. package/agent-skills/superpowers/requesting-code-review/code-reviewer.md +0 -160
  286. package/agent-skills/superpowers/subagent-driven-development/SKILL.md +0 -292
  287. package/agent-skills/superpowers/subagent-driven-development/code-quality-reviewer-prompt.md +0 -27
  288. package/agent-skills/superpowers/subagent-driven-development/implementer-prompt.md +0 -113
  289. package/agent-skills/superpowers/subagent-driven-development/spec-reviewer-prompt.md +0 -61
  290. package/agent-skills/superpowers/systematic-debugging/SKILL.md +0 -305
  291. package/agent-skills/superpowers/systematic-debugging/condition-based-waiting.md +0 -122
  292. package/agent-skills/superpowers/systematic-debugging/defense-in-depth.md +0 -130
  293. package/agent-skills/superpowers/systematic-debugging/root-cause-tracing.md +0 -183
  294. package/agent-skills/superpowers/test-driven-development/SKILL.md +0 -389
  295. package/agent-skills/superpowers/test-driven-development/testing-anti-patterns.md +0 -317
  296. package/agent-skills/superpowers/verification-before-completion/SKILL.md +0 -147
  297. package/agent-skills/superpowers/writing-plans/SKILL.md +0 -159
  298. package/agent-skills/superpowers/writing-plans/plan-document-reviewer-prompt.md +0 -49
  299. package/agent_skills_test.go +0 -91
  300. package/assets/banner.png +0 -0
  301. package/assets/logo.png +0 -0
  302. package/assets/strawman.png +0 -0
  303. package/cmd/board.go +0 -59
  304. package/cmd/board_test.go +0 -137
  305. package/cmd/doctor.go +0 -53
  306. package/cmd/doctor_test.go +0 -146
  307. package/cmd/init.go +0 -63
  308. package/cmd/init_test.go +0 -104
  309. package/go.mod +0 -36
  310. package/go.sum +0 -75
  311. package/internal/board/board.go +0 -177
  312. package/internal/board/board_test.go +0 -168
  313. package/internal/board/card.go +0 -129
  314. package/internal/board/card_test.go +0 -254
  315. package/internal/board/column.go +0 -127
  316. package/internal/board/column_test.go +0 -139
  317. package/internal/board/detail.go +0 -185
  318. package/internal/board/detail_test.go +0 -340
  319. package/internal/board/epic_panel.go +0 -262
  320. package/internal/board/epic_panel_test.go +0 -869
  321. package/internal/board/help.go +0 -41
  322. package/internal/board/help_test.go +0 -86
  323. package/internal/board/integration_test.go +0 -266
  324. package/internal/board/interfaces.go +0 -65
  325. package/internal/board/interfaces_test.go +0 -114
  326. package/internal/board/io.go +0 -93
  327. package/internal/board/layout.go +0 -68
  328. package/internal/board/layout_test.go +0 -106
  329. package/internal/board/model.go +0 -235
  330. package/internal/board/model_test.go +0 -67
  331. package/internal/board/plain.go +0 -88
  332. package/internal/board/plain_test.go +0 -117
  333. package/internal/board/release.go +0 -34
  334. package/internal/board/release_test.go +0 -177
  335. package/internal/board/render_policy_test.go +0 -77
  336. package/internal/board/status.go +0 -23
  337. package/internal/board/theme.go +0 -24
  338. package/internal/board/theme_test.go +0 -31
  339. package/internal/board/transitions.go +0 -113
  340. package/internal/board/transitions_test.go +0 -164
  341. package/internal/board/tui.go +0 -32
  342. package/internal/board/update.go +0 -556
  343. package/internal/board/update_test.go +0 -575
  344. package/internal/board/util.go +0 -76
  345. package/internal/board/view.go +0 -317
  346. package/internal/board/view_test.go +0 -315
  347. package/internal/board/watch.go +0 -130
  348. package/internal/buildtool/main.go +0 -211
  349. package/internal/buildtool/main_test.go +0 -46
  350. package/internal/data/config.go +0 -101
  351. package/internal/data/config_test.go +0 -122
  352. package/internal/data/discover.go +0 -178
  353. package/internal/data/discover_test.go +0 -130
  354. package/internal/data/errors.go +0 -13
  355. package/internal/data/lifecycle.go +0 -44
  356. package/internal/data/lifecycle_test.go +0 -41
  357. package/internal/data/parser.go +0 -242
  358. package/internal/data/parser_test.go +0 -281
  359. package/internal/data/router.go +0 -52
  360. package/internal/data/router_test.go +0 -35
  361. package/internal/data/task.go +0 -57
  362. package/internal/data/task_test.go +0 -51
  363. package/internal/data/write.go +0 -218
  364. package/internal/data/write_test.go +0 -623
  365. package/internal/doctor/checks.go +0 -567
  366. package/internal/doctor/checks_test.go +0 -716
  367. package/internal/doctor/gates.go +0 -193
  368. package/internal/doctor/gates_test.go +0 -166
  369. package/internal/doctor/interfaces.go +0 -64
  370. package/internal/doctor/interfaces_test.go +0 -104
  371. package/internal/doctor/repairs.go +0 -80
  372. package/internal/doctor/repairs_test.go +0 -81
  373. package/internal/doctor/report.go +0 -157
  374. package/internal/doctor/report_test.go +0 -89
  375. package/internal/init/clipboard.go +0 -146
  376. package/internal/init/clipboard_test.go +0 -74
  377. package/internal/init/install.go +0 -16
  378. package/internal/init/integration_test.go +0 -197
  379. package/internal/init/prompt.go +0 -14
  380. package/internal/init/prompt_test.go +0 -77
  381. package/internal/init/scaffold.go +0 -59
  382. package/internal/init/scaffold_test.go +0 -179
  383. package/internal/init/template_freshness_test.go +0 -56
  384. package/internal/init/validate.go +0 -85
  385. package/internal/init/validate_test.go +0 -141
  386. package/internal/init/write.go +0 -73
  387. package/internal/init/write_test.go +0 -91
  388. package/internal/styles/palette.go +0 -49
  389. package/internal/styles/styles.go +0 -139
  390. package/internal/styles/styles_test.go +0 -133
  391. package/internal/testutil/fixture.go +0 -113
  392. package/internal/testutil/fs.go +0 -26
  393. package/main.go +0 -117
  394. package/project-audit/audit_report_glm_5.1.md +0 -411
  395. package/project-audit/audit_report_opus_4.6 +0 -406
  396. package/project-audit/consolidated-audit-report.md +0 -456
  397. package/scripts/vitest-preload.cjs +0 -95
  398. package/templates/project/.savepoint/Design.md +0 -47
  399. package/templates/project/.savepoint/PRD.md +0 -34
  400. package/templates/project/.savepoint/config.yml +0 -27
  401. package/templates/project/.savepoint/router.md +0 -153
  402. package/templates/project/.savepoint/visual-identity.md +0 -122
  403. package/templates/project/AGENTS.md +0 -88
  404. package/templates/project/agent-skills/savepoint-audit/SKILL.md +0 -87
  405. package/templates/project/agent-skills/savepoint-build-task/SKILL.md +0 -44
  406. package/templates/project/agent-skills/savepoint-create-plan/SKILL.md +0 -33
  407. package/templates/project/agent-skills/savepoint-create-task/SKILL.md +0 -44
  408. package/templates/project/agent-skills/savepoint-draft-prd/SKILL.md +0 -37
  409. package/templates/project/agent-skills/savepoint-system-design/SKILL.md +0 -38
  410. package/templates/prompts/audit-reconciliation.prompt.md +0 -72
  411. package/templates/prompts/design.prompt.md +0 -45
  412. package/templates/prompts/epic-design.prompt.md +0 -43
  413. package/templates/prompts/magic-prompt.prompt.md +0 -7
  414. package/templates/prompts/prd.prompt.md +0 -42
  415. package/templates/prompts/task-breakdown.prompt.md +0 -54
  416. package/templates/prompts/task-building.prompt.md +0 -38
  417. package/templates/prompts/task-planning.prompt.md +0 -53
  418. package/templates/release/v1/PRD.md +0 -37
@@ -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
- }
@@ -1,51 +0,0 @@
1
- package data
2
-
3
- import (
4
- "testing"
5
- )
6
-
7
- func TestTaskString(t *testing.T) {
8
- task := Task{
9
- ID: "E01/T001",
10
- Title: "Test Task",
11
- Column: ColumnPlanned,
12
- }
13
- want := "Task(E01/T001)"
14
- if got := task.String(); got != want {
15
- t.Errorf("Task.String() = %v, want %v", got, want)
16
- }
17
- }
18
-
19
- func TestColumnTypes(t *testing.T) {
20
- tests := []struct {
21
- input ColumnType
22
- want string
23
- }{
24
- {ColumnPlanned, "planned"},
25
- {ColumnInProgress, "in_progress"},
26
- {ColumnDone, "done"},
27
- }
28
-
29
- for _, tt := range tests {
30
- if string(tt.input) != tt.want {
31
- t.Errorf("ColumnType = %v, want %v", tt.input, tt.want)
32
- }
33
- }
34
- }
35
-
36
- func TestProgressStage(t *testing.T) {
37
- tests := []struct {
38
- input ProgressStage
39
- want string
40
- }{
41
- {StageBuild, "build"},
42
- {StageTest, "test"},
43
- {StageAudit, "audit"},
44
- }
45
-
46
- for _, tt := range tests {
47
- if string(tt.input) != tt.want {
48
- t.Errorf("ProgressStage = %v, want %v", tt.input, tt.want)
49
- }
50
- }
51
- }
@@ -1,218 +0,0 @@
1
- package data
2
-
3
- import (
4
- "fmt"
5
- "os"
6
- "path/filepath"
7
- "strings"
8
- "time"
9
-
10
- "gopkg.in/yaml.v3"
11
- )
12
-
13
- var ErrMtimeConflict = fmt.Errorf("file modified since last read")
14
- var ErrProposalNotFound = fmt.Errorf("target text not found in file")
15
-
16
- // ApplyProposal replaces the first occurrence of old with newText in the file at path.
17
- func ApplyProposal(path, old, newText string) error {
18
- content, err := os.ReadFile(path)
19
- if err != nil {
20
- return fmt.Errorf("read %s: %w", path, err)
21
- }
22
- normalized := normalizeLineEndings(string(content))
23
- if !strings.Contains(normalized, old) {
24
- return fmt.Errorf("%w: %s", ErrProposalNotFound, path)
25
- }
26
- updated := strings.Replace(normalized, old, newText, 1)
27
- return os.WriteFile(path, []byte(updated), 0644)
28
- }
29
-
30
- // UpdateEpicStatus sets the status field in the frontmatter of an E##-Detail.md file.
31
- func UpdateEpicStatus(path, status string) error {
32
- return updateFrontmatterField(path, "status", status)
33
- }
34
-
35
- // UpdateLastAudited sets the last_audited field in the frontmatter of Design.md.
36
- func UpdateLastAudited(path, value string) error {
37
- return updateFrontmatterField(path, "last_audited", value)
38
- }
39
-
40
- // SplitFrontmatterBody splits content into frontmatter YAML and body.
41
- func SplitFrontmatterBody(content string) (yamlStr string, body string, err error) {
42
- normalized := normalizeLineEndings(content)
43
- raw, err := extractFrontmatter(normalized)
44
- if err != nil {
45
- return "", "", err
46
- }
47
- delimLen := 4
48
- bodyStart := delimLen + len(raw) + delimLen
49
- body = ""
50
- if bodyStart < len(normalized) {
51
- body = normalized[bodyStart:]
52
- }
53
- return raw, body, nil
54
- }
55
-
56
- func updateFrontmatterField(path, key, value string) error {
57
- content, err := os.ReadFile(path)
58
- if err != nil {
59
- return fmt.Errorf("read %s: %w", path, err)
60
- }
61
-
62
- normalized := normalizeLineEndings(string(content))
63
-
64
- raw, body, err := SplitFrontmatterBody(normalized)
65
- if err != nil {
66
- return fmt.Errorf("extract frontmatter: %w", err)
67
- }
68
-
69
- var doc yaml.Node
70
- if err := yaml.Unmarshal([]byte(raw), &doc); err != nil {
71
- return fmt.Errorf("parse yaml: %w", err)
72
- }
73
-
74
- if doc.Kind != yaml.DocumentNode || len(doc.Content) == 0 {
75
- return fmt.Errorf("unexpected yaml structure")
76
- }
77
-
78
- mapping := doc.Content[0]
79
- if mapping.Kind != yaml.MappingNode {
80
- return fmt.Errorf("frontmatter is not a mapping")
81
- }
82
-
83
- setMappingField(mapping, key, value)
84
-
85
- out, err := yaml.Marshal(&doc)
86
- if err != nil {
87
- return fmt.Errorf("marshal yaml: %w", err)
88
- }
89
-
90
- newContent := "---\n" + strings.TrimSpace(string(out)) + "\n---" + body
91
- return os.WriteFile(path, []byte(newContent), 0644)
92
- }
93
-
94
- func WriteTaskStatus(path string, task *Task, expectedMtime time.Time) error {
95
- if err := ValidateTaskLifecycle(task); err != nil {
96
- return err
97
- }
98
-
99
- fi, err := os.Stat(path)
100
- if err != nil {
101
- return fmt.Errorf("stat %s: %w", path, err)
102
- }
103
-
104
- if !fi.ModTime().Equal(expectedMtime) {
105
- return ErrMtimeConflict
106
- }
107
-
108
- content, err := os.ReadFile(path)
109
- if err != nil {
110
- return fmt.Errorf("read %s: %w", path, err)
111
- }
112
-
113
- normalized := normalizeLineEndings(string(content))
114
-
115
- raw, body, err := SplitFrontmatterBody(normalized)
116
- if err != nil {
117
- return fmt.Errorf("extract frontmatter: %w", err)
118
- }
119
-
120
- var doc yaml.Node
121
- if err := yaml.Unmarshal([]byte(raw), &doc); err != nil {
122
- return fmt.Errorf("parse yaml: %w", err)
123
- }
124
-
125
- if doc.Kind != yaml.DocumentNode || len(doc.Content) == 0 {
126
- return fmt.Errorf("unexpected yaml structure")
127
- }
128
-
129
- mapping := doc.Content[0]
130
- if mapping.Kind != yaml.MappingNode {
131
- return fmt.Errorf("frontmatter is not a mapping")
132
- }
133
-
134
- setMappingField(mapping, "status", string(task.Column))
135
-
136
- if task.Stage == "" {
137
- removeMappingField(mapping, "phase")
138
- removeMappingField(mapping, "stage")
139
- } else {
140
- setMappingField(mapping, "phase", string(task.Stage))
141
- removeMappingField(mapping, "stage")
142
- }
143
-
144
- out, err := yaml.Marshal(&doc)
145
- if err != nil {
146
- return fmt.Errorf("marshal yaml: %w", err)
147
- }
148
-
149
- newContent := "---\n" + strings.TrimSpace(string(out)) + "\n---" + body
150
-
151
- return os.WriteFile(path, []byte(newContent), 0644)
152
- }
153
-
154
- func setMappingField(mapping *yaml.Node, key, value string) {
155
- for i := 0; i < len(mapping.Content)-1; i += 2 {
156
- if mapping.Content[i].Value == key {
157
- mapping.Content[i+1].Value = value
158
- mapping.Content[i+1].Tag = "!!str"
159
- return
160
- }
161
- }
162
- keyNode := &yaml.Node{Kind: yaml.ScalarNode, Value: key, Tag: "!!str"}
163
- valNode := &yaml.Node{Kind: yaml.ScalarNode, Value: value, Tag: "!!str"}
164
- mapping.Content = append(mapping.Content, keyNode, valNode)
165
- }
166
-
167
- func removeMappingField(mapping *yaml.Node, key string) {
168
- for i := 0; i < len(mapping.Content)-1; i += 2 {
169
- if mapping.Content[i].Value == key {
170
- mapping.Content = append(mapping.Content[:i], mapping.Content[i+2:]...)
171
- return
172
- }
173
- }
174
- }
175
-
176
- func WriteRouterState(root string, state *RouterState, expectedMtime time.Time) error {
177
- path := filepath.Join(root, "router.md")
178
- fi, err := os.Stat(path)
179
- if err != nil {
180
- return fmt.Errorf("stat %s: %w", path, err)
181
- }
182
-
183
- if !fi.ModTime().Equal(expectedMtime) {
184
- return ErrMtimeConflict
185
- }
186
-
187
- content, err := os.ReadFile(path)
188
- if err != nil {
189
- return fmt.Errorf("read %s: %w", path, err)
190
- }
191
-
192
- normalized := normalizeLineEndings(string(content))
193
-
194
- startIdx := strings.Index(normalized, stateBlockStart)
195
- if startIdx == -1 {
196
- return fmt.Errorf("no Current state block found")
197
- }
198
-
199
- yamlStart := strings.Index(normalized[startIdx:], "```yaml")
200
- if yamlStart == -1 {
201
- return fmt.Errorf("no yaml code block found")
202
- }
203
-
204
- yamlStart += startIdx + len("```yaml")
205
- yamlEnd := strings.Index(normalized[yamlStart:], "```")
206
- if yamlEnd == -1 {
207
- return fmt.Errorf("no closing code block found")
208
- }
209
-
210
- out, err := yaml.Marshal(state)
211
- if err != nil {
212
- return fmt.Errorf("marshal yaml: %w", err)
213
- }
214
-
215
- newContent := normalized[:yamlStart] + "\n" + strings.TrimSpace(string(out)) + "\n" + normalized[yamlStart+yamlEnd:]
216
-
217
- return os.WriteFile(path, []byte(newContent), 0644)
218
- }