savepoint 1.0.2 → 1.0.4

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 (242) hide show
  1. package/.claude/settings.local.json +12 -1
  2. package/.github/workflows/ci.yml +20 -0
  3. package/.golangci.yml +11 -0
  4. package/.savepoint/Design.md +40 -38
  5. package/.savepoint/{audit/v1.1/E02-cross-platform-compatibility/proposals.md → releases/v1.1/epics/E02-cross-platform-compatibility/E02-Audit.md} +48 -38
  6. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Audit.md +195 -0
  7. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/E03-Detail.md +14 -1
  8. package/.savepoint/releases/v1.1/epics/E03-ui-visual-refinement/tasks/T006-forced-256-color-profile.md +3 -3
  9. package/.savepoint/{audit/v1.1/E04-epic-navigation/proposals.md → releases/v1.1/epics/E04-epic-navigation/E04-Audit.md} +65 -54
  10. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Audit.md +237 -0
  11. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/E05-Detail.md +25 -16
  12. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T001-update-agents-md.md +17 -6
  13. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T002-update-router-md.md +15 -5
  14. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T003-update-design-md.md +19 -5
  15. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T004-implement-m-hotkey.md +11 -1
  16. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T005-update-help-overlay.md +9 -6
  17. package/.savepoint/releases/v1.1/epics/E05-tasking-permissions/tasks/T006-tests-and-quality-gates.md +29 -13
  18. package/.savepoint/releases/v1.1/epics/E06-audit-command/E06-Audit.md +56 -0
  19. package/.savepoint/releases/v1.1/epics/E06-audit-command/E06-Detail.md +63 -0
  20. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T005-proposals.md +44 -0
  21. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T007-apply-close.md +35 -0
  22. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T009-integration.md +40 -0
  23. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T010-audit-file-migration.md +45 -0
  24. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T011-model-tab-state.md +26 -0
  25. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T012-epic-audit-render.md +33 -0
  26. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T013-handle-tab-keys.md +34 -0
  27. package/.savepoint/releases/v1.1/epics/E06-audit-command/tasks/T014-tab-indicator.md +33 -0
  28. package/.savepoint/releases/v1.1/epics/E07-init-command/E07-Audit.md +336 -0
  29. package/.savepoint/releases/v1.1/epics/E07-init-command/E07-Detail.md +61 -0
  30. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T001-cli-entrypoint.md +37 -0
  31. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T002-target-validation.md +28 -0
  32. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T003-scaffold-writer.md +46 -0
  33. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T004-atomic-writes.md +27 -0
  34. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T005-magic-prompt.md +25 -0
  35. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T006-clipboard.md +26 -0
  36. package/.savepoint/releases/v1.1/epics/E07-init-command/tasks/T007-integration-test.md +26 -0
  37. package/.savepoint/releases/v1.1/epics/E08-board-command/E08-Audit.md +333 -0
  38. package/.savepoint/releases/v1.1/epics/E08-board-command/E08-Detail.md +68 -0
  39. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T001-cli-entrypoint.md +26 -0
  40. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T002-non-tty-fallback.md +27 -0
  41. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T003-tui-app-shell.md +28 -0
  42. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T004-board-model.md +29 -0
  43. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T005-detail-pane.md +27 -0
  44. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T006-status-transitions.md +29 -0
  45. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T007-theme-fallbacks.md +29 -0
  46. package/.savepoint/releases/v1.1/epics/E08-board-command/tasks/T008-integration-test.md +27 -0
  47. package/.savepoint/releases/v1.1/epics/E09-doctor-command/E09-Audit.md +207 -0
  48. package/.savepoint/releases/v1.1/epics/E09-doctor-command/E09-Detail.md +65 -0
  49. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T001-cli-entrypoint.md +24 -0
  50. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T002-config-router-validation.md +28 -0
  51. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T003-structure-checks.md +29 -0
  52. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T004-dependency-checks.md +27 -0
  53. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T005-audit-orphan-checks.md +28 -0
  54. package/.savepoint/releases/v1.1/epics/E09-doctor-command/tasks/T006-quality-gates-report.md +31 -0
  55. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/E11-Detail.md +36 -0
  56. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T001-debug-logging.md +25 -0
  57. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T002-increase-debounce.md +21 -0
  58. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T003-error-handling.md +22 -0
  59. package/.savepoint/releases/v1.1/epics/E11-board-refresh-fix/tasks/T004-test-verify.md +29 -0
  60. package/.savepoint/releases/v1.1/epics/E12-validation-fix/E12-Audit.md +444 -0
  61. package/.savepoint/releases/v1.1/epics/E12-validation-fix/E12-Detail.md +45 -0
  62. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T001-default-phase.md +35 -0
  63. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T002-default-status.md +19 -0
  64. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T003-better-errors.md +29 -0
  65. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T004-validate-on-write.md +25 -0
  66. package/.savepoint/releases/v1.1/epics/E12-validation-fix/tasks/T005-tests.md +37 -0
  67. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/E13-Audit.md +118 -0
  68. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/E13-Detail.md +73 -0
  69. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T001-safe-cleanup.md +66 -0
  70. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T002-bug-fixes.md +35 -0
  71. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T003-centralize-duplication.md +60 -0
  72. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T004-infrastructure.md +33 -0
  73. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T005-decompose-update.md +37 -0
  74. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T006-async-io.md +40 -0
  75. package/.savepoint/releases/v1.1/epics/E13-audit-remediation/tasks/T007-test-coverage.md +37 -0
  76. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/E14-Audit.md +267 -0
  77. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/E14-Detail.md +54 -0
  78. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T001-group-model.md +39 -0
  79. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T002-data-interfaces.md +42 -0
  80. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T003-discover-orphans.md +33 -0
  81. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T004-epic-panel-headings.md +35 -0
  82. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T005-shell-tokenization.md +27 -0
  83. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T006-unify-enums.md +29 -0
  84. package/.savepoint/releases/v1.1/epics/E14-structural-improvements/tasks/T007-testutil-package.md +28 -0
  85. package/.savepoint/releases/v1.1/epics/E15-hardening/E15-Audit.md +272 -0
  86. package/.savepoint/releases/v1.1/epics/E15-hardening/E15-Detail.md +60 -0
  87. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T001-benchmarks.md +31 -0
  88. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T002-fuzz-targets.md +34 -0
  89. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T003-debug-flag.md +30 -0
  90. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T004-dist-checksums.md +27 -0
  91. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T005-windows-targets.md +28 -0
  92. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T006-abbreviation-splitting.md +26 -0
  93. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T007-root-test-allowlist.md +33 -0
  94. package/.savepoint/releases/v1.1/epics/E15-hardening/tasks/T008-ci-and-release-automation.md +46 -0
  95. package/.savepoint/releases/v1.1/epics/_archived/T001-cli-entrypoint.md +25 -0
  96. package/.savepoint/releases/v1.1/epics/_archived/T002-quality-gates.md +27 -0
  97. package/.savepoint/releases/v1.1/epics/_archived/T003-snapshot.md +27 -0
  98. package/.savepoint/releases/v1.1/epics/_archived/T004-ai-reconcile.md +29 -0
  99. package/.savepoint/releases/v1.1/epics/_archived/T006-tui-review.md +31 -0
  100. package/.savepoint/releases/v1.1/epics/_archived/T008-skip-handling.md +34 -0
  101. package/.savepoint/releases/v1.1/v1.1-PRD.md +67 -7
  102. package/.savepoint/router.md +10 -17
  103. package/AGENTS.md +39 -24
  104. package/Makefile +3 -1
  105. package/README.md +0 -1
  106. package/agent-skills/savepoint-audit/SKILL.md +86 -34
  107. package/agent-skills/savepoint-build-task/SKILL.md +7 -2
  108. package/agent-skills/savepoint-create-plan/SKILL.md +7 -2
  109. package/agent-skills/savepoint-create-task/SKILL.md +44 -31
  110. package/agent-skills/savepoint-draft-prd/SKILL.md +7 -2
  111. package/agent-skills/savepoint-system-design/SKILL.md +7 -2
  112. package/agent_skills_test.go +91 -0
  113. package/cmd/board.go +59 -0
  114. package/cmd/board_test.go +137 -0
  115. package/cmd/doctor.go +53 -0
  116. package/cmd/doctor_test.go +146 -0
  117. package/cmd/init.go +63 -0
  118. package/cmd/init_test.go +104 -0
  119. package/internal/board/board.go +44 -36
  120. package/internal/board/board_test.go +27 -82
  121. package/internal/board/card.go +43 -23
  122. package/internal/board/card_test.go +74 -5
  123. package/internal/board/column.go +75 -15
  124. package/internal/board/column_test.go +76 -2
  125. package/internal/board/debug.go +26 -0
  126. package/internal/board/debug_test.go +108 -0
  127. package/internal/board/detail.go +33 -47
  128. package/internal/board/detail_test.go +48 -0
  129. package/internal/board/epic_panel.go +120 -22
  130. package/internal/board/epic_panel_test.go +302 -17
  131. package/internal/board/help.go +1 -0
  132. package/internal/board/help_test.go +1 -0
  133. package/internal/board/integration_test.go +266 -0
  134. package/internal/board/interfaces.go +65 -0
  135. package/internal/board/interfaces_test.go +114 -0
  136. package/internal/board/io.go +93 -0
  137. package/internal/board/model.go +79 -118
  138. package/internal/board/plain.go +88 -0
  139. package/internal/board/plain_test.go +117 -0
  140. package/internal/board/release.go +1 -9
  141. package/internal/board/release_test.go +6 -6
  142. package/internal/board/status.go +4 -4
  143. package/internal/board/theme.go +24 -0
  144. package/internal/board/theme_test.go +31 -0
  145. package/internal/board/transitions.go +113 -88
  146. package/internal/board/transitions_test.go +164 -141
  147. package/internal/board/tui.go +32 -0
  148. package/internal/board/update.go +344 -215
  149. package/internal/board/update_test.go +326 -18
  150. package/internal/board/util.go +76 -0
  151. package/internal/board/view.go +31 -28
  152. package/internal/board/view_test.go +74 -2
  153. package/internal/board/watch.go +41 -5
  154. package/internal/buildtool/main.go +45 -15
  155. package/internal/buildtool/main_test.go +224 -0
  156. package/internal/data/config.go +17 -3
  157. package/internal/data/config_test.go +49 -0
  158. package/internal/data/discover.go +26 -0
  159. package/internal/data/discover_test.go +34 -10
  160. package/internal/data/errors.go +4 -0
  161. package/internal/data/fuzz_test.go +75 -0
  162. package/internal/data/lifecycle.go +13 -6
  163. package/internal/data/lifecycle_test.go +14 -11
  164. package/internal/data/parser.go +22 -6
  165. package/internal/data/parser_test.go +31 -7
  166. package/internal/data/task.go +0 -9
  167. package/internal/data/testdata/fuzz/FuzzSplitFrontmatterBody/68eb66b0fe91e7e3 +2 -0
  168. package/internal/data/write.go +88 -11
  169. package/internal/data/write_test.go +167 -0
  170. package/internal/doctor/checks.go +567 -0
  171. package/internal/doctor/checks_test.go +716 -0
  172. package/internal/doctor/gates.go +193 -0
  173. package/internal/doctor/gates_test.go +166 -0
  174. package/internal/doctor/interfaces.go +64 -0
  175. package/internal/doctor/interfaces_test.go +104 -0
  176. package/internal/doctor/repairs.go +80 -0
  177. package/internal/doctor/repairs_test.go +81 -0
  178. package/internal/doctor/report.go +157 -0
  179. package/internal/doctor/report_test.go +89 -0
  180. package/internal/init/clipboard.go +146 -0
  181. package/internal/init/clipboard_test.go +74 -0
  182. package/internal/init/install.go +16 -0
  183. package/internal/init/integration_test.go +197 -0
  184. package/internal/init/prompt.go +14 -0
  185. package/internal/init/prompt_test.go +77 -0
  186. package/internal/init/scaffold.go +59 -0
  187. package/internal/init/scaffold_test.go +179 -0
  188. package/internal/init/template_freshness_test.go +56 -0
  189. package/internal/init/validate.go +85 -0
  190. package/internal/init/validate_test.go +141 -0
  191. package/internal/init/write.go +73 -0
  192. package/internal/init/write_test.go +91 -0
  193. package/internal/styles/styles_test.go +133 -0
  194. package/internal/testutil/fixture.go +113 -0
  195. package/internal/testutil/fs.go +26 -0
  196. package/main.go +120 -4
  197. package/package.json +2 -2
  198. package/project-audit/audit_report_glm_5.1.md +411 -0
  199. package/project-audit/audit_report_opus_4.6.md +406 -0
  200. package/project-audit/consolidated-audit-report.md +456 -0
  201. package/templates/project/.savepoint/Design.md +2 -2
  202. package/templates/project/.savepoint/router.md +10 -10
  203. package/templates/project/AGENTS.md +33 -21
  204. package/templates/project/agent-skills/savepoint-audit/SKILL.md +87 -0
  205. package/templates/project/agent-skills/savepoint-build-task/SKILL.md +44 -0
  206. package/templates/project/agent-skills/savepoint-create-plan/SKILL.md +33 -0
  207. package/templates/project/agent-skills/savepoint-create-task/SKILL.md +44 -0
  208. package/templates/project/agent-skills/savepoint-draft-prd/SKILL.md +37 -0
  209. package/templates/project/agent-skills/savepoint-system-design/SKILL.md +38 -0
  210. package/templates/prompts/audit-reconciliation.prompt.md +33 -28
  211. package/templates/prompts/design.prompt.md +3 -1
  212. package/.savepoint/audit/v1/E01/proposals.md +0 -168
  213. package/.savepoint/audit/v1/E01/snapshot.md +0 -78
  214. package/.savepoint/audit/v1/E01-go-setup/proposals.md +0 -166
  215. package/.savepoint/audit/v1/E01-go-setup/snapshot.md +0 -71
  216. package/.savepoint/audit/v1/E01-scaffolding/proposals/AGENTS.md +0 -66
  217. package/.savepoint/audit/v1/E01-scaffolding/proposals/Design.md +0 -210
  218. package/.savepoint/audit/v1/E01-scaffolding/proposals/epic-Design.md +0 -117
  219. package/.savepoint/audit/v1/E01-scaffolding/proposals/quality-review.md +0 -101
  220. package/.savepoint/audit/v1/E01-scaffolding/snapshot.md +0 -54
  221. package/.savepoint/audit/v1/E02-data-model/snapshot.md +0 -128
  222. package/.savepoint/audit/v1/E02-data-readers/proposals.md +0 -123
  223. package/.savepoint/audit/v1/E02-data-readers/snapshot.md +0 -54
  224. package/.savepoint/audit/v1/E03-board-tui-core/proposals.md +0 -146
  225. package/.savepoint/audit/v1/E03-board-tui-core/snapshot.md +0 -57
  226. package/.savepoint/audit/v1/E03-cli-foundation/snapshot.md +0 -106
  227. package/.savepoint/audit/v1/E04-board-components/proposals.md +0 -118
  228. package/.savepoint/audit/v1/E04-board-components/snapshot.md +0 -77
  229. package/.savepoint/audit/v1/E04-templates-and-prompts/snapshot.md +0 -115
  230. package/.savepoint/audit/v1/E05-init-command/snapshot.md +0 -125
  231. package/.savepoint/audit/v1/E05-phase-transitions/proposals.md +0 -83
  232. package/.savepoint/audit/v1/E05-phase-transitions/snapshot.md +0 -36
  233. package/.savepoint/audit/v1/E06-atari-noir-layout/proposals.md +0 -130
  234. package/.savepoint/audit/v1/E06-atari-noir-layout/snapshot.md +0 -84
  235. package/.savepoint/audit/v1/E06-tui-board/snapshot.md +0 -64
  236. package/.savepoint/audit/v1/E07-audit-pipeline/snapshot.md +0 -165
  237. package/.savepoint/audit/v1/E08-board-workflow-cleanup/snapshot.md +0 -65
  238. package/.savepoint/audit/v1.1/E02-cross-platform-compatibility/snapshot.md +0 -41
  239. package/.savepoint/audit/v1.1/E04-epic-navigation/snapshot.md +0 -48
  240. package/ink-cli-ui-design.zip +0 -0
  241. package/savepoint +0 -0
  242. package/savepoint.exe +0 -0
@@ -0,0 +1,336 @@
1
+ ---
2
+ type: audit-findings
3
+ audited: 2026-05-03
4
+ ---
5
+
6
+ # Audit Findings: E07 Init Command
7
+
8
+ ## Main Findings
9
+
10
+ E07 is implemented and the Go baseline passes: `go test ./internal/init ./cmd`, `go build ./...`, and `go test ./...` all succeeded. The command parser, target validation, scaffold copy, prompt rendering, clipboard best-effort path, and integration coverage are present.
11
+
12
+ Audit apply resolved the generated-template drift. New Savepoint projects now receive `stage` task-status instructions, `make build && make test` quality-gate guidance, and the current epic-local `E##-Audit.md` audit workflow instead of the archived `.savepoint/audit/.../proposals.md` pipeline.
13
+
14
+ Audit apply also tightened scaffold safety. Init validation now treats an existing root `agent-skills/` directory as a conflict unless `--force` is set, and `AtomicWrite` uses a portable replace helper that falls back to backup/restore when a platform cannot rename over an existing target.
15
+
16
+ The clipboard task record was reconciled: `T006-clipboard.md` now reflects the implemented `ClipboardResult` API, best-effort status handling, current-platform tests, and completed Go quality gates.
17
+
18
+ ## Code Style Review
19
+
20
+ - [x] One job per file
21
+ - [x] One-sentence functions
22
+ - [x] Test branches
23
+ - [x] Types are documentation
24
+ - [x] Build, don't speculate
25
+ - [x] Errors at boundaries
26
+ - [x] One source of truth
27
+ - [x] Comments explain WHY
28
+ - [x] Content in data files
29
+ - [x] Small diffs
30
+
31
+ The audit-close patch brought generated workflow content back in line with the live root instructions, added tests that guard template freshness, and kept the scaffold conflict/overwrite fixes scoped to `internal/init`.
32
+
33
+ ## Proposed Changes
34
+
35
+ ### Target File
36
+ templates/project/AGENTS.md
37
+
38
+ ### Replace
39
+ ```
40
+ - `phase` (build/test/audit): only when `status: in_progress`
41
+ ```
42
+
43
+ ### With
44
+ ```
45
+ - `stage` (build/test/audit): **required** when `status: in_progress` — omitting it is a parse error
46
+ ```
47
+
48
+ ### Target File
49
+ templates/project/AGENTS.md
50
+
51
+ ### Replace
52
+ ```
53
+ 2. When starting implementation, set task frontmatter to `status: in_progress`
54
+ ```
55
+
56
+ ### With
57
+ ```
58
+ 2. When starting implementation, set task frontmatter to `status: in_progress` + `stage: build` (both required together)
59
+ ```
60
+
61
+ ### Target File
62
+ templates/project/AGENTS.md
63
+
64
+ ### Replace
65
+ ```
66
+ npm run build && npm run test
67
+ ```
68
+
69
+ ### With
70
+ ```
71
+ make build && make test
72
+ ```
73
+
74
+ ### Target File
75
+ templates/project/.savepoint/router.md
76
+
77
+ ### Replace
78
+ ```
79
+ ## Manual audit override
80
+
81
+ 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.
82
+
83
+ Persist the audit artifacts before replying:
84
+
85
+ - Ensure `.savepoint/audit/{E##-epic}/snapshot.md` exists. Create a manual snapshot once if needed.
86
+ - Write the proposal bundle to `.savepoint/audit/{release}/{E##-epic}/proposals.md`.
87
+ - Do not stop at chat-only findings. The filesystem artifact is part of the task output.
88
+ ```
89
+
90
+ ### With
91
+ ```
92
+ ## Manual audit override
93
+
94
+ 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.
95
+
96
+ Persist the audit artifact before replying:
97
+
98
+ - Write exactly one `.savepoint/releases/{release}/epics/{E##-epic}/E##-Audit.md`.
99
+ - Include `## Main Findings`, `## Code Style Review`, and `## Proposed Changes`.
100
+ - Keep file-specific `### Target File` / `### Replace` / `### With` blocks under `## Proposed Changes`.
101
+ - Do not apply proposals or mark the epic audited until the user says `apply audit`.
102
+ ```
103
+
104
+ ### Target File
105
+ templates/project/.savepoint/router.md
106
+
107
+ ### Replace
108
+ ```
109
+ **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`:
110
+ ```
111
+
112
+ ### With
113
+ ```
114
+ **Next action (fresh session only):** Read the epic's `E##-Detail.md`, task files, drift notes, `.savepoint/Design.md`, `AGENTS.md`, and scoped changed files. Write one epic-local audit file to `.savepoint/releases/{release}/epics/{E##-epic}/E##-Audit.md`:
115
+ ```
116
+
117
+ ### Target File
118
+ templates/project/.savepoint/router.md
119
+
120
+ ### Replace
121
+ ```
122
+ - `Design.md` section — merge only the epic delta into project architecture.
123
+ - `AGENTS.md` section — refresh Codebase Map entries from changed-module metadata; preserve existing rows.
124
+ - `epic-Design.md` section — add "Implemented as:" notes and deltas from the original plan.
125
+ - `Quality Review` section — semantic-review findings against the 10 Code Style rules.
126
+ ```
127
+
128
+ ### With
129
+ ```
130
+ - `## Main Findings` — user-facing AC verification, important drift, and notable risks.
131
+ - `## Code Style Review` — checklist against the 10 AGENTS.md code style rules.
132
+ - `## Proposed Changes` — admin/apply metadata using `### Target File`, `### Replace`, and `### With`.
133
+ ```
134
+
135
+ ### Target File
136
+ templates/project/.savepoint/router.md
137
+
138
+ ### Replace
139
+ ```
140
+ 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.
141
+ ```
142
+
143
+ ### With
144
+ ```
145
+ After proposals are approved, apply approved proposals to live files, mark the epic `E##-Detail.md` as `status: audited`, update project `Design.md` `last_audited`, refresh `AGENTS.md` Codebase Map if needed, and advance this router to the next epic state.
146
+ ```
147
+
148
+ ### Target File
149
+ internal/init/validate.go
150
+
151
+ ### Replace
152
+ ```
153
+ var conflictingFiles = []string{
154
+ "AGENTS.md",
155
+ }
156
+ ```
157
+
158
+ ### With
159
+ ```
160
+ var conflictingFiles = []string{
161
+ "AGENTS.md",
162
+ "agent-skills",
163
+ }
164
+ ```
165
+
166
+ ### Target File
167
+ internal/init/scaffold_test.go
168
+
169
+ ### Replace
170
+ ```
171
+ func TestScaffold_preservesExistingWithoutForce(t *testing.T) {
172
+ ```
173
+
174
+ ### With
175
+ ```
176
+ func TestScaffold_overwritesExistingAfterValidation(t *testing.T) {
177
+ ```
178
+
179
+ ### Target File
180
+ internal/init/validate_test.go
181
+
182
+ ### Replace
183
+ ```
184
+ func TestValidateTarget_conflictingFileWithForce(t *testing.T) {
185
+ dir := t.TempDir()
186
+ if err := os.WriteFile(filepath.Join(dir, "AGENTS.md"), []byte("existing"), 0644); err != nil {
187
+ t.Fatal(err)
188
+ }
189
+
190
+ err := ValidateTarget(dir, true)
191
+ if err != nil {
192
+ t.Fatalf("ValidateTarget() with --force error = %v, want nil", err)
193
+ }
194
+ }
195
+ ```
196
+
197
+ ### With
198
+ ```
199
+ func TestValidateTarget_conflictingFileWithForce(t *testing.T) {
200
+ dir := t.TempDir()
201
+ if err := os.WriteFile(filepath.Join(dir, "AGENTS.md"), []byte("existing"), 0644); err != nil {
202
+ t.Fatal(err)
203
+ }
204
+
205
+ err := ValidateTarget(dir, true)
206
+ if err != nil {
207
+ t.Fatalf("ValidateTarget() with --force error = %v, want nil", err)
208
+ }
209
+ }
210
+
211
+ func TestValidateTarget_conflictingAgentSkillsDirectory(t *testing.T) {
212
+ dir := t.TempDir()
213
+ if err := os.Mkdir(filepath.Join(dir, "agent-skills"), 0755); err != nil {
214
+ t.Fatal(err)
215
+ }
216
+
217
+ err := ValidateTarget(dir, false)
218
+ if err == nil {
219
+ t.Fatal("ValidateTarget() expected error for conflicting agent-skills directory")
220
+ }
221
+ if !errors.Is(err, ErrConflict) {
222
+ t.Fatalf("ValidateTarget() error type = %v, want ErrConflict", err)
223
+ }
224
+ }
225
+ ```
226
+
227
+ ### Target File
228
+ internal/init/write.go
229
+
230
+ ### Replace
231
+ ```
232
+ if err := os.Rename(tmpName, target); err != nil {
233
+ return fmt.Errorf("rename temp to target: %w", err)
234
+ }
235
+ ```
236
+
237
+ ### With
238
+ ```
239
+ if err := replaceFile(tmpName, target); err != nil {
240
+ return fmt.Errorf("replace target with temp file: %w", err)
241
+ }
242
+ ```
243
+
244
+ ### Target File
245
+ internal/init/write.go
246
+
247
+ ### Replace
248
+ ```
249
+ return nil
250
+ }
251
+ ```
252
+
253
+ ### With
254
+ ```
255
+ return nil
256
+ }
257
+
258
+ func replaceFile(tmpName, target string) error {
259
+ if err := os.Rename(tmpName, target); err == nil {
260
+ return nil
261
+ }
262
+
263
+ if _, statErr := os.Stat(target); statErr != nil {
264
+ return os.Rename(tmpName, target)
265
+ }
266
+
267
+ backup := target + ".savepoint-bak"
268
+ _ = os.Remove(backup)
269
+ if err := os.Rename(target, backup); err != nil {
270
+ return err
271
+ }
272
+ if err := os.Rename(tmpName, target); err != nil {
273
+ _ = os.Rename(backup, target)
274
+ return err
275
+ }
276
+ return os.Remove(backup)
277
+ }
278
+ ```
279
+
280
+ ### Target File
281
+ .savepoint/Design.md
282
+
283
+ ### Replace
284
+ ```
285
+ - **Init command** (`savepoint init`) validates, scaffolds, prints prompt, clipboard, optional install (epic E05).
286
+ ```
287
+
288
+ ### With
289
+ ```
290
+ - **Init command** (`savepoint init`) validates target directories, scaffolds rendered copies of `templates/project/`, prints the rendered magic prompt, attempts best-effort clipboard copy, and optionally runs `npm install` after scaffolding (v1.1 E07).
291
+ ```
292
+
293
+ ### Target File
294
+ .savepoint/releases/v1.1/epics/E07-init-command/E07-Detail.md
295
+
296
+ ### Replace
297
+ ```
298
+ ## Boundaries
299
+ ```
300
+
301
+ ### With
302
+ ```
303
+ ## Implemented As
304
+
305
+ - `cmd/init.go` owns init argument parsing and delegates execution through `InitRunner`.
306
+ - `main.go` embeds `templates/project/` and `templates/prompts/`, then wires validation, scaffold, prompt rendering, clipboard copy, and optional install in sequence.
307
+ - `internal/init/` owns validation, scaffold interpolation, atomic writes, prompt rendering, clipboard copy, dependency install, and integration tests.
308
+ - Audit found that generated workflow templates need reconciliation with the current epic-local audit workflow before closing.
309
+
310
+ ## Boundaries
311
+ ```
312
+
313
+ ### Target File
314
+ .savepoint/releases/v1.1/epics/E07-init-command/tasks/T006-clipboard.md
315
+
316
+ ### Replace
317
+ ```
318
+ - [ ] Add `internal/init/clipboard.go`
319
+ - [ ] Implement `CopyToClipboard(text) error`
320
+ - [ ] Detect platform: Windows (clip.exe), macOS (pbcopy), Linux (xclip/xsel)
321
+ - [ ] Fall back gracefully if clipboard tools unavailable
322
+ - [ ] Log skip or failure without failing init
323
+ - [ ] Test clipboard on each platform
324
+ - [ ] Run `make build && make test`
325
+ ```
326
+
327
+ ### With
328
+ ```
329
+ - [x] Add `internal/init/clipboard.go`
330
+ - [x] Implement `CopyToClipboard(text) ClipboardResult`
331
+ - [x] Detect platform: Windows (clip.exe), macOS (pbcopy), Linux (xclip/xsel)
332
+ - [x] Fall back gracefully if clipboard tools unavailable
333
+ - [x] Log skip or failure without failing init
334
+ - [x] Test clipboard status handling on the current platform
335
+ - [x] Run quality gates (`go test ./internal/init ./cmd`, `go build ./...`, `go test ./...`)
336
+ ```
@@ -0,0 +1,61 @@
1
+ ---
2
+ type: epic-design
3
+ status: audited
4
+ ---
5
+
6
+ # E07: Init Command
7
+
8
+ ## Purpose
9
+
10
+ Implement `savepoint init`, the first-run command that creates a Savepoint workflow in an empty or compatible project directory and prints the magic prompt the user gives to an AI agent.
11
+
12
+ ## Interface
13
+
14
+ ```bash
15
+ savepoint init [dir] # scaffold .savepoint/ in target directory
16
+ savepoint init [dir] --force # overwrite existing
17
+ savepoint init [dir] --install # run npm install after scaffold
18
+ ```
19
+
20
+ ## What this epic adds
21
+
22
+ - Target directory validation (missing, empty, compatible, already-initialized, conflicting, boundary-error)
23
+ - Scaffold writing from `templates/project/`
24
+ - Project name interpolation
25
+ - Safe handling (refuse conflicts by default, temp-file-plus-rename)
26
+ - Magic prompt output to stdout (from `templates/prompts/magic-prompt.prompt.md`)
27
+ - Best-effort clipboard copy (doesn't fail if unavailable)
28
+ - Optional `--install` flag for dev dependencies
29
+ - Integration tests using temporary directories
30
+
31
+ ## Components
32
+
33
+ | Module | Purpose |
34
+ |--------|---------|
35
+ | `cmd/init.go` | CLI registration, arg parsing |
36
+ | `internal/init/validate.go` | Target directory checks |
37
+ | `internal/init/scaffold.go` | Template copy, project name interpolation |
38
+ | `internal/init/write.go` | Atomic writes with temp-file-plus-rename |
39
+ | `internal/init/prompt.go` | Magic prompt rendering from template |
40
+ | `internal/init/clipboard.go` | Platform clipboard detection and copy |
41
+
42
+ ## Implemented As
43
+
44
+ - `cmd/init.go` owns init argument parsing and delegates execution through `InitRunner`.
45
+ - `main.go` embeds `templates/project/` and `templates/prompts/`, then wires validation, scaffold, prompt rendering, clipboard copy, and optional install in sequence.
46
+ - `internal/init/` owns validation, scaffold interpolation, atomic writes, prompt rendering, clipboard copy, dependency install, and integration tests.
47
+ - Audit reconciled generated workflow templates with the current epic-local audit workflow before closing.
48
+
49
+ ## Boundaries
50
+
51
+ **In scope:**
52
+ - Create `.savepoint/` and root `AGENTS.md`
53
+ - Print the initial agent prompt
54
+ - Avoid overwriting user files unless explicitly allowed by flags
55
+ - Support Windows, macOS, and Linux filesystem behavior
56
+
57
+ **Out of scope:**
58
+ - Creating epics/tasks interactively
59
+ - Running the board after init
60
+ - Implementing audit or doctor
61
+ - Managing package installation beyond the optional one-shot path
@@ -0,0 +1,37 @@
1
+ ---
2
+ id: E07-init-command/T001-cli-entrypoint
3
+ status: done
4
+ objective: "Create CLI entrypoint for savepoint init command"
5
+ depends_on: []
6
+ ---
7
+
8
+ # T001: CLI Entrypoint
9
+
10
+ ## Acceptance Criteria
11
+
12
+ - `savepoint init --help` shows usage: `init [dir] [--force] [--install]`
13
+ - `savepoint init` uses current directory
14
+ - `savepoint init <dir>` uses specified directory
15
+ - `--force` flag allows overwriting existing .savepoint
16
+ - `--install` flag triggers dev dependency install after scaffold
17
+ - Unknown flags show error and exit non-zero
18
+
19
+ ## Implementation Plan
20
+
21
+ - [x] Add `cmd/init.go` with CLI arg parsing
22
+ - [x] Wire init command into main.go dispatch
23
+ - [x] Implement arg validation (dir, --force, --install)
24
+ - [x] Default to current directory if no dir specified
25
+ - [x] Test `savepoint init --help` output
26
+ - [x] Run quality gates (`make` unavailable; used direct Go build/test)
27
+
28
+ ## Context Log
29
+
30
+ - Files read: `.savepoint/router.md`, `E07-Detail.md`, this task file, E07 task files T002-T007, `main.go`, `go.mod`, `Makefile`, `internal/board/board.go`, archived E05 init task.
31
+ - Files edited: `cmd/init.go`, `cmd/init_test.go`, `main.go`, this task file, `.savepoint/router.md`.
32
+ - Estimated input tokens: ~18k.
33
+ - Quality gates: `go test ./cmd` passed; `make build` could not run because `make` is not installed; `go build ./...` passed with a Go module cache warning; `go test ./...` passed; `go run . init --help` printed `Usage: init [dir] [--force] [--install]`; `go run . init --bogus` exited non-zero with an unknown flag error.
34
+
35
+ ## Drift Notes
36
+
37
+ - Added new `cmd/` package for CLI command parsing and dispatch. This module is listed in the E07 epic design but is not yet listed in the AGENTS.md Codebase Map.
@@ -0,0 +1,28 @@
1
+ ---
2
+ id: E07-init-command/T002-target-validation
3
+ status: done
4
+ objective: "Implement target directory validation"
5
+ depends_on: ["E07-init-command/T001-cli-entrypoint"]
6
+ ---
7
+
8
+ # T002: Target Validation
9
+
10
+ ## Acceptance Criteria
11
+
12
+ - Target missing → error with helpful message
13
+ - Target empty → proceed with init
14
+ - Target has compatible files (package.json, .git, etc.) → proceed
15
+ - Target already has .savepoint → error unless --force
16
+ - Target has conflicting files → error unless --force
17
+ - Boundary errors (permission denied) → clear error message
18
+
19
+ ## Implementation Plan
20
+
21
+ - [x] Add `internal/init/validate.go`
22
+ - [x] Implement `ValidateTarget(path, force) error`
23
+ - [x] Check directory exists, is writable
24
+ - [x] Check for existing .savepoint (conflict)
25
+ - [x] Check for compatible project files
26
+ - [x] Handle permission errors with clear messages
27
+ - [x] Test all validation scenarios
28
+ - [x] Run `make build && make test`
@@ -0,0 +1,46 @@
1
+ ---
2
+ id: E07-init-command/T003-scaffold-writer
3
+ status: done
4
+ objective: "Implement scaffold writing from templates"
5
+ depends_on: ["E07-init-command/T002-target-validation"]
6
+ ---
7
+
8
+ # T003: Scaffold Writer
9
+
10
+ ## Acceptance Criteria
11
+
12
+ - Reads templates from `templates/project/` directory
13
+ - Interpolates project name into template files (AGENTS.md, config.yml)
14
+ - Creates parent directories as needed
15
+ - Excludes conflicting files unless --force
16
+ - Copies all .savepoint/ contents
17
+ - Creates root AGENTS.md from template
18
+
19
+ ## Implementation Plan
20
+
21
+ - [x] Add `internal/init/scaffold.go`
22
+ - [x] Implement `Scaffold(targetDir, projectName, force) error`
23
+ - [x] Load templates from embedded or filesystem path
24
+ - [x] Implement template variable interpolation (project name)
25
+ - [x] Create .savepoint/ directory structure
26
+ - [x] Copy all template files to target
27
+ - [x] Create root AGENTS.md from template
28
+ - [x] Test scaffold output in temp directory
29
+ - [x] Run `make build && make test`
30
+
31
+ ## Context Log
32
+
33
+ - Files read: router.md, E07-Detail.md, T002-target-validation.md, T001-cli-entrypoint.md, cmd/init.go, cmd/init_test.go, main.go, internal/init/validate.go, internal/init/validate_test.go, Makefile, templates/project/**/*
34
+ - Files created: internal/init/scaffold.go, internal/init/scaffold_test.go
35
+ - Files modified: main.go, T003-scaffold-writer.md
36
+ - Estimated input tokens: ~14k
37
+ - Key decisions:
38
+ - Used Go `embed.FS` with `fs.Sub` to embed `templates/project/` recursively.
39
+ - Explicit `//go:embed templates/project/.savepoint` needed because Go's embed excludes dotfile-prefixed directories from recursive directory embedding.
40
+ - Scaffold accepts `fs.FS` for testability; tested with `testing/fstest.MapFS`.
41
+ - Init runner in `main.go` validates first (reuses T002), then scaffolds.
42
+ - Template variables: `{{PROJECT_NAME}}` and `{{RELEASE_NUMBER}}` replaced via `strings.ReplaceAll`.
43
+
44
+ ## Drift Notes
45
+
46
+ - `cmd/` and `internal/init/` modules were not in AGENTS.md Codebase Map. Updated AGENTS.md to include both.
@@ -0,0 +1,27 @@
1
+ ---
2
+ id: E07-init-command/T004-atomic-writes
3
+ status: done
4
+ objective: "Implement atomic file writes with temp-file-plus-rename"
5
+ depends_on: ["E07-init-command/T003-scaffold-writer"]
6
+ ---
7
+
8
+ # T004: Atomic Writes
9
+
10
+ ## Acceptance Criteria
11
+
12
+ - Writes use temp file + rename pattern
13
+ - Existing files not corrupted on write failure
14
+ - Atomic operation prevents partial writes
15
+ - Handles conflicts gracefully
16
+ - Works on Windows, Linux, macOS
17
+
18
+ ## Implementation Plan
19
+
20
+ - [x] Add `internal/init/write.go`
21
+ - [x] Implement `AtomicWrite(target, content) error`
22
+ - [x] Create temp file in same directory (atomic on POSIX)
23
+ - [x] Write content to temp file
24
+ - [x] Rename temp to target (atomic on success)
25
+ - [x] Clean up temp file on failure
26
+ - [x] Test atomic write behavior
27
+ - [x] Run `make build && make test`
@@ -0,0 +1,25 @@
1
+ ---
2
+ id: E07-init-command/T005-magic-prompt
3
+ status: done
4
+ objective: "Render and output magic prompt to stdout"
5
+ depends_on: ["E07-init-command/T004-atomic-writes"]
6
+ ---
7
+
8
+ # T005: Magic Prompt
9
+
10
+ ## Acceptance Criteria
11
+
12
+ - Reads `templates/prompts/magic-prompt.prompt.md` template
13
+ - Renders template with project context
14
+ - Outputs rendered prompt to stdout
15
+ - Prompt is copy-paste ready for AI agent
16
+
17
+ ## Implementation Plan
18
+
19
+ - [x] Add `internal/init/prompt.go`
20
+ - [x] Implement `RenderMagicPrompt(projectName) (string, error)`
21
+ - [x] Load magic-prompt.prompt.md template
22
+ - [x] Interpolate project name into prompt
23
+ - [x] Output to stdout after scaffold completes
24
+ - [x] Test prompt rendering
25
+ - [x] Run `make build && make test`
@@ -0,0 +1,26 @@
1
+ ---
2
+ id: E07-init-command/T006-clipboard
3
+ status: done
4
+ objective: "Implement best-effort clipboard copy"
5
+ depends_on: ["E07-init-command/T005-magic-prompt"]
6
+ ---
7
+
8
+ # T006: Clipboard
9
+
10
+ ## Acceptance Criteria
11
+
12
+ - Detects platform (Windows/macOS/Linux)
13
+ - Copies magic prompt to clipboard
14
+ - Does NOT fail if clipboard unavailable (best-effort)
15
+ - Returns success/skipped/failed status without throwing on error
16
+ - Works on PowerShell, iTerm2, terminal emulators
17
+
18
+ ## Implementation Plan
19
+
20
+ - [x] Add `internal/init/clipboard.go`
21
+ - [x] Implement `CopyToClipboard(text) ClipboardResult`
22
+ - [x] Detect platform: Windows (clip.exe), macOS (pbcopy), Linux (xclip/xsel)
23
+ - [x] Fall back gracefully if clipboard tools unavailable
24
+ - [x] Log skip or failure without failing init
25
+ - [x] Test clipboard status handling on the current platform
26
+ - [x] Run quality gates (`go test ./internal/init ./cmd`, `go build ./...`, `go test ./...`)
@@ -0,0 +1,26 @@
1
+ ---
2
+ id: E07-init-command/T007-integration-test
3
+ status: done
4
+ objective: "End-to-end integration test of init flow"
5
+ depends_on: ["E07-init-command/T006-clipboard"]
6
+ ---
7
+
8
+ # T007: Integration Test
9
+
10
+ ## Acceptance Criteria
11
+
12
+ - Full init pipeline runs end-to-end in temp directory
13
+ - Validates: empty dir, existing project, already-initialized, --force, --install
14
+ - Tests pass on Windows, Linux, macOS
15
+ - Output includes magic prompt to stdout
16
+
17
+ ## Implementation Plan
18
+
19
+ - [x] Add `internal/init/integration_test.go`
20
+ - [x] Test: init in empty directory
21
+ - [x] Test: init in compatible project
22
+ - [x] Test: init fails without --force on existing .savepoint
23
+ - [x] Test: init with --force overwrites
24
+ - [x] Test: init with --install triggers npm install
25
+ - [x] Verify magic prompt in stdout
26
+ - [x] Run full test suite: `make build && make test`