@therocketcode/gsd-core 1.4.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 (568) hide show
  1. package/.claude-plugin/plugin.json +23 -0
  2. package/GEMINI.md +53 -0
  3. package/LICENSE +21 -0
  4. package/README.ja-JP.md +125 -0
  5. package/README.ko-KR.md +125 -0
  6. package/README.md +144 -0
  7. package/README.pt-BR.md +125 -0
  8. package/README.zh-CN.md +125 -0
  9. package/agents/gsd-advisor-researcher.md +108 -0
  10. package/agents/gsd-ai-researcher.md +114 -0
  11. package/agents/gsd-assumptions-analyzer.md +105 -0
  12. package/agents/gsd-code-fixer.md +668 -0
  13. package/agents/gsd-code-reviewer.md +387 -0
  14. package/agents/gsd-codebase-mapper.md +853 -0
  15. package/agents/gsd-debug-session-manager.md +314 -0
  16. package/agents/gsd-debugger.md +1452 -0
  17. package/agents/gsd-doc-classifier.md +168 -0
  18. package/agents/gsd-doc-synthesizer.md +204 -0
  19. package/agents/gsd-doc-verifier.md +217 -0
  20. package/agents/gsd-doc-writer.md +616 -0
  21. package/agents/gsd-domain-researcher.md +147 -0
  22. package/agents/gsd-eval-auditor.md +191 -0
  23. package/agents/gsd-eval-planner.md +154 -0
  24. package/agents/gsd-executor.md +785 -0
  25. package/agents/gsd-framework-selector.md +160 -0
  26. package/agents/gsd-integration-checker.md +470 -0
  27. package/agents/gsd-intel-updater.md +342 -0
  28. package/agents/gsd-nyquist-auditor.md +203 -0
  29. package/agents/gsd-pattern-mapper.md +335 -0
  30. package/agents/gsd-phase-researcher.md +867 -0
  31. package/agents/gsd-plan-checker.md +978 -0
  32. package/agents/gsd-planner.md +1204 -0
  33. package/agents/gsd-project-researcher.md +611 -0
  34. package/agents/gsd-research-synthesizer.md +259 -0
  35. package/agents/gsd-roadmapper.md +688 -0
  36. package/agents/gsd-security-auditor.md +155 -0
  37. package/agents/gsd-ui-auditor.md +495 -0
  38. package/agents/gsd-ui-checker.md +309 -0
  39. package/agents/gsd-ui-researcher.md +374 -0
  40. package/agents/gsd-user-profiler.md +171 -0
  41. package/agents/gsd-verifier.md +923 -0
  42. package/assets/gsd-logo-2000-transparent.png +0 -0
  43. package/assets/gsd-logo-2000-transparent.svg +17 -0
  44. package/assets/gsd-logo-2000.png +0 -0
  45. package/assets/gsd-logo-2000.svg +21 -0
  46. package/assets/terminal.svg +68 -0
  47. package/bin/install.js +12726 -0
  48. package/bin/lib/ui-safety-gate.cjs +107 -0
  49. package/commands/gsd/add-tests.md +42 -0
  50. package/commands/gsd/ai-integration-phase.md +37 -0
  51. package/commands/gsd/audit-fix.md +34 -0
  52. package/commands/gsd/audit-milestone.md +37 -0
  53. package/commands/gsd/audit-uat.md +24 -0
  54. package/commands/gsd/autonomous.md +48 -0
  55. package/commands/gsd/capture.md +62 -0
  56. package/commands/gsd/cleanup.md +24 -0
  57. package/commands/gsd/code-review.md +59 -0
  58. package/commands/gsd/complete-milestone.md +143 -0
  59. package/commands/gsd/config.md +56 -0
  60. package/commands/gsd/debug.md +52 -0
  61. package/commands/gsd/discover-product.md +65 -0
  62. package/commands/gsd/discuss-phase.md +77 -0
  63. package/commands/gsd/docs-update.md +49 -0
  64. package/commands/gsd/eval-review.md +33 -0
  65. package/commands/gsd/execute-phase.md +66 -0
  66. package/commands/gsd/explore.md +27 -0
  67. package/commands/gsd/extract-learnings.md +23 -0
  68. package/commands/gsd/fast.md +31 -0
  69. package/commands/gsd/forensics.md +57 -0
  70. package/commands/gsd/graphify.md +204 -0
  71. package/commands/gsd/health.md +31 -0
  72. package/commands/gsd/help.md +28 -0
  73. package/commands/gsd/import.md +45 -0
  74. package/commands/gsd/inbox.md +39 -0
  75. package/commands/gsd/ingest-docs.md +42 -0
  76. package/commands/gsd/manager.md +45 -0
  77. package/commands/gsd/map-codebase.md +83 -0
  78. package/commands/gsd/milestone-summary.md +51 -0
  79. package/commands/gsd/model-domain.md +65 -0
  80. package/commands/gsd/mvp-phase.md +45 -0
  81. package/commands/gsd/new-milestone.md +45 -0
  82. package/commands/gsd/new-project.md +47 -0
  83. package/commands/gsd/ns-context.md +23 -0
  84. package/commands/gsd/ns-ideate.md +24 -0
  85. package/commands/gsd/ns-manage.md +29 -0
  86. package/commands/gsd/ns-project.md +22 -0
  87. package/commands/gsd/ns-review.md +26 -0
  88. package/commands/gsd/ns-workflow.md +28 -0
  89. package/commands/gsd/pause-work.md +43 -0
  90. package/commands/gsd/phase.md +56 -0
  91. package/commands/gsd/plan-phase.md +64 -0
  92. package/commands/gsd/plan-review-convergence.md +59 -0
  93. package/commands/gsd/pr-branch.md +26 -0
  94. package/commands/gsd/profile-user.md +46 -0
  95. package/commands/gsd/progress.md +48 -0
  96. package/commands/gsd/quick.md +174 -0
  97. package/commands/gsd/recommend-architecture.md +64 -0
  98. package/commands/gsd/resume-work.md +30 -0
  99. package/commands/gsd/review-backlog.md +63 -0
  100. package/commands/gsd/review.md +42 -0
  101. package/commands/gsd/secure-phase.md +36 -0
  102. package/commands/gsd/settings.md +29 -0
  103. package/commands/gsd/ship.md +24 -0
  104. package/commands/gsd/sketch.md +60 -0
  105. package/commands/gsd/spec-phase.md +63 -0
  106. package/commands/gsd/spike.md +57 -0
  107. package/commands/gsd/stats.md +20 -0
  108. package/commands/gsd/surface.md +155 -0
  109. package/commands/gsd/testing-strategy.md +65 -0
  110. package/commands/gsd/thread.md +24 -0
  111. package/commands/gsd/ui-phase.md +35 -0
  112. package/commands/gsd/ui-review.md +33 -0
  113. package/commands/gsd/ultraplan-phase.md +34 -0
  114. package/commands/gsd/undo.md +35 -0
  115. package/commands/gsd/update.md +49 -0
  116. package/commands/gsd/validate-phase.md +36 -0
  117. package/commands/gsd/verify-work.md +39 -0
  118. package/commands/gsd/workspace.md +52 -0
  119. package/commands/gsd/workstreams.md +70 -0
  120. package/gemini-extension.json +6 -0
  121. package/gsd-core/bin/check-latest-version.cjs +161 -0
  122. package/gsd-core/bin/gsd-tools.cjs +1928 -0
  123. package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
  124. package/gsd-core/bin/lib/adr-parser.cjs +399 -0
  125. package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
  126. package/gsd-core/bin/lib/artifacts.cjs +51 -0
  127. package/gsd-core/bin/lib/audit.cjs +743 -0
  128. package/gsd-core/bin/lib/check-command-router.cjs +343 -0
  129. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  130. package/gsd-core/bin/lib/cli-exit.cjs +42 -0
  131. package/gsd-core/bin/lib/clock.cjs +95 -0
  132. package/gsd-core/bin/lib/clusters.cjs +132 -0
  133. package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
  134. package/gsd-core/bin/lib/command-aliases.cjs +809 -0
  135. package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
  136. package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
  137. package/gsd-core/bin/lib/commands.cjs +1203 -0
  138. package/gsd-core/bin/lib/config-schema.cjs +29 -0
  139. package/gsd-core/bin/lib/config-types.cjs +19 -0
  140. package/gsd-core/bin/lib/config.cjs +738 -0
  141. package/gsd-core/bin/lib/configuration.cjs +239 -0
  142. package/gsd-core/bin/lib/context-utilization.cjs +48 -0
  143. package/gsd-core/bin/lib/core.cjs +2051 -0
  144. package/gsd-core/bin/lib/decisions.cjs +118 -0
  145. package/gsd-core/bin/lib/docs.cjs +252 -0
  146. package/gsd-core/bin/lib/drift.cjs +364 -0
  147. package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
  148. package/gsd-core/bin/lib/frontmatter.cjs +442 -0
  149. package/gsd-core/bin/lib/gap-checker.cjs +257 -0
  150. package/gsd-core/bin/lib/graphify.cjs +496 -0
  151. package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
  152. package/gsd-core/bin/lib/init-command-router.cjs +62 -0
  153. package/gsd-core/bin/lib/init.cjs +1815 -0
  154. package/gsd-core/bin/lib/install-profiles.cjs +584 -0
  155. package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
  156. package/gsd-core/bin/lib/installer-migration-report.cjs +350 -0
  157. package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
  158. package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  159. package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  160. package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  161. package/gsd-core/bin/lib/installer-migrations.cjs +823 -0
  162. package/gsd-core/bin/lib/intel.cjs +590 -0
  163. package/gsd-core/bin/lib/learnings.cjs +270 -0
  164. package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
  165. package/gsd-core/bin/lib/milestone.cjs +373 -0
  166. package/gsd-core/bin/lib/model-catalog.cjs +154 -0
  167. package/gsd-core/bin/lib/model-profiles.cjs +24 -0
  168. package/gsd-core/bin/lib/observability/event.cjs +51 -0
  169. package/gsd-core/bin/lib/observability/logger.cjs +146 -0
  170. package/gsd-core/bin/lib/observability/redaction.cjs +48 -0
  171. package/gsd-core/bin/lib/package-identity.cjs +35 -0
  172. package/gsd-core/bin/lib/package-legitimacy.cjs +368 -0
  173. package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
  174. package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
  175. package/gsd-core/bin/lib/phase.cjs +1307 -0
  176. package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
  177. package/gsd-core/bin/lib/plan-scan.cjs +91 -0
  178. package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
  179. package/gsd-core/bin/lib/profile-output.cjs +1120 -0
  180. package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
  181. package/gsd-core/bin/lib/project-root.cjs +119 -0
  182. package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
  183. package/gsd-core/bin/lib/research-provider.cjs +137 -0
  184. package/gsd-core/bin/lib/research-store.cjs +167 -0
  185. package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
  186. package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
  187. package/gsd-core/bin/lib/roadmap-upgrade.cjs +476 -0
  188. package/gsd-core/bin/lib/roadmap.cjs +600 -0
  189. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +312 -0
  190. package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +56 -0
  191. package/gsd-core/bin/lib/runtime-homes.cjs +190 -0
  192. package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
  193. package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
  194. package/gsd-core/bin/lib/schema-detect.cjs +159 -0
  195. package/gsd-core/bin/lib/secrets.cjs +34 -0
  196. package/gsd-core/bin/lib/security.cjs +480 -0
  197. package/gsd-core/bin/lib/semver-compare.cjs +42 -0
  198. package/gsd-core/bin/lib/shell-command-projection.cjs +533 -0
  199. package/gsd-core/bin/lib/state-command-router.cjs +160 -0
  200. package/gsd-core/bin/lib/state-document.cjs +259 -0
  201. package/gsd-core/bin/lib/state.cjs +2010 -0
  202. package/gsd-core/bin/lib/surface.cjs +449 -0
  203. package/gsd-core/bin/lib/task-command-router.cjs +85 -0
  204. package/gsd-core/bin/lib/template.cjs +237 -0
  205. package/gsd-core/bin/lib/uat.cjs +297 -0
  206. package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
  207. package/gsd-core/bin/lib/update-context.cjs +218 -0
  208. package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
  209. package/gsd-core/bin/lib/validate.cjs +112 -0
  210. package/gsd-core/bin/lib/verification-command-router.cjs +31 -0
  211. package/gsd-core/bin/lib/verification.cjs +193 -0
  212. package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
  213. package/gsd-core/bin/lib/verify.cjs +1451 -0
  214. package/gsd-core/bin/lib/workstream-inventory-builder.cjs +81 -0
  215. package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
  216. package/gsd-core/bin/lib/workstream-name-policy.cjs +91 -0
  217. package/gsd-core/bin/lib/workstream.cjs +380 -0
  218. package/gsd-core/bin/lib/worktree-base-ref.cjs +325 -0
  219. package/gsd-core/bin/lib/worktree-safety.cjs +943 -0
  220. package/gsd-core/bin/shared/config-defaults.manifest.json +98 -0
  221. package/gsd-core/bin/shared/config-schema.manifest.json +192 -0
  222. package/gsd-core/bin/shared/model-catalog.json +149 -0
  223. package/gsd-core/bin/shared/runtime-aliases.manifest.json +75 -0
  224. package/gsd-core/bin/verify-reapply-patches.cjs +349 -0
  225. package/gsd-core/contexts/dev.md +21 -0
  226. package/gsd-core/contexts/research.md +22 -0
  227. package/gsd-core/contexts/review.md +23 -0
  228. package/gsd-core/references/agent-contracts.md +79 -0
  229. package/gsd-core/references/ai-evals.md +156 -0
  230. package/gsd-core/references/ai-frameworks.md +186 -0
  231. package/gsd-core/references/architecture-decision.md +74 -0
  232. package/gsd-core/references/artifact-types.md +131 -0
  233. package/gsd-core/references/auth-in-tests.md +91 -0
  234. package/gsd-core/references/autonomous-smart-discuss.md +277 -0
  235. package/gsd-core/references/checkpoints.md +814 -0
  236. package/gsd-core/references/common-bug-patterns.md +114 -0
  237. package/gsd-core/references/context-budget.md +85 -0
  238. package/gsd-core/references/continuation-format.md +253 -0
  239. package/gsd-core/references/db-test-isolation.md +54 -0
  240. package/gsd-core/references/debugger-philosophy.md +76 -0
  241. package/gsd-core/references/decimal-phase-calculation.md +64 -0
  242. package/gsd-core/references/doc-conflict-engine.md +91 -0
  243. package/gsd-core/references/domain-modeling.md +80 -0
  244. package/gsd-core/references/domain-probes.md +125 -0
  245. package/gsd-core/references/e2e-tiering.md +35 -0
  246. package/gsd-core/references/execute-mvp-tdd.md +81 -0
  247. package/gsd-core/references/executor-examples.md +110 -0
  248. package/gsd-core/references/few-shot-examples/plan-checker.md +73 -0
  249. package/gsd-core/references/few-shot-examples/verifier.md +109 -0
  250. package/gsd-core/references/flaky-test-checklist.md +22 -0
  251. package/gsd-core/references/gate-prompts.md +100 -0
  252. package/gsd-core/references/gates.md +70 -0
  253. package/gsd-core/references/git-integration.md +298 -0
  254. package/gsd-core/references/git-planning-commit.md +40 -0
  255. package/gsd-core/references/ios-scaffold.md +123 -0
  256. package/gsd-core/references/mandatory-initial-read.md +2 -0
  257. package/gsd-core/references/model-profile-resolution.md +38 -0
  258. package/gsd-core/references/model-profiles.md +245 -0
  259. package/gsd-core/references/mvp-concepts.md +49 -0
  260. package/gsd-core/references/phase-argument-parsing.md +61 -0
  261. package/gsd-core/references/planner-antipatterns.md +89 -0
  262. package/gsd-core/references/planner-chunked.md +49 -0
  263. package/gsd-core/references/planner-gap-closure.md +62 -0
  264. package/gsd-core/references/planner-graphify-auto-update.md +67 -0
  265. package/gsd-core/references/planner-human-verify-mode.md +57 -0
  266. package/gsd-core/references/planner-interface-context.md +62 -0
  267. package/gsd-core/references/planner-load-graph-context.md +36 -0
  268. package/gsd-core/references/planner-mvp-mode.md +53 -0
  269. package/gsd-core/references/planner-reviews.md +39 -0
  270. package/gsd-core/references/planner-revision.md +87 -0
  271. package/gsd-core/references/planner-source-audit.md +73 -0
  272. package/gsd-core/references/planning-config.md +473 -0
  273. package/gsd-core/references/product-discovery.md +49 -0
  274. package/gsd-core/references/project-skills-discovery.md +19 -0
  275. package/gsd-core/references/questioning.md +162 -0
  276. package/gsd-core/references/realistic-test-data.md +44 -0
  277. package/gsd-core/references/research-documentation-lookup.md +29 -0
  278. package/gsd-core/references/research-philosophy.md +29 -0
  279. package/gsd-core/references/research-verification-protocol.md +27 -0
  280. package/gsd-core/references/revision-loop.md +97 -0
  281. package/gsd-core/references/scout-codebase.md +51 -0
  282. package/gsd-core/references/skeleton-template.md +48 -0
  283. package/gsd-core/references/sketch-interactivity.md +41 -0
  284. package/gsd-core/references/sketch-theme-system.md +94 -0
  285. package/gsd-core/references/sketch-tooling.md +45 -0
  286. package/gsd-core/references/sketch-variant-patterns.md +81 -0
  287. package/gsd-core/references/spidr-splitting.md +69 -0
  288. package/gsd-core/references/tdd.md +330 -0
  289. package/gsd-core/references/test-containers.md +55 -0
  290. package/gsd-core/references/test-strategy.md +75 -0
  291. package/gsd-core/references/thinking-models-debug.md +44 -0
  292. package/gsd-core/references/thinking-models-execution.md +50 -0
  293. package/gsd-core/references/thinking-models-planning.md +62 -0
  294. package/gsd-core/references/thinking-models-research.md +50 -0
  295. package/gsd-core/references/thinking-models-verification.md +55 -0
  296. package/gsd-core/references/thinking-partner.md +96 -0
  297. package/gsd-core/references/ui-brand.md +162 -0
  298. package/gsd-core/references/universal-anti-patterns.md +63 -0
  299. package/gsd-core/references/user-profiling.md +681 -0
  300. package/gsd-core/references/user-story-template.md +58 -0
  301. package/gsd-core/references/verification-overrides.md +227 -0
  302. package/gsd-core/references/verification-patterns.md +612 -0
  303. package/gsd-core/references/verify-mvp-mode.md +85 -0
  304. package/gsd-core/references/workstream-flag.md +111 -0
  305. package/gsd-core/references/worktree-branch-check.md +38 -0
  306. package/gsd-core/references/worktree-path-safety.md +67 -0
  307. package/gsd-core/templates/AI-SPEC.md +246 -0
  308. package/gsd-core/templates/DEBUG.md +169 -0
  309. package/gsd-core/templates/README.md +77 -0
  310. package/gsd-core/templates/SECURITY.md +61 -0
  311. package/gsd-core/templates/UAT.md +265 -0
  312. package/gsd-core/templates/UI-SPEC.md +100 -0
  313. package/gsd-core/templates/VALIDATION.md +76 -0
  314. package/gsd-core/templates/adr.md +58 -0
  315. package/gsd-core/templates/claude-md.md +145 -0
  316. package/gsd-core/templates/codebase/architecture.md +255 -0
  317. package/gsd-core/templates/codebase/concerns.md +310 -0
  318. package/gsd-core/templates/codebase/conventions.md +307 -0
  319. package/gsd-core/templates/codebase/integrations.md +280 -0
  320. package/gsd-core/templates/codebase/stack.md +186 -0
  321. package/gsd-core/templates/codebase/structure.md +285 -0
  322. package/gsd-core/templates/codebase/testing.md +480 -0
  323. package/gsd-core/templates/config.json +62 -0
  324. package/gsd-core/templates/context.md +352 -0
  325. package/gsd-core/templates/continue-here.md +78 -0
  326. package/gsd-core/templates/copilot-instructions.md +7 -0
  327. package/gsd-core/templates/debug-subagent-prompt.md +91 -0
  328. package/gsd-core/templates/dev-preferences.md +21 -0
  329. package/gsd-core/templates/discovery.md +146 -0
  330. package/gsd-core/templates/discussion-log.md +63 -0
  331. package/gsd-core/templates/domain-model.md +54 -0
  332. package/gsd-core/templates/milestone-archive.md +123 -0
  333. package/gsd-core/templates/milestone.md +115 -0
  334. package/gsd-core/templates/phase-prompt.md +610 -0
  335. package/gsd-core/templates/planner-subagent-prompt.md +117 -0
  336. package/gsd-core/templates/product-brief.md +55 -0
  337. package/gsd-core/templates/project.md +186 -0
  338. package/gsd-core/templates/requirements.md +231 -0
  339. package/gsd-core/templates/research-project/ARCHITECTURE.md +204 -0
  340. package/gsd-core/templates/research-project/FEATURES.md +147 -0
  341. package/gsd-core/templates/research-project/PITFALLS.md +200 -0
  342. package/gsd-core/templates/research-project/STACK.md +120 -0
  343. package/gsd-core/templates/research-project/SUMMARY.md +170 -0
  344. package/gsd-core/templates/research.md +592 -0
  345. package/gsd-core/templates/retrospective.md +54 -0
  346. package/gsd-core/templates/roadmap.md +202 -0
  347. package/gsd-core/templates/spec.md +307 -0
  348. package/gsd-core/templates/state.md +195 -0
  349. package/gsd-core/templates/summary-complex.md +59 -0
  350. package/gsd-core/templates/summary-minimal.md +41 -0
  351. package/gsd-core/templates/summary-standard.md +48 -0
  352. package/gsd-core/templates/summary.md +248 -0
  353. package/gsd-core/templates/test-strategy.md +50 -0
  354. package/gsd-core/templates/user-profile.md +146 -0
  355. package/gsd-core/templates/user-setup.md +311 -0
  356. package/gsd-core/templates/verification-report.md +322 -0
  357. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
  358. package/gsd-core/workflows/add-backlog.md +91 -0
  359. package/gsd-core/workflows/add-phase.md +113 -0
  360. package/gsd-core/workflows/add-tests.md +355 -0
  361. package/gsd-core/workflows/add-todo.md +161 -0
  362. package/gsd-core/workflows/ai-integration-phase.md +295 -0
  363. package/gsd-core/workflows/analyze-dependencies.md +96 -0
  364. package/gsd-core/workflows/audit-fix.md +178 -0
  365. package/gsd-core/workflows/audit-milestone.md +360 -0
  366. package/gsd-core/workflows/audit-uat.md +110 -0
  367. package/gsd-core/workflows/autonomous.md +797 -0
  368. package/gsd-core/workflows/check-todos.md +180 -0
  369. package/gsd-core/workflows/cleanup.md +195 -0
  370. package/gsd-core/workflows/code-review-fix.md +502 -0
  371. package/gsd-core/workflows/code-review.md +658 -0
  372. package/gsd-core/workflows/complete-milestone.md +855 -0
  373. package/gsd-core/workflows/debug.md +237 -0
  374. package/gsd-core/workflows/diagnose-issues.md +245 -0
  375. package/gsd-core/workflows/discover-product.md +112 -0
  376. package/gsd-core/workflows/discovery-phase.md +291 -0
  377. package/gsd-core/workflows/discuss-phase/modes/advisor.md +176 -0
  378. package/gsd-core/workflows/discuss-phase/modes/all.md +28 -0
  379. package/gsd-core/workflows/discuss-phase/modes/analyze.md +44 -0
  380. package/gsd-core/workflows/discuss-phase/modes/auto.md +57 -0
  381. package/gsd-core/workflows/discuss-phase/modes/batch.md +52 -0
  382. package/gsd-core/workflows/discuss-phase/modes/chain.md +98 -0
  383. package/gsd-core/workflows/discuss-phase/modes/default.md +141 -0
  384. package/gsd-core/workflows/discuss-phase/modes/power.md +44 -0
  385. package/gsd-core/workflows/discuss-phase/modes/text.md +55 -0
  386. package/gsd-core/workflows/discuss-phase/templates/checkpoint.json +18 -0
  387. package/gsd-core/workflows/discuss-phase/templates/context.md +136 -0
  388. package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +50 -0
  389. package/gsd-core/workflows/discuss-phase-assumptions.md +675 -0
  390. package/gsd-core/workflows/discuss-phase-power.md +291 -0
  391. package/gsd-core/workflows/discuss-phase.md +499 -0
  392. package/gsd-core/workflows/do.md +111 -0
  393. package/gsd-core/workflows/docs-update.md +1176 -0
  394. package/gsd-core/workflows/edit-phase.md +295 -0
  395. package/gsd-core/workflows/eval-review.md +156 -0
  396. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +95 -0
  397. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  398. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +117 -0
  399. package/gsd-core/workflows/execute-phase.md +1752 -0
  400. package/gsd-core/workflows/execute-plan.md +526 -0
  401. package/gsd-core/workflows/explore.md +146 -0
  402. package/gsd-core/workflows/extract-learnings.md +243 -0
  403. package/gsd-core/workflows/fast.md +124 -0
  404. package/gsd-core/workflows/forensics.md +279 -0
  405. package/gsd-core/workflows/graduation.md +196 -0
  406. package/gsd-core/workflows/health.md +224 -0
  407. package/gsd-core/workflows/help/modes/brief.md +22 -0
  408. package/gsd-core/workflows/help/modes/default.md +50 -0
  409. package/gsd-core/workflows/help/modes/full.md +789 -0
  410. package/gsd-core/workflows/help/modes/topic.md +74 -0
  411. package/gsd-core/workflows/help.md +24 -0
  412. package/gsd-core/workflows/import.md +256 -0
  413. package/gsd-core/workflows/inbox.md +387 -0
  414. package/gsd-core/workflows/ingest-docs.md +340 -0
  415. package/gsd-core/workflows/insert-phase.md +152 -0
  416. package/gsd-core/workflows/list-phase-assumptions.md +178 -0
  417. package/gsd-core/workflows/list-workspaces.md +57 -0
  418. package/gsd-core/workflows/manager.md +393 -0
  419. package/gsd-core/workflows/map-codebase.md +446 -0
  420. package/gsd-core/workflows/milestone-summary.md +224 -0
  421. package/gsd-core/workflows/model-domain.md +162 -0
  422. package/gsd-core/workflows/mvp-phase.md +222 -0
  423. package/gsd-core/workflows/new-milestone.md +635 -0
  424. package/gsd-core/workflows/new-project.md +1555 -0
  425. package/gsd-core/workflows/new-workspace.md +240 -0
  426. package/gsd-core/workflows/next.md +299 -0
  427. package/gsd-core/workflows/node-repair.md +92 -0
  428. package/gsd-core/workflows/note.md +158 -0
  429. package/gsd-core/workflows/pause-work.md +244 -0
  430. package/gsd-core/workflows/plan-milestone-gaps.md +281 -0
  431. package/gsd-core/workflows/plan-phase.md +1814 -0
  432. package/gsd-core/workflows/plan-review-convergence.md +346 -0
  433. package/gsd-core/workflows/plant-seed.md +230 -0
  434. package/gsd-core/workflows/pr-branch.md +157 -0
  435. package/gsd-core/workflows/profile-user.md +453 -0
  436. package/gsd-core/workflows/progress.md +699 -0
  437. package/gsd-core/workflows/quick.md +1017 -0
  438. package/gsd-core/workflows/reapply-patches.md +426 -0
  439. package/gsd-core/workflows/recommend-architecture.md +135 -0
  440. package/gsd-core/workflows/remove-phase.md +156 -0
  441. package/gsd-core/workflows/remove-workspace.md +108 -0
  442. package/gsd-core/workflows/resume-project.md +332 -0
  443. package/gsd-core/workflows/review.md +748 -0
  444. package/gsd-core/workflows/scan.md +107 -0
  445. package/gsd-core/workflows/secure-phase.md +182 -0
  446. package/gsd-core/workflows/session-report.md +146 -0
  447. package/gsd-core/workflows/settings-advanced.md +810 -0
  448. package/gsd-core/workflows/settings-integrations.md +312 -0
  449. package/gsd-core/workflows/settings.md +566 -0
  450. package/gsd-core/workflows/ship.md +405 -0
  451. package/gsd-core/workflows/sketch-wrap-up.md +286 -0
  452. package/gsd-core/workflows/sketch.md +361 -0
  453. package/gsd-core/workflows/spec-phase.md +263 -0
  454. package/gsd-core/workflows/spike-wrap-up.md +307 -0
  455. package/gsd-core/workflows/spike.md +453 -0
  456. package/gsd-core/workflows/stats.md +80 -0
  457. package/gsd-core/workflows/sync-skills.md +182 -0
  458. package/gsd-core/workflows/testing-strategy.md +122 -0
  459. package/gsd-core/workflows/thread.md +222 -0
  460. package/gsd-core/workflows/transition.md +694 -0
  461. package/gsd-core/workflows/ui-phase.md +328 -0
  462. package/gsd-core/workflows/ui-review.md +193 -0
  463. package/gsd-core/workflows/ultraplan-phase.md +199 -0
  464. package/gsd-core/workflows/undo.md +314 -0
  465. package/gsd-core/workflows/update.md +496 -0
  466. package/gsd-core/workflows/validate-phase.md +181 -0
  467. package/gsd-core/workflows/verify-phase.md +544 -0
  468. package/gsd-core/workflows/verify-work.md +781 -0
  469. package/hooks/dist/gsd-check-update-worker.js +108 -0
  470. package/hooks/dist/gsd-check-update.js +66 -0
  471. package/hooks/dist/gsd-config-reload.js +133 -0
  472. package/hooks/dist/gsd-context-monitor.js +195 -0
  473. package/hooks/dist/gsd-cursor-post-tool.js +75 -0
  474. package/hooks/dist/gsd-cursor-session-start.js +52 -0
  475. package/hooks/dist/gsd-graphify-update.sh +158 -0
  476. package/hooks/dist/gsd-phase-boundary.sh +47 -0
  477. package/hooks/dist/gsd-prompt-guard.js +97 -0
  478. package/hooks/dist/gsd-read-guard.js +101 -0
  479. package/hooks/dist/gsd-read-injection-scanner.js +203 -0
  480. package/hooks/dist/gsd-session-state.sh +59 -0
  481. package/hooks/dist/gsd-statusline.js +566 -0
  482. package/hooks/dist/gsd-update-banner.js +138 -0
  483. package/hooks/dist/gsd-validate-commit.sh +57 -0
  484. package/hooks/dist/gsd-workflow-guard.js +167 -0
  485. package/hooks/dist/gsd-worktree-path-guard.js +169 -0
  486. package/hooks/dist/lib/git-cmd.js +150 -0
  487. package/hooks/dist/lib/gsd-graphify-rebuild.sh +65 -0
  488. package/hooks/dist/managed-hooks-registry.cjs +38 -0
  489. package/hooks/gsd-check-update-worker.js +108 -0
  490. package/hooks/gsd-check-update.js +66 -0
  491. package/hooks/gsd-config-reload.js +133 -0
  492. package/hooks/gsd-context-monitor.js +195 -0
  493. package/hooks/gsd-cursor-post-tool.js +75 -0
  494. package/hooks/gsd-cursor-session-start.js +52 -0
  495. package/hooks/gsd-graphify-update.sh +158 -0
  496. package/hooks/gsd-phase-boundary.sh +47 -0
  497. package/hooks/gsd-prompt-guard.js +97 -0
  498. package/hooks/gsd-read-guard.js +101 -0
  499. package/hooks/gsd-read-injection-scanner.js +203 -0
  500. package/hooks/gsd-session-state.sh +59 -0
  501. package/hooks/gsd-statusline.js +566 -0
  502. package/hooks/gsd-update-banner.js +138 -0
  503. package/hooks/gsd-validate-commit.sh +57 -0
  504. package/hooks/gsd-workflow-guard.js +167 -0
  505. package/hooks/gsd-worktree-path-guard.js +169 -0
  506. package/hooks/hooks.json +69 -0
  507. package/hooks/lib/git-cmd.js +150 -0
  508. package/hooks/lib/gsd-graphify-rebuild.sh +65 -0
  509. package/hooks/managed-hooks-registry.cjs +38 -0
  510. package/package.json +115 -0
  511. package/scripts/affected-tests-lib.cjs +542 -0
  512. package/scripts/audit-workflow-script-paths.cjs +73 -0
  513. package/scripts/base64-scan.sh +351 -0
  514. package/scripts/build-hooks.js +247 -0
  515. package/scripts/changeset/README.md +129 -0
  516. package/scripts/changeset/cli.cjs +590 -0
  517. package/scripts/changeset/github-release-notes.cjs +199 -0
  518. package/scripts/changeset/lint.cjs +111 -0
  519. package/scripts/changeset/new.cjs +137 -0
  520. package/scripts/changeset/parse.cjs +114 -0
  521. package/scripts/changeset/render.cjs +34 -0
  522. package/scripts/changeset/serialize.cjs +130 -0
  523. package/scripts/check-alias-drift.cjs +114 -0
  524. package/scripts/check-env.cjs +312 -0
  525. package/scripts/check-npm-integrity.cjs +215 -0
  526. package/scripts/ci-guard-runner.cjs +22 -0
  527. package/scripts/ci-prepare-test-scope.cjs +51 -0
  528. package/scripts/ci-rebase-check.cjs +86 -0
  529. package/scripts/ci-test-scope.cjs +431 -0
  530. package/scripts/command-contract-helpers.cjs +64 -0
  531. package/scripts/diff-touches-shipped-paths.cjs +155 -0
  532. package/scripts/fix-slash-commands.cjs +147 -0
  533. package/scripts/gen-inventory-manifest.cjs +115 -0
  534. package/scripts/gen-research-agents.cjs +276 -0
  535. package/scripts/generate-package-identity.cjs +125 -0
  536. package/scripts/issue-dedupe.cjs +278 -0
  537. package/scripts/lib/allowlist-ratchet.cjs +136 -0
  538. package/scripts/lib/cli-exit.cjs +56 -0
  539. package/scripts/lint-command-contract.cjs +114 -0
  540. package/scripts/lint-descriptions.cjs +87 -0
  541. package/scripts/lint-docs-required.cjs +222 -0
  542. package/scripts/lint-legacy-dir-name.cjs +160 -0
  543. package/scripts/lint-package-identity-drift.cjs +141 -0
  544. package/scripts/lint-pr-check-project-dir.cjs +99 -0
  545. package/scripts/lint-shell-command-projection-drift.cjs +62 -0
  546. package/scripts/lint-skill-deps.cjs +185 -0
  547. package/scripts/lint-test-file-count.allowlist.json +135 -0
  548. package/scripts/lint-test-file-count.cjs +246 -0
  549. package/scripts/mutation-matrix.cjs +222 -0
  550. package/scripts/pr-template-policy.cjs +268 -0
  551. package/scripts/prompt-injection-scan.sh +207 -0
  552. package/scripts/release-notes/discord-release-summary.cjs +373 -0
  553. package/scripts/release-notes/format-github-release-notes.cjs +261 -0
  554. package/scripts/release-tarball-smoke.cjs +629 -0
  555. package/scripts/research-profiles.cjs +149 -0
  556. package/scripts/run-affected-tests.cjs +7 -0
  557. package/scripts/run-cross-platform-tests.cjs +67 -0
  558. package/scripts/run-tests.cjs +315 -0
  559. package/scripts/secret-scan-lint.sh +231 -0
  560. package/scripts/secret-scan.sh +358 -0
  561. package/scripts/setup-branch-protection.sh +236 -0
  562. package/scripts/strip-prose-atrefs.cjs +106 -0
  563. package/scripts/sync-manifest-versions.cjs +119 -0
  564. package/scripts/sync-rulesets.sh +34 -0
  565. package/scripts/sync-runtime-launcher.cjs +399 -0
  566. package/scripts/test-failure-reasons.cjs +34 -0
  567. package/scripts/verify-npm-publish.cjs +240 -0
  568. package/scripts/workflow-policy.cjs +450 -0
@@ -0,0 +1,373 @@
1
+ "use strict";
2
+ /**
3
+ * Milestone — Milestone and requirements lifecycle operations.
4
+ *
5
+ * ADR-457 build-at-publish: the hand-written bin/lib/milestone.cjs collapsed to
6
+ * a TypeScript source of truth, compiled by tsc to a gitignored .cjs at the same
7
+ * require() path. Behaviour preserved byte-for-behaviour; only types are added.
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ const node_fs_1 = __importDefault(require("node:fs"));
13
+ const node_path_1 = __importDefault(require("node:path"));
14
+ // eslint-disable-next-line @typescript-eslint/no-require-imports -- core.cjs is an export= CommonJS module
15
+ const core = require("./core.cjs");
16
+ // eslint-disable-next-line @typescript-eslint/no-require-imports -- planning-workspace.cjs is an export= CommonJS module
17
+ const planningWorkspace = require("./planning-workspace.cjs");
18
+ // eslint-disable-next-line @typescript-eslint/no-require-imports -- frontmatter.cjs is an export= CommonJS module
19
+ const frontmatterMod = require("./frontmatter.cjs");
20
+ // eslint-disable-next-line @typescript-eslint/no-require-imports -- state.cjs is an export= CommonJS module
21
+ const stateMod = require("./state.cjs");
22
+ const shell_command_projection_cjs_1 = require("./shell-command-projection.cjs");
23
+ const runtime_slash_cjs_1 = require("./runtime-slash.cjs");
24
+ const { escapeRegex, getMilestonePhaseFilter, extractOneLinerFromBody, normalizePhaseName, phaseTokenMatches, output, error, } = core;
25
+ const { planningPaths } = planningWorkspace;
26
+ const { extractFrontmatter } = frontmatterMod;
27
+ const { writeStateMd, stateReplaceFieldWithFallback } = stateMod;
28
+ function cmdRequirementsMarkComplete(cwd, reqIdsRaw, raw) {
29
+ if (!reqIdsRaw || reqIdsRaw.length === 0) {
30
+ error('requirement IDs required. Usage: requirements mark-complete REQ-01,REQ-02 or REQ-01 REQ-02');
31
+ }
32
+ // Accept comma-separated, space-separated, or bracket-wrapped: [REQ-01, REQ-02]
33
+ const reqIds = reqIdsRaw
34
+ .join(' ')
35
+ .replace(/[\[\]]/g, '')
36
+ .split(/[,\s]+/)
37
+ .map((r) => r.trim())
38
+ .filter(Boolean);
39
+ if (reqIds.length === 0) {
40
+ error('no valid requirement IDs found');
41
+ }
42
+ const reqPath = planningPaths(cwd).requirements;
43
+ if (!node_fs_1.default.existsSync(reqPath)) {
44
+ output({ updated: false, reason: 'REQUIREMENTS.md not found', ids: reqIds }, raw, 'no requirements file');
45
+ return;
46
+ }
47
+ let reqContent = node_fs_1.default.readFileSync(reqPath, 'utf-8');
48
+ const updated = [];
49
+ const alreadyComplete = [];
50
+ const notFound = [];
51
+ for (const reqId of reqIds) {
52
+ let found = false;
53
+ const reqEscaped = escapeRegex(reqId);
54
+ // Update checkbox: - [ ] **REQ-ID** → - [x] **REQ-ID**
55
+ // Use replace() directly and compare — avoids test()+replace() global regex
56
+ // lastIndex bug where test() advances state and replace() misses matches.
57
+ const checkboxPattern = new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${reqEscaped}\\*\\*)`, 'gi');
58
+ const afterCheckbox = reqContent.replace(checkboxPattern, '$1x$2');
59
+ if (afterCheckbox !== reqContent) {
60
+ reqContent = afterCheckbox;
61
+ found = true;
62
+ }
63
+ // Update traceability table: | REQ-ID | Phase N | Pending | → | REQ-ID | Phase N | Complete |
64
+ const tablePattern = new RegExp(`(\\|\\s*${reqEscaped}\\s*\\|[^|]+\\|)\\s*Pending\\s*(\\|)`, 'gi');
65
+ const afterTable = reqContent.replace(tablePattern, '$1 Complete $2');
66
+ if (afterTable !== reqContent) {
67
+ reqContent = afterTable;
68
+ found = true;
69
+ }
70
+ if (found) {
71
+ updated.push(reqId);
72
+ }
73
+ else {
74
+ // Check if already complete before declaring not_found.
75
+ // Non-global flag is fine here — we only need to know if a match exists.
76
+ const doneCheckbox = new RegExp(`-\\s*\\[x\\]\\s*\\*\\*${reqEscaped}\\*\\*`, 'i');
77
+ const doneTable = new RegExp(`\\|\\s*${reqEscaped}\\s*\\|[^|]+\\|\\s*Complete\\s*\\|`, 'i');
78
+ if (doneCheckbox.test(reqContent) || doneTable.test(reqContent)) {
79
+ alreadyComplete.push(reqId);
80
+ }
81
+ else {
82
+ notFound.push(reqId);
83
+ }
84
+ }
85
+ }
86
+ if (updated.length > 0) {
87
+ (0, shell_command_projection_cjs_1.platformWriteSync)(reqPath, reqContent);
88
+ }
89
+ output({
90
+ updated: updated.length > 0,
91
+ marked_complete: updated,
92
+ already_complete: alreadyComplete,
93
+ not_found: notFound,
94
+ total: reqIds.length,
95
+ }, raw, `${updated.length}/${reqIds.length} requirements marked complete`);
96
+ }
97
+ function cmdMilestoneComplete(cwd, version, options, raw) {
98
+ if (!version) {
99
+ error('version required for milestone complete (e.g., v1.0)');
100
+ }
101
+ const roadmapPath = planningPaths(cwd).roadmap;
102
+ const reqPath = planningPaths(cwd).requirements;
103
+ const statePath = planningPaths(cwd).state;
104
+ const milestonesPath = node_path_1.default.join(cwd, '.planning', 'MILESTONES.md');
105
+ const archiveDir = node_path_1.default.join(cwd, '.planning', 'milestones');
106
+ const phasesDir = planningPaths(cwd).phases;
107
+ const today = new Date().toISOString().split('T')[0];
108
+ const milestoneName = options.name || version;
109
+ // Ensure archive directory exists
110
+ (0, shell_command_projection_cjs_1.platformEnsureDir)(archiveDir);
111
+ // Scope stats and accomplishments to only the phases belonging to the
112
+ // current milestone's ROADMAP. Uses the shared filter from core.cjs
113
+ // (same logic used by cmdPhasesList and other callers).
114
+ const isDirInMilestone = getMilestonePhaseFilter(cwd, version);
115
+ if (isDirInMilestone.missingExplicitVersion) {
116
+ error(`no phases found for milestone ${version} in ROADMAP.md`);
117
+ }
118
+ // Guard: prevent marking complete when ROADMAP still lists phases that have
119
+ // no directory on disk (disk_status: no_directory). This catches the case
120
+ // where the active milestone was erroneously marked complete before phases
121
+ // were even started. Only fires when STATE.md confirms the current milestone
122
+ // version matches what is being completed — no false positives on fresh
123
+ // projects where phases haven't been scaffolded yet.
124
+ // Pass --force to override this guard.
125
+ if (!options.force) {
126
+ try {
127
+ // Only guard when STATE.md's milestone field matches the version being completed.
128
+ let stateVersion = null;
129
+ try {
130
+ const stateRaw = node_fs_1.default.existsSync(statePath) ? node_fs_1.default.readFileSync(statePath, 'utf-8') : null;
131
+ if (stateRaw) {
132
+ const milestoneMatch = stateRaw.match(/^milestone:\s*(.+)/m);
133
+ if (milestoneMatch)
134
+ stateVersion = milestoneMatch[1].trim();
135
+ }
136
+ }
137
+ catch {
138
+ /* skip */
139
+ }
140
+ if (stateVersion && stateVersion === version) {
141
+ const { extractCurrentMilestone } = core;
142
+ const roadmapContent = node_fs_1.default.readFileSync(roadmapPath, 'utf-8');
143
+ const scopedContent = extractCurrentMilestone(roadmapContent, cwd);
144
+ const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi;
145
+ const noDirectoryPhases = [];
146
+ let pm;
147
+ const phaseDirEntries = (() => {
148
+ try {
149
+ return node_fs_1.default
150
+ .readdirSync(phasesDir, { withFileTypes: true })
151
+ .filter((e) => e.isDirectory())
152
+ .map((e) => e.name);
153
+ }
154
+ catch {
155
+ return [];
156
+ }
157
+ })();
158
+ while ((pm = phasePattern.exec(scopedContent)) !== null) {
159
+ const phaseNum = pm[1];
160
+ const normalized = normalizePhaseName(phaseNum);
161
+ // A phase has disk_status: 'no_directory' when no phase directory
162
+ // with a matching token exists on disk. Use the same phaseTokenMatches
163
+ // helper that roadmap.analyze uses to avoid false positives on decimal
164
+ // (2.1) and letter-suffix (12A) phase IDs.
165
+ const hasDirectory = phaseDirEntries.some((d) => phaseTokenMatches(d, normalized));
166
+ if (!hasDirectory) {
167
+ noDirectoryPhases.push(phaseNum);
168
+ }
169
+ }
170
+ if (noDirectoryPhases.length > 0) {
171
+ error(`Cannot mark milestone complete: ROADMAP lists ${noDirectoryPhases.length} unstarted phase(s) ` +
172
+ `(e.g. Phase ${noDirectoryPhases[0]}). Re-run with --force to override.`);
173
+ }
174
+ }
175
+ }
176
+ catch (e) {
177
+ // If the error came from our guard, re-throw it; otherwise skip silently.
178
+ const message = e instanceof Error ? e.message : String(e);
179
+ if (message && message.startsWith('Cannot mark milestone complete:'))
180
+ throw e;
181
+ // Phase scan failed or STATE version mismatch — allow completion to proceed.
182
+ }
183
+ }
184
+ // Gather stats from phases (scoped to current milestone only)
185
+ let phaseCount = 0;
186
+ let totalPlans = 0;
187
+ let totalTasks = 0;
188
+ const accomplishments = [];
189
+ try {
190
+ const entries = node_fs_1.default.readdirSync(phasesDir, { withFileTypes: true });
191
+ const dirs = entries
192
+ .filter((e) => e.isDirectory())
193
+ .map((e) => e.name)
194
+ .sort();
195
+ for (const dir of dirs) {
196
+ if (!isDirInMilestone(dir))
197
+ continue;
198
+ phaseCount++;
199
+ const phaseFiles = node_fs_1.default.readdirSync(node_path_1.default.join(phasesDir, dir));
200
+ const plans = phaseFiles.filter((f) => f.endsWith('-PLAN.md') || f === 'PLAN.md');
201
+ const summaries = phaseFiles.filter((f) => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
202
+ totalPlans += plans.length;
203
+ // Extract one-liners from summaries
204
+ for (const s of summaries) {
205
+ try {
206
+ const content = node_fs_1.default.readFileSync(node_path_1.default.join(phasesDir, dir, s), 'utf-8');
207
+ const fm = extractFrontmatter(content);
208
+ const rawOneLiner = fm['one-liner'];
209
+ const oneLiner = (typeof rawOneLiner === 'string' ? rawOneLiner : '') || extractOneLinerFromBody(content);
210
+ if (oneLiner) {
211
+ accomplishments.push(oneLiner);
212
+ }
213
+ // Count tasks: prefer **Tasks:** N from Performance section,
214
+ // then <task XML tags, then ## Task N markdown headers
215
+ const tasksFieldMatch = content.match(/\*\*Tasks:\*\*\s*(\d+)/);
216
+ if (tasksFieldMatch) {
217
+ totalTasks += parseInt(tasksFieldMatch[1], 10);
218
+ }
219
+ else {
220
+ const xmlTaskMatches = content.match(/<task[\s>]/gi) || [];
221
+ const mdTaskMatches = content.match(/##\s*Task\s*\d+/gi) || [];
222
+ totalTasks += xmlTaskMatches.length || mdTaskMatches.length;
223
+ }
224
+ }
225
+ catch {
226
+ /* intentionally empty */
227
+ }
228
+ }
229
+ }
230
+ }
231
+ catch {
232
+ /* intentionally empty */
233
+ }
234
+ // Archive ROADMAP.md
235
+ if (node_fs_1.default.existsSync(roadmapPath)) {
236
+ const roadmapContent = node_fs_1.default.readFileSync(roadmapPath, 'utf-8');
237
+ (0, shell_command_projection_cjs_1.platformWriteSync)(node_path_1.default.join(archiveDir, `${version}-ROADMAP.md`), roadmapContent);
238
+ }
239
+ // Archive REQUIREMENTS.md
240
+ if (node_fs_1.default.existsSync(reqPath)) {
241
+ const reqContent = node_fs_1.default.readFileSync(reqPath, 'utf-8');
242
+ const archiveHeader = `# Requirements Archive: ${version} ${milestoneName}\n\n**Archived:** ${today}\n**Status:** SHIPPED\n\nFor current requirements, see \`.planning/REQUIREMENTS.md\`.\n\n---\n\n`;
243
+ (0, shell_command_projection_cjs_1.platformWriteSync)(node_path_1.default.join(archiveDir, `${version}-REQUIREMENTS.md`), archiveHeader + reqContent);
244
+ }
245
+ // Archive audit file if exists
246
+ const auditFile = node_path_1.default.join(cwd, '.planning', `${version}-MILESTONE-AUDIT.md`);
247
+ if (node_fs_1.default.existsSync(auditFile)) {
248
+ node_fs_1.default.renameSync(auditFile, node_path_1.default.join(archiveDir, `${version}-MILESTONE-AUDIT.md`));
249
+ }
250
+ // Create/append MILESTONES.md entry
251
+ const accomplishmentsList = accomplishments.map((a) => `- ${a}`).join('\n');
252
+ const milestoneEntry = `## ${version} ${milestoneName} (Shipped: ${today})\n\n**Phases completed:** ${phaseCount} phases, ${totalPlans} plans, ${totalTasks} tasks\n\n**Key accomplishments:**\n${accomplishmentsList || '- (none recorded)'}\n\n---\n\n`;
253
+ if (node_fs_1.default.existsSync(milestonesPath)) {
254
+ const existing = node_fs_1.default.readFileSync(milestonesPath, 'utf-8');
255
+ if (!existing.trim()) {
256
+ // Empty file — treat like new
257
+ (0, shell_command_projection_cjs_1.platformWriteSync)(milestonesPath, `# Milestones\n\n${milestoneEntry}`);
258
+ }
259
+ else {
260
+ // Insert after the header line(s) for reverse chronological order (newest first)
261
+ const headerMatch = existing.match(/^(#{1,3}\s+[^\n]*\n\n?)/);
262
+ if (headerMatch) {
263
+ const header = headerMatch[1];
264
+ const rest = existing.slice(header.length);
265
+ (0, shell_command_projection_cjs_1.platformWriteSync)(milestonesPath, header + milestoneEntry + rest);
266
+ }
267
+ else {
268
+ // No recognizable header — prepend the entry
269
+ (0, shell_command_projection_cjs_1.platformWriteSync)(milestonesPath, milestoneEntry + existing);
270
+ }
271
+ }
272
+ }
273
+ else {
274
+ (0, shell_command_projection_cjs_1.platformWriteSync)(milestonesPath, `# Milestones\n\n${milestoneEntry}`);
275
+ }
276
+ // Update STATE.md — keep frontmatter/body semantically aligned after closure
277
+ if (node_fs_1.default.existsSync(statePath)) {
278
+ let stateContent = node_fs_1.default.readFileSync(statePath, 'utf-8');
279
+ stateContent = stateReplaceFieldWithFallback(stateContent, 'Status', null, `${version} milestone complete`);
280
+ stateContent = stateReplaceFieldWithFallback(stateContent, 'Last Activity', 'Last activity', today);
281
+ stateContent = stateReplaceFieldWithFallback(stateContent, 'Last Activity Description', null, `${version} milestone completed and archived`);
282
+ // Reset Current Position narrative so resume/progress flows do not keep
283
+ // pointing at closed-phase execution instructions.
284
+ const positionPattern = /(##\s*Current Position\s*\n)([\s\S]*?)(?=\n##|$)/i;
285
+ const closedPositionBody = `\nPhase: Milestone ${version} complete\n` +
286
+ `Plan: —\n` +
287
+ `Status: Awaiting next milestone\n` +
288
+ `Last activity: ${today} — Milestone ${version} completed and archived\n\n`;
289
+ if (positionPattern.test(stateContent)) {
290
+ stateContent = stateContent.replace(positionPattern, (_m, header) => `${header}${closedPositionBody}`);
291
+ }
292
+ else {
293
+ stateContent = `${stateContent.trimEnd()}\n\n## Current Position\n${closedPositionBody}`;
294
+ }
295
+ // Normalize operator-next-step tails that can become stale after close.
296
+ const operatorPattern = /(##\s*Operator Next Steps\s*\n)([\s\S]*?)(?=\n##|$)/i;
297
+ if (operatorPattern.test(stateContent)) {
298
+ stateContent = stateContent.replace(operatorPattern, `$1\n- Start the next milestone with ${(0, runtime_slash_cjs_1.formatGsdSlash)('new-milestone', (0, runtime_slash_cjs_1.resolveRuntime)(cwd))}\n\n`);
299
+ }
300
+ else {
301
+ stateContent = `${stateContent.trimEnd()}\n\n## Operator Next Steps\n\n- Start the next milestone with ${(0, runtime_slash_cjs_1.formatGsdSlash)('new-milestone', (0, runtime_slash_cjs_1.resolveRuntime)(cwd))}\n`;
302
+ }
303
+ writeStateMd(statePath, stateContent, cwd);
304
+ }
305
+ // Archive phase directories if requested
306
+ let phasesArchived = false;
307
+ if (options.archivePhases) {
308
+ try {
309
+ const phaseArchiveDir = node_path_1.default.join(archiveDir, `${version}-phases`);
310
+ (0, shell_command_projection_cjs_1.platformEnsureDir)(phaseArchiveDir);
311
+ const phaseEntries = node_fs_1.default.readdirSync(phasesDir, { withFileTypes: true });
312
+ const phaseDirNames = phaseEntries.filter((e) => e.isDirectory()).map((e) => e.name);
313
+ let archivedCount = 0;
314
+ for (const dir of phaseDirNames) {
315
+ if (!isDirInMilestone(dir))
316
+ continue;
317
+ node_fs_1.default.renameSync(node_path_1.default.join(phasesDir, dir), node_path_1.default.join(phaseArchiveDir, dir));
318
+ archivedCount++;
319
+ }
320
+ phasesArchived = archivedCount > 0;
321
+ }
322
+ catch {
323
+ /* intentionally empty */
324
+ }
325
+ }
326
+ const result = {
327
+ version,
328
+ name: milestoneName,
329
+ date: today,
330
+ phases: phaseCount,
331
+ plans: totalPlans,
332
+ tasks: totalTasks,
333
+ accomplishments,
334
+ archived: {
335
+ roadmap: node_fs_1.default.existsSync(node_path_1.default.join(archiveDir, `${version}-ROADMAP.md`)),
336
+ requirements: node_fs_1.default.existsSync(node_path_1.default.join(archiveDir, `${version}-REQUIREMENTS.md`)),
337
+ audit: node_fs_1.default.existsSync(node_path_1.default.join(archiveDir, `${version}-MILESTONE-AUDIT.md`)),
338
+ phases: phasesArchived,
339
+ },
340
+ milestones_updated: true,
341
+ state_updated: node_fs_1.default.existsSync(statePath),
342
+ };
343
+ output(result, raw);
344
+ }
345
+ function cmdPhasesClear(cwd, raw, args) {
346
+ const phasesDir = planningPaths(cwd).phases;
347
+ const confirm = Array.isArray(args) && args.includes('--confirm');
348
+ let cleared = 0;
349
+ if (node_fs_1.default.existsSync(phasesDir)) {
350
+ const entries = node_fs_1.default.readdirSync(phasesDir, { withFileTypes: true });
351
+ const dirs = entries.filter((e) => e.isDirectory() && !/^999(?:\.|$)/.test(e.name));
352
+ if (dirs.length > 0 && !confirm) {
353
+ error(`phases clear would delete ${dirs.length} phase director${dirs.length === 1 ? 'y' : 'ies'}. ` +
354
+ `Pass --confirm to proceed.`);
355
+ }
356
+ try {
357
+ for (const entry of dirs) {
358
+ node_fs_1.default.rmSync(node_path_1.default.join(phasesDir, entry.name), { recursive: true, force: true });
359
+ cleared++;
360
+ }
361
+ }
362
+ catch (e) {
363
+ const message = e instanceof Error ? e.message : String(e);
364
+ error('Failed to clear phases directory: ' + message);
365
+ }
366
+ }
367
+ output({ cleared }, raw, `${cleared} phase director${cleared === 1 ? 'y' : 'ies'} cleared`);
368
+ }
369
+ module.exports = {
370
+ cmdRequirementsMarkComplete,
371
+ cmdMilestoneComplete,
372
+ cmdPhasesClear,
373
+ };
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ /**
3
+ * Model catalog — typed access to model-catalog.json.
4
+ *
5
+ * ADR-457 build-at-publish: the hand-written bin/lib/model-catalog.cjs
6
+ * collapsed to a TypeScript source of truth. Behaviour is preserved
7
+ * byte-for-behaviour from the prior hand-written .cjs; only types are added.
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.RUNTIMES_WITH_FAST_MODE = exports.EFFORT_RENDERING = exports.KNOWN_PROVIDERS = exports.PROVIDER_PRESETS = exports.RUNTIMES_WITH_REASONING_EFFORT = exports.KNOWN_RUNTIMES = exports.RUNTIME_PROFILE_MAP = exports.MODEL_ALIAS_MAP = exports.AGENT_DEFAULT_TIERS = exports.AGENT_TO_PHASE_TYPE = exports.MODEL_PROFILES = exports.VALID_AGENT_TIERS = exports.VALID_PHASE_TYPES = exports.VALID_PROFILES = exports.catalog = void 0;
14
+ exports.nextTier = nextTier;
15
+ exports.formatAgentToModelMapAsTable = formatAgentToModelMapAsTable;
16
+ exports.getAgentToModelMapForProfile = getAgentToModelMapForProfile;
17
+ exports.renderEffortForRuntime = renderEffortForRuntime;
18
+ const node_path_1 = __importDefault(require("node:path"));
19
+ // In .cts (CommonJS output) files, `require` is available as a global;
20
+ // we use it directly to load JSON candidates.
21
+ const _require = require;
22
+ // Resolve model-catalog.json via a prioritised candidate list so the module
23
+ // works in every layout:
24
+ //
25
+ // 1. Co-located install path — gsd-core/bin/shared/model-catalog.json
26
+ // 2. Source-repo dev path — sdk/shared/model-catalog.json
27
+ // 3. GSD_MODEL_CATALOG env override
28
+ const _catalogCandidates = [
29
+ node_path_1.default.resolve(__dirname, '..', 'shared', 'model-catalog.json'),
30
+ node_path_1.default.resolve(__dirname, '..', '..', '..', 'sdk', 'shared', 'model-catalog.json'),
31
+ ...(process.env['GSD_MODEL_CATALOG'] ? [node_path_1.default.resolve(process.env['GSD_MODEL_CATALOG'])] : []),
32
+ ];
33
+ let catalog = null;
34
+ let _catalogLastErr = null;
35
+ for (const _p of _catalogCandidates) {
36
+ try {
37
+ catalog = _require(_p);
38
+ break;
39
+ }
40
+ catch (e) {
41
+ const isMissingCandidate = (e && e.code === 'MODULE_NOT_FOUND' && String(e.message || '').includes(_p)) ||
42
+ (e && e.code === 'ENOENT');
43
+ if (!isMissingCandidate)
44
+ throw e;
45
+ _catalogLastErr = e;
46
+ }
47
+ }
48
+ if (!catalog) {
49
+ throw new Error(`model-catalog.json not found. Tried:\n${_catalogCandidates.map((p) => ` ${p}`).join('\n')}\nLast error: ${_catalogLastErr?.message}`);
50
+ }
51
+ // After the throw guard above, catalog is guaranteed non-null.
52
+ const _catalog = catalog;
53
+ exports.catalog = _catalog;
54
+ exports.VALID_PROFILES = [..._catalog.profiles];
55
+ exports.VALID_PHASE_TYPES = new Set(_catalog.phaseTypes);
56
+ exports.VALID_AGENT_TIERS = new Set(Object.keys(_catalog.adaptiveTierMap));
57
+ exports.MODEL_PROFILES = Object.fromEntries(Object.entries(_catalog.agents).map(([agent, meta]) => [agent, {
58
+ quality: meta.golden,
59
+ balanced: meta.balanced,
60
+ budget: meta.budget,
61
+ adaptive: _catalog.adaptiveTierMap[meta.routingTier],
62
+ }]));
63
+ exports.AGENT_TO_PHASE_TYPE = Object.fromEntries(Object.entries(_catalog.agents).map(([agent, meta]) => [agent, meta.phaseType]));
64
+ exports.AGENT_DEFAULT_TIERS = Object.fromEntries(Object.entries(_catalog.agents).map(([agent, meta]) => [agent, meta.routingTier]));
65
+ exports.MODEL_ALIAS_MAP = Object.fromEntries(Object.entries(_catalog.runtimeTierDefaults['claude'] ?? {}).map(([tier, entry]) => [tier, entry?.model]));
66
+ exports.RUNTIME_PROFILE_MAP = (() => {
67
+ const result = {};
68
+ for (const [runtime, tiers] of Object.entries(_catalog.runtimeTierDefaults)) {
69
+ const filtered = {};
70
+ for (const [tier, entry] of Object.entries(tiers)) {
71
+ if (entry)
72
+ filtered[tier] = entry;
73
+ }
74
+ if (Object.keys(filtered).length > 0)
75
+ result[runtime] = filtered;
76
+ }
77
+ return result;
78
+ })();
79
+ exports.KNOWN_RUNTIMES = new Set(Object.keys(_catalog.runtimeTierDefaults));
80
+ exports.RUNTIMES_WITH_REASONING_EFFORT = new Set(Object.entries(_catalog.runtimeTierDefaults)
81
+ .filter(([, tiers]) => Object.values(tiers).some((entry) => entry && entry.reasoning_effort))
82
+ .map(([runtime]) => runtime));
83
+ exports.PROVIDER_PRESETS = _catalog.providerPresets ?? {};
84
+ // KNOWN_PROVIDERS excludes 'generic' — it is a sentinel (all null entries) that
85
+ // forces users to supply model IDs via model_profile_overrides. It is not a
86
+ // real catalog-backed provider (#49).
87
+ exports.KNOWN_PROVIDERS = new Set(Object.entries(exports.PROVIDER_PRESETS)
88
+ .filter(([, tiers]) => Object.values(tiers).some((budgets) => budgets && Object.values(budgets).some((entry) => entry && entry.model)))
89
+ .map(([name]) => name));
90
+ function nextTier(currentTier) {
91
+ const order = ['light', 'standard', 'heavy'];
92
+ const idx = order.indexOf(String(currentTier));
93
+ if (idx === -1)
94
+ return null;
95
+ return order[Math.min(idx + 1, order.length - 1)];
96
+ }
97
+ function formatAgentToModelMapAsTable(agentToModelMap) {
98
+ const agentWidth = Math.max('Agent'.length, ...Object.keys(agentToModelMap).map((a) => a.length));
99
+ const modelWidth = Math.max('Model'.length, ...Object.values(agentToModelMap).map((m) => m.length));
100
+ const sep = '─'.repeat(agentWidth + 2) + '┼' + '─'.repeat(modelWidth + 2);
101
+ const header = ` ${'Agent'.padEnd(agentWidth)} │ ${'Model'.padEnd(modelWidth)}`;
102
+ let out = `${header}\n${sep}\n`;
103
+ for (const [agent, model] of Object.entries(agentToModelMap)) {
104
+ out += ` ${agent.padEnd(agentWidth)} │ ${model.padEnd(modelWidth)}\n`;
105
+ }
106
+ return out;
107
+ }
108
+ function getAgentToModelMapForProfile(normalizedProfile) {
109
+ const profile = exports.VALID_PROFILES.includes(normalizedProfile) ? normalizedProfile : 'balanced';
110
+ const out = {};
111
+ for (const [agent, profiles] of Object.entries(exports.MODEL_PROFILES)) {
112
+ const profilesRec = profiles;
113
+ out[agent] = profile === 'inherit' ? 'inherit' : (profilesRec[profile] ?? profiles.balanced);
114
+ }
115
+ return out;
116
+ }
117
+ exports.EFFORT_RENDERING = {
118
+ claude: {
119
+ param: 'output_config.effort',
120
+ channel: 'frontmatter',
121
+ supported: new Set(['low', 'medium', 'high', 'xhigh', 'max']),
122
+ clamp(level) {
123
+ if (level === 'minimal')
124
+ return 'low';
125
+ return level;
126
+ },
127
+ },
128
+ codex: {
129
+ param: 'model_reasoning_effort',
130
+ channel: 'api',
131
+ supported: new Set(['minimal', 'low', 'medium', 'high', 'xhigh']),
132
+ clamp(level) {
133
+ if (level === 'max')
134
+ return 'xhigh';
135
+ return level;
136
+ },
137
+ },
138
+ };
139
+ /**
140
+ * Render a universal effort string for a specific runtime.
141
+ */
142
+ function renderEffortForRuntime(runtime, universalEffort) {
143
+ const spec = exports.EFFORT_RENDERING[runtime];
144
+ if (!spec) {
145
+ return { value: universalEffort, param: null, channel: null };
146
+ }
147
+ return {
148
+ value: spec.clamp(universalEffort),
149
+ param: spec.param,
150
+ channel: spec.channel,
151
+ };
152
+ }
153
+ // ─── Fast mode propagation ───────────────────────────────────────────────────
154
+ exports.RUNTIMES_WITH_FAST_MODE = new Set(['api']);
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /**
3
+ * model-profiles — re-exports model catalog symbols consumed by callers that
4
+ * historically required bin/lib/model-profiles.cjs.
5
+ *
6
+ * ADR-457 build-at-publish: the hand-written bin/lib/model-profiles.cjs collapsed
7
+ * to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour from
8
+ * the prior hand-written .cjs; only types are added.
9
+ */
10
+ const model_catalog_cjs_1 = require("./model-catalog.cjs");
11
+ module.exports = {
12
+ MODEL_PROFILES: model_catalog_cjs_1.MODEL_PROFILES,
13
+ VALID_PROFILES: model_catalog_cjs_1.VALID_PROFILES,
14
+ AGENT_TO_PHASE_TYPE: model_catalog_cjs_1.AGENT_TO_PHASE_TYPE,
15
+ VALID_PHASE_TYPES: model_catalog_cjs_1.VALID_PHASE_TYPES,
16
+ AGENT_DEFAULT_TIERS: model_catalog_cjs_1.AGENT_DEFAULT_TIERS,
17
+ VALID_AGENT_TIERS: model_catalog_cjs_1.VALID_AGENT_TIERS,
18
+ nextTier: model_catalog_cjs_1.nextTier,
19
+ formatAgentToModelMapAsTable: model_catalog_cjs_1.formatAgentToModelMapAsTable,
20
+ getAgentToModelMapForProfile: model_catalog_cjs_1.getAgentToModelMapForProfile,
21
+ EFFORT_RENDERING: model_catalog_cjs_1.EFFORT_RENDERING,
22
+ renderEffortForRuntime: model_catalog_cjs_1.renderEffortForRuntime,
23
+ RUNTIMES_WITH_FAST_MODE: model_catalog_cjs_1.RUNTIMES_WITH_FAST_MODE,
24
+ };
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * DispatchEvent shape factory — issue #177 (ADR-0174 P1.3), extended in #178 (P1.4).
4
+ *
5
+ * Creates a structured event record for every Hub dispatch, used by
6
+ * DispatchLogger to emit stderr errors and opt-in file audit trails.
7
+ *
8
+ * ADR-457 build-at-publish: the hand-written
9
+ * bin/lib/observability/event.cjs collapsed to a TypeScript source of truth.
10
+ * Behaviour is preserved byte-for-behaviour from the prior hand-written .cjs;
11
+ * only types are added.
12
+ *
13
+ * Shape:
14
+ * traceId: string — UUID v4, generated per dispatch
15
+ * parentTraceId: string|undefined — propagated from the caller when it is a canonical UUID v4
16
+ * (RFC 4122); invalid values are silently coerced to undefined.
17
+ * command: string — the dispatched verb
18
+ * args?: unknown — only present when includeArgs === true
19
+ * result: { kind: 'ok' | 'UnknownCommand' | 'InvalidArgs' | 'HandlerRefusal' | 'HandlerFailure', ...payload }
20
+ * timestamp: string — ISO 8601
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.makeDispatchEvent = makeDispatchEvent;
24
+ const node_crypto_1 = require("node:crypto");
25
+ /**
26
+ * Canonical UUID v4 regex (RFC 4122).
27
+ */
28
+ const UUID_V4_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
29
+ /**
30
+ * Returns true only when value is a canonical UUID v4 string.
31
+ */
32
+ function isValidParentTraceId(value) {
33
+ return typeof value === 'string' && UUID_V4_REGEX.test(value);
34
+ }
35
+ /**
36
+ * Create a DispatchEvent.
37
+ */
38
+ function makeDispatchEvent({ command, args, result, includeArgs = false, parentTraceId, }) {
39
+ const resolvedParentTraceId = isValidParentTraceId(parentTraceId) ? parentTraceId : undefined;
40
+ const event = {
41
+ traceId: (0, node_crypto_1.randomUUID)(),
42
+ parentTraceId: resolvedParentTraceId,
43
+ command: String(command),
44
+ result,
45
+ timestamp: new Date().toISOString(),
46
+ };
47
+ if (includeArgs && args !== undefined) {
48
+ event.args = args;
49
+ }
50
+ return Object.freeze(event);
51
+ }