@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
@@ -37,6 +37,7 @@ const { getDirName } = runtimeNamePolicy;
37
37
  const capabilityRegistry = require("./capability-registry.cjs");
38
38
  const hostIntegration = require("./host-integration.cjs");
39
39
  const shell_command_projection_cjs_1 = require("./shell-command-projection.cjs");
40
+ const frontmatterModule = require("./frontmatter.cjs");
40
41
  const pattern_cjs_1 = require("./pattern.cjs");
41
42
  const markdown_sectionizer_cjs_1 = require("./markdown-sectionizer.cjs");
42
43
  // #2870: install-scope.cts is a leaf-tier sibling (imports only
@@ -847,7 +848,8 @@ function buildKimiAgentArtifacts({ rootAgent = '', subagents = [], requestedSuba
847
848
  /**
848
849
  * Apply Antigravity-specific content conversion — path replacement + command name conversion.
849
850
  * Path mappings depend on install mode:
850
- * Global: ~/.claude/ → ~/.gemini/antigravity/, ./.claude/ → ./.agents/
851
+ * Global: ~/.claude/skills/ → ~/.gemini/config/skills/ (#3738),
852
+ * ~/.claude/ → ~/.gemini/antigravity/, ./.claude/ → ./.agents/
851
853
  * Local: ~/.claude/ → .agents/, ./.claude/ → ./.agents/
852
854
  * Applied to ALL Antigravity content (skills, agents, engine files).
853
855
  * @param {string} content - Source content to convert
@@ -856,6 +858,18 @@ function buildKimiAgentArtifacts({ rootAgent = '', subagents = [], requestedSuba
856
858
  function convertClaudeToAntigravityContent(content, isGlobal = false) {
857
859
  let c = content;
858
860
  if (isGlobal) {
861
+ // #3738: global skills install under ~/.gemini/config/skills (the dir AGY
862
+ // scans for global discovery), so skills-path references must divert there
863
+ // — BEFORE the configHome rewrite below, which is correct for gsd-core
864
+ // runtime-file references (settings, workflows, VERSION) but wrong for the
865
+ // skills dir itself.
866
+ c = c.replace(/\$HOME\/\.claude\/skills\//g, '$HOME/.gemini/config/skills/');
867
+ c = c.replace(/~\/\.claude\/skills\//g, '~/.gemini/config/skills/');
868
+ // Bare skills form (no trailing slash) — must also precede the generic
869
+ // slash rule, which would otherwise divert it to the retired configHome
870
+ // path ($HOME/.gemini/antigravity/skills).
871
+ c = c.replace(/\$HOME\/\.claude\/skills\b/g, '$HOME/.gemini/config/skills');
872
+ c = c.replace(/~\/\.claude\/skills\b/g, '~/.gemini/config/skills');
859
873
  c = c.replace(/\$HOME\/\.claude\//g, '$HOME/.gemini/antigravity/');
860
874
  c = c.replace(/~\/\.claude\//g, '~/.gemini/antigravity/');
861
875
  // Bare form (no trailing slash) — must come after slash form to avoid double-replace
@@ -1702,7 +1716,26 @@ function neutralizeAgentReferences(content, instructionFile) {
1702
1716
  c = c.replace(/Do NOT load full `AGENTS\.md` files[^\n]*/g, '');
1703
1717
  return c;
1704
1718
  }
1705
- function convertClaudeToOpencodeFrontmatter(content, { isAgent = false, modelOverride = null } = {}) {
1719
+ /**
1720
+ * Render one frontmatter `key: value` line whose value came from user config.
1721
+ *
1722
+ * #3706: both `model:` and `variant:` interpolate a value read from
1723
+ * `.planning/config.json` / `~/.gsd/defaults.json`. Raw interpolation lets a value
1724
+ * containing a newline inject additional TOP-LEVEL frontmatter keys into the
1725
+ * generated agent file — proven by execution during the #3705 security review
1726
+ * (`"sonnet\ntools: [\"*\"]\npermission: bypass"` produced two extra keys).
1727
+ *
1728
+ * That sink predates #3706, but this change adds a SECOND write to it, so it is
1729
+ * closed here rather than doubled. Both the decision and the escaping live in
1730
+ * frontmatter.cts so there is exactly one set of YAML scalar rules; a value that
1731
+ * round-trips bare is still emitted bare, so generated files do not churn.
1732
+ */
1733
+ function frontmatterScalar(key, value) {
1734
+ return frontmatterModule.agentScalarNeedsDoubleQuoting(value)
1735
+ ? `${key} "${frontmatterModule.escapeDoubleQuotedScalar(value)}"`
1736
+ : `${key} ${value}`;
1737
+ }
1738
+ function convertClaudeToOpencodeFrontmatter(content, { isAgent = false, modelOverride = null, variant = null } = {}) {
1706
1739
  // Replace tool name references in content (applies to all files)
1707
1740
  let convertedContent = content;
1708
1741
  convertedContent = convertedContent.replace(/\bAskUserQuestion\b/g, 'question');
@@ -1827,7 +1860,23 @@ function convertClaudeToOpencodeFrontmatter(content, { isAgent = false, modelOve
1827
1860
  // respected on OpenCode (which uses static agent frontmatter, not inline
1828
1861
  // Task() model parameters). See #2256.
1829
1862
  if (modelOverride) {
1830
- newLines.push(['model:', modelOverride].join(' '));
1863
+ newLines.push(frontmatterScalar('model:', modelOverride));
1864
+ }
1865
+ // #3706: deliver the RESOLVED reasoning effort to the spawned subagent.
1866
+ // `query resolve-model` reported an effort that never reached OpenCode, so
1867
+ // every subagent ran at whatever opencode.jsonc defaults the model to — for
1868
+ // a custom provider commonly the most expensive setting.
1869
+ //
1870
+ // OpenCode ONLY: `EFFORT_ARGV` declares surfaces for claude/opencode/codex
1871
+ // and NO kilo entry, so the Kilo converter below deliberately does not emit
1872
+ // this. Unlike the model side — where #2794 J8 requires kilo and opencode to
1873
+ // resolve identically — there is no kilo effort surface to render into, and
1874
+ // inventing one would emit a key that runtime never documented.
1875
+ //
1876
+ // Omitted entirely when absent, per #1156's rule for `model: inherit`:
1877
+ // never an empty or sentinel value, let the runtime use its own default.
1878
+ if (variant) {
1879
+ newLines.push(frontmatterScalar('variant:', variant));
1831
1880
  }
1832
1881
  }
1833
1882
  // For commands: add tools object if we had allowed-tools or tools
@@ -1999,7 +2048,7 @@ function convertClaudeToKiloFrontmatter(content, { isAgent = false, modelOverrid
1999
2048
  // model emission exactly (#2093 UPGRADE 2 / ADR-1239; Kilo is an OpenCode
2000
2049
  // fork with the same static-frontmatter model constraint). See #2256.
2001
2050
  if (modelOverride) {
2002
- newLines.push(['model:', modelOverride].join(' '));
2051
+ newLines.push(frontmatterScalar('model:', modelOverride));
2003
2052
  }
2004
2053
  newLines.push(...buildKiloAgentPermissionBlock(agentTools));
2005
2054
  }
@@ -2692,7 +2741,13 @@ function restoreClaudeGlobalAtRefTilde(content, pathPrefix) {
2692
2741
  return content;
2693
2742
  const tildeEquivalent = '~' + pathPrefix.slice('$HOME'.length);
2694
2743
  const atRefRe = new RegExp(`(?<!["'])@${(0, pattern_cjs_1.escapeRegex)(pathPrefix)}`, 'g');
2695
- return content.replace(atRefRe, `@${tildeEquivalent}`);
2744
+ // Function replacement, not a string. A string replacement treats `$&` and the
2745
+ // backtick-dollar form in the SUBSTITUTION as special patterns, so a --config-dir
2746
+ // containing either corrupts output: `$HOME/.cl$&ude/` yielded
2747
+ // `@~/.cl@$HOME/.cl$&ude/ude/x`, and the backtick form silently DROPPED text.
2748
+ // Pre-existing, and #3719 adds a THIRD call site to this sink — which is how the
2749
+ // previous two came to share the defect in the first place.
2750
+ return content.replace(atRefRe, () => `@${tildeEquivalent}`);
2696
2751
  }
2697
2752
  /**
2698
2753
  * Apply the per-runtime rewrite table to a single content string.
@@ -3124,8 +3179,34 @@ function applyAgentPathRewrites(content, runtime, pathPrefix) {
3124
3179
  const normalizedPathPrefix = pathPrefix.replace(/\/$/, '');
3125
3180
  content = content.replace(/~\/\.claude\//g, pathPrefix);
3126
3181
  content = content.replace(/\$HOME\/\.claude\//g, pathPrefix);
3127
- content = content.replace(/~\/\.claude\b/g, normalizedPathPrefix);
3128
- content = content.replace(/\$HOME\/\.claude\b/g, normalizedPathPrefix);
3182
+ // #3719 review (MAJOR): a bare `\b` is satisfied by ANY non-word character,
3183
+ // including '-' — for a --config-dir whose name EXTENDS '.claude' (e.g.
3184
+ // '.claude-work'), this re-matched the '.claude' PREFIX of the emitted
3185
+ // '.claude-work' path and corrupted it to '.claude-work-work'. Guard with
3186
+ // the SAME negative-lookahead convention already used at
3187
+ // copyWithPathReplacement's call site (bin/install.js:7729-7730).
3188
+ content = content.replace(/~\/\.claude(?![\w-])/g, normalizedPathPrefix);
3189
+ content = content.replace(/\$HOME\/\.claude(?![\w-])/g, normalizedPathPrefix);
3190
+ // #3719: the THIRD emit path that needed this restore. #3133 added it to the
3191
+ // skill/command pipeline (`_applyRuntimeRewrites` case 'claude') and #3544 to
3192
+ // bin/install.js's spec-tree copy; the agents pipeline never got it, so every
3193
+ // `@~/.claude/...` include in a global Claude install shipped as `@$HOME/...`
3194
+ // and resolved to NOTHING (27 of 34 emitted agents, 103 lines).
3195
+ //
3196
+ // Guarded on `claude` for the same reason the sibling call site lives inside
3197
+ // `case 'claude'`: the helper self-guards only on the `$HOME` PREFIX, and every
3198
+ // runtime's global prefix is a `$HOME` form (`$HOME/.cursor/`, ...), so an
3199
+ // unguarded call would rewrite `@`-refs for runtimes whose resolver has no
3200
+ // documented `~` expansion at all.
3201
+ //
3202
+ // Passed the NORMALIZED prefix, not `pathPrefix`. The two word-boundary
3203
+ // replaces above emit the trailing-slash-free form, and the helper's regex is
3204
+ // anchored to the exact prefix string it is handed — so `restore(pathPrefix)`
3205
+ // fixes `@$HOME/.claude/x` and leaves a bare `@$HOME/.claude` broken. The
3206
+ // normalized form is a PREFIX of both, so one call covers both.
3207
+ if (runtime === 'claude') {
3208
+ content = restoreClaudeGlobalAtRefTilde(content, normalizedPathPrefix);
3209
+ }
3129
3210
  return content;
3130
3211
  }
3131
3212
  // ── End rewrite engine ────────────────────────────────────────────────────────
@@ -3243,7 +3324,14 @@ function applyAgentFrontmatterExtensions(content, { runtime, agentName, targetDi
3243
3324
  // effort key, so skipping injection is the whole job.
3244
3325
  if (universalEffort !== 'inherit') {
3245
3326
  const renderedEffort = _getGsdEffortCatalog().renderEffortForRuntime(runtime, universalEffort).value;
3246
- result = injectEffortFrontmatter(result, renderedEffort);
3327
+ // #3007: `value` is `string | null` — a rejected/unrenderable level (e.g.
3328
+ // 'ultra', or a catalog with no advertised level at or above the request)
3329
+ // renders null. Same posture as the 'inherit' case above: omit the key
3330
+ // entirely rather than writing a literal `effort: null`, so the host
3331
+ // falls back to its own default instead of failing to parse.
3332
+ if (renderedEffort !== null) {
3333
+ result = injectEffortFrontmatter(result, renderedEffort);
3334
+ }
3247
3335
  }
3248
3336
  const disallowedTools = READONLY_AGENT_DISALLOWED_TOOLS[agentName];
3249
3337
  if (disallowedTools)
@@ -36,6 +36,10 @@ const conversionExports = runtimeArtifactConversion;
36
36
  // rather than re-deriving the chain per runtime.
37
37
  // eslint-disable-next-line @typescript-eslint/no-require-imports
38
38
  const installModelOverrideResolver = require("./install-model-override-resolver.cjs");
39
+ // eslint-disable-next-line @typescript-eslint/no-require-imports -- export= CommonJS module, same as the sibling resolver import above
40
+ const installEffortResolver = require("./install-effort-resolver.cjs");
41
+ // eslint-disable-next-line @typescript-eslint/no-require-imports -- export= CommonJS module, same as the sibling resolver import above
42
+ const modelCatalog = require("./model-catalog.cjs");
39
43
  const shell_command_projection_cjs_1 = require("./shell-command-projection.cjs");
40
44
  // #2870: `isGlobalScope` centralizes the `scope === 'global'` boolean
41
45
  // projection both kind-builder closures below need at the converters'
@@ -346,11 +350,40 @@ function convertedAgentsKind(destSubpath, prefix, converterName, configDir, scop
346
350
  const overrideTargetDir = agentCtx?.targetDir ?? configDir;
347
351
  const modelOverrides = installModelOverrideResolver.readGsdEffectiveModelOverrides(overrideTargetDir);
348
352
  const runtimeResolver = installModelOverrideResolver.readGsdRuntimeProfileResolver(overrideTargetDir);
353
+ // #3706: the resolved reasoning effort, threaded exactly as the model is —
354
+ // config read ONCE per stage(), per-agent value resolved per file.
355
+ //
356
+ // Gated on the effort config being PRESENT, not on a value coming back.
357
+ // `resolveInstallTimeEffort` always returns something (measured: 'high'
358
+ // even with no project config and no effort block), so "skip when
359
+ // resolution yields no value" has no trigger and would stamp `variant:`
360
+ // into every generated agent file for every existing install. OpenCode's
361
+ // built-in variant sets are provider-specific upstream (Anthropic ships
362
+ // only `high`/`max`), so a level GSD resolved is not guaranteed to name a
363
+ // variant the user's provider actually has — emitting one unasked-for is
364
+ // the risk this gate avoids. #1156's rule for `model: inherit` is the
365
+ // precedent: do not emit a key the runtime may not understand.
366
+ //
367
+ // OpenCode only; the kilo converter ignores the field (no EFFORT_ARGV.kilo).
368
+ const effortConfig = converterName === 'convertClaudeToOpencodeFrontmatter'
369
+ ? installEffortResolver.readGsdEffectiveEffortConfig(overrideTargetDir)
370
+ : null;
349
371
  converter = (content, _isGlobal, meta) => {
350
372
  const modelOverride = meta
351
373
  ? installModelOverrideResolver.resolveAgentModelOverride(meta.agentName, modelOverrides, runtimeResolver)
352
374
  : null;
353
- return rawConverter(content, { isAgent: true, modelOverride });
375
+ // The universal level is NOT emitted raw. `clampEffortForHost` is the
376
+ // declared OpenCode effort capability (EFFORT_ARGV.opencode: its own
377
+ // `supported` set + `clamp`), and it is what rejects a level that is
378
+ // not a wire value — most importantly `inherit`, which per #3533 (10d)
379
+ // means "omit the key and follow the host default" and must never be
380
+ // written literally. Anything unsupported clamps to null, which omits
381
+ // the key rather than inventing one.
382
+ const universal = effortConfig && meta
383
+ ? installEffortResolver.resolveInstallTimeEffort(effortConfig, meta.agentName)
384
+ : null;
385
+ const variant = universal ? modelCatalog.clampEffortForHost('opencode', universal) : null;
386
+ return rawConverter(content, { isAgent: true, modelOverride, variant });
354
387
  };
355
388
  }
356
389
  else {