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,91 +0,0 @@
1
- package main
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
- )