@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,329 @@
1
+ "use strict";
2
+ /**
3
+ * Codex Agent TOML — typed IR for `~/.codex/agents/<agent>.toml` (#3243, ADR-2313).
4
+ *
5
+ * A genuine leaf: node builtins only. This is a **document model**, not a policy —
6
+ * it knows how to parse/render/strip two known keys (`model`,
7
+ * `model_reasoning_effort`) from a Codex agent `.toml`. It does NOT know which
8
+ * `model` values are illegal for Codex (that predicate — Anthropic-flavored
9
+ * detection — stays in `model-catalog.cts`; callers decide what to strip).
10
+ *
11
+ * Moved here (not copied) from `agent-install-check.cts` (#3242, Phase 2), which
12
+ * wrote the hard half: block-range detection, BOM stripping, TOML value
13
+ * unquoting, and the lenient header scan. That module's behavior is UNCHANGED —
14
+ * it imports `stripBOM`/`scanTomlLines` from here and its regression suite
15
+ * (`tests/agent-install-check.test.cjs`) is the proof.
16
+ *
17
+ * ── The reconciliation (40-design.md) ──────────────────────────────────────
18
+ *
19
+ * Phase 2's reader and this phase's writer disagree on how to handle an
20
+ * unterminated `developer_instructions` block, deliberately:
21
+ *
22
+ * - The READER (`scanTomlLines`, used directly by `checkCodexModelPosture`)
23
+ * stays LENIENT: an unterminated block still excludes "the rest of the
24
+ * file" from the header scan (findDeveloperInstructionsBlockRange's
25
+ * existing fallback), because misreading prompt prose as a pin is only a
26
+ * false positive — it wastes a user's time, nothing more.
27
+ * - The WRITER (`parseCodexAgentToml`, used by the Codex sync) is STRICT: an
28
+ * unterminated block makes the whole document `{ok:false}`, because a
29
+ * writer that proceeds on a malformed document risks rewriting it.
30
+ *
31
+ * One block-range detector, two call sites, two policies — never two detectors
32
+ * that could silently drift from each other.
33
+ */
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.PARSE_REASON = void 0;
36
+ exports.stripBOM = stripBOM;
37
+ exports.unquoteTomlValue = unquoteTomlValue;
38
+ exports.findDeveloperInstructionsBlockRange = findDeveloperInstructionsBlockRange;
39
+ exports.scanTomlLines = scanTomlLines;
40
+ exports.parseCodexAgentToml = parseCodexAgentToml;
41
+ exports.renderCodexAgentToml = renderCodexAgentToml;
42
+ exports.stripModel = stripModel;
43
+ exports.stripReasoningEffort = stripReasoningEffort;
44
+ /** Frozen reason enum for a failed {@link parseCodexAgentToml}. */
45
+ exports.PARSE_REASON = Object.freeze({
46
+ UNTERMINATED_BLOCK: 'unterminated_block',
47
+ });
48
+ // The UTF-8 BOM codepoint, spelled as an escape rather than the literal
49
+ // character so the source file never carries an invisible codepoint.
50
+ const BOM_CHAR = String.fromCharCode(0xfeff);
51
+ // Strips a leading UTF-8 BOM (U+FEFF), which fs.readFileSync(..., 'utf8') does not
52
+ // strip on its own, and unwraps a TOML basic/literal string value's surrounding
53
+ // quotes so `model = "sonnet"` yields `sonnet`, not `"sonnet"`.
54
+ function stripBOM(content) {
55
+ return content.charCodeAt(0) === 0xfeff ? content.slice(1) : content;
56
+ }
57
+ function unquoteTomlValue(rawValue) {
58
+ const trimmed = rawValue.trim();
59
+ const quoted = trimmed.match(/^"([^"]*)"/) ?? trimmed.match(/^'([^']*)'/);
60
+ return quoted ? quoted[1] : trimmed;
61
+ }
62
+ // The `developer_instructions` block is a TOML multi-line literal string
63
+ // (`developer_instructions = '''...'''`) that `generateCodexAgentToml` always
64
+ // emits after the header fields. Prompt prose inside that block discusses models
65
+ // constantly, so a `model = ...`-shaped line inside it must never be read as a
66
+ // live pin — but the block can legally appear anywhere in the file (a
67
+ // hand-reordered agent can move `model` after it), and another key's *value* can
68
+ // legally contain the literal text `developer_instructions = '''` (e.g. a
69
+ // `description` field quoting it) without that being the real block opener. So
70
+ // instead of truncating the file at the first textual occurrence of the marker
71
+ // anywhere in the content, this locates the block by its anchored line-start
72
+ // opener (`^\s*developer_instructions\s*=\s*'''`, never a mid-line/mid-value
73
+ // match) and its closing `'''` line, and excludes only the lines between them —
74
+ // every other line in the file, before AND after the block, is scanned.
75
+ //
76
+ // If no opener is found, nothing is excluded (the whole file is scanned) and
77
+ // `terminated` is trivially true. If the block IS opened but never closed before
78
+ // EOF (malformed file), `terminated` is false: the lenient reader (scanTomlLines)
79
+ // still treats the rest of the file as inside the block (the safe direction for
80
+ // a reader — see module header comment); the strict writer (parseCodexAgentToml)
81
+ // reads `terminated` and refuses instead. The emitter always uses `'''` (a TOML
82
+ // literal string), never a `"""` basic multi-line string, so only `'''` is
83
+ // treated as the block delimiter here.
84
+ function findDeveloperInstructionsBlockRange(lines) {
85
+ const openIndex = lines.findIndex((line) => /^\s*developer_instructions\s*=\s*'''/.test(line));
86
+ if (openIndex === -1) {
87
+ return { start: -1, end: -1, terminated: true };
88
+ }
89
+ const afterOpenMarker = lines[openIndex].replace(/^\s*developer_instructions\s*=\s*'''/, '');
90
+ if (afterOpenMarker.includes("'''")) {
91
+ // Same-line block: developer_instructions = '''one line'''
92
+ return { start: openIndex, end: openIndex, terminated: true };
93
+ }
94
+ for (let i = openIndex + 1; i < lines.length; i++) {
95
+ if (lines[i].includes("'''")) {
96
+ return { start: openIndex, end: i, terminated: true };
97
+ }
98
+ }
99
+ return { start: openIndex, end: lines.length - 1, terminated: false };
100
+ }
101
+ // Line-oriented scan of every line OUTSIDE the `developer_instructions` block
102
+ // (see findDeveloperInstructionsBlockRange). Full-key-name anchoring —
103
+ // `^([A-Za-z_][\w]*)\s*=` for a bare key, or `^"([^"]*)"\s*=` / `^'([^']*)'\s*=`
104
+ // for TOML's legal quoted-key forms, normalized to the same key name — means
105
+ // `model_verbosity` / `model_reasoning_effort` never satisfy a `model` probe,
106
+ // and vice versa; `#`-prefixed lines (after trimming leading whitespace) are
107
+ // treated as comments, never live pins. Shared by both scanTomlLines (the
108
+ // lenient reader, boolean-only for reasoning effort) and parseCodexAgentToml
109
+ // (the strict writer, which also needs the effort's value and both keys' line
110
+ // indices so stripModel/stripReasoningEffort can remove exactly one line).
111
+ function scanHeaderLines(lines, blockStart, blockEnd) {
112
+ let model = null;
113
+ let modelLineIndex = null;
114
+ let reasoningEffort = null;
115
+ let reasoningEffortLineIndex = null;
116
+ for (let i = 0; i < lines.length; i++) {
117
+ if (blockStart !== -1 && i >= blockStart && i <= blockEnd)
118
+ continue;
119
+ const trimmed = lines[i].trim();
120
+ if (trimmed === '' || trimmed.startsWith('#'))
121
+ continue;
122
+ const match = trimmed.match(/^(?:"([^"]*)"|'([^']*)'|([A-Za-z_][\w]*))\s*=\s*(.*)$/);
123
+ if (!match)
124
+ continue;
125
+ const key = match[1] ?? match[2] ?? match[3];
126
+ const rawValue = match[4];
127
+ if (key === 'model') {
128
+ model = unquoteTomlValue(rawValue);
129
+ modelLineIndex = i;
130
+ }
131
+ else if (key === 'model_reasoning_effort') {
132
+ reasoningEffort = unquoteTomlValue(rawValue);
133
+ reasoningEffortLineIndex = i;
134
+ }
135
+ }
136
+ return { model, modelLineIndex, reasoningEffort, reasoningEffortLineIndex };
137
+ }
138
+ /**
139
+ * The LENIENT reader entry point (Phase 2, moved verbatim in behavior). Never
140
+ * fails: an unterminated block falls back to "rest of file is inside the
141
+ * block" via {@link findDeveloperInstructionsBlockRange}'s own fallback.
142
+ * `content` is expected already BOM-stripped (callers pass `stripBOM(raw)`).
143
+ */
144
+ function scanTomlLines(content) {
145
+ const lines = content.split(/\r?\n/);
146
+ const { start, end } = findDeveloperInstructionsBlockRange(lines);
147
+ const { model, reasoningEffort } = scanHeaderLines(lines, start, end);
148
+ return { model, hasReasoningEffort: reasoningEffort !== null };
149
+ }
150
+ // Splits `content` into `{lines, terminators}` where `terminators[i]` is the
151
+ // terminator that FOLLOWS `lines[i]` (`'\r\n'`, `'\r'`, `'\n'`, or `''` for a
152
+ // line with none — only possible as the file's last line). The two arrays are
153
+ // always the same length and there is NEVER a phantom trailing entry: a
154
+ // source ending in a terminator (the common case) yields exactly as many
155
+ // lines as it has content lines, not one more. `render` is then a plain
156
+ // `lines[i] + terminators[i]` concatenation with no special-casing of "the
157
+ // last line" — see `renderCodexAgentToml`.
158
+ //
159
+ // `String#split` with a capturing group interleaves the delimiters into the
160
+ // result array — `"a\r\nb\nc".split(/(\r\n|\r|\n)/)` yields
161
+ // `["a","\r\n","b","\n","c"]` — so even indices are line content and odd
162
+ // indices are that line's terminator. When `content` ends WITH a terminator,
163
+ // `split` appends one extra empty-string element after the last real
164
+ // terminator (e.g. `"a\n".split(...)` → `["a","\n",""]`); that trailing `""`
165
+ // is not a real line, it is `split`'s "nothing after the last delimiter"
166
+ // marker, so the loop below stops before consuming it instead of recording it
167
+ // as a phantom empty final line (the defect this replaced — see A29: a doc
168
+ // with a phantom last element made every removal rule reason about the wrong
169
+ // element for any trailing-newline-terminated file, the common case). `\r\n`
170
+ // is tried before the bare `\r` alternative so a CRLF is never misread as a
171
+ // lone-CR line followed by an empty LF-terminated line.
172
+ function splitPreservingTerminators(content) {
173
+ if (content === '')
174
+ return { lines: [], terminators: [] };
175
+ const parts = content.split(/(\r\n|\r|\n)/);
176
+ const lastIndex = parts.length - 1;
177
+ const lines = [];
178
+ const terminators = [];
179
+ for (let i = 0; i < parts.length; i += 2) {
180
+ if (i === lastIndex && parts[i] === '')
181
+ break; // split's post-terminator marker, not a real line
182
+ lines.push(parts[i]);
183
+ terminators.push(parts[i + 1] ?? '');
184
+ }
185
+ return { lines, terminators };
186
+ }
187
+ /**
188
+ * The STRICT parse entry point (Phase 3, the writer's half of the
189
+ * reconciliation). Returns `{ok:false, reason:UNTERMINATED_BLOCK}` rather than
190
+ * guessing when the `developer_instructions` block is opened but never closed.
191
+ * On success, `doc` carries enough (the original `lines`/`terminators`, BOM/
192
+ * trailing-newline flags, and the two resolved values with their line indices)
193
+ * for {@link renderCodexAgentToml} to reproduce the source byte-identically —
194
+ * including a source with mixed line-ending styles — and for
195
+ * {@link stripModel}/{@link stripReasoningEffort} to remove exactly one line
196
+ * and its own terminator.
197
+ */
198
+ function parseCodexAgentToml(content) {
199
+ const hadBOM = content.charCodeAt(0) === 0xfeff;
200
+ const stripped = stripBOM(content);
201
+ // Informational only — see CodexAgentDoc.eol's docstring. Never used by
202
+ // renderCodexAgentToml.
203
+ const eol = stripped.includes('\r\n') ? '\r\n' : '\n';
204
+ const trailingNewline = /(\r\n|\r|\n)$/.test(stripped);
205
+ const { lines, terminators } = splitPreservingTerminators(stripped);
206
+ const { start, end, terminated } = findDeveloperInstructionsBlockRange(lines);
207
+ if (start !== -1 && !terminated) {
208
+ return { ok: false, reason: exports.PARSE_REASON.UNTERMINATED_BLOCK };
209
+ }
210
+ const { model, modelLineIndex, reasoningEffort, reasoningEffortLineIndex } = scanHeaderLines(lines, start, end);
211
+ const doc = {
212
+ lines,
213
+ terminators,
214
+ eol,
215
+ hadBOM,
216
+ trailingNewline,
217
+ blockRange: { start, end },
218
+ model,
219
+ modelLineIndex,
220
+ reasoningEffort,
221
+ reasoningEffortLineIndex,
222
+ };
223
+ return { ok: true, doc };
224
+ }
225
+ /**
226
+ * Renders `doc` back to a string. For an unmodified doc this is
227
+ * byte-identical to the original `parseCodexAgentToml` input (matrix row
228
+ * A14) — it never re-derives line content, only rejoins each line with its
229
+ * OWN recorded terminator (`terminators[i]`, never the whole-file `eol`) and
230
+ * re-prepends a BOM if one was present. This is a plain concatenation of the
231
+ * surviving `[line, terminator]` pieces, so a source with mixed `\r\n`/`\n`/
232
+ * lone-`\r` line endings round-trips exactly, and a strip
233
+ * ({@link stripModel}/{@link stripReasoningEffort}) removes only the target
234
+ * line and its own terminator — every other line's ending is untouched.
235
+ */
236
+ function renderCodexAgentToml(doc) {
237
+ let body = '';
238
+ for (let i = 0; i < doc.lines.length; i++) {
239
+ body += doc.lines[i] + (doc.terminators[i] ?? '');
240
+ }
241
+ return doc.hadBOM ? BOM_CHAR + body : body;
242
+ }
243
+ // Removes exactly one line (by index) — AND its own terminator — from
244
+ // `doc.lines`/`doc.terminators`, re-indexing the block range and the OTHER
245
+ // key's line index so a subsequent strip/render still sees a consistent doc.
246
+ // Never touches any other line's content or terminator.
247
+ //
248
+ // The one exception is when `index` names the file's LAST line: a plain
249
+ // slice-out would drop the removed line's terminator but leave the
250
+ // *previous* line's terminator standing in its place, which silently
251
+ // invents (or drops) a trailing newline the source never had — a middle-line
252
+ // removal never has this problem because the terminator that survives (the
253
+ // one that WAS between the previous line and the removed one) is exactly the
254
+ // terminator the new neighbors should have between them. For a last-line
255
+ // removal, the file's trailing-newline-or-not status lives in whether the
256
+ // REMOVED line's own terminator was empty (that is what `trailingNewline`
257
+ // was computed from) — so the new last line inherits the removed line's
258
+ // EMPTINESS only: if the removed terminator was `''`, the new last line's
259
+ // terminator is cleared to `''` too. If the removed terminator was
260
+ // non-empty, the source already ended with a newline and the new last line
261
+ // already has the right one (its OWN, unchanged) — overwriting it with the
262
+ // removed line's terminator would silently change the new last line's own
263
+ // ending style on a mixed-EOL source (see A26). Removing the only remaining
264
+ // line is the degenerate case: there is no new last line, so the result is
265
+ // the empty document.
266
+ function removeLine(doc, index, which) {
267
+ const isLastLine = index === doc.lines.length - 1;
268
+ let lines;
269
+ let terminators;
270
+ if (doc.lines.length === 1) {
271
+ lines = [];
272
+ terminators = [];
273
+ }
274
+ else if (isLastLine) {
275
+ lines = doc.lines.slice(0, index);
276
+ terminators = doc.terminators.slice(0, index);
277
+ // Inherit the removed line's EMPTINESS, never its STYLE: if the removed
278
+ // line had no terminator (the source had no trailing newline), the new
279
+ // last line's terminator becomes '' too. Otherwise the source DID end
280
+ // with a newline, and the new last line already has the right one — its
281
+ // OWN terminator (already carried over by the slice above), which may
282
+ // differ in style from the removed line's (a mixed-EOL source) — so it is
283
+ // left unchanged rather than overwritten.
284
+ if (doc.terminators[index] === '') {
285
+ terminators[terminators.length - 1] = '';
286
+ }
287
+ }
288
+ else {
289
+ lines = doc.lines.slice(0, index).concat(doc.lines.slice(index + 1));
290
+ terminators = doc.terminators.slice(0, index).concat(doc.terminators.slice(index + 1));
291
+ }
292
+ const reindex = (i) => (i === null ? null : i > index ? i - 1 : i);
293
+ const blockRange = { ...doc.blockRange };
294
+ if (blockRange.start !== -1) {
295
+ if (blockRange.start > index)
296
+ blockRange.start -= 1;
297
+ if (blockRange.end > index)
298
+ blockRange.end -= 1;
299
+ }
300
+ return {
301
+ ...doc,
302
+ lines,
303
+ terminators,
304
+ blockRange,
305
+ model: which === 'model' ? null : doc.model,
306
+ modelLineIndex: which === 'model' ? null : reindex(doc.modelLineIndex),
307
+ reasoningEffort: which === 'reasoningEffort' ? null : doc.reasoningEffort,
308
+ reasoningEffortLineIndex: which === 'reasoningEffort' ? null : reindex(doc.reasoningEffortLineIndex),
309
+ };
310
+ }
311
+ /**
312
+ * Returns a new doc with the `model` line removed (a no-op copy if there was
313
+ * no `model` line). Every other byte — comments, other keys, the
314
+ * `developer_instructions` block, line endings, BOM — is untouched.
315
+ */
316
+ function stripModel(doc) {
317
+ if (doc.modelLineIndex === null)
318
+ return doc;
319
+ return removeLine(doc, doc.modelLineIndex, 'model');
320
+ }
321
+ /**
322
+ * Returns a new doc with the `model_reasoning_effort` line removed (a no-op
323
+ * copy if there was none). Every other byte is untouched.
324
+ */
325
+ function stripReasoningEffort(doc) {
326
+ if (doc.reasoningEffortLineIndex === null)
327
+ return doc;
328
+ return removeLine(doc, doc.reasoningEffortLineIndex, 'reasoningEffort');
329
+ }
@@ -331,6 +331,30 @@ exports.INIT_COMMAND_ALIASES = [
331
331
  "subcommand": "phase-op",
332
332
  "mutation": false
333
333
  },
334
+ {
335
+ "canonical": "init.code-review",
336
+ "aliases": [
337
+ "init code-review"
338
+ ],
339
+ "subcommand": "code-review",
340
+ "mutation": false
341
+ },
342
+ {
343
+ "canonical": "init.review",
344
+ "aliases": [
345
+ "init review"
346
+ ],
347
+ "subcommand": "review",
348
+ "mutation": false
349
+ },
350
+ {
351
+ "canonical": "init.discuss-phase-assumptions",
352
+ "aliases": [
353
+ "init discuss-phase-assumptions"
354
+ ],
355
+ "subcommand": "discuss-phase-assumptions",
356
+ "mutation": false
357
+ },
334
358
  {
335
359
  "canonical": "init.todos",
336
360
  "aliases": [
@@ -371,6 +395,54 @@ exports.INIT_COMMAND_ALIASES = [
371
395
  "subcommand": "manager",
372
396
  "mutation": false
373
397
  },
398
+ {
399
+ "canonical": "init.complete-milestone",
400
+ "aliases": [
401
+ "init complete-milestone"
402
+ ],
403
+ "subcommand": "complete-milestone",
404
+ "mutation": false
405
+ },
406
+ {
407
+ "canonical": "init.autonomous",
408
+ "aliases": [
409
+ "init autonomous"
410
+ ],
411
+ "subcommand": "autonomous",
412
+ "mutation": false
413
+ },
414
+ {
415
+ "canonical": "init.docs-update",
416
+ "aliases": [
417
+ "init docs-update"
418
+ ],
419
+ "subcommand": "docs-update",
420
+ "mutation": false
421
+ },
422
+ {
423
+ "canonical": "init.update",
424
+ "aliases": [
425
+ "init update"
426
+ ],
427
+ "subcommand": "update",
428
+ "mutation": false
429
+ },
430
+ {
431
+ "canonical": "init.transition",
432
+ "aliases": [
433
+ "init transition"
434
+ ],
435
+ "subcommand": "transition",
436
+ "mutation": false
437
+ },
438
+ {
439
+ "canonical": "init.debug",
440
+ "aliases": [
441
+ "init debug"
442
+ ],
443
+ "subcommand": "debug",
444
+ "mutation": false
445
+ },
374
446
  {
375
447
  "canonical": "init.new-workspace",
376
448
  "aliases": [
@@ -539,6 +611,14 @@ exports.ROADMAP_COMMAND_ALIASES = [
539
611
  "subcommand": "analyze",
540
612
  "mutation": false
541
613
  },
614
+ {
615
+ "canonical": "roadmap.milestone-scope",
616
+ "aliases": [
617
+ "roadmap milestone-scope"
618
+ ],
619
+ "subcommand": "milestone-scope",
620
+ "mutation": false
621
+ },
542
622
  {
543
623
  "canonical": "roadmap.get-phase",
544
624
  "aliases": [
@@ -612,6 +692,20 @@ exports.NON_FAMILY_COMMAND_ALIASES = [
612
692
  "aliases": [],
613
693
  "mutation": true
614
694
  },
695
+ {
696
+ "canonical": "commit-docs-guard.disable",
697
+ "aliases": [
698
+ "commit-docs-guard disable"
699
+ ],
700
+ "mutation": true
701
+ },
702
+ {
703
+ "canonical": "commit-docs-guard.enable",
704
+ "aliases": [
705
+ "commit-docs-guard enable"
706
+ ],
707
+ "mutation": true
708
+ },
615
709
  {
616
710
  "canonical": "commit-to-subrepo",
617
711
  "aliases": [],
@@ -1,14 +1,57 @@
1
1
  'use strict';
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  /**
3
6
  * Command Roster Module
4
7
  *
5
8
  * Read-only helper for discovering canonical commands/gsd command stems and
6
9
  * applying the shared GSD slash-command namespace transform.
7
10
  */
11
+ const node_path_1 = __importDefault(require("node:path"));
12
+ const node_fs_1 = __importDefault(require("node:fs"));
13
+ // #2874 (ADR-58 cleanup phase): readGsdCommandNames is reached from
14
+ // installRuntimeArtifacts's call tree (skillsKind's stage() closure reads it
15
+ // for cross-referencing), but COMMANDS_DIR (below) is resolved by walking up
16
+ // from THIS MODULE'S OWN compiled __dirname to locate the GSD PACKAGE'S OWN
17
+ // commands/gsd/ source tree — not anything under the install destination.
18
+ // This is the exact same "package's own source, not the destination" case
19
+ // findInstallSourceRoot/findAgentsSourceRoot document in
20
+ // runtime-artifact-layout.cts's Step 2 (see that comment and
21
+ // install-fs-adapter.cts's module doc, "DELIBERATELY NOT ROUTED" section):
22
+ // an injected destination adapter's store starts empty and is never seeded
23
+ // with the real package's own on-disk layout, so routing this read through
24
+ // installFs() would make a fake-adapter install either silently return `[]`
25
+ // (via the ENOENT swallow below) or resolve wrong stems — never loudly fail,
26
+ // and never see the real package tree either way. This directory read
27
+ // therefore deliberately stays on real `node:fs`, unrouted — same rule,
28
+ // applied consistently, not an inconsistency with the routed staging calls
29
+ // elsewhere in this call tree. `readCmdNames` in
30
+ // scripts/fix-slash-commands.cjs also uses real `node:fs` directly (that
31
+ // script lives outside src/ and is also a standalone CLI tool), so its
32
+ // directory-read logic is reimplemented here against real fs instead of
33
+ // delegated to, keeping the pure regex/transform helpers below delegated as
34
+ // before.
8
35
  // eslint-disable-next-line @typescript-eslint/no-require-imports
9
36
  const slashCommandTransformer = require('../../../scripts/fix-slash-commands.cjs');
37
+ // Mirrors scripts/fix-slash-commands.cjs's own `COMMANDS_DIR` computation
38
+ // (`path.join(__dirname, '..', 'commands', 'gsd')` from repo-root/scripts) —
39
+ // same target directory, resolved from this module's own compiled location
40
+ // (repo-root/gsd-core/bin/lib) instead, so the walk-up depth differs.
41
+ const COMMANDS_DIR = node_path_1.default.join(__dirname, '..', '..', '..', 'commands', 'gsd');
10
42
  function readGsdCommandNames() {
11
- return slashCommandTransformer.readCmdNames();
43
+ try {
44
+ return node_fs_1.default.readdirSync(COMMANDS_DIR)
45
+ .filter((f) => f.endsWith('.md'))
46
+ .map((f) => f.replace(/\.md$/, ''));
47
+ }
48
+ catch (err) {
49
+ // Only swallow the missing-directory case — mirrors readCmdNames' own
50
+ // contract (scripts/fix-slash-commands.cjs).
51
+ if (err instanceof Error && err.code !== 'ENOENT')
52
+ throw err;
53
+ return [];
54
+ }
12
55
  }
13
56
  module.exports = {
14
57
  readGsdCommandNames,