@opengsd/gsd-core 1.9.1 → 1.11.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 (426) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +2 -3
  3. package/.opencode/plugins/gsd-core.js +8 -1
  4. package/agents/gsd-code-fixer.md +27 -3
  5. package/agents/gsd-debug-session-manager.md +11 -0
  6. package/agents/gsd-debugger.md +12 -246
  7. package/agents/gsd-doc-synthesizer.md +2 -4
  8. package/agents/gsd-executor.md +12 -10
  9. package/agents/gsd-integration-checker.md +3 -0
  10. package/agents/gsd-mempalace-curator.md +5 -2
  11. package/agents/gsd-phase-researcher.md +20 -1
  12. package/agents/gsd-plan-checker.md +46 -0
  13. package/agents/gsd-planner.md +49 -54
  14. package/agents/gsd-roadmapper.md +21 -3
  15. package/agents/gsd-user-profiler.md +3 -0
  16. package/agents/gsd-verifier.md +26 -73
  17. package/bin/install.js +1272 -1238
  18. package/bin/lib/ui-safety-gate.cjs +2 -0
  19. package/commands/gsd/code-review.md +1 -1
  20. package/commands/gsd/execute-phase.md +1 -1
  21. package/commands/gsd/map-codebase.md +1 -1
  22. package/commands/gsd/mempalace-capture.md +2 -2
  23. package/commands/gsd/mempalace-recall.md +1 -1
  24. package/commands/gsd/new-milestone.md +2 -2
  25. package/commands/gsd/plan-phase.md +1 -1
  26. package/commands/gsd/quick.md +1 -1
  27. package/commands/gsd/review-backlog.md +2 -1
  28. package/commands/gsd/verify-work.md +1 -1
  29. package/gsd-core/bin/gsd-tools.cjs +1009 -115
  30. package/gsd-core/bin/lib/active-workstream-store.cjs +153 -12
  31. package/gsd-core/bin/lib/agent-install-check.cjs +268 -38
  32. package/gsd-core/bin/lib/api-coverage.cjs +123 -5
  33. package/gsd-core/bin/lib/artifacts.cjs +3 -0
  34. package/gsd-core/bin/lib/assumption-delta.cjs +2 -4
  35. package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
  36. package/gsd-core/bin/lib/audit.cjs +926 -202
  37. package/gsd-core/bin/lib/broken-windows.cjs +36 -6
  38. package/gsd-core/bin/lib/capability-consent.cjs +149 -15
  39. package/gsd-core/bin/lib/capability-lifecycle.cjs +45 -0
  40. package/gsd-core/bin/lib/capability-registry.cjs +608 -148
  41. package/gsd-core/bin/lib/capability-source.cjs +92 -0
  42. package/gsd-core/bin/lib/capability-trust.cjs +444 -25
  43. package/gsd-core/bin/lib/capability-validator.cjs +507 -24
  44. package/gsd-core/bin/lib/capability-writer.cjs +3 -2
  45. package/gsd-core/bin/lib/check-command-router.cjs +114 -38
  46. package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
  47. package/gsd-core/bin/lib/codex-agent-toml.cjs +329 -0
  48. package/gsd-core/bin/lib/command-aliases.cjs +94 -0
  49. package/gsd-core/bin/lib/command-roster.cjs +44 -1
  50. package/gsd-core/bin/lib/commands.cjs +665 -99
  51. package/gsd-core/bin/lib/commonjs-marker.cjs +142 -0
  52. package/gsd-core/bin/lib/complexity-trigger.cjs +1172 -0
  53. package/gsd-core/bin/lib/config-loader.cjs +76 -0
  54. package/gsd-core/bin/lib/config.cjs +22 -2
  55. package/gsd-core/bin/lib/context-composer.cjs +278 -0
  56. package/gsd-core/bin/lib/context-predicates.cjs +506 -0
  57. package/gsd-core/bin/lib/core-utils.cjs +217 -40
  58. package/gsd-core/bin/lib/decisions.cjs +23 -0
  59. package/gsd-core/bin/lib/docs.cjs +3 -2
  60. package/gsd-core/bin/lib/external-job.cjs +19 -4
  61. package/gsd-core/bin/lib/fallow-runner.cjs +20 -44
  62. package/gsd-core/bin/lib/frontmatter.cjs +239 -32
  63. package/gsd-core/bin/lib/gap-checker.cjs +68 -7
  64. package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +57 -6
  65. package/gsd-core/bin/lib/git-base-branch.cjs +160 -15
  66. package/gsd-core/bin/lib/graphify.cjs +142 -27
  67. package/gsd-core/bin/lib/gsd2-import.cjs +37 -5
  68. package/gsd-core/bin/lib/health-diagnostic-rules/agent-install.cjs +101 -0
  69. package/gsd-core/bin/lib/health-diagnostic-rules/config-validation.cjs +348 -0
  70. package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +145 -0
  71. package/gsd-core/bin/lib/health-diagnostic-rules/install-surface-shadowing.cjs +98 -0
  72. package/gsd-core/bin/lib/health-diagnostic-rules/milestone-archive-hygiene.cjs +100 -0
  73. package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +222 -0
  74. package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +265 -0
  75. package/gsd-core/bin/lib/health-diagnostic-rules/root-existence.cjs +161 -0
  76. package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +303 -0
  77. package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +173 -0
  78. package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
  79. package/gsd-core/bin/lib/health-diagnostic.cjs +431 -0
  80. package/gsd-core/bin/lib/host-integration.cjs +13 -1
  81. package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
  82. package/gsd-core/bin/lib/init-command-router.cjs +83 -8
  83. package/gsd-core/bin/lib/init.cjs +1325 -169
  84. package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
  85. package/gsd-core/bin/lib/install-engine.cjs +805 -264
  86. package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
  87. package/gsd-core/bin/lib/install-model-override-resolver.cjs +203 -0
  88. package/gsd-core/bin/lib/install-profiles.cjs +160 -57
  89. package/gsd-core/bin/lib/install-scope.cjs +270 -0
  90. package/gsd-core/bin/lib/install-shadow-report.cjs +385 -0
  91. package/gsd-core/bin/lib/installed-surface-resolver.cjs +381 -0
  92. package/gsd-core/bin/lib/installer-migration-authoring.cjs +3 -1
  93. package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
  94. package/gsd-core/bin/lib/installer-migrations/007-retire-config-root-commonjs-marker.cjs +149 -0
  95. package/gsd-core/bin/lib/installer-migrations/008-cursor-retire-commands-surface.cjs +55 -0
  96. package/gsd-core/bin/lib/installer-migrations/009-pi-retire-reserved-hooks-dir.cjs +199 -0
  97. package/gsd-core/bin/lib/installer-migrations.cjs +206 -13
  98. package/gsd-core/bin/lib/io.cjs +38 -3
  99. package/gsd-core/bin/lib/markdown-sectionizer.cjs +8 -1
  100. package/gsd-core/bin/lib/markdown-table.cjs +133 -20
  101. package/gsd-core/bin/lib/mcp-catalog.cjs +518 -0
  102. package/gsd-core/bin/lib/mcp-server.cjs +135 -3
  103. package/gsd-core/bin/lib/milestone-lock.cjs +248 -0
  104. package/gsd-core/bin/lib/milestone.cjs +821 -109
  105. package/gsd-core/bin/lib/model-catalog.cjs +59 -1
  106. package/gsd-core/bin/lib/model-resolver.cjs +183 -40
  107. package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
  108. package/gsd-core/bin/lib/pattern.cjs +122 -0
  109. package/gsd-core/bin/lib/phase-estimation.cjs +1 -1
  110. package/gsd-core/bin/lib/phase-id.cjs +507 -36
  111. package/gsd-core/bin/lib/phase-lifecycle.cjs +28 -3
  112. package/gsd-core/bin/lib/phase-locator.cjs +258 -58
  113. package/gsd-core/bin/lib/phase.cjs +891 -156
  114. package/gsd-core/bin/lib/plan-dependency-graph.cjs +303 -0
  115. package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
  116. package/gsd-core/bin/lib/plan-scan.cjs +86 -2
  117. package/gsd-core/bin/lib/planning-scope.cjs +31 -0
  118. package/gsd-core/bin/lib/planning-snapshot.cjs +890 -0
  119. package/gsd-core/bin/lib/planning-workspace.cjs +60 -6
  120. package/gsd-core/bin/lib/probe-core.cjs +1 -1
  121. package/gsd-core/bin/lib/profile-output.cjs +1 -1
  122. package/gsd-core/bin/lib/prompt-budget.cjs +128 -165
  123. package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +740 -0
  124. package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +85 -0
  125. package/gsd-core/bin/lib/review-lane-descriptor.cjs +108 -0
  126. package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
  127. package/gsd-core/bin/lib/review-lane-runner.cjs +447 -68
  128. package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
  129. package/gsd-core/bin/lib/roadmap-command-router.cjs +76 -9
  130. package/gsd-core/bin/lib/roadmap-parser.cjs +1035 -194
  131. package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
  132. package/gsd-core/bin/lib/roadmap.cjs +405 -84
  133. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +795 -100
  134. package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
  135. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +440 -57
  136. package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
  137. package/gsd-core/bin/lib/runtime-homes.cjs +220 -41
  138. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +220 -44
  139. package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
  140. package/gsd-core/bin/lib/runtime-slash.cjs +27 -9
  141. package/gsd-core/bin/lib/section-manifest.cjs +209 -0
  142. package/gsd-core/bin/lib/security.cjs +104 -5
  143. package/gsd-core/bin/lib/shell-command-projection.cjs +388 -30
  144. package/gsd-core/bin/lib/smart-entry.cjs +154 -22
  145. package/gsd-core/bin/lib/state-command-router.cjs +5 -1
  146. package/gsd-core/bin/lib/state-document.cjs +152 -8
  147. package/gsd-core/bin/lib/state-transition.cjs +424 -105
  148. package/gsd-core/bin/lib/state.cjs +1927 -401
  149. package/gsd-core/bin/lib/surface.cjs +35 -10
  150. package/gsd-core/bin/lib/text-lines.cjs +80 -0
  151. package/gsd-core/bin/lib/token-scanner.cjs +76 -0
  152. package/gsd-core/bin/lib/uat-predicate.cjs +20 -4
  153. package/gsd-core/bin/lib/uat.cjs +706 -64
  154. package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
  155. package/gsd-core/bin/lib/ui-safety-gate.cjs +14 -5
  156. package/gsd-core/bin/lib/unusable-input.cjs +33 -0
  157. package/gsd-core/bin/lib/update-context.cjs +8 -2
  158. package/gsd-core/bin/lib/user-artifact-staging.cjs +705 -0
  159. package/gsd-core/bin/lib/validate.cjs +20 -6
  160. package/gsd-core/bin/lib/vendor/README.md +37 -0
  161. package/gsd-core/bin/lib/vendor/re2js.cjs +6480 -0
  162. package/gsd-core/bin/lib/vendor/re2js.d.cts +938 -0
  163. package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
  164. package/gsd-core/bin/lib/verification.cjs +287 -20
  165. package/gsd-core/bin/lib/verify.cjs +368 -880
  166. package/gsd-core/bin/lib/workflow-fragments.cjs +557 -0
  167. package/gsd-core/bin/lib/workstream-inventory-builder.cjs +203 -19
  168. package/gsd-core/bin/lib/workstream-inventory.cjs +576 -31
  169. package/gsd-core/bin/lib/workstream.cjs +8 -2
  170. package/gsd-core/bin/lib/worktree-base-ref.cjs +50 -6
  171. package/gsd-core/bin/lib/worktree-safety.cjs +450 -125
  172. package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
  173. package/gsd-core/bin/shared/config-schema.manifest.json +9 -1
  174. package/gsd-core/references/agent-contracts.md +43 -26
  175. package/gsd-core/references/artifact-types.md +10 -3
  176. package/gsd-core/references/autonomous-ui-design-contract.md +42 -0
  177. package/gsd-core/references/checkpoints.md +2 -2
  178. package/gsd-core/references/context-budget.md +1 -1
  179. package/gsd-core/references/debugger-techniques.md +255 -0
  180. package/gsd-core/references/dispatch-isolation-gate.md +138 -0
  181. package/gsd-core/references/doc-conflict-engine.md +1 -1
  182. package/gsd-core/references/execute-mvp-tdd.md +3 -3
  183. package/gsd-core/references/execute-phase-between-wave-reset.md +6 -2
  184. package/gsd-core/references/execute-phase-context-guard.md +1 -1
  185. package/gsd-core/references/execute-phase-response-language.md +1 -1
  186. package/gsd-core/references/execute-phase-wave-guard.md +6 -2
  187. package/gsd-core/references/gate-prompts.md +1 -1
  188. package/gsd-core/references/git-planning-commit.md +2 -1
  189. package/gsd-core/references/loop-hook-dispatch.md +39 -2
  190. package/gsd-core/references/model-profiles.md +12 -4
  191. package/gsd-core/references/mvp-concepts.md +9 -9
  192. package/gsd-core/references/planner-guidance.md +3 -9
  193. package/gsd-core/references/planner-preconditions.md +1 -1
  194. package/gsd-core/references/planner-reviews.md +1 -1
  195. package/gsd-core/references/planning-config.md +8 -6
  196. package/gsd-core/references/research-documentation-lookup.md +5 -3
  197. package/gsd-core/references/revision-loop.md +1 -1
  198. package/gsd-core/references/specless-probe-fallback.md +8 -7
  199. package/gsd-core/references/universal-anti-patterns.md +3 -3
  200. package/gsd-core/references/verifier-phase-gates.md +192 -0
  201. package/gsd-core/references/verifier-wiring-patterns.md +100 -0
  202. package/gsd-core/references/verify-mvp-mode.md +1 -1
  203. package/gsd-core/references/workstream-flag.md +22 -6
  204. package/gsd-core/references/worktree-branch-check.md +2 -2
  205. package/gsd-core/templates/discussion-log.md +1 -1
  206. package/gsd-core/templates/phase-prompt.md +2 -4
  207. package/gsd-core/templates/state.md +4 -4
  208. package/gsd-core/templates/summary-complex.md +2 -0
  209. package/gsd-core/templates/summary-minimal.md +2 -0
  210. package/gsd-core/templates/summary-standard.md +2 -0
  211. package/gsd-core/templates/summary.md +2 -0
  212. package/gsd-core/templates/verification-report.md +9 -1
  213. package/gsd-core/workflows/ai-integration-phase.md +9 -11
  214. package/gsd-core/workflows/audit-milestone.md +3 -0
  215. package/gsd-core/workflows/autonomous/steps/converge-banner.md +1 -0
  216. package/gsd-core/workflows/autonomous/steps/converge-dispatch-bg.md +11 -0
  217. package/gsd-core/workflows/autonomous/steps/converge-dispatch-inline.md +7 -0
  218. package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +21 -0
  219. package/gsd-core/workflows/autonomous/steps/converge-loop.md +7 -0
  220. package/gsd-core/workflows/autonomous.md +33 -70
  221. package/gsd-core/workflows/cleanup.md +62 -3
  222. package/gsd-core/workflows/code-review/steps/dispatch-fix.md +39 -0
  223. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +93 -0
  224. package/gsd-core/workflows/code-review-fix.md +37 -10
  225. package/gsd-core/workflows/code-review.md +74 -166
  226. package/gsd-core/workflows/complete-milestone/steps/git-tag.md +29 -0
  227. package/gsd-core/workflows/complete-milestone.md +160 -95
  228. package/gsd-core/workflows/debug.md +16 -17
  229. package/gsd-core/workflows/diagnose-issues.md +56 -8
  230. package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -1
  231. package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
  232. package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +15 -0
  233. package/gsd-core/workflows/discuss-phase-assumptions.md +7 -17
  234. package/gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md +51 -0
  235. package/gsd-core/workflows/docs-update.md +8 -51
  236. package/gsd-core/workflows/edit-phase.md +26 -1
  237. package/gsd-core/workflows/eval-review.md +3 -5
  238. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +64 -7
  239. package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +50 -0
  240. package/gsd-core/workflows/execute-phase/steps/partial-wave.md +31 -0
  241. package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +77 -0
  242. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +21 -0
  243. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +42 -0
  244. package/gsd-core/workflows/execute-phase/steps/regression-gate.md +43 -37
  245. package/gsd-core/workflows/execute-phase.md +103 -187
  246. package/gsd-core/workflows/execute-plan.md +36 -4
  247. package/gsd-core/workflows/explore.md +131 -4
  248. package/gsd-core/workflows/fast.md +10 -2
  249. package/gsd-core/workflows/health.md +73 -4
  250. package/gsd-core/workflows/help/modes/full.md +6 -1
  251. package/gsd-core/workflows/import.md +4 -4
  252. package/gsd-core/workflows/ingest-docs.md +7 -6
  253. package/gsd-core/workflows/mvp-phase.md +6 -3
  254. package/gsd-core/workflows/new-milestone/steps/project-md-milestone-write.md +16 -0
  255. package/gsd-core/workflows/new-milestone/steps/reset-phase-safety.md +19 -0
  256. package/gsd-core/workflows/new-milestone.md +35 -47
  257. package/gsd-core/workflows/new-project/steps/auto-mode-config.md +176 -0
  258. package/gsd-core/workflows/new-project/steps/auto-mode-detection.md +32 -0
  259. package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +18 -0
  260. package/gsd-core/workflows/new-project.md +27 -240
  261. package/gsd-core/workflows/next.md +12 -0
  262. package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +15 -0
  263. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +110 -0
  264. package/gsd-core/workflows/plan-phase/steps/prd-express-gate.md +8 -0
  265. package/gsd-core/workflows/plan-phase/steps/research-only-early-exit.md +17 -0
  266. package/gsd-core/workflows/plan-phase/steps/research-only-modifiers.md +16 -0
  267. package/gsd-core/workflows/plan-phase/steps/reviews-prerequisite.md +17 -0
  268. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +149 -0
  269. package/gsd-core/workflows/plan-phase.md +89 -209
  270. package/gsd-core/workflows/plan-review-convergence.md +50 -2
  271. package/gsd-core/workflows/progress/steps/forensic-audit.md +125 -0
  272. package/gsd-core/workflows/progress/steps/mvp-display.md +18 -0
  273. package/gsd-core/workflows/progress.md +45 -159
  274. package/gsd-core/workflows/quick/steps/discussion-phase.md +124 -0
  275. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +111 -0
  276. package/gsd-core/workflows/quick/steps/quick-verification.md +67 -0
  277. package/gsd-core/workflows/quick/steps/research-phase.md +72 -0
  278. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +37 -0
  279. package/gsd-core/workflows/quick.md +55 -405
  280. package/gsd-core/workflows/resume-project.md +3 -0
  281. package/gsd-core/workflows/review/steps/reviewer-instances-note-1.md +4 -0
  282. package/gsd-core/workflows/review/steps/reviewer-instances-note-2.md +3 -0
  283. package/gsd-core/workflows/review.md +41 -13
  284. package/gsd-core/workflows/section-manifest.json +219 -0
  285. package/gsd-core/workflows/secure-phase.md +1 -1
  286. package/gsd-core/workflows/session-report.md +2 -1
  287. package/gsd-core/workflows/settings.md +66 -2
  288. package/gsd-core/workflows/ship.md +104 -44
  289. package/gsd-core/workflows/sketch.md +1 -1
  290. package/gsd-core/workflows/spec-phase.md +41 -20
  291. package/gsd-core/workflows/spike-wrap-up.md +20 -5
  292. package/gsd-core/workflows/spike.md +50 -16
  293. package/gsd-core/workflows/sync-skills.md +106 -13
  294. package/gsd-core/workflows/transition/steps/workstream-collision-check.md +17 -0
  295. package/gsd-core/workflows/transition.md +53 -31
  296. package/gsd-core/workflows/ui-phase.md +13 -12
  297. package/gsd-core/workflows/ui-review.md +2 -2
  298. package/gsd-core/workflows/update/steps/channel-banner.md +7 -0
  299. package/gsd-core/workflows/update.md +19 -8
  300. package/gsd-core/workflows/validate-phase.md +1 -1
  301. package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +36 -0
  302. package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +21 -0
  303. package/gsd-core/workflows/verify-work.md +17 -65
  304. package/hooks/dist/gsd-agent-isolation-guard.js +517 -0
  305. package/hooks/dist/gsd-check-update-worker.js +64 -12
  306. package/hooks/dist/gsd-check-update.js +19 -1
  307. package/hooks/dist/gsd-cursor-pre-tool.js +0 -3
  308. package/hooks/dist/gsd-cursor-subagent-start.js +607 -26
  309. package/hooks/dist/gsd-cursor-subagent-stop.js +3 -2
  310. package/hooks/dist/gsd-prompt-guard.js +21 -20
  311. package/hooks/dist/gsd-read-injection-scanner.js +45 -24
  312. package/hooks/dist/gsd-statusline.js +90 -6
  313. package/hooks/dist/gsd-update-banner.js +22 -1
  314. package/hooks/dist/gsd-workflow-guard.js +134 -36
  315. package/hooks/dist/gsd-worktree-path-guard.js +2 -1
  316. package/hooks/dist/gsd-write-guard.js +359 -0
  317. package/hooks/dist/lib/git-cmd.js +92 -59
  318. package/hooks/dist/lib/injection-patterns.js +45 -0
  319. package/hooks/dist/lib/isolation-deny-reason.js +39 -0
  320. package/hooks/dist/lib/isolation-sentinel.js +277 -0
  321. package/hooks/dist/managed-hooks-registry.cjs +2 -0
  322. package/hooks/gsd-agent-isolation-guard.js +517 -0
  323. package/hooks/gsd-check-update-worker.js +64 -12
  324. package/hooks/gsd-check-update.js +19 -1
  325. package/hooks/gsd-cursor-pre-tool.js +0 -3
  326. package/hooks/gsd-cursor-subagent-start.js +607 -26
  327. package/hooks/gsd-cursor-subagent-stop.js +3 -2
  328. package/hooks/gsd-prompt-guard.js +21 -20
  329. package/hooks/gsd-read-injection-scanner.js +45 -24
  330. package/hooks/gsd-statusline.js +90 -6
  331. package/hooks/gsd-update-banner.js +22 -1
  332. package/hooks/gsd-workflow-guard.js +134 -36
  333. package/hooks/gsd-worktree-path-guard.js +2 -1
  334. package/hooks/gsd-write-guard.js +359 -0
  335. package/hooks/hooks.json +12 -0
  336. package/hooks/lib/git-cmd.js +92 -59
  337. package/hooks/lib/injection-patterns.js +45 -0
  338. package/hooks/lib/isolation-deny-reason.js +39 -0
  339. package/hooks/lib/isolation-sentinel.js +277 -0
  340. package/hooks/managed-hooks-registry.cjs +2 -0
  341. package/package.json +31 -10
  342. package/pi/gsd.cjs +71 -12
  343. package/scripts/baselines/planning-prompt-drift-baseline.json +4 -0
  344. package/scripts/baselines/planning-snapshot-bypass-baseline.json +12 -0
  345. package/scripts/baselines/unreachable-guard-drift-baseline.json +4 -0
  346. package/scripts/build-hooks.js +9 -0
  347. package/scripts/changeset/lint.cjs +68 -6
  348. package/scripts/changeset/serialize.cjs +5 -1
  349. package/scripts/check-alias-drift.cjs +7 -43
  350. package/scripts/check-contract-drift.cjs +297 -0
  351. package/scripts/ci-test-scope.cjs +19 -2
  352. package/scripts/command-contract-helpers.cjs +903 -1
  353. package/scripts/gen-adr-index.cjs +728 -38
  354. package/scripts/gen-capability-matrix.cjs +1 -1
  355. package/scripts/gen-capability-registry.cjs +3 -15
  356. package/scripts/gen-context-index.cjs +439 -0
  357. package/scripts/gen-health-docs.cjs +390 -0
  358. package/scripts/gen-inventory-manifest.cjs +150 -4
  359. package/scripts/gen-loop-host-contract.cjs +4 -24
  360. package/scripts/gen-prompt-budget-parity-corpus.cjs +645 -0
  361. package/scripts/gen-registry.cjs +3 -14
  362. package/scripts/gen-section-manifest.cjs +638 -0
  363. package/scripts/generate-package-identity.cjs +4 -2
  364. package/scripts/lib/alias-drift-families.cjs +46 -0
  365. package/scripts/lib/drift-scan.cjs +278 -0
  366. package/scripts/lint-allow-test-rule-refs.allowlist.json +15 -54
  367. package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +4 -0
  368. package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +3 -0
  369. package/scripts/lint-canary-version-leak.cjs +73 -0
  370. package/scripts/lint-command-contract.cjs +96 -13
  371. package/scripts/lint-compiled-artifact-sync.cjs +6 -1
  372. package/scripts/lint-completion-predicate-drift.cjs +933 -0
  373. package/scripts/lint-completion-ratio-drift.cjs +214 -0
  374. package/scripts/lint-default-flip-documentation.cjs +193 -0
  375. package/scripts/lint-docs-command-form.cjs +195 -0
  376. package/scripts/lint-docs-required.cjs +9 -1
  377. package/scripts/lint-emitted-drift-ack.cjs +215 -20
  378. package/scripts/lint-eslint-glob-coverage.allowlist.json +34 -0
  379. package/scripts/lint-eslint-glob-coverage.cjs +340 -0
  380. package/scripts/lint-example-parser-parity.cjs +395 -0
  381. package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
  382. package/scripts/lint-health-diagnostic-rule-table.cjs +404 -0
  383. package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
  384. package/scripts/lint-milestone-window-drift.cjs +468 -0
  385. package/scripts/lint-phase-enumeration-drift.cjs +479 -0
  386. package/scripts/lint-plan-count-drift.cjs +318 -0
  387. package/scripts/lint-planning-artifact-writer-drift.cjs +398 -0
  388. package/scripts/lint-planning-prompt-drift.cjs +434 -0
  389. package/scripts/lint-planning-snapshot-bypass-drift.cjs +544 -0
  390. package/scripts/lint-regression-test-names.cjs +15 -13
  391. package/scripts/lint-removed-but-needed.cjs +320 -0
  392. package/scripts/lint-state-field-drift.cjs +805 -0
  393. package/scripts/lint-state-write-path-drift.cjs +1045 -0
  394. package/scripts/lint-test-file-count.allowlist.json +40 -3
  395. package/scripts/lint-unreachable-guard-drift.cjs +843 -0
  396. package/scripts/lint-vendored-deps.cjs +124 -0
  397. package/scripts/mutation-matrix.cjs +13 -0
  398. package/scripts/pr-changed-files.cjs +63 -0
  399. package/scripts/pr-template-policy.cjs +14 -4
  400. package/scripts/prompt-injection-scan.sh +52 -6
  401. package/scripts/require-issue-link-policy.cjs +192 -0
  402. package/scripts/state-write-path-drift-baseline.json +19 -0
  403. package/scripts/sync-runtime-launcher.cjs +2 -4
  404. package/skills/gsd-autonomous/SKILL.md +0 -1
  405. package/skills/gsd-code-review/SKILL.md +1 -1
  406. package/skills/gsd-execute-phase/SKILL.md +1 -2
  407. package/skills/gsd-map-codebase/SKILL.md +1 -1
  408. package/skills/gsd-mempalace-capture/SKILL.md +2 -2
  409. package/skills/gsd-mempalace-recall/SKILL.md +1 -1
  410. package/skills/gsd-new-milestone/SKILL.md +2 -2
  411. package/skills/gsd-next/SKILL.md +0 -1
  412. package/skills/gsd-plan-phase/SKILL.md +1 -2
  413. package/skills/gsd-progress/SKILL.md +0 -1
  414. package/skills/gsd-quick/SKILL.md +1 -1
  415. package/skills/gsd-review-backlog/SKILL.md +2 -1
  416. package/skills/gsd-stats/SKILL.md +0 -1
  417. package/skills/gsd-verify-work/SKILL.md +1 -1
  418. package/vscode/package.json +1 -1
  419. package/gsd-core/workflows/discovery-phase.md +0 -298
  420. package/gsd-core/workflows/plan-milestone-gaps.md +0 -281
  421. package/gsd-core/workflows/verify-phase.md +0 -577
  422. package/scripts/affected-tests-lib.cjs +0 -554
  423. package/scripts/gen-emitted-baseline.cjs +0 -145
  424. package/scripts/lint-allow-test-rule-refs.cjs +0 -162
  425. package/scripts/run-affected-tests.cjs +0 -7
  426. package/scripts/run-tests.cjs +0 -1050
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ /**
3
+ * Conservative cleanup for artifact surfaces retired by a runtime descriptor.
4
+ *
5
+ * A descriptor may stop materializing an artifact kind while old installs
6
+ * still contain files from that surface. Install and profile/surface apply
7
+ * both call this helper so either path converges an existing installation.
8
+ * Only files proven managed by the previous install manifest are removed;
9
+ * modified and unknown files are preserved for the journaled installer
10
+ * migration (or the user) to handle without data loss.
11
+ */
12
+ var __importDefault = (this && this.__importDefault) || function (mod) {
13
+ return (mod && mod.__esModule) ? mod : { "default": mod };
14
+ };
15
+ const node_path_1 = __importDefault(require("node:path"));
16
+ // #2874 (ADR-58 cleanup phase): pruneRetiredRuntimeArtifacts is the first
17
+ // thing installRuntimeArtifacts calls, so its fs calls are routed through
18
+ // the injectable seam too — see install-fs-adapter.cts's module doc.
19
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
20
+ const installFsAdapter = require("./install-fs-adapter.cjs");
21
+ const { installFs } = installFsAdapter;
22
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
23
+ const installerMigrations = require("./installer-migrations.cjs");
24
+ const external_descriptor_trust_cjs_1 = require("./external-descriptor-trust.cjs");
25
+ // Generated at build time, so no TypeScript source declaration exists.
26
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
27
+ const capabilityRegistry = require('./capability-registry.cjs');
28
+ function retiredArtifactsFor(runtime) {
29
+ const configured = capabilityRegistry.runtimes?.[runtime]?.runtime?.hostBehaviors?.retiredArtifacts;
30
+ return Array.isArray(configured) ? configured : [];
31
+ }
32
+ function pruneRetiredRuntimeArtifacts(runtime, configDir) {
33
+ const result = { removed: [], preserved: [] };
34
+ const declarations = retiredArtifactsFor(runtime);
35
+ if (declarations.length === 0)
36
+ return result;
37
+ const manifest = installerMigrations.readInstallManifest(configDir);
38
+ for (const declaration of declarations) {
39
+ const destSubpath = declaration.destSubpath;
40
+ const prefix = declaration.prefix;
41
+ const suffix = declaration.suffix;
42
+ if (typeof destSubpath !== 'string' || destSubpath.length === 0 ||
43
+ typeof prefix !== 'string' || prefix.length === 0 ||
44
+ typeof suffix !== 'string' || suffix.length === 0 ||
45
+ !(0, external_descriptor_trust_cjs_1.isPathConfined)(destSubpath, configDir)) {
46
+ continue;
47
+ }
48
+ const destDir = node_path_1.default.resolve(configDir, destSubpath);
49
+ let entries;
50
+ try {
51
+ if (!installFs().existsSync(destDir) || installFs().lstatSync(destDir).isSymbolicLink())
52
+ continue;
53
+ entries = installFs().readdirSync(destDir, { withFileTypes: true });
54
+ }
55
+ catch {
56
+ continue;
57
+ }
58
+ for (const entry of entries) {
59
+ if (!entry.isFile() || !entry.name.startsWith(prefix) || !entry.name.endsWith(suffix))
60
+ continue;
61
+ const relPath = node_path_1.default.posix.join(destSubpath.replace(/\\/g, '/'), entry.name);
62
+ const artifact = installerMigrations.classifyArtifact(configDir, relPath, manifest);
63
+ if (artifact.classification !== 'managed-pristine') {
64
+ result.preserved.push(relPath);
65
+ continue;
66
+ }
67
+ try {
68
+ installFs().unlinkSync(node_path_1.default.join(destDir, entry.name));
69
+ result.removed.push(relPath);
70
+ }
71
+ catch {
72
+ result.preserved.push(relPath);
73
+ }
74
+ }
75
+ try {
76
+ if (installFs().readdirSync(destDir).length === 0)
77
+ installFs().rmdirSync(destDir);
78
+ }
79
+ catch {
80
+ // Non-empty, unreadable, or concurrently changed: preserve the directory.
81
+ }
82
+ }
83
+ return result;
84
+ }
85
+ module.exports = { pruneRetiredRuntimeArtifacts, retiredArtifactsFor };
@@ -52,6 +52,7 @@
52
52
  */
53
53
  Object.defineProperty(exports, "__esModule", { value: true });
54
54
  exports.DOCS_PARITY_VIOLATION = exports.LANE_SLUG_RE = exports.PARITY_VIOLATION = exports.REVIEWER_LANES = exports.ARGV_PLACEHOLDER = void 0;
55
+ exports.mergeReviewerLanes = mergeReviewerLanes;
55
56
  exports.checkReviewerLaneParity = checkReviewerLaneParity;
56
57
  exports.checkReviewerDocsParity = checkReviewerDocsParity;
57
58
  /**
@@ -127,6 +128,15 @@ exports.REVIEWER_LANES = Object.freeze([
127
128
  ...SPAWN_STDIN_STDOUT,
128
129
  modelArg: '--model',
129
130
  effortChannel: 'argv',
131
+ // #2483: without these the claude leg is the only reviewer that additionally inherits the
132
+ // invoking user's global CLAUDE.md, the project CLAUDE.md, and Claude Code auto-memory —
133
+ // a context asymmetry against the independent-review premise (gemini sees only the
134
+ // assembled prompt; codex runs --ephemeral). Both flags, not just the first: CLAUDE.md
135
+ // loading and auto-memory are independently-toggled mechanisms, and an environment
136
+ // exporting CLAUDE_CODE_DISABLE_AUTO_MEMORY=0 forces auto-memory back ON — the explicit
137
+ // pair is robust against that. Applies when /gsd:review runs from a non-Claude-Code host;
138
+ // inside Claude Code the claude lane self-skips for independence.
139
+ env: { CLAUDE_CODE_DISABLE_CLAUDE_MDS: '1', CLAUDE_CODE_DISABLE_AUTO_MEMORY: '1' },
130
140
  },
131
141
  timeoutFloorMs: 1_200_000,
132
142
  emptyOutput: 'stub-with-stderr',
@@ -423,6 +433,104 @@ exports.REVIEWER_LANES = Object.freeze([
423
433
  handler: null,
424
434
  },
425
435
  ].map((lane) => Object.freeze(lane)));
436
+ /**
437
+ * Merge the first-party lane set with installed overlay `reviewer` bodies
438
+ * (ADR-2782 D8: first-party ∪ overlay, first-party wins on slug collision).
439
+ *
440
+ * `routeReviewLane` (gsd-core/bin/gsd-tools.cjs) consumes this to build the lane
441
+ * map its `sections`/`flags`/`plan`/`invoke` subcommands resolve against, so an
442
+ * installed, consented third-party reviewer capability (`role:"reviewer"` with a
443
+ * declared `reviewer` body) becomes selectable, plannable, and invocable through
444
+ * the same surface as a built-in lane — closing #2927, where the overlay was
445
+ * roster-visible (`deriveReviewerSlugs`) and disclosed at install
446
+ * (`collectReviewerLaneSurfaces`) but never reached the invocation path.
447
+ *
448
+ * ADR-2782 D1 deliberately made the manifest `reviewer` body field-identical to
449
+ * `ReviewerLaneCommon` so "Phase 2 harvests the shape into the capability manifest
450
+ * with no translation layer" (CONTEXT.md reviewer-lane-descriptor predicate). The
451
+ * overlay body IS already `ReviewerLane`-shaped; this function MERGES, it does not
452
+ * PROJECT — there is no field renaming, no vocabulary translation. That is the
453
+ * design decision the bug violated by simply never calling anything.
454
+ *
455
+ * Pure and TOTAL — never throws on any input, because third-party overlay
456
+ * manifests are untrusted data reaching this seam at load time. A cap whose
457
+ * `reviewer` body is absent, non-object, or carries an empty/grammar-invalid slug
458
+ * is SKIPPED (contributes no lane) rather than crashing, so one malformed overlay
459
+ * cannot take the whole `review-lane` surface (and every first-party lane with it)
460
+ * down. The slug grammar (`LANE_SLUG_RE`) is enforced HERE even though
461
+ * `resolveLanePlan`'s trust boundary re-checks it, because `sections`/`flags` read
462
+ * lane fields before reaching `resolveLanePlan` — defense in depth against the
463
+ * path-traversal class the invocation boundary exists for.
464
+ *
465
+ * First-party wins: an overlay declaring a slug that already names a first-party
466
+ * lane is silently superseded (the first-party entry is kept, identity-stable),
467
+ * never overwritten. The first-party object is returned by reference, not copied.
468
+ *
469
+ * @param firstParty The frozen first-party lane set (`REVIEWER_LANES`).
470
+ * @param registry The merged capability registry
471
+ * (`loadRegistry({ includeInstalled: true })`); only its
472
+ * `capabilities` map is read. A cap contributes a lane iff it
473
+ * carries an object `reviewer` body with a non-empty,
474
+ * grammar-valid `slug`. The `role:"runtime"` `reviewerCli`
475
+ * alias never contributed a lane here, and as of #2801 it no
476
+ * longer contributes to the selection roster
477
+ * (`deriveReviewerSlugs`) either — the two surfaces now agree.
478
+ * @returns A NEW array: first-party lanes (in order) followed by accepted overlay
479
+ * lanes (in registry iteration order). Callers must not mutate it.
480
+ */
481
+ function mergeReviewerLanes(firstParty, registry) {
482
+ // First-party always wins and is returned by reference (identity-stable), so a
483
+ // collision cannot perturb the first-party entry a consumer already holds.
484
+ const bySlug = new Map();
485
+ const ordered = [];
486
+ for (const lane of firstParty) {
487
+ const slug = typeof lane.slug === 'string' ? lane.slug.trim() : '';
488
+ if (!slug)
489
+ continue; // unreachable for the shipped frozen set, but this is exported
490
+ if (!bySlug.has(slug)) {
491
+ bySlug.set(slug, lane);
492
+ ordered.push(lane);
493
+ }
494
+ }
495
+ const capabilities = (registry && registry.capabilities) || {};
496
+ for (const cap of Object.values(capabilities)) {
497
+ if (cap === null || typeof cap !== 'object' || Array.isArray(cap))
498
+ continue;
499
+ const body = cap.reviewer;
500
+ // C1/C2 (mirroring collectReviewerLaneSurfaces): a missing, null, or
501
+ // non-object reviewer body declares no lane — never an error at this layer.
502
+ if (body === null || typeof body !== 'object' || Array.isArray(body))
503
+ continue;
504
+ const rawSlug = body.slug;
505
+ const slug = typeof rawSlug === 'string' ? rawSlug.trim() : '';
506
+ // Empty/whitespace slug: nothing to key on. Grammar-invalid slug: the
507
+ // path-traversal class — skip rather than admit, even though resolveLanePlan
508
+ // would reject it downstream. Both are skips, not throws.
509
+ if (!slug || !exports.LANE_SLUG_RE.test(slug))
510
+ continue;
511
+ if (bySlug.has(slug))
512
+ continue; // D8: first-party (or an earlier overlay) wins
513
+ // The body is already ReviewerLane-shaped per ADR-2782 D1. We do NOT
514
+ // deep-validate every field here: the invocation trust boundary
515
+ // (resolveLanePlan) is the seam that re-validates a lane before it runs, and
516
+ // `sections`/`flags` are both tolerant of a partial body (flags filters by
517
+ // shape; sections reads slug/reviewsSection which a non-string cap simply
518
+ // renders as undefined). Admitting the body keeps the merge a pure merge.
519
+ //
520
+ // The slug is normalized to its trimmed value on the stored lane so the merge
521
+ // and the selection roster (`deriveReviewerSlugs`, which trims before adding)
522
+ // agree on the canonical key — otherwise a body declaring `slug: ' x '`
523
+ // would key the map on `'x'` but emit the raw `' x '` in `sections` and fail
524
+ // to match a `--selected` value coming from the roster. (The capability
525
+ // validator's grammar check rejects surrounding whitespace before this is
526
+ // reachable through a real install, so this is belt-and-braces parity with the
527
+ // roster, not a live-input guard.)
528
+ const lane = { ...body, slug };
529
+ bySlug.set(slug, lane);
530
+ ordered.push(lane);
531
+ }
532
+ return ordered;
533
+ }
426
534
  /* ------------------------------------------------------------------ *
427
535
  * DEFECT.GENERATIVE-FIX parity (CONTEXT.md:797)
428
536
  * ------------------------------------------------------------------ */
@@ -24,6 +24,7 @@
24
24
  */
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.LANE_UNAVAILABLE = void 0;
27
+ exports.configString = configString;
27
28
  exports.normalizeHost = normalizeHost;
28
29
  exports.isEmptyReview = isEmptyReview;
29
30
  exports.fileRefPrompt = fileRefPrompt;
@@ -74,6 +75,9 @@ const KNOWN_HANDLERS = new Set(['antigravity', 'openai-compatible', 'opencode'])
74
75
  *
75
76
  * A non-string (number, bool, object, array) is NOT coerced. `String(0)` would put `"0"` into argv
76
77
  * as a model name; a wrong model silently reviewed is worse than no model override.
78
+ *
79
+ * Exported and shared with the runner's model-recovery arms (#2295) — "what counts as unset" has
80
+ * ONE source, so the plan resolver and the runner's recovered-model normalization cannot disagree.
77
81
  */
78
82
  function configString(raw) {
79
83
  if (typeof raw !== 'string')
@@ -212,6 +216,10 @@ function resolveLanePlan(input) {
212
216
  ? lane.timeoutFloorMs
213
217
  : 900_000;
214
218
  const emptyOutput = lane.emptyOutput === 'handler-owned' ? 'handler-owned' : 'stub-with-stderr';
219
+ // #3194: only an EXACT 'diff-only' declaration exempts a lane from evidence verification.
220
+ // Anything else — including a missing or garbage value on a third-party overlay body —
221
+ // resolves as 'source-grounded', so the runner verifies rather than trusts it.
222
+ const evidenceClass = lane.evidenceClass === 'diff-only' ? 'diff-only' : 'source-grounded';
215
223
  const requiresBinaries = Array.isArray(lane.requiresBinaries)
216
224
  ? lane.requiresBinaries.filter((b) => typeof b === 'string')
217
225
  : [];
@@ -255,6 +263,7 @@ function resolveLanePlan(input) {
255
263
  errPath,
256
264
  timeoutMs,
257
265
  emptyOutput,
266
+ evidenceClass,
258
267
  handler,
259
268
  requiresBinaries,
260
269
  probe: lane.probe,
@@ -325,6 +334,23 @@ function resolveLanePlan(input) {
325
334
  argv.push(token);
326
335
  }
327
336
  }
337
+ // Per-invocation env pairs (#2483). Own string-valued entries only — a non-string is dropped,
338
+ // never coerced, and prototype members never resolve (same lookup discipline as the argv
339
+ // expansions above). An empty or absent declaration resolves to `null`, so the runner has one
340
+ // shape to test.
341
+ let env = null;
342
+ const declaredEnv = inv.env;
343
+ if (declaredEnv !== null && typeof declaredEnv === 'object' && !Array.isArray(declaredEnv)) {
344
+ const source = declaredEnv;
345
+ const pairs = {};
346
+ for (const k of Object.keys(source)) {
347
+ const v = source[k];
348
+ if (typeof v === 'string')
349
+ pairs[k] = v;
350
+ }
351
+ if (Object.keys(pairs).length > 0)
352
+ env = pairs;
353
+ }
328
354
  return {
329
355
  ok: true,
330
356
  warnings,
@@ -333,6 +359,8 @@ function resolveLanePlan(input) {
333
359
  slug,
334
360
  binary,
335
361
  argv,
362
+ model: modelExpansion.length > 0 ? model : null,
363
+ effort: effortExpansion.length > 0 ? (configString(input.effortValue) ?? null) : null,
336
364
  stdin,
337
365
  promptPath,
338
366
  outputTarget,
@@ -340,9 +368,11 @@ function resolveLanePlan(input) {
340
368
  errPath,
341
369
  timeoutMs,
342
370
  emptyOutput,
371
+ evidenceClass,
343
372
  handler,
344
373
  requiresBinaries,
345
374
  probe: lane.probe,
375
+ env,
346
376
  },
347
377
  };
348
378
  }