@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,343 @@
1
+ "use strict";
2
+ /**
3
+ * Check subcommand router — auto-mode, decision-coverage-plan, decision-coverage-verify.
4
+ *
5
+ * ADR-457 build-at-publish: the hand-written bin/lib/check-command-router.cjs collapsed
6
+ * to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
7
+ * from the prior hand-written .cjs; only strict 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
+ const node_child_process_1 = require("node:child_process");
15
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
16
+ const core = require("./core.cjs");
17
+ const { output, error, ERROR_REASON } = core;
18
+ const decisions_cjs_1 = require("./decisions.cjs");
19
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
20
+ function normalizePhrase(text) {
21
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
22
+ return String(text || '')
23
+ .toLowerCase()
24
+ .replace(/[^a-z0-9\s]/g, ' ')
25
+ .replace(/\s+/g, ' ')
26
+ .trim();
27
+ }
28
+ const SOFT_PHRASE_MIN_WORDS = 6;
29
+ function softPhrase(text) {
30
+ const words = normalizePhrase(text).split(' ').filter(Boolean);
31
+ if (words.length < SOFT_PHRASE_MIN_WORDS)
32
+ return '';
33
+ return words.slice(0, SOFT_PHRASE_MIN_WORDS).join(' ');
34
+ }
35
+ function decisionMentioned(haystack, decision) {
36
+ if (!haystack)
37
+ return false;
38
+ if (new RegExp(`\\b${decision.id}\\b`).test(haystack))
39
+ return true;
40
+ const phrase = softPhrase(decision.text);
41
+ return phrase ? normalizePhrase(haystack).includes(phrase) : false;
42
+ }
43
+ function readIfExists(filePath) {
44
+ try {
45
+ return node_fs_1.default.readFileSync(filePath, 'utf-8');
46
+ }
47
+ catch {
48
+ return '';
49
+ }
50
+ }
51
+ function resolvePath(inputPath, projectDir) {
52
+ return node_path_1.default.isAbsolute(inputPath) ? inputPath : node_path_1.default.join(projectDir, inputPath);
53
+ }
54
+ function readWorkflowConfig(projectDir) {
55
+ const configPath = node_path_1.default.join(projectDir, '.planning', 'config.json');
56
+ try {
57
+ const parsed = JSON.parse(node_fs_1.default.readFileSync(configPath, 'utf-8'));
58
+ const wf = parsed['workflow'] || {};
59
+ return {
60
+ ...wf,
61
+ auto_advance: (wf['auto_advance'] ?? parsed['auto_advance']),
62
+ _auto_chain_active: (wf['_auto_chain_active'] ?? parsed['_auto_chain_active']),
63
+ context_coverage_gate: (wf['context_coverage_gate'] ?? parsed['context_coverage_gate']),
64
+ };
65
+ }
66
+ catch {
67
+ return {};
68
+ }
69
+ }
70
+ function cmdAutoMode(projectDir, raw) {
71
+ const workflow = readWorkflowConfig(projectDir);
72
+ const autoAdvance = Boolean(workflow.auto_advance ?? false);
73
+ const autoChainActive = Boolean(workflow._auto_chain_active ?? false);
74
+ let source = 'none';
75
+ if (autoChainActive && autoAdvance)
76
+ source = 'both';
77
+ else if (autoChainActive)
78
+ source = 'auto_chain';
79
+ else if (autoAdvance)
80
+ source = 'auto_advance';
81
+ output({
82
+ active: autoChainActive || autoAdvance,
83
+ source,
84
+ auto_chain_active: autoChainActive,
85
+ auto_advance: autoAdvance,
86
+ }, raw, undefined);
87
+ }
88
+ function gateEnabled(projectDir) {
89
+ const value = readWorkflowConfig(projectDir).context_coverage_gate;
90
+ if (typeof value === 'boolean')
91
+ return value;
92
+ if (typeof value === 'string') {
93
+ const lower = value.toLowerCase();
94
+ if (lower === 'false' || lower === 'true')
95
+ return lower !== 'false';
96
+ }
97
+ return true;
98
+ }
99
+ function loadPlanContents(phaseDir) {
100
+ if (!node_fs_1.default.existsSync(phaseDir))
101
+ return [];
102
+ try {
103
+ return node_fs_1.default.readdirSync(phaseDir)
104
+ .filter((entry) => /-PLAN\.md$/.test(entry))
105
+ .map((entry) => readIfExists(node_path_1.default.join(phaseDir, entry)));
106
+ }
107
+ catch {
108
+ return [];
109
+ }
110
+ }
111
+ const DESIGNATED_HEADINGS_RE = /^#{1,6}\s+(?:must[_ ]haves?|truths?|tasks?|objective)\b/i;
112
+ const XML_DECISION_TAGS_RE = /<(?:objective|tasks?|action)(?:\s[^>]*)?>([\s\S]*?)<\/(?:objective|tasks?|action)>/gi;
113
+ function stripCommentsAndFences(text) {
114
+ return text
115
+ .replace(/<!--[\s\S]*?-->/g, ' ')
116
+ .replace(/```[\s\S]*?```/g, ' ')
117
+ .replace(/~~~[\s\S]*?~~~/g, ' ');
118
+ }
119
+ function extractYamlBlock(frontmatter, key) {
120
+ const match = frontmatter.match(new RegExp(`^${key}\\s*:(.*)$`, 'm'));
121
+ if (!match)
122
+ return '';
123
+ const startIdx = (match.index || 0) + match[0].length;
124
+ const rest = frontmatter.slice(startIdx + 1).split(/\r?\n/);
125
+ const block = [match[1] || ''];
126
+ for (const line of rest) {
127
+ if (line === '' || /^\s/.test(line))
128
+ block.push(line);
129
+ else
130
+ break;
131
+ }
132
+ return block.join('\n');
133
+ }
134
+ function extractXmlTagBodies(text) {
135
+ const parts = [];
136
+ for (const match of text.matchAll(XML_DECISION_TAGS_RE)) {
137
+ if (match[1])
138
+ parts.push(match[1]);
139
+ }
140
+ return parts.join('\n');
141
+ }
142
+ function extractPlanDesignatedSections(planContent) {
143
+ if (!planContent)
144
+ return '';
145
+ const cleaned = stripCommentsAndFences(planContent);
146
+ const fmMatch = cleaned.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
147
+ const frontmatter = fmMatch ? fmMatch[1] : '';
148
+ const body = fmMatch ? fmMatch[2] : cleaned;
149
+ const parts = [];
150
+ for (const key of ['must_haves', 'truths', 'objective']) {
151
+ const block = extractYamlBlock(frontmatter, key);
152
+ if (block)
153
+ parts.push(block);
154
+ }
155
+ const bodyParts = [];
156
+ let inDesignated = false;
157
+ for (const line of body.split(/\r?\n/)) {
158
+ const heading = /^#{1,6}\s+/.test(line);
159
+ if (heading) {
160
+ inDesignated = DESIGNATED_HEADINGS_RE.test(line);
161
+ if (inDesignated)
162
+ bodyParts.push(line);
163
+ continue;
164
+ }
165
+ if (inDesignated)
166
+ bodyParts.push(line);
167
+ }
168
+ parts.push(bodyParts.join('\n'));
169
+ parts.push(extractXmlTagBodies(cleaned));
170
+ return parts.join('\n\n');
171
+ }
172
+ function buildPlanMessage(uncovered) {
173
+ if (uncovered.length === 0)
174
+ return 'All trackable CONTEXT.md decisions are covered by plans.';
175
+ return [
176
+ '## Decision Coverage Gap',
177
+ '',
178
+ `${uncovered.length} CONTEXT.md decision(s) are not covered by any plan:`,
179
+ '',
180
+ ...uncovered.map((item) => `- **${item.id}** (${item.category || 'uncategorized'}): ${item.text}`),
181
+ '',
182
+ 'Resolve by citing `D-NN:` in a relevant plan\'s `must_haves`/`truths` (or body),',
183
+ 'OR move the decision to `### Claude\'s Discretion` / tag it `[informational]` if it should not be tracked.',
184
+ ].join('\n');
185
+ }
186
+ function buildVerifyMessage(notHonored) {
187
+ if (notHonored.length === 0)
188
+ return 'All trackable CONTEXT.md decisions are honored by shipped artifacts.';
189
+ return [
190
+ '### Decision Coverage (warning)',
191
+ '',
192
+ `${notHonored.length} decision(s) not found in shipped artifacts:`,
193
+ '',
194
+ ...notHonored.map((item) => `- **${item.id}** (${item.category || 'uncategorized'}): ${item.text}`),
195
+ '',
196
+ 'This is a soft warning - verification status is unchanged.',
197
+ ].join('\n');
198
+ }
199
+ function loadTrackableDecisions(contextPath) {
200
+ return (0, decisions_cjs_1.parseDecisions)(readIfExists(contextPath)).filter((decision) => decision.trackable);
201
+ }
202
+ function cmdDecisionCoveragePlan(projectDir, args, raw) {
203
+ const phaseDir = args[2] ? resolvePath(args[2], projectDir) : '';
204
+ const contextPath = args[3] ? resolvePath(args[3], projectDir) : '';
205
+ if (!gateEnabled(projectDir)) {
206
+ output({ passed: true, skipped: true, reason: 'workflow.context_coverage_gate is false', total: 0, covered: 0, uncovered: [], message: 'Decision coverage gate disabled by config.' }, raw, undefined);
207
+ return;
208
+ }
209
+ if (!contextPath || !node_fs_1.default.existsSync(contextPath)) {
210
+ output({ passed: true, skipped: true, reason: 'CONTEXT.md missing', total: 0, covered: 0, uncovered: [], message: 'No CONTEXT.md - nothing to check.' }, raw, undefined);
211
+ return;
212
+ }
213
+ const decisions = loadTrackableDecisions(contextPath);
214
+ if (decisions.length === 0) {
215
+ output({ passed: true, skipped: true, reason: 'no trackable decisions', total: 0, covered: 0, uncovered: [], message: 'No trackable decisions in CONTEXT.md.' }, raw, undefined);
216
+ return;
217
+ }
218
+ const sections = loadPlanContents(phaseDir).map(extractPlanDesignatedSections);
219
+ const uncovered = [];
220
+ let covered = 0;
221
+ for (const decision of decisions) {
222
+ if (sections.some((section) => decisionMentioned(section, decision)))
223
+ covered++;
224
+ else
225
+ uncovered.push({ id: decision.id, text: decision.text, category: decision.category });
226
+ }
227
+ output({
228
+ passed: uncovered.length === 0,
229
+ skipped: false,
230
+ total: decisions.length,
231
+ covered,
232
+ uncovered,
233
+ message: buildPlanMessage(uncovered),
234
+ }, raw, undefined);
235
+ }
236
+ function recentCommitMessages(projectDir) {
237
+ try {
238
+ return (0, node_child_process_1.execFileSync)('git', ['log', '-n', '200', '--pretty=%s%n%b'], {
239
+ cwd: projectDir,
240
+ encoding: 'utf-8',
241
+ maxBuffer: 4 * 1024 * 1024,
242
+ windowsHide: true,
243
+ });
244
+ }
245
+ catch {
246
+ return '';
247
+ }
248
+ }
249
+ function isInsideRoot(candidatePath, rootDir) {
250
+ const root = node_path_1.default.resolve(rootDir);
251
+ const target = node_path_1.default.resolve(root, candidatePath);
252
+ return target === root || target.startsWith(`${root}${node_path_1.default.sep}`);
253
+ }
254
+ function readModifiedFilesContent(projectDir, summaries) {
255
+ const out = [];
256
+ let total = 0;
257
+ for (const summary of summaries) {
258
+ if (!summary)
259
+ continue;
260
+ for (const blockMatch of summary.matchAll(/files_modified:\s*\n((?:[ \t]*-\s+.+\n?)+)/g)) {
261
+ const files = [...(blockMatch[1] || '').matchAll(/-\s+(.+)/g)]
262
+ .map((match) => match[1].trim().replace(/^["']|["']$/g, ''));
263
+ for (const file of files) {
264
+ if (total >= 50)
265
+ break;
266
+ if (!file || !isInsideRoot(file, projectDir))
267
+ continue;
268
+ const raw = readIfExists(resolvePath(file, projectDir));
269
+ out.push(raw.length > 256 * 1024 ? raw.slice(0, 256 * 1024) : raw);
270
+ total++;
271
+ }
272
+ if (total >= 50)
273
+ break;
274
+ }
275
+ if (total >= 50)
276
+ break;
277
+ }
278
+ return out.join('\n\n');
279
+ }
280
+ function cmdDecisionCoverageVerify(projectDir, args, raw) {
281
+ const phaseDir = args[2] ? resolvePath(args[2], projectDir) : '';
282
+ const contextPath = args[3] ? resolvePath(args[3], projectDir) : '';
283
+ if (!gateEnabled(projectDir)) {
284
+ output({ skipped: true, blocking: false, reason: 'workflow.context_coverage_gate is false', total: 0, honored: 0, not_honored: [], message: 'Decision coverage gate disabled by config.' }, raw, undefined);
285
+ return;
286
+ }
287
+ if (!contextPath || !node_fs_1.default.existsSync(contextPath)) {
288
+ output({ skipped: true, blocking: false, reason: 'CONTEXT.md missing', total: 0, honored: 0, not_honored: [], message: 'No CONTEXT.md - nothing to check.' }, raw, undefined);
289
+ return;
290
+ }
291
+ const decisions = loadTrackableDecisions(contextPath);
292
+ if (decisions.length === 0) {
293
+ output({ skipped: true, blocking: false, reason: 'no trackable decisions', total: 0, honored: 0, not_honored: [], message: 'No trackable decisions in CONTEXT.md.' }, raw, undefined);
294
+ return;
295
+ }
296
+ const planContents = loadPlanContents(phaseDir);
297
+ const summaryParts = node_fs_1.default.existsSync(phaseDir)
298
+ ? node_fs_1.default.readdirSync(phaseDir).filter((entry) => /-SUMMARY\.md$/.test(entry)).map((entry) => readIfExists(node_path_1.default.join(phaseDir, entry)))
299
+ : [];
300
+ const haystack = [
301
+ planContents.join('\n\n'),
302
+ summaryParts.join('\n\n'),
303
+ readModifiedFilesContent(projectDir, summaryParts),
304
+ recentCommitMessages(projectDir),
305
+ ].join('\n\n');
306
+ const notHonored = [];
307
+ let honored = 0;
308
+ for (const decision of decisions) {
309
+ if (decisionMentioned(haystack, decision))
310
+ honored++;
311
+ else
312
+ notHonored.push({ id: decision.id, text: decision.text, category: decision.category });
313
+ }
314
+ output({
315
+ skipped: false,
316
+ blocking: false,
317
+ total: decisions.length,
318
+ honored,
319
+ not_honored: notHonored,
320
+ message: buildVerifyMessage(notHonored),
321
+ }, raw, undefined);
322
+ }
323
+ function routeCheckCommand({ args, cwd, raw }) {
324
+ const subcommand = args[1];
325
+ if (subcommand === 'auto-mode') {
326
+ cmdAutoMode(cwd, raw);
327
+ return;
328
+ }
329
+ if (subcommand === 'decision-coverage-plan') {
330
+ cmdDecisionCoveragePlan(cwd, args, raw);
331
+ return;
332
+ }
333
+ if (subcommand === 'decision-coverage-verify') {
334
+ cmdDecisionCoverageVerify(cwd, args, raw);
335
+ return;
336
+ }
337
+ error('Unknown check subcommand. Available: auto-mode, decision-coverage-plan, decision-coverage-verify', ERROR_REASON.SDK_UNKNOWN_COMMAND);
338
+ }
339
+ module.exports = {
340
+ routeCheckCommand,
341
+ decisionMentioned,
342
+ extractPlanDesignatedSections,
343
+ };
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ /**
3
+ * CJS Command Router Adapter Module
4
+ *
5
+ * Compatibility routing for gsd-tools.cjs command families. Uses generated
6
+ * command metadata for availability and small family-local argument shapers for
7
+ * CJS handler calls.
8
+ *
9
+ * ADR-457 build-at-publish: the hand-written bin/lib/cjs-command-router-adapter.cjs
10
+ * collapsed to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
11
+ * from the prior hand-written .cjs; only types are added.
12
+ */
13
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
14
+ const commandRoutingHub = require("./command-routing-hub.cjs");
15
+ const { createHub, ERROR_KINDS } = commandRoutingHub;
16
+ // ─── Implementation ───────────────────────────────────────────────────────────
17
+ function routeCjsCommandFamily({ args, subcommands, handlers, defaultSubcommand, unsupported = {}, unknownMessage, error, cwd, raw, }) {
18
+ routeHubCommandFamily({
19
+ family: '__legacy_cjs_family__',
20
+ args,
21
+ subcommands,
22
+ handlers,
23
+ defaultSubcommand,
24
+ unsupported,
25
+ unknownMessage,
26
+ error,
27
+ cwd,
28
+ raw,
29
+ });
30
+ }
31
+ /**
32
+ * Hub-backed family router adapter.
33
+ *
34
+ * Deepens the command-topology seam by routing family handlers through
35
+ * CommandRoutingHub's typed Result contract instead of ad-hoc per-router
36
+ * lookup + error handling branches.
37
+ */
38
+ function routeHubCommandFamily({ family, args, subcommands, handlers, defaultSubcommand, unsupported = {}, unknownMessage, error, cwd, raw, }) {
39
+ const subcommand = args[1] || defaultSubcommand;
40
+ if (subcommand && unsupported[subcommand]) {
41
+ error(unsupported[subcommand]);
42
+ return;
43
+ }
44
+ const available = subcommands.filter((s) => !unsupported[s]);
45
+ const registryHandlers = Object.fromEntries(Object.entries(handlers).map(([name, handler]) => [
46
+ name,
47
+ () => {
48
+ const result = handler();
49
+ if (result && typeof result === 'object' && Object.prototype.hasOwnProperty.call(result, 'ok')) {
50
+ return result;
51
+ }
52
+ return { ok: true, data: null };
53
+ },
54
+ ]));
55
+ const hub = createHub({
56
+ cjsRegistry: { [family]: registryHandlers },
57
+ manifest: { [family]: available },
58
+ });
59
+ const result = hub.dispatch({
60
+ family,
61
+ subcommand,
62
+ args: args.slice(2),
63
+ cwd,
64
+ raw,
65
+ });
66
+ if (result.ok)
67
+ return;
68
+ if (result.kind === ERROR_KINDS.UnknownCommand) {
69
+ error(unknownMessage(subcommand ?? '', available));
70
+ return;
71
+ }
72
+ if (result.kind === ERROR_KINDS.InvalidArgs || result.kind === ERROR_KINDS.HandlerRefusal) {
73
+ error(result.reason);
74
+ return;
75
+ }
76
+ error(result.message);
77
+ }
78
+ module.exports = {
79
+ routeCjsCommandFamily,
80
+ routeHubCommandFamily,
81
+ };
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /**
3
+ * Error carrying a process exit code. CLI logic throws this instead of calling
4
+ * process.exit() (banned by n/no-process-exit); runMain() translates it into
5
+ * process.exitCode at the entrypoint.
6
+ */
7
+ class ExitError extends Error {
8
+ code;
9
+ hasUserMessage;
10
+ constructor(code = 1, message) {
11
+ super(message === undefined ? `process exit ${code}` : message);
12
+ this.name = 'ExitError';
13
+ this.code = code;
14
+ this.hasUserMessage = message !== undefined;
15
+ }
16
+ }
17
+ /**
18
+ * Run a CLI main and translate its outcome into process.exitCode (never
19
+ * process.exit, so n/no-process-exit stays satisfied; output flushes and
20
+ * process.on('exit') cleanup still fires). main may be sync or async:
21
+ * number return -> process.exitCode = it
22
+ * thrown ExitError -> process.exitCode = err.code (+ stderr err.message if hasUserMessage && code!=0)
23
+ * other throw -> stderr stack + process.exitCode = 1
24
+ */
25
+ function runMain(main) {
26
+ Promise.resolve()
27
+ .then(() => main())
28
+ .then((code) => { if (typeof code === 'number')
29
+ process.exitCode = code; })
30
+ .catch((err) => {
31
+ if (err instanceof ExitError) {
32
+ if (err.hasUserMessage && err.code !== 0)
33
+ process.stderr.write(`${err.message}\n`);
34
+ process.exitCode = err.code;
35
+ return;
36
+ }
37
+ const e = err;
38
+ process.stderr.write(`${e && e.stack ? e.stack : String(err)}\n`);
39
+ process.exitCode = 1;
40
+ });
41
+ }
42
+ module.exports = { ExitError, runMain };
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ /**
3
+ * Deterministic clock seam for lock modules (ADR-457 build-at-publish: the
4
+ * hand-written bin/lib/clock.cjs collapsed to a TypeScript source of truth).
5
+ * Behaviour is preserved byte-for-behaviour from the prior hand-written .cjs;
6
+ * only types are added.
7
+ *
8
+ * Production code uses `realClock` (the default). Test code passes in a
9
+ * `makeFakeClock()` instance to drive lock timing without real wall-clock
10
+ * waits or Atomics.wait calls.
11
+ *
12
+ * Both methods in realClock use exactly the same system primitives that
13
+ * acquireStateLock and withPlanningLock used inline before the seam was
14
+ * introduced:
15
+ * - now() → Date.now()
16
+ * - sleep() → Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms)
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.realClock = void 0;
20
+ // Module-level Atomics.wait buffer reused across every realClock.sleep() call.
21
+ // The buffer value is always 0 (never written), so reuse is semantically
22
+ // identical to allocating a fresh buffer each time.
23
+ const _realSleepBuf = new Int32Array(new SharedArrayBuffer(4));
24
+ /**
25
+ * Parse GSD_NOW_MS to a valid pinned epoch millisecond value, or return null.
26
+ *
27
+ * Accepts ONLY strict decimal integer strings within JS Date bounds
28
+ * (abs(ms) <= 8.64e15). Rejects empty strings, whitespace-only, floats
29
+ * ('12.5'), scientific notation ('1e30'), and out-of-range values.
30
+ *
31
+ * Returns null (fall back to Date.now()) for any invalid or absent input.
32
+ * Returns null when GSD_TEST_MODE is not set.
33
+ */
34
+ function _pinnedNowMs() {
35
+ if (!process.env.GSD_TEST_MODE)
36
+ return null;
37
+ const raw = process.env.GSD_NOW_MS;
38
+ if (typeof raw !== 'string')
39
+ return null;
40
+ const t = raw.trim();
41
+ if (!/^-?\d+$/.test(t))
42
+ return null; // reject '', 'abc', '1e30', '12.5'
43
+ const ms = Number(t);
44
+ if (!Number.isFinite(ms) || Math.abs(ms) > 8.64e15)
45
+ return null; // Date-valid bounds
46
+ return ms;
47
+ }
48
+ exports.realClock = {
49
+ /**
50
+ * Return current epoch milliseconds.
51
+ *
52
+ * When both GSD_TEST_MODE and GSD_NOW_MS are set (subprocess time-pin adapter,
53
+ * issue #474), returns the pinned millisecond value so all date-stamping in the
54
+ * subprocess SUT is deterministic. In production, falls back to Date.now().
55
+ *
56
+ * Only strict decimal integer strings within JS Date bounds are accepted as pins.
57
+ * Any other value (empty string, float, scientific notation, out-of-range) falls
58
+ * back to Date.now() to prevent RangeError from new Date(ms).toISOString().
59
+ */
60
+ now() {
61
+ const pinned = _pinnedNowMs();
62
+ if (pinned !== null)
63
+ return pinned;
64
+ return Date.now();
65
+ },
66
+ /**
67
+ * Return the current instant as an ISO 8601 string (UTC).
68
+ * Uses this.now() so the subprocess time-pin adapter is honoured.
69
+ *
70
+ * @returns e.g. "2020-06-15T12:00:00.000Z"
71
+ */
72
+ nowIso() {
73
+ return new Date(this.now()).toISOString();
74
+ },
75
+ /**
76
+ * Return today's date as a YYYY-MM-DD string (UTC calendar day).
77
+ * Uses this.now() so the subprocess time-pin adapter is honoured.
78
+ *
79
+ * @returns e.g. "2020-06-15"
80
+ */
81
+ today() {
82
+ return this.nowIso().split('T')[0];
83
+ },
84
+ /**
85
+ * Synchronous sleep via Atomics.wait.
86
+ * This is the identical primitive acquireStateLock and withPlanningLock used
87
+ * inline before the seam. Atomics.wait on a shared buffer that is never
88
+ * notified times out after exactly `ms` milliseconds without spinning the CPU.
89
+ *
90
+ * @param ms - milliseconds to sleep
91
+ */
92
+ sleep(ms) {
93
+ Atomics.wait(_realSleepBuf, 0, 0, ms);
94
+ },
95
+ };
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ /**
3
+ * Skill cluster definitions for the runtime surface module (ADR-457
4
+ * build-at-publish: the hand-written bin/lib/clusters.cjs collapsed to a
5
+ * TypeScript source of truth). Behaviour is preserved byte-for-behaviour from
6
+ * the prior hand-written .cjs; only types are added.
7
+ *
8
+ * Each cluster is a named group of skill stems. Clusters are used by /gsd:surface
9
+ * to enable/disable a cohesive group of skills without reinstall.
10
+ *
11
+ * Cluster membership may overlap (a skill can live in two clusters). The union
12
+ * of all clusters should cover every installed skill stem; uncategorized stems
13
+ * are flagged by surface-clusters.test.cjs.
14
+ *
15
+ * Source: docs/research/2026-05-12-skill-surface-budget.md §3.2 (verified
16
+ * against commands/gsd/ listing in surface-clusters.test.cjs).
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.CLUSTERS = void 0;
20
+ exports.allClusteredSkills = allClusteredSkills;
21
+ exports.CLUSTERS = Object.freeze({
22
+ core_loop: Object.freeze([
23
+ 'new-project',
24
+ 'discuss-phase',
25
+ 'plan-phase',
26
+ 'execute-phase',
27
+ 'help',
28
+ 'update',
29
+ ]),
30
+ audit_review: Object.freeze([
31
+ 'code-review',
32
+ 'review',
33
+ 'audit-fix',
34
+ 'audit-milestone',
35
+ 'audit-uat',
36
+ 'verify-work',
37
+ 'validate-phase',
38
+ 'plan-review-convergence',
39
+ 'eval-review',
40
+ 'add-tests',
41
+ 'secure-phase',
42
+ ]),
43
+ milestone: Object.freeze([
44
+ 'new-milestone',
45
+ 'complete-milestone',
46
+ 'milestone-summary',
47
+ 'health',
48
+ ]),
49
+ research_ideate: Object.freeze([
50
+ 'sketch',
51
+ 'spike',
52
+ 'forensics',
53
+ 'explore',
54
+ 'graphify',
55
+ 'ns-ideate',
56
+ ]),
57
+ workspace_state: Object.freeze([
58
+ 'pause-work',
59
+ 'resume-work',
60
+ 'workspace',
61
+ 'workstreams',
62
+ 'thread',
63
+ 'capture',
64
+ 'inbox',
65
+ ]),
66
+ docs: Object.freeze([
67
+ 'docs-update',
68
+ 'ingest-docs',
69
+ ]),
70
+ ui: Object.freeze([
71
+ 'ui-phase',
72
+ 'ui-review',
73
+ ]),
74
+ ai_eval: Object.freeze([
75
+ 'ai-integration-phase',
76
+ 'eval-review',
77
+ ]),
78
+ ns_meta: Object.freeze([
79
+ 'ns-context',
80
+ 'ns-ideate',
81
+ 'ns-manage',
82
+ 'ns-project',
83
+ 'ns-review',
84
+ 'ns-workflow',
85
+ ]),
86
+ utility: Object.freeze([
87
+ 'health',
88
+ 'stats',
89
+ 'settings',
90
+ 'cleanup',
91
+ 'pr-branch',
92
+ 'ship',
93
+ 'undo',
94
+ 'fast',
95
+ 'quick',
96
+ 'autonomous',
97
+ 'config',
98
+ 'progress',
99
+ 'phase',
100
+ 'review',
101
+ 'update',
102
+ 'help',
103
+ 'code-review',
104
+ 'import',
105
+ 'manager',
106
+ 'map-codebase',
107
+ 'profile-user',
108
+ 'spec-phase',
109
+ 'model-domain',
110
+ 'recommend-architecture',
111
+ 'discover-product',
112
+ 'testing-strategy',
113
+ 'ultraplan-phase',
114
+ 'mvp-phase',
115
+ 'execute-phase',
116
+ 'review-backlog',
117
+ 'debug',
118
+ 'extract-learnings',
119
+ 'surface',
120
+ ]),
121
+ });
122
+ /**
123
+ * Build a Set of all skill stems covered by at least one cluster.
124
+ */
125
+ function allClusteredSkills() {
126
+ const result = new Set();
127
+ for (const skills of Object.values(exports.CLUSTERS)) {
128
+ for (const s of skills)
129
+ result.add(s);
130
+ }
131
+ return result;
132
+ }