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,157 +0,0 @@
1
- package doctor
2
-
3
- import (
4
- "fmt"
5
- "strings"
6
- )
7
-
8
- // QualityGateReport wraps quality gate results.
9
- type QualityGateReport struct {
10
- Results []GateResult
11
- }
12
-
13
- // DiagnosticReport is the complete output of all doctor checks.
14
- type DiagnosticReport struct {
15
- ConfigCheck error
16
- RouterCheck error
17
- Structure []Problem
18
- Dependencies []Problem
19
- AuditState []Problem
20
- Orphans []Problem
21
- Gates QualityGateReport
22
- EpicFilter string
23
- }
24
-
25
- // RunAllChecks runs every doctor check and returns a full report.
26
- func RunAllChecks(root string, epicFilter string) *DiagnosticReport {
27
- report := &DiagnosticReport{
28
- EpicFilter: epicFilter,
29
- }
30
-
31
- report.ConfigCheck = CheckConfig(root)
32
- report.RouterCheck = CheckRouter(root, epicFilter)
33
- report.Structure = CheckStructure(root, epicFilter)
34
- report.Dependencies = CheckDependencies(root, epicFilter)
35
- report.AuditState = CheckAuditState(root)
36
- report.Orphans = CheckOrphans(root)
37
- report.Gates.Results = RunQualityGates(root)
38
-
39
- return report
40
- }
41
-
42
- // HasProblems returns true if any check found issues.
43
- func (r *DiagnosticReport) HasProblems() bool {
44
- if r.ConfigCheck != nil {
45
- return true
46
- }
47
- if r.RouterCheck != nil {
48
- return true
49
- }
50
- if len(r.Structure) > 0 {
51
- return true
52
- }
53
- if len(r.Dependencies) > 0 {
54
- return true
55
- }
56
- if len(r.AuditState) > 0 {
57
- return true
58
- }
59
- if len(r.Orphans) > 0 {
60
- return true
61
- }
62
- for _, g := range r.Gates.Results {
63
- if !g.Passed {
64
- return true
65
- }
66
- }
67
- return false
68
- }
69
-
70
- // Format produces the full human-readable diagnostic report.
71
- func (r *DiagnosticReport) Format() string {
72
- var b strings.Builder
73
-
74
- b.WriteString("savepoint doctor report\n")
75
- if r.EpicFilter != "" {
76
- fmt.Fprintf(&b, " filtering to epic: %s\n", r.EpicFilter)
77
- }
78
- b.WriteString("────────────────────────────────\n\n")
79
-
80
- sectionHeader(&b, "Config Check")
81
- printSingleCheck(&b, "config", r.ConfigCheck)
82
-
83
- sectionHeader(&b, "Router Check")
84
- printSingleCheck(&b, "router", r.RouterCheck)
85
-
86
- sectionHeader(&b, "Structure Check")
87
- printProblems(&b, "structure", r.Structure)
88
-
89
- sectionHeader(&b, "Dependency Check")
90
- printProblems(&b, "dependency", r.Dependencies)
91
-
92
- sectionHeader(&b, "Audit State Check")
93
- printProblems(&b, "audit", r.AuditState)
94
-
95
- sectionHeader(&b, "Orphan Check")
96
- printProblems(&b, "orphan", r.Orphans)
97
-
98
- sectionHeader(&b, "Quality Gates")
99
- for _, g := range r.Gates.Results {
100
- status := "PASS"
101
- if !g.Passed {
102
- status = "FAIL"
103
- }
104
- fmt.Fprintf(&b, " [%s] %s", status, g.Name)
105
- if g.Command != "" {
106
- fmt.Fprintf(&b, " (%s)", g.Command)
107
- }
108
- b.WriteString("\n")
109
- if !g.Passed {
110
- hint := GateSuggestion(g.Name)
111
- fmt.Fprintf(&b, " repair: %s\n", hint)
112
- if g.Output != "" {
113
- for _, line := range strings.Split(g.Output, "\n") {
114
- b.WriteString(" ")
115
- b.WriteString(line)
116
- b.WriteString("\n")
117
- }
118
- }
119
- }
120
- }
121
-
122
- b.WriteString("\n")
123
- if r.HasProblems() {
124
- b.WriteString("result: PROBLEMS FOUND (exit code 1)\n")
125
- } else {
126
- b.WriteString("result: ALL CLEAN (exit code 0)\n")
127
- }
128
-
129
- return b.String()
130
- }
131
-
132
- func sectionHeader(b *strings.Builder, title string) {
133
- fmt.Fprintf(b, "◆ %s\n", title)
134
- b.WriteString(strings.Repeat("─", len(title)+2))
135
- b.WriteString("\n")
136
- }
137
-
138
- func printSingleCheck(b *strings.Builder, name string, err error) {
139
- if err == nil {
140
- fmt.Fprintf(b, " ✓ %s\n\n", name)
141
- } else {
142
- fmt.Fprintf(b, " ✗ %s: %s\n", name, err.Error())
143
- fmt.Fprintf(b, " repair: %s\n\n", SuggestRepair(err))
144
- }
145
- }
146
-
147
- func printProblems(b *strings.Builder, category string, problems []Problem) {
148
- if len(problems) == 0 {
149
- fmt.Fprintf(b, " ✓ no problems\n\n")
150
- return
151
- }
152
- for _, p := range problems {
153
- fmt.Fprintf(b, " ✗ %s: %s\n", category, p.Error())
154
- fmt.Fprintf(b, " repair: %s\n", SuggestRepair(p))
155
- }
156
- b.WriteString("\n")
157
- }
@@ -1,89 +0,0 @@
1
- package doctor
2
-
3
- import (
4
- "strings"
5
- "testing"
6
-
7
- "github.com/opencode/savepoint/internal/testutil"
8
- )
9
-
10
- func TestDiagnosticReport_HasProblems(t *testing.T) {
11
- root := t.TempDir()
12
- report := RunAllChecks(root, "")
13
- if !report.HasProblems() {
14
- t.Fatal("RunAllChecks() on empty dir should have problems")
15
- }
16
- }
17
-
18
- func TestDiagnosticReport_CleanProject(t *testing.T) {
19
- root := t.TempDir()
20
- writeReportProject(t, root)
21
- report := RunAllChecks(root, "")
22
- if report.HasProblems() {
23
- t.Fatalf("RunAllChecks() on valid project should have no problems, got: config=%v router=%v structure=%v deps=%v audit=%v orphans=%v gates=%v",
24
- report.ConfigCheck, report.RouterCheck, report.Structure, report.Dependencies, report.AuditState, report.Orphans, report.Gates.Results)
25
- }
26
- }
27
-
28
- func TestDiagnosticReport_FormatContainsSections(t *testing.T) {
29
- root := t.TempDir()
30
- report := RunAllChecks(root, "")
31
- output := report.Format()
32
-
33
- sections := []string{
34
- "Config Check",
35
- "Router Check",
36
- "Structure Check",
37
- "Dependency Check",
38
- "Audit State Check",
39
- "Orphan Check",
40
- "Quality Gates",
41
- "PROBLEMS FOUND",
42
- }
43
- for _, s := range sections {
44
- if !strings.Contains(output, s) {
45
- t.Errorf("report.Format() missing section %q", s)
46
- }
47
- }
48
- }
49
-
50
- func TestDiagnosticReport_FormatWithEpicFilter(t *testing.T) {
51
- root := t.TempDir()
52
- report := RunAllChecks(root, "E03")
53
- output := report.Format()
54
- if !strings.Contains(output, "filtering to epic: E03") {
55
- t.Errorf("report.Format() missing epic filter: %s", output)
56
- }
57
- }
58
-
59
- func TestDiagnosticReport_FormatAllClean(t *testing.T) {
60
- root := t.TempDir()
61
- writeReportProject(t, root)
62
- report := RunAllChecks(root, "")
63
- output := report.Format()
64
- if !strings.Contains(output, "ALL CLEAN") {
65
- t.Errorf("report.Format() on clean project should say ALL CLEAN, got: %s", output)
66
- }
67
- if strings.Contains(output, "PROBLEMS FOUND") {
68
- t.Errorf("report.Format() on clean project should not say PROBLEMS FOUND, got: %s", output)
69
- }
70
- }
71
-
72
- func TestDiagnosticReport_FormatShowsRepairs(t *testing.T) {
73
- root := t.TempDir()
74
- report := RunAllChecks(root, "")
75
- output := report.Format()
76
- if !strings.Contains(output, "repair:") {
77
- t.Errorf("report.Format() should include repair suggestions, got: %s", output)
78
- }
79
- }
80
-
81
- func writeReportProject(t *testing.T, root string) {
82
- t.Helper()
83
- testutil.SetupMinimalProject(t, root, "v1", "E01-foo")
84
- testutil.WriteTask(t, root, "v1", "E01-foo", testutil.TaskFixture{
85
- Slug: "T001-task",
86
- Status: "planned",
87
- Objective: "Task",
88
- })
89
- }
@@ -1,146 +0,0 @@
1
- package init
2
-
3
- import (
4
- "bytes"
5
- "fmt"
6
- "os/exec"
7
- "runtime"
8
- )
9
-
10
- type ClipboardStatus int
11
-
12
- const (
13
- ClipboardCopied ClipboardStatus = iota
14
- ClipboardSkipped
15
- ClipboardFailed
16
- )
17
-
18
- func (s ClipboardStatus) String() string {
19
- switch s {
20
- case ClipboardCopied:
21
- return "copied"
22
- case ClipboardSkipped:
23
- return "skipped"
24
- case ClipboardFailed:
25
- return "failed"
26
- default:
27
- return "unknown"
28
- }
29
- }
30
-
31
- type ClipboardResult struct {
32
- Status ClipboardStatus
33
- Tool string
34
- Message string
35
- }
36
-
37
- func CopyToClipboard(text string) ClipboardResult {
38
- switch runtime.GOOS {
39
- case "windows":
40
- return copyWindows(text)
41
- case "darwin":
42
- return copyDarwin(text)
43
- case "linux":
44
- return copyLinux(text)
45
- default:
46
- return ClipboardResult{
47
- Status: ClipboardSkipped,
48
- Tool: "",
49
- Message: fmt.Sprintf("unsupported platform: %s", runtime.GOOS),
50
- }
51
- }
52
- }
53
-
54
- func copyWindows(text string) ClipboardResult {
55
- if _, err := exec.LookPath("clip"); err != nil {
56
- return ClipboardResult{
57
- Status: ClipboardSkipped,
58
- Tool: "clip.exe",
59
- Message: "clip.exe not found in PATH",
60
- }
61
- }
62
-
63
- cmd := exec.Command("clip")
64
- cmd.Stdin = bytes.NewReader([]byte(text))
65
- if err := cmd.Run(); err != nil {
66
- return ClipboardResult{
67
- Status: ClipboardFailed,
68
- Tool: "clip.exe",
69
- Message: fmt.Sprintf("clip.exe failed: %v", err),
70
- }
71
- }
72
-
73
- return ClipboardResult{
74
- Status: ClipboardCopied,
75
- Tool: "clip.exe",
76
- Message: "",
77
- }
78
- }
79
-
80
- func copyDarwin(text string) ClipboardResult {
81
- if _, err := exec.LookPath("pbcopy"); err != nil {
82
- return ClipboardResult{
83
- Status: ClipboardSkipped,
84
- Tool: "pbcopy",
85
- Message: "pbcopy not found in PATH",
86
- }
87
- }
88
-
89
- cmd := exec.Command("pbcopy")
90
- cmd.Stdin = bytes.NewReader([]byte(text))
91
- if err := cmd.Run(); err != nil {
92
- return ClipboardResult{
93
- Status: ClipboardFailed,
94
- Tool: "pbcopy",
95
- Message: fmt.Sprintf("pbcopy failed: %v", err),
96
- }
97
- }
98
-
99
- return ClipboardResult{
100
- Status: ClipboardCopied,
101
- Tool: "pbcopy",
102
- Message: "",
103
- }
104
- }
105
-
106
- func copyLinux(text string) ClipboardResult {
107
- if path, err := exec.LookPath("xclip"); err == nil {
108
- cmd := exec.Command(path, "-selection", "clipboard")
109
- cmd.Stdin = bytes.NewReader([]byte(text))
110
- if err := cmd.Run(); err != nil {
111
- return ClipboardResult{
112
- Status: ClipboardFailed,
113
- Tool: "xclip",
114
- Message: fmt.Sprintf("xclip failed: %v", err),
115
- }
116
- }
117
- return ClipboardResult{
118
- Status: ClipboardCopied,
119
- Tool: "xclip",
120
- Message: "",
121
- }
122
- }
123
-
124
- if path, err := exec.LookPath("xsel"); err == nil {
125
- cmd := exec.Command(path, "--input", "--clipboard")
126
- cmd.Stdin = bytes.NewReader([]byte(text))
127
- if err := cmd.Run(); err != nil {
128
- return ClipboardResult{
129
- Status: ClipboardFailed,
130
- Tool: "xsel",
131
- Message: fmt.Sprintf("xsel failed: %v", err),
132
- }
133
- }
134
- return ClipboardResult{
135
- Status: ClipboardCopied,
136
- Tool: "xsel",
137
- Message: "",
138
- }
139
- }
140
-
141
- return ClipboardResult{
142
- Status: ClipboardSkipped,
143
- Tool: "",
144
- Message: "no clipboard tool found (tried xclip, xsel)",
145
- }
146
- }
@@ -1,74 +0,0 @@
1
- package init
2
-
3
- import (
4
- "runtime"
5
- "testing"
6
- )
7
-
8
- func TestCopyToClipboard_returnsWithoutPanic(t *testing.T) {
9
- result := CopyToClipboard("test content")
10
- if result.Status != ClipboardCopied &&
11
- result.Status != ClipboardSkipped &&
12
- result.Status != ClipboardFailed {
13
- t.Fatalf("CopyToClipboard() returned unexpected status %v", result.Status)
14
- }
15
- }
16
-
17
- func TestCopyToClipboard_resultHasNonEmptyStatusString(t *testing.T) {
18
- result := CopyToClipboard("test")
19
- if result.Status.String() == "" {
20
- t.Fatal("Status.String() returned empty")
21
- }
22
- }
23
-
24
- func TestCopyToClipboard_skippedOnUnsupportedPlatform(t *testing.T) {
25
- if runtime.GOOS == "windows" || runtime.GOOS == "darwin" || runtime.GOOS == "linux" {
26
- return
27
- }
28
- result := CopyToClipboard("test")
29
- if result.Status != ClipboardSkipped {
30
- t.Fatalf("on unsupported platform, expected ClipboardSkipped, got %v", result.Status)
31
- }
32
- }
33
-
34
- func TestCopyToClipboard_emptyString(t *testing.T) {
35
- result := CopyToClipboard("")
36
- if result.Status != ClipboardCopied &&
37
- result.Status != ClipboardSkipped &&
38
- result.Status != ClipboardFailed {
39
- t.Fatalf("CopyToClipboard('') returned unexpected status %v", result.Status)
40
- }
41
- }
42
-
43
- func TestCopyToClipboard_toolName(t *testing.T) {
44
- result := CopyToClipboard("test")
45
- if result.Status == ClipboardCopied && result.Tool == "" {
46
- t.Fatal("ClipboardCopied but Tool is empty")
47
- }
48
- }
49
-
50
- func TestClipboardStatus_string(t *testing.T) {
51
- tests := []struct {
52
- status ClipboardStatus
53
- want string
54
- }{
55
- {ClipboardCopied, "copied"},
56
- {ClipboardSkipped, "skipped"},
57
- {ClipboardFailed, "failed"},
58
- }
59
- for _, tt := range tests {
60
- if got := tt.status.String(); got != tt.want {
61
- t.Errorf("ClipboardStatus(%d).String() = %q, want %q", tt.status, got, tt.want)
62
- }
63
- }
64
- }
65
-
66
- func TestCopyToClipboard_multipleCalls(t *testing.T) {
67
- for i := 0; i < 3; i++ {
68
- result := CopyToClipboard("test content")
69
- if result.Status != ClipboardCopied &&
70
- result.Status != ClipboardSkipped {
71
- t.Fatalf("call %d: unexpected status %v", i, result.Status)
72
- }
73
- }
74
- }
@@ -1,16 +0,0 @@
1
- package init
2
-
3
- import (
4
- "fmt"
5
- "os/exec"
6
- )
7
-
8
- func InstallDependencies(dir string) error {
9
- cmd := exec.Command("npm", "install")
10
- cmd.Dir = dir
11
- out, err := cmd.CombinedOutput()
12
- if err != nil {
13
- return fmt.Errorf("npm install failed in %s: %w\noutput: %s", dir, err, string(out))
14
- }
15
- return nil
16
- }
@@ -1,197 +0,0 @@
1
- package init
2
-
3
- import (
4
- "io/fs"
5
- "os"
6
- "os/exec"
7
- "path/filepath"
8
- "strings"
9
- "testing"
10
- "testing/fstest"
11
-
12
- "github.com/opencode/savepoint/internal/testutil"
13
- )
14
-
15
- func runInitPipeline(t *testing.T, dir string, force bool) string {
16
- t.Helper()
17
-
18
- if err := ValidateTarget(dir, force); err != nil {
19
- t.Fatal(err)
20
- }
21
-
22
- templates := fstest.MapFS{
23
- ".savepoint": &fstest.MapFile{Mode: fs.ModeDir | 0755},
24
- ".savepoint/config.yml": &fstest.MapFile{Data: []byte("key: value")},
25
- ".savepoint/Design.md": &fstest.MapFile{Data: []byte("# {{PROJECT_NAME}} Design")},
26
- ".savepoint/PRD.md": &fstest.MapFile{Data: []byte("PRD: {{PROJECT_NAME}}")},
27
- ".savepoint/router.md": &fstest.MapFile{Data: []byte("# Router")},
28
- ".savepoint/visual-identity.md": &fstest.MapFile{Data: []byte("# Visual Identity")},
29
- "AGENTS.md": &fstest.MapFile{Data: []byte("# Agents Guide\n\nBuild: npm run build")},
30
- "agent-skills/savepoint-audit/SKILL.md": &fstest.MapFile{Data: []byte("# Audit Skill")},
31
- }
32
-
33
- projectName := ProjectNameFromDir(dir)
34
- if err := Scaffold(templates, dir, projectName, force); err != nil {
35
- t.Fatal(err)
36
- }
37
-
38
- promptTemplates := fstest.MapFS{
39
- "magic-prompt.prompt.md": &fstest.MapFile{
40
- Data: []byte("<!-- AGENT: Read AGENTS.md -->\n\nProject: {{PROJECT_NAME}}\n\nStart by reading AGENTS.md"),
41
- },
42
- }
43
-
44
- prompt, err := RenderMagicPrompt(promptTemplates, projectName)
45
- if err != nil {
46
- t.Fatal(err)
47
- }
48
-
49
- return prompt
50
- }
51
-
52
- func TestIntegration_EmptyDirectory(t *testing.T) {
53
- dir := t.TempDir()
54
- prompt := runInitPipeline(t, dir, false)
55
- projectName := filepath.Base(dir)
56
-
57
- entries := []string{
58
- ".savepoint/config.yml",
59
- ".savepoint/Design.md",
60
- ".savepoint/PRD.md",
61
- ".savepoint/router.md",
62
- ".savepoint/visual-identity.md",
63
- "AGENTS.md",
64
- "agent-skills/savepoint-audit/SKILL.md",
65
- }
66
- for _, e := range entries {
67
- if _, err := os.Stat(filepath.Join(dir, e)); err != nil {
68
- t.Errorf("missing %s: %v", e, err)
69
- }
70
- }
71
-
72
- data, err := os.ReadFile(filepath.Join(dir, ".savepoint", "Design.md"))
73
- if err != nil {
74
- t.Fatal(err)
75
- }
76
- if !strings.Contains(string(data), projectName) {
77
- t.Errorf("Design.md content = %q, want to contain %q", string(data), projectName)
78
- }
79
-
80
- if !strings.Contains(prompt, projectName) {
81
- t.Errorf("prompt = %q, want to contain %q", prompt, projectName)
82
- }
83
- if !strings.Contains(prompt, "AGENT") {
84
- t.Errorf("prompt = %q, want AGENT marker", prompt)
85
- }
86
-
87
- result := CopyToClipboard(prompt)
88
- if result.Status != ClipboardCopied &&
89
- result.Status != ClipboardSkipped &&
90
- result.Status != ClipboardFailed {
91
- t.Errorf("unexpected clipboard status: %v", result.Status)
92
- }
93
- }
94
-
95
- func TestIntegration_CompatibleProject(t *testing.T) {
96
- dir := t.TempDir()
97
-
98
- for _, name := range []string{"package.json", ".git", "README.md"} {
99
- testutil.WriteFile(t, filepath.Join(dir, name), "")
100
- }
101
-
102
- prompt := runInitPipeline(t, dir, false)
103
-
104
- if _, err := os.Stat(filepath.Join(dir, "package.json")); err != nil {
105
- t.Errorf("package.json missing: %v", err)
106
- }
107
-
108
- if _, err := os.Stat(filepath.Join(dir, ".savepoint", "config.yml")); err != nil {
109
- t.Errorf(".savepoint/config.yml missing: %v", err)
110
- }
111
-
112
- if !strings.Contains(prompt, "AGENT") {
113
- t.Errorf("prompt should contain AGENT marker")
114
- }
115
- }
116
-
117
- func TestIntegration_NoForceOnExistingSavepoint(t *testing.T) {
118
- dir := t.TempDir()
119
-
120
- savepointDir := filepath.Join(dir, ".savepoint")
121
- if err := os.Mkdir(savepointDir, 0755); err != nil {
122
- t.Fatal(err)
123
- }
124
-
125
- err := ValidateTarget(dir, false)
126
- if err == nil {
127
- t.Fatal("expected error for existing .savepoint without --force")
128
- }
129
- if !strings.Contains(err.Error(), "already contains") {
130
- t.Errorf("error = %q, want 'already contains'", err.Error())
131
- }
132
- }
133
-
134
- func TestIntegration_ForceOverwritesExistingSavepoint(t *testing.T) {
135
- dir := t.TempDir()
136
-
137
- savepointDir := filepath.Join(dir, ".savepoint")
138
- if err := os.Mkdir(savepointDir, 0755); err != nil {
139
- t.Fatal(err)
140
- }
141
-
142
- prompt := runInitPipeline(t, dir, true)
143
-
144
- for _, path := range []string{
145
- ".savepoint/config.yml", ".savepoint/Design.md",
146
- ".savepoint/PRD.md", ".savepoint/router.md",
147
- } {
148
- if _, err := os.Stat(filepath.Join(dir, path)); err != nil {
149
- t.Errorf("expected %s to exist after --force: %v", path, err)
150
- }
151
- }
152
-
153
- if !strings.Contains(prompt, "AGENT") {
154
- t.Errorf("prompt should contain AGENT marker")
155
- }
156
- }
157
-
158
- func TestIntegration_InstallDependencies(t *testing.T) {
159
- if _, err := exec.LookPath("npm"); err != nil {
160
- t.Skip("npm not found in PATH, skipping install test")
161
- }
162
-
163
- dir := t.TempDir()
164
-
165
- packageJSON := filepath.Join(dir, "package.json")
166
- testutil.WriteFile(t, packageJSON, `{"name":"test","version":"0.0.0"}`)
167
-
168
- if err := ValidateTarget(dir, false); err != nil {
169
- t.Fatal(err)
170
- }
171
-
172
- if err := InstallDependencies(dir); err != nil {
173
- t.Fatalf("InstallDependencies() error = %v", err)
174
- }
175
-
176
- if _, err := os.Stat(filepath.Join(dir, "package-lock.json")); err != nil {
177
- t.Errorf("package-lock.json not created after npm install: %v", err)
178
- }
179
- }
180
-
181
- func TestIntegration_MagicPromptInOutput(t *testing.T) {
182
- dir := t.TempDir()
183
- prompt := runInitPipeline(t, dir, false)
184
- projectName := filepath.Base(dir)
185
-
186
- expectedParts := []string{
187
- projectName,
188
- "AGENT",
189
- "AGENTS.md",
190
- "Project",
191
- }
192
- for _, part := range expectedParts {
193
- if !strings.Contains(prompt, part) {
194
- t.Errorf("prompt missing %q", part)
195
- }
196
- }
197
- }
@@ -1,14 +0,0 @@
1
- package init
2
-
3
- import (
4
- "fmt"
5
- "io/fs"
6
- )
7
-
8
- func RenderMagicPrompt(templates fs.FS, projectName string) (string, error) {
9
- content, err := fs.ReadFile(templates, "magic-prompt.prompt.md")
10
- if err != nil {
11
- return "", fmt.Errorf("read magic prompt template: %w", err)
12
- }
13
- return interpolate(string(content), projectName), nil
14
- }