savepoint 1.0.0

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 (273) hide show
  1. package/.claude/settings.local.json +20 -0
  2. package/.prettierignore +4 -0
  3. package/.savepoint/Design.md +196 -0
  4. package/.savepoint/PRD.md +58 -0
  5. package/.savepoint/audit/E01-go-setup/proposals.md +166 -0
  6. package/.savepoint/audit/E01-go-setup/snapshot.md +71 -0
  7. package/.savepoint/audit/E01-scaffolding/proposals/AGENTS.md +66 -0
  8. package/.savepoint/audit/E01-scaffolding/proposals/Design.md +210 -0
  9. package/.savepoint/audit/E01-scaffolding/proposals/epic-Design.md +117 -0
  10. package/.savepoint/audit/E01-scaffolding/proposals/quality-review.md +101 -0
  11. package/.savepoint/audit/E01-scaffolding/snapshot.md +54 -0
  12. package/.savepoint/audit/E02-data-model/snapshot.md +128 -0
  13. package/.savepoint/audit/E02-data-readers/proposals.md +123 -0
  14. package/.savepoint/audit/E02-data-readers/snapshot.md +54 -0
  15. package/.savepoint/audit/E03-board-tui-core/proposals.md +146 -0
  16. package/.savepoint/audit/E03-board-tui-core/snapshot.md +57 -0
  17. package/.savepoint/audit/E03-cli-foundation/snapshot.md +106 -0
  18. package/.savepoint/audit/E04-board-components/proposals.md +118 -0
  19. package/.savepoint/audit/E04-board-components/snapshot.md +77 -0
  20. package/.savepoint/audit/E04-templates-and-prompts/snapshot.md +115 -0
  21. package/.savepoint/audit/E05-init-command/snapshot.md +125 -0
  22. package/.savepoint/audit/E05-phase-transitions/proposals.md +83 -0
  23. package/.savepoint/audit/E05-phase-transitions/snapshot.md +36 -0
  24. package/.savepoint/audit/E06-tui-board/snapshot.md +64 -0
  25. package/.savepoint/audit/E07-audit-pipeline/snapshot.md +165 -0
  26. package/.savepoint/audit/E08-board-workflow-cleanup/snapshot.md +65 -0
  27. package/.savepoint/config.yml +27 -0
  28. package/.savepoint/releases/v1/PRD.md +66 -0
  29. package/.savepoint/releases/v1/epics/E01-go-setup/Design.md +39 -0
  30. package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T001-init-module.md +42 -0
  31. package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T002-entrypoint.md +23 -0
  32. package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T003-directory-structure.md +24 -0
  33. package/.savepoint/releases/v1/epics/E01-go-setup/tasks/T004-makefile.md +23 -0
  34. package/.savepoint/releases/v1/epics/E02-data-readers/Design.md +61 -0
  35. package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T001-task-struct.md +29 -0
  36. package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T002-frontmatter-parser.md +30 -0
  37. package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T003-router-reader.md +29 -0
  38. package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T004-config-reader.md +29 -0
  39. package/.savepoint/releases/v1/epics/E02-data-readers/tasks/T005-discovery.md +30 -0
  40. package/.savepoint/releases/v1/epics/E03-board-tui-core/Design.md +38 -0
  41. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T001-model.md +29 -0
  42. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T002-update-loop.md +30 -0
  43. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T003-view.md +34 -0
  44. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T004-styles.md +29 -0
  45. package/.savepoint/releases/v1/epics/E03-board-tui-core/tasks/T005-layout.md +42 -0
  46. package/.savepoint/releases/v1/epics/E04-board-components/Design.md +44 -0
  47. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T001-column.md +34 -0
  48. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T002-card.md +33 -0
  49. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T003-epic-panel.md +49 -0
  50. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T004-detail-overlay.md +40 -0
  51. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T005-release-dropdown.md +33 -0
  52. package/.savepoint/releases/v1/epics/E04-board-components/tasks/T006-help-overlay.md +34 -0
  53. package/.savepoint/releases/v1/epics/E05-phase-transitions/Design.md +38 -0
  54. package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T001-phase-stepping.md +29 -0
  55. package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T002-gates.md +31 -0
  56. package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T003-write-task.md +31 -0
  57. package/.savepoint/releases/v1/epics/E05-phase-transitions/tasks/T004-write-router.md +31 -0
  58. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/Design.md +42 -0
  59. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T001-color-system.md +39 -0
  60. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T002-header-and-dividers.md +52 -0
  61. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T003-footer-status-bar.md +52 -0
  62. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T004-component-refinement.md +53 -0
  63. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T005-restore-nav-hints.md +39 -0
  64. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T007-detail-card-fixes.md +36 -0
  65. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T008-checkbox-states.md +38 -0
  66. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T009-router-priority-marker.md +41 -0
  67. package/.savepoint/releases/v1/epics/E06-atari-noir-layout/tasks/T010-auto-refresh-watcher.md +61 -0
  68. package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/Design.md +39 -0
  69. package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T001-archive-epics.md +20 -0
  70. package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T002-rewrite-prd.md +22 -0
  71. package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T003-create-epic-stubs.md +24 -0
  72. package/.savepoint/releases/v1/epics/_archived/E01-archive-and-reset/tasks/T004-update-router.md +22 -0
  73. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/Design.md +118 -0
  74. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/handoff.md +9 -0
  75. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T001-package-baseline.md +45 -0
  76. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T002-typescript-build.md +48 -0
  77. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T003-vitest-smoke.md +43 -0
  78. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T004-lint-format-gates.md +45 -0
  79. package/.savepoint/releases/v1/epics/_archived/E01-scaffolding/tasks/T005-scaffold-verification.md +40 -0
  80. package/.savepoint/releases/v1/epics/_archived/E02-data-model/Design.md +142 -0
  81. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T001-domain-ids-status.md +27 -0
  82. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T002-markdown-frontmatter-boundary.md +28 -0
  83. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T003-task-documents.md +29 -0
  84. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T004-release-epic-router-config-readers.md +30 -0
  85. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T005-dependency-validation.md +29 -0
  86. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T006-epic-task-set-reader.md +29 -0
  87. package/.savepoint/releases/v1/epics/_archived/E02-data-model/tasks/T007-quality-gates.md +31 -0
  88. package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/Design.md +40 -0
  89. package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T001-phase-types.md +27 -0
  90. package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T002-phase-frontmatter.md +25 -0
  91. package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T003-simplify-config.md +26 -0
  92. package/.savepoint/releases/v1/epics/_archived/E02-domain-phase-model/tasks/T004-simplify-router-domain.md +24 -0
  93. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/Design.md +122 -0
  94. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T001-argument-parser-contract.md +28 -0
  95. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T002-help-text-generation.md +28 -0
  96. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T003-terminal-environment-detection.md +27 -0
  97. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T004-command-stub-modules.md +29 -0
  98. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T005-cli-runner-dispatch.md +34 -0
  99. package/.savepoint/releases/v1/epics/_archived/E03-cli-foundation/tasks/T006-entrypoint-quality-gates.md +32 -0
  100. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/Design.md +43 -0
  101. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T001-strip-args.md +26 -0
  102. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T002-strip-help.md +23 -0
  103. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T003-strip-run.md +23 -0
  104. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T004-delete-commands.md +24 -0
  105. package/.savepoint/releases/v1/epics/_archived/E03-cli-simplify/tasks/T005-update-cli-tests.md +22 -0
  106. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/Design.md +48 -0
  107. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T001-board-data-phases.md +26 -0
  108. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T002-phase-rendering.md +28 -0
  109. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T003-detail-pane-phases.md +27 -0
  110. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T004-phase-transitions.md +42 -0
  111. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T005-phase-gates.md +24 -0
  112. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T006-phase-write-back.md +24 -0
  113. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T007-remove-audit-flow.md +27 -0
  114. package/.savepoint/releases/v1/epics/_archived/E04-board-phase-integration/tasks/T008-board-tests.md +25 -0
  115. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/Design.md +85 -0
  116. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T001-project-template-assets.md +17 -0
  117. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T002-release-and-prompt-assets.md +20 -0
  118. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T003-template-registry-renderer.md +22 -0
  119. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T004-template-integrity-tests.md +17 -0
  120. package/.savepoint/releases/v1/epics/_archived/E04-templates-and-prompts/tasks/T005-template-closeout-quality-gates.md +16 -0
  121. package/.savepoint/releases/v1/epics/_archived/E05-init-command/Design.md +88 -0
  122. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T001-init-cli-contract.md +22 -0
  123. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T002-target-validation.md +23 -0
  124. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T003-scaffold-writer.md +24 -0
  125. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T004-magic-prompt-and-clipboard.md +23 -0
  126. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T005-dev-deps-install-option.md +24 -0
  127. package/.savepoint/releases/v1/epics/_archived/E05-init-command/tasks/T006-init-command-integration.md +28 -0
  128. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/Design.md +53 -0
  129. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T001-delete-dead-src.md +23 -0
  130. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T002-delete-dead-tests.md +26 -0
  131. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T003-delete-assets.md +25 -0
  132. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T004-clean-savepoint.md +28 -0
  133. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T005-rewrite-agents-md.md +28 -0
  134. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T006-clean-package-json.md +23 -0
  135. package/.savepoint/releases/v1/epics/_archived/E05-project-cleanup/tasks/T007-verify.md +25 -0
  136. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/Design.md +104 -0
  137. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T001-board-command-data.md +23 -0
  138. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T002-board-view-state.md +24 -0
  139. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T003-transition-gates-and-writes.md +25 -0
  140. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T004-terminal-theme.md +23 -0
  141. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T005-ink-board-ui.md +26 -0
  142. package/.savepoint/releases/v1/epics/_archived/E06-tui-board/tasks/T006-board-integration-audit-entry.md +24 -0
  143. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/Design.md +88 -0
  144. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T001-audit-cli-contract.md +23 -0
  145. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T002-quality-gate-runner.md +23 -0
  146. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T003-snapshot-and-prompt.md +23 -0
  147. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T004-audit-orchestration-router.md +27 -0
  148. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T005-proposal-validation-apply.md +25 -0
  149. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T006-audit-review-state.md +24 -0
  150. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T007-audit-review-ui.md +26 -0
  151. package/.savepoint/releases/v1/epics/_archived/E07-audit-pipeline/tasks/T008-audit-pipeline-integration.md +24 -0
  152. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/Design.md +103 -0
  153. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T001-acceptance-criteria-model.md +30 -0
  154. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T002-release-task-set-reader.md +33 -0
  155. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T003-board-data-and-plain-output.md +34 -0
  156. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T004-board-selection-state.md +33 -0
  157. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T005-ink-board-layout-cleanup.md +37 -0
  158. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T006-task-detail-popup.md +36 -0
  159. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T007-templates-acceptance-criteria.md +34 -0
  160. package/.savepoint/releases/v1/epics/_archived/E08-board-workflow-cleanup/tasks/T008-board-workflow-integration.md +41 -0
  161. package/.savepoint/releases/v1/epics/_archived/E09-doctor-command/Design.md +70 -0
  162. package/.savepoint/releases/v1/epics/_archived/E10-docs-and-packaging/Design.md +68 -0
  163. package/.savepoint/releases/v1/epics/_archived/E11-release-validation/Design.md +68 -0
  164. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/Design.md +26 -0
  165. package/.savepoint/releases/v1.1/epics/E01-tui-optimisation/tasks/T001-border-resize-fix.md +35 -0
  166. package/.savepoint/router.md +136 -0
  167. package/.savepoint/visual-identity.md +124 -0
  168. package/AGENTS.md +141 -0
  169. package/CLAUDE.md +1 -0
  170. package/GEMINI.md +1 -0
  171. package/LICENSE +21 -0
  172. package/Makefile +13 -0
  173. package/README.md +78 -0
  174. package/agent-skills/ink-tui-design/SKILL.md +309 -0
  175. package/agent-skills/ink-tui-design/references/component-patterns.md +371 -0
  176. package/agent-skills/ink-tui-design/references/hooks-guide.md +436 -0
  177. package/agent-skills/ink-tui-design/references/ink-gotchas.md +330 -0
  178. package/agent-skills/ink-tui-design/references/testing-patterns.md +384 -0
  179. package/agent-skills/savepoint-audit/SKILL.md +35 -0
  180. package/agent-skills/savepoint-build-task/SKILL.md +39 -0
  181. package/agent-skills/savepoint-create-plan/SKILL.md +28 -0
  182. package/agent-skills/savepoint-create-task/SKILL.md +31 -0
  183. package/agent-skills/savepoint-draft-prd/SKILL.md +32 -0
  184. package/agent-skills/savepoint-system-design/SKILL.md +33 -0
  185. package/agent-skills/superpowers/brainstorming/SKILL.md +165 -0
  186. package/agent-skills/superpowers/brainstorming/visual-companion.md +304 -0
  187. package/agent-skills/superpowers/dispatching-parallel-agents/SKILL.md +193 -0
  188. package/agent-skills/superpowers/executing-plans/SKILL.md +77 -0
  189. package/agent-skills/superpowers/finishing-a-development-branch/SKILL.md +213 -0
  190. package/agent-skills/superpowers/receiving-code-review/SKILL.md +226 -0
  191. package/agent-skills/superpowers/requesting-code-review/SKILL.md +115 -0
  192. package/agent-skills/superpowers/requesting-code-review/code-reviewer.md +160 -0
  193. package/agent-skills/superpowers/subagent-driven-development/SKILL.md +292 -0
  194. package/agent-skills/superpowers/subagent-driven-development/code-quality-reviewer-prompt.md +27 -0
  195. package/agent-skills/superpowers/subagent-driven-development/implementer-prompt.md +113 -0
  196. package/agent-skills/superpowers/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  197. package/agent-skills/superpowers/systematic-debugging/SKILL.md +305 -0
  198. package/agent-skills/superpowers/systematic-debugging/condition-based-waiting.md +122 -0
  199. package/agent-skills/superpowers/systematic-debugging/defense-in-depth.md +130 -0
  200. package/agent-skills/superpowers/systematic-debugging/root-cause-tracing.md +183 -0
  201. package/agent-skills/superpowers/test-driven-development/SKILL.md +389 -0
  202. package/agent-skills/superpowers/test-driven-development/testing-anti-patterns.md +317 -0
  203. package/agent-skills/superpowers/verification-before-completion/SKILL.md +147 -0
  204. package/agent-skills/superpowers/writing-plans/SKILL.md +159 -0
  205. package/agent-skills/superpowers/writing-plans/plan-document-reviewer-prompt.md +49 -0
  206. package/assets/banner.png +0 -0
  207. package/assets/logo.png +0 -0
  208. package/assets/strawman.png +0 -0
  209. package/go.mod +33 -0
  210. package/go.sum +73 -0
  211. package/ink-cli-ui-design.zip +0 -0
  212. package/internal/board/board.go +121 -0
  213. package/internal/board/board_test.go +99 -0
  214. package/internal/board/card.go +72 -0
  215. package/internal/board/card_test.go +111 -0
  216. package/internal/board/column.go +61 -0
  217. package/internal/board/column_test.go +81 -0
  218. package/internal/board/detail.go +140 -0
  219. package/internal/board/detail_test.go +233 -0
  220. package/internal/board/epic_panel.go +69 -0
  221. package/internal/board/epic_panel_test.go +246 -0
  222. package/internal/board/help.go +40 -0
  223. package/internal/board/help_test.go +85 -0
  224. package/internal/board/layout.go +58 -0
  225. package/internal/board/layout_test.go +89 -0
  226. package/internal/board/model.go +151 -0
  227. package/internal/board/model_test.go +67 -0
  228. package/internal/board/release.go +42 -0
  229. package/internal/board/release_test.go +177 -0
  230. package/internal/board/transitions.go +88 -0
  231. package/internal/board/transitions_test.go +141 -0
  232. package/internal/board/update.go +155 -0
  233. package/internal/board/update_test.go +128 -0
  234. package/internal/board/view.go +190 -0
  235. package/internal/board/view_test.go +147 -0
  236. package/internal/data/config.go +87 -0
  237. package/internal/data/config_test.go +73 -0
  238. package/internal/data/discover.go +152 -0
  239. package/internal/data/discover_test.go +106 -0
  240. package/internal/data/errors.go +9 -0
  241. package/internal/data/lifecycle.go +37 -0
  242. package/internal/data/lifecycle_test.go +38 -0
  243. package/internal/data/parser.go +189 -0
  244. package/internal/data/parser_test.go +216 -0
  245. package/internal/data/router.go +52 -0
  246. package/internal/data/router_test.go +35 -0
  247. package/internal/data/task.go +46 -0
  248. package/internal/data/task_test.go +51 -0
  249. package/internal/data/write.go +144 -0
  250. package/internal/data/write_test.go +456 -0
  251. package/internal/styles/palette.go +47 -0
  252. package/internal/styles/styles.go +122 -0
  253. package/main.exe +0 -0
  254. package/main.go +11 -0
  255. package/package.json +25 -0
  256. package/savepoint +0 -0
  257. package/savepoint.exe +0 -0
  258. package/scripts/vitest-preload.cjs +95 -0
  259. package/templates/project/.savepoint/Design.md +47 -0
  260. package/templates/project/.savepoint/PRD.md +34 -0
  261. package/templates/project/.savepoint/config.yml +27 -0
  262. package/templates/project/.savepoint/router.md +152 -0
  263. package/templates/project/.savepoint/visual-identity.md +122 -0
  264. package/templates/project/AGENTS.md +130 -0
  265. package/templates/prompts/audit-reconciliation.prompt.md +67 -0
  266. package/templates/prompts/design.prompt.md +43 -0
  267. package/templates/prompts/epic-design.prompt.md +43 -0
  268. package/templates/prompts/magic-prompt.prompt.md +7 -0
  269. package/templates/prompts/prd.prompt.md +42 -0
  270. package/templates/prompts/task-breakdown.prompt.md +54 -0
  271. package/templates/prompts/task-building.prompt.md +38 -0
  272. package/templates/prompts/task-planning.prompt.md +53 -0
  273. package/templates/release/v1/PRD.md +37 -0
@@ -0,0 +1,436 @@
1
+ # Custom Hooks Design Guide
2
+
3
+ ## Table of Contents
4
+
5
+ 1. [Design Principles](#design-principles)
6
+ 2. [useScreenState](#usescreenstate)
7
+ 3. [useTerminalSize](#useterminalsize)
8
+ 4. [useAsyncData](#useasyncdata)
9
+ 5. [useInput Patterns](#useinput-patterns)
10
+ 6. [useSpinner](#usespinner)
11
+
12
+ ---
13
+
14
+ ## Design Principles
15
+
16
+ ### Single Responsibility
17
+
18
+ Each hook handles exactly one concern.
19
+
20
+ ```typescript
21
+ // Good: single responsibility
22
+ function useScreenState() { ... } // screen navigation only
23
+ function useTerminalSize() { ... } // size monitoring only
24
+
25
+ // Bad: multiple concerns
26
+ function useAppState() {
27
+ // screen navigation, data fetching, terminal size...
28
+ }
29
+ ```
30
+
31
+ ### Return Objects
32
+
33
+ Group related state and functions in a returned object.
34
+
35
+ ```typescript
36
+ interface UseAsyncDataResult<T> {
37
+ data: T[];
38
+ loading: boolean;
39
+ error: Error | null;
40
+ refresh: () => Promise<void>;
41
+ }
42
+
43
+ function useAsyncData<T>(): UseAsyncDataResult<T> {
44
+ // ...
45
+ return { data, loading, error, refresh };
46
+ }
47
+ ```
48
+
49
+ ### Cleanup
50
+
51
+ Always return a cleanup function from `useEffect`.
52
+
53
+ ```typescript
54
+ useEffect(() => {
55
+ const handler = () => { ... };
56
+ process.stdout.on("resize", handler);
57
+
58
+ return () => {
59
+ process.stdout.removeListener("resize", handler);
60
+ };
61
+ }, []);
62
+ ```
63
+
64
+ ### Exact Dependencies
65
+
66
+ Specify dependency arrays accurately for `useCallback` / `useEffect` / `useMemo`.
67
+
68
+ ```typescript
69
+ const loadData = useCallback(async () => {
70
+ setLoading(true);
71
+ const data = await fetchData(options); // uses options
72
+ setData(data);
73
+ setLoading(false);
74
+ }, [options]); // options is a dependency
75
+ ```
76
+
77
+ ---
78
+
79
+ ## useScreenState
80
+
81
+ Stack-based screen navigation.
82
+
83
+ ```typescript
84
+ import { useState, useCallback } from "react";
85
+ import type { ScreenType } from "../types.js";
86
+
87
+ export interface ScreenStateResult {
88
+ currentScreen: ScreenType;
89
+ navigateTo: (screen: ScreenType) => void;
90
+ goBack: () => void;
91
+ reset: () => void;
92
+ }
93
+
94
+ const INITIAL_SCREEN: ScreenType = "board";
95
+
96
+ export function useScreenState(): ScreenStateResult {
97
+ const [history, setHistory] = useState<ScreenType[]>([INITIAL_SCREEN]);
98
+
99
+ const currentScreen = history[history.length - 1] ?? INITIAL_SCREEN;
100
+
101
+ const navigateTo = useCallback((screen: ScreenType) => {
102
+ setHistory((prev) => [...prev, screen]);
103
+ }, []);
104
+
105
+ const goBack = useCallback(() => {
106
+ setHistory((prev) => {
107
+ if (prev.length <= 1) {
108
+ return prev; // Cannot go back from initial screen
109
+ }
110
+ return prev.slice(0, -1);
111
+ });
112
+ }, []);
113
+
114
+ const reset = useCallback(() => {
115
+ setHistory([INITIAL_SCREEN]);
116
+ }, []);
117
+
118
+ return {
119
+ currentScreen,
120
+ navigateTo,
121
+ goBack,
122
+ reset,
123
+ };
124
+ }
125
+ ```
126
+
127
+ ### Usage
128
+
129
+ ```typescript
130
+ function App() {
131
+ const { currentScreen, navigateTo, goBack } = useScreenState();
132
+
133
+ const renderScreen = () => {
134
+ switch (currentScreen) {
135
+ case "board":
136
+ return (
137
+ <BoardScreen
138
+ onSelect={(task) => {
139
+ setTask(task);
140
+ navigateTo("detail");
141
+ }}
142
+ />
143
+ );
144
+ case "detail":
145
+ return (
146
+ <DetailScreen
147
+ onBack={goBack}
148
+ onAction={handleAction}
149
+ />
150
+ );
151
+ default:
152
+ return null;
153
+ }
154
+ };
155
+
156
+ return <Box>{renderScreen()}</Box>;
157
+ }
158
+ ```
159
+
160
+ ---
161
+
162
+ ## useTerminalSize
163
+
164
+ Terminal size detection and resize monitoring.
165
+
166
+ > **Note:** In non-TTY environments (CI, tests), `process.stdout.rows` /
167
+ > `columns` may be `undefined`. Always provide fallback values. Also check
168
+ > `process.stdout.isTTY` and skip resize event listeners in non-TTY mode.
169
+
170
+ ```typescript
171
+ import { useState, useEffect } from "react";
172
+
173
+ export interface TerminalSize {
174
+ rows: number;
175
+ columns: number;
176
+ }
177
+
178
+ export function useTerminalSize(): TerminalSize {
179
+ const [size, setSize] = useState<TerminalSize>(() => ({
180
+ rows: process.stdout.rows || 24,
181
+ columns: process.stdout.columns || 80,
182
+ }));
183
+
184
+ useEffect(() => {
185
+ const handleResize = () => {
186
+ setSize({
187
+ rows: process.stdout.rows || 24,
188
+ columns: process.stdout.columns || 80,
189
+ });
190
+ };
191
+
192
+ process.stdout.on("resize", handleResize);
193
+ return () => {
194
+ process.stdout.removeListener("resize", handleResize);
195
+ };
196
+ }, []);
197
+
198
+ return size;
199
+ }
200
+ ```
201
+
202
+ ### Usage
203
+
204
+ ```typescript
205
+ function BoardScreen() {
206
+ const { rows, columns } = useTerminalSize();
207
+
208
+ const headerHeight = 2;
209
+ const footerHeight = 1;
210
+ const availableRows = rows - headerHeight - footerHeight;
211
+
212
+ return (
213
+ <Box flexDirection="column">
214
+ <Header />
215
+ <Select items={items} limit={Math.max(5, availableRows)} />
216
+ <Footer />
217
+ </Box>
218
+ );
219
+ }
220
+ ```
221
+
222
+ ---
223
+
224
+ ## useAsyncData
225
+
226
+ Async data fetching with loading, error, and refresh states.
227
+
228
+ ```typescript
229
+ import { useState, useCallback, useEffect } from "react";
230
+
231
+ export interface UseAsyncDataOptions {
232
+ enableAutoRefresh?: boolean;
233
+ refreshInterval?: number;
234
+ }
235
+
236
+ export interface UseAsyncDataResult<T> {
237
+ data: T[];
238
+ loading: boolean;
239
+ error: Error | null;
240
+ lastUpdated: Date | null;
241
+ refresh: () => Promise<void>;
242
+ }
243
+
244
+ export function useAsyncData<T>(
245
+ fetcher: () => Promise<T[]>,
246
+ options?: UseAsyncDataOptions,
247
+ ): UseAsyncDataResult<T> {
248
+ const { enableAutoRefresh = false, refreshInterval = 30000 } = options ?? {};
249
+
250
+ const [data, setData] = useState<T[]>([]);
251
+ const [loading, setLoading] = useState(true);
252
+ const [error, setError] = useState<Error | null>(null);
253
+ const [lastUpdated, setLastUpdated] = useState<Date | null>(null);
254
+
255
+ const loadData = useCallback(async () => {
256
+ setLoading(true);
257
+ setError(null);
258
+
259
+ try {
260
+ const result = await fetcher();
261
+ setData(result);
262
+ setLastUpdated(new Date());
263
+ } catch (err) {
264
+ setError(err instanceof Error ? err : new Error(String(err)));
265
+ } finally {
266
+ setLoading(false);
267
+ }
268
+ }, [fetcher]);
269
+
270
+ // Initial load
271
+ useEffect(() => {
272
+ loadData();
273
+ }, [loadData]);
274
+
275
+ // Auto-refresh
276
+ useEffect(() => {
277
+ if (!enableAutoRefresh) return;
278
+
279
+ const intervalId = setInterval(loadData, refreshInterval);
280
+ return () => clearInterval(intervalId);
281
+ }, [enableAutoRefresh, refreshInterval, loadData]);
282
+
283
+ return {
284
+ data,
285
+ loading,
286
+ error,
287
+ lastUpdated,
288
+ refresh: loadData,
289
+ };
290
+ }
291
+ ```
292
+
293
+ ### Cancel-Safe Pattern
294
+
295
+ Prevent state updates after unmount:
296
+
297
+ ```typescript
298
+ const loadData = useCallback(async () => {
299
+ let cancelled = false;
300
+
301
+ setLoading(true);
302
+
303
+ try {
304
+ const data = await fetchData();
305
+
306
+ if (!cancelled) {
307
+ setData(data);
308
+ }
309
+ } catch (err) {
310
+ if (!cancelled) {
311
+ setError(err);
312
+ }
313
+ } finally {
314
+ if (!cancelled) {
315
+ setLoading(false);
316
+ }
317
+ }
318
+
319
+ return () => {
320
+ cancelled = true;
321
+ };
322
+ }, []);
323
+ ```
324
+
325
+ ---
326
+
327
+ ## useInput Patterns
328
+
329
+ ### Basic Pattern
330
+
331
+ ```typescript
332
+ import { useInput } from "ink";
333
+
334
+ function MyComponent() {
335
+ useInput((input, key) => {
336
+ if (key.escape) {
337
+ handleEscape();
338
+ }
339
+ if (key.return) {
340
+ handleEnter();
341
+ }
342
+ if (key.upArrow || input === "k") {
343
+ moveUp();
344
+ }
345
+ if (key.downArrow || input === "j") {
346
+ moveDown();
347
+ }
348
+ });
349
+ }
350
+ ```
351
+
352
+ ### Conditional Handling
353
+
354
+ ```typescript
355
+ function MyComponent({ disabled, mode }: Props) {
356
+ useInput((input, key) => {
357
+ if (disabled) return;
358
+
359
+ if (mode === "edit") {
360
+ // Edit mode handling
361
+ } else {
362
+ // Normal mode handling
363
+ }
364
+ });
365
+ }
366
+ ```
367
+
368
+ ### Global Shortcuts
369
+
370
+ ```typescript
371
+ function App() {
372
+ const [filterMode, setFilterMode] = useState(false);
373
+
374
+ useInput((input, key) => {
375
+ if (filterMode) return; // Disabled while filtering
376
+
377
+ switch (input) {
378
+ case "q":
379
+ handleQuit();
380
+ break;
381
+ case "r":
382
+ handleRefresh();
383
+ break;
384
+ case "c":
385
+ handleCleanup();
386
+ break;
387
+ }
388
+ });
389
+
390
+ return (
391
+ <Box>
392
+ <FilterInput
393
+ onFocus={() => setFilterMode(true)}
394
+ onBlur={() => setFilterMode(false)}
395
+ />
396
+ </Box>
397
+ );
398
+ }
399
+ ```
400
+
401
+ ---
402
+
403
+ ## useSpinner
404
+
405
+ Braille-pattern spinner for loading states.
406
+
407
+ ```typescript
408
+ const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧"];
409
+
410
+ function useSpinner(isActive: boolean) {
411
+ const [frameIndex, setFrameIndex] = useState(0);
412
+ const frameRef = useRef(0);
413
+
414
+ useEffect(() => {
415
+ if (!isActive) return;
416
+
417
+ const interval = setInterval(() => {
418
+ frameRef.current = (frameRef.current + 1) % SPINNER_FRAMES.length;
419
+ setFrameIndex(frameRef.current);
420
+ }, 80); // 80ms = 12.5 FPS
421
+
422
+ return () => clearInterval(interval);
423
+ }, [isActive]);
424
+
425
+ return SPINNER_FRAMES[frameIndex];
426
+ }
427
+
428
+ // Usage
429
+ function LoadingIndicator({ loading }: { loading: boolean }) {
430
+ const frame = useSpinner(loading);
431
+
432
+ if (!loading) return null;
433
+
434
+ return <Text>{frame} Loading...</Text>;
435
+ }
436
+ ```