@opengsd/gsd-core 1.2.0 → 1.3.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 (532) hide show
  1. package/README.ja-JP.md +46 -791
  2. package/README.ko-KR.md +44 -780
  3. package/README.md +42 -218
  4. package/README.pt-BR.md +47 -414
  5. package/README.zh-CN.md +46 -763
  6. package/agents/gsd-ai-researcher.md +2 -2
  7. package/agents/gsd-debug-session-manager.md +1 -1
  8. package/agents/gsd-debugger.md +8 -8
  9. package/agents/gsd-doc-writer.md +7 -6
  10. package/agents/gsd-domain-researcher.md +15 -2
  11. package/agents/gsd-eval-auditor.md +1 -1
  12. package/agents/gsd-eval-planner.md +2 -2
  13. package/agents/gsd-executor.md +21 -8
  14. package/agents/gsd-framework-selector.md +1 -1
  15. package/agents/gsd-intel-updater.md +4 -4
  16. package/agents/gsd-phase-researcher.md +19 -6
  17. package/agents/gsd-plan-checker.md +3 -3
  18. package/agents/gsd-planner.md +36 -23
  19. package/agents/gsd-project-researcher.md +13 -0
  20. package/agents/gsd-research-synthesizer.md +6 -2
  21. package/agents/gsd-roadmapper.md +6 -6
  22. package/agents/gsd-ui-researcher.md +16 -3
  23. package/agents/gsd-user-profiler.md +2 -2
  24. package/agents/gsd-verifier.md +8 -8
  25. package/assets/gsd-logo-2000-transparent.png +0 -0
  26. package/assets/gsd-logo-2000-transparent.svg +17 -0
  27. package/assets/gsd-logo-2000.png +0 -0
  28. package/assets/gsd-logo-2000.svg +21 -0
  29. package/assets/terminal.svg +68 -0
  30. package/bin/install.js +255 -103
  31. package/commands/gsd/add-tests.md +1 -1
  32. package/commands/gsd/ai-integration-phase.md +3 -3
  33. package/commands/gsd/audit-fix.md +1 -1
  34. package/commands/gsd/audit-milestone.md +1 -1
  35. package/commands/gsd/audit-uat.md +1 -1
  36. package/commands/gsd/autonomous.md +2 -2
  37. package/commands/gsd/capture.md +6 -6
  38. package/commands/gsd/cleanup.md +1 -1
  39. package/commands/gsd/code-review.md +1 -1
  40. package/commands/gsd/complete-milestone.md +2 -2
  41. package/commands/gsd/config.md +3 -3
  42. package/commands/gsd/debug.md +1 -1
  43. package/commands/gsd/discuss-phase.md +5 -4
  44. package/commands/gsd/docs-update.md +1 -1
  45. package/commands/gsd/eval-review.md +2 -2
  46. package/commands/gsd/execute-phase.md +2 -2
  47. package/commands/gsd/explore.md +1 -1
  48. package/commands/gsd/extract-learnings.md +2 -2
  49. package/commands/gsd/fast.md +1 -1
  50. package/commands/gsd/forensics.md +1 -1
  51. package/commands/gsd/graphify.md +9 -9
  52. package/commands/gsd/health.md +1 -1
  53. package/commands/gsd/help.md +2 -2
  54. package/commands/gsd/import.md +5 -5
  55. package/commands/gsd/inbox.md +1 -1
  56. package/commands/gsd/ingest-docs.md +4 -4
  57. package/commands/gsd/manager.md +3 -3
  58. package/commands/gsd/map-codebase.md +1 -1
  59. package/commands/gsd/milestone-summary.md +1 -1
  60. package/commands/gsd/mvp-phase.md +4 -4
  61. package/commands/gsd/new-milestone.md +5 -5
  62. package/commands/gsd/new-project.md +5 -5
  63. package/commands/gsd/pause-work.md +2 -2
  64. package/commands/gsd/phase.md +4 -4
  65. package/commands/gsd/plan-phase.md +2 -2
  66. package/commands/gsd/plan-review-convergence.md +4 -4
  67. package/commands/gsd/pr-branch.md +1 -1
  68. package/commands/gsd/profile-user.md +2 -2
  69. package/commands/gsd/progress.md +4 -4
  70. package/commands/gsd/quick.md +1 -1
  71. package/commands/gsd/resume-work.md +1 -1
  72. package/commands/gsd/review.md +3 -2
  73. package/commands/gsd/secure-phase.md +1 -1
  74. package/commands/gsd/settings.md +1 -1
  75. package/commands/gsd/ship.md +2 -2
  76. package/commands/gsd/sketch.md +7 -7
  77. package/commands/gsd/spec-phase.md +2 -2
  78. package/commands/gsd/spike.md +3 -3
  79. package/commands/gsd/stats.md +1 -1
  80. package/commands/gsd/surface.md +4 -4
  81. package/commands/gsd/thread.md +1 -1
  82. package/commands/gsd/ui-phase.md +2 -2
  83. package/commands/gsd/ui-review.md +2 -2
  84. package/commands/gsd/ultraplan-phase.md +2 -2
  85. package/commands/gsd/undo.md +3 -3
  86. package/commands/gsd/update.md +3 -3
  87. package/commands/gsd/validate-phase.md +1 -1
  88. package/commands/gsd/verify-work.md +2 -2
  89. package/commands/gsd/workspace.md +4 -4
  90. package/{get-shit-done → gsd-core}/bin/check-latest-version.cjs +1 -1
  91. package/{get-shit-done → gsd-core}/bin/gsd-tools.cjs +50 -4
  92. package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
  93. package/gsd-core/bin/lib/adr-parser.cjs +399 -0
  94. package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
  95. package/gsd-core/bin/lib/artifacts.cjs +51 -0
  96. package/gsd-core/bin/lib/audit.cjs +743 -0
  97. package/gsd-core/bin/lib/check-command-router.cjs +342 -0
  98. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  99. package/gsd-core/bin/lib/clock.cjs +95 -0
  100. package/gsd-core/bin/lib/clusters.cjs +128 -0
  101. package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
  102. package/gsd-core/bin/lib/command-aliases.cjs +809 -0
  103. package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
  104. package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
  105. package/gsd-core/bin/lib/commands.cjs +1202 -0
  106. package/gsd-core/bin/lib/config-schema.cjs +29 -0
  107. package/gsd-core/bin/lib/config-types.cjs +19 -0
  108. package/gsd-core/bin/lib/config.cjs +714 -0
  109. package/{get-shit-done → gsd-core}/bin/lib/configuration.cjs +76 -85
  110. package/gsd-core/bin/lib/context-utilization.cjs +48 -0
  111. package/gsd-core/bin/lib/core.cjs +2007 -0
  112. package/{get-shit-done → gsd-core}/bin/lib/decisions.cjs +9 -7
  113. package/gsd-core/bin/lib/docs.cjs +252 -0
  114. package/gsd-core/bin/lib/drift.cjs +364 -0
  115. package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
  116. package/gsd-core/bin/lib/frontmatter.cjs +442 -0
  117. package/gsd-core/bin/lib/gap-checker.cjs +257 -0
  118. package/gsd-core/bin/lib/graphify.cjs +496 -0
  119. package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
  120. package/gsd-core/bin/lib/init-command-router.cjs +62 -0
  121. package/gsd-core/bin/lib/init.cjs +1799 -0
  122. package/gsd-core/bin/lib/install-profiles.cjs +526 -0
  123. package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
  124. package/gsd-core/bin/lib/installer-migration-report.cjs +347 -0
  125. package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
  126. package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  127. package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  128. package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  129. package/gsd-core/bin/lib/installer-migrations.cjs +784 -0
  130. package/gsd-core/bin/lib/intel.cjs +607 -0
  131. package/gsd-core/bin/lib/learnings.cjs +270 -0
  132. package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
  133. package/gsd-core/bin/lib/milestone.cjs +373 -0
  134. package/gsd-core/bin/lib/model-catalog.cjs +154 -0
  135. package/gsd-core/bin/lib/model-profiles.cjs +24 -0
  136. package/gsd-core/bin/lib/observability/event.cjs +51 -0
  137. package/gsd-core/bin/lib/observability/logger.cjs +146 -0
  138. package/{get-shit-done → gsd-core}/bin/lib/observability/redaction.cjs +19 -21
  139. package/{get-shit-done → gsd-core}/bin/lib/package-identity.cjs +5 -1
  140. package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
  141. package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
  142. package/gsd-core/bin/lib/phase.cjs +1307 -0
  143. package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
  144. package/{get-shit-done → gsd-core}/bin/lib/plan-scan.cjs +18 -24
  145. package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
  146. package/gsd-core/bin/lib/profile-output.cjs +1120 -0
  147. package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
  148. package/gsd-core/bin/lib/project-root.cjs +119 -0
  149. package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
  150. package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
  151. package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
  152. package/gsd-core/bin/lib/roadmap-upgrade.cjs +491 -0
  153. package/gsd-core/bin/lib/roadmap.cjs +600 -0
  154. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +254 -0
  155. package/gsd-core/bin/lib/runtime-homes.cjs +169 -0
  156. package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
  157. package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
  158. package/{get-shit-done → gsd-core}/bin/lib/schema-detect.cjs +20 -26
  159. package/gsd-core/bin/lib/secrets.cjs +34 -0
  160. package/gsd-core/bin/lib/security.cjs +407 -0
  161. package/gsd-core/bin/lib/semver-compare.cjs +42 -0
  162. package/gsd-core/bin/lib/shell-command-projection.cjs +524 -0
  163. package/gsd-core/bin/lib/state-command-router.cjs +160 -0
  164. package/{get-shit-done → gsd-core}/bin/lib/state-document.cjs +78 -82
  165. package/gsd-core/bin/lib/state.cjs +2010 -0
  166. package/gsd-core/bin/lib/surface.cjs +406 -0
  167. package/gsd-core/bin/lib/task-command-router.cjs +85 -0
  168. package/gsd-core/bin/lib/template.cjs +237 -0
  169. package/gsd-core/bin/lib/uat.cjs +297 -0
  170. package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
  171. package/gsd-core/bin/lib/update-context.cjs +218 -0
  172. package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
  173. package/gsd-core/bin/lib/validate.cjs +112 -0
  174. package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
  175. package/gsd-core/bin/lib/verify.cjs +1451 -0
  176. package/{get-shit-done → gsd-core}/bin/lib/workstream-inventory-builder.cjs +19 -12
  177. package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
  178. package/{get-shit-done → gsd-core}/bin/lib/workstream-name-policy.cjs +28 -31
  179. package/gsd-core/bin/lib/workstream.cjs +380 -0
  180. package/gsd-core/bin/lib/worktree-safety.cjs +912 -0
  181. package/{get-shit-done → gsd-core}/bin/shared/config-defaults.manifest.json +1 -0
  182. package/{get-shit-done → gsd-core}/bin/shared/config-schema.manifest.json +17 -1
  183. package/{get-shit-done → gsd-core}/bin/shared/model-catalog.json +27 -0
  184. package/{get-shit-done → gsd-core}/references/artifact-types.md +1 -1
  185. package/{get-shit-done → gsd-core}/references/checkpoints.md +1 -1
  186. package/{get-shit-done → gsd-core}/references/few-shot-examples/plan-checker.md +2 -2
  187. package/{get-shit-done → gsd-core}/references/few-shot-examples/verifier.md +12 -12
  188. package/{get-shit-done → gsd-core}/references/model-profile-resolution.md +1 -1
  189. package/{get-shit-done → gsd-core}/references/mvp-concepts.md +1 -1
  190. package/{get-shit-done → gsd-core}/references/planner-graphify-auto-update.md +2 -2
  191. package/{get-shit-done → gsd-core}/references/planner-human-verify-mode.md +1 -1
  192. package/{get-shit-done → gsd-core}/references/planner-mvp-mode.md +1 -1
  193. package/{get-shit-done → gsd-core}/references/ui-brand.md +4 -2
  194. package/{get-shit-done → gsd-core}/references/verification-patterns.md +1 -1
  195. package/gsd-core/references/worktree-branch-check.md +38 -0
  196. package/{get-shit-done → gsd-core}/references/worktree-path-safety.md +4 -26
  197. package/{get-shit-done → gsd-core}/templates/README.md +2 -2
  198. package/{get-shit-done → gsd-core}/templates/codebase/structure.md +10 -10
  199. package/{get-shit-done → gsd-core}/templates/copilot-instructions.md +1 -1
  200. package/{get-shit-done → gsd-core}/templates/phase-prompt.md +10 -10
  201. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
  202. package/{get-shit-done → gsd-core}/workflows/add-backlog.md +1 -1
  203. package/{get-shit-done → gsd-core}/workflows/add-phase.md +1 -1
  204. package/{get-shit-done → gsd-core}/workflows/add-tests.md +1 -1
  205. package/{get-shit-done → gsd-core}/workflows/add-todo.md +1 -1
  206. package/{get-shit-done → gsd-core}/workflows/ai-integration-phase.md +4 -4
  207. package/{get-shit-done → gsd-core}/workflows/audit-fix.md +2 -2
  208. package/{get-shit-done → gsd-core}/workflows/audit-milestone.md +3 -1
  209. package/{get-shit-done → gsd-core}/workflows/audit-uat.md +1 -1
  210. package/{get-shit-done → gsd-core}/workflows/autonomous.md +10 -8
  211. package/{get-shit-done → gsd-core}/workflows/check-todos.md +1 -1
  212. package/{get-shit-done → gsd-core}/workflows/cleanup.md +44 -4
  213. package/{get-shit-done → gsd-core}/workflows/code-review-fix.md +4 -4
  214. package/{get-shit-done → gsd-core}/workflows/code-review.md +6 -4
  215. package/{get-shit-done → gsd-core}/workflows/complete-milestone.md +2 -2
  216. package/{get-shit-done → gsd-core}/workflows/debug.md +7 -2
  217. package/{get-shit-done → gsd-core}/workflows/diagnose-issues.md +6 -2
  218. package/{get-shit-done → gsd-core}/workflows/discovery-phase.md +5 -5
  219. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/advisor.md +5 -5
  220. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/auto.md +1 -1
  221. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/chain.md +1 -1
  222. package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/power.md +1 -1
  223. package/{get-shit-done → gsd-core}/workflows/discuss-phase-assumptions.md +4 -4
  224. package/{get-shit-done → gsd-core}/workflows/discuss-phase.md +6 -6
  225. package/{get-shit-done → gsd-core}/workflows/do.md +1 -1
  226. package/{get-shit-done → gsd-core}/workflows/docs-update.md +19 -5
  227. package/{get-shit-done → gsd-core}/workflows/edit-phase.md +1 -1
  228. package/{get-shit-done → gsd-core}/workflows/eval-review.md +3 -3
  229. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/codebase-drift-gate.md +16 -3
  230. package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/post-merge-gate.md +1 -1
  231. package/{get-shit-done → gsd-core}/workflows/execute-phase.md +89 -57
  232. package/{get-shit-done → gsd-core}/workflows/execute-plan.md +8 -8
  233. package/{get-shit-done → gsd-core}/workflows/explore.md +5 -3
  234. package/{get-shit-done → gsd-core}/workflows/extract-learnings.md +1 -1
  235. package/{get-shit-done → gsd-core}/workflows/forensics.md +1 -1
  236. package/{get-shit-done → gsd-core}/workflows/graduation.md +1 -1
  237. package/{get-shit-done → gsd-core}/workflows/health.md +1 -1
  238. package/{get-shit-done → gsd-core}/workflows/help/modes/default.md +3 -3
  239. package/{get-shit-done → gsd-core}/workflows/help/modes/full.md +6 -6
  240. package/{get-shit-done → gsd-core}/workflows/import.md +3 -1
  241. package/{get-shit-done → gsd-core}/workflows/ingest-docs.md +5 -5
  242. package/{get-shit-done → gsd-core}/workflows/insert-phase.md +1 -1
  243. package/{get-shit-done → gsd-core}/workflows/list-workspaces.md +1 -1
  244. package/{get-shit-done → gsd-core}/workflows/manager.md +3 -3
  245. package/{get-shit-done → gsd-core}/workflows/map-codebase.md +3 -1
  246. package/{get-shit-done → gsd-core}/workflows/milestone-summary.md +1 -1
  247. package/{get-shit-done → gsd-core}/workflows/mvp-phase.md +7 -7
  248. package/{get-shit-done → gsd-core}/workflows/new-milestone.md +5 -5
  249. package/{get-shit-done → gsd-core}/workflows/new-project.md +8 -8
  250. package/{get-shit-done → gsd-core}/workflows/new-workspace.md +1 -1
  251. package/{get-shit-done → gsd-core}/workflows/next.md +1 -1
  252. package/{get-shit-done → gsd-core}/workflows/pause-work.md +1 -1
  253. package/{get-shit-done → gsd-core}/workflows/plan-milestone-gaps.md +1 -1
  254. package/{get-shit-done → gsd-core}/workflows/plan-phase.md +29 -28
  255. package/{get-shit-done → gsd-core}/workflows/plan-review-convergence.md +10 -10
  256. package/{get-shit-done → gsd-core}/workflows/plant-seed.md +1 -1
  257. package/{get-shit-done → gsd-core}/workflows/profile-user.md +11 -11
  258. package/{get-shit-done → gsd-core}/workflows/progress.md +1 -1
  259. package/{get-shit-done → gsd-core}/workflows/quick.md +7 -29
  260. package/{get-shit-done → gsd-core}/workflows/reapply-patches.md +2 -2
  261. package/{get-shit-done → gsd-core}/workflows/remove-phase.md +1 -1
  262. package/{get-shit-done → gsd-core}/workflows/remove-workspace.md +1 -1
  263. package/{get-shit-done → gsd-core}/workflows/resume-project.md +2 -2
  264. package/{get-shit-done → gsd-core}/workflows/review.md +110 -2
  265. package/{get-shit-done → gsd-core}/workflows/scan.md +3 -1
  266. package/{get-shit-done → gsd-core}/workflows/secure-phase.md +5 -3
  267. package/{get-shit-done → gsd-core}/workflows/settings-advanced.md +196 -6
  268. package/{get-shit-done → gsd-core}/workflows/settings-integrations.md +2 -2
  269. package/{get-shit-done → gsd-core}/workflows/settings.md +16 -2
  270. package/{get-shit-done → gsd-core}/workflows/ship.md +56 -4
  271. package/{get-shit-done → gsd-core}/workflows/sketch-wrap-up.md +1 -1
  272. package/{get-shit-done → gsd-core}/workflows/sketch.md +5 -5
  273. package/{get-shit-done → gsd-core}/workflows/spec-phase.md +2 -2
  274. package/{get-shit-done → gsd-core}/workflows/spike-wrap-up.md +1 -1
  275. package/{get-shit-done → gsd-core}/workflows/spike.md +1 -1
  276. package/{get-shit-done → gsd-core}/workflows/stats.md +1 -1
  277. package/{get-shit-done → gsd-core}/workflows/sync-skills.md +3 -3
  278. package/{get-shit-done → gsd-core}/workflows/thread.md +1 -1
  279. package/{get-shit-done → gsd-core}/workflows/transition.md +2 -2
  280. package/{get-shit-done → gsd-core}/workflows/ui-phase.md +5 -5
  281. package/{get-shit-done → gsd-core}/workflows/ui-review.md +3 -3
  282. package/{get-shit-done → gsd-core}/workflows/ultraplan-phase.md +1 -1
  283. package/{get-shit-done → gsd-core}/workflows/undo.md +2 -2
  284. package/{get-shit-done → gsd-core}/workflows/update.md +41 -16
  285. package/{get-shit-done → gsd-core}/workflows/validate-phase.md +5 -3
  286. package/{get-shit-done → gsd-core}/workflows/verify-phase.md +4 -4
  287. package/{get-shit-done → gsd-core}/workflows/verify-work.md +7 -7
  288. package/hooks/dist/gsd-check-update-worker.js +16 -3
  289. package/hooks/dist/gsd-check-update.js +7 -5
  290. package/hooks/dist/gsd-context-monitor.js +2 -2
  291. package/hooks/dist/gsd-statusline.js +39 -21
  292. package/hooks/dist/gsd-update-banner.js +6 -2
  293. package/hooks/dist/gsd-worktree-path-guard.js +169 -0
  294. package/hooks/dist/managed-hooks-registry.cjs +35 -0
  295. package/hooks/gsd-check-update-worker.js +16 -3
  296. package/hooks/gsd-check-update.js +7 -5
  297. package/hooks/gsd-context-monitor.js +2 -2
  298. package/hooks/gsd-statusline.js +39 -21
  299. package/hooks/gsd-update-banner.js +6 -2
  300. package/hooks/gsd-worktree-path-guard.js +169 -0
  301. package/hooks/managed-hooks-registry.cjs +1 -0
  302. package/package.json +17 -11
  303. package/scripts/affected-tests-lib.cjs +1 -1
  304. package/scripts/base64-scan.sh +12 -0
  305. package/scripts/build-hooks.js +5 -1
  306. package/scripts/changeset/cli.cjs +2 -2
  307. package/scripts/changeset/github-release-notes.cjs +1 -1
  308. package/scripts/changeset/lint.cjs +1 -1
  309. package/scripts/check-alias-drift.cjs +8 -8
  310. package/scripts/check-env.cjs +5 -1
  311. package/scripts/ci-test-scope.cjs +34 -9
  312. package/scripts/command-contract-helpers.cjs +1 -1
  313. package/scripts/fix-slash-commands.cjs +5 -5
  314. package/scripts/gen-inventory-manifest.cjs +3 -3
  315. package/scripts/generate-package-identity.cjs +28 -7
  316. package/scripts/lib/allowlist-ratchet.cjs +136 -0
  317. package/scripts/lint-command-contract.cjs +1 -1
  318. package/scripts/lint-legacy-dir-name.cjs +156 -0
  319. package/scripts/lint-package-identity-drift.cjs +8 -8
  320. package/scripts/lint-pr-check-project-dir.cjs +0 -1
  321. package/scripts/lint-shell-command-projection-drift.cjs +1 -1
  322. package/scripts/lint-skill-deps.cjs +1 -1
  323. package/scripts/lint-test-file-count.allowlist.json +129 -32
  324. package/scripts/lint-test-file-count.cjs +85 -30
  325. package/scripts/mutation-matrix.cjs +219 -0
  326. package/scripts/prompt-injection-scan.sh +5 -1
  327. package/scripts/release-notes/format-github-release-notes.cjs +256 -0
  328. package/scripts/release-tarball-smoke.cjs +9 -9
  329. package/scripts/run-tests.cjs +34 -2
  330. package/scripts/strip-prose-atrefs.cjs +2 -2
  331. package/scripts/sync-runtime-launcher.cjs +2 -2
  332. package/scripts/verify-npm-publish.cjs +252 -0
  333. package/get-shit-done/bin/lib/active-workstream-store.cjs +0 -302
  334. package/get-shit-done/bin/lib/adr-parser.cjs +0 -394
  335. package/get-shit-done/bin/lib/agent-command-router.cjs +0 -65
  336. package/get-shit-done/bin/lib/artifacts.cjs +0 -53
  337. package/get-shit-done/bin/lib/audit.cjs +0 -755
  338. package/get-shit-done/bin/lib/check-command-router.cjs +0 -333
  339. package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +0 -118
  340. package/get-shit-done/bin/lib/clock.cjs +0 -96
  341. package/get-shit-done/bin/lib/clusters.cjs +0 -135
  342. package/get-shit-done/bin/lib/code-review-flags.cjs +0 -74
  343. package/get-shit-done/bin/lib/command-aliases.cjs +0 -815
  344. package/get-shit-done/bin/lib/command-arg-projection.cjs +0 -62
  345. package/get-shit-done/bin/lib/command-routing-hub.cjs +0 -388
  346. package/get-shit-done/bin/lib/commands.cjs +0 -1188
  347. package/get-shit-done/bin/lib/config-schema.cjs +0 -31
  348. package/get-shit-done/bin/lib/config.cjs +0 -728
  349. package/get-shit-done/bin/lib/context-utilization.cjs +0 -47
  350. package/get-shit-done/bin/lib/core.cjs +0 -2121
  351. package/get-shit-done/bin/lib/docs.cjs +0 -270
  352. package/get-shit-done/bin/lib/drift.cjs +0 -388
  353. package/get-shit-done/bin/lib/fallow-runner.cjs +0 -109
  354. package/get-shit-done/bin/lib/frontmatter.cjs +0 -389
  355. package/get-shit-done/bin/lib/gap-checker.cjs +0 -205
  356. package/get-shit-done/bin/lib/graphify.cjs +0 -592
  357. package/get-shit-done/bin/lib/gsd2-import.cjs +0 -514
  358. package/get-shit-done/bin/lib/init-command-router.cjs +0 -58
  359. package/get-shit-done/bin/lib/init.cjs +0 -2112
  360. package/get-shit-done/bin/lib/install-profiles.cjs +0 -603
  361. package/get-shit-done/bin/lib/installer-migration-authoring.cjs +0 -117
  362. package/get-shit-done/bin/lib/installer-migration-report.cjs +0 -354
  363. package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +0 -220
  364. package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +0 -41
  365. package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +0 -80
  366. package/get-shit-done/bin/lib/installer-migrations.cjs +0 -778
  367. package/get-shit-done/bin/lib/intel.cjs +0 -708
  368. package/get-shit-done/bin/lib/learnings.cjs +0 -421
  369. package/get-shit-done/bin/lib/milestone.cjs +0 -314
  370. package/get-shit-done/bin/lib/model-catalog.cjs +0 -212
  371. package/get-shit-done/bin/lib/model-profiles.cjs +0 -31
  372. package/get-shit-done/bin/lib/observability/event.cjs +0 -82
  373. package/get-shit-done/bin/lib/observability/logger.cjs +0 -174
  374. package/get-shit-done/bin/lib/phase-command-router.cjs +0 -191
  375. package/get-shit-done/bin/lib/phase-lifecycle.cjs +0 -80
  376. package/get-shit-done/bin/lib/phase.cjs +0 -1607
  377. package/get-shit-done/bin/lib/phases-command-router.cjs +0 -39
  378. package/get-shit-done/bin/lib/planning-workspace.cjs +0 -238
  379. package/get-shit-done/bin/lib/profile-output.cjs +0 -1141
  380. package/get-shit-done/bin/lib/profile-pipeline.cjs +0 -539
  381. package/get-shit-done/bin/lib/project-root.cjs +0 -112
  382. package/get-shit-done/bin/lib/prompt-budget.cjs +0 -399
  383. package/get-shit-done/bin/lib/review-reviewer-selection.cjs +0 -125
  384. package/get-shit-done/bin/lib/roadmap-command-router.cjs +0 -28
  385. package/get-shit-done/bin/lib/roadmap.cjs +0 -650
  386. package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +0 -301
  387. package/get-shit-done/bin/lib/runtime-homes.cjs +0 -222
  388. package/get-shit-done/bin/lib/runtime-name-policy.cjs +0 -83
  389. package/get-shit-done/bin/lib/runtime-slash.cjs +0 -112
  390. package/get-shit-done/bin/lib/secrets.cjs +0 -32
  391. package/get-shit-done/bin/lib/security.cjs +0 -600
  392. package/get-shit-done/bin/lib/semver-compare.cjs +0 -35
  393. package/get-shit-done/bin/lib/shell-command-projection.cjs +0 -500
  394. package/get-shit-done/bin/lib/state-command-router.cjs +0 -252
  395. package/get-shit-done/bin/lib/state.cjs +0 -2038
  396. package/get-shit-done/bin/lib/surface.cjs +0 -470
  397. package/get-shit-done/bin/lib/task-command-router.cjs +0 -81
  398. package/get-shit-done/bin/lib/template.cjs +0 -228
  399. package/get-shit-done/bin/lib/uat.cjs +0 -289
  400. package/get-shit-done/bin/lib/update-context.cjs +0 -209
  401. package/get-shit-done/bin/lib/validate-command-router.cjs +0 -83
  402. package/get-shit-done/bin/lib/validate.cjs +0 -92
  403. package/get-shit-done/bin/lib/verify-command-router.cjs +0 -40
  404. package/get-shit-done/bin/lib/verify.cjs +0 -1511
  405. package/get-shit-done/bin/lib/workstream-inventory.cjs +0 -146
  406. package/get-shit-done/bin/lib/workstream.cjs +0 -389
  407. package/get-shit-done/bin/lib/worktree-safety.cjs +0 -985
  408. package/get-shit-done/workflows/_runtime-launcher.snippet.sh +0 -1
  409. package/scripts/lint-no-source-grep-extras.cjs +0 -81
  410. package/scripts/lint-no-source-grep.cjs +0 -174
  411. package/scripts/lint-shared-module-handsync.cjs +0 -388
  412. package/scripts/shared-module-handsync-allowlist.json +0 -183
  413. /package/{get-shit-done → gsd-core}/bin/shared/runtime-aliases.manifest.json +0 -0
  414. /package/{get-shit-done → gsd-core}/bin/verify-reapply-patches.cjs +0 -0
  415. /package/{get-shit-done → gsd-core}/contexts/dev.md +0 -0
  416. /package/{get-shit-done → gsd-core}/contexts/research.md +0 -0
  417. /package/{get-shit-done → gsd-core}/contexts/review.md +0 -0
  418. /package/{get-shit-done → gsd-core}/references/agent-contracts.md +0 -0
  419. /package/{get-shit-done → gsd-core}/references/ai-evals.md +0 -0
  420. /package/{get-shit-done → gsd-core}/references/ai-frameworks.md +0 -0
  421. /package/{get-shit-done → gsd-core}/references/autonomous-smart-discuss.md +0 -0
  422. /package/{get-shit-done → gsd-core}/references/common-bug-patterns.md +0 -0
  423. /package/{get-shit-done → gsd-core}/references/context-budget.md +0 -0
  424. /package/{get-shit-done → gsd-core}/references/continuation-format.md +0 -0
  425. /package/{get-shit-done → gsd-core}/references/debugger-philosophy.md +0 -0
  426. /package/{get-shit-done → gsd-core}/references/decimal-phase-calculation.md +0 -0
  427. /package/{get-shit-done → gsd-core}/references/doc-conflict-engine.md +0 -0
  428. /package/{get-shit-done → gsd-core}/references/domain-probes.md +0 -0
  429. /package/{get-shit-done → gsd-core}/references/execute-mvp-tdd.md +0 -0
  430. /package/{get-shit-done → gsd-core}/references/executor-examples.md +0 -0
  431. /package/{get-shit-done → gsd-core}/references/gate-prompts.md +0 -0
  432. /package/{get-shit-done → gsd-core}/references/gates.md +0 -0
  433. /package/{get-shit-done → gsd-core}/references/git-integration.md +0 -0
  434. /package/{get-shit-done → gsd-core}/references/git-planning-commit.md +0 -0
  435. /package/{get-shit-done → gsd-core}/references/ios-scaffold.md +0 -0
  436. /package/{get-shit-done → gsd-core}/references/mandatory-initial-read.md +0 -0
  437. /package/{get-shit-done → gsd-core}/references/model-profiles.md +0 -0
  438. /package/{get-shit-done → gsd-core}/references/phase-argument-parsing.md +0 -0
  439. /package/{get-shit-done → gsd-core}/references/planner-antipatterns.md +0 -0
  440. /package/{get-shit-done → gsd-core}/references/planner-chunked.md +0 -0
  441. /package/{get-shit-done → gsd-core}/references/planner-gap-closure.md +0 -0
  442. /package/{get-shit-done → gsd-core}/references/planner-interface-context.md +0 -0
  443. /package/{get-shit-done → gsd-core}/references/planner-reviews.md +0 -0
  444. /package/{get-shit-done → gsd-core}/references/planner-revision.md +0 -0
  445. /package/{get-shit-done → gsd-core}/references/planner-source-audit.md +0 -0
  446. /package/{get-shit-done → gsd-core}/references/planning-config.md +0 -0
  447. /package/{get-shit-done → gsd-core}/references/project-skills-discovery.md +0 -0
  448. /package/{get-shit-done → gsd-core}/references/questioning.md +0 -0
  449. /package/{get-shit-done → gsd-core}/references/revision-loop.md +0 -0
  450. /package/{get-shit-done → gsd-core}/references/scout-codebase.md +0 -0
  451. /package/{get-shit-done → gsd-core}/references/skeleton-template.md +0 -0
  452. /package/{get-shit-done → gsd-core}/references/sketch-interactivity.md +0 -0
  453. /package/{get-shit-done → gsd-core}/references/sketch-theme-system.md +0 -0
  454. /package/{get-shit-done → gsd-core}/references/sketch-tooling.md +0 -0
  455. /package/{get-shit-done → gsd-core}/references/sketch-variant-patterns.md +0 -0
  456. /package/{get-shit-done → gsd-core}/references/spidr-splitting.md +0 -0
  457. /package/{get-shit-done → gsd-core}/references/tdd.md +0 -0
  458. /package/{get-shit-done → gsd-core}/references/thinking-models-debug.md +0 -0
  459. /package/{get-shit-done → gsd-core}/references/thinking-models-execution.md +0 -0
  460. /package/{get-shit-done → gsd-core}/references/thinking-models-planning.md +0 -0
  461. /package/{get-shit-done → gsd-core}/references/thinking-models-research.md +0 -0
  462. /package/{get-shit-done → gsd-core}/references/thinking-models-verification.md +0 -0
  463. /package/{get-shit-done → gsd-core}/references/thinking-partner.md +0 -0
  464. /package/{get-shit-done → gsd-core}/references/universal-anti-patterns.md +0 -0
  465. /package/{get-shit-done → gsd-core}/references/user-profiling.md +0 -0
  466. /package/{get-shit-done → gsd-core}/references/user-story-template.md +0 -0
  467. /package/{get-shit-done → gsd-core}/references/verification-overrides.md +0 -0
  468. /package/{get-shit-done → gsd-core}/references/verify-mvp-mode.md +0 -0
  469. /package/{get-shit-done → gsd-core}/references/workstream-flag.md +0 -0
  470. /package/{get-shit-done → gsd-core}/templates/AI-SPEC.md +0 -0
  471. /package/{get-shit-done → gsd-core}/templates/DEBUG.md +0 -0
  472. /package/{get-shit-done → gsd-core}/templates/SECURITY.md +0 -0
  473. /package/{get-shit-done → gsd-core}/templates/UAT.md +0 -0
  474. /package/{get-shit-done → gsd-core}/templates/UI-SPEC.md +0 -0
  475. /package/{get-shit-done → gsd-core}/templates/VALIDATION.md +0 -0
  476. /package/{get-shit-done → gsd-core}/templates/claude-md.md +0 -0
  477. /package/{get-shit-done → gsd-core}/templates/codebase/architecture.md +0 -0
  478. /package/{get-shit-done → gsd-core}/templates/codebase/concerns.md +0 -0
  479. /package/{get-shit-done → gsd-core}/templates/codebase/conventions.md +0 -0
  480. /package/{get-shit-done → gsd-core}/templates/codebase/integrations.md +0 -0
  481. /package/{get-shit-done → gsd-core}/templates/codebase/stack.md +0 -0
  482. /package/{get-shit-done → gsd-core}/templates/codebase/testing.md +0 -0
  483. /package/{get-shit-done → gsd-core}/templates/config.json +0 -0
  484. /package/{get-shit-done → gsd-core}/templates/context.md +0 -0
  485. /package/{get-shit-done → gsd-core}/templates/continue-here.md +0 -0
  486. /package/{get-shit-done → gsd-core}/templates/debug-subagent-prompt.md +0 -0
  487. /package/{get-shit-done → gsd-core}/templates/dev-preferences.md +0 -0
  488. /package/{get-shit-done → gsd-core}/templates/discovery.md +0 -0
  489. /package/{get-shit-done → gsd-core}/templates/discussion-log.md +0 -0
  490. /package/{get-shit-done → gsd-core}/templates/milestone-archive.md +0 -0
  491. /package/{get-shit-done → gsd-core}/templates/milestone.md +0 -0
  492. /package/{get-shit-done → gsd-core}/templates/planner-subagent-prompt.md +0 -0
  493. /package/{get-shit-done → gsd-core}/templates/project.md +0 -0
  494. /package/{get-shit-done → gsd-core}/templates/requirements.md +0 -0
  495. /package/{get-shit-done → gsd-core}/templates/research-project/ARCHITECTURE.md +0 -0
  496. /package/{get-shit-done → gsd-core}/templates/research-project/FEATURES.md +0 -0
  497. /package/{get-shit-done → gsd-core}/templates/research-project/PITFALLS.md +0 -0
  498. /package/{get-shit-done → gsd-core}/templates/research-project/STACK.md +0 -0
  499. /package/{get-shit-done → gsd-core}/templates/research-project/SUMMARY.md +0 -0
  500. /package/{get-shit-done → gsd-core}/templates/research.md +0 -0
  501. /package/{get-shit-done → gsd-core}/templates/retrospective.md +0 -0
  502. /package/{get-shit-done → gsd-core}/templates/roadmap.md +0 -0
  503. /package/{get-shit-done → gsd-core}/templates/spec.md +0 -0
  504. /package/{get-shit-done → gsd-core}/templates/state.md +0 -0
  505. /package/{get-shit-done → gsd-core}/templates/summary-complex.md +0 -0
  506. /package/{get-shit-done → gsd-core}/templates/summary-minimal.md +0 -0
  507. /package/{get-shit-done → gsd-core}/templates/summary-standard.md +0 -0
  508. /package/{get-shit-done → gsd-core}/templates/summary.md +0 -0
  509. /package/{get-shit-done → gsd-core}/templates/user-profile.md +0 -0
  510. /package/{get-shit-done → gsd-core}/templates/user-setup.md +0 -0
  511. /package/{get-shit-done → gsd-core}/templates/verification-report.md +0 -0
  512. /package/{get-shit-done → gsd-core}/workflows/analyze-dependencies.md +0 -0
  513. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/all.md +0 -0
  514. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/analyze.md +0 -0
  515. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/batch.md +0 -0
  516. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/default.md +0 -0
  517. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/text.md +0 -0
  518. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/checkpoint.json +0 -0
  519. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/context.md +0 -0
  520. /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/discussion-log.md +0 -0
  521. /package/{get-shit-done → gsd-core}/workflows/discuss-phase-power.md +0 -0
  522. /package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/per-plan-worktree-gate.md +0 -0
  523. /package/{get-shit-done → gsd-core}/workflows/fast.md +0 -0
  524. /package/{get-shit-done → gsd-core}/workflows/help/modes/brief.md +0 -0
  525. /package/{get-shit-done → gsd-core}/workflows/help/modes/topic.md +0 -0
  526. /package/{get-shit-done → gsd-core}/workflows/help.md +0 -0
  527. /package/{get-shit-done → gsd-core}/workflows/inbox.md +0 -0
  528. /package/{get-shit-done → gsd-core}/workflows/list-phase-assumptions.md +0 -0
  529. /package/{get-shit-done → gsd-core}/workflows/node-repair.md +0 -0
  530. /package/{get-shit-done → gsd-core}/workflows/note.md +0 -0
  531. /package/{get-shit-done → gsd-core}/workflows/pr-branch.md +0 -0
  532. /package/{get-shit-done → gsd-core}/workflows/session-report.md +0 -0
@@ -1,228 +0,0 @@
1
- /**
2
- * Template — Template selection and fill operations
3
- */
4
-
5
- const fs = require('fs');
6
- const path = require('path');
7
- const { normalizePhaseName, findPhaseInternal, generateSlugInternal, toPosixPath, output, error } = require('./core.cjs');
8
- const { platformWriteSync } = require('./shell-command-projection.cjs');
9
- const { planningDir } = require('./planning-workspace.cjs');
10
- const { reconstructFrontmatter } = require('./frontmatter.cjs');
11
-
12
- function cmdTemplateSelect(cwd, planPath, raw) {
13
- if (!planPath) {
14
- error('plan-path required');
15
- }
16
-
17
- try {
18
- const fullPath = path.join(cwd, planPath);
19
- const content = fs.readFileSync(fullPath, 'utf-8');
20
-
21
- // Simple heuristics
22
- const taskMatch = content.match(/###\s*Task\s*\d+/g) || [];
23
- const taskCount = taskMatch.length;
24
-
25
- const decisionMatch = content.match(/decision/gi) || [];
26
- const hasDecisions = decisionMatch.length > 0;
27
-
28
- // Count file mentions
29
- const fileMentions = new Set();
30
- const filePattern = /`([^`]+\.[a-zA-Z]+)`/g;
31
- let m;
32
- while ((m = filePattern.exec(content)) !== null) {
33
- if (m[1].includes('/') && !m[1].startsWith('http')) {
34
- fileMentions.add(m[1]);
35
- }
36
- }
37
- const fileCount = fileMentions.size;
38
-
39
- let template = 'templates/summary-standard.md';
40
- let type = 'standard';
41
-
42
- if (taskCount <= 2 && fileCount <= 3 && !hasDecisions) {
43
- template = 'templates/summary-minimal.md';
44
- type = 'minimal';
45
- } else if (hasDecisions || fileCount > 6 || taskCount > 5) {
46
- template = 'templates/summary-complex.md';
47
- type = 'complex';
48
- }
49
-
50
- const result = { template, type, taskCount, fileCount, hasDecisions };
51
- output(result, raw, template);
52
- } catch (e) {
53
- // Fallback to standard
54
- output({ template: 'templates/summary-standard.md', type: 'standard', error: e.message }, raw, 'templates/summary-standard.md');
55
- }
56
- }
57
-
58
- function cmdTemplateFill(cwd, templateType, options, raw) {
59
- if (!templateType) { error('template type required: summary, plan, or verification'); }
60
- if (!options.phase) { error('--phase required'); }
61
-
62
- const phaseInfo = findPhaseInternal(cwd, options.phase);
63
- if (!phaseInfo || !phaseInfo.found) { output({ error: 'Phase not found', phase: options.phase }, raw); return; }
64
-
65
- const padded = normalizePhaseName(options.phase);
66
- const today = new Date().toISOString().split('T')[0];
67
- const phaseName = options.name || phaseInfo.phase_name || 'Unnamed';
68
- const phaseSlug = phaseInfo.phase_slug || generateSlugInternal(phaseName);
69
- const phaseId = `${padded}-${phaseSlug}`;
70
- const planNum = (options.plan || '01').padStart(2, '0');
71
- const fields = options.fields || {};
72
-
73
- let frontmatter, body, fileName;
74
-
75
- switch (templateType) {
76
- case 'summary': {
77
- frontmatter = {
78
- phase: phaseId,
79
- plan: planNum,
80
- subsystem: '[primary category]',
81
- tags: [],
82
- provides: [],
83
- affects: [],
84
- 'tech-stack': { added: [], patterns: [] },
85
- 'key-files': { created: [], modified: [] },
86
- 'key-decisions': [],
87
- 'patterns-established': [],
88
- duration: '[X]min',
89
- completed: today,
90
- ...fields,
91
- };
92
- body = [
93
- `# Phase ${options.phase}: ${phaseName} Summary`,
94
- '',
95
- '**[Substantive one-liner describing outcome]**',
96
- '',
97
- '## Performance',
98
- '- **Duration:** [time]',
99
- '- **Tasks:** [count completed]',
100
- '- **Files modified:** [count]',
101
- '',
102
- '## Accomplishments',
103
- '- [Key outcome 1]',
104
- '- [Key outcome 2]',
105
- '',
106
- '## Task Commits',
107
- '1. **Task 1: [task name]** - `hash`',
108
- '',
109
- '## Files Created/Modified',
110
- '- `path/to/file.ts` - What it does',
111
- '',
112
- '## Decisions & Deviations',
113
- '[Key decisions or "None - followed plan as specified"]',
114
- '',
115
- '## Next Phase Readiness',
116
- '[What\'s ready for next phase]',
117
- ].join('\n');
118
- fileName = `${padded}-${planNum}-SUMMARY.md`;
119
- break;
120
- }
121
- case 'plan': {
122
- const planType = options.type || 'execute';
123
- const wave = parseInt(options.wave) || 1;
124
- frontmatter = {
125
- phase: phaseId,
126
- plan: planNum,
127
- type: planType,
128
- wave,
129
- depends_on: [],
130
- files_modified: [],
131
- autonomous: true,
132
- user_setup: [],
133
- must_haves: { truths: [], artifacts: [], key_links: [] },
134
- ...fields,
135
- };
136
- const planBase = planningDir(cwd);
137
- const projectRef = toPosixPath(path.relative(cwd, path.join(planBase, 'PROJECT.md')));
138
- const roadmapRef = toPosixPath(path.relative(cwd, path.join(planBase, 'ROADMAP.md')));
139
- const stateRef = toPosixPath(path.relative(cwd, path.join(planBase, 'STATE.md')));
140
- body = [
141
- `# Phase ${options.phase} Plan ${planNum}: [Title]`,
142
- '',
143
- '## Objective',
144
- '- **What:** [What this plan builds]',
145
- '- **Why:** [Why it matters for the phase goal]',
146
- '- **Output:** [Concrete deliverable]',
147
- '',
148
- '## Context',
149
- `@${projectRef}`,
150
- `@${roadmapRef}`,
151
- `@${stateRef}`,
152
- '',
153
- '## Tasks',
154
- '',
155
- '<task type="code">',
156
- ' <name>[Task name]</name>',
157
- ' <files>[file paths]</files>',
158
- ' <action>[What to do]</action>',
159
- ' <verify>[How to verify]</verify>',
160
- ' <done>[Definition of done]</done>',
161
- '</task>',
162
- '',
163
- '## Verification',
164
- '[How to verify this plan achieved its objective]',
165
- '',
166
- '## Success Criteria',
167
- '- [ ] [Criterion 1]',
168
- '- [ ] [Criterion 2]',
169
- ].join('\n');
170
- fileName = `${padded}-${planNum}-PLAN.md`;
171
- break;
172
- }
173
- case 'verification': {
174
- frontmatter = {
175
- phase: phaseId,
176
- verified: new Date().toISOString(),
177
- status: 'pending',
178
- score: '0/0 must-haves verified',
179
- ...fields,
180
- };
181
- body = [
182
- `# Phase ${options.phase}: ${phaseName} — Verification`,
183
- '',
184
- '## Observable Truths',
185
- '| # | Truth | Status | Evidence |',
186
- '|---|-------|--------|----------|',
187
- '| 1 | [Truth] | pending | |',
188
- '',
189
- '## Required Artifacts',
190
- '| Artifact | Expected | Status | Details |',
191
- '|----------|----------|--------|---------|',
192
- '| [path] | [what] | pending | |',
193
- '',
194
- '## Key Link Verification',
195
- '| From | To | Via | Status | Details |',
196
- '|------|----|----|--------|---------|',
197
- '| [source] | [target] | [connection] | pending | |',
198
- '',
199
- '## Requirements Coverage',
200
- '| Requirement | Status | Blocking Issue |',
201
- '|-------------|--------|----------------|',
202
- '| [req] | pending | |',
203
- '',
204
- '## Result',
205
- '[Pending verification]',
206
- ].join('\n');
207
- fileName = `${padded}-VERIFICATION.md`;
208
- break;
209
- }
210
- default:
211
- error(`Unknown template type: ${templateType}. Available: summary, plan, verification`);
212
- return;
213
- }
214
-
215
- const fullContent = `---\n${reconstructFrontmatter(frontmatter)}\n---\n\n${body}\n`;
216
- const outPath = path.join(cwd, phaseInfo.directory, fileName);
217
-
218
- if (fs.existsSync(outPath)) {
219
- output({ error: 'File already exists', path: toPosixPath(path.relative(cwd, outPath)) }, raw);
220
- return;
221
- }
222
-
223
- platformWriteSync(outPath, fullContent);
224
- const relPath = toPosixPath(path.relative(cwd, outPath));
225
- output({ created: true, path: relPath, template: templateType }, raw, relPath);
226
- }
227
-
228
- module.exports = { cmdTemplateSelect, cmdTemplateFill };
@@ -1,289 +0,0 @@
1
- /**
2
- * UAT Audit — Cross-phase UAT/VERIFICATION scanner
3
- *
4
- * Reads all *-UAT.md and *-VERIFICATION.md files across all phases.
5
- * Extracts non-passing items. Returns structured JSON for workflow consumption.
6
- */
7
-
8
- const fs = require('fs');
9
- const path = require('path');
10
- const { output, error, getMilestonePhaseFilter, toPosixPath } = require('./core.cjs');
11
- const { planningDir } = require('./planning-workspace.cjs');
12
- const { extractFrontmatter } = require('./frontmatter.cjs');
13
- const { requireSafePath, sanitizeForDisplay } = require('./security.cjs');
14
-
15
- function cmdAuditUat(cwd, raw) {
16
- const phasesDir = path.join(planningDir(cwd), 'phases');
17
- if (!fs.existsSync(phasesDir)) {
18
- error('No phases directory found in planning directory');
19
- }
20
-
21
- const isDirInMilestone = getMilestonePhaseFilter(cwd);
22
- const results = [];
23
-
24
- // Scan all phase directories
25
- const dirs = fs.readdirSync(phasesDir, { withFileTypes: true })
26
- .filter(e => e.isDirectory())
27
- .map(e => e.name)
28
- .filter(isDirInMilestone)
29
- .sort();
30
-
31
- for (const dir of dirs) {
32
- const phaseMatch = dir.match(/^(\d+[A-Z]?(?:\.\d+)*)/i);
33
- const phaseNum = phaseMatch ? phaseMatch[1] : dir;
34
- const phaseDir = path.join(phasesDir, dir);
35
- const files = fs.readdirSync(phaseDir);
36
-
37
- // Process UAT files
38
- for (const file of files.filter(f => f.includes('-UAT') && f.endsWith('.md'))) {
39
- const content = fs.readFileSync(path.join(phaseDir, file), 'utf-8');
40
- const items = parseUatItems(content);
41
- if (items.length > 0) {
42
- results.push({
43
- phase: phaseNum,
44
- phase_dir: dir,
45
- file,
46
- file_path: toPosixPath(path.relative(cwd, path.join(phaseDir, file))),
47
- type: 'uat',
48
- status: (extractFrontmatter(content).status || 'unknown'),
49
- items,
50
- });
51
- }
52
- }
53
-
54
- // Process VERIFICATION files
55
- for (const file of files.filter(f => f.includes('-VERIFICATION') && f.endsWith('.md'))) {
56
- const content = fs.readFileSync(path.join(phaseDir, file), 'utf-8');
57
- const status = extractFrontmatter(content).status || 'unknown';
58
- if (status === 'human_needed' || status === 'gaps_found') {
59
- const items = parseVerificationItems(content, status);
60
- if (items.length > 0) {
61
- results.push({
62
- phase: phaseNum,
63
- phase_dir: dir,
64
- file,
65
- file_path: toPosixPath(path.relative(cwd, path.join(phaseDir, file))),
66
- type: 'verification',
67
- status,
68
- items,
69
- });
70
- }
71
- }
72
- }
73
- }
74
-
75
- // Compute summary
76
- const summary = {
77
- total_files: results.length,
78
- total_items: results.reduce((sum, r) => sum + r.items.length, 0),
79
- by_category: {},
80
- by_phase: {},
81
- };
82
-
83
- for (const r of results) {
84
- if (!summary.by_phase[r.phase]) summary.by_phase[r.phase] = 0;
85
- for (const item of r.items) {
86
- summary.by_phase[r.phase]++;
87
- const cat = item.category || 'unknown';
88
- summary.by_category[cat] = (summary.by_category[cat] || 0) + 1;
89
- }
90
- }
91
-
92
- output({ results, summary }, raw);
93
- }
94
-
95
- function cmdRenderCheckpoint(cwd, options = {}, raw) {
96
- const filePath = options.file;
97
- if (!filePath) {
98
- error('UAT file required: use uat render-checkpoint --file <path>');
99
- }
100
-
101
- const resolvedPath = requireSafePath(filePath, cwd, 'UAT file', { allowAbsolute: true });
102
- if (!fs.existsSync(resolvedPath)) {
103
- error(`UAT file not found: ${filePath}`);
104
- }
105
-
106
- const content = fs.readFileSync(resolvedPath, 'utf-8');
107
- const currentTest = parseCurrentTest(content);
108
-
109
- if (currentTest.complete) {
110
- error('UAT session is already complete; no pending checkpoint to render');
111
- }
112
-
113
- const checkpoint = buildCheckpoint(currentTest);
114
- output({
115
- file_path: toPosixPath(path.relative(cwd, resolvedPath)),
116
- test_number: currentTest.number,
117
- test_name: currentTest.name,
118
- checkpoint,
119
- }, raw, checkpoint);
120
- }
121
-
122
- function parseCurrentTest(content) {
123
- const currentTestMatch = content.match(/##\s*Current Test\s*(?:\n<!--[\s\S]*?-->)?\n([\s\S]*?)(?=\n##\s|$)/i);
124
- if (!currentTestMatch) {
125
- error('UAT file is missing a Current Test section');
126
- }
127
-
128
- const section = currentTestMatch[1].trimEnd();
129
- if (!section.trim()) {
130
- error('Current Test section is empty');
131
- }
132
-
133
- if (/\[testing complete\]/i.test(section)) {
134
- return { complete: true };
135
- }
136
-
137
- const numberMatch = section.match(/^number:\s*(\d+)\s*$/m);
138
- const nameMatch = section.match(/^name:\s*(.+)\s*$/m);
139
- const expectedBlockMatch = section.match(/^expected:\s*\|\n([\s\S]*?)(?=^\w[\w-]*:\s)/m)
140
- || section.match(/^expected:\s*\|\n([\s\S]+)/m);
141
- const expectedInlineMatch = section.match(/^expected:\s*(.+)\s*$/m);
142
-
143
- if (!numberMatch || !nameMatch || (!expectedBlockMatch && !expectedInlineMatch)) {
144
- error('Current Test section is malformed');
145
- }
146
-
147
- let expected;
148
- if (expectedBlockMatch) {
149
- expected = expectedBlockMatch[1]
150
- .split('\n')
151
- .map(line => line.replace(/^ {2}/, ''))
152
- .join('\n')
153
- .trim();
154
- } else {
155
- expected = expectedInlineMatch[1].trim();
156
- }
157
-
158
- return {
159
- complete: false,
160
- number: parseInt(numberMatch[1], 10),
161
- name: sanitizeForDisplay(nameMatch[1].trim()),
162
- expected: sanitizeForDisplay(expected),
163
- };
164
- }
165
-
166
- function buildCheckpoint(currentTest) {
167
- return [
168
- '╔══════════════════════════════════════════════════════════════╗',
169
- '║ CHECKPOINT: Verification Required ║',
170
- '╚══════════════════════════════════════════════════════════════╝',
171
- '',
172
- `**Test ${currentTest.number}: ${currentTest.name}**`,
173
- '',
174
- currentTest.expected,
175
- '',
176
- '──────────────────────────────────────────────────────────────',
177
- 'Type `pass` or describe what\'s wrong.',
178
- '──────────────────────────────────────────────────────────────',
179
- ].join('\n');
180
- }
181
-
182
- function parseUatItems(content) {
183
- const items = [];
184
- // Match test blocks: ### N. Name\nexpected: ...\nresult: ...\n
185
- // Accept both bare (result: pending) and bracketed (result: [pending]) formats (#2273)
186
- const testPattern = /###\s*(\d+)\.\s*([^\n]+)\nexpected:\s*([^\n]+)\nresult:\s*\[?(\w+)\]?(?:\n(?:reported|reason|blocked_by):\s*[^\n]*)?/g;
187
- let match;
188
- while ((match = testPattern.exec(content)) !== null) {
189
- const [, num, name, expected, result] = match;
190
- if (result === 'pending' || result === 'skipped' || result === 'blocked') {
191
- // Extract optional fields — limit to current test block (up to next ### or EOF)
192
- const afterMatch = content.slice(match.index);
193
- const nextHeading = afterMatch.indexOf('\n###', 1);
194
- const blockText = nextHeading > 0 ? afterMatch.slice(0, nextHeading) : afterMatch;
195
- const reasonMatch = blockText.match(/reason:\s*(.+)/);
196
- const blockedByMatch = blockText.match(/blocked_by:\s*(.+)/);
197
-
198
- const item = {
199
- test: parseInt(num, 10),
200
- name: name.trim(),
201
- expected: expected.trim(),
202
- result,
203
- category: categorizeItem(result, reasonMatch?.[1], blockedByMatch?.[1]),
204
- };
205
- if (reasonMatch) item.reason = reasonMatch[1].trim();
206
- if (blockedByMatch) item.blocked_by = blockedByMatch[1].trim();
207
- items.push(item);
208
- }
209
- }
210
- return items;
211
- }
212
-
213
- function parseVerificationItems(content, status) {
214
- const items = [];
215
- if (status === 'human_needed') {
216
- // Extract from human_verification section — look for numbered items or table rows
217
- const hvSection = content.match(/##\s*Human Verification.*?\n([\s\S]*?)(?=\n##\s|\n---\s|$)/i);
218
- if (hvSection) {
219
- const lines = hvSection[1].split('\n');
220
- for (const line of lines) {
221
- // Match table rows: | N | description | ... |
222
- const tableMatch = line.match(/\|\s*(\d+)\s*\|\s*([^|]+)/);
223
- // Match bullet items: - description
224
- const bulletMatch = line.match(/^[-*]\s+(.+)/);
225
- // Match numbered items: 1. description
226
- const numberedMatch = line.match(/^(\d+)\.\s+(.+)/);
227
-
228
- if (tableMatch) {
229
- // Skip rows that already have a passing result (PASS, pass, resolved, etc.)
230
- const rowRemainder = line.slice(tableMatch.index + tableMatch[0].length);
231
- const cellValues = rowRemainder.split('|').map(c => c.trim());
232
- const hasPassResult = cellValues.some(c => /^pass$/i.test(c) || /^resolved$/i.test(c));
233
- if (hasPassResult) continue;
234
- items.push({
235
- test: parseInt(tableMatch[1], 10),
236
- name: tableMatch[2].trim(),
237
- result: 'human_needed',
238
- category: 'human_uat',
239
- });
240
- } else if (numberedMatch) {
241
- items.push({
242
- test: parseInt(numberedMatch[1], 10),
243
- name: numberedMatch[2].trim(),
244
- result: 'human_needed',
245
- category: 'human_uat',
246
- });
247
- } else if (bulletMatch && bulletMatch[1].length > 10) {
248
- items.push({
249
- name: bulletMatch[1].trim(),
250
- result: 'human_needed',
251
- category: 'human_uat',
252
- });
253
- }
254
- }
255
- }
256
- }
257
- // gaps_found items are already handled by plan-phase --gaps pipeline
258
- return items;
259
- }
260
-
261
- function categorizeItem(result, reason, blockedBy) {
262
- if (result === 'blocked' || blockedBy) {
263
- if (blockedBy) {
264
- if (/server/i.test(blockedBy)) return 'server_blocked';
265
- if (/device|physical/i.test(blockedBy)) return 'device_needed';
266
- if (/build|release|preview/i.test(blockedBy)) return 'build_needed';
267
- if (/third.party|twilio|stripe/i.test(blockedBy)) return 'third_party';
268
- }
269
- return 'blocked';
270
- }
271
- if (result === 'skipped') {
272
- if (reason) {
273
- if (/server|not running|not available/i.test(reason)) return 'server_blocked';
274
- if (/simulator|physical|device/i.test(reason)) return 'device_needed';
275
- if (/build|release|preview/i.test(reason)) return 'build_needed';
276
- }
277
- return 'skipped_unresolved';
278
- }
279
- if (result === 'pending') return 'pending';
280
- if (result === 'human_needed') return 'human_uat';
281
- return 'unknown';
282
- }
283
-
284
- module.exports = {
285
- cmdAuditUat,
286
- cmdRenderCheckpoint,
287
- parseCurrentTest,
288
- buildCheckpoint,
289
- };