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,122 @@
1
+ package styles
2
+
3
+ import "github.com/charmbracelet/lipgloss"
4
+
5
+ func color(hex, ansi256, ansi string) lipgloss.CompleteColor {
6
+ return lipgloss.CompleteColor{TrueColor: hex, ANSI256: ansi256, ANSI: ansi}
7
+ }
8
+
9
+ var (
10
+ clrOrange = color(AtariOrange, AtariOrange256, AtariOrange16)
11
+ clrText = color(PrimaryText, PrimaryText256, PrimaryText16)
12
+ clrBorder = color(BorderSubtle, BorderSubtle256, BorderSubtle16)
13
+ clrSurface = color(Surface2, Surface2256, Surface216) // #0F0F0F
14
+ clrSurfaceDark = color(Surface, Surface256, Surface16) // #0D0D0D
15
+ clrGreen = color(NPPGreen, NPPGreen256, NPPGreen16)
16
+ clrPurple = color(VibePurple, VibePurple256, VibePurple16)
17
+ clrDim = color(Dim, Dim256, Dim16)
18
+ )
19
+
20
+ var (
21
+ HeaderIcon = lipgloss.NewStyle().
22
+ Foreground(clrOrange).
23
+ Bold(true)
24
+
25
+ HeaderText = lipgloss.NewStyle().
26
+ Foreground(clrText)
27
+
28
+ Divider = lipgloss.NewStyle().
29
+ Foreground(clrBorder)
30
+
31
+ HeaderFrame = lipgloss.NewStyle().
32
+ BorderStyle(lipgloss.RoundedBorder()).
33
+ BorderForeground(clrBorder).
34
+ Padding(1, 1)
35
+
36
+ BoardFrame = lipgloss.NewStyle().
37
+ BorderStyle(lipgloss.RoundedBorder()).
38
+ BorderForeground(clrBorder).
39
+ Padding(0, 1)
40
+
41
+ Column = lipgloss.NewStyle().
42
+ BorderStyle(lipgloss.RoundedBorder()).
43
+ BorderForeground(clrBorder).
44
+ Background(clrSurfaceDark).
45
+ Padding(0, 1)
46
+
47
+ ColumnFocused = lipgloss.NewStyle().
48
+ BorderStyle(lipgloss.RoundedBorder()).
49
+ BorderForeground(clrOrange).
50
+ Background(clrSurfaceDark).
51
+ Padding(0, 1)
52
+
53
+ ColumnTitle = lipgloss.NewStyle().
54
+ Foreground(clrText).
55
+ Bold(true)
56
+
57
+ ColumnTitleFocused = lipgloss.NewStyle().
58
+ Foreground(clrOrange).
59
+ Bold(true)
60
+
61
+ TaskItem = lipgloss.NewStyle().
62
+ Foreground(clrText)
63
+
64
+ TaskItemFocused = lipgloss.NewStyle().
65
+ Foreground(clrOrange)
66
+
67
+ StatusBar = lipgloss.NewStyle().
68
+ Foreground(clrText).
69
+ Background(clrSurface)
70
+
71
+ EpicPanel = lipgloss.NewStyle().
72
+ BorderStyle(lipgloss.RoundedBorder()).
73
+ BorderForeground(clrPurple).
74
+ Background(clrSurface).
75
+ Padding(0, 1)
76
+
77
+ Card = lipgloss.NewStyle().
78
+ BorderStyle(lipgloss.RoundedBorder()).
79
+ BorderForeground(clrBorder).
80
+ Background(clrSurface).
81
+ Padding(0, 1)
82
+
83
+ CardFocused = lipgloss.NewStyle().
84
+ BorderStyle(lipgloss.RoundedBorder()).
85
+ BorderForeground(clrOrange).
86
+ Background(clrSurface).
87
+ Padding(0, 1)
88
+
89
+ CardMeta = lipgloss.NewStyle().Foreground(clrDim)
90
+
91
+ GlyphBuild = lipgloss.NewStyle().Foreground(clrOrange)
92
+ GlyphTest = lipgloss.NewStyle().Foreground(clrGreen)
93
+ GlyphAudit = lipgloss.NewStyle().Foreground(clrPurple)
94
+
95
+ DetailOverlay = lipgloss.NewStyle().
96
+ BorderStyle(lipgloss.RoundedBorder()).
97
+ BorderForeground(clrOrange).
98
+ Padding(0, 1)
99
+
100
+ // Footer phase styles
101
+ FooterPhasePlan = lipgloss.NewStyle().
102
+ Foreground(clrPurple).
103
+ Bold(true)
104
+
105
+ FooterPhaseBuild = lipgloss.NewStyle().
106
+ Foreground(clrOrange).
107
+ Bold(true)
108
+
109
+ FooterPhaseAudit = lipgloss.NewStyle().
110
+ Foreground(clrGreen).
111
+ Bold(true)
112
+
113
+ FooterDivider = lipgloss.NewStyle().
114
+ Foreground(clrBorder)
115
+
116
+ FooterHints = lipgloss.NewStyle().
117
+ Foreground(clrDim)
118
+
119
+ // Tag styles for semantic encoding
120
+ TagDone = lipgloss.NewStyle().Foreground(clrGreen)
121
+ TagAI = lipgloss.NewStyle().Foreground(clrPurple)
122
+ )
package/main.exe ADDED
Binary file
package/main.go ADDED
@@ -0,0 +1,11 @@
1
+ package main
2
+
3
+ import (
4
+ "github.com/opencode/savepoint/internal/board"
5
+ )
6
+
7
+ func main() {
8
+ if err := board.Run(); err != nil {
9
+ panic(err)
10
+ }
11
+ }
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "savepoint",
3
+ "version": "1.0.0",
4
+ "description": "It’s a simple, file-based state machine and cinematic Terminal UI (TUI) designed to force you—and your agent (Claude, Cursor, Aider, Gemini)—to slow down, write down what you're actually building, and check your work before moving on.",
5
+ "keywords": [
6
+ "board",
7
+ "kanban",
8
+ "planning"
9
+ ],
10
+ "homepage": "https://github.com/anipatke/savepoint#readme",
11
+ "bugs": {
12
+ "url": "https://github.com/anipatke/savepoint/issues"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/anipatke/savepoint.git"
17
+ },
18
+ "license": "MIT",
19
+ "author": "anipatke",
20
+ "type": "Go",
21
+ "main": "main.go",
22
+ "scripts": {
23
+ "test": "savepoint init"
24
+ }
25
+ }
package/savepoint ADDED
Binary file
package/savepoint.exe ADDED
Binary file
@@ -0,0 +1,95 @@
1
+ const childProcess = require("node:child_process");
2
+ const esbuild = require("esbuild");
3
+
4
+ const originalExec = childProcess.exec;
5
+ const originalExecFile = childProcess.execFile;
6
+
7
+ function shouldStub(command) {
8
+ return (
9
+ typeof command === "string" && command.trim().toLowerCase() === "net use"
10
+ );
11
+ }
12
+
13
+ function fakeChildProcess() {
14
+ return {
15
+ pid: 0,
16
+ kill() {
17
+ return true;
18
+ },
19
+ stdin: null,
20
+ stdout: null,
21
+ stderr: null,
22
+ on() {
23
+ return this;
24
+ },
25
+ once() {
26
+ return this;
27
+ },
28
+ addListener() {
29
+ return this;
30
+ },
31
+ removeListener() {
32
+ return this;
33
+ },
34
+ };
35
+ }
36
+
37
+ // Vitest probes `net use` on Windows to detect network drive mappings, which fails in this scaffold.
38
+ childProcess.exec = function exec(command, options, callback) {
39
+ if (shouldStub(command)) {
40
+ const done = typeof options === "function" ? options : callback;
41
+ if (typeof done === "function") {
42
+ setImmediate(() => done(null, "", ""));
43
+ }
44
+ return fakeChildProcess();
45
+ }
46
+
47
+ return originalExec.call(this, command, options, callback);
48
+ };
49
+
50
+ childProcess.execFile = function execFile(file, args, options, callback) {
51
+ if (shouldStub(file)) {
52
+ const done =
53
+ typeof args === "function"
54
+ ? args
55
+ : typeof options === "function"
56
+ ? options
57
+ : callback;
58
+ if (typeof done === "function") {
59
+ setImmediate(() => done(null, "", ""));
60
+ }
61
+ return fakeChildProcess();
62
+ }
63
+
64
+ return originalExecFile.call(this, file, args, options, callback);
65
+ };
66
+
67
+ function identityTransform(input) {
68
+ const code =
69
+ typeof input === "string" ? input : (input?.toString("utf8") ?? "");
70
+ return Promise.resolve({
71
+ code,
72
+ map: "",
73
+ warnings: [],
74
+ errors: [],
75
+ mangleCache: {},
76
+ legalComments: "none",
77
+ });
78
+ }
79
+
80
+ function identityTransformSync(input) {
81
+ const code =
82
+ typeof input === "string" ? input : (input?.toString("utf8") ?? "");
83
+ return {
84
+ code,
85
+ map: "",
86
+ warnings: [],
87
+ errors: [],
88
+ mangleCache: {},
89
+ legalComments: "none",
90
+ };
91
+ }
92
+
93
+ // Vitest reaches into esbuild on Windows before the real transform path is ready.
94
+ esbuild.transform = identityTransform;
95
+ esbuild.transformSync = identityTransformSync;
@@ -0,0 +1,47 @@
1
+ ---
2
+ type: project-design
3
+ status: active
4
+ last_audited: never
5
+ ---
6
+
7
+ # {{PROJECT_NAME}} — System Architecture
8
+
9
+ > Project-level architecture. Audit-kept fresh: every epic's audit step merges its delta into this document.
10
+ >
11
+ > **Visual identity** lives separately in `.savepoint/visual-identity.md` and is loaded only for TUI/theme/visual tasks.
12
+
13
+ ## 1. Architecture model
14
+
15
+ <!-- High-level architecture pattern. -->
16
+
17
+ ## 2. Directory layout
18
+
19
+ <!-- Expected file structure. -->
20
+
21
+ ## 3. Hierarchy semantics
22
+
23
+ <!-- Definitions of release, epic, task, sub-task. -->
24
+
25
+ ## 4. Status model & gates
26
+
27
+ <!-- How work moves through states. -->
28
+
29
+ ## 5. Dependencies
30
+
31
+ <!-- How tasks depend on each other. -->
32
+
33
+ ## 6. CLI surface
34
+
35
+ <!-- Commands and flags if applicable. -->
36
+
37
+ ## 7. Audit pipeline
38
+
39
+ <!-- Steps the audit follows. -->
40
+
41
+ ## 8. Testing strategy
42
+
43
+ <!-- How the project is tested. -->
44
+
45
+ ## 9. Release versioning
46
+
47
+ <!-- Version scheme. -->
@@ -0,0 +1,34 @@
1
+ ---
2
+ type: project-prd
3
+ status: active
4
+ ---
5
+
6
+ # {{PROJECT_NAME}} — Product Vision
7
+
8
+ ## What it is
9
+
10
+ <!-- Describe what you are building in one paragraph. Be specific about the core mechanic (e.g., "A CLI tool that uses AI to write unit tests" instead of "An AI coding assistant"). -->
11
+
12
+ ## Why
13
+
14
+ <!-- What specific problem does this solve? Why does it need to exist now? (e.g., "Developers skip writing tests because it's tedious; this automates the drudgery so coverage stays high without the manual effort.") -->
15
+
16
+ ## Target user
17
+
18
+ <!-- Who is this for? Be specific. (e.g., "Vibe coders," "Junior frontend developers," "Indie hackers building SaaS MVPs"). If it's for everyone, it's for no one. -->
19
+
20
+ ## Headline differentiator
21
+
22
+ <!-- What makes this project unique? Why would someone use this over an existing alternative? (e.g., "It integrates directly into the savepoint audit loop, whereas others require a separate PR step.") -->
23
+
24
+ ## Success metrics
25
+
26
+ <!-- How do you know it's working for V1? (e.g., "Can generate a passing test suite for a 10-file React app in under 60 seconds with zero manual edits.") -->
27
+
28
+ ## Constraints
29
+
30
+ <!-- Hard limits. What tech stack MUST be used? Are there API cost limits, token limits, or specific libraries you refuse to use? -->
31
+
32
+ ## Out of scope (forever or for now)
33
+
34
+ <!-- What are you explicitly NOT building for V1? (e.g., "No database. No multi-user login. No web UI.") This is crucial for keeping the AI focused. -->
@@ -0,0 +1,27 @@
1
+ # Savepoint config — single source of truth for project preferences.
2
+
3
+ verify_strict: false # vibe-coder soft mode; tasks reach done on assertion. Set true for TDD-strict.
4
+
5
+ quality_gates:
6
+ lint: null
7
+ typecheck: null
8
+ test: null
9
+ block_on_failure: true
10
+
11
+ audit:
12
+ divergence_threshold: 0.5 # warn if a proposal changes >50% of a live file
13
+
14
+ theme:
15
+ bg: "#121212"
16
+ surface: "#0D0D0D"
17
+ surface_2: "#0F0F0F"
18
+ border: "#1A1A1A"
19
+ text: "#F0E6DA"
20
+ accents:
21
+ backlog: "#B1A1DF"
22
+ planned: "#B1A1DF"
23
+ in_progress: "#FC6323"
24
+ review: "#FC6323"
25
+ done: "#A4C639"
26
+ blocked: "#FF4444"
27
+ borders: "subtle"
@@ -0,0 +1,152 @@
1
+ # Agent State Machine
2
+
3
+ This file routes the agent based on the project's current state. Read this whenever you start a session.
4
+
5
+ ## Read order on every session
6
+
7
+ 1. This file (you are here)
8
+ 2. The current state below to know what to do next
9
+ 3. The active epic Design
10
+ 4. The active task file, when a task is selected
11
+
12
+ Read `.savepoint/PRD.md` only for project vision changes. Read `.savepoint/Design.md` only for architecture changes or audit closeout. Read `.savepoint/releases/v{{RELEASE_NUMBER}}/PRD.md` only for release planning or epic-order questions.
13
+
14
+ **Conditional read (token discipline):** if your active task touches **Ink/TUI implementation**, also read `agent-skills/ink-tui-design/SKILL.md` after Design.md as the execution guide. If it touches **TUI rendering, theme, or visual design**, also read `.savepoint/visual-identity.md` as the visual guardrails. Otherwise skip the extra files — they are tokens you do not need.
15
+
16
+ ## Current state
17
+
18
+ ```yaml
19
+ state: pre-implementation
20
+ release: v{{RELEASE_NUMBER}}
21
+ epic: none
22
+ task: none
23
+ next_action: "The project has its PRD and Design locked but no epics defined yet. Help the user define the epics list and confirm priority."
24
+ ```
25
+
26
+ ## Manual audit override
27
+
28
+ If the user explicitly asks you to audit an epic, perform the audit for that epic even if the router has not reached `state: audit-pending` yet.
29
+
30
+ Persist the audit artifacts before replying:
31
+
32
+ - Ensure `.savepoint/audit/{E##-epic}/snapshot.md` exists. Create a manual snapshot once if needed.
33
+ - Write the proposal bundle to `.savepoint/audit/{E##-epic}/proposals.md`.
34
+ - Do not stop at chat-only findings. The filesystem artifact is part of the task output.
35
+
36
+ ## State → next action
37
+
38
+ <!-- AGENT: Read the state above. Find the matching block below. Follow it. -->
39
+
40
+ ### `state: pre-implementation`
41
+
42
+ The project has its PRD and Design locked but no epics defined yet.
43
+
44
+ **Next action:**
45
+
46
+ 1. Read `.savepoint/releases/v{{RELEASE_NUMBER}}/PRD.md` — the v{{RELEASE_NUMBER}} release scope (epic list lives there).
47
+ 2. Help the user define the epics list and confirm priority.
48
+ 3. For each epic in order, create the directory `.savepoint/releases/v{{RELEASE_NUMBER}}/epics/E##-{epic-name}/` with a `Design.md` stub.
49
+ 4. When epic E01 (scaffolding) is created, transition to `state: epic-design` for that epic.
50
+
51
+ **Do not** start writing code. We are still in planning.
52
+
53
+ ### `state: epic-design`
54
+
55
+ An epic exists but its `Design.md` is empty or a stub.
56
+
57
+ **Next action:** Walk the user through filling out the epic's `Design.md`:
58
+
59
+ - What is this epic adding to the system?
60
+ - What components / files does it touch?
61
+ - What's the architectural delta vs the current state?
62
+
63
+ When complete, transition to `state: epic-task-breakdown` for this epic.
64
+
65
+ ### `state: epic-task-breakdown`
66
+
67
+ Epic Design exists but tasks are missing or not fully planned.
68
+
69
+ **Next action:**
70
+
71
+ 1. Re-read the epic Design.
72
+ 2. Create or update the full epic task list — each task **independently buildable**, **objective-led**, with declared `depends_on`.
73
+ 3. Each task file lives at `.savepoint/releases/v{{RELEASE_NUMBER}}/epics/{E##-epic}/tasks/TNNN-slug.md` with frontmatter:
74
+ ```yaml
75
+ ---
76
+ id: {E##-epic}/TNNN-slug
77
+ status: planned
78
+ objective: "<one sentence>"
79
+ depends_on: []
80
+ ---
81
+ ```
82
+ 4. In the same pass, write each task's `## Acceptance Criteria` (observable outcomes that define "done") and `## Implementation Plan` (the build checklist that satisfies them) as inline `- [ ]` checkboxes, plus a `## Context Log` section with `Files read`, `Estimated input tokens`, and `Notes` fields.
83
+ 5. When every task is planned, transition to `state: task-building` for the first unblocked task.
84
+
85
+ ### `state: task-planning`
86
+
87
+ Reserved for repair or late-added tasks. Normal epic planning happens during `state: epic-task-breakdown`.
88
+
89
+ **Next action:** Read the task's `objective`. Write `## Acceptance Criteria` (observable outcomes) before `## Implementation Plan` (build checklist). Use inline `- [ ]` checkboxes under the plan, add a `## Context Log` section, set `status: planned`, and stop.
90
+
91
+ ### `state: task-building`
92
+
93
+ Task is `in_progress`. All `depends_on` are `done`.
94
+
95
+ **Next action:** Execute the plan. Tick checkboxes as you complete them. The implementation checklist exists to satisfy the task's acceptance criteria; every checked box should map to an observable outcome in `## Acceptance Criteria`. Edit code per the **Code Style** rules in `AGENTS.md`. Before setting `status: done`, update the task's `## Context Log`. When all checkboxes tick, run the full quality-gate suite, set `status: done`, update the router, and **stop for user review**.
96
+
97
+ **Do not start the next task without user acknowledgment.**
98
+
99
+ ### `state: audit-pending`
100
+
101
+ The last task in an epic is `done`. Audit must run before the next epic starts.
102
+
103
+ **Context gate:** If you just built this epic in the current session, you **must not** audit it. Close this session. The user should start a new session for the audit.
104
+
105
+ **Next action (fresh session only):** Confirm `.savepoint/audit/{E##-epic}/snapshot.md` exists. If it is missing while the audit CLI is still unavailable, create one manual snapshot from the known epic scope once; do not search broadly for replacement inputs. Then read the snapshot, read the epic's `Design.md`, and read only the files listed as changed. Write one patch-shaped proposal bundle to `.savepoint/audit/{E##-epic}/proposals.md`:
106
+
107
+ - `Design.md` section — merge only the epic delta into project architecture.
108
+ - `AGENTS.md` section — refresh Codebase Map entries from changed-module metadata; preserve existing rows.
109
+ - `epic-Design.md` section — add "Implemented as:" notes and deltas from the original plan.
110
+ - `Quality Review` section — semantic-review findings against the 10 Code Style rules.
111
+
112
+ Prefer delta-only edits (`Insert After`, `Replace`, `Delete`) anchored to exact text. Do not quote and replace entire large sections unless the whole section genuinely changed.
113
+
114
+ Proposal format:
115
+
116
+ ```md
117
+ ## Target File
118
+
119
+ `path/to/file.md`
120
+
121
+ ## Replace
122
+
123
+ <exact old heading, marker, or section>
124
+
125
+ ## With
126
+
127
+ <new content>
128
+ ```
129
+
130
+ Quality review section format:
131
+
132
+ ```md
133
+ ## Must Fix Before Close
134
+
135
+ ## Must Fix Before Next Epic
136
+
137
+ ## Carry Forward
138
+
139
+ ## Already Fixed
140
+ ```
141
+
142
+ After proposals are approved, apply approved proposals to live files, mark the epic `Design.md` as `status: audited`, update project `Design.md` `last_audited`, refresh `AGENTS.md` Codebase Map, and advance this router to the next epic state.
143
+
144
+ Stop. The user reviews proposals in the TUI before commit actions.
145
+
146
+ ## Capability check
147
+
148
+ If you are not Claude Opus / Gemini 2.5 Pro / GPT-5.5 / equivalent, surface a warning to the user:
149
+
150
+ > _"Heads up — I'm running on a lighter model. Savepoint's planning steps work best with top-tier models because the embedded prompts are detailed. I'll do my best, but consider switching the model for PRD/Design/Task-breakdown steps."_
151
+
152
+ Then proceed.
@@ -0,0 +1,122 @@
1
+ ---
2
+ type: visual-identity
3
+ status: active
4
+ last_audited: never
5
+ ---
6
+
7
+ # Visual Identity — Atari-Noir
8
+
9
+ > The brand identity and visual guardrails for {{PROJECT_NAME}}. **Loaded conditionally** — only when working on TUI rendering, theme, or design-system tasks. Non-visual tasks must skip this file to honor the token budget.
10
+
11
+ ## Vibe
12
+
13
+ A serious digital system that loves old arcade hardware. Dark, cinematic, playful. Crisp, not noisy. Technical, not cold.
14
+
15
+ **Avoid:** neon cyberpunk chaos, SaaS minimalism, fake terminal gimmicks.
16
+
17
+ ## Palette
18
+
19
+ | Element | Hex | Role |
20
+ | ------------- | --------- | ----------------------------- |
21
+ | Background | `#121212` | Main screen background |
22
+ | Surface | `#0D0D0D` | Cards and panels |
23
+ | Surface 2 | `#0F0F0F` | Secondary panels / title bars |
24
+ | Border | `#1A1A1A` | Quiet structural edges |
25
+ | Border Subtle | `#222222` | Slightly stronger separators |
26
+ | Primary Text | `#F0E6DA` | Warm off-white terminal text |
27
+ | Atari Orange | `#FC6323` | Primary CTA, active highlight |
28
+ | NPP Green | `#A4C639` | Success, live systems |
29
+ | Vibe Purple | `#B1A1DF` | AI, reflection |
30
+
31
+ **Color rules:**
32
+
33
+ - **Intentional accents.** One accent color per major section/type. Use for labels, hover, glows, active text — never giant background fills.
34
+ - **Dark backgrounds.** Keep them dark so accents pop.
35
+ - **Visual encoding.** Color semantically encodes categories or states; reinforce with minimal text.
36
+
37
+ ## Typography
38
+
39
+ - **System heading font:** `Chakra Petch` (web only — terminal cannot control fonts)
40
+ - **System body/UI font:** `Space Mono` (web only — terminal cannot control fonts)
41
+ - **Accent retro fonts:** `Silkscreen` or `Press Start 2P`, used rarely for score counters or deliberately extreme moments
42
+
43
+ **Rules:**
44
+
45
+ - Headings uppercase, with deliberate letter-spacing where the medium allows.
46
+ - Body readable and restrained; abandon monospace for long text if readability suffers.
47
+ - Render magnitude/comparison numbers as proportional visuals (bars, circles), not raw values.
48
+
49
+ ## Spacing rhythm
50
+
51
+ - Sections breathe. Default spacing feels generous.
52
+ - Cards have enough internal padding to feel like panels, not chips.
53
+ - Whitespace creates hierarchy before borders or color do.
54
+
55
+ ## Signature UI patterns
56
+
57
+ - **Scanlines** — low-opacity CRT atmosphere; never obscure readability.
58
+ - **Glows** — radiate from perimeter ("lit from within"). Transparent section accent colors; no neon spam.
59
+ - **Panels** — flat, dark, structured with quiet borders. Depth from contrast/glow, not heavy shadows.
60
+ - **Search** — simple, single-line; integrated with section accent color.
61
+ - **MDX prose** — integrated using standard typography, palette, border logic.
62
+
63
+ ## Interaction principles ("The Playable Dashboard")
64
+
65
+ **Content is the interface.** Avoid traditional UI patterns (dropdowns, accordions) if content can express the information directly.
66
+
67
+ - **Show, don't explain.** Visuals (scaled circles, markers) before text.
68
+ - **Motion** — authored, not generic. Ease like a system booting up. No bouncy toy motion.
69
+ - **Hover & focus** — internal light (underglow/surface tint), not thick outlines or loud transforms.
70
+ - **Expansion** — breathe open, don't snap. Inline reveals, shared-element transitions.
71
+
72
+ ## Replication brief
73
+
74
+ If recreating this look-and-feel, preserve:
75
+
76
+ - dark charcoal background with warm off-white text
77
+ - three-color accent system (one per major section)
78
+ - `Chakra Petch` for headings, `Space Mono` for body/UI (where typography can be controlled)
79
+ - uppercase, tracked headings
80
+ - quiet borders, dark surfaces, selective glow
81
+ - one strong interactive hero element
82
+ - copy that sounds human, competent, intentionally non-corporate
83
+ - **Young Explorer Baseline:** all content and visuals understandable by a 7-year-old. Intuitive visual metaphors, no unexplained jargon, discoverable through play.
84
+
85
+ **Family resemblance, not exact duplication.** Preserve the underlying feel, hierarchy, restraint.
86
+
87
+ ## Flex & constraints
88
+
89
+ - **Layout & components:** can adapt to content needs, provided palette discipline and tonal restraint remain.
90
+ - **Fonts:** supporting fonts can vary if heading/body contrast remains.
91
+ - **Hero:** interaction can vary, but requires one strong, ownable interactive element.
92
+ - **Visual-first:** show relationships visually before explaining them in text (gradient bar > numbers). Text reinforces; visuals carry comprehension.
93
+ - **Cognitive accessibility:** anchor complex concepts to physical/visual analogies a 7-year-old can grasp.
94
+
95
+ ## What survives in the terminal
96
+
97
+ | Web rule | Terminal feasibility | Adaptation |
98
+ | ----------------------------------- | -------------------- | ---------------------------------------------------------------- |
99
+ | Dark bg + warm off-white text | ✓ | 24-bit color with 256/16-color fallbacks |
100
+ | 3-color accent system | ✓ | per status, per epic, per section |
101
+ | `Chakra Petch` / `Space Mono` fonts | ✗ | terminal owns the font; README discloses |
102
+ | Uppercase tracked headings | ⚠ | uppercase yes; letter-spacing no (fixed-width cells) |
103
+ | Scanlines | ✗ | flicker/ugly in text — skip |
104
+ | Glows / underglow | ⚠ | substitute with subtle bg tint on focused row + accent border |
105
+ | Quiet borders, dark surfaces | ✓ | box-drawing chars (`─ │ ┌ ┐`) in border-subtle gray |
106
+ | Inline reveal cards | ✓ | Ink state-driven expand/collapse |
107
+ | Visual encoding before text | ✓ | colored glyphs (`▣ ◇ ◆ ✓`) with text reinforcement |
108
+ | "System booting up" motion | ⚠ | 200ms init sequence on launch acceptable; running animation skip |
109
+
110
+ ## Terminal UI guardrails
111
+
112
+ - Keep UI state explicit and local to the smallest useful surface.
113
+ - Use project data files as the source of truth; do not invent hidden UI state.
114
+ - Keep layout compact and readable on narrow terminals first.
115
+ - Treat accidental line wrapping as a bug.
116
+ - Make selection, focus, and status changes obvious without relying on color alone.
117
+ - Make every keyboard action predictable and idempotent.
118
+ - Test branching input handling, navigation, state transitions, render output, and non-TTY fallbacks.
119
+
120
+ ## When `savepoint init` ships
121
+
122
+ This file is the canonical default that `savepoint init` writes into a user's `.savepoint/visual-identity.md`. Users replace it with their own design system. The file's existence (not its contents) is what `savepoint` cares about.