@opengsd/gsd-core 1.14.0 → 1.16.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 (551) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.opencode/plugins/gsd-core.js +85 -5
  4. package/README.ja-JP.md +3 -3
  5. package/README.ko-KR.md +3 -3
  6. package/README.pt-BR.md +3 -3
  7. package/README.zh-CN.md +3 -3
  8. package/agents/gsd-code-fixer.compact.md +7 -6
  9. package/agents/gsd-code-fixer.md +9 -8
  10. package/agents/gsd-code-reviewer.compact.md +5 -3
  11. package/agents/gsd-code-reviewer.md +8 -6
  12. package/agents/gsd-debug-session-manager.compact.md +17 -2
  13. package/agents/gsd-debug-session-manager.md +17 -2
  14. package/agents/gsd-debugger.md +3 -3
  15. package/agents/gsd-eval-auditor.compact.md +1 -1
  16. package/agents/gsd-eval-auditor.md +1 -1
  17. package/agents/gsd-executor.md +17 -12
  18. package/agents/gsd-intel-updater.compact.md +1 -1
  19. package/agents/gsd-intel-updater.md +1 -1
  20. package/agents/gsd-mempalace-curator.md +2 -2
  21. package/agents/gsd-phase-researcher.md +19 -11
  22. package/agents/gsd-plan-checker.md +15 -9
  23. package/agents/gsd-planner.md +15 -11
  24. package/agents/gsd-project-researcher.compact.md +1 -1
  25. package/agents/gsd-project-researcher.md +1 -1
  26. package/agents/gsd-research-synthesizer.compact.md +1 -1
  27. package/agents/gsd-research-synthesizer.md +1 -1
  28. package/agents/gsd-ui-auditor.compact.md +21 -30
  29. package/agents/gsd-ui-auditor.md +166 -37
  30. package/agents/gsd-ui-researcher.compact.md +1 -1
  31. package/agents/gsd-ui-researcher.md +1 -1
  32. package/agents/gsd-verifier.md +37 -14
  33. package/bin/install.js +764 -287
  34. package/commands/gsd/add-tests.md +6 -1
  35. package/commands/gsd/ai-integration-phase.md +6 -1
  36. package/commands/gsd/audit-fix.md +5 -0
  37. package/commands/gsd/audit-milestone.md +6 -1
  38. package/commands/gsd/autonomous.md +7 -2
  39. package/commands/gsd/capture.md +9 -5
  40. package/commands/gsd/code-review.md +7 -2
  41. package/commands/gsd/complete-milestone.md +4 -0
  42. package/commands/gsd/config.md +7 -3
  43. package/commands/gsd/debug.md +11 -7
  44. package/commands/gsd/discuss-phase.md +7 -3
  45. package/commands/gsd/docs-update.md +12 -7
  46. package/commands/gsd/eval-review.md +6 -1
  47. package/commands/gsd/execute-phase.md +12 -7
  48. package/commands/gsd/extract-learnings.md +5 -0
  49. package/commands/gsd/fast.md +4 -0
  50. package/commands/gsd/forensics.md +5 -1
  51. package/commands/gsd/graphify.md +10 -6
  52. package/commands/gsd/health.md +5 -0
  53. package/commands/gsd/help.md +7 -2
  54. package/commands/gsd/import.md +7 -3
  55. package/commands/gsd/inbox.md +5 -0
  56. package/commands/gsd/ingest-docs.md +5 -1
  57. package/commands/gsd/manager.md +6 -1
  58. package/commands/gsd/map-codebase.md +7 -3
  59. package/commands/gsd/mempalace-capture.md +12 -4
  60. package/commands/gsd/mempalace-recall.md +5 -1
  61. package/commands/gsd/milestone-summary.md +5 -1
  62. package/commands/gsd/mvp-phase.md +8 -3
  63. package/commands/gsd/new-milestone.md +6 -1
  64. package/commands/gsd/new-project.md +5 -0
  65. package/commands/gsd/next.md +6 -1
  66. package/commands/gsd/ns-context.md +4 -0
  67. package/commands/gsd/ns-ideate.md +4 -0
  68. package/commands/gsd/ns-manage.md +4 -0
  69. package/commands/gsd/ns-project.md +4 -0
  70. package/commands/gsd/ns-review.md +4 -0
  71. package/commands/gsd/ns-workflow.md +4 -0
  72. package/commands/gsd/onboard.md +6 -1
  73. package/commands/gsd/pause-work.md +5 -1
  74. package/commands/gsd/phase.md +8 -4
  75. package/commands/gsd/plan-phase.md +6 -1
  76. package/commands/gsd/plan-review-convergence.md +11 -7
  77. package/commands/gsd/pr-branch.md +4 -0
  78. package/commands/gsd/profile-user.md +5 -1
  79. package/commands/gsd/progress.md +7 -2
  80. package/commands/gsd/quick-batch.md +21 -9
  81. package/commands/gsd/quick.md +12 -7
  82. package/commands/gsd/review.md +7 -4
  83. package/commands/gsd/secure-phase.md +6 -1
  84. package/commands/gsd/ship.md +5 -0
  85. package/commands/gsd/sketch.md +7 -2
  86. package/commands/gsd/spec-phase.md +5 -1
  87. package/commands/gsd/spike.md +8 -3
  88. package/commands/gsd/surface.md +5 -1
  89. package/commands/gsd/thread.md +4 -0
  90. package/commands/gsd/ui-phase.md +6 -1
  91. package/commands/gsd/ui-review.md +6 -1
  92. package/commands/gsd/ultraplan-phase.md +5 -1
  93. package/commands/gsd/undo.md +5 -1
  94. package/commands/gsd/update.md +6 -2
  95. package/commands/gsd/validate-phase.md +6 -1
  96. package/commands/gsd/verify-work.md +6 -1
  97. package/commands/gsd/workspace.md +7 -3
  98. package/gsd-core/bin/gsd-tools.cjs +477 -78
  99. package/gsd-core/bin/lib/active-workstream-store.cjs +15 -0
  100. package/gsd-core/bin/lib/adr-parser.cjs +3 -1
  101. package/gsd-core/bin/lib/agent-install-check.cjs +4 -1
  102. package/gsd-core/bin/lib/audit.cjs +144 -42
  103. package/gsd-core/bin/lib/broken-windows.cjs +13 -13
  104. package/gsd-core/bin/lib/capability-activation.cjs +9 -4
  105. package/gsd-core/bin/lib/capability-registry.cjs +197 -222
  106. package/gsd-core/bin/lib/capability-validator.cjs +16 -1
  107. package/gsd-core/bin/lib/check-auto-mode.cjs +35 -0
  108. package/gsd-core/bin/lib/check-command-router.cjs +164 -1625
  109. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +13 -2
  110. package/gsd-core/bin/lib/cli-exit.cjs +12 -0
  111. package/gsd-core/bin/lib/codex-agent-toml.cjs +32 -33
  112. package/gsd-core/bin/lib/command-aliases.cjs +7 -0
  113. package/gsd-core/bin/lib/command-routing-hub.cjs +48 -1
  114. package/gsd-core/bin/lib/commands.cjs +343 -207
  115. package/gsd-core/bin/lib/complexity-trigger.cjs +8 -7
  116. package/gsd-core/bin/lib/config-loader.cjs +65 -4
  117. package/gsd-core/bin/lib/config.cjs +76 -19
  118. package/gsd-core/bin/lib/core-utils.cjs +6 -1
  119. package/gsd-core/bin/lib/coverage.cjs +4 -8
  120. package/gsd-core/bin/lib/decision-coverage-support.cjs +259 -0
  121. package/gsd-core/bin/lib/decisions.cjs +30 -14
  122. package/gsd-core/bin/lib/drift.cjs +177 -42
  123. package/gsd-core/bin/lib/frontmatter-fence.cjs +90 -0
  124. package/gsd-core/bin/lib/frontmatter-splice.cjs +494 -0
  125. package/gsd-core/bin/lib/frontmatter.cjs +426 -234
  126. package/gsd-core/bin/lib/gap-checker.cjs +72 -29
  127. package/gsd-core/bin/lib/gate-api-coverage-verify-pre.cjs +381 -0
  128. package/gsd-core/bin/lib/gate-args.cjs +53 -0
  129. package/gsd-core/bin/lib/gate-codebase-drift.cjs +285 -0
  130. package/gsd-core/bin/lib/gate-config.cjs +46 -0
  131. package/gsd-core/bin/lib/gate-context-drift.cjs +141 -0
  132. package/gsd-core/bin/lib/gate-decision-coverage-plan.cjs +169 -0
  133. package/gsd-core/bin/lib/gate-decision-coverage-verify.cjs +126 -0
  134. package/gsd-core/bin/lib/gate-evaluation-scope.cjs +555 -0
  135. package/gsd-core/bin/lib/gate-evidence.cjs +138 -0
  136. package/gsd-core/bin/lib/gate-exit.cjs +27 -0
  137. package/gsd-core/bin/lib/gate-gap-analysis-plan-post.cjs +61 -0
  138. package/gsd-core/bin/lib/gate-phase-context.cjs +170 -0
  139. package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +1 -1
  140. package/gsd-core/bin/lib/gate-predicate.cjs +165 -0
  141. package/gsd-core/bin/lib/gate-prohibition-enforcement.cjs +94 -0
  142. package/gsd-core/bin/lib/gate-schema-drift.cjs +165 -0
  143. package/gsd-core/bin/lib/gate-tdd-red-evidence.cjs +100 -0
  144. package/gsd-core/bin/lib/gate-tdd-review-checkpoint.cjs +182 -0
  145. package/gsd-core/bin/lib/gate-ui-plan.cjs +86 -0
  146. package/gsd-core/bin/lib/gate-ui-safety.cjs +80 -0
  147. package/gsd-core/bin/lib/gate-verdict.cjs +64 -0
  148. package/gsd-core/bin/lib/gate-verify-command-paths.cjs +78 -0
  149. package/gsd-core/bin/lib/gate-verify-failure-directions.cjs +41 -0
  150. package/gsd-core/bin/lib/graphify.cjs +10 -2
  151. package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +43 -47
  152. package/gsd-core/bin/lib/health-diagnostic.cjs +45 -8
  153. package/gsd-core/bin/lib/host-runtime-detection.cjs +9 -0
  154. package/gsd-core/bin/lib/init.cjs +364 -132
  155. package/gsd-core/bin/lib/install-engine.cjs +30 -33
  156. package/gsd-core/bin/lib/install-profiles.cjs +7 -4
  157. package/gsd-core/bin/lib/installer-migrations.cjs +8 -1
  158. package/gsd-core/bin/lib/io.cjs +122 -3
  159. package/gsd-core/bin/lib/loop-resolver.cjs +95 -0
  160. package/gsd-core/bin/lib/markdown-sectionizer.cjs +75 -1
  161. package/gsd-core/bin/lib/milestone.cjs +37 -6
  162. package/gsd-core/bin/lib/model-resolver.cjs +171 -62
  163. package/gsd-core/bin/lib/observability/event.cjs +1 -1
  164. package/gsd-core/bin/lib/observability/logger.cjs +46 -1
  165. package/gsd-core/bin/lib/pattern.cjs +10 -0
  166. package/gsd-core/bin/lib/phase-command-router.cjs +20 -5
  167. package/gsd-core/bin/lib/phase-estimation.cjs +5 -4
  168. package/gsd-core/bin/lib/phase-id-card.cjs +32 -0
  169. package/gsd-core/bin/lib/phase-id-display.cjs +78 -0
  170. package/gsd-core/bin/lib/phase-id.cjs +110 -8
  171. package/gsd-core/bin/lib/phase-lifecycle.cjs +9 -2
  172. package/gsd-core/bin/lib/phase-locator.cjs +29 -10
  173. package/gsd-core/bin/lib/phase-status.cjs +360 -0
  174. package/gsd-core/bin/lib/phase.cjs +489 -88
  175. package/gsd-core/bin/lib/plan-document.cjs +142 -20
  176. package/gsd-core/bin/lib/plan-drift-guard.cjs +5 -0
  177. package/gsd-core/bin/lib/planning-document.cjs +692 -0
  178. package/gsd-core/bin/lib/planning-inspect.cjs +60 -9
  179. package/gsd-core/bin/lib/planning-snapshot.cjs +18 -0
  180. package/gsd-core/bin/lib/planning-workspace.cjs +83 -55
  181. package/gsd-core/bin/lib/pr-branch-patterns.cjs +57 -0
  182. package/gsd-core/bin/lib/pristine-baseline.cjs +10 -0
  183. package/gsd-core/bin/lib/probe-core.cjs +7 -1
  184. package/gsd-core/bin/lib/profile-output.cjs +6 -3
  185. package/gsd-core/bin/lib/prohibition-enforcement.cjs +0 -55
  186. package/gsd-core/bin/lib/project-root.cjs +41 -2
  187. package/gsd-core/bin/lib/quick-batch-command-router.cjs +35 -9
  188. package/gsd-core/bin/lib/quick-batch-dispatch.cjs +11 -8
  189. package/gsd-core/bin/lib/real-home-guard.cjs +9 -1
  190. package/gsd-core/bin/lib/report-parser.cjs +269 -0
  191. package/gsd-core/bin/lib/review-lane-descriptor.cjs +10 -30
  192. package/gsd-core/bin/lib/review-reviewer-selection.cjs +2 -2
  193. package/gsd-core/bin/lib/roadmap-command-router.cjs +25 -19
  194. package/gsd-core/bin/lib/roadmap-parser.cjs +242 -15
  195. package/gsd-core/bin/lib/roadmap-upgrade.cjs +1653 -65
  196. package/gsd-core/bin/lib/roadmap.cjs +405 -88
  197. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +373 -187
  198. package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +5 -2
  199. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +57 -1
  200. package/gsd-core/bin/lib/runtime-homes.cjs +14 -7
  201. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +522 -624
  202. package/gsd-core/bin/lib/runtime-name-policy.cjs +246 -21
  203. package/gsd-core/bin/lib/runtime-slash.cjs +47 -30
  204. package/gsd-core/bin/lib/shell-command-projection.cjs +47 -8
  205. package/gsd-core/bin/lib/smart-entry.cjs +19 -3
  206. package/gsd-core/bin/lib/stale-bake-guard.cjs +32 -48
  207. package/gsd-core/bin/lib/state-contract.cjs +15 -18
  208. package/gsd-core/bin/lib/state-document.cjs +100 -22
  209. package/gsd-core/bin/lib/state-transition.cjs +39 -2
  210. package/gsd-core/bin/lib/state.cjs +256 -105
  211. package/gsd-core/bin/lib/surface.cjs +19 -2
  212. package/gsd-core/bin/lib/tdd-red-evidence.cjs +48 -79
  213. package/gsd-core/bin/lib/uat-predicate.cjs +359 -38
  214. package/gsd-core/bin/lib/uat.cjs +432 -7
  215. package/gsd-core/bin/lib/ui-consideration-probe.cjs +15 -2
  216. package/gsd-core/bin/lib/ui-frontend-evidence.cjs +167 -40
  217. package/gsd-core/bin/lib/undo-commit-selection.cjs +131 -0
  218. package/gsd-core/bin/lib/vendor/README.md +31 -9
  219. package/gsd-core/bin/lib/vendor/saxes.cjs +1934 -0
  220. package/gsd-core/bin/lib/vendor/saxes.cjs.LICENSE.txt +92 -0
  221. package/gsd-core/bin/lib/vendor/tap-parser.cjs +8927 -0
  222. package/gsd-core/bin/lib/vendor/tap-parser.cjs.LICENSE.txt +152 -0
  223. package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
  224. package/gsd-core/bin/lib/verification.cjs +1378 -274
  225. package/gsd-core/bin/lib/verify-command-grounding.cjs +46 -2
  226. package/gsd-core/bin/lib/verify-command-router.cjs +18 -7
  227. package/gsd-core/bin/lib/verify.cjs +357 -531
  228. package/gsd-core/bin/lib/workstream-inventory-builder.cjs +14 -6
  229. package/gsd-core/bin/lib/workstream-inventory.cjs +31 -21
  230. package/gsd-core/bin/lib/workstream-name-policy.cjs +31 -1
  231. package/gsd-core/bin/lib/workstream.cjs +11 -2
  232. package/gsd-core/bin/lib/worktree-base-ref.cjs +482 -73
  233. package/gsd-core/bin/lib/worktree-safety.cjs +784 -51
  234. package/gsd-core/bin/shared/config-defaults.manifest.json +8 -0
  235. package/gsd-core/bin/shared/config-schema.manifest.json +5 -0
  236. package/gsd-core/references/autonomous-smart-discuss.md +2 -1
  237. package/gsd-core/references/autonomous-ui-design-contract.md +3 -3
  238. package/gsd-core/references/checkpoints.md +5 -3
  239. package/gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json +28 -3
  240. package/gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json +37 -4
  241. package/gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json +28 -3
  242. package/gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json +28 -3
  243. package/gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json +37 -4
  244. package/gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json +37 -4
  245. package/gsd-core/references/edge-probe.md +195 -21
  246. package/gsd-core/references/execute-mvp-tdd.md +5 -10
  247. package/gsd-core/references/execute-phase-between-wave-reset.md +10 -6
  248. package/gsd-core/references/execute-phase-response-language.md +1 -1
  249. package/gsd-core/references/execute-phase-wave-guard.md +22 -11
  250. package/gsd-core/references/gsd-run-resolver.md +1 -1
  251. package/gsd-core/references/loop-hook-dispatch.md +7 -1
  252. package/gsd-core/references/model-profiles.md +1 -1
  253. package/gsd-core/references/offer-next.md +1 -1
  254. package/gsd-core/references/phase-argument-parsing.md +9 -7
  255. package/gsd-core/references/phase-id-convention.md +28 -0
  256. package/gsd-core/references/planner-gap-closure.md +2 -0
  257. package/gsd-core/references/planner-load-graph-context.md +24 -13
  258. package/gsd-core/references/planner-verify-command-grounding.md +14 -0
  259. package/gsd-core/references/planning-config.md +12 -3
  260. package/gsd-core/references/spidr-splitting.md +1 -1
  261. package/gsd-core/references/tdd.md +37 -8
  262. package/gsd-core/references/ui-consideration-probe.md +10 -5
  263. package/gsd-core/references/verifier-phase-gates.md +5 -2
  264. package/gsd-core/references/verify-command-path-resolvability.md +10 -2
  265. package/gsd-core/references/verify-mvp-mode.md +2 -2
  266. package/gsd-core/references/workstream-flag.md +33 -3
  267. package/gsd-core/references/worktree-path-safety.md +321 -0
  268. package/gsd-core/templates/README.md +1 -1
  269. package/gsd-core/templates/UAT.md +17 -1
  270. package/gsd-core/templates/config.json +2 -11
  271. package/gsd-core/templates/verification-report.md +1 -1
  272. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
  273. package/gsd-core/workflows/add-backlog.md +1 -1
  274. package/gsd-core/workflows/add-phase.md +8 -7
  275. package/gsd-core/workflows/add-tests.md +4 -3
  276. package/gsd-core/workflows/add-todo.md +6 -5
  277. package/gsd-core/workflows/ai-integration-phase.md +13 -4
  278. package/gsd-core/workflows/audit-fix.md +1 -1
  279. package/gsd-core/workflows/audit-milestone.md +4 -3
  280. package/gsd-core/workflows/audit-uat.md +1 -1
  281. package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +9 -18
  282. package/gsd-core/workflows/autonomous.md +43 -23
  283. package/gsd-core/workflows/check-todos.md +7 -6
  284. package/gsd-core/workflows/cleanup.md +2 -2
  285. package/gsd-core/workflows/code-review/steps/dispatch-fix.md +4 -3
  286. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +20 -13
  287. package/gsd-core/workflows/code-review-fix.md +112 -25
  288. package/gsd-core/workflows/code-review.md +146 -135
  289. package/gsd-core/workflows/complete-milestone/detail/elaboration.md +4 -3
  290. package/gsd-core/workflows/complete-milestone.md +13 -8
  291. package/gsd-core/workflows/debug.md +32 -7
  292. package/gsd-core/workflows/diagnose-issues.md +3 -2
  293. package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
  294. package/gsd-core/workflows/discuss-phase/modes/chain.md +1 -1
  295. package/gsd-core/workflows/discuss-phase-assumptions.md +4 -3
  296. package/gsd-core/workflows/discuss-phase.md +4 -3
  297. package/gsd-core/workflows/do.md +2 -2
  298. package/gsd-core/workflows/docs-update.md +6 -5
  299. package/gsd-core/workflows/edit-phase.md +4 -3
  300. package/gsd-core/workflows/eval-review.md +14 -5
  301. package/gsd-core/workflows/execute-phase/detail/elaboration.md +2 -2
  302. package/gsd-core/workflows/execute-phase/steps/code-review-disposition.md +1019 -0
  303. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +15 -4
  304. package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +10 -7
  305. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +37 -3
  306. package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +3 -1
  307. package/gsd-core/workflows/execute-phase/steps/partial-wave.md +2 -2
  308. package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
  309. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +1 -1
  310. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +46 -9
  311. package/gsd-core/workflows/execute-phase/steps/protected-branch.md +1 -1
  312. package/gsd-core/workflows/execute-phase/steps/ready-wave-gate.md +37 -0
  313. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +1 -1
  314. package/gsd-core/workflows/execute-phase/steps/regression-gate.md +2 -0
  315. package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +1 -1
  316. package/gsd-core/workflows/execute-phase/steps/threat-id-gate.md +28 -0
  317. package/gsd-core/workflows/execute-phase/steps/verify-phase-goal.md +187 -0
  318. package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +2 -3
  319. package/gsd-core/workflows/execute-phase/steps/worktree-base-check.md +25 -0
  320. package/gsd-core/workflows/execute-phase.md +96 -178
  321. package/gsd-core/workflows/execute-plan.md +18 -23
  322. package/gsd-core/workflows/explore.md +4 -4
  323. package/gsd-core/workflows/extract-learnings.md +4 -2
  324. package/gsd-core/workflows/fast.md +1 -1
  325. package/gsd-core/workflows/forensics.md +1 -1
  326. package/gsd-core/workflows/graduation.md +1 -1
  327. package/gsd-core/workflows/health.md +3 -2
  328. package/gsd-core/workflows/help/modes/full.compact.md +3 -3
  329. package/gsd-core/workflows/help/modes/full.md +5 -5
  330. package/gsd-core/workflows/help/modes/topic.md +15 -5
  331. package/gsd-core/workflows/import.md +4 -3
  332. package/gsd-core/workflows/inbox.md +2 -2
  333. package/gsd-core/workflows/ingest-docs.md +3 -3
  334. package/gsd-core/workflows/insert-phase.md +4 -3
  335. package/gsd-core/workflows/list-seeds.md +1 -1
  336. package/gsd-core/workflows/list-workspaces.md +1 -1
  337. package/gsd-core/workflows/manager.md +6 -4
  338. package/gsd-core/workflows/map-codebase.md +5 -4
  339. package/gsd-core/workflows/milestone-summary.md +3 -2
  340. package/gsd-core/workflows/mvp-phase.md +14 -14
  341. package/gsd-core/workflows/new-milestone.md +11 -11
  342. package/gsd-core/workflows/new-project/steps/auto-mode-config.md +3 -3
  343. package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +1 -1
  344. package/gsd-core/workflows/new-project.md +7 -7
  345. package/gsd-core/workflows/new-workspace.md +2 -2
  346. package/gsd-core/workflows/next.md +1 -1
  347. package/gsd-core/workflows/note.md +1 -1
  348. package/gsd-core/workflows/onboard.md +1 -1
  349. package/gsd-core/workflows/pause-work.md +2 -2
  350. package/gsd-core/workflows/plan-phase/detail/elaboration.md +1 -1
  351. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +17 -5
  352. package/gsd-core/workflows/plan-phase/steps/closed-phase-gate.md +1 -1
  353. package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +1 -1
  354. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +23 -5
  355. package/gsd-core/workflows/plan-phase.md +50 -24
  356. package/gsd-core/workflows/plan-review-convergence.md +21 -5
  357. package/gsd-core/workflows/plant-seed.md +62 -20
  358. package/gsd-core/workflows/pr-branch.md +113 -13
  359. package/gsd-core/workflows/profile-user.md +2 -2
  360. package/gsd-core/workflows/progress.md +19 -49
  361. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +27 -0
  362. package/gsd-core/workflows/quick/steps/quick-verification.md +4 -4
  363. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +30 -11
  364. package/gsd-core/workflows/quick-batch/steps/batch-init.md +1 -1
  365. package/gsd-core/workflows/quick-batch/steps/completion.md +1 -1
  366. package/gsd-core/workflows/quick-batch/steps/merge-wave.md +1 -1
  367. package/gsd-core/workflows/quick-batch/steps/planner-wave.md +1 -1
  368. package/gsd-core/workflows/quick-batch/steps/research-phase.md +1 -1
  369. package/gsd-core/workflows/quick-batch/steps/resume-mode.md +1 -1
  370. package/gsd-core/workflows/quick-batch/steps/verification-wave.md +9 -3
  371. package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +1 -1
  372. package/gsd-core/workflows/quick-batch.md +15 -10
  373. package/gsd-core/workflows/quick.md +62 -39
  374. package/gsd-core/workflows/reapply-patches.md +9 -3
  375. package/gsd-core/workflows/remove-phase.md +3 -2
  376. package/gsd-core/workflows/remove-workspace.md +2 -2
  377. package/gsd-core/workflows/resume-project.md +3 -2
  378. package/gsd-core/workflows/review.md +33 -17
  379. package/gsd-core/workflows/scan.md +3 -2
  380. package/gsd-core/workflows/secure-phase.md +13 -13
  381. package/gsd-core/workflows/settings-advanced.md +30 -10
  382. package/gsd-core/workflows/settings-integrations.md +2 -3
  383. package/gsd-core/workflows/settings.md +4 -4
  384. package/gsd-core/workflows/ship.md +14 -13
  385. package/gsd-core/workflows/sketch-wrap-up.md +1 -1
  386. package/gsd-core/workflows/sketch.md +1 -1
  387. package/gsd-core/workflows/smart-entry.md +2 -2
  388. package/gsd-core/workflows/spec-phase.md +15 -5
  389. package/gsd-core/workflows/spike-wrap-up.md +1 -1
  390. package/gsd-core/workflows/spike.md +1 -1
  391. package/gsd-core/workflows/stats.md +1 -1
  392. package/gsd-core/workflows/sync-skills.md +5 -5
  393. package/gsd-core/workflows/thread.md +2 -2
  394. package/gsd-core/workflows/transition.md +13 -23
  395. package/gsd-core/workflows/ui-phase.md +48 -11
  396. package/gsd-core/workflows/ui-review.md +21 -6
  397. package/gsd-core/workflows/ultraplan-phase.md +3 -2
  398. package/gsd-core/workflows/undo.md +339 -20
  399. package/gsd-core/workflows/update.md +7 -7
  400. package/gsd-core/workflows/validate-phase.md +12 -13
  401. package/gsd-core/workflows/verify-work/detail/elaboration.md +43 -3
  402. package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +1 -1
  403. package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +5 -3
  404. package/gsd-core/workflows/verify-work.md +129 -55
  405. package/hooks/dist/gsd-agent-isolation-guard.js +32 -0
  406. package/hooks/dist/gsd-check-update-worker.js +8 -0
  407. package/hooks/dist/gsd-check-update.js +8 -0
  408. package/hooks/dist/gsd-context-monitor.js +31 -8
  409. package/hooks/dist/gsd-cursor-subagent-start.js +8 -0
  410. package/hooks/dist/gsd-secret-read-guard.js +161 -4
  411. package/hooks/dist/gsd-statusline.js +85 -20
  412. package/hooks/dist/gsd-update-banner.js +8 -0
  413. package/hooks/dist/gsd-validate-commit.sh +63 -4
  414. package/hooks/dist/gsd-windsurf-pre-write.js +11 -2
  415. package/hooks/dist/gsd-workflow-guard.js +5 -4
  416. package/hooks/dist/gsd-worktree-path-guard.js +6 -2
  417. package/hooks/dist/lib/cli-exit.js +12 -0
  418. package/hooks/dist/lib/git-probe.js +17 -1
  419. package/hooks/dist/lib/isolation-sentinel.js +2 -2
  420. package/hooks/gsd-agent-isolation-guard.js +32 -0
  421. package/hooks/gsd-check-update-worker.js +8 -0
  422. package/hooks/gsd-check-update.js +8 -0
  423. package/hooks/gsd-context-monitor.js +31 -8
  424. package/hooks/gsd-cursor-subagent-start.js +8 -0
  425. package/hooks/gsd-secret-read-guard.js +161 -4
  426. package/hooks/gsd-statusline.js +85 -20
  427. package/hooks/gsd-update-banner.js +8 -0
  428. package/hooks/gsd-validate-commit.sh +63 -4
  429. package/hooks/gsd-windsurf-pre-write.js +11 -2
  430. package/hooks/gsd-workflow-guard.js +5 -4
  431. package/hooks/gsd-worktree-path-guard.js +6 -2
  432. package/hooks/hooks.json +5 -5
  433. package/hooks/lib/cli-exit.js +12 -0
  434. package/hooks/lib/git-probe.js +17 -1
  435. package/hooks/lib/isolation-sentinel.js +2 -2
  436. package/package.json +22 -4
  437. package/scripts/build-hooks.js +15 -6
  438. package/scripts/changeset/parse.cjs +52 -4
  439. package/scripts/check-contract-drift.cjs +127 -11
  440. package/scripts/ci-timeout-report.cjs +770 -4
  441. package/scripts/command-contract-helpers.cjs +15 -8
  442. package/scripts/docs-guard-registry.cjs +34 -0
  443. package/scripts/gen-features.cjs +13 -8
  444. package/scripts/gen-hooks-cli-exit.cjs +12 -28
  445. package/scripts/gen-loop-host-contract.cjs +79 -1
  446. package/scripts/gen-platform-conformance-tier.cjs +187 -1
  447. package/scripts/gen-plugin-skills.cjs +87 -1
  448. package/scripts/gen-research-agents.cjs +24 -31
  449. package/scripts/gen-scripts-cli-exit.cjs +30 -3
  450. package/scripts/gen-test-timings.cjs +32 -7
  451. package/scripts/lib/cli-exit.cjs +12 -0
  452. package/scripts/lib/macos-conformance-tier.generated.cjs +34 -2
  453. package/scripts/lib/ndjson-reporter.cjs +31 -5
  454. package/scripts/lib/platform-conformance-tier.generated.cjs +45 -5
  455. package/scripts/lib/registration-ledger-preload.cjs +155 -0
  456. package/scripts/lib/vendor-bundle.cjs +59 -0
  457. package/scripts/lib/vendor-licenses/saxes-6.0.0.txt +64 -0
  458. package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
  459. package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
  460. package/scripts/lint-completion-predicate-drift.cjs +18 -19
  461. package/scripts/lint-descriptions.cjs +7 -3
  462. package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +38 -1
  463. package/scripts/lint-eslint-glob-coverage.allowlist.json +20 -0
  464. package/scripts/lint-frontmatter-fence-drift.cjs +313 -0
  465. package/scripts/lint-frontmatter-scalar-broad-grep.cjs +122 -16
  466. package/scripts/lint-phase-arg-assignment.cjs +257 -0
  467. package/scripts/lint-phase-enumeration-drift.cjs +12 -8
  468. package/scripts/lint-phase-id-drift.cjs +319 -5
  469. package/scripts/lint-planning-document-positive-control.cjs +329 -0
  470. package/scripts/lint-pr-branch-pattern-drift.cjs +148 -0
  471. package/scripts/lint-response-language-coverage.cjs +3 -0
  472. package/scripts/lint-retired-runtime-name.cjs +619 -0
  473. package/scripts/lint-skill-deps.cjs +7 -3
  474. package/scripts/lint-state-write-path-drift.cjs +93 -0
  475. package/scripts/lint-test-file-count.allowlist.json +38 -9
  476. package/scripts/lint-test-file-count.cjs +34 -1
  477. package/scripts/lint-vendored-deps.cjs +41 -5
  478. package/scripts/lint-workflow-shellcheck-baseline.json +25 -10
  479. package/scripts/mutation-matrix.cjs +50 -5
  480. package/scripts/prompt-injection-scan.sh +4 -0
  481. package/scripts/release-tarball-smoke.cjs +194 -1
  482. package/scripts/require-issue-link-policy.cjs +6 -2
  483. package/scripts/sync-runtime-launcher.cjs +184 -2
  484. package/scripts/verify-npm-publish.cjs +76 -20
  485. package/skills/gsd-add-tests/SKILL.md +6 -1
  486. package/skills/gsd-ai-integration-phase/SKILL.md +6 -1
  487. package/skills/gsd-audit-fix/SKILL.md +5 -0
  488. package/skills/gsd-audit-milestone/SKILL.md +6 -1
  489. package/skills/gsd-autonomous/SKILL.md +7 -2
  490. package/skills/gsd-capture/SKILL.md +9 -5
  491. package/skills/gsd-code-review/SKILL.md +7 -2
  492. package/skills/gsd-complete-milestone/SKILL.md +4 -0
  493. package/skills/gsd-config/SKILL.md +8 -4
  494. package/skills/gsd-debug/SKILL.md +11 -7
  495. package/skills/gsd-discuss-phase/SKILL.md +7 -3
  496. package/skills/gsd-docs-update/SKILL.md +12 -7
  497. package/skills/gsd-eval-review/SKILL.md +6 -1
  498. package/skills/gsd-execute-phase/SKILL.md +12 -7
  499. package/skills/gsd-extract-learnings/SKILL.md +5 -0
  500. package/skills/gsd-fast/SKILL.md +4 -0
  501. package/skills/gsd-forensics/SKILL.md +5 -1
  502. package/skills/gsd-graphify/SKILL.md +10 -6
  503. package/skills/gsd-health/SKILL.md +5 -0
  504. package/skills/gsd-help/SKILL.md +7 -2
  505. package/skills/gsd-import/SKILL.md +7 -3
  506. package/skills/gsd-inbox/SKILL.md +5 -0
  507. package/skills/gsd-ingest-docs/SKILL.md +5 -1
  508. package/skills/gsd-manager/SKILL.md +6 -1
  509. package/skills/gsd-map-codebase/SKILL.md +7 -3
  510. package/skills/gsd-mempalace-capture/SKILL.md +12 -4
  511. package/skills/gsd-mempalace-recall/SKILL.md +5 -1
  512. package/skills/gsd-milestone-summary/SKILL.md +5 -1
  513. package/skills/gsd-mvp-phase/SKILL.md +8 -3
  514. package/skills/gsd-new-milestone/SKILL.md +6 -1
  515. package/skills/gsd-new-project/SKILL.md +5 -0
  516. package/skills/gsd-next/SKILL.md +6 -1
  517. package/skills/gsd-ns-context/SKILL.md +4 -0
  518. package/skills/gsd-ns-ideate/SKILL.md +4 -0
  519. package/skills/gsd-ns-manage/SKILL.md +4 -0
  520. package/skills/gsd-ns-project/SKILL.md +4 -0
  521. package/skills/gsd-ns-review/SKILL.md +4 -0
  522. package/skills/gsd-ns-workflow/SKILL.md +4 -0
  523. package/skills/gsd-onboard/SKILL.md +6 -1
  524. package/skills/gsd-pause-work/SKILL.md +5 -1
  525. package/skills/gsd-phase/SKILL.md +8 -4
  526. package/skills/gsd-plan-phase/SKILL.md +6 -1
  527. package/skills/gsd-plan-review-convergence/SKILL.md +10 -6
  528. package/skills/gsd-pr-branch/SKILL.md +4 -0
  529. package/skills/gsd-profile-user/SKILL.md +5 -1
  530. package/skills/gsd-progress/SKILL.md +7 -2
  531. package/skills/gsd-quick/SKILL.md +16 -10
  532. package/skills/gsd-quick-batch/SKILL.md +21 -9
  533. package/skills/gsd-review/SKILL.md +7 -4
  534. package/skills/gsd-review-backlog/SKILL.md +3 -2
  535. package/skills/gsd-secure-phase/SKILL.md +6 -1
  536. package/skills/gsd-ship/SKILL.md +5 -0
  537. package/skills/gsd-sketch/SKILL.md +7 -2
  538. package/skills/gsd-spec-phase/SKILL.md +5 -1
  539. package/skills/gsd-spike/SKILL.md +8 -3
  540. package/skills/gsd-surface/SKILL.md +5 -1
  541. package/skills/gsd-thread/SKILL.md +4 -0
  542. package/skills/gsd-ui-phase/SKILL.md +6 -1
  543. package/skills/gsd-ui-review/SKILL.md +6 -1
  544. package/skills/gsd-ultraplan-phase/SKILL.md +5 -1
  545. package/skills/gsd-undo/SKILL.md +5 -1
  546. package/skills/gsd-update/SKILL.md +6 -2
  547. package/skills/gsd-validate-phase/SKILL.md +6 -1
  548. package/skills/gsd-verify-work/SKILL.md +6 -1
  549. package/skills/gsd-workspace/SKILL.md +7 -3
  550. package/skills/gsd-workstreams/SKILL.md +6 -6
  551. package/vscode/package.json +1 -1
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.evidenceFound = evidenceFound;
7
+ exports.evidenceNone = evidenceNone;
8
+ exports.evidenceUnreadable = evidenceUnreadable;
9
+ exports.evidenceFromError = evidenceFromError;
10
+ exports.readTextEvidence = readTextEvidence;
11
+ exports.readDirEvidence = readDirEvidence;
12
+ exports.readDirEntriesEvidence = readDirEntriesEvidence;
13
+ exports.statEvidence = statEvidence;
14
+ exports.readPlanScanEvidence = readPlanScanEvidence;
15
+ exports.readPlanSetEvidence = readPlanSetEvidence;
16
+ exports.verdictFromEvidence = verdictFromEvidence;
17
+ /**
18
+ * Gate evidence — what a gate found when it looked (#5170, epic #5056, ADR-5057 §4 third bullet).
19
+ *
20
+ * A gate that reads a file or directory has THREE answers, not two:
21
+ *
22
+ * - `found` the evidence is there; `value` is what was read (an empty file is `found ''`).
23
+ * - `none` the evidence authoritatively does not exist (`ENOENT`, or `ENOTDIR` because a
24
+ * parent component is not a directory, so the path cannot exist). Each gate keeps
25
+ * its own documented policy for `none`.
26
+ * - `unreadable` the evidence may exist but could not be read (`EISDIR`, `EACCES`, `EIO`, an
27
+ * encoding failure ...). `reason` carries the errno code (or the message when
28
+ * the failure had none); `span` names what was being read.
29
+ *
30
+ * `unreadable` is never `''`, `false` or an empty list: a tolerant reader that collapses it into
31
+ * "nothing there" lets a gate pass over content it never saw. `verdictFromEvidence` is the one way
32
+ * a gate maps evidence to a verdict, and its `unreadable` arm is typed to return an
33
+ * `UnreadableVerdict`, so a passing verdict from that arm does not type-check.
34
+ *
35
+ * `fs` is reached as a namespace object at call time, never destructured at load, so a test can
36
+ * inject a read failure by replacing the method.
37
+ */
38
+ const node_fs_1 = __importDefault(require("node:fs"));
39
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
40
+ const planScanMod = require("./plan-scan.cjs");
41
+ const { scanPhasePlans } = planScanMod;
42
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
43
+ const planningScopeMod = require("./planning-scope.cjs");
44
+ const { SCOPE } = planningScopeMod;
45
+ function evidenceFound(value) {
46
+ return { kind: 'found', value };
47
+ }
48
+ function evidenceNone() {
49
+ return { kind: 'none' };
50
+ }
51
+ function evidenceUnreadable(reason, span) {
52
+ return span === undefined ? { kind: 'unreadable', reason } : { kind: 'unreadable', reason, span };
53
+ }
54
+ /** Errno codes meaning "the path cannot hold evidence": absent, or a parent is not a directory. */
55
+ const ABSENT_CODES = new Set(['ENOENT', 'ENOTDIR']);
56
+ /**
57
+ * Classify a thrown read failure as evidence: absent (`ENOENT`/`ENOTDIR`) is `none`, anything else
58
+ * is `unreadable` carrying the errno code (or the message when there was none). A gate that wraps a
59
+ * lookup it does not own (a locator, a roadmap reader) in `try` uses this instead of a bare `catch`.
60
+ */
61
+ function evidenceFromError(err, span) {
62
+ return classifyFailure(err, span);
63
+ }
64
+ function classifyFailure(err, span) {
65
+ const code = err?.code;
66
+ if (typeof code === 'string' && ABSENT_CODES.has(code))
67
+ return evidenceNone();
68
+ if (typeof code === 'string' && code.length > 0)
69
+ return evidenceUnreadable(code, span);
70
+ const message = err instanceof Error ? err.message : String(err);
71
+ return evidenceUnreadable(message.length > 0 ? message : 'unknown read failure', span);
72
+ }
73
+ /** Read a UTF-8 file as evidence. Never throws. */
74
+ function readTextEvidence(filePath) {
75
+ try {
76
+ return evidenceFound(node_fs_1.default.readFileSync(filePath, 'utf8'));
77
+ }
78
+ catch (err) {
79
+ return classifyFailure(err, filePath);
80
+ }
81
+ }
82
+ /** Read a directory's entry names as evidence. Never throws. */
83
+ function readDirEvidence(dirPath) {
84
+ try {
85
+ return evidenceFound(node_fs_1.default.readdirSync(dirPath));
86
+ }
87
+ catch (err) {
88
+ return classifyFailure(err, dirPath);
89
+ }
90
+ }
91
+ /** Read a directory's entries (with types) as evidence. Never throws. */
92
+ function readDirEntriesEvidence(dirPath) {
93
+ try {
94
+ return evidenceFound(node_fs_1.default.readdirSync(dirPath, { withFileTypes: true }));
95
+ }
96
+ catch (err) {
97
+ return classifyFailure(err, dirPath);
98
+ }
99
+ }
100
+ /** Stat a path (following symlinks) as evidence. Never throws. */
101
+ function statEvidence(targetPath) {
102
+ try {
103
+ return evidenceFound(node_fs_1.default.statSync(targetPath));
104
+ }
105
+ catch (err) {
106
+ return classifyFailure(err, targetPath);
107
+ }
108
+ }
109
+ /**
110
+ * The canonical plan set of a phase directory that is known to exist, as evidence (#5170). Only the
111
+ * scan's `SCOPE.COMPLETE` is a real answer: `TRUNCATED` (an existing nested `plans/` that could not be
112
+ * read), `UNREADABLE` and `UNSCOPED` mean the scan did not see every plan, so a short or empty list is
113
+ * `unreadable` and never "no plans". Every gate that gets its plans from `scanPhasePlans` goes through
114
+ * this one reader.
115
+ */
116
+ function readPlanScanEvidence(phaseDir) {
117
+ const scan = scanPhasePlans(phaseDir);
118
+ if (scan.scope !== SCOPE.COMPLETE) {
119
+ return { kind: 'unreadable', reason: `plan scan ${scan.scope}`, span: phaseDir };
120
+ }
121
+ return evidenceFound({ planFiles: [...scan.planFiles], summaryFiles: [...scan.summaryFiles] });
122
+ }
123
+ /** The plan half of {@link readPlanScanEvidence}. */
124
+ function readPlanSetEvidence(phaseDir) {
125
+ const scan = readPlanScanEvidence(phaseDir);
126
+ return scan.kind === 'unreadable' ? scan : evidenceFound(scan.value.planFiles);
127
+ }
128
+ /** Map evidence to a verdict. Total over the three kinds. */
129
+ function verdictFromEvidence(evidence, arms) {
130
+ switch (evidence.kind) {
131
+ case 'found':
132
+ return arms.found(evidence.value);
133
+ case 'none':
134
+ return arms.none();
135
+ case 'unreadable':
136
+ return arms.unreadable(evidence.reason, evidence.span);
137
+ }
138
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gateExitOutcome = gateExitOutcome;
4
+ exports.declareGateExit = declareGateExit;
5
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
6
+ const cliExit = require("./cli-exit.cjs");
7
+ function gateExitOutcome(verdict, mode) {
8
+ switch (verdict.outcome) {
9
+ case 'unreadable':
10
+ return 'UNAVAILABLE';
11
+ case 'block':
12
+ return mode === 'status' ? 'FAIL' : 'PASS';
13
+ case 'empty':
14
+ return mode === 'status' ? 'NO_INPUT' : 'PASS';
15
+ case 'pass':
16
+ case 'skip':
17
+ case 'advisory':
18
+ return 'PASS';
19
+ }
20
+ }
21
+ /** Declare the exit outcome for a verdict. Call after `output()`, never before. */
22
+ function declareGateExit(verdict, mode) {
23
+ const outcome = gateExitOutcome(verdict, mode);
24
+ if (outcome !== 'PASS')
25
+ cliExit.declareOutcome(outcome);
26
+ return outcome;
27
+ }
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /**
3
+ * `check gap-analysis-plan-post` as a gate module (#5139, epic #5056, ADR-5057 §4 first bullet):
4
+ * it returns a `GateResult`; the command router formats it. Imports no io module and performs no
5
+ * direct console/stdout/stderr write (ESLint-enforced).
6
+ *
7
+ * Non-blocking advisory check that runs the post-planning gap analysis after all PLAN.md files are
8
+ * generated for a phase. Cross-references every REQ-ID and D-ID from REQUIREMENTS.md and CONTEXT.md
9
+ * against the concatenated text of all *-PLAN.md files, emitting a coverage table.
10
+ *
11
+ * This gate is always advisory (`passed: true`, `block: false`) — it never blocks phase advancement.
12
+ *
13
+ * Argv after the verb: `<phase-dir> [phase-req-ids]`.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.evaluateGapAnalysisPlanPost = evaluateGapAnalysisPlanPost;
17
+ const gate_verdict_cjs_1 = require("./gate-verdict.cjs");
18
+ const gate_phase_context_cjs_1 = require("./gate-phase-context.cjs");
19
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
20
+ const gapCheckerModule = require("./gap-checker.cjs");
21
+ const { runGapAnalysis } = gapCheckerModule;
22
+ function evaluateGapAnalysisPlanPost(input) {
23
+ const { projectDir, args } = input;
24
+ const phaseDir = args[0] || '';
25
+ if (!phaseDir) {
26
+ return (0, gate_verdict_cjs_1.gateUsageFailure)(gate_verdict_cjs_1.GATE_FAILURE_CODE.SDK_MISSING_ARG, 'gap-analysis.plan-post requires a phase-dir argument: check gap-analysis.plan-post <phase-dir> [phase-req-ids]');
27
+ }
28
+ const resolvedPhaseDir = (0, gate_phase_context_cjs_1.resolveContainedPath)(phaseDir, projectDir);
29
+ if ((0, gate_verdict_cjs_1.isGateUsageFailure)(resolvedPhaseDir))
30
+ return resolvedPhaseDir;
31
+ const phaseReqIds = args[1] ?? undefined;
32
+ const result = runGapAnalysis(projectDir, resolvedPhaseDir, { phaseReqIds });
33
+ // Uniform gate contract: block = false (gap-analysis is always advisory, never blocks).
34
+ // `message` carries the human-readable gap analysis report so the dispatch's advisory branch can
35
+ // surface it.
36
+ // #5170 (ADR-5057 §4): a REQUIREMENTS.md, CONTEXT.md, plan, config or phase directory that exists but
37
+ // could not be read means the table was computed over evidence the analysis never saw. The gate
38
+ // stays advisory (`block: false`) but the outcome is `unreadable`: exit UNAVAILABLE, never a clean pass.
39
+ if (result.unreadable !== undefined && result.unreadable.length > 0) {
40
+ const named = result.unreadable.map((u) => `${u.span} (${u.reason})`).join('; ');
41
+ return (0, gate_verdict_cjs_1.gateUnreadable)(false, {
42
+ block: false,
43
+ passed: false,
44
+ enabled: result.enabled,
45
+ table: result.table,
46
+ summary: result.summary,
47
+ counts: result.counts,
48
+ unreadable: result.unreadable,
49
+ message: `${result.table || result.summary || ''}\nPost-planning gap analysis could not read its evidence: ${named}.`,
50
+ });
51
+ }
52
+ return (0, gate_verdict_cjs_1.gateVerdict)('advisory', false, {
53
+ block: false,
54
+ passed: true,
55
+ enabled: result.enabled,
56
+ table: result.table,
57
+ summary: result.summary,
58
+ counts: result.counts,
59
+ message: result.table || result.summary || '',
60
+ });
61
+ }
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ /**
3
+ * Gate phase context — path/phase resolution shared by the gate modules (#5139, epic #5056,
4
+ * ADR-5057 §4 first bullet, design D3).
5
+ *
6
+ * Owns the containment helper (a caller-supplied path argument is resolved against the project
7
+ * directory and must stay inside it; it RETURNS a `GateUsageFailure` on an escape — a gate module
8
+ * never calls `error()` — and the router turns that failure into the same `error(message,
9
+ * 'usage')` the pre-move router raised), the phase-directory / ROADMAP lookups and the degraded
10
+ * verdict of the two verify probes.
11
+ *
12
+ * Every lookup answers with typed evidence (#5170, ADR-5057 §4): an absent thing is `none`, a thing
13
+ * that exists but could not be read is `unreadable`, and nothing here collapses either into `''`.
14
+ * The tolerant `readIfExists` reader is deleted; a gate reads through `gate-evidence.cts`.
15
+ */
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.resolveContainedPath = resolveContainedPath;
21
+ exports.unresolvableProbeVerdict = unresolvableProbeVerdict;
22
+ exports.resolvePhaseDir = resolvePhaseDir;
23
+ exports.resolvePhaseDirByToken = resolvePhaseDirByToken;
24
+ exports.findUiSpecInDir = findUiSpecInDir;
25
+ exports.locateUiSpec = locateUiSpec;
26
+ exports.lookupRoadmapPhase = lookupRoadmapPhase;
27
+ const node_fs_1 = __importDefault(require("node:fs"));
28
+ const node_path_1 = __importDefault(require("node:path"));
29
+ const security_cjs_1 = require("./security.cjs");
30
+ const gate_verdict_cjs_1 = require("./gate-verdict.cjs");
31
+ const gate_evidence_cjs_1 = require("./gate-evidence.cjs");
32
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
33
+ const planningWorkspaceMod = require("./planning-workspace.cjs");
34
+ const { planningDir } = planningWorkspaceMod;
35
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
36
+ const phaseLocatorMod = require("./phase-locator.cjs");
37
+ const { findPhaseInternal } = phaseLocatorMod;
38
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
39
+ const phaseIdMod = require("./phase-id.cjs");
40
+ const { normalizePhaseName, matchPhaseDirs } = phaseIdMod;
41
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
42
+ const roadmapModule = require("./roadmap.cjs");
43
+ const { getRoadmapPhaseWithFallback } = roadmapModule;
44
+ /**
45
+ * Resolve a caller-supplied path (absolute, or relative to `projectDir`) and require the result to
46
+ * stay inside `projectDir` (realpath containment, ADR-4650). Returns the contained path the
47
+ * predicate produced, or a `GateUsageFailure` (`usage`, `path escapes its allowed directory: <arg>`).
48
+ */
49
+ function resolveContainedPath(inputPath, projectDir) {
50
+ const candidate = node_path_1.default.isAbsolute(inputPath) ? inputPath : node_path_1.default.join(projectDir, inputPath);
51
+ const contained = (0, security_cjs_1.tryWithinRoot)(candidate, projectDir, security_cjs_1.PathAcceptance.AbsoluteInsideRoot);
52
+ if (contained === null) {
53
+ return (0, gate_verdict_cjs_1.gateUsageFailure)(gate_verdict_cjs_1.GATE_FAILURE_CODE.USAGE, `path escapes its allowed directory: ${inputPath}`);
54
+ }
55
+ return contained;
56
+ }
57
+ /**
58
+ * The verdict of the two verify probes (`verify-command-paths`, `verify-failure-directions`) when
59
+ * they cannot look: status/commands/counts zeroed, `readError` naming why. The payload is what the
60
+ * plan-checker parses and must tell "nothing to report" from "could not look" by; the OUTCOME is
61
+ * `unreadable` (#5170), so the exit status is `UNAVAILABLE` — "could not look" is never a pass and
62
+ * never exit 0. `block` stays false (the probe's documented policy is unchanged).
63
+ */
64
+ function unresolvableProbeVerdict(readError) {
65
+ return (0, gate_verdict_cjs_1.gateUnreadable)(false, {
66
+ status: 'unresolvable',
67
+ commands: [],
68
+ counts: { blocker: 0, warning: 0, total: 0 },
69
+ readError,
70
+ });
71
+ }
72
+ /**
73
+ * Resolve a phase argument to an absolute phase directory. The ONE owner of what three gates
74
+ * (`ui-plan-gate`, `ui-safety-gate`, `tdd-review-checkpoint`) and the two verify probes each
75
+ * inlined before #5139. `found` is the absolute directory; `none` is "no such phase"; `unreadable`
76
+ * is a locator that failed while looking (a gate must not read that as "no phase").
77
+ */
78
+ function resolvePhaseDir(projectDir, phase) {
79
+ let result;
80
+ try {
81
+ result = findPhaseInternal(projectDir, phase);
82
+ }
83
+ catch (err) {
84
+ return (0, gate_evidence_cjs_1.evidenceFromError)(err, `phase ${phase}`);
85
+ }
86
+ if (result && typeof result === 'object') {
87
+ // findPhaseInternal returns { directory: '<relative-posix-path>', ... }
88
+ // directory is relative to cwd — resolve it to absolute.
89
+ const relDir = typeof result['directory'] === 'string' ? result['directory'] : '';
90
+ if (relDir)
91
+ return (0, gate_evidence_cjs_1.evidenceFound)(node_path_1.default.resolve(projectDir, relDir));
92
+ }
93
+ else if (typeof result === 'string' && result !== '') {
94
+ return (0, gate_evidence_cjs_1.evidenceFound)(result);
95
+ }
96
+ return (0, gate_evidence_cjs_1.evidenceNone)();
97
+ }
98
+ /**
99
+ * Resolve a phase argument to its directory DIRECTLY under a given `phasesDir`, for the two drift
100
+ * gates (schema-drift, context-drift; #1571, #2528, #5219).
101
+ *
102
+ * It is NOT `resolvePhaseDir`: that one asks the phase locator (`findPhaseInternal`), which looks
103
+ * through the current milestone's phases AND the milestone archives and reads the active workstream.
104
+ * The drift gates are handed ONE phases directory and must look nowhere else, and they resolve
105
+ * through the canonical phase-directory matcher (`matchPhaseDirs`, never a naive substring test: a
106
+ * bare `.includes(phaseArg)` lets a non-existent phase match a different phase whose directory merely
107
+ * contains the token, e.g. "1" matching "11-expansion"), then fall back to an exact directory name
108
+ * contained in `phasesDir` (a name escaping it resolves to nothing). Folding it into
109
+ * `resolvePhaseDir` would widen what those gates inspect, so the two stay apart and each states its
110
+ * scope. Throws when `phasesDir` cannot be listed; both callers sit inside their non-blocking catch.
111
+ */
112
+ function resolvePhaseDirByToken(phasesDir, phaseArg) {
113
+ const normalizedPhase = normalizePhaseName(phaseArg);
114
+ const dirEntries = node_fs_1.default.readdirSync(phasesDir, { withFileTypes: true });
115
+ const dirNames = dirEntries.filter((e) => e.isDirectory()).map((e) => e.name);
116
+ const matched = matchPhaseDirs(dirNames, normalizedPhase).matches[0];
117
+ if (matched)
118
+ return node_path_1.default.join(phasesDir, matched);
119
+ const contained = (0, security_cjs_1.tryWithinRoot)(phaseArg, phasesDir);
120
+ if (contained !== null && (0, gate_evidence_cjs_1.statEvidence)(contained).kind === 'found')
121
+ return contained;
122
+ return null;
123
+ }
124
+ /** The `*-UI-SPEC.md` inside `phaseDir` (absolute path): `none` when the directory or the spec is absent. */
125
+ function findUiSpecInDir(phaseDir) {
126
+ const entries = (0, gate_evidence_cjs_1.readDirEvidence)(phaseDir);
127
+ if (entries.kind !== 'found')
128
+ return entries;
129
+ const found = entries.value.find((f) => /-UI-SPEC\.md$/.test(f));
130
+ return found ? (0, gate_evidence_cjs_1.evidenceFound)(node_path_1.default.join(phaseDir, found)) : (0, gate_evidence_cjs_1.evidenceNone)();
131
+ }
132
+ /**
133
+ * The phase's `*-UI-SPEC.md`: `found` (absolute path), `none` (no phase directory, or no spec in
134
+ * it), or `unreadable` (the phase lookup or the directory read failed — the spec may exist).
135
+ */
136
+ function locateUiSpec(projectDir, phase) {
137
+ const phaseDir = resolvePhaseDir(projectDir, phase);
138
+ if (phaseDir.kind !== 'found')
139
+ return phaseDir;
140
+ return findUiSpecInDir(phaseDir.value);
141
+ }
142
+ /**
143
+ * The ROADMAP phase section for `phase`, through the same two-pass lookup as `roadmap.get-phase`
144
+ * (current milestone, then the full roadmap). A missing ROADMAP.md means "no roadmap, cannot be
145
+ * frontend" (`phaseLookupFailed` stays false); a present ROADMAP.md without the phase sets it. A
146
+ * lookup that FAILED (the reader threw, or ROADMAP.md exists but cannot be read) carries `readError`
147
+ * — "could not look" — instead of reading as an empty, non-frontend roadmap. Shared by
148
+ * `ui-plan-gate` and `ui-safety-gate`.
149
+ */
150
+ function lookupRoadmapPhase(projectDir, phase) {
151
+ let section;
152
+ try {
153
+ section = getRoadmapPhaseWithFallback(projectDir, phase);
154
+ }
155
+ catch (err) {
156
+ const failure = (0, gate_evidence_cjs_1.evidenceFromError)(err, 'ROADMAP.md');
157
+ if (failure.kind === 'unreadable') {
158
+ return { phaseSection: '', phaseLookupFailed: false, readError: failure.reason };
159
+ }
160
+ return { phaseSection: '', phaseLookupFailed: false };
161
+ }
162
+ if (section !== null)
163
+ return { phaseSection: section, phaseLookupFailed: false };
164
+ // Distinguish: ROADMAP.md missing (no-roadmap project) vs phase not found in ROADMAP.
165
+ const roadmap = (0, gate_evidence_cjs_1.readTextEvidence)(node_path_1.default.join(planningDir(projectDir), 'ROADMAP.md'));
166
+ if (roadmap.kind === 'unreadable') {
167
+ return { phaseSection: '', phaseLookupFailed: false, readError: roadmap.reason };
168
+ }
169
+ return { phaseSection: '', phaseLookupFailed: roadmap.kind === 'found' };
170
+ }
@@ -11,7 +11,7 @@
11
11
  * was declaration-only. This module is the generic evaluation path.
12
12
  *
13
13
  * The workflow gate-dispatch calls this evaluator (via the `gsd_run check predicate`
14
- * subcommand in check-command-router) for any gate whose `check` carries a
14
+ * subcommand, implemented by gate-predicate.cts) for any gate whose `check` carries a
15
15
  * `predicate` instead of a `query`. The evaluator dispatches by `predicate.kind`
16
16
  * and returns the existing `{ block, message }` gate contract. A THROWN error
17
17
  * (malformed predicate / unknown kind) is mapped by the CLI wrapper to a
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ /**
3
+ * `check predicate` as a gate module (#5139, epic #5056, ADR-5057 §4 first bullet): generic
4
+ * evaluator for capability gate `check.predicate` blocks (#2008). It returns a `GateResult`; the
5
+ * command router formats it. Imports no io module and performs no direct console/stdout/stderr
6
+ * write (ESLint-enforced).
7
+ *
8
+ * The workflow gate-dispatch invokes this for any gate whose `check` carries a `predicate` (instead
9
+ * of a `query`); the predicate object is passed as `--predicate '<json>'`. The standard `{ block,
10
+ * message, details? }` gate contract is the payload. A malformed predicate / unknown kind THROWS
11
+ * inside the evaluator and is mapped here to a `usage` failure (non-zero exit at the router), which
12
+ * the workflow's two-step gate contract treats as a step-1 command failure routed per the gate's
13
+ * `onError`.
14
+ *
15
+ * Invocation (argv after the verb):
16
+ * --predicate '<json>' [--phase-dir <dir>] [--phase-number <n>] [--phase-req-ids <ids>]
17
+ *
18
+ * The subprocess runs at the runtime project root (`projectDir`), inheriting the process env.
19
+ * Interpolation placeholders ${PHASE_NUMBER}/${PHASE_DIR}/${PHASE_REQ_IDS} are substituted from the
20
+ * flags.
21
+ */
22
+ var __importDefault = (this && this.__importDefault) || function (mod) {
23
+ return (mod && mod.__esModule) ? mod : { "default": mod };
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.buildPredicateDeps = buildPredicateDeps;
27
+ exports.evaluateCheckPredicate = evaluateCheckPredicate;
28
+ const node_path_1 = __importDefault(require("node:path"));
29
+ const gate_verdict_cjs_1 = require("./gate-verdict.cjs");
30
+ const gate_evidence_cjs_1 = require("./gate-evidence.cjs");
31
+ const gate_phase_context_cjs_1 = require("./gate-phase-context.cjs");
32
+ const gate_args_cjs_1 = require("./gate-args.cjs");
33
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
34
+ const frontmatterMod = require("./frontmatter.cjs");
35
+ const { extractFrontmatter } = frontmatterMod;
36
+ const security_cjs_1 = require("./security.cjs");
37
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
38
+ const gatePredicateEval = require("./gate-predicate-evaluator.cjs");
39
+ const { evaluatePredicate } = gatePredicateEval;
40
+ const shell_command_projection_cjs_1 = require("./shell-command-projection.cjs");
41
+ /**
42
+ * Production subprocess binding for the gate-predicate evaluator. Wraps the
43
+ * bounded `execTool` seam (shell-command-projection) as a `runBoundedShell`
44
+ * the pure evaluator consumes. `sh -c` runs the interpolated command; the
45
+ * subprocess inherits the process env and is killed (SIGTERM) on timeout.
46
+ *
47
+ * `timedOut` is derived from the kill signal: spawnSync sets `signal: 'SIGTERM'`
48
+ * when the `timeout` fires, distinct from a normal non-zero exit code. A command
49
+ * that self-terminates with SIGTERM is indistinguishable at this seam and is
50
+ * reported as a timeout — either way the gate blocks (non-zero), so the outcome
51
+ * is fail-closed and correct. See ADR-2008.
52
+ */
53
+ function buildPredicateDeps() {
54
+ return {
55
+ runBoundedShell(opts) {
56
+ const r = (0, shell_command_projection_cjs_1.execTool)('sh', ['-c', opts.command], { cwd: opts.cwd, timeout: opts.timeoutMs });
57
+ return {
58
+ exitCode: r.exitCode,
59
+ stdout: r.stdout,
60
+ stderr: r.stderr,
61
+ signal: r.signal,
62
+ timedOut: r.timedOut,
63
+ };
64
+ },
65
+ findPhaseArtifact(phaseDir, artifactSuffix) {
66
+ // #5170 (ADR-5057 §4): an ABSENT directory or artifact is `none` (the artifact is not there);
67
+ // one that exists but cannot be examined is `unreadable` and THROWS — `evaluateCheckPredicate`
68
+ // maps a throw to the usage failure the dispatch contract routes by `onError`. It is never
69
+ // folded into "artifact not found", which a predicate may read as a clean answer.
70
+ const unreadable = (target, reason) => {
71
+ throw new Error(`predicate artifact could not be examined: ${target} (${reason})`);
72
+ };
73
+ const regularFileOrNull = (candidate) => {
74
+ const st = (0, gate_evidence_cjs_1.statEvidence)(candidate);
75
+ if (st.kind === 'unreadable')
76
+ return unreadable(candidate, st.reason);
77
+ return st.kind === 'found' && st.value.isFile() ? candidate : null;
78
+ };
79
+ const phaseDirStat = (0, gate_evidence_cjs_1.statEvidence)(phaseDir);
80
+ if (phaseDirStat.kind === 'unreadable')
81
+ return unreadable(phaseDir, phaseDirStat.reason);
82
+ if (phaseDirStat.kind === 'none')
83
+ return null;
84
+ if (artifactSuffix === '.' ||
85
+ artifactSuffix === '..' ||
86
+ artifactSuffix.includes('\0') ||
87
+ node_path_1.default.basename(artifactSuffix) !== artifactSuffix ||
88
+ node_path_1.default.win32.basename(artifactSuffix) !== artifactSuffix) {
89
+ return null;
90
+ }
91
+ const directContained = (0, security_cjs_1.tryWithinRoot)(artifactSuffix, phaseDir);
92
+ if (directContained !== null) {
93
+ const direct = regularFileOrNull(directContained);
94
+ if (direct !== null)
95
+ return direct;
96
+ }
97
+ const planningContained = (0, security_cjs_1.tryWithinRoot)(node_path_1.default.join('.planning', artifactSuffix), phaseDir);
98
+ if (planningContained !== null) {
99
+ const planning = regularFileOrNull(planningContained);
100
+ if (planning !== null)
101
+ return planning;
102
+ }
103
+ const listing = (0, gate_evidence_cjs_1.readDirEvidence)(phaseDir);
104
+ if (listing.kind === 'unreadable')
105
+ return unreadable(phaseDir, listing.reason);
106
+ if (listing.kind === 'none')
107
+ return null;
108
+ for (const f of listing.value) {
109
+ if (f.endsWith('-' + artifactSuffix) || f === artifactSuffix) {
110
+ const candidateContained = (0, security_cjs_1.tryWithinRoot)(f, phaseDir);
111
+ if (candidateContained === null)
112
+ continue;
113
+ const candidate = regularFileOrNull(candidateContained);
114
+ if (candidate !== null)
115
+ return candidate;
116
+ }
117
+ }
118
+ return null;
119
+ },
120
+ readFrontmatter(filePath) {
121
+ const content = (0, shell_command_projection_cjs_1.platformReadSync)(filePath);
122
+ if (content === null)
123
+ throw new Error(`predicate artifact disappeared before it could be read: ${filePath}`);
124
+ const parsed = extractFrontmatter(content, filePath);
125
+ return parsed;
126
+ },
127
+ };
128
+ }
129
+ function evaluateCheckPredicate(input) {
130
+ const { projectDir } = input;
131
+ const flags = (0, gate_args_cjs_1.parsePredicateFlags)(input.args);
132
+ const predicateJson = flags['predicate'];
133
+ if (!predicateJson) {
134
+ return (0, gate_verdict_cjs_1.gateUsageFailure)(gate_verdict_cjs_1.GATE_FAILURE_CODE.SDK_MISSING_ARG, 'predicate requires --predicate <json> (the gate hook check.predicate object)');
135
+ }
136
+ let predicate;
137
+ try {
138
+ predicate = JSON.parse(predicateJson);
139
+ }
140
+ catch {
141
+ return (0, gate_verdict_cjs_1.gateUsageFailure)(gate_verdict_cjs_1.GATE_FAILURE_CODE.USAGE, 'predicate --predicate value must be valid JSON');
142
+ }
143
+ const rawPhaseDir = flags['phase-dir'];
144
+ let resolvedPhaseDir = rawPhaseDir;
145
+ if (typeof rawPhaseDir === 'string' && rawPhaseDir !== '') {
146
+ const resolved = (0, gate_phase_context_cjs_1.resolveContainedPath)(rawPhaseDir, projectDir);
147
+ if ((0, gate_verdict_cjs_1.isGateUsageFailure)(resolved))
148
+ return resolved;
149
+ resolvedPhaseDir = resolved;
150
+ }
151
+ const ctx = {
152
+ cwd: projectDir,
153
+ phaseNumber: flags['phase-number'],
154
+ phaseDir: resolvedPhaseDir,
155
+ phaseReqIds: flags['phase-req-ids'],
156
+ };
157
+ let result;
158
+ try {
159
+ result = evaluatePredicate(predicate, ctx, buildPredicateDeps());
160
+ }
161
+ catch (e) {
162
+ return (0, gate_verdict_cjs_1.gateUsageFailure)(gate_verdict_cjs_1.GATE_FAILURE_CODE.USAGE, `gate predicate evaluation failed: ${e.message}`);
163
+ }
164
+ return (0, gate_verdict_cjs_1.gateVerdict)(result.block ? 'block' : 'pass', result.block === true, { ...result });
165
+ }
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ /**
3
+ * `check prohibition-enforcement` as a gate module (#5219, epic #5056, ADR-5057 §4 closing arm C): it
4
+ * returns a `GateResult`; the command router formats it. Imports no io module and performs no direct
5
+ * console/stdout/stderr write (ESLint-enforced).
6
+ *
7
+ * The deterministic test-tier prohibition PRODUCER (#1259, ADR-550 D5d): it locates the wired
8
+ * mechanical check (node-test or lint-rule), proves it fails first, runs it, builds
9
+ * `enforcementEvidence` and delivers the `dispositionForProhibition` result
10
+ * (`runProhibitionEnforcement`, `prohibition-enforcement.cjs`). A producer, not a blocking gate: its
11
+ * disposition is a delivered answer (an `advisory` verdict, never `block`), and the exit status
12
+ * follows it through the seam like every other `check <verb>` (#5170, payload mode).
13
+ *
14
+ * No-throw contract: a throw anywhere is a non-blocking `unreadable` verdict whose payload is the
15
+ * producer's fail-closed disposition (flagged, `unverified`, nothing located), never a crash and
16
+ * never a silent green.
17
+ *
18
+ * Argv after the verb: `<request.json>` or `--json '<inline request>'`. A request is
19
+ * `{ prohibition, check, mode? }`; one that is absent or does not parse is a usage failure.
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.evaluateProhibitionEnforcementGate = evaluateProhibitionEnforcementGate;
23
+ const gate_verdict_cjs_1 = require("./gate-verdict.cjs");
24
+ const gate_evidence_cjs_1 = require("./gate-evidence.cjs");
25
+ const prohibition_enforcement_cjs_1 = require("./prohibition-enforcement.cjs");
26
+ /** Parse the request document. A document that does not parse is typed evidence, never a swallowed `null`. */
27
+ function parseDocumentEvidence(text) {
28
+ try {
29
+ return (0, gate_evidence_cjs_1.evidenceFound)(JSON.parse(text));
30
+ }
31
+ catch (err) {
32
+ return (0, gate_evidence_cjs_1.evidenceFromError)(err, 'request');
33
+ }
34
+ }
35
+ /**
36
+ * Parse a `{ prohibition, check, mode }` request from a JSON file path or inline `--json` string.
37
+ * Returns null when the request is absent, unreadable or does not parse (the caller surfaces a usage
38
+ * failure, never a throw).
39
+ */
40
+ function parseRequest(args) {
41
+ const jsonFlagIdx = args.indexOf('--json');
42
+ const inline = args[jsonFlagIdx + 1];
43
+ let payload;
44
+ if (jsonFlagIdx !== -1 && typeof inline === 'string') {
45
+ payload = inline;
46
+ }
47
+ else if (typeof args[0] === 'string' && args[0]) {
48
+ const read = (0, gate_evidence_cjs_1.readTextEvidence)(args[0]);
49
+ if (read.kind !== 'found')
50
+ return null;
51
+ payload = read.value;
52
+ }
53
+ else {
54
+ return null;
55
+ }
56
+ const document = parseDocumentEvidence(payload);
57
+ // A JSON `null` has no `check` / `prohibition` to read: it is no request, as an unparsable one is.
58
+ if (document.kind !== 'found' || document.value === null)
59
+ return null;
60
+ const parsed = document.value;
61
+ const checkRaw = parsed['check'];
62
+ const check = (checkRaw && typeof checkRaw === 'object')
63
+ ? checkRaw
64
+ : null;
65
+ const modeRaw = parsed['mode'];
66
+ const mode = typeof modeRaw === 'string' ? modeRaw : undefined;
67
+ return { prohibition: parsed['prohibition'] ?? null, check, ...(mode ? { mode } : {}) };
68
+ }
69
+ function evaluateProhibitionEnforcementGate(input) {
70
+ const req = parseRequest(input.args);
71
+ if (!req) {
72
+ return (0, gate_verdict_cjs_1.gateUsageFailure)(gate_verdict_cjs_1.GATE_FAILURE_CODE.SDK_MISSING_ARG, 'prohibition-enforcement requires a JSON request: check prohibition-enforcement <request.json> | --json \'{"prohibition":{...},"check":{...}}\'');
73
+ }
74
+ try {
75
+ const result = (0, prohibition_enforcement_cjs_1.runProhibitionEnforcement)(req.prohibition, req.check, req.mode ? { mode: req.mode } : {});
76
+ return (0, gate_verdict_cjs_1.gateVerdict)('advisory', false, { ...result });
77
+ }
78
+ catch (err) {
79
+ // The producer's own fail-closed shape (`EnforcementResult`: a `ProhibitionDisposition` plus the
80
+ // located / kind / evidence provenance): typed, so a change to that shape fails the build here
81
+ // instead of drifting silently.
82
+ const failedClosed = {
83
+ status: 'unverified',
84
+ flagged: true,
85
+ tier: null,
86
+ reason: 'exception: ' + (err instanceof Error ? err.message : String(err)),
87
+ located: false,
88
+ kind: null,
89
+ evidence: [],
90
+ ...(req.mode ? { mode: req.mode } : {}),
91
+ };
92
+ return (0, gate_verdict_cjs_1.gateUnreadable)(false, { ...failedClosed });
93
+ }
94
+ }