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,91 +0,0 @@
1
- package main_test
2
-
3
- import (
4
- "os"
5
- "path/filepath"
6
- "strings"
7
- "testing"
8
- )
9
-
10
- func TestBundledSavepointSkillsHaveDiscoveryFrontmatter(t *testing.T) {
11
- assertSavepointSkillsHaveFrontmatter(t, filepath.Join("agent-skills"))
12
- assertSavepointSkillsHaveFrontmatter(t, filepath.Join("templates", "project", "agent-skills"))
13
- }
14
-
15
- func TestProjectAgentGuideIncludesLocalSkillFallback(t *testing.T) {
16
- path := filepath.Join("templates", "project", "AGENTS.md")
17
- content, err := os.ReadFile(path)
18
- if err != nil {
19
- t.Fatalf("ReadFile(%q) error = %v", path, err)
20
- }
21
-
22
- want := "If the agent says the skill is not found, read `agent-skills/{skill}/SKILL.md` directly"
23
- if !strings.Contains(string(content), want) {
24
- t.Fatalf("%s missing local skill fallback instruction", path)
25
- }
26
- }
27
-
28
- func TestScaffoldedSavepointSkillsMatchBundledSkills(t *testing.T) {
29
- root := filepath.Join("agent-skills")
30
- entries, err := os.ReadDir(root)
31
- if err != nil {
32
- t.Fatalf("ReadDir(%q) error = %v", root, err)
33
- }
34
-
35
- for _, entry := range entries {
36
- if !entry.IsDir() || !strings.HasPrefix(entry.Name(), "savepoint-") {
37
- continue
38
- }
39
-
40
- sourcePath := filepath.Join(root, entry.Name(), "SKILL.md")
41
- scaffoldPath := filepath.Join("templates", "project", "agent-skills", entry.Name(), "SKILL.md")
42
- source, err := os.ReadFile(sourcePath)
43
- if err != nil {
44
- t.Fatalf("ReadFile(%q) error = %v", sourcePath, err)
45
- }
46
- scaffold, err := os.ReadFile(scaffoldPath)
47
- if err != nil {
48
- t.Fatalf("ReadFile(%q) error = %v", scaffoldPath, err)
49
- }
50
- if string(scaffold) != string(source) {
51
- t.Fatalf("%s does not match %s", scaffoldPath, sourcePath)
52
- }
53
- }
54
- }
55
-
56
- func assertSavepointSkillsHaveFrontmatter(t *testing.T, root string) {
57
- t.Helper()
58
-
59
- entries, err := os.ReadDir(root)
60
- if err != nil {
61
- t.Fatalf("ReadDir(%q) error = %v", root, err)
62
- }
63
-
64
- var found int
65
- for _, entry := range entries {
66
- if !entry.IsDir() || !strings.HasPrefix(entry.Name(), "savepoint-") {
67
- continue
68
- }
69
- found++
70
- path := filepath.Join(root, entry.Name(), "SKILL.md")
71
- content, err := os.ReadFile(path)
72
- if err != nil {
73
- t.Fatalf("ReadFile(%q) error = %v", path, err)
74
- }
75
-
76
- text := string(content)
77
- if !strings.HasPrefix(text, "---\n") {
78
- t.Fatalf("%s missing YAML frontmatter", path)
79
- }
80
- if !strings.Contains(text, "name: "+entry.Name()) {
81
- t.Fatalf("%s frontmatter name does not match directory", path)
82
- }
83
- if !strings.Contains(text, "description:") {
84
- t.Fatalf("%s missing frontmatter description", path)
85
- }
86
- }
87
-
88
- if found == 0 {
89
- t.Fatalf("%s contains %d savepoint skills, want at least 1", root, found)
90
- }
91
- }
package/assets/banner.png DELETED
Binary file
package/assets/logo.png DELETED
Binary file
Binary file
package/cmd/board.go DELETED
@@ -1,59 +0,0 @@
1
- package cmd
2
-
3
- import (
4
- "context"
5
- "fmt"
6
- "io"
7
- )
8
-
9
- const boardUsage = "Usage: board [--release <release>] [--epic <epic>]"
10
-
11
- type BoardOptions struct {
12
- Release string
13
- Epic string
14
- }
15
-
16
- type BoardRunner func(BoardOptions) error
17
-
18
- func RunBoard(ctx context.Context, args []string, stdout io.Writer, runner BoardRunner) error {
19
- options, help, err := ParseBoardArgs(args)
20
- if help {
21
- _, writeErr := fmt.Fprintln(stdout, boardUsage)
22
- return writeErr
23
- }
24
- if err != nil {
25
- return err
26
- }
27
- return runner(options)
28
- }
29
-
30
- func ParseBoardArgs(args []string) (BoardOptions, bool, error) {
31
- var options BoardOptions
32
-
33
- for i := 0; i < len(args); i++ {
34
- arg := args[i]
35
- switch arg {
36
- case "--help":
37
- return BoardOptions{}, true, nil
38
- case "--release":
39
- i++
40
- if i >= len(args) {
41
- return BoardOptions{}, false, fmt.Errorf("--release requires a value")
42
- }
43
- options.Release = args[i]
44
- case "--epic":
45
- i++
46
- if i >= len(args) {
47
- return BoardOptions{}, false, fmt.Errorf("--epic requires a value")
48
- }
49
- options.Epic = args[i]
50
- default:
51
- if len(arg) > 0 && arg[0] == '-' {
52
- return BoardOptions{}, false, fmt.Errorf("unknown board flag %q", arg)
53
- }
54
- return BoardOptions{}, false, fmt.Errorf("board takes no positional arguments, got %q", arg)
55
- }
56
- }
57
-
58
- return options, false, nil
59
- }
package/cmd/board_test.go DELETED
@@ -1,137 +0,0 @@
1
- package cmd
2
-
3
- import (
4
- "bytes"
5
- "context"
6
- "errors"
7
- "strings"
8
- "testing"
9
- )
10
-
11
- func TestRunBoardHelp(t *testing.T) {
12
- var stdout bytes.Buffer
13
- called := false
14
-
15
- err := RunBoard(context.Background(), []string{"--help"}, &stdout, func(BoardOptions) error {
16
- called = true
17
- return nil
18
- })
19
-
20
- if err != nil {
21
- t.Fatalf("RunBoard() error = %v", err)
22
- }
23
- if called {
24
- t.Fatal("RunBoard() called runner for help")
25
- }
26
- if !strings.Contains(stdout.String(), "board [--release <release>] [--epic <epic>]") {
27
- t.Fatalf("help output = %q", stdout.String())
28
- }
29
- }
30
-
31
- func TestRunBoardNoArgs(t *testing.T) {
32
- got := runBoardOptions(t, nil)
33
-
34
- if got.Release != "" {
35
- t.Fatalf("Release = %q, want empty", got.Release)
36
- }
37
- if got.Epic != "" {
38
- t.Fatalf("Epic = %q, want empty", got.Epic)
39
- }
40
- }
41
-
42
- func TestRunBoardRelease(t *testing.T) {
43
- got := runBoardOptions(t, []string{"--release", "v1"})
44
-
45
- if got.Release != "v1" {
46
- t.Fatalf("Release = %q, want v1", got.Release)
47
- }
48
- }
49
-
50
- func TestRunBoardEpic(t *testing.T) {
51
- got := runBoardOptions(t, []string{"--epic", "E03"})
52
-
53
- if got.Epic != "E03" {
54
- t.Fatalf("Epic = %q, want E03", got.Epic)
55
- }
56
- }
57
-
58
- func TestRunBoardReleaseAndEpic(t *testing.T) {
59
- got := runBoardOptions(t, []string{"--release", "v1", "--epic", "E03"})
60
-
61
- if got.Release != "v1" {
62
- t.Fatalf("Release = %q, want v1", got.Release)
63
- }
64
- if got.Epic != "E03" {
65
- t.Fatalf("Epic = %q, want E03", got.Epic)
66
- }
67
- }
68
-
69
- func TestRunBoardRejectsUnknownFlag(t *testing.T) {
70
- var stdout bytes.Buffer
71
-
72
- err := RunBoard(context.Background(), []string{"--bogus"}, &stdout, func(BoardOptions) error {
73
- return nil
74
- })
75
-
76
- if err == nil {
77
- t.Fatal("RunBoard() error = nil, want unknown flag error")
78
- }
79
- if !strings.Contains(err.Error(), "unknown board flag") {
80
- t.Fatalf("error = %q, want unknown flag", err.Error())
81
- }
82
- }
83
-
84
- func TestRunBoardRejectsPositionalArgs(t *testing.T) {
85
- var stdout bytes.Buffer
86
-
87
- err := RunBoard(context.Background(), []string{"extra"}, &stdout, func(BoardOptions) error {
88
- return nil
89
- })
90
-
91
- if err == nil {
92
- t.Fatal("RunBoard() error = nil, want positional arg error")
93
- }
94
- }
95
-
96
- func TestRunBoardReleaseMissingValue(t *testing.T) {
97
- var stdout bytes.Buffer
98
-
99
- err := RunBoard(context.Background(), []string{"--release"}, &stdout, func(BoardOptions) error {
100
- return nil
101
- })
102
-
103
- if err == nil {
104
- t.Fatal("RunBoard() error = nil, want missing value error")
105
- }
106
- if !strings.Contains(err.Error(), "--release requires a value") {
107
- t.Fatalf("error = %q", err.Error())
108
- }
109
- }
110
-
111
- func TestRunBoardReturnsRunnerError(t *testing.T) {
112
- want := errors.New("runner failed")
113
- var stdout bytes.Buffer
114
-
115
- err := RunBoard(context.Background(), nil, &stdout, func(BoardOptions) error {
116
- return want
117
- })
118
-
119
- if !errors.Is(err, want) {
120
- t.Fatalf("RunBoard() error = %v, want %v", err, want)
121
- }
122
- }
123
-
124
- func runBoardOptions(t *testing.T, args []string) BoardOptions {
125
- t.Helper()
126
-
127
- var stdout bytes.Buffer
128
- var got BoardOptions
129
- err := RunBoard(context.Background(), args, &stdout, func(options BoardOptions) error {
130
- got = options
131
- return nil
132
- })
133
- if err != nil {
134
- t.Fatalf("RunBoard() error = %v", err)
135
- }
136
- return got
137
- }
package/cmd/doctor.go DELETED
@@ -1,53 +0,0 @@
1
- package cmd
2
-
3
- import (
4
- "context"
5
- "fmt"
6
- "io"
7
- )
8
-
9
- const doctorUsage = "Usage: doctor [--epic <epic>]"
10
-
11
- type DoctorOptions struct {
12
- Epic string
13
- }
14
-
15
- // DoctorRunner receives parsed options and returns an exit code: 0=clean, 1=problems, 2=internal error.
16
- type DoctorRunner func(DoctorOptions) (int, error)
17
-
18
- func RunDoctor(ctx context.Context, args []string, stdout io.Writer, runner DoctorRunner) (int, error) {
19
- options, help, err := ParseDoctorArgs(args)
20
- if help {
21
- _, writeErr := fmt.Fprintln(stdout, doctorUsage)
22
- return 0, writeErr
23
- }
24
- if err != nil {
25
- return 2, err
26
- }
27
- return runner(options)
28
- }
29
-
30
- func ParseDoctorArgs(args []string) (DoctorOptions, bool, error) {
31
- var options DoctorOptions
32
-
33
- for i := 0; i < len(args); i++ {
34
- arg := args[i]
35
- switch arg {
36
- case "--help":
37
- return DoctorOptions{}, true, nil
38
- case "--epic":
39
- i++
40
- if i >= len(args) {
41
- return DoctorOptions{}, false, fmt.Errorf("--epic requires a value")
42
- }
43
- options.Epic = args[i]
44
- default:
45
- if len(arg) > 0 && arg[0] == '-' {
46
- return DoctorOptions{}, false, fmt.Errorf("unknown doctor flag %q", arg)
47
- }
48
- return DoctorOptions{}, false, fmt.Errorf("doctor takes no positional arguments, got %q", arg)
49
- }
50
- }
51
-
52
- return options, false, nil
53
- }
@@ -1,146 +0,0 @@
1
- package cmd
2
-
3
- import (
4
- "bytes"
5
- "context"
6
- "strings"
7
- "testing"
8
- )
9
-
10
- func TestRunDoctorHelp(t *testing.T) {
11
- var stdout bytes.Buffer
12
- called := false
13
-
14
- code, err := RunDoctor(context.Background(), []string{"--help"}, &stdout, func(DoctorOptions) (int, error) {
15
- called = true
16
- return 0, nil
17
- })
18
-
19
- if err != nil {
20
- t.Fatalf("RunDoctor() error = %v", err)
21
- }
22
- if called {
23
- t.Fatal("RunDoctor() called runner for help")
24
- }
25
- if code != 0 {
26
- t.Fatalf("RunDoctor() code = %d, want 0", code)
27
- }
28
- if !strings.Contains(stdout.String(), "doctor [--epic <epic>]") {
29
- t.Fatalf("help output = %q", stdout.String())
30
- }
31
- }
32
-
33
- func TestRunDoctorNoArgs(t *testing.T) {
34
- got := runDoctorOptions(t, nil)
35
-
36
- if got.Epic != "" {
37
- t.Fatalf("Epic = %q, want empty", got.Epic)
38
- }
39
- }
40
-
41
- func TestRunDoctorEpic(t *testing.T) {
42
- got := runDoctorOptions(t, []string{"--epic", "E03"})
43
-
44
- if got.Epic != "E03" {
45
- t.Fatalf("Epic = %q, want E03", got.Epic)
46
- }
47
- }
48
-
49
- func TestRunDoctorEpicMissingValue(t *testing.T) {
50
- var stdout bytes.Buffer
51
-
52
- code, err := RunDoctor(context.Background(), []string{"--epic"}, &stdout, func(DoctorOptions) (int, error) {
53
- return 0, nil
54
- })
55
-
56
- if err == nil {
57
- t.Fatal("RunDoctor() error = nil, want missing value error")
58
- }
59
- if !strings.Contains(err.Error(), "--epic requires a value") {
60
- t.Fatalf("error = %q", err.Error())
61
- }
62
- if code != 2 {
63
- t.Fatalf("code = %d, want 2", code)
64
- }
65
- }
66
-
67
- func TestRunDoctorRejectsUnknownFlag(t *testing.T) {
68
- var stdout bytes.Buffer
69
-
70
- code, err := RunDoctor(context.Background(), []string{"--bogus"}, &stdout, func(DoctorOptions) (int, error) {
71
- return 0, nil
72
- })
73
-
74
- if err == nil {
75
- t.Fatal("RunDoctor() error = nil, want unknown flag error")
76
- }
77
- if !strings.Contains(err.Error(), "unknown doctor flag") {
78
- t.Fatalf("error = %q", err.Error())
79
- }
80
- if code != 2 {
81
- t.Fatalf("code = %d, want 2", code)
82
- }
83
- }
84
-
85
- func TestRunDoctorRejectsPositionalArgs(t *testing.T) {
86
- var stdout bytes.Buffer
87
-
88
- code, err := RunDoctor(context.Background(), []string{"extra"}, &stdout, func(DoctorOptions) (int, error) {
89
- return 0, nil
90
- })
91
-
92
- if err == nil {
93
- t.Fatal("RunDoctor() error = nil, want positional arg error")
94
- }
95
- if code != 2 {
96
- t.Fatalf("code = %d, want 2", code)
97
- }
98
- }
99
-
100
- func TestRunDoctorExitCode1(t *testing.T) {
101
- var stdout bytes.Buffer
102
-
103
- code, err := RunDoctor(context.Background(), nil, &stdout, func(DoctorOptions) (int, error) {
104
- return 1, nil
105
- })
106
-
107
- if err != nil {
108
- t.Fatalf("RunDoctor() error = %v", err)
109
- }
110
- if code != 1 {
111
- t.Fatalf("code = %d, want 1", code)
112
- }
113
- }
114
-
115
- func TestRunDoctorExitCode2(t *testing.T) {
116
- var stdout bytes.Buffer
117
-
118
- code, err := RunDoctor(context.Background(), nil, &stdout, func(DoctorOptions) (int, error) {
119
- return 2, nil
120
- })
121
-
122
- if err != nil {
123
- t.Fatalf("RunDoctor() error = %v", err)
124
- }
125
- if code != 2 {
126
- t.Fatalf("code = %d, want 2", code)
127
- }
128
- }
129
-
130
- func runDoctorOptions(t *testing.T, args []string) DoctorOptions {
131
- t.Helper()
132
-
133
- var stdout bytes.Buffer
134
- var got DoctorOptions
135
- code, err := RunDoctor(context.Background(), args, &stdout, func(options DoctorOptions) (int, error) {
136
- got = options
137
- return 0, nil
138
- })
139
- if err != nil {
140
- t.Fatalf("RunDoctor() error = %v", err)
141
- }
142
- if code != 0 {
143
- t.Fatalf("RunDoctor() code = %d, want 0", code)
144
- }
145
- return got
146
- }
package/cmd/init.go DELETED
@@ -1,63 +0,0 @@
1
- package cmd
2
-
3
- import (
4
- "context"
5
- "errors"
6
- "fmt"
7
- "io"
8
- )
9
-
10
- const initUsage = "Usage: init [dir] [--force] [--install]"
11
-
12
- type InitOptions struct {
13
- Dir string
14
- Force bool
15
- Install bool
16
- }
17
-
18
- type InitRunner func(context.Context, InitOptions) error
19
-
20
- var ErrInitNotImplemented = errors.New("init scaffold is not implemented yet")
21
-
22
- func RunInit(ctx context.Context, args []string, stdout io.Writer, runner InitRunner) error {
23
- options, help, err := ParseInitArgs(args)
24
- if help {
25
- _, writeErr := fmt.Fprintln(stdout, initUsage)
26
- return writeErr
27
- }
28
- if err != nil {
29
- return err
30
- }
31
- return runner(ctx, options)
32
- }
33
-
34
- func ParseInitArgs(args []string) (InitOptions, bool, error) {
35
- options := InitOptions{Dir: "."}
36
- var dirSet bool
37
-
38
- for _, arg := range args {
39
- switch arg {
40
- case "--help":
41
- return InitOptions{}, true, nil
42
- case "--force":
43
- options.Force = true
44
- case "--install":
45
- options.Install = true
46
- default:
47
- if len(arg) > 0 && arg[0] == '-' {
48
- return InitOptions{}, false, fmt.Errorf("unknown init flag %q", arg)
49
- }
50
- if dirSet {
51
- return InitOptions{}, false, fmt.Errorf("init accepts at most one directory")
52
- }
53
- options.Dir = arg
54
- dirSet = true
55
- }
56
- }
57
-
58
- return options, false, nil
59
- }
60
-
61
- func InitNotImplemented(context.Context, InitOptions) error {
62
- return ErrInitNotImplemented
63
- }
package/cmd/init_test.go DELETED
@@ -1,104 +0,0 @@
1
- package cmd
2
-
3
- import (
4
- "bytes"
5
- "context"
6
- "errors"
7
- "strings"
8
- "testing"
9
- )
10
-
11
- func TestRunInitHelp(t *testing.T) {
12
- var stdout bytes.Buffer
13
- called := false
14
-
15
- err := RunInit(context.Background(), []string{"--help"}, &stdout, func(context.Context, InitOptions) error {
16
- called = true
17
- return nil
18
- })
19
-
20
- if err != nil {
21
- t.Fatalf("RunInit() error = %v", err)
22
- }
23
- if called {
24
- t.Fatal("RunInit() called runner for help")
25
- }
26
- if !strings.Contains(stdout.String(), "Usage: init [dir] [--force] [--install]") {
27
- t.Fatalf("help output = %q", stdout.String())
28
- }
29
- }
30
-
31
- func TestRunInitDefaultsToCurrentDirectory(t *testing.T) {
32
- got := runInitOptions(t, nil)
33
-
34
- if got.Dir != "." {
35
- t.Fatalf("Dir = %q, want .", got.Dir)
36
- }
37
- }
38
-
39
- func TestRunInitUsesSpecifiedDirectory(t *testing.T) {
40
- got := runInitOptions(t, []string{"example"})
41
-
42
- if got.Dir != "example" {
43
- t.Fatalf("Dir = %q, want example", got.Dir)
44
- }
45
- }
46
-
47
- func TestRunInitParsesForceAndInstall(t *testing.T) {
48
- got := runInitOptions(t, []string{"example", "--force", "--install"})
49
-
50
- if !got.Force {
51
- t.Fatal("Force = false, want true")
52
- }
53
- if !got.Install {
54
- t.Fatal("Install = false, want true")
55
- }
56
- }
57
-
58
- func TestRunInitRejectsUnknownFlags(t *testing.T) {
59
- var stdout bytes.Buffer
60
- called := false
61
-
62
- err := RunInit(context.Background(), []string{"--bogus"}, &stdout, func(context.Context, InitOptions) error {
63
- called = true
64
- return nil
65
- })
66
-
67
- if err == nil {
68
- t.Fatal("RunInit() error = nil, want unknown flag error")
69
- }
70
- if called {
71
- t.Fatal("RunInit() called runner after invalid args")
72
- }
73
- if !strings.Contains(err.Error(), "unknown init flag") {
74
- t.Fatalf("error = %q, want unknown flag", err.Error())
75
- }
76
- }
77
-
78
- func TestRunInitReturnsRunnerError(t *testing.T) {
79
- want := errors.New("runner failed")
80
- var stdout bytes.Buffer
81
-
82
- err := RunInit(context.Background(), nil, &stdout, func(context.Context, InitOptions) error {
83
- return want
84
- })
85
-
86
- if !errors.Is(err, want) {
87
- t.Fatalf("RunInit() error = %v, want %v", err, want)
88
- }
89
- }
90
-
91
- func runInitOptions(t *testing.T, args []string) InitOptions {
92
- t.Helper()
93
-
94
- var stdout bytes.Buffer
95
- var got InitOptions
96
- err := RunInit(context.Background(), args, &stdout, func(_ context.Context, options InitOptions) error {
97
- got = options
98
- return nil
99
- })
100
- if err != nil {
101
- t.Fatalf("RunInit() error = %v", err)
102
- }
103
- return got
104
- }
package/go.mod DELETED
@@ -1,36 +0,0 @@
1
- module github.com/opencode/savepoint
2
-
3
- go 1.26.2
4
-
5
- require (
6
- github.com/charmbracelet/bubbletea v1.3.10
7
- github.com/fsnotify/fsnotify v1.10.0
8
- )
9
-
10
- require (
11
- github.com/atotto/clipboard v0.1.4 // indirect
12
- github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
13
- github.com/charmbracelet/bubbles v1.0.0 // indirect
14
- github.com/charmbracelet/colorprofile v0.4.1 // indirect
15
- github.com/charmbracelet/lipgloss v1.1.0 // indirect
16
- github.com/charmbracelet/x/ansi v0.11.6 // indirect
17
- github.com/charmbracelet/x/cellbuf v0.0.15 // indirect
18
- github.com/charmbracelet/x/term v0.2.2 // indirect
19
- github.com/clipperhouse/displaywidth v0.9.0 // indirect
20
- github.com/clipperhouse/stringish v0.1.1 // indirect
21
- github.com/clipperhouse/uax29/v2 v2.5.0 // indirect
22
- github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
23
- github.com/lucasb-eyer/go-colorful v1.3.0 // indirect
24
- github.com/mattn/go-isatty v0.0.20 // indirect
25
- github.com/mattn/go-localereader v0.0.1 // indirect
26
- github.com/mattn/go-runewidth v0.0.19 // indirect
27
- github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
28
- github.com/muesli/cancelreader v0.2.2 // indirect
29
- github.com/muesli/termenv v0.16.0 // indirect
30
- github.com/rivo/uniseg v0.4.7 // indirect
31
- github.com/sahilm/fuzzy v0.1.1 // indirect
32
- github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
33
- golang.org/x/sys v0.38.0 // indirect
34
- golang.org/x/text v0.3.8 // indirect
35
- gopkg.in/yaml.v3 v3.0.1 // indirect
36
- )