@opengsd/gsd-core 1.11.0 → 1.12.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 (395) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/agents/gsd-code-fixer.md +1 -1
  4. package/agents/gsd-debug-session-manager.md +1 -1
  5. package/agents/gsd-debugger.md +1 -1
  6. package/agents/gsd-dom-verifier.md +169 -0
  7. package/agents/gsd-eval-auditor.md +1 -1
  8. package/agents/gsd-executor.md +17 -9
  9. package/agents/gsd-framework-selector.md +1 -3
  10. package/agents/gsd-intel-updater.md +1 -1
  11. package/agents/gsd-mempalace-curator.md +0 -1
  12. package/agents/gsd-pattern-mapper.md +11 -0
  13. package/agents/gsd-phase-researcher.md +3 -1
  14. package/agents/gsd-plan-checker.md +15 -55
  15. package/agents/gsd-planner.md +6 -4
  16. package/agents/gsd-project-researcher.md +1 -1
  17. package/agents/gsd-research-synthesizer.md +2 -2
  18. package/agents/gsd-roadmapper.md +15 -11
  19. package/agents/gsd-ui-checker.md +63 -4
  20. package/agents/gsd-ui-researcher.md +41 -3
  21. package/agents/gsd-verifier.md +1 -1
  22. package/bin/install.js +609 -134
  23. package/commands/gsd/discuss-phase.md +1 -1
  24. package/commands/gsd/import.md +1 -1
  25. package/commands/gsd/quick.md +8 -4
  26. package/gsd-core/bin/gsd-tools.cjs +567 -51
  27. package/gsd-core/bin/lib/active-workstream-store.cjs +8 -0
  28. package/gsd-core/bin/lib/adr-parser.cjs +13 -7
  29. package/gsd-core/bin/lib/agent-install-check.cjs +162 -0
  30. package/gsd-core/bin/lib/api-coverage.cjs +30 -9
  31. package/gsd-core/bin/lib/artifacts.cjs +2 -0
  32. package/gsd-core/bin/lib/assumption-delta.cjs +30 -11
  33. package/gsd-core/bin/lib/audit.cjs +163 -41
  34. package/gsd-core/bin/lib/broken-windows.cjs +306 -28
  35. package/gsd-core/bin/lib/capability-lock.cjs +10 -4
  36. package/gsd-core/bin/lib/capability-registry.cjs +336 -95
  37. package/gsd-core/bin/lib/capability-state.cjs +18 -3
  38. package/gsd-core/bin/lib/capability-validator.cjs +205 -18
  39. package/gsd-core/bin/lib/check-command-router.cjs +145 -5
  40. package/gsd-core/bin/lib/cli-exit.cjs +496 -10
  41. package/gsd-core/bin/lib/code-review-depth.cjs +288 -0
  42. package/gsd-core/bin/lib/codex-agent-toml.cjs +410 -4
  43. package/gsd-core/bin/lib/command-arg-projection.cjs +144 -14
  44. package/gsd-core/bin/lib/command-routing-hub.cjs +31 -2
  45. package/gsd-core/bin/lib/commands.cjs +543 -44
  46. package/gsd-core/bin/lib/complexity-trigger.cjs +26 -6
  47. package/gsd-core/bin/lib/config-loader.cjs +118 -29
  48. package/gsd-core/bin/lib/config.cjs +92 -2
  49. package/gsd-core/bin/lib/configuration.cjs +129 -37
  50. package/gsd-core/bin/lib/core-utils.cjs +84 -7
  51. package/gsd-core/bin/lib/edge-probe.cjs +9 -1
  52. package/gsd-core/bin/lib/estimate-cli.cjs +55 -11
  53. package/gsd-core/bin/lib/exit-code-registry.cjs +98 -0
  54. package/gsd-core/bin/lib/frontmatter.cjs +840 -305
  55. package/gsd-core/bin/lib/gap-checker.cjs +27 -3
  56. package/gsd-core/bin/lib/git-base-branch.cjs +174 -39
  57. package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +7 -3
  58. package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +6 -3
  59. package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +22 -8
  60. package/gsd-core/bin/lib/health-diagnostic.cjs +23 -3
  61. package/gsd-core/bin/lib/host-integration.cjs +39 -6
  62. package/gsd-core/bin/lib/init-command-router.cjs +118 -21
  63. package/gsd-core/bin/lib/init.cjs +120 -41
  64. package/gsd-core/bin/lib/install-engine.cjs +68 -3
  65. package/gsd-core/bin/lib/install-model-override-resolver.cjs +33 -1
  66. package/gsd-core/bin/lib/install-profiles.cjs +78 -4
  67. package/gsd-core/bin/lib/installer-migration-report.cjs +3 -0
  68. package/gsd-core/bin/lib/installer-migrations/010-antigravity-retire-confighome-artifacts.cjs +169 -0
  69. package/gsd-core/bin/lib/installer-migrations.cjs +10 -7
  70. package/gsd-core/bin/lib/intel.cjs +101 -26
  71. package/gsd-core/bin/lib/io.cjs +160 -15
  72. package/gsd-core/bin/lib/learnings.cjs +85 -14
  73. package/gsd-core/bin/lib/legacy-cleanup.cjs +8 -2
  74. package/gsd-core/bin/lib/markdown-table.cjs +52 -4
  75. package/gsd-core/bin/lib/milestone.cjs +90 -5
  76. package/gsd-core/bin/lib/model-catalog.cjs +177 -19
  77. package/gsd-core/bin/lib/model-resolver.cjs +10 -28
  78. package/gsd-core/bin/lib/onboard-projection.cjs +5 -1
  79. package/gsd-core/bin/lib/phase-estimation.cjs +17 -8
  80. package/gsd-core/bin/lib/phase-id.cjs +70 -4
  81. package/gsd-core/bin/lib/phase-lifecycle.cjs +24 -16
  82. package/gsd-core/bin/lib/phase-locator.cjs +138 -17
  83. package/gsd-core/bin/lib/phase.cjs +405 -84
  84. package/gsd-core/bin/lib/plan-document.cjs +263 -0
  85. package/gsd-core/bin/lib/plan-scan.cjs +13 -2
  86. package/gsd-core/bin/lib/planning-command-router.cjs +61 -0
  87. package/gsd-core/bin/lib/planning-inspect.cjs +1168 -0
  88. package/gsd-core/bin/lib/planning-snapshot.cjs +18 -14
  89. package/gsd-core/bin/lib/planning-workspace.cjs +56 -0
  90. package/gsd-core/bin/lib/probe-core.cjs +4 -1
  91. package/gsd-core/bin/lib/profile-pipeline-command-router.cjs +50 -7
  92. package/gsd-core/bin/lib/profile-pipeline.cjs +6 -3
  93. package/gsd-core/bin/lib/real-home-guard.cjs +419 -0
  94. package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +71 -45
  95. package/gsd-core/bin/lib/review-lane-descriptor.cjs +9 -9
  96. package/gsd-core/bin/lib/roadmap-command-router.cjs +45 -31
  97. package/gsd-core/bin/lib/roadmap-parser.cjs +79 -16
  98. package/gsd-core/bin/lib/roadmap.cjs +74 -19
  99. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +96 -8
  100. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +34 -1
  101. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +287 -55
  102. package/gsd-core/bin/lib/runtime-identity.cjs +234 -0
  103. package/gsd-core/bin/lib/runtime-slash.cjs +72 -2
  104. package/gsd-core/bin/lib/shell-command-projection.cjs +71 -8
  105. package/gsd-core/bin/lib/smart-entry.cjs +12 -22
  106. package/gsd-core/bin/lib/spec-section.cjs +12 -7
  107. package/gsd-core/bin/lib/state-command-router.cjs +47 -18
  108. package/gsd-core/bin/lib/state-contract.cjs +359 -0
  109. package/gsd-core/bin/lib/state-document.cjs +186 -0
  110. package/gsd-core/bin/lib/state-md-schema.cjs +221 -0
  111. package/gsd-core/bin/lib/state-transition.cjs +517 -101
  112. package/gsd-core/bin/lib/state.cjs +946 -163
  113. package/gsd-core/bin/lib/surface.cjs +10 -2
  114. package/gsd-core/bin/lib/task-command-router.cjs +111 -1
  115. package/gsd-core/bin/lib/task-content-resolution.cjs +368 -0
  116. package/gsd-core/bin/lib/teams-status.cjs +4 -1
  117. package/gsd-core/bin/lib/uat-predicate.cjs +58 -20
  118. package/gsd-core/bin/lib/uat.cjs +1376 -125
  119. package/gsd-core/bin/lib/ui-consideration-probe.cjs +9 -1
  120. package/gsd-core/bin/lib/ui-safety-gate.cjs +37 -7
  121. package/gsd-core/bin/lib/unusable-input.cjs +13 -0
  122. package/gsd-core/bin/lib/validate-command-router.cjs +2 -2
  123. package/gsd-core/bin/lib/vendor/README.md +43 -5
  124. package/gsd-core/bin/lib/vendor/js-yaml.cjs +3014 -0
  125. package/gsd-core/bin/lib/verification.cjs +14 -1
  126. package/gsd-core/bin/lib/verify-command-grounding.cjs +846 -0
  127. package/gsd-core/bin/lib/verify.cjs +95 -40
  128. package/gsd-core/bin/lib/workstream-name-policy.cjs +25 -4
  129. package/gsd-core/bin/lib/worktree-base-ref.cjs +66 -12
  130. package/gsd-core/bin/lib/worktree-safety.cjs +177 -21
  131. package/gsd-core/bin/shared/config-defaults.manifest.json +7 -1
  132. package/gsd-core/bin/shared/config-schema.manifest.json +5 -0
  133. package/gsd-core/bin/shared/exit-codes.json +8 -0
  134. package/gsd-core/bin/shared/exit-codes.sh +20 -0
  135. package/gsd-core/bin/shared/model-catalog.json +8 -1
  136. package/gsd-core/references/agent-contracts.md +3 -2
  137. package/gsd-core/references/api-coverage.md +24 -2
  138. package/gsd-core/references/autonomous-smart-discuss.md +3 -3
  139. package/gsd-core/references/checkpoints.md +37 -19
  140. package/gsd-core/references/decimal-phase-calculation.md +5 -5
  141. package/gsd-core/references/edge-probe.md +8 -0
  142. package/gsd-core/references/execute-mvp-tdd.md +1 -3
  143. package/gsd-core/references/execute-phase-between-wave-reset.md +9 -12
  144. package/gsd-core/references/execute-phase-wave-guard.md +11 -9
  145. package/gsd-core/references/failing-direction.md +78 -0
  146. package/gsd-core/references/gate-prompts.md +1 -1
  147. package/gsd-core/references/git-integration.md +5 -5
  148. package/gsd-core/references/git-planning-commit.md +3 -3
  149. package/gsd-core/references/gsd-run-resolver.md +1 -1
  150. package/gsd-core/references/loop-hook-dispatch.md +22 -0
  151. package/gsd-core/references/model-profiles.md +1 -1
  152. package/gsd-core/references/nyquist-compliance.md +74 -0
  153. package/gsd-core/references/offer-next.md +3 -5
  154. package/gsd-core/references/phase-argument-parsing.md +3 -3
  155. package/gsd-core/references/planner-failing-direction.md +53 -0
  156. package/gsd-core/references/planner-human-verify-mode.md +15 -1
  157. package/gsd-core/references/planner-revision.md +1 -1
  158. package/gsd-core/references/planner-verify-command-grounding.md +17 -0
  159. package/gsd-core/references/planning-config.md +37 -8
  160. package/gsd-core/references/reviewer-instances.md +31 -0
  161. package/gsd-core/references/runtime-aware-dispatch.md +1 -1
  162. package/gsd-core/references/tdd.md +1 -3
  163. package/gsd-core/references/ui-brand.md +65 -21
  164. package/gsd-core/references/ui-consideration-probe.md +1 -1
  165. package/gsd-core/references/universal-anti-patterns.md +2 -2
  166. package/gsd-core/references/verify-command-path-resolvability.md +42 -0
  167. package/gsd-core/references/verify-mvp-mode.md +1 -1
  168. package/gsd-core/references/workstream-flag.md +11 -11
  169. package/gsd-core/templates/README.md +1 -1
  170. package/gsd-core/templates/SECURITY.md +3 -3
  171. package/gsd-core/templates/UI-SPEC.md +25 -3
  172. package/gsd-core/templates/VALIDATION.md +3 -3
  173. package/gsd-core/templates/phase-prompt.md +3 -0
  174. package/gsd-core/templates/state.md +7 -0
  175. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
  176. package/gsd-core/workflows/add-backlog.md +1 -1
  177. package/gsd-core/workflows/add-phase.md +3 -3
  178. package/gsd-core/workflows/add-tests.md +3 -8
  179. package/gsd-core/workflows/add-todo.md +1 -1
  180. package/gsd-core/workflows/ai-integration-phase.md +4 -9
  181. package/gsd-core/workflows/audit-fix.md +12 -3
  182. package/gsd-core/workflows/audit-milestone.md +9 -9
  183. package/gsd-core/workflows/audit-uat.md +17 -2
  184. package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +2 -2
  185. package/gsd-core/workflows/autonomous.md +10 -26
  186. package/gsd-core/workflows/check-todos.md +1 -1
  187. package/gsd-core/workflows/cleanup.md +2 -2
  188. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +1 -1
  189. package/gsd-core/workflows/code-review-fix.md +1 -1
  190. package/gsd-core/workflows/code-review.md +121 -40
  191. package/gsd-core/workflows/complete-milestone.md +15 -10
  192. package/gsd-core/workflows/debug.md +5 -3
  193. package/gsd-core/workflows/diagnose-issues.md +12 -6
  194. package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
  195. package/gsd-core/workflows/discuss-phase/modes/chain.md +3 -7
  196. package/gsd-core/workflows/discuss-phase/modes/text.md +1 -1
  197. package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +1 -3
  198. package/gsd-core/workflows/discuss-phase-assumptions.md +2 -2
  199. package/gsd-core/workflows/discuss-phase.md +1 -1
  200. package/gsd-core/workflows/do.md +3 -6
  201. package/gsd-core/workflows/docs-update.md +5 -4
  202. package/gsd-core/workflows/edit-phase.md +1 -1
  203. package/gsd-core/workflows/eval-review.md +4 -9
  204. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +1 -1
  205. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +113 -11
  206. package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +1 -1
  207. package/gsd-core/workflows/execute-phase/steps/partial-wave.md +1 -1
  208. package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
  209. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +22 -4
  210. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +2 -2
  211. package/gsd-core/workflows/execute-phase/steps/protected-branch.md +21 -0
  212. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +2 -2
  213. package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +39 -0
  214. package/gsd-core/workflows/execute-phase.md +38 -54
  215. package/gsd-core/workflows/execute-plan.md +17 -12
  216. package/gsd-core/workflows/explore.md +1 -1
  217. package/gsd-core/workflows/extract-learnings.md +1 -1
  218. package/gsd-core/workflows/fast.md +2 -2
  219. package/gsd-core/workflows/forensics.md +1 -1
  220. package/gsd-core/workflows/graduation.md +5 -5
  221. package/gsd-core/workflows/health.md +3 -6
  222. package/gsd-core/workflows/import.md +14 -11
  223. package/gsd-core/workflows/inbox.md +4 -5
  224. package/gsd-core/workflows/ingest-docs.md +44 -11
  225. package/gsd-core/workflows/insert-phase.md +5 -5
  226. package/gsd-core/workflows/list-seeds.md +5 -3
  227. package/gsd-core/workflows/list-workspaces.md +1 -1
  228. package/gsd-core/workflows/manager.md +12 -23
  229. package/gsd-core/workflows/map-codebase.md +1 -1
  230. package/gsd-core/workflows/milestone-summary.md +1 -1
  231. package/gsd-core/workflows/mvp-phase.md +2 -2
  232. package/gsd-core/workflows/new-milestone.md +9 -21
  233. package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
  234. package/gsd-core/workflows/new-project.md +12 -26
  235. package/gsd-core/workflows/new-workspace.md +1 -1
  236. package/gsd-core/workflows/next.md +2 -2
  237. package/gsd-core/workflows/pause-work.md +1 -1
  238. package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +1 -1
  239. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +1 -1
  240. package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +2 -4
  241. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +3 -3
  242. package/gsd-core/workflows/plan-phase.md +121 -42
  243. package/gsd-core/workflows/plan-review-convergence.md +46 -9
  244. package/gsd-core/workflows/plant-seed.md +2 -2
  245. package/gsd-core/workflows/pr-branch.md +187 -51
  246. package/gsd-core/workflows/profile-user.md +16 -14
  247. package/gsd-core/workflows/progress.md +27 -12
  248. package/gsd-core/workflows/quick/steps/discussion-phase.md +1 -3
  249. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +1 -3
  250. package/gsd-core/workflows/quick/steps/quick-verification.md +2 -4
  251. package/gsd-core/workflows/quick/steps/research-phase.md +2 -4
  252. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +3 -3
  253. package/gsd-core/workflows/quick.md +20 -29
  254. package/gsd-core/workflows/remove-phase.md +4 -4
  255. package/gsd-core/workflows/remove-workspace.md +2 -2
  256. package/gsd-core/workflows/resume-project.md +8 -12
  257. package/gsd-core/workflows/review.md +193 -15
  258. package/gsd-core/workflows/scan.md +1 -1
  259. package/gsd-core/workflows/secure-phase.md +2 -2
  260. package/gsd-core/workflows/settings-advanced.md +7 -9
  261. package/gsd-core/workflows/settings-integrations.md +64 -31
  262. package/gsd-core/workflows/settings.md +3 -5
  263. package/gsd-core/workflows/ship.md +12 -6
  264. package/gsd-core/workflows/sketch-wrap-up.md +11 -17
  265. package/gsd-core/workflows/sketch.md +12 -18
  266. package/gsd-core/workflows/smart-entry.md +3 -5
  267. package/gsd-core/workflows/spec-phase.md +23 -1
  268. package/gsd-core/workflows/spike-wrap-up.md +7 -11
  269. package/gsd-core/workflows/spike.md +20 -31
  270. package/gsd-core/workflows/stats.md +2 -2
  271. package/gsd-core/workflows/sync-skills.md +1 -1
  272. package/gsd-core/workflows/thread.md +11 -7
  273. package/gsd-core/workflows/transition.md +5 -5
  274. package/gsd-core/workflows/ui-phase.md +10 -16
  275. package/gsd-core/workflows/ui-review.md +6 -10
  276. package/gsd-core/workflows/ultraplan-phase.md +5 -13
  277. package/gsd-core/workflows/undo.md +8 -16
  278. package/gsd-core/workflows/update.md +6 -10
  279. package/gsd-core/workflows/validate-phase.md +2 -2
  280. package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +25 -1
  281. package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +1 -1
  282. package/gsd-core/workflows/verify-work.md +57 -18
  283. package/hooks/dist/gsd-agent-isolation-guard.js +77 -38
  284. package/hooks/dist/gsd-config-reload.js +18 -12
  285. package/hooks/dist/gsd-context-monitor.js +19 -10
  286. package/hooks/dist/gsd-cursor-post-tool.js +3 -1
  287. package/hooks/dist/gsd-cursor-pre-tool.js +3 -1
  288. package/hooks/dist/gsd-cursor-session-start.js +2 -1
  289. package/hooks/dist/gsd-cursor-stop.js +2 -1
  290. package/hooks/dist/gsd-cursor-subagent-start.js +28 -23
  291. package/hooks/dist/gsd-cursor-subagent-stop.js +3 -1
  292. package/hooks/dist/gsd-ensure-canonical-path.js +2 -1
  293. package/hooks/dist/gsd-graphify-update.sh +22 -18
  294. package/hooks/dist/gsd-node-runner.sh +76 -0
  295. package/hooks/dist/gsd-phase-boundary.sh +1 -0
  296. package/hooks/dist/gsd-prompt-guard.js +16 -7
  297. package/hooks/dist/gsd-read-guard.js +16 -7
  298. package/hooks/dist/gsd-read-injection-scanner.js +17 -8
  299. package/hooks/dist/gsd-session-state.sh +1 -0
  300. package/hooks/dist/gsd-statusline.js +215 -26
  301. package/hooks/dist/gsd-validate-commit.sh +80 -6
  302. package/hooks/dist/gsd-windsurf-pre-command.js +16 -11
  303. package/hooks/dist/gsd-windsurf-pre-write.js +22 -13
  304. package/hooks/dist/gsd-workflow-guard.js +34 -16
  305. package/hooks/dist/gsd-worktree-path-guard.js +36 -21
  306. package/hooks/dist/gsd-write-guard.js +35 -25
  307. package/hooks/dist/lib/cli-exit.js +560 -0
  308. package/hooks/dist/lib/exit-code-registry.js +98 -0
  309. package/hooks/dist/lib/git-probe.js +84 -0
  310. package/hooks/dist/lib/hook-exit.js +81 -0
  311. package/hooks/dist/managed-hooks-registry.cjs +3 -0
  312. package/hooks/gsd-agent-isolation-guard.js +77 -38
  313. package/hooks/gsd-config-reload.js +18 -12
  314. package/hooks/gsd-context-monitor.js +19 -10
  315. package/hooks/gsd-cursor-post-tool.js +3 -1
  316. package/hooks/gsd-cursor-pre-tool.js +3 -1
  317. package/hooks/gsd-cursor-session-start.js +2 -1
  318. package/hooks/gsd-cursor-stop.js +2 -1
  319. package/hooks/gsd-cursor-subagent-start.js +28 -23
  320. package/hooks/gsd-cursor-subagent-stop.js +3 -1
  321. package/hooks/gsd-ensure-canonical-path.js +2 -1
  322. package/hooks/gsd-graphify-update.sh +22 -18
  323. package/hooks/gsd-node-runner.sh +76 -0
  324. package/hooks/gsd-phase-boundary.sh +1 -0
  325. package/hooks/gsd-prompt-guard.js +16 -7
  326. package/hooks/gsd-read-guard.js +16 -7
  327. package/hooks/gsd-read-injection-scanner.js +17 -8
  328. package/hooks/gsd-session-state.sh +1 -0
  329. package/hooks/gsd-statusline.js +215 -26
  330. package/hooks/gsd-validate-commit.sh +80 -6
  331. package/hooks/gsd-windsurf-pre-command.js +16 -11
  332. package/hooks/gsd-windsurf-pre-write.js +22 -13
  333. package/hooks/gsd-workflow-guard.js +34 -16
  334. package/hooks/gsd-worktree-path-guard.js +36 -21
  335. package/hooks/gsd-write-guard.js +35 -25
  336. package/hooks/lib/cli-exit.js +560 -0
  337. package/hooks/lib/exit-code-registry.js +98 -0
  338. package/hooks/lib/git-probe.js +84 -0
  339. package/hooks/lib/hook-exit.js +81 -0
  340. package/hooks/managed-hooks-registry.cjs +3 -0
  341. package/package.json +12 -7
  342. package/scripts/base64-scan.sh +74 -12
  343. package/scripts/build-hooks.js +5 -0
  344. package/scripts/check-glossary-refs.cjs +77 -15
  345. package/scripts/check-mutation-score-ratchet.cjs +156 -0
  346. package/scripts/ci-check-job-near-cap.cjs +49 -0
  347. package/scripts/ci-pr-mergeability.cjs +262 -0
  348. package/scripts/ci-test-scope.cjs +45 -12
  349. package/scripts/ci-timeout-report.cjs +230 -0
  350. package/scripts/docs-guard-registry.cjs +396 -0
  351. package/scripts/gen-capability-registry.cjs +8 -6
  352. package/scripts/gen-exit-code-docs.cjs +318 -0
  353. package/scripts/gen-exit-code-registry.cjs +891 -0
  354. package/scripts/gen-features.cjs +836 -0
  355. package/scripts/gen-hooks-cli-exit.cjs +239 -0
  356. package/scripts/gen-install-tree-fixtures.cjs +2 -2
  357. package/scripts/gen-loop-host-contract.cjs +134 -1
  358. package/scripts/gen-scripts-cli-exit.cjs +185 -0
  359. package/scripts/gen-state-md-docs.cjs +727 -0
  360. package/scripts/{test-failure-reasons.cjs → gsd-test-gate-reasons.cjs} +6 -0
  361. package/scripts/lib/ci-job-timing.cjs +72 -0
  362. package/scripts/lib/cli-exit.cjs +546 -44
  363. package/scripts/lib/drift-scan.cjs +32 -2
  364. package/scripts/lib/exit-code-registry.cjs +98 -0
  365. package/scripts/lib/ndjson-reporter.cjs +119 -0
  366. package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
  367. package/scripts/lint-docs-guard-registration.cjs +495 -0
  368. package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +193 -0
  369. package/scripts/lint-eslint-glob-coverage.allowlist.json +4 -0
  370. package/scripts/{lint-fix-has-regression-test.cjs → lint-fix-has-regression-tests.cjs} +12 -6
  371. package/scripts/lint-health-diagnostic-rule-table.cjs +65 -8
  372. package/scripts/lint-mutation-test-derivation-drift.cjs +86 -0
  373. package/scripts/lint-phase-enumeration-drift.cjs +21 -8
  374. package/scripts/lint-planning-prompt-drift.cjs +38 -1
  375. package/scripts/lint-removed-but-needed.cjs +184 -16
  376. package/scripts/lint-seam-enforcement.cjs +182 -0
  377. package/scripts/lint-slug-derivation-drift.cjs +921 -0
  378. package/scripts/lint-source-test-name-collision.cjs +241 -0
  379. package/scripts/lint-state-write-path-drift.cjs +337 -432
  380. package/scripts/lint-test-file-count.allowlist.json +122 -4
  381. package/scripts/lint-test-file-count.cjs +25 -3
  382. package/scripts/lint-unreachable-guard-drift.cjs +51 -64
  383. package/scripts/lint-vendored-deps.cjs +208 -35
  384. package/scripts/mutation-matrix.cjs +599 -50
  385. package/scripts/prompt-injection-scan.sh +75 -14
  386. package/scripts/secret-scan.sh +75 -13
  387. package/scripts/select-docs-guards.cjs +56 -0
  388. package/scripts/sync-runtime-launcher.cjs +22 -3
  389. package/skills/gsd-discuss-phase/SKILL.md +1 -1
  390. package/skills/gsd-import/SKILL.md +1 -1
  391. package/skills/gsd-quick/SKILL.md +8 -4
  392. package/vscode/package.json +1 -1
  393. package/bin/lib/ui-safety-gate.cjs +0 -109
  394. package/scripts/lint-emitted-drift-ack.cjs +0 -344
  395. package/scripts/state-write-path-drift-baseline.json +0 -19
@@ -29,7 +29,7 @@ const roadmapParserMod = require("./roadmap-parser.cjs");
29
29
  const { getMilestoneInfo, extractCurrentMilestone } = roadmapParserMod;
30
30
  // eslint-disable-next-line @typescript-eslint/no-require-imports
31
31
  const phaseLocatorMod = require("./phase-locator.cjs");
32
- const { listMilestonePhaseDirs } = phaseLocatorMod;
32
+ const { listMilestonePhaseDirs, listAllPhaseDirs } = phaseLocatorMod;
33
33
  // eslint-disable-next-line @typescript-eslint/no-require-imports
34
34
  const verificationMod = require("./verification.cjs");
35
35
  const { isPhaseComplete } = verificationMod;
@@ -666,21 +666,25 @@ function buildPlanningRootFilesField(cwd) {
666
666
  * `phaseDirs` cannot). An absent `phases/` root is a real empty, not a
667
667
  * failure (mirrors `listMilestonePhaseDirs`'s own treatment); a present but
668
668
  * unreadable root degrades to `UNREADABLE` with an empty list.
669
+ *
670
+ * #3882 (ADR-3473 §8.3): delegates the actual disk scan to
671
+ * `listAllPhaseDirs(phasesDir, {includeSentinels: true})` — that function is
672
+ * the sole owner of "readdirSync the phases/ root, map to dir names, handle
673
+ * absent-vs-unreadable"; this field is one more consumer of that scan, not a
674
+ * second implementation of it. The two functions previously duplicated the
675
+ * same readdirSync + filter + map + absent/unreadable handling, which is
676
+ * exactly the defect class ADR-3473 §8.3 forbids.
677
+ *
678
+ * The RE-SORT below is deliberate, not leftover duplication:
679
+ * `listAllPhaseDirs` orders its `value` by `comparePhaseNum` (numeric phase
680
+ * order — its own documented contract), but `allPhaseDirNames`'s existing,
681
+ * externally-observable order is plain lexicographic `.sort()`, and W007's
682
+ * consumers depend on that order today. Re-sorting here preserves that
683
+ * contract without forking the underlying scan.
669
684
  */
670
685
  function buildAllPhaseDirNamesField(phasesDir) {
671
- if (!node_fs_1.default.existsSync(phasesDir))
672
- return { value: [], scope: SCOPE.COMPLETE };
673
- try {
674
- const value = node_fs_1.default
675
- .readdirSync(phasesDir, { withFileTypes: true })
676
- .filter((e) => e.isDirectory())
677
- .map((e) => e.name)
678
- .sort();
679
- return { value, scope: SCOPE.COMPLETE };
680
- }
681
- catch {
682
- return { value: [], scope: SCOPE.UNREADABLE };
683
- }
686
+ const { value, scope } = listAllPhaseDirs(phasesDir, { includeSentinels: true });
687
+ return { value: value.slice().sort(), scope };
684
688
  }
685
689
  /**
686
690
  * Resolve `archivedPhaseTokens` — every phase-number token belonging to a
@@ -120,6 +120,61 @@ function planningDir(cwd, ws, project) {
120
120
  function planningRoot(cwd) {
121
121
  return node_path_1.default.join(cwd, '.planning');
122
122
  }
123
+ /**
124
+ * #3972: the ONE owner of "is this planning scope opted out of worktrees?" —
125
+ * the effective `workflow.use_worktrees === false` read every
126
+ * isolation-deciding surface must share (config-get's merged view is the
127
+ * contract). Ladder: the scoped config's OWN key wins (planningDir is
128
+ * project- and workstream-aware); otherwise the flat root's key, but only
129
+ * under the GSD_WORKSTREAM env gate — config-get deliberately does NOT
130
+ * inherit root under GSD_PROJECT alone, and this read must not diverge
131
+ * (#3963). Strict `=== false` (never coerced); any read failure degrades to
132
+ * "not opted out" (worktrees on — the fail-safe direction: the guard keeps
133
+ * enforcing). Direct file reads only — never loadConfig, which normalizes
134
+ * and rewrites config on paths that back sentinel writes.
135
+ */
136
+ function worktreesOptedOut(cwd) {
137
+ // #3972 review: the WHOLE body is guarded — planningDir/planningRoot
138
+ // themselves throw on a GSD_PROJECT/GSD_WORKSTREAM value containing path
139
+ // separators or `..`, and this contract ("any failure degrades to not
140
+ // opted out — worktrees on, keep enforcing") must hold for that shape too.
141
+ try {
142
+ return worktreesOptedOutUnguarded(cwd);
143
+ }
144
+ catch {
145
+ return false;
146
+ }
147
+ }
148
+ function worktreesOptedOutUnguarded(cwd) {
149
+ const readCfg = (p) => {
150
+ try {
151
+ return JSON.parse(String(node_fs_1.default.readFileSync(p, 'utf8')));
152
+ }
153
+ catch {
154
+ return null;
155
+ }
156
+ };
157
+ const ownKey = (cfg) => {
158
+ if (cfg === null || typeof cfg !== 'object')
159
+ return { present: false, value: undefined };
160
+ const wf = cfg.workflow;
161
+ if (wf === null || typeof wf !== 'object' || Array.isArray(wf))
162
+ return { present: false, value: undefined };
163
+ const wfRec = wf;
164
+ return Object.prototype.hasOwnProperty.call(wfRec, 'use_worktrees')
165
+ ? { present: true, value: wfRec['use_worktrees'] }
166
+ : { present: false, value: undefined };
167
+ };
168
+ const scoped = ownKey(readCfg(node_path_1.default.join(planningDir(cwd), 'config.json')));
169
+ if (scoped.present)
170
+ return scoped.value === false;
171
+ if (process.env['GSD_WORKSTREAM']) {
172
+ const root = ownKey(readCfg(node_path_1.default.join(planningRoot(cwd), 'config.json')));
173
+ if (root.present)
174
+ return root.value === false;
175
+ }
176
+ return false;
177
+ }
123
178
  // Sorted list of workstream directory names under `<root>/.planning/workstreams`,
124
179
  // or `[]` when the project is flat (no workstreams dir). Single source of truth
125
180
  // for the "workstream mode" detection shared by the #1912/#2028 fail-safe guards
@@ -431,6 +486,7 @@ function findContextMdIn(absDirOrFiles) {
431
486
  }
432
487
  }
433
488
  module.exports = {
489
+ worktreesOptedOut,
434
490
  createPlanningWorkspace,
435
491
  createSharedPointerAdapter,
436
492
  createSessionScopedPointerAdapter,
@@ -43,6 +43,9 @@ exports.projectTruths = projectTruths;
43
43
  exports.dispositionForUnverifiableTruth = dispositionForUnverifiableTruth;
44
44
  exports.runProbeCli = runProbeCli;
45
45
  const node_fs_1 = __importDefault(require("node:fs"));
46
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
47
+ const cliExitModule = require("./cli-exit.cjs");
48
+ const { ExitError } = cliExitModule;
46
49
  /** The LOCKED set of valid lifecycle statuses (the re-cut: no covered/backstop). */
47
50
  exports.VALID_STATUS = ['resolved', 'dismissed', 'unresolved'];
48
51
  function errMessage(e) {
@@ -497,7 +500,7 @@ function runProbeCli(analyze, options) {
497
500
  const readFile = options.readFile ?? ((p) => node_fs_1.default.readFileSync(p, 'utf8'));
498
501
  const write = options.write ?? ((s) => { process.stdout.write(s); });
499
502
  const writeErr = options.writeErr ?? ((s) => { process.stderr.write(s); });
500
- const exit = options.exit ?? ((code) => { process.exit(code); });
503
+ const exit = options.exit ?? ((code) => { throw new ExitError(code); });
501
504
  const reqPath = argv[2];
502
505
  const resPath = argv[3];
503
506
  if (!reqPath) {
@@ -13,12 +13,55 @@
13
13
  * Async note: cmdExtractMessages and cmdProfileSample are async functions.
14
14
  * dispatchCapabilityCommand (gsd-tools.cjs:366-371) explicitly errors if a
15
15
  * router returns a Promise. Therefore these router functions call the async
16
- * function WITHOUT await and WITHOUT returning the Promise. The async functions
17
- * end with output() or process.exit() so the process terminates correctly once
18
- * the event loop drains. Unhandled rejections are caught by the .catch() wrapper
19
- * to surface errors via the error() callback.
16
+ * function WITHOUT await and WITHOUT returning the Promise; the event loop
17
+ * drains once the returned promise settles. Since ADR-3889 (#3910), the
18
+ * pipeline functions terminate by THROWING ExitError (never process.exit()
19
+ * directly), so a rejection surfacing here can carry either a genuine error
20
+ * OR a declared ExitError termination — the `.catch()` below must
21
+ * distinguish them: an ExitError sets process.exitCode directly (mirroring
22
+ * cli-exit.cjs's own runMain, the only other place ExitError is caught),
23
+ * while any other rejection is surfaced via the `error()` callback exactly
24
+ * as before. Calling `error(exitErr.message)` for an ExitError would be
25
+ * wrong on two counts: it discards the real exit code (error() always
26
+ * terminates at 1) and it re-derives a message from ExitError's generic
27
+ * "process exit N" constructor default rather than the (already emitted, or
28
+ * intentionally absent) stderr output the throwing call site controls.
20
29
  */
21
- const { ERROR_REASON } = require('./io.cjs');
30
+ const { ERROR_REASON, getJsonErrorMode } = require('./io.cjs');
31
+ const { ExitError } = require('./cli-exit.cjs');
32
+
33
+ /**
34
+ * Interpret a rejection from a fire-and-forget async pipeline call: an
35
+ * ExitError sets process.exitCode (and, for a non-zero code carrying a user
36
+ * message, writes it to stderr) exactly like runMain does; anything else
37
+ * reproduces io.cjs's error() stderr output byte-for-byte and sets
38
+ * process.exitCode directly instead of calling error() itself.
39
+ *
40
+ * error() (src/io.cts) is `never`-typed: it always throws ExitError(1) after
41
+ * writing to stderr. Calling it from inside this `.catch()` callback would
42
+ * throw from a detached promise chain that nothing awaits or re-catches —
43
+ * an unhandled promise rejection that Node (>=15, this repo's
44
+ * engines.node >= 24 default is --unhandled-rejections=throw) dumps as a
45
+ * raw stack trace on top of the clean line error() already wrote. Writing
46
+ * the same bytes directly and setting process.exitCode = 1 in place gets
47
+ * the identical observable stderr + exit code without ever throwing here.
48
+ */
49
+ function _handlePipelineRejection(e, error) {
50
+ void error;
51
+ if (e instanceof ExitError) {
52
+ if (e.hasUserMessage && e.code !== 0) process.stderr.write(`${e.message}\n`);
53
+ process.exitCode = e.code;
54
+ return;
55
+ }
56
+ const message = e && e.message ? e.message : String(e);
57
+ if (getJsonErrorMode()) {
58
+ const payload = JSON.stringify({ ok: false, reason: ERROR_REASON.UNKNOWN, message }) + '\n';
59
+ process.stderr.write(payload);
60
+ } else {
61
+ process.stderr.write('Error: ' + message + '\n');
62
+ }
63
+ process.exitCode = 1;
64
+ }
22
65
 
23
66
  // ─── Pipeline phase commands ───────────────────────────────────────────────────
24
67
 
@@ -51,7 +94,7 @@ function routeExtractMessages({ args, cwd, raw, error, _pipeline }) {
51
94
  // The function ends with output() or process.exit(); the event loop will drain.
52
95
  void cwd;
53
96
  p.cmdExtractMessages(projectArg, { sessionId, limit }, raw, sessionsPath)
54
- .catch(e => { error(e && e.message ? e.message : String(e)); });
97
+ .catch(e => { _handlePipelineRejection(e, error); });
55
98
  }
56
99
 
57
100
  function routeProfileSample({ args, cwd, raw, error, _pipeline }) {
@@ -67,7 +110,7 @@ function routeProfileSample({ args, cwd, raw, error, _pipeline }) {
67
110
  const maxChars = maxCharsIdx !== -1 ? parseInt(args[maxCharsIdx + 1], 10) : 500;
68
111
  // cmdProfileSample is async — do NOT return the Promise.
69
112
  p.cmdProfileSample(sessionsPath, { limit, maxPerProject, maxChars }, raw)
70
- .catch(e => { error(e && e.message ? e.message : String(e)); });
113
+ .catch(e => { _handlePipelineRejection(e, error); });
71
114
  }
72
115
 
73
116
  // ─── Output phase commands ─────────────────────────────────────────────────────
@@ -22,6 +22,9 @@ const node_readline_1 = __importDefault(require("node:readline"));
22
22
  // eslint-disable-next-line @typescript-eslint/no-require-imports
23
23
  const ioModule = require("./io.cjs");
24
24
  const { output, error, reapStaleTempFiles, ensureGsdTempDir, GSD_TEMP_DIR } = ioModule;
25
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
26
+ const cliExitModule = require("./cli-exit.cjs");
27
+ const { ExitError } = cliExitModule;
25
28
  // ─── Session I/O Helpers ──────────────────────────────────────────────────────
26
29
  function getSessionsDir(overridePath) {
27
30
  const dir = overridePath || node_path_1.default.join(node_os_1.default.homedir(), '.claude', 'projects');
@@ -250,7 +253,7 @@ function cmdScanSessions(overridePath, options, raw) {
250
253
  }
251
254
  }
252
255
  process.stdout.write(`\nTotal: ${projects.length} projects\n`);
253
- process.exit(0);
256
+ throw new ExitError(0);
254
257
  }
255
258
  }
256
259
  async function cmdExtractMessages(projectArg, options, raw, overridePath) {
@@ -376,11 +379,11 @@ async function cmdExtractMessages(projectArg, options, raw, overridePath) {
376
379
  };
377
380
  if (sessionsSkipped > 0 && sessionsProcessed > 0) {
378
381
  process.stdout.write(JSON.stringify(result, null, 2));
379
- process.exit(2);
382
+ throw new ExitError(2);
380
383
  }
381
384
  else if (sessionsProcessed === 0 && sessionsSkipped > 0) {
382
385
  process.stdout.write(JSON.stringify(result, null, 2));
383
- process.exit(1);
386
+ throw new ExitError(1);
384
387
  }
385
388
  else {
386
389
  output(result, raw, undefined);