@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
@@ -10,7 +10,7 @@ const capabilities = {
10
10
  "ai-integration": {
11
11
  "id": "ai-integration",
12
12
  "role": "feature",
13
- "version": "1.9.1",
13
+ "version": "1.11.0",
14
14
  "title": "AI design contract",
15
15
  "description": "AI-SPEC design contract workflow for phases that build AI systems; owns the AI integration command, agents, and workflow.ai_integration_phase activation key.",
16
16
  "tier": "full",
@@ -95,7 +95,7 @@ const capabilities = {
95
95
  "antigravity": {
96
96
  "id": "antigravity",
97
97
  "role": "runtime",
98
- "version": "1.9.1",
98
+ "version": "1.11.0",
99
99
  "title": "Antigravity",
100
100
  "description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; flat skill layout; tier-1 support.",
101
101
  "tier": "core",
@@ -158,6 +158,10 @@ const capabilities = {
158
158
  }
159
159
  ]
160
160
  },
161
+ "triggerPrecedence": [
162
+ "skills",
163
+ "commands"
164
+ ],
161
165
  "commandStyle": "slash-hyphen",
162
166
  "hooksSurface": "settings-json",
163
167
  "hookEvents": "gemini",
@@ -187,7 +191,6 @@ const capabilities = {
187
191
  "effortSurface": "undocumented"
188
192
  },
189
193
  "hostBehaviors": {
190
- "reviewerCli": true,
191
194
  "projectInstructionFile": "GEMINI.md",
192
195
  "noPathRewrite": true,
193
196
  "hookPathStyle": "raw",
@@ -239,7 +242,7 @@ const capabilities = {
239
242
  "assumption-delta": {
240
243
  "id": "assumption-delta",
241
244
  "role": "feature",
242
- "version": "1.9.1",
245
+ "version": "1.11.0",
243
246
  "title": "Assumption-delta architecture checkpoint",
244
247
  "description": "Rarely-firing advisory checkpoint that triggers when a phase makes something plural, optional, or chosen that used to be singular, required, or derived. Surfaces one identity-model question (promote the new general representation to primary, or add it alongside?) so a silent primary-key drift does not accumulate into a later user-facing bug. Non-blocking; fires only on a detected signal.",
245
248
  "tier": "full",
@@ -285,7 +288,7 @@ const capabilities = {
285
288
  "audit": {
286
289
  "id": "audit",
287
290
  "role": "feature",
288
- "version": "1.9.1",
291
+ "version": "1.11.0",
289
292
  "title": "Audit",
290
293
  "description": "Open-artifact audit and UAT-gap audit for milestone close gates; exposes `gsd-tools audit-uat` (cross-phase UAT outstanding items) and `gsd-tools audit-open` (structured open-artifact scan across debug, tasks, threads, todos, seeds, UAT, verification, context-questions).",
291
294
  "tier": "full",
@@ -322,7 +325,7 @@ const capabilities = {
322
325
  "augment": {
323
326
  "id": "augment",
324
327
  "role": "runtime",
325
- "version": "1.9.1",
328
+ "version": "1.11.0",
326
329
  "title": "Augment Code",
327
330
  "description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
328
331
  "tier": "core",
@@ -394,6 +397,10 @@ const capabilities = {
394
397
  }
395
398
  ]
396
399
  },
400
+ "triggerPrecedence": [
401
+ "skills",
402
+ "commands"
403
+ ],
397
404
  "commandStyle": "slash-hyphen",
398
405
  "hooksSurface": "settings-json",
399
406
  "hookEvents": "claude",
@@ -431,9 +438,9 @@ const capabilities = {
431
438
  "broken-windows": {
432
439
  "id": "broken-windows",
433
440
  "role": "feature",
434
- "version": "1.9.1",
441
+ "version": "1.11.0",
435
442
  "title": "Broken-windows ledger",
436
- "description": "Cross-phase defect register accumulating stubs, TODOs, skipped tests, unrun verifies, and unmet truths into .planning/WINDOWS.md. Blocks /gsd-ship while any window is open unless explicitly waived with a recorded reason. Operationalizes GSD's no-defer discipline as a tracked, enforced artifact (issue #1950).",
443
+ "description": "Cross-phase defect register accumulating stubs, TODOs, skipped tests, unrun verifies, and unmet truths into .planning/WINDOWS.md. When enforcement is enabled, it blocks /gsd-ship while any window is open unless explicitly waived with a recorded reason. Operationalizes GSD's no-defer discipline as a tracked artifact (issue #1950).",
437
444
  "tier": "full",
438
445
  "requires": [],
439
446
  "engines": {
@@ -477,7 +484,7 @@ const capabilities = {
477
484
  "claude": {
478
485
  "id": "claude",
479
486
  "role": "runtime",
480
- "version": "1.9.1",
487
+ "version": "1.11.0",
481
488
  "title": "Claude Code",
482
489
  "description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
483
490
  "tier": "core",
@@ -504,6 +511,14 @@ const capabilities = {
504
511
  "nesting": "flat",
505
512
  "recursive": false,
506
513
  "converter": "convertClaudeCommandToClaudeSkill"
514
+ },
515
+ {
516
+ "kind": "agents",
517
+ "destSubpath": "agents",
518
+ "prefix": "gsd-",
519
+ "nesting": "flat",
520
+ "recursive": false,
521
+ "converter": null
507
522
  }
508
523
  ],
509
524
  "local": [
@@ -525,6 +540,10 @@ const capabilities = {
525
540
  }
526
541
  ]
527
542
  },
543
+ "triggerPrecedence": [
544
+ "skills",
545
+ "commands"
546
+ ],
528
547
  "commandStyle": "slash-hyphen",
529
548
  "hooksSurface": "settings-json",
530
549
  "hookEvents": "claude",
@@ -577,8 +596,7 @@ const capabilities = {
577
596
  "skillsGlobalOnboarding": true,
578
597
  "legacyCommandsGsdInstallMigration": true,
579
598
  "legacyCommandsGsdUninstall": "global",
580
- "hyphenNameAgentBody": true,
581
- "reviewerCli": true
599
+ "hyphenNameAgentBody": true
582
600
  }
583
601
  },
584
602
  "reviewer": {
@@ -602,7 +620,11 @@ const capabilities = {
602
620
  "promptChannel": "stdin",
603
621
  "outputChannel": "stdout",
604
622
  "modelArg": "--model",
605
- "effortChannel": "argv"
623
+ "effortChannel": "argv",
624
+ "env": {
625
+ "CLAUDE_CODE_DISABLE_CLAUDE_MDS": "1",
626
+ "CLAUDE_CODE_DISABLE_AUTO_MEMORY": "1"
627
+ }
606
628
  },
607
629
  "timeoutFloorMs": 1200000,
608
630
  "emptyOutput": "stub-with-stderr",
@@ -624,7 +646,7 @@ const capabilities = {
624
646
  "claude-orchestration": {
625
647
  "id": "claude-orchestration",
626
648
  "role": "feature",
627
- "version": "1.9.1",
649
+ "version": "1.11.0",
628
650
  "title": "Claude orchestration (Workflow backend)",
629
651
  "description": "Default-off, BETA, claude-only capability that adopts Claude Code's Workflow tool (the engine behind /effort ultracode) as an optional parallel-execution backend for the GSD loop. When the runtime exposes the Workflow tool and claude_orchestration.execution_backend resolves to 'workflow', execute-phase emits a generated Workflow script (waves -> parallel() barriers, plans -> agent({ agentType: 'gsd-executor', isolation: 'worktree' }), files_modified overlap -> separate sequential stages, resumeFromRunId wired to the phase run id, shared token budget) that composes the SAME gsd-executor agent and worktree isolation the inline path uses, restoring the wave parallelism the #853 backgrounded-agent nesting limitation forces inline on Claude Code. (The plan-checker and verifier remain inline until separately wired — this capability delivers the parallel-execution backend, not those gates.) Also folds the ultraplan plan-offload under one runtime gate (plan:* surface). On any runtime lacking the Workflow tool, or when the capability is disabled, behaviour is byte-identical to today (inline/manual dispatch). Detection + emission live in gsd-core/bin/lib/claude-orchestration.cjs (pure, fail-closed). Mirrors the existing gsd-ultraplan-phase BETA-isolation posture.",
630
652
  "tier": "full",
@@ -683,7 +705,7 @@ const capabilities = {
683
705
  "into": "executor",
684
706
  "fragment": {
685
707
  "path": "fragments/execute-wave-pre.md",
686
- "inline": "# Claude orchestration — Workflow execution backend (BETA)\n\n> Injected at `execute:wave:pre` `into: executor` only when\n> `claude_orchestration.enabled` is true. Default-off; `onError: skip`.\n\n## When this contribution is active\n\nThe Claude orchestration capability is **default-off and BETA**. It activates only\nwhen ALL of the following hold:\n\n1. `claude_orchestration.enabled` is `true` in `.planning/config.json`, AND\n2. the active runtime is **Claude Code** (the Workflow tool is Claude / Agent\n SDK-specific), AND\n3. `claude_orchestration.execution_backend` resolves to `workflow` — either\n explicitly, or via `auto` — **and** the Agent SDK version is\n `>= claude_orchestration.min_agent_sdk_version` (default `0.3.149`). The SDK\n floor applies in both `auto` and `workflow` modes (fail-closed: a pre-release\n or older SDK never activates the preview backend).\n\nDetection is fail-closed: any miss degrades to **inline, manual, one-agent-per-\nmessage dispatch** — exactly today's behaviour. On a non-Claude runtime this\ncontribution is a no-op.\n\n## Why `execute:wave:pre` (not `execute:wave:post`)\n\nThis is a **dispatch-backend selector** — it decides HOW a wave's executor agents\nare spawned. That decision has to be made BEFORE the wave's `Agent()` calls in\n`execute-phase.md` step 3, not after the wave has already finished (#2285). The\ncapability previously registered at `execute:wave:post`, which fires only after\nworktree merge/post-merge tests/tracking updates — by then the wave was already\ndispatched inline, so the contribution was structurally unable to change how\ndispatch happened. This fragment is injected at the point that actually precedes\ndispatch.\n\n## What the orchestrator does when the Workflow backend is active\n\nBefore spawning executor agents for the current wave (execute-phase.md step 3),\nresolve the dispatch backend through the single composed CLI seam:\n\n```bash\ngsd-tools claude-orchestration resolve-wave-dispatch \\\n --waves \"$WAVE_MANIFEST_PATH\" --run-id \"$PHASE_RUN_ID\" \\\n --runtime \"$RUNTIME\" \\\n --phase-dir \"$PHASE_DIR\" --raw\n```\n\n`--agent-sdk-version` is no longer passed here (#2590). The router resolves the\ninstalled Agent SDK version itself; see **Agent SDK version** below. The former\n`${AGENT_SDK_VERSION:+--agent-sdk-version \"$AGENT_SDK_VERSION\"}` line was also\n**shell-dependent**: zsh does not word-split unquoted parameter expansions, so it\ncollapsed to a SINGLE argv element there, `argValue()` never matched, and the run\nfailed into `agent_sdk_version_unknown` — indistinguishable from genuinely\nunknown. Pass `--agent-sdk-version <ver>` explicitly only to pin a version.\n\nThis composes `detectWorkflowBackend` (the gate ladder above) with\n`emitWorkflowScript` (the wave→plan mapping below) in ONE call — the pure\nfunction backing it is `resolveWaveDispatch` in\n`gsd-core/bin/lib/claude-orchestration.cjs`. Response shape:\n`{ backend: 'inline'|'workflow', reason, script?, summary? }`.\n\n### Manifest construction (`$WAVE_MANIFEST_PATH`, `$PHASE_RUN_ID`, `$PHASE_DIR`)\n\nThese are NOT pre-existing execute-phase.md variables — the orchestrator builds\nthem at this step, from data it already has in-context from `discover_and_group_plans`\n(the `PLAN_INDEX` JSON) and step 2.5 (the per-plan `USE_WORKTREES_FOR_PLAN` decision):\n\n1. **`$PHASE_DIR`** — reuse `{phase_dir}` from the `INIT` bundle (already loaded\n in the `initialize` step). No new value needed.\n\n2. **`$PHASE_RUN_ID`** — a stable identifier for THIS phase-execution attempt, so\n `resumeFromRunId` can resume an interrupted run without re-dispatching plans\n the Workflow tool already completed. Construct it deterministically —\n `execute-{phase_number}-{phase_slug}` — from `INIT`'s `phase_number`/`phase_slug`\n (both are already validated identifiers used elsewhere in this workflow, so\n they satisfy `emitWorkflowScript`'s `isScriptableIdentifier` check). Do NOT\n mint a new random id per wave — the SAME `$PHASE_RUN_ID` is reused for every\n wave in the phase so the Workflow tool can correctly track cross-wave resume\n state.\n\n3. **`$WAVE_MANIFEST_PATH`** — a fresh temp file for THIS wave's manifest (one\n wave = one `waves` array with a single entry, matching the wave-by-wave\n dispatch loop; do not batch multiple waves into one manifest — waves are\n dispatched in wave order, not all at once):\n\n ```bash\n WAVE_MANIFEST_PATH=$(mktemp \"${TMPDIR:-/tmp}/gsd-wave-dispatch-XXXXXX\") && mv \"$WAVE_MANIFEST_PATH\" \"$WAVE_MANIFEST_PATH.json\" && WAVE_MANIFEST_PATH=\"$WAVE_MANIFEST_PATH.json\"\n ```\n\n Then **use the Write tool** (not a bash/jq pipeline — the orchestrator already\n has every field parsed in-context) to write the manifest JSON to\n `$WAVE_MANIFEST_PATH`:\n\n ```json\n {\n \"waves\": [\n {\n \"id\": \"wave-{N}\",\n \"plans\": [\n {\n \"id\": \"{plan_id}\",\n \"brief\": \"{the SAME <objective>...<success_criteria> prompt block step 3 builds for this plan's inline Agent() call}\",\n \"files_modified\": [\"{from PLAN_INDEX.plans[].files_modified for this plan}\"],\n \"use_worktree\": {true unless step 2.5 set USE_WORKTREES_FOR_PLAN=false for this plan}\n }\n ]\n }\n ]\n }\n ```\n\n - **`id`** — the plan id from `PLAN_INDEX`, e.g. `\"01-01\"`.\n - **`brief`** — MUST carry the same task content as step 3's inline `Agent()`\n prompt (the `<objective>`/`<execution_context>`/`<files_to_read>`/\n `<success_criteria>` block, with `{plan_number}`/`{phase_number}`/\n `{phase_name}` substituted) — a short summary here would NOT reproduce\n step 3's behavior and would violate the \"identical artifacts\" contract.\n - **`files_modified`** — copy verbatim from the plan's `PLAN_INDEX` entry.\n - **`use_worktree`** — `true` for every plan UNLESS step 2.5's per-plan\n worktree gate (`execute-phase/steps/per-plan-worktree-gate.md`) set\n `USE_WORKTREES_FOR_PLAN=false` for that plan (submodule-touching plan, or\n project-level `USE_WORKTREES=false`) — in which case pass `false` here so\n `emitWorkflowScript` omits `isolation: \"worktree\"` for that plan (#2772 /\n #2285 finding 1). **Never** hardcode `true` — that would force worktree\n isolation on a plan the inline path explicitly keeps out of worktrees.\n\n4. **`$AGENT_SDK_VERSION`** — no longer built here; the router resolves it.\n\n**Agent SDK version:** the orchestrator has no *bash-computable* way to\nintrospect the live Agent SDK version — but the router runs in Node, so it\nresolves the version itself (#2590), in this order:\n\n1. an explicit `--agent-sdk-version <ver>` (pin a version),\n2. `GSD_AGENT_SDK_VERSION`,\n3. the **installed** `@anthropic-ai/claude-agent-sdk` package version, read from\n its `package.json` on disk by walking `node_modules` up the tree. (Read\n directly rather than via `require.resolve`: the SDK's `exports` map does not\n expose `./package.json`, so `require.resolve` throws\n `ERR_PACKAGE_PATH_NOT_EXPORTED`.)\n\nPreviously nothing computed this at all, so gate 5 returned\n`agent_sdk_version_unknown` on **every** automated run and the Workflow backend\ncould never activate — while `gsd-tools capability state` still reported the\ncapability `active: true`. Fail-closed is preserved: when no version can be\nresolved, gate 5 still declines to `inline`. What changed is that a resolvable\nversion is now actually found, so a genuinely-too-old SDK reports\n`agent_sdk_version_below_floor` — the truthful reason — instead of `unknown`.\n\n**If `backend == \"workflow\"`:** run the emitted `script` via the Workflow tool\nfor THIS wave instead of the per-message `Agent()` loop in step 3. The script\ncomposes the SAME `gsd-executor` agent type the inline path uses, with\nworktree isolation applied PER PLAN from the manifest's `use_worktree` field\n(see `emitWorkflowScript`):\n\n- **waves → one or more sequential `parallel()` barriers** — each wave is a\n barrier group; when plans within a wave share `files_modified`, they are split\n into separate sequential stages within that wave's barrier.\n- **plans → `agent(brief, { agentType: 'gsd-executor', isolation: 'worktree' })`**\n when `use_worktree` is not `false`, or `agent(brief, { agentType: 'gsd-executor' })`\n (no isolation) when it is — so the produced `SUMMARY.md` and commits are\n identical to inline dispatch, INCLUDING the inline path's submodule safety\n gate (#2772 / #2285 finding 1).\n- **`files_modified` overlap → separate sequential stages** — the same overlap\n rule execute-phase already applies inline (step 1 of the wave loop).\n- **`resumeFromRunId`** — **pass `summary.resumeRunId` as the Workflow tool's\n `resumeFromRunId` INPUT when you invoke the tool.** It is a tool parameter,\n not a script function; the script deliberately does not call it (#2590 — doing\n so threw \"resumeFromRunId is not defined\" and rejected the entire script).\n Omitting it from the tool invocation silently regresses phase-resume to a\n no-op: an interrupted phase re-runs completed plans.\n\nThe orchestrator still runs steps 4–5.8 (wait for completion, worktree cleanup,\npost-merge gate, tracking update) exactly as it does for inline dispatch — the\nWorkflow backend only replaces HOW agents are spawned for this wave, not what\nhappens after they return.\n\n**If `backend == \"inline\"`** (any gate miss, or `resolve-wave-dispatch` itself\nunavailable/erroring): proceed to step 3's standard per-message `Agent()`\ndispatch — the default, byte-identical-to-today path. `onError: skip` on this\ncontribution means a `resolve-wave-dispatch` command failure is treated exactly\nlike an `inline` result, never as a fatal wave error.\n\n## Fallback contract\n\nDetection is fail-closed end-to-end: capability disabled, non-Claude runtime,\n`execution_backend:\"inline\"`, missing/incapable host descriptor, unknown or\nbelow-floor Agent SDK version, or an `emitWorkflowScript` failure on a malformed\nwave manifest — ANY of these degrades to `backend:\"inline\"` and execute-phase's\nstandard inline dispatch (step 3) runs unmodified. The Workflow backend never\npartially activates; the executor MUST NOT assume parallelism, a shared budget,\nor resume-from-run-id semantics when `backend == \"inline\"`.\n"
708
+ "inline": "# Claude orchestration — Workflow execution backend (BETA)\n\n> Injected at `execute:wave:pre` `into: executor` only when\n> `claude_orchestration.enabled` is true. Default-off; `onError: skip`.\n\n## When this contribution is active\n\nThe Claude orchestration capability is **default-off and BETA**. It activates only\nwhen ALL of the following hold:\n\n1. `claude_orchestration.enabled` is `true` in `.planning/config.json`, AND\n2. the active runtime is **Claude Code** (the Workflow tool is Claude / Agent\n SDK-specific), AND\n3. `claude_orchestration.execution_backend` resolves to `workflow` — either\n explicitly, or via `auto` — **and** the Agent SDK version is\n `>= claude_orchestration.min_agent_sdk_version` (default `0.3.149`). The SDK\n floor applies in both `auto` and `workflow` modes (fail-closed: a pre-release\n or older SDK never activates the preview backend).\n\nDetection is fail-closed: any miss degrades to **inline, manual, one-agent-per-\nmessage dispatch** — exactly today's behaviour. On a non-Claude runtime this\ncontribution is a no-op.\n\n## Why `execute:wave:pre` (not `execute:wave:post`)\n\nThis is a **dispatch-backend selector** — it decides HOW a wave's executor agents\nare spawned. That decision has to be made BEFORE the wave's `Agent()` calls in\n`execute-phase.md` step 3, not after the wave has already finished (#2285). The\ncapability previously registered at `execute:wave:post`, which fires only after\nworktree merge/post-merge tests/tracking updates — by then the wave was already\ndispatched inline, so the contribution was structurally unable to change how\ndispatch happened. This fragment is injected at the point that actually precedes\ndispatch.\n\n## What the orchestrator does when the Workflow backend is active\n\nBefore spawning executor agents for the current wave (execute-phase.md step 3),\nresolve the dispatch backend through the single composed CLI seam:\n\n```bash\ngsd-tools claude-orchestration resolve-wave-dispatch \\\n --waves \"$WAVE_MANIFEST_PATH\" --run-id \"$PHASE_RUN_ID\" \\\n --runtime \"$RUNTIME\" \\\n --phase-dir \"$PHASE_DIR\" --raw\n```\n\n`--agent-sdk-version` is no longer passed here (#2590). The router resolves the\ninstalled Agent SDK version itself; see **Agent SDK version** below. The former\n`${AGENT_SDK_VERSION:+--agent-sdk-version \"$AGENT_SDK_VERSION\"}` line was also\n**shell-dependent**: zsh does not word-split unquoted parameter expansions, so it\ncollapsed to a SINGLE argv element there, `argValue()` never matched, and the run\nfailed into `agent_sdk_version_unknown` — indistinguishable from genuinely\nunknown. Pass `--agent-sdk-version <ver>` explicitly only to pin a version.\n\nThis composes `detectWorkflowBackend` (the gate ladder above) with\n`emitWorkflowScript` (the wave→plan mapping below) in ONE call — the pure\nfunction backing it is `resolveWaveDispatch` in\n`gsd-core/bin/lib/claude-orchestration.cjs`. Response shape:\n`{ backend: 'inline'|'workflow', reason, script?, summary? }`.\n\n### Manifest construction (`$WAVE_MANIFEST_PATH`, `$PHASE_RUN_ID`, `$PHASE_DIR`)\n\nThese are NOT pre-existing execute-phase.md variables — the orchestrator builds\nthem at this step, from data it already has in-context from `discover_and_group_plans`\n(the `PLAN_INDEX` JSON) and step 2.5 (the per-plan `USE_WORKTREES_FOR_PLAN` decision):\n\n1. **`$PHASE_DIR`** — reuse `{phase_dir}` from the `INIT` bundle (already loaded\n in the `initialize` step). No new value needed.\n\n2. **`$PHASE_RUN_ID`** — a stable identifier for THIS phase-execution attempt, so\n `resumeFromRunId` can resume an interrupted run without re-dispatching plans\n the Workflow tool already completed. Construct it deterministically —\n `execute-{phase_number}-{phase_slug}` — from `INIT`'s `phase_number`/`phase_slug`\n (both are already validated identifiers used elsewhere in this workflow, so\n they satisfy `emitWorkflowScript`'s `isScriptableIdentifier` check). Do NOT\n mint a new random id per wave — the SAME `$PHASE_RUN_ID` is reused for every\n wave in the phase so the Workflow tool can correctly track cross-wave resume\n state.\n\n3. **`$WAVE_MANIFEST_PATH`** — a fresh temp file for THIS wave's manifest (one\n wave = one `waves` array with a single entry, matching the wave-by-wave\n dispatch loop; do not batch multiple waves into one manifest — waves are\n dispatched in wave order, not all at once):\n\n ```bash\n WAVE_MANIFEST_PATH=$(mktemp \"${TMPDIR:-/tmp}/gsd-wave-dispatch-XXXXXX\") && mv \"$WAVE_MANIFEST_PATH\" \"$WAVE_MANIFEST_PATH.json\" && WAVE_MANIFEST_PATH=\"$WAVE_MANIFEST_PATH.json\"\n ```\n\n Then **use the Write tool** (not a bash/jq pipeline — the orchestrator already\n has every field parsed in-context) to write the manifest JSON to\n `$WAVE_MANIFEST_PATH`:\n\n ```json\n {\n \"waves\": [\n {\n \"id\": \"wave-{N}\",\n \"plans\": [\n {\n \"id\": \"{plan_id}\",\n \"brief\": \"{the SAME <objective>...<success_criteria> prompt block step 3 builds for this plan's inline Agent() call}\",\n \"files_modified\": [\"{from PLAN_INDEX.plans[].files_modified for this plan}\"],\n \"use_worktree\": {true unless step 2.5 set USE_WORKTREES_FOR_PLAN=false for this plan}\n }\n ]\n }\n ]\n }\n ```\n\n - **`id`** — the plan id from `PLAN_INDEX`, e.g. `\"01-01\"`.\n - **`brief`** — MUST carry the same task content as step 3's inline `Agent()`\n prompt (the `<objective>`/`<execution_context>`/`<required_reading>`/\n `<success_criteria>` block, with `{plan_number}`/`{phase_number}`/\n `{phase_name}` substituted) — a short summary here would NOT reproduce\n step 3's behavior and would violate the \"identical artifacts\" contract.\n - **`files_modified`** — copy verbatim from the plan's `PLAN_INDEX` entry.\n - **`use_worktree`** — `true` for every plan UNLESS step 2.5's per-plan\n worktree gate (`execute-phase/steps/per-plan-worktree-gate.md`) set\n `USE_WORKTREES_FOR_PLAN=false` for that plan (submodule-touching plan, or\n project-level `USE_WORKTREES=false`) — in which case pass `false` here so\n `emitWorkflowScript` omits `isolation: \"worktree\"` for that plan (#2772 /\n #2285 finding 1). **Never** hardcode `true` — that would force worktree\n isolation on a plan the inline path explicitly keeps out of worktrees.\n\n4. **`$AGENT_SDK_VERSION`** — no longer built here; the router resolves it.\n\n**Agent SDK version:** the orchestrator has no *bash-computable* way to\nintrospect the live Agent SDK version — but the router runs in Node, so it\nresolves the version itself (#2590), in this order:\n\n1. an explicit `--agent-sdk-version <ver>` (pin a version),\n2. `GSD_AGENT_SDK_VERSION`,\n3. the **installed** `@anthropic-ai/claude-agent-sdk` package version, read from\n its `package.json` on disk by walking `node_modules` up the tree. (Read\n directly rather than via `require.resolve`: the SDK's `exports` map does not\n expose `./package.json`, so `require.resolve` throws\n `ERR_PACKAGE_PATH_NOT_EXPORTED`.)\n\nPreviously nothing computed this at all, so gate 5 returned\n`agent_sdk_version_unknown` on **every** automated run and the Workflow backend\ncould never activate — while `gsd-tools capability state` still reported the\ncapability `active: true`. Fail-closed is preserved: when no version can be\nresolved, gate 5 still declines to `inline`. What changed is that a resolvable\nversion is now actually found, so a genuinely-too-old SDK reports\n`agent_sdk_version_below_floor` — the truthful reason — instead of `unknown`.\n\n**If `backend == \"workflow\"`:** run the emitted `script` via the Workflow tool\nfor THIS wave instead of the per-message `Agent()` loop in step 3. The script\ncomposes the SAME `gsd-executor` agent type the inline path uses, with\nworktree isolation applied PER PLAN from the manifest's `use_worktree` field\n(see `emitWorkflowScript`):\n\n- **waves → one or more sequential `parallel()` barriers** — each wave is a\n barrier group; when plans within a wave share `files_modified`, they are split\n into separate sequential stages within that wave's barrier.\n- **plans → `agent(brief, { agentType: 'gsd-executor', isolation: 'worktree' })`**\n when `use_worktree` is not `false`, or `agent(brief, { agentType: 'gsd-executor' })`\n (no isolation) when it is — so the produced `SUMMARY.md` and commits are\n identical to inline dispatch, INCLUDING the inline path's submodule safety\n gate (#2772 / #2285 finding 1).\n- **`files_modified` overlap → separate sequential stages** — the same overlap\n rule execute-phase already applies inline (step 1 of the wave loop).\n- **`resumeFromRunId`** — **pass `summary.resumeRunId` as the Workflow tool's\n `resumeFromRunId` INPUT when you invoke the tool.** It is a tool parameter,\n not a script function; the script deliberately does not call it (#2590 — doing\n so threw \"resumeFromRunId is not defined\" and rejected the entire script).\n Omitting it from the tool invocation silently regresses phase-resume to a\n no-op: an interrupted phase re-runs completed plans.\n\n### After the run: manifest bridge into the merge chain (#3302)\n\nThe single Workflow tool call replaces step 3's per-plan `Agent()` loop — which also\nmeans step 3's manifest bookkeeping (creation + per-agent recording) does NOT happen on\nthis path. The orchestrator MUST bridge the run's per-agent results into the SAME\nmanifest-scoped merge chain inline dispatch uses, before steps 4–5.8, which then run\nunchanged:\n\n1. **Create the manifest BEFORE invoking the tool** (this is step 3's creation block,\n which this path skips). When ANY plan in the wave has `use_worktree` not `false`:\n\n ```bash\n if [ -z \"${WAVE_WORKTREE_MANIFEST:-}\" ]; then\n M=$(mktemp \"${TMPDIR:-/tmp}/gsd-worktree-wave-XXXXXX\") && mv \"$M\" \"$M.json\" && WAVE_WORKTREE_MANIFEST=\"$M.json\" || exit 1 # XXXXXX must be path-final on BSD/macOS (#1520)\n # Persist the dispatch-time orchestrator worktree root so wave-cleanup pins back\n # to the orchestrator's OWN worktree (#630), exactly as inline dispatch does.\n ORCH_ROOT=$(git rev-parse --show-toplevel)\n ORCH_ROOT=\"$ORCH_ROOT\" MANIFEST=\"$WAVE_WORKTREE_MANIFEST\" node -e 'const fs=require(\"fs\");fs.writeFileSync(process.env.MANIFEST,JSON.stringify({orchestrator_root:process.env.ORCH_ROOT||null,worktrees:[]})+\"\\n\")'\n export WAVE_WORKTREE_MANIFEST\n fi\n ```\n\n2. **Invoke the Workflow tool with the emitted script and\n `resumeFromRunId: summary.resumeRunId`.** The script top-level `return`s one entry\n per dispatched plan: `{ plan, expects_worktree, metadata }`. `metadata` is that\n plan's executor `<worktree_metadata>` JSON (`{agent_id, worktree_path, branch,\n expected_base}` — captured by the executor itself per\n `agents/gsd-executor.md`), or `null` when the agent's result carried none\n (interrupted agent, resumed-from-cache plan, or a non-worktree plan).\n\n3. **Record every worktree plan** exactly as inline dispatch does at step 3's\n \"After each `Agent()` returns\" — one `worktree.record-agent` per returned entry\n with `expects_worktree: true` and complete metadata:\n\n ```bash\n gsd_run query worktree.record-agent --manifest \"$WAVE_WORKTREE_MANIFEST\" \\\n --agent-id \"<metadata.agent_id>\" --path \"<metadata.worktree_path>\" \\\n --branch \"<metadata.branch>\" --base \"<metadata.expected_base>\" \\\n --files \"<plan files_modified, space-separated>\"\n ```\n\n The verb's write-strict validation applies as inline: on a non-zero exit or any\n missing field, stop and ask for recovery — do not append an under-populated entry.\n\n4. **HALT on uncapturable metadata — never a silently-empty manifest (#3302).**\n After recording, the manifest must hold one entry per `expects_worktree: true`\n outcome (`summary.worktreePlans` from `resolve-wave-dispatch` is the expected\n count). Any shortfall — a `null` `metadata`, a missing/empty field, or a count\n mismatch — means commits are stranded on their `worktree-wf_*` branches and\n `worktree.cleanup-wave` would merge nothing while the phase looks green. STOP the\n phase with the failing plan id and the recovery hint below; do NOT run\n `worktree.cleanup-wave` and do NOT proceed to step 4.\n\n **Recovery hint:** the unmerged `worktree-wf_*` branch still holds the work. Recover\n the missing metadata from the run's per-agent result journal (`journal.jsonl` — one\n `{\"type\":\"result\",…}` line per agent — in the Workflow run's transcript dir), re-run\n `worktree.record-agent` by hand, then re-run cleanup. If the journal cannot be\n recovered either, merge the branch manually after review — never discard it.\n\n5. **Resume (`resumeFromRunId`).** Cached/resumed agents do not re-emit their final\n messages, so a previously-completed plan can return with `metadata: null`. Recover\n that plan's metadata from the ORIGINAL run's journal (same hint as above). If it\n cannot be recovered, fail loudly per rule 4 — a resumed run must never report\n success over silently-dropped agent work.\n\n6. **Non-worktree plans** (`expects_worktree: false` — `use_worktree: false` in the\n manifest): they ran without isolation; their commits are already on the main working\n tree. No record-agent entry, no manifest write.\n\nWith the manifest populated, steps 4–5.8 (wait/completion bookkeeping, step 5.5's\nmanifest-scoped `worktree.cleanup-wave`, post-merge gate, tracking update) run\nUNCHANGED — the Workflow backend replaces HOW agents are spawned and returns their\nmetadata; the merge chain itself is the inline path's own, now with real input.\n\n**If `backend == \"inline\"`** (any gate miss, or `resolve-wave-dispatch` itself\nunavailable/erroring): proceed to step 3's standard per-message `Agent()`\ndispatch — the default, byte-identical-to-today path. `onError: skip` on this\ncontribution means a `resolve-wave-dispatch` command failure is treated exactly\nlike an `inline` result, never as a fatal wave error.\n\n## Fallback contract\n\nDetection is fail-closed end-to-end: capability disabled, non-Claude runtime,\n`execution_backend:\"inline\"`, missing/incapable host descriptor, unknown or\nbelow-floor Agent SDK version, or an `emitWorkflowScript` failure on a malformed\nwave manifest — ANY of these degrades to `backend:\"inline\"` and execute-phase's\nstandard inline dispatch (step 3) runs unmodified. The Workflow backend never\npartially activates; the executor MUST NOT assume parallelism, a shared budget,\nor resume-from-run-id semantics when `backend == \"inline\"`.\n"
687
709
  },
688
710
  "produces": [],
689
711
  "consumes": [
@@ -712,7 +734,7 @@ const capabilities = {
712
734
  "cline": {
713
735
  "id": "cline",
714
736
  "role": "runtime",
715
- "version": "1.9.1",
737
+ "version": "1.11.0",
716
738
  "title": "Cline",
717
739
  "description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
718
740
  "tier": "core",
@@ -739,10 +761,31 @@ const capabilities = {
739
761
  "nesting": "nested",
740
762
  "recursive": false,
741
763
  "converter": "convertClaudeCommandToClineSkill"
764
+ },
765
+ {
766
+ "kind": "agents",
767
+ "destSubpath": "agents",
768
+ "prefix": "gsd-",
769
+ "nesting": "flat",
770
+ "recursive": false,
771
+ "converter": "convertClaudeAgentToClineAgent"
742
772
  }
743
773
  ],
744
- "local": []
774
+ "local": [
775
+ {
776
+ "kind": "agents",
777
+ "destSubpath": "agents",
778
+ "prefix": "gsd-",
779
+ "nesting": "flat",
780
+ "recursive": false,
781
+ "converter": "convertClaudeAgentToClineAgent"
782
+ }
783
+ ]
745
784
  },
785
+ "triggerPrecedence": [
786
+ "skills",
787
+ "commands"
788
+ ],
746
789
  "commandStyle": "slash-hyphen",
747
790
  "hooksSurface": "cline-rules",
748
791
  "sandboxTier": "none",
@@ -783,7 +826,7 @@ const capabilities = {
783
826
  "code-review": {
784
827
  "id": "code-review",
785
828
  "role": "feature",
786
- "version": "1.9.1",
829
+ "version": "1.11.0",
787
830
  "title": "Code review",
788
831
  "description": "Source-file code review and review-fix workflow support for completed execution work.",
789
832
  "tier": "full",
@@ -844,7 +887,7 @@ const capabilities = {
844
887
  "codebuddy": {
845
888
  "id": "codebuddy",
846
889
  "role": "runtime",
847
- "version": "1.9.1",
890
+ "version": "1.11.0",
848
891
  "title": "CodeBuddy",
849
892
  "description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
850
893
  "tier": "core",
@@ -916,6 +959,10 @@ const capabilities = {
916
959
  }
917
960
  ]
918
961
  },
962
+ "triggerPrecedence": [
963
+ "skills",
964
+ "commands"
965
+ ],
919
966
  "commandStyle": "slash-hyphen",
920
967
  "hooksSurface": "settings-json",
921
968
  "hookEvents": "claude",
@@ -957,7 +1004,7 @@ const capabilities = {
957
1004
  "coderabbit": {
958
1005
  "id": "coderabbit",
959
1006
  "role": "reviewer",
960
- "version": "1.9.1",
1007
+ "version": "1.11.0",
961
1008
  "title": "CodeRabbit",
962
1009
  "description": "CodeRabbit CLI — cross-AI /gsd:review reviewer lane only; not a GSD install target (no runtime body, no artifacts). Reviews the working-tree diff (`coderabbit review --prompt-only`), not the source tree, and accepts neither a prompt nor a model flag; findings are down-weighted in consensus (evidenceClass: diff-only).",
963
1010
  "tier": "full",
@@ -999,7 +1046,7 @@ const capabilities = {
999
1046
  "codex": {
1000
1047
  "id": "codex",
1001
1048
  "role": "runtime",
1002
- "version": "1.9.1",
1049
+ "version": "1.11.0",
1003
1050
  "title": "OpenAI Codex CLI",
1004
1051
  "description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
1005
1052
  "tier": "core",
@@ -1027,6 +1074,14 @@ const capabilities = {
1027
1074
  "recursive": false,
1028
1075
  "converter": "convertClaudeCommandToCodexSkill",
1029
1076
  "home": ".agents"
1077
+ },
1078
+ {
1079
+ "kind": "agents",
1080
+ "destSubpath": "agents",
1081
+ "prefix": "gsd-",
1082
+ "nesting": "flat",
1083
+ "recursive": false,
1084
+ "converter": "convertClaudeAgentToCodexAgent"
1030
1085
  }
1031
1086
  ],
1032
1087
  "local": [
@@ -1036,11 +1091,22 @@ const capabilities = {
1036
1091
  "prefix": "gsd-",
1037
1092
  "nesting": "flat",
1038
1093
  "recursive": false,
1039
- "converter": "convertClaudeCommandToCodexSkill",
1040
- "home": ".agents"
1094
+ "converter": "convertClaudeCommandToCodexSkill"
1095
+ },
1096
+ {
1097
+ "kind": "agents",
1098
+ "destSubpath": "agents",
1099
+ "prefix": "gsd-",
1100
+ "nesting": "flat",
1101
+ "recursive": false,
1102
+ "converter": "convertClaudeAgentToCodexAgent"
1041
1103
  }
1042
1104
  ]
1043
1105
  },
1106
+ "triggerPrecedence": [
1107
+ "skills",
1108
+ "commands"
1109
+ ],
1044
1110
  "commandStyle": "shell-var",
1045
1111
  "hooksSurface": "codex-hooks-json",
1046
1112
  "hookEvents": "claude",
@@ -1086,8 +1152,7 @@ const capabilities = {
1086
1152
  "tomlConfigInstall": true,
1087
1153
  "cleanupSkillSidecars": true,
1088
1154
  "agentTomlFiles": true,
1089
- "frontmatterDialect": "codex",
1090
- "reviewerCli": true
1155
+ "frontmatterDialect": "codex"
1091
1156
  }
1092
1157
  },
1093
1158
  "reviewer": {
@@ -1137,7 +1202,7 @@ const capabilities = {
1137
1202
  "copilot": {
1138
1203
  "id": "copilot",
1139
1204
  "role": "runtime",
1140
- "version": "1.9.1",
1205
+ "version": "1.11.0",
1141
1206
  "title": "GitHub Copilot",
1142
1207
  "description": "GitHub Copilot (VS Code) — markdown config format; copilot-inline hook surface; no hook events emitted; flat skill nesting (unconfirmed recursive loader); tier-2 support.",
1143
1208
  "tier": "core",
@@ -1194,6 +1259,10 @@ const capabilities = {
1194
1259
  }
1195
1260
  ]
1196
1261
  },
1262
+ "triggerPrecedence": [
1263
+ "skills",
1264
+ "commands"
1265
+ ],
1197
1266
  "commandStyle": "slash-hyphen",
1198
1267
  "hooksSurface": "copilot-inline",
1199
1268
  "sandboxTier": "none",
@@ -1232,9 +1301,9 @@ const capabilities = {
1232
1301
  "cursor": {
1233
1302
  "id": "cursor",
1234
1303
  "role": "runtime",
1235
- "version": "1.9.1",
1304
+ "version": "1.11.0",
1236
1305
  "title": "Cursor",
1237
- "description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
1306
+ "description": "Cursor IDE — skills-only workflow surface; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
1238
1307
  "tier": "core",
1239
1308
  "requires": [],
1240
1309
  "engines": {
@@ -1260,14 +1329,6 @@ const capabilities = {
1260
1329
  "recursive": true,
1261
1330
  "converter": "convertClaudeCommandToCursorSkill"
1262
1331
  },
1263
- {
1264
- "kind": "commands",
1265
- "destSubpath": "commands",
1266
- "prefix": "gsd-",
1267
- "nesting": "flat",
1268
- "recursive": false,
1269
- "converter": "convertClaudeCommandToCursorCommand"
1270
- },
1271
1332
  {
1272
1333
  "kind": "agents",
1273
1334
  "destSubpath": "agents",
@@ -1286,14 +1347,6 @@ const capabilities = {
1286
1347
  "recursive": true,
1287
1348
  "converter": "convertClaudeCommandToCursorSkill"
1288
1349
  },
1289
- {
1290
- "kind": "commands",
1291
- "destSubpath": "commands",
1292
- "prefix": "gsd-",
1293
- "nesting": "flat",
1294
- "recursive": false,
1295
- "converter": "convertClaudeCommandToCursorCommand"
1296
- },
1297
1350
  {
1298
1351
  "kind": "agents",
1299
1352
  "destSubpath": "agents",
@@ -1304,6 +1357,10 @@ const capabilities = {
1304
1357
  }
1305
1358
  ]
1306
1359
  },
1360
+ "triggerPrecedence": [
1361
+ "skills",
1362
+ "commands"
1363
+ ],
1307
1364
  "commandStyle": "slash-hyphen",
1308
1365
  "hooksSurface": "cursor-hooks-json",
1309
1366
  "hookEvents": "claude",
@@ -1338,7 +1395,13 @@ const capabilities = {
1338
1395
  "frontmatterDialect": "cursor",
1339
1396
  "hooksJsonSurface": true,
1340
1397
  "skipSharedHooksInstall": true,
1341
- "reportCommandsDir": true,
1398
+ "retiredArtifacts": [
1399
+ {
1400
+ "destSubpath": "commands",
1401
+ "prefix": "gsd-",
1402
+ "suffix": ".md"
1403
+ }
1404
+ ],
1342
1405
  "skipUpdateBannerCommand": true,
1343
1406
  "skipSettingsUi": true,
1344
1407
  "managedHookEvents": [
@@ -1348,8 +1411,7 @@ const capabilities = {
1348
1411
  "stop",
1349
1412
  "subagentStart",
1350
1413
  "subagentStop"
1351
- ],
1352
- "reviewerCli": true
1414
+ ]
1353
1415
  }
1354
1416
  },
1355
1417
  "reviewer": {
@@ -1391,7 +1453,7 @@ const capabilities = {
1391
1453
  "drift": {
1392
1454
  "id": "drift",
1393
1455
  "role": "feature",
1394
- "version": "1.9.1",
1456
+ "version": "1.11.0",
1395
1457
  "title": "Drift detection gates",
1396
1458
  "description": "Drift detection gates for the planning loop. At execute:wave:post: a blocking schema drift gate (detects schema files changed without a database push) and a non-blocking codebase drift gate (detects structural additions not reflected in STRUCTURE.md). At plan:pre: a non-blocking, warn-only codebase drift gate (gated on workflow.plan_drift_precheck) that flags a stale codebase map before planning, so plans are authored against a fresh STRUCTURE.md instead of discovering drift mid-execution.",
1397
1459
  "tier": "full",
@@ -1469,7 +1531,7 @@ const capabilities = {
1469
1531
  "external-job": {
1470
1532
  "id": "external-job",
1471
1533
  "role": "feature",
1472
- "version": "1.9.1",
1534
+ "version": "1.11.0",
1473
1535
  "title": "Async external-job scheduler adapter",
1474
1536
  "description": "Default-off producer of the async external-job manifest (#1164). At execute:wave:post an executor can externalize long-running compute (SLURM first, scheduler-pluggable), commit a .planning/async-jobs/<job>.json manifest, defer SUMMARY.md, and return external_job_waiting. The core loop (#1165) consumes the manifest; this capability is the only thing that writes it. NOTE on contribution point: #1164 specifies execute:wave:pre, but execute-phase.md only dispatches execute:wave:post today (wave:pre is declared in the loop host contract but not rendered); wiring wave:pre dispatch is a core-loop change #1164 explicitly puts out of scope, so this capability registers at wave:post and the executor honors the runtime_budget classification guidance before running any tagged task. The adapter (scripts/slurm-adapter.cjs) reads external_job.submit_timeout_ms / poll_timeout_ms / artifact_dir through the canonical capability-config seam (env override > config > registry default).",
1475
1537
  "tier": "full",
@@ -1552,7 +1614,7 @@ const capabilities = {
1552
1614
  "gap-analysis": {
1553
1615
  "id": "gap-analysis",
1554
1616
  "role": "feature",
1555
- "version": "1.9.1",
1617
+ "version": "1.11.0",
1556
1618
  "title": "Post-planning gap analysis",
1557
1619
  "description": "Proactive, non-blocking post-planning coverage report. After all PLAN.md files are generated, cross-references every REQ-ID and D-ID from REQUIREMENTS.md and CONTEXT.md against plan bodies. Emits a Source | Item | Status table. Does not block phase advancement.",
1558
1620
  "tier": "standard",
@@ -1593,7 +1655,7 @@ const capabilities = {
1593
1655
  "gemini": {
1594
1656
  "id": "gemini",
1595
1657
  "role": "reviewer",
1596
- "version": "1.9.1",
1658
+ "version": "1.11.0",
1597
1659
  "title": "Gemini CLI",
1598
1660
  "description": "Google Gemini CLI — cross-AI /gsd:review reviewer lane only; not a GSD install target (no runtime body, no artifacts). Spawned as `gemini -p - -m <model>` with the plan piped on stdin.",
1599
1661
  "tier": "full",
@@ -1643,7 +1705,7 @@ const capabilities = {
1643
1705
  "graphify": {
1644
1706
  "id": "graphify",
1645
1707
  "role": "feature",
1646
- "version": "1.9.1",
1708
+ "version": "1.11.0",
1647
1709
  "title": "Knowledge graph",
1648
1710
  "description": "Build, query, and inspect the project knowledge graph in `.planning/graphs/`; exposes graphify CLI subcommands (build, query, status, diff) and the /gsd-graphify skill.",
1649
1711
  "tier": "full",
@@ -1684,7 +1746,7 @@ const capabilities = {
1684
1746
  "hermes": {
1685
1747
  "id": "hermes",
1686
1748
  "role": "runtime",
1687
- "version": "1.9.1",
1749
+ "version": "1.11.0",
1688
1750
  "title": "Hermes Agent",
1689
1751
  "description": "Hermes Agent (NousResearch) — skills nest under skills/gsd/ category bucket; nested skill layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
1690
1752
  "tier": "core",
@@ -1711,6 +1773,14 @@ const capabilities = {
1711
1773
  "nesting": "nested",
1712
1774
  "recursive": false,
1713
1775
  "converter": "convertClaudeCommandToClaudeSkill"
1776
+ },
1777
+ {
1778
+ "kind": "agents",
1779
+ "destSubpath": "agents",
1780
+ "prefix": "gsd-",
1781
+ "nesting": "flat",
1782
+ "recursive": false,
1783
+ "converter": "convertClaudeAgentToHermesAgent"
1714
1784
  }
1715
1785
  ],
1716
1786
  "local": [
@@ -1721,9 +1791,21 @@ const capabilities = {
1721
1791
  "nesting": "nested",
1722
1792
  "recursive": false,
1723
1793
  "converter": "convertClaudeCommandToClaudeSkill"
1794
+ },
1795
+ {
1796
+ "kind": "agents",
1797
+ "destSubpath": "agents",
1798
+ "prefix": "gsd-",
1799
+ "nesting": "flat",
1800
+ "recursive": false,
1801
+ "converter": "convertClaudeAgentToHermesAgent"
1724
1802
  }
1725
1803
  ]
1726
1804
  },
1805
+ "triggerPrecedence": [
1806
+ "skills",
1807
+ "commands"
1808
+ ],
1727
1809
  "commandStyle": "slash-hyphen",
1728
1810
  "hooksSurface": "settings-json",
1729
1811
  "hookEvents": "claude",
@@ -1775,7 +1857,7 @@ const capabilities = {
1775
1857
  "intel": {
1776
1858
  "id": "intel",
1777
1859
  "role": "feature",
1778
- "version": "1.9.1",
1860
+ "version": "1.11.0",
1779
1861
  "title": "Codebase intelligence",
1780
1862
  "description": "Code-intelligence store for codebase querying, diff, snapshot, and API-surface extraction; exposes `gsd-tools intel` subcommands (query, status, update, diff, snapshot, patch-meta, validate, extract-exports, api-surface) and backs `/gsd-map-codebase` and `gsd-intel-updater`.",
1781
1863
  "tier": "full",
@@ -1827,7 +1909,7 @@ const capabilities = {
1827
1909
  "kilo": {
1828
1910
  "id": "kilo",
1829
1911
  "role": "runtime",
1830
- "version": "1.9.1",
1912
+ "version": "1.11.0",
1831
1913
  "title": "Kilo Code",
1832
1914
  "description": "Kilo Code — XDG-based config dir; global skills at ~/.kilo/skills (separate from XDG config); flat command/ + skills artifact layout; no lifecycle hook registration; tier-2 support.",
1833
1915
  "tier": "core",
@@ -1869,6 +1951,14 @@ const capabilities = {
1869
1951
  "nesting": "flat",
1870
1952
  "recursive": true,
1871
1953
  "converter": "convertClaudeCommandToKiloSkill"
1954
+ },
1955
+ {
1956
+ "kind": "agents",
1957
+ "destSubpath": "agents",
1958
+ "prefix": "gsd-",
1959
+ "nesting": "flat",
1960
+ "recursive": false,
1961
+ "converter": "convertClaudeToKiloFrontmatter"
1872
1962
  }
1873
1963
  ],
1874
1964
  "local": [
@@ -1887,9 +1977,21 @@ const capabilities = {
1887
1977
  "nesting": "flat",
1888
1978
  "recursive": true,
1889
1979
  "converter": "convertClaudeCommandToKiloSkill"
1980
+ },
1981
+ {
1982
+ "kind": "agents",
1983
+ "destSubpath": "agents",
1984
+ "prefix": "gsd-",
1985
+ "nesting": "flat",
1986
+ "recursive": false,
1987
+ "converter": "convertClaudeToKiloFrontmatter"
1890
1988
  }
1891
1989
  ]
1892
1990
  },
1991
+ "triggerPrecedence": [
1992
+ "skills",
1993
+ "commands"
1994
+ ],
1893
1995
  "commandStyle": "slash-hyphen",
1894
1996
  "hooksSurface": "none",
1895
1997
  "extensionEvents": "kilo",
@@ -1936,7 +2038,7 @@ const capabilities = {
1936
2038
  "kimi": {
1937
2039
  "id": "kimi",
1938
2040
  "role": "runtime",
1939
- "version": "1.9.1",
2041
+ "version": "1.11.0",
1940
2042
  "title": "Kimi CLI",
1941
2043
  "description": "Kimi CLI (Moonshot AI) — generic agents root at ~/.config/agents; skills + kimi-agents artifact layout; native config.toml [[hooks]] bus at ~/.kimi/config.toml; background dispatch; tier-2 support.",
1942
2044
  "tier": "core",
@@ -1980,6 +2082,10 @@ const capabilities = {
1980
2082
  ],
1981
2083
  "local": []
1982
2084
  },
2085
+ "triggerPrecedence": [
2086
+ "skills",
2087
+ "commands"
2088
+ ],
1983
2089
  "commandStyle": "slash-hyphen",
1984
2090
  "hooksSurface": "kimi-hooks-toml",
1985
2091
  "hookEvents": "claude",
@@ -2034,7 +2140,7 @@ const capabilities = {
2034
2140
  "kimi-code": {
2035
2141
  "id": "kimi-code",
2036
2142
  "role": "runtime",
2037
- "version": "1.9.1",
2143
+ "version": "1.11.0",
2038
2144
  "title": "Kimi Code CLI",
2039
2145
  "description": "Kimi Code CLI (Moonshot AI, Node) — Agent Skills auto-discovered at ~/.kimi-code/skills; global AGENTS.md at ~/.kimi-code/AGENTS.md; native config.toml + [[hooks]] bus; three built-in subagents (coder/explore/plan), NO custom named subagents; background dispatch; tier-2 support. Distinct from Python kimi-cli (the 'kimi' capability) per ADR-1239 EoS — Kimi Code cannot dispatch named subagents so the kimi-agents YAML layout does NOT apply; persona injection rides the existing ${AGENT_SKILLS_*} workflow fallback. Install-layout, agent-install-check, and install-time decision (kimi vs kimi-code) land in follow-up PRs; this descriptor is the EoS foundation.",
2040
2146
  "tier": "core",
@@ -2065,10 +2171,31 @@ const capabilities = {
2065
2171
  "nesting": "flat",
2066
2172
  "recursive": false,
2067
2173
  "converter": "convertClaudeCommandToKimiCodeSkill"
2174
+ },
2175
+ {
2176
+ "kind": "agents",
2177
+ "destSubpath": "agents",
2178
+ "prefix": "gsd-",
2179
+ "nesting": "flat",
2180
+ "recursive": false,
2181
+ "converter": null
2068
2182
  }
2069
2183
  ],
2070
- "local": []
2184
+ "local": [
2185
+ {
2186
+ "kind": "agents",
2187
+ "destSubpath": "agents",
2188
+ "prefix": "gsd-",
2189
+ "nesting": "flat",
2190
+ "recursive": false,
2191
+ "converter": null
2192
+ }
2193
+ ]
2071
2194
  },
2195
+ "triggerPrecedence": [
2196
+ "skills",
2197
+ "commands"
2198
+ ],
2072
2199
  "commandStyle": "slash-hyphen",
2073
2200
  "hooksSurface": "kimi-hooks-toml",
2074
2201
  "hookEvents": "claude",
@@ -2166,7 +2293,7 @@ const capabilities = {
2166
2293
  "llama-cpp": {
2167
2294
  "id": "llama-cpp",
2168
2295
  "role": "reviewer",
2169
- "version": "1.9.1",
2296
+ "version": "1.11.0",
2170
2297
  "title": "llama.cpp",
2171
2298
  "description": "llama.cpp server — cross-AI /gsd:review reviewer lane only; not a GSD install target (no runtime body, no artifacts). OpenAI-compatible HTTP transport against a user-configured `review.llama_cpp_host` (POST /v1/chat/completions); model discovered via GET /v1/models piped through jq. Capability id/folder are kebab (`llama-cpp`, required by KEBAB_RE); `reviewer.slug` stays snake (`llama_cpp`) to match the shipped roster and the `review.llama_cpp_host` config key (ADR-2782's three-namespace trap).",
2172
2299
  "tier": "full",
@@ -2224,7 +2351,7 @@ const capabilities = {
2224
2351
  "lm-studio": {
2225
2352
  "id": "lm-studio",
2226
2353
  "role": "reviewer",
2227
- "version": "1.9.1",
2354
+ "version": "1.11.0",
2228
2355
  "title": "LM Studio",
2229
2356
  "description": "LM Studio local model server — cross-AI /gsd:review reviewer lane only; not a GSD install target (no runtime body, no artifacts). OpenAI-compatible HTTP transport against a user-configured `review.lm_studio_host` (POST /v1/chat/completions); model discovered via GET /v1/models piped through jq. Capability id/folder are kebab (`lm-studio`, required by KEBAB_RE); `reviewer.slug` stays snake (`lm_studio`) to match the shipped roster and the `review.lm_studio_host` config key (ADR-2782's three-namespace trap).",
2230
2357
  "tier": "full",
@@ -2282,7 +2409,7 @@ const capabilities = {
2282
2409
  "mempalace": {
2283
2410
  "id": "mempalace",
2284
2411
  "role": "feature",
2285
- "version": "1.9.1",
2412
+ "version": "1.11.0",
2286
2413
  "title": "MemPalace memory",
2287
2414
  "description": "Cross-session, cross-project memory: deliberate recall before discuss/plan and verbatim capture + temporal-KG sync at phase boundaries, via the MemPalace MCP server and CLI.",
2288
2415
  "tier": "full",
@@ -2456,7 +2583,7 @@ const capabilities = {
2456
2583
  "nyquist": {
2457
2584
  "id": "nyquist",
2458
2585
  "role": "feature",
2459
- "version": "1.9.1",
2586
+ "version": "1.11.0",
2460
2587
  "title": "Nyquist validation",
2461
2588
  "description": "Validation coverage audit that maps executed work back to tests and manual-only evidence.",
2462
2589
  "tier": "full",
@@ -2506,7 +2633,7 @@ const capabilities = {
2506
2633
  "ollama": {
2507
2634
  "id": "ollama",
2508
2635
  "role": "reviewer",
2509
- "version": "1.9.1",
2636
+ "version": "1.11.0",
2510
2637
  "title": "Ollama",
2511
2638
  "description": "Ollama local model server — cross-AI /gsd:review reviewer lane only; not a GSD install target (no runtime body, no artifacts). OpenAI-compatible HTTP transport against a user-configured `review.ollama_host` (POST /v1/chat/completions); model discovered via GET /v1/models piped through jq.",
2512
2639
  "tier": "full",
@@ -2564,7 +2691,7 @@ const capabilities = {
2564
2691
  "opencode": {
2565
2692
  "id": "opencode",
2566
2693
  "role": "runtime",
2567
- "version": "1.9.1",
2694
+ "version": "1.11.0",
2568
2695
  "title": "OpenCode",
2569
2696
  "description": "OpenCode — XDG-based config dir; flat commands/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
2570
2697
  "tier": "core",
@@ -2601,6 +2728,14 @@ const capabilities = {
2601
2728
  "nesting": "flat",
2602
2729
  "recursive": true,
2603
2730
  "converter": "convertClaudeCommandToOpencodeSkill"
2731
+ },
2732
+ {
2733
+ "kind": "agents",
2734
+ "destSubpath": "agents",
2735
+ "prefix": "gsd-",
2736
+ "nesting": "flat",
2737
+ "recursive": false,
2738
+ "converter": "convertClaudeToOpencodeFrontmatter"
2604
2739
  }
2605
2740
  ],
2606
2741
  "local": [
@@ -2619,9 +2754,21 @@ const capabilities = {
2619
2754
  "nesting": "flat",
2620
2755
  "recursive": true,
2621
2756
  "converter": "convertClaudeCommandToOpencodeSkill"
2757
+ },
2758
+ {
2759
+ "kind": "agents",
2760
+ "destSubpath": "agents",
2761
+ "prefix": "gsd-",
2762
+ "nesting": "flat",
2763
+ "recursive": false,
2764
+ "converter": "convertClaudeToOpencodeFrontmatter"
2622
2765
  }
2623
2766
  ]
2624
2767
  },
2768
+ "triggerPrecedence": [
2769
+ "skills",
2770
+ "commands"
2771
+ ],
2625
2772
  "commandStyle": "slash-hyphen",
2626
2773
  "hooksSurface": "none",
2627
2774
  "extensionEvents": "opencode",
@@ -2672,8 +2819,7 @@ const capabilities = {
2672
2819
  "skipHomePrefixSubstitution": true,
2673
2820
  "skipSettingsUi": true,
2674
2821
  "skipUpdateBannerCommand": true,
2675
- "skipCodexSkillsManifest": true,
2676
- "reviewerCli": true
2822
+ "skipCodexSkillsManifest": true
2677
2823
  }
2678
2824
  },
2679
2825
  "reviewer": {
@@ -2721,7 +2867,7 @@ const capabilities = {
2721
2867
  "pattern-mapper": {
2722
2868
  "id": "pattern-mapper",
2723
2869
  "role": "feature",
2724
- "version": "1.9.1",
2870
+ "version": "1.11.0",
2725
2871
  "title": "Pattern mapping",
2726
2872
  "description": "Optional codebase-pattern mapping before planning; owns the pattern mapper agent and workflow.pattern_mapper activation key.",
2727
2873
  "tier": "full",
@@ -2757,7 +2903,7 @@ const capabilities = {
2757
2903
  },
2758
2904
  "fragment": {
2759
2905
  "path": "fragments/plan-pre.md",
2760
- "inline": "<pattern_mapping_context>\n**Phase:** {phase_number} - {phase_name}\n**Phase directory:** {phase_dir}\n**Padded phase:** {padded_phase}\n\n<files_to_read>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {research_path} (Technical Research)\n</files_to_read>\n\n**Output file:** {phase_dir}/{padded_phase}-PATTERNS.md\n\nExtract the list of files to be created/modified from CONTEXT.md and RESEARCH.md. For each file, classify by role and data flow, find the closest existing analog in the codebase, extract concrete code excerpts, and produce PATTERNS.md.\n</pattern_mapping_context>\n"
2906
+ "inline": "<pattern_mapping_context>\n**Phase:** {phase_number} - {phase_name}\n**Phase directory:** {phase_dir}\n**Padded phase:** {padded_phase}\n\n<required_reading>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {research_path} (Technical Research)\n</required_reading>\n\n**Output file:** {phase_dir}/{padded_phase}-PATTERNS.md\n\nExtract the list of files to be created/modified from CONTEXT.md and RESEARCH.md. For each file, classify by role and data flow, find the closest existing analog in the codebase, extract concrete code excerpts, and produce PATTERNS.md.\n</pattern_mapping_context>\n"
2761
2907
  },
2762
2908
  "produces": [
2763
2909
  "PATTERNS.md"
@@ -2775,7 +2921,7 @@ const capabilities = {
2775
2921
  "pi": {
2776
2922
  "id": "pi",
2777
2923
  "role": "runtime",
2778
- "version": "1.9.1",
2924
+ "version": "1.11.0",
2779
2925
  "title": "pi",
2780
2926
  "description": "pi (pi.dev) — bun-runtime programmatic-CLI; TS ExtensionAPI (registerCommand/registerTool/registerProvider/pi.on); single native-extension file at ~/.pi/agent/extensions/gsd.js (.js, not .cjs — pi's extension auto-discovery accepts only .ts/.js, #2470); no shared-settings hook surface; tier-2 support.",
2781
2927
  "tier": "core",
@@ -2788,7 +2934,9 @@ const capabilities = {
2788
2934
  "kind": "dot-home-nested",
2789
2935
  "name": "agent",
2790
2936
  "parent": ".pi",
2791
- "env": []
2937
+ "env": [
2938
+ "PI_CODING_AGENT_DIR"
2939
+ ]
2792
2940
  },
2793
2941
  "localConfigDir": ".pi",
2794
2942
  "configFormat": "none",
@@ -2796,6 +2944,10 @@ const capabilities = {
2796
2944
  "global": [],
2797
2945
  "local": []
2798
2946
  },
2947
+ "triggerPrecedence": [
2948
+ "skills",
2949
+ "commands"
2950
+ ],
2799
2951
  "commandStyle": "slash-hyphen",
2800
2952
  "hooksSurface": "none",
2801
2953
  "extensionEvents": "pi",
@@ -2830,14 +2982,15 @@ const capabilities = {
2830
2982
  "file": "gsd.js",
2831
2983
  "source": "pi/gsd.cjs"
2832
2984
  },
2833
- "pluginOnlyInstall": true
2985
+ "pluginOnlyInstall": true,
2986
+ "sharedHooksDirName": "gsd-hooks"
2834
2987
  }
2835
2988
  }
2836
2989
  },
2837
2990
  "profile-pipeline": {
2838
2991
  "id": "profile-pipeline",
2839
2992
  "role": "feature",
2840
- "version": "1.9.1",
2993
+ "version": "1.11.0",
2841
2994
  "title": "Developer profiling pipeline",
2842
2995
  "description": "Developer behavioral profiling from Claude Code session history; scans session JSONL files, extracts and samples user messages, and generates profile artifacts (USER-PROFILE.md, dev-preferences.md, CLAUDE.md sections). Exposes eight `gsd-tools` commands: scan-sessions, extract-messages, profile-sample (pipeline phase) and write-profile, profile-questionnaire, generate-dev-preferences, generate-claude-profile, generate-claude-md (output phase). Backs the /gsd-profile-user skill and gsd-user-profiler agent.",
2843
2996
  "tier": "full",
@@ -2914,7 +3067,7 @@ const capabilities = {
2914
3067
  "qwen": {
2915
3068
  "id": "qwen",
2916
3069
  "role": "runtime",
2917
- "version": "1.9.1",
3070
+ "version": "1.11.0",
2918
3071
  "title": "Qwen Code",
2919
3072
  "description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
2920
3073
  "tier": "core",
@@ -2970,6 +3123,10 @@ const capabilities = {
2970
3123
  }
2971
3124
  ]
2972
3125
  },
3126
+ "triggerPrecedence": [
3127
+ "skills",
3128
+ "commands"
3129
+ ],
2973
3130
  "commandStyle": "slash-hyphen",
2974
3131
  "hooksSurface": "settings-json",
2975
3132
  "hookEvents": "claude",
@@ -3013,8 +3170,7 @@ const capabilities = {
3013
3170
  "legacyCommandsGsdCleanup": true,
3014
3171
  "legacyCommandsGsdInstallMigration": true,
3015
3172
  "legacyCommandsGsdUninstall": true,
3016
- "hyphenNameAgentBody": true,
3017
- "reviewerCli": true
3173
+ "hyphenNameAgentBody": true
3018
3174
  }
3019
3175
  },
3020
3176
  "reviewer": {
@@ -3047,10 +3203,77 @@ const capabilities = {
3047
3203
  "handler": null
3048
3204
  }
3049
3205
  },
3206
+ "refactor-trigger": {
3207
+ "id": "refactor-trigger",
3208
+ "role": "feature",
3209
+ "version": "1.11.0",
3210
+ "title": "Complexity-triggered refactor",
3211
+ "description": "Measures the complexity of the code a phase touched and, when a function crosses a configured threshold or jumps past its recorded anchor, surfaces a scoped refactor proposal at .planning/phases/<N>/<NN>-REFACTOR.md. Advisory by default — it never edits code and never blocks. Opt-in strict mode blocks /gsd-ship while a proposal is untriaged; a declined proposal is recorded in the broken-windows ledger when that capability is present. Operationalizes 'refactor early, refactor often' as continuous pressure instead of a thing you have to remember (issue #1953).",
3212
+ "tier": "full",
3213
+ "requires": [],
3214
+ "engines": {
3215
+ "gsd": ">=1.10.0"
3216
+ },
3217
+ "runtimeCompat": {
3218
+ "supported": [
3219
+ "*"
3220
+ ],
3221
+ "unsupported": []
3222
+ },
3223
+ "skills": [],
3224
+ "agents": [],
3225
+ "activationKey": "refactor.trigger_enabled",
3226
+ "config": {
3227
+ "refactor.trigger_enabled": {
3228
+ "type": "boolean",
3229
+ "default": false,
3230
+ "description": "Enable the complexity-triggered refactor hook. When true, an execute:post step evaluates the complexity of the files the phase touched and writes a scoped refactor proposal if a function crosses refactor.complexity_threshold or jumps past refactor.complexity_jump_delta. Opt-in; when false the hook never runs. Issue #1953."
3231
+ },
3232
+ "refactor.complexity_threshold": {
3233
+ "type": "number",
3234
+ "default": 15,
3235
+ "description": "Absolute per-function complexity above which a refactor proposal is surfaced. Semantics match ESLint's `complexity: {max: N}` — the trigger is STRICTLY GREATER, so a score of exactly N does not trigger. Default 15 follows SonarSource's default; ESLint's own default is 20 and radon's rank C begins at 11. Raise it if proposals feel like noise."
3236
+ },
3237
+ "refactor.complexity_jump_delta": {
3238
+ "type": "number",
3239
+ "default": 5,
3240
+ "description": "Complexity growth above which a refactor proposal is surfaced even when the absolute threshold is not reached. Measured against the function's anchor — the score recorded the last time the function was consciously dispositioned — so it accumulates across phases and catches slow creep the absolute threshold would miss. Strictly greater, as with the threshold."
3241
+ },
3242
+ "refactor.trigger_strict": {
3243
+ "type": "boolean",
3244
+ "default": false,
3245
+ "description": "Record an untriaged refactor proposal as an open `deviation` entry in the broken-windows ledger, so it becomes a tracked task that must be resolved before ship. Off by default and deliberately so: a blocking complexity number is a metric an executor can satisfy by splitting one coherent function into two incoherent ones, so the entry clears on the proposal being DISPOSITIONED (gsd-tools refactor accept|decline), never on the score improving. Ship blocking is the broken-windows capability's existing ship:pre gate — enable it with workflow.windows_enforce. With broken-windows absent, strict mode still records the proposal locally and says so; it cannot block on its own. Advisory mode (the default) surfaces the same proposal and tracks nothing."
3246
+ }
3247
+ },
3248
+ "commands": [
3249
+ {
3250
+ "family": "refactor",
3251
+ "module": "refactor-trigger-command-router.cjs",
3252
+ "router": "routeRefactorTriggerCommand"
3253
+ }
3254
+ ],
3255
+ "hooks": [],
3256
+ "steps": [
3257
+ {
3258
+ "point": "execute:post",
3259
+ "ref": {
3260
+ "command": "refactor evaluate"
3261
+ },
3262
+ "produces": [
3263
+ "REFACTOR.md"
3264
+ ],
3265
+ "consumes": [],
3266
+ "when": "refactor.trigger_enabled",
3267
+ "onError": "skip"
3268
+ }
3269
+ ],
3270
+ "contributions": [],
3271
+ "gates": []
3272
+ },
3050
3273
  "research": {
3051
3274
  "id": "research",
3052
3275
  "role": "feature",
3053
- "version": "1.9.1",
3276
+ "version": "1.11.0",
3054
3277
  "title": "Phase research",
3055
3278
  "description": "Optional phase research before planning; owns the phase researcher agent and workflow.research activation key.",
3056
3279
  "tier": "standard",
@@ -3084,7 +3307,7 @@ const capabilities = {
3084
3307
  },
3085
3308
  "fragment": {
3086
3309
  "path": "fragments/plan-pre.md",
3087
- "inline": "<objective>\nResearch how to implement Phase {phase_number}: {phase_name}\nAnswer: \"What do I need to know to PLAN this phase well?\"\n</objective>\n\n<files_to_read>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {requirements_path} (Project requirements)\n- {state_path} (Project decisions and history)\n</files_to_read>\n\n${AGENT_SKILLS_RESEARCHER}\n\n<additional_context>\n**Phase description:** {phase_description}\n**Phase requirement IDs (MUST address):** {phase_req_ids}\n\n**Project instructions:** Read ./CLAUDE.md or ./.claude/CLAUDE.md if either exists; follow project-specific guidelines.\n**Project skills:** Check .claude/skills/ or .agents/skills/ directory if either exists. Read SKILL.md files and account for project skill patterns.\n</additional_context>\n\n<output>\nWrite to: {phase_dir}/{phase_num}-RESEARCH.md\n</output>\n"
3310
+ "inline": "<objective>\nResearch how to implement Phase {phase_number}: {phase_name}\nAnswer: \"What do I need to know to PLAN this phase well?\"\n</objective>\n\n<required_reading>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {requirements_path} (Project requirements)\n- {state_path} (Project decisions and history)\n</required_reading>\n\n${AGENT_SKILLS_RESEARCHER}\n\n<additional_context>\n**Phase description:** {phase_description}\n**Phase requirement IDs (MUST address):** {phase_req_ids}\n\n**Project instructions:** Read ./CLAUDE.md or ./.claude/CLAUDE.md if either exists; follow project-specific guidelines.\n**Project skills:** Check .claude/skills/ or .agents/skills/ directory if either exists. Read SKILL.md files and account for project skill patterns.\n</additional_context>\n\n<output>\nWrite to: {phase_dir}/{phase_num}-RESEARCH.md\n</output>\n"
3088
3311
  },
3089
3312
  "produces": [
3090
3313
  "RESEARCH.md"
@@ -3102,7 +3325,7 @@ const capabilities = {
3102
3325
  "schema-gate": {
3103
3326
  "id": "schema-gate",
3104
3327
  "role": "feature",
3105
- "version": "1.9.1",
3328
+ "version": "1.11.0",
3106
3329
  "title": "Schema push detection gate",
3107
3330
  "description": "Detects ORM schema-relevant files in the phase scope during planning and injects a mandatory [BLOCKING] schema push task into the plan. Prevents false-positive verification where build/types pass because TypeScript types come from config, not the live database.",
3108
3331
  "tier": "full",
@@ -3148,7 +3371,7 @@ const capabilities = {
3148
3371
  "security": {
3149
3372
  "id": "security",
3150
3373
  "role": "feature",
3151
- "version": "1.9.1",
3374
+ "version": "1.11.0",
3152
3375
  "title": "Security enforcement",
3153
3376
  "description": "Threat mitigation verification and ship-time security blocking for phases with security enforcement enabled.",
3154
3377
  "tier": "full",
@@ -3247,7 +3470,7 @@ const capabilities = {
3247
3470
  "tdd": {
3248
3471
  "id": "tdd",
3249
3472
  "role": "feature",
3250
- "version": "1.9.1",
3473
+ "version": "1.11.0",
3251
3474
  "title": "Test-driven development",
3252
3475
  "description": "Injects TDD heuristics into the planner and enforces RED/GREEN gate compliance on type:tdd plans after execution. Owns workflow.tdd_mode; the --tdd CLI flag is the ephemeral override.",
3253
3476
  "tier": "full",
@@ -3300,7 +3523,7 @@ const capabilities = {
3300
3523
  "trae": {
3301
3524
  "id": "trae",
3302
3525
  "role": "runtime",
3303
- "version": "1.9.1",
3526
+ "version": "1.11.0",
3304
3527
  "title": "Trae IDE",
3305
3528
  "description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
3306
3529
  "tier": "core",
@@ -3356,6 +3579,10 @@ const capabilities = {
3356
3579
  }
3357
3580
  ]
3358
3581
  },
3582
+ "triggerPrecedence": [
3583
+ "skills",
3584
+ "commands"
3585
+ ],
3359
3586
  "commandStyle": "slash-hyphen",
3360
3587
  "hooksSurface": "none",
3361
3588
  "sandboxTier": "none",
@@ -3385,14 +3612,15 @@ const capabilities = {
3385
3612
  },
3386
3613
  "hostBehaviors": {
3387
3614
  "skipSharedHooksInstall": true,
3388
- "soloStageMetadata": "workflow"
3615
+ "soloStageMetadata": "workflow",
3616
+ "projectInstructionFile": ".trae/rules/rules.md"
3389
3617
  }
3390
3618
  }
3391
3619
  },
3392
3620
  "ui": {
3393
3621
  "id": "ui",
3394
3622
  "role": "feature",
3395
- "version": "1.9.1",
3623
+ "version": "1.11.0",
3396
3624
  "title": "UI design contracts",
3397
3625
  "description": "UI-SPEC design contract + retrospective UI audit for frontend phases.",
3398
3626
  "tier": "full",
@@ -3487,7 +3715,7 @@ const capabilities = {
3487
3715
  "vscode": {
3488
3716
  "id": "vscode",
3489
3717
  "role": "runtime",
3490
- "version": "1.9.1",
3718
+ "version": "1.11.0",
3491
3719
  "title": "VS Code",
3492
3720
  "description": "VS Code — Marketplace/VSIX extension; no file-projected config directory; IDE-profile reference host (active vscode.lm model, engine-owned hook bus, sandboxed globalState/workspaceState stateIO).",
3493
3721
  "tier": "core",
@@ -3507,6 +3735,10 @@ const capabilities = {
3507
3735
  "global": [],
3508
3736
  "local": []
3509
3737
  },
3738
+ "triggerPrecedence": [
3739
+ "skills",
3740
+ "commands"
3741
+ ],
3510
3742
  "commandStyle": "slash-hyphen",
3511
3743
  "hooksSurface": "none",
3512
3744
  "extensionEvents": "none",
@@ -3540,7 +3772,7 @@ const capabilities = {
3540
3772
  "windsurf": {
3541
3773
  "id": "windsurf",
3542
3774
  "role": "runtime",
3543
- "version": "1.9.1",
3775
+ "version": "1.11.0",
3544
3776
  "title": "Windsurf",
3545
3777
  "description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; Cascade native hooks.json blocking hook bus (pre_write_code, pre_run_command); tier-2 support.",
3546
3778
  "tier": "core",
@@ -3589,6 +3821,10 @@ const capabilities = {
3589
3821
  }
3590
3822
  ]
3591
3823
  },
3824
+ "triggerPrecedence": [
3825
+ "skills",
3826
+ "commands"
3827
+ ],
3592
3828
  "commandStyle": "slash-hyphen",
3593
3829
  "hooksSurface": "windsurf-hooks-json",
3594
3830
  "sandboxTier": "none",
@@ -3627,7 +3863,7 @@ const capabilities = {
3627
3863
  "zcode": {
3628
3864
  "id": "zcode",
3629
3865
  "role": "runtime",
3630
- "version": "1.9.1",
3866
+ "version": "1.11.0",
3631
3867
  "title": "ZCode",
3632
3868
  "description": "ZCode (Z.ai) — desktop Agentic Development Environment for GLM-5.2; Claude-shaped nested skills at ~/.zcode/skills/<name>/SKILL.md, slash commands, named subagents, native MCP; declarative plugin surface; profile-marker install; tier-2 community support.",
3633
3869
  "tier": "core",
@@ -3669,7 +3905,7 @@ const capabilities = {
3669
3905
  "prefix": "gsd-",
3670
3906
  "nesting": "flat",
3671
3907
  "recursive": false,
3672
- "converter": null
3908
+ "converter": "convertClaudeAgentToZcodeAgent"
3673
3909
  }
3674
3910
  ],
3675
3911
  "local": [
@@ -3695,10 +3931,14 @@ const capabilities = {
3695
3931
  "prefix": "gsd-",
3696
3932
  "nesting": "flat",
3697
3933
  "recursive": false,
3698
- "converter": null
3934
+ "converter": "convertClaudeAgentToZcodeAgent"
3699
3935
  }
3700
3936
  ]
3701
3937
  },
3938
+ "triggerPrecedence": [
3939
+ "skills",
3940
+ "commands"
3941
+ ],
3702
3942
  "commandStyle": "slash-hyphen",
3703
3943
  "hooksSurface": "none",
3704
3944
  "sandboxTier": "none",
@@ -3855,7 +4095,7 @@ const byLoopPoint = {
3855
4095
  },
3856
4096
  "fragment": {
3857
4097
  "path": "fragments/plan-pre.md",
3858
- "inline": "<objective>\nResearch how to implement Phase {phase_number}: {phase_name}\nAnswer: \"What do I need to know to PLAN this phase well?\"\n</objective>\n\n<files_to_read>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {requirements_path} (Project requirements)\n- {state_path} (Project decisions and history)\n</files_to_read>\n\n${AGENT_SKILLS_RESEARCHER}\n\n<additional_context>\n**Phase description:** {phase_description}\n**Phase requirement IDs (MUST address):** {phase_req_ids}\n\n**Project instructions:** Read ./CLAUDE.md or ./.claude/CLAUDE.md if either exists; follow project-specific guidelines.\n**Project skills:** Check .claude/skills/ or .agents/skills/ directory if either exists. Read SKILL.md files and account for project skill patterns.\n</additional_context>\n\n<output>\nWrite to: {phase_dir}/{phase_num}-RESEARCH.md\n</output>\n"
4098
+ "inline": "<objective>\nResearch how to implement Phase {phase_number}: {phase_name}\nAnswer: \"What do I need to know to PLAN this phase well?\"\n</objective>\n\n<required_reading>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {requirements_path} (Project requirements)\n- {state_path} (Project decisions and history)\n</required_reading>\n\n${AGENT_SKILLS_RESEARCHER}\n\n<additional_context>\n**Phase description:** {phase_description}\n**Phase requirement IDs (MUST address):** {phase_req_ids}\n\n**Project instructions:** Read ./CLAUDE.md or ./.claude/CLAUDE.md if either exists; follow project-specific guidelines.\n**Project skills:** Check .claude/skills/ or .agents/skills/ directory if either exists. Read SKILL.md files and account for project skill patterns.\n</additional_context>\n\n<output>\nWrite to: {phase_dir}/{phase_num}-RESEARCH.md\n</output>\n"
3859
4099
  },
3860
4100
  "produces": [
3861
4101
  "RESEARCH.md"
@@ -3889,7 +4129,7 @@ const byLoopPoint = {
3889
4129
  },
3890
4130
  "fragment": {
3891
4131
  "path": "fragments/plan-pre.md",
3892
- "inline": "<pattern_mapping_context>\n**Phase:** {phase_number} - {phase_name}\n**Phase directory:** {phase_dir}\n**Padded phase:** {padded_phase}\n\n<files_to_read>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {research_path} (Technical Research)\n</files_to_read>\n\n**Output file:** {phase_dir}/{padded_phase}-PATTERNS.md\n\nExtract the list of files to be created/modified from CONTEXT.md and RESEARCH.md. For each file, classify by role and data flow, find the closest existing analog in the codebase, extract concrete code excerpts, and produce PATTERNS.md.\n</pattern_mapping_context>\n"
4132
+ "inline": "<pattern_mapping_context>\n**Phase:** {phase_number} - {phase_name}\n**Phase directory:** {phase_dir}\n**Padded phase:** {padded_phase}\n\n<required_reading>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {research_path} (Technical Research)\n</required_reading>\n\n**Output file:** {phase_dir}/{padded_phase}-PATTERNS.md\n\nExtract the list of files to be created/modified from CONTEXT.md and RESEARCH.md. For each file, classify by role and data flow, find the closest existing analog in the codebase, extract concrete code excerpts, and produce PATTERNS.md.\n</pattern_mapping_context>\n"
3893
4133
  },
3894
4134
  "produces": [
3895
4135
  "PATTERNS.md"
@@ -4075,7 +4315,7 @@ const byLoopPoint = {
4075
4315
  "into": "executor",
4076
4316
  "fragment": {
4077
4317
  "path": "fragments/execute-wave-pre.md",
4078
- "inline": "# Claude orchestration — Workflow execution backend (BETA)\n\n> Injected at `execute:wave:pre` `into: executor` only when\n> `claude_orchestration.enabled` is true. Default-off; `onError: skip`.\n\n## When this contribution is active\n\nThe Claude orchestration capability is **default-off and BETA**. It activates only\nwhen ALL of the following hold:\n\n1. `claude_orchestration.enabled` is `true` in `.planning/config.json`, AND\n2. the active runtime is **Claude Code** (the Workflow tool is Claude / Agent\n SDK-specific), AND\n3. `claude_orchestration.execution_backend` resolves to `workflow` — either\n explicitly, or via `auto` — **and** the Agent SDK version is\n `>= claude_orchestration.min_agent_sdk_version` (default `0.3.149`). The SDK\n floor applies in both `auto` and `workflow` modes (fail-closed: a pre-release\n or older SDK never activates the preview backend).\n\nDetection is fail-closed: any miss degrades to **inline, manual, one-agent-per-\nmessage dispatch** — exactly today's behaviour. On a non-Claude runtime this\ncontribution is a no-op.\n\n## Why `execute:wave:pre` (not `execute:wave:post`)\n\nThis is a **dispatch-backend selector** — it decides HOW a wave's executor agents\nare spawned. That decision has to be made BEFORE the wave's `Agent()` calls in\n`execute-phase.md` step 3, not after the wave has already finished (#2285). The\ncapability previously registered at `execute:wave:post`, which fires only after\nworktree merge/post-merge tests/tracking updates — by then the wave was already\ndispatched inline, so the contribution was structurally unable to change how\ndispatch happened. This fragment is injected at the point that actually precedes\ndispatch.\n\n## What the orchestrator does when the Workflow backend is active\n\nBefore spawning executor agents for the current wave (execute-phase.md step 3),\nresolve the dispatch backend through the single composed CLI seam:\n\n```bash\ngsd-tools claude-orchestration resolve-wave-dispatch \\\n --waves \"$WAVE_MANIFEST_PATH\" --run-id \"$PHASE_RUN_ID\" \\\n --runtime \"$RUNTIME\" \\\n --phase-dir \"$PHASE_DIR\" --raw\n```\n\n`--agent-sdk-version` is no longer passed here (#2590). The router resolves the\ninstalled Agent SDK version itself; see **Agent SDK version** below. The former\n`${AGENT_SDK_VERSION:+--agent-sdk-version \"$AGENT_SDK_VERSION\"}` line was also\n**shell-dependent**: zsh does not word-split unquoted parameter expansions, so it\ncollapsed to a SINGLE argv element there, `argValue()` never matched, and the run\nfailed into `agent_sdk_version_unknown` — indistinguishable from genuinely\nunknown. Pass `--agent-sdk-version <ver>` explicitly only to pin a version.\n\nThis composes `detectWorkflowBackend` (the gate ladder above) with\n`emitWorkflowScript` (the wave→plan mapping below) in ONE call — the pure\nfunction backing it is `resolveWaveDispatch` in\n`gsd-core/bin/lib/claude-orchestration.cjs`. Response shape:\n`{ backend: 'inline'|'workflow', reason, script?, summary? }`.\n\n### Manifest construction (`$WAVE_MANIFEST_PATH`, `$PHASE_RUN_ID`, `$PHASE_DIR`)\n\nThese are NOT pre-existing execute-phase.md variables — the orchestrator builds\nthem at this step, from data it already has in-context from `discover_and_group_plans`\n(the `PLAN_INDEX` JSON) and step 2.5 (the per-plan `USE_WORKTREES_FOR_PLAN` decision):\n\n1. **`$PHASE_DIR`** — reuse `{phase_dir}` from the `INIT` bundle (already loaded\n in the `initialize` step). No new value needed.\n\n2. **`$PHASE_RUN_ID`** — a stable identifier for THIS phase-execution attempt, so\n `resumeFromRunId` can resume an interrupted run without re-dispatching plans\n the Workflow tool already completed. Construct it deterministically —\n `execute-{phase_number}-{phase_slug}` — from `INIT`'s `phase_number`/`phase_slug`\n (both are already validated identifiers used elsewhere in this workflow, so\n they satisfy `emitWorkflowScript`'s `isScriptableIdentifier` check). Do NOT\n mint a new random id per wave — the SAME `$PHASE_RUN_ID` is reused for every\n wave in the phase so the Workflow tool can correctly track cross-wave resume\n state.\n\n3. **`$WAVE_MANIFEST_PATH`** — a fresh temp file for THIS wave's manifest (one\n wave = one `waves` array with a single entry, matching the wave-by-wave\n dispatch loop; do not batch multiple waves into one manifest — waves are\n dispatched in wave order, not all at once):\n\n ```bash\n WAVE_MANIFEST_PATH=$(mktemp \"${TMPDIR:-/tmp}/gsd-wave-dispatch-XXXXXX\") && mv \"$WAVE_MANIFEST_PATH\" \"$WAVE_MANIFEST_PATH.json\" && WAVE_MANIFEST_PATH=\"$WAVE_MANIFEST_PATH.json\"\n ```\n\n Then **use the Write tool** (not a bash/jq pipeline — the orchestrator already\n has every field parsed in-context) to write the manifest JSON to\n `$WAVE_MANIFEST_PATH`:\n\n ```json\n {\n \"waves\": [\n {\n \"id\": \"wave-{N}\",\n \"plans\": [\n {\n \"id\": \"{plan_id}\",\n \"brief\": \"{the SAME <objective>...<success_criteria> prompt block step 3 builds for this plan's inline Agent() call}\",\n \"files_modified\": [\"{from PLAN_INDEX.plans[].files_modified for this plan}\"],\n \"use_worktree\": {true unless step 2.5 set USE_WORKTREES_FOR_PLAN=false for this plan}\n }\n ]\n }\n ]\n }\n ```\n\n - **`id`** — the plan id from `PLAN_INDEX`, e.g. `\"01-01\"`.\n - **`brief`** — MUST carry the same task content as step 3's inline `Agent()`\n prompt (the `<objective>`/`<execution_context>`/`<files_to_read>`/\n `<success_criteria>` block, with `{plan_number}`/`{phase_number}`/\n `{phase_name}` substituted) — a short summary here would NOT reproduce\n step 3's behavior and would violate the \"identical artifacts\" contract.\n - **`files_modified`** — copy verbatim from the plan's `PLAN_INDEX` entry.\n - **`use_worktree`** — `true` for every plan UNLESS step 2.5's per-plan\n worktree gate (`execute-phase/steps/per-plan-worktree-gate.md`) set\n `USE_WORKTREES_FOR_PLAN=false` for that plan (submodule-touching plan, or\n project-level `USE_WORKTREES=false`) — in which case pass `false` here so\n `emitWorkflowScript` omits `isolation: \"worktree\"` for that plan (#2772 /\n #2285 finding 1). **Never** hardcode `true` — that would force worktree\n isolation on a plan the inline path explicitly keeps out of worktrees.\n\n4. **`$AGENT_SDK_VERSION`** — no longer built here; the router resolves it.\n\n**Agent SDK version:** the orchestrator has no *bash-computable* way to\nintrospect the live Agent SDK version — but the router runs in Node, so it\nresolves the version itself (#2590), in this order:\n\n1. an explicit `--agent-sdk-version <ver>` (pin a version),\n2. `GSD_AGENT_SDK_VERSION`,\n3. the **installed** `@anthropic-ai/claude-agent-sdk` package version, read from\n its `package.json` on disk by walking `node_modules` up the tree. (Read\n directly rather than via `require.resolve`: the SDK's `exports` map does not\n expose `./package.json`, so `require.resolve` throws\n `ERR_PACKAGE_PATH_NOT_EXPORTED`.)\n\nPreviously nothing computed this at all, so gate 5 returned\n`agent_sdk_version_unknown` on **every** automated run and the Workflow backend\ncould never activate — while `gsd-tools capability state` still reported the\ncapability `active: true`. Fail-closed is preserved: when no version can be\nresolved, gate 5 still declines to `inline`. What changed is that a resolvable\nversion is now actually found, so a genuinely-too-old SDK reports\n`agent_sdk_version_below_floor` — the truthful reason — instead of `unknown`.\n\n**If `backend == \"workflow\"`:** run the emitted `script` via the Workflow tool\nfor THIS wave instead of the per-message `Agent()` loop in step 3. The script\ncomposes the SAME `gsd-executor` agent type the inline path uses, with\nworktree isolation applied PER PLAN from the manifest's `use_worktree` field\n(see `emitWorkflowScript`):\n\n- **waves → one or more sequential `parallel()` barriers** — each wave is a\n barrier group; when plans within a wave share `files_modified`, they are split\n into separate sequential stages within that wave's barrier.\n- **plans → `agent(brief, { agentType: 'gsd-executor', isolation: 'worktree' })`**\n when `use_worktree` is not `false`, or `agent(brief, { agentType: 'gsd-executor' })`\n (no isolation) when it is — so the produced `SUMMARY.md` and commits are\n identical to inline dispatch, INCLUDING the inline path's submodule safety\n gate (#2772 / #2285 finding 1).\n- **`files_modified` overlap → separate sequential stages** — the same overlap\n rule execute-phase already applies inline (step 1 of the wave loop).\n- **`resumeFromRunId`** — **pass `summary.resumeRunId` as the Workflow tool's\n `resumeFromRunId` INPUT when you invoke the tool.** It is a tool parameter,\n not a script function; the script deliberately does not call it (#2590 — doing\n so threw \"resumeFromRunId is not defined\" and rejected the entire script).\n Omitting it from the tool invocation silently regresses phase-resume to a\n no-op: an interrupted phase re-runs completed plans.\n\nThe orchestrator still runs steps 4–5.8 (wait for completion, worktree cleanup,\npost-merge gate, tracking update) exactly as it does for inline dispatch — the\nWorkflow backend only replaces HOW agents are spawned for this wave, not what\nhappens after they return.\n\n**If `backend == \"inline\"`** (any gate miss, or `resolve-wave-dispatch` itself\nunavailable/erroring): proceed to step 3's standard per-message `Agent()`\ndispatch — the default, byte-identical-to-today path. `onError: skip` on this\ncontribution means a `resolve-wave-dispatch` command failure is treated exactly\nlike an `inline` result, never as a fatal wave error.\n\n## Fallback contract\n\nDetection is fail-closed end-to-end: capability disabled, non-Claude runtime,\n`execution_backend:\"inline\"`, missing/incapable host descriptor, unknown or\nbelow-floor Agent SDK version, or an `emitWorkflowScript` failure on a malformed\nwave manifest — ANY of these degrades to `backend:\"inline\"` and execute-phase's\nstandard inline dispatch (step 3) runs unmodified. The Workflow backend never\npartially activates; the executor MUST NOT assume parallelism, a shared budget,\nor resume-from-run-id semantics when `backend == \"inline\"`.\n"
4318
+ "inline": "# Claude orchestration — Workflow execution backend (BETA)\n\n> Injected at `execute:wave:pre` `into: executor` only when\n> `claude_orchestration.enabled` is true. Default-off; `onError: skip`.\n\n## When this contribution is active\n\nThe Claude orchestration capability is **default-off and BETA**. It activates only\nwhen ALL of the following hold:\n\n1. `claude_orchestration.enabled` is `true` in `.planning/config.json`, AND\n2. the active runtime is **Claude Code** (the Workflow tool is Claude / Agent\n SDK-specific), AND\n3. `claude_orchestration.execution_backend` resolves to `workflow` — either\n explicitly, or via `auto` — **and** the Agent SDK version is\n `>= claude_orchestration.min_agent_sdk_version` (default `0.3.149`). The SDK\n floor applies in both `auto` and `workflow` modes (fail-closed: a pre-release\n or older SDK never activates the preview backend).\n\nDetection is fail-closed: any miss degrades to **inline, manual, one-agent-per-\nmessage dispatch** — exactly today's behaviour. On a non-Claude runtime this\ncontribution is a no-op.\n\n## Why `execute:wave:pre` (not `execute:wave:post`)\n\nThis is a **dispatch-backend selector** — it decides HOW a wave's executor agents\nare spawned. That decision has to be made BEFORE the wave's `Agent()` calls in\n`execute-phase.md` step 3, not after the wave has already finished (#2285). The\ncapability previously registered at `execute:wave:post`, which fires only after\nworktree merge/post-merge tests/tracking updates — by then the wave was already\ndispatched inline, so the contribution was structurally unable to change how\ndispatch happened. This fragment is injected at the point that actually precedes\ndispatch.\n\n## What the orchestrator does when the Workflow backend is active\n\nBefore spawning executor agents for the current wave (execute-phase.md step 3),\nresolve the dispatch backend through the single composed CLI seam:\n\n```bash\ngsd-tools claude-orchestration resolve-wave-dispatch \\\n --waves \"$WAVE_MANIFEST_PATH\" --run-id \"$PHASE_RUN_ID\" \\\n --runtime \"$RUNTIME\" \\\n --phase-dir \"$PHASE_DIR\" --raw\n```\n\n`--agent-sdk-version` is no longer passed here (#2590). The router resolves the\ninstalled Agent SDK version itself; see **Agent SDK version** below. The former\n`${AGENT_SDK_VERSION:+--agent-sdk-version \"$AGENT_SDK_VERSION\"}` line was also\n**shell-dependent**: zsh does not word-split unquoted parameter expansions, so it\ncollapsed to a SINGLE argv element there, `argValue()` never matched, and the run\nfailed into `agent_sdk_version_unknown` — indistinguishable from genuinely\nunknown. Pass `--agent-sdk-version <ver>` explicitly only to pin a version.\n\nThis composes `detectWorkflowBackend` (the gate ladder above) with\n`emitWorkflowScript` (the wave→plan mapping below) in ONE call — the pure\nfunction backing it is `resolveWaveDispatch` in\n`gsd-core/bin/lib/claude-orchestration.cjs`. Response shape:\n`{ backend: 'inline'|'workflow', reason, script?, summary? }`.\n\n### Manifest construction (`$WAVE_MANIFEST_PATH`, `$PHASE_RUN_ID`, `$PHASE_DIR`)\n\nThese are NOT pre-existing execute-phase.md variables — the orchestrator builds\nthem at this step, from data it already has in-context from `discover_and_group_plans`\n(the `PLAN_INDEX` JSON) and step 2.5 (the per-plan `USE_WORKTREES_FOR_PLAN` decision):\n\n1. **`$PHASE_DIR`** — reuse `{phase_dir}` from the `INIT` bundle (already loaded\n in the `initialize` step). No new value needed.\n\n2. **`$PHASE_RUN_ID`** — a stable identifier for THIS phase-execution attempt, so\n `resumeFromRunId` can resume an interrupted run without re-dispatching plans\n the Workflow tool already completed. Construct it deterministically —\n `execute-{phase_number}-{phase_slug}` — from `INIT`'s `phase_number`/`phase_slug`\n (both are already validated identifiers used elsewhere in this workflow, so\n they satisfy `emitWorkflowScript`'s `isScriptableIdentifier` check). Do NOT\n mint a new random id per wave — the SAME `$PHASE_RUN_ID` is reused for every\n wave in the phase so the Workflow tool can correctly track cross-wave resume\n state.\n\n3. **`$WAVE_MANIFEST_PATH`** — a fresh temp file for THIS wave's manifest (one\n wave = one `waves` array with a single entry, matching the wave-by-wave\n dispatch loop; do not batch multiple waves into one manifest — waves are\n dispatched in wave order, not all at once):\n\n ```bash\n WAVE_MANIFEST_PATH=$(mktemp \"${TMPDIR:-/tmp}/gsd-wave-dispatch-XXXXXX\") && mv \"$WAVE_MANIFEST_PATH\" \"$WAVE_MANIFEST_PATH.json\" && WAVE_MANIFEST_PATH=\"$WAVE_MANIFEST_PATH.json\"\n ```\n\n Then **use the Write tool** (not a bash/jq pipeline — the orchestrator already\n has every field parsed in-context) to write the manifest JSON to\n `$WAVE_MANIFEST_PATH`:\n\n ```json\n {\n \"waves\": [\n {\n \"id\": \"wave-{N}\",\n \"plans\": [\n {\n \"id\": \"{plan_id}\",\n \"brief\": \"{the SAME <objective>...<success_criteria> prompt block step 3 builds for this plan's inline Agent() call}\",\n \"files_modified\": [\"{from PLAN_INDEX.plans[].files_modified for this plan}\"],\n \"use_worktree\": {true unless step 2.5 set USE_WORKTREES_FOR_PLAN=false for this plan}\n }\n ]\n }\n ]\n }\n ```\n\n - **`id`** — the plan id from `PLAN_INDEX`, e.g. `\"01-01\"`.\n - **`brief`** — MUST carry the same task content as step 3's inline `Agent()`\n prompt (the `<objective>`/`<execution_context>`/`<required_reading>`/\n `<success_criteria>` block, with `{plan_number}`/`{phase_number}`/\n `{phase_name}` substituted) — a short summary here would NOT reproduce\n step 3's behavior and would violate the \"identical artifacts\" contract.\n - **`files_modified`** — copy verbatim from the plan's `PLAN_INDEX` entry.\n - **`use_worktree`** — `true` for every plan UNLESS step 2.5's per-plan\n worktree gate (`execute-phase/steps/per-plan-worktree-gate.md`) set\n `USE_WORKTREES_FOR_PLAN=false` for that plan (submodule-touching plan, or\n project-level `USE_WORKTREES=false`) — in which case pass `false` here so\n `emitWorkflowScript` omits `isolation: \"worktree\"` for that plan (#2772 /\n #2285 finding 1). **Never** hardcode `true` — that would force worktree\n isolation on a plan the inline path explicitly keeps out of worktrees.\n\n4. **`$AGENT_SDK_VERSION`** — no longer built here; the router resolves it.\n\n**Agent SDK version:** the orchestrator has no *bash-computable* way to\nintrospect the live Agent SDK version — but the router runs in Node, so it\nresolves the version itself (#2590), in this order:\n\n1. an explicit `--agent-sdk-version <ver>` (pin a version),\n2. `GSD_AGENT_SDK_VERSION`,\n3. the **installed** `@anthropic-ai/claude-agent-sdk` package version, read from\n its `package.json` on disk by walking `node_modules` up the tree. (Read\n directly rather than via `require.resolve`: the SDK's `exports` map does not\n expose `./package.json`, so `require.resolve` throws\n `ERR_PACKAGE_PATH_NOT_EXPORTED`.)\n\nPreviously nothing computed this at all, so gate 5 returned\n`agent_sdk_version_unknown` on **every** automated run and the Workflow backend\ncould never activate — while `gsd-tools capability state` still reported the\ncapability `active: true`. Fail-closed is preserved: when no version can be\nresolved, gate 5 still declines to `inline`. What changed is that a resolvable\nversion is now actually found, so a genuinely-too-old SDK reports\n`agent_sdk_version_below_floor` — the truthful reason — instead of `unknown`.\n\n**If `backend == \"workflow\"`:** run the emitted `script` via the Workflow tool\nfor THIS wave instead of the per-message `Agent()` loop in step 3. The script\ncomposes the SAME `gsd-executor` agent type the inline path uses, with\nworktree isolation applied PER PLAN from the manifest's `use_worktree` field\n(see `emitWorkflowScript`):\n\n- **waves → one or more sequential `parallel()` barriers** — each wave is a\n barrier group; when plans within a wave share `files_modified`, they are split\n into separate sequential stages within that wave's barrier.\n- **plans → `agent(brief, { agentType: 'gsd-executor', isolation: 'worktree' })`**\n when `use_worktree` is not `false`, or `agent(brief, { agentType: 'gsd-executor' })`\n (no isolation) when it is — so the produced `SUMMARY.md` and commits are\n identical to inline dispatch, INCLUDING the inline path's submodule safety\n gate (#2772 / #2285 finding 1).\n- **`files_modified` overlap → separate sequential stages** — the same overlap\n rule execute-phase already applies inline (step 1 of the wave loop).\n- **`resumeFromRunId`** — **pass `summary.resumeRunId` as the Workflow tool's\n `resumeFromRunId` INPUT when you invoke the tool.** It is a tool parameter,\n not a script function; the script deliberately does not call it (#2590 — doing\n so threw \"resumeFromRunId is not defined\" and rejected the entire script).\n Omitting it from the tool invocation silently regresses phase-resume to a\n no-op: an interrupted phase re-runs completed plans.\n\n### After the run: manifest bridge into the merge chain (#3302)\n\nThe single Workflow tool call replaces step 3's per-plan `Agent()` loop — which also\nmeans step 3's manifest bookkeeping (creation + per-agent recording) does NOT happen on\nthis path. The orchestrator MUST bridge the run's per-agent results into the SAME\nmanifest-scoped merge chain inline dispatch uses, before steps 4–5.8, which then run\nunchanged:\n\n1. **Create the manifest BEFORE invoking the tool** (this is step 3's creation block,\n which this path skips). When ANY plan in the wave has `use_worktree` not `false`:\n\n ```bash\n if [ -z \"${WAVE_WORKTREE_MANIFEST:-}\" ]; then\n M=$(mktemp \"${TMPDIR:-/tmp}/gsd-worktree-wave-XXXXXX\") && mv \"$M\" \"$M.json\" && WAVE_WORKTREE_MANIFEST=\"$M.json\" || exit 1 # XXXXXX must be path-final on BSD/macOS (#1520)\n # Persist the dispatch-time orchestrator worktree root so wave-cleanup pins back\n # to the orchestrator's OWN worktree (#630), exactly as inline dispatch does.\n ORCH_ROOT=$(git rev-parse --show-toplevel)\n ORCH_ROOT=\"$ORCH_ROOT\" MANIFEST=\"$WAVE_WORKTREE_MANIFEST\" node -e 'const fs=require(\"fs\");fs.writeFileSync(process.env.MANIFEST,JSON.stringify({orchestrator_root:process.env.ORCH_ROOT||null,worktrees:[]})+\"\\n\")'\n export WAVE_WORKTREE_MANIFEST\n fi\n ```\n\n2. **Invoke the Workflow tool with the emitted script and\n `resumeFromRunId: summary.resumeRunId`.** The script top-level `return`s one entry\n per dispatched plan: `{ plan, expects_worktree, metadata }`. `metadata` is that\n plan's executor `<worktree_metadata>` JSON (`{agent_id, worktree_path, branch,\n expected_base}` — captured by the executor itself per\n `agents/gsd-executor.md`), or `null` when the agent's result carried none\n (interrupted agent, resumed-from-cache plan, or a non-worktree plan).\n\n3. **Record every worktree plan** exactly as inline dispatch does at step 3's\n \"After each `Agent()` returns\" — one `worktree.record-agent` per returned entry\n with `expects_worktree: true` and complete metadata:\n\n ```bash\n gsd_run query worktree.record-agent --manifest \"$WAVE_WORKTREE_MANIFEST\" \\\n --agent-id \"<metadata.agent_id>\" --path \"<metadata.worktree_path>\" \\\n --branch \"<metadata.branch>\" --base \"<metadata.expected_base>\" \\\n --files \"<plan files_modified, space-separated>\"\n ```\n\n The verb's write-strict validation applies as inline: on a non-zero exit or any\n missing field, stop and ask for recovery — do not append an under-populated entry.\n\n4. **HALT on uncapturable metadata — never a silently-empty manifest (#3302).**\n After recording, the manifest must hold one entry per `expects_worktree: true`\n outcome (`summary.worktreePlans` from `resolve-wave-dispatch` is the expected\n count). Any shortfall — a `null` `metadata`, a missing/empty field, or a count\n mismatch — means commits are stranded on their `worktree-wf_*` branches and\n `worktree.cleanup-wave` would merge nothing while the phase looks green. STOP the\n phase with the failing plan id and the recovery hint below; do NOT run\n `worktree.cleanup-wave` and do NOT proceed to step 4.\n\n **Recovery hint:** the unmerged `worktree-wf_*` branch still holds the work. Recover\n the missing metadata from the run's per-agent result journal (`journal.jsonl` — one\n `{\"type\":\"result\",…}` line per agent — in the Workflow run's transcript dir), re-run\n `worktree.record-agent` by hand, then re-run cleanup. If the journal cannot be\n recovered either, merge the branch manually after review — never discard it.\n\n5. **Resume (`resumeFromRunId`).** Cached/resumed agents do not re-emit their final\n messages, so a previously-completed plan can return with `metadata: null`. Recover\n that plan's metadata from the ORIGINAL run's journal (same hint as above). If it\n cannot be recovered, fail loudly per rule 4 — a resumed run must never report\n success over silently-dropped agent work.\n\n6. **Non-worktree plans** (`expects_worktree: false` — `use_worktree: false` in the\n manifest): they ran without isolation; their commits are already on the main working\n tree. No record-agent entry, no manifest write.\n\nWith the manifest populated, steps 4–5.8 (wait/completion bookkeeping, step 5.5's\nmanifest-scoped `worktree.cleanup-wave`, post-merge gate, tracking update) run\nUNCHANGED — the Workflow backend replaces HOW agents are spawned and returns their\nmetadata; the merge chain itself is the inline path's own, now with real input.\n\n**If `backend == \"inline\"`** (any gate miss, or `resolve-wave-dispatch` itself\nunavailable/erroring): proceed to step 3's standard per-message `Agent()`\ndispatch — the default, byte-identical-to-today path. `onError: skip` on this\ncontribution means a `resolve-wave-dispatch` command failure is treated exactly\nlike an `inline` result, never as a fatal wave error.\n\n## Fallback contract\n\nDetection is fail-closed end-to-end: capability disabled, non-Claude runtime,\n`execution_backend:\"inline\"`, missing/incapable host descriptor, unknown or\nbelow-floor Agent SDK version, or an `emitWorkflowScript` failure on a malformed\nwave manifest — ANY of these degrades to `backend:\"inline\"` and execute-phase's\nstandard inline dispatch (step 3) runs unmodified. The Workflow backend never\npartially activates; the executor MUST NOT assume parallelism, a shared budget,\nor resume-from-run-id semantics when `backend == \"inline\"`.\n"
4079
4319
  },
4080
4320
  "produces": [],
4081
4321
  "consumes": [
@@ -4170,6 +4410,19 @@ const byLoopPoint = {
4170
4410
  ],
4171
4411
  "when": "workflow.code_review",
4172
4412
  "onError": "skip"
4413
+ },
4414
+ {
4415
+ "capId": "refactor-trigger",
4416
+ "point": "execute:post",
4417
+ "ref": {
4418
+ "command": "refactor evaluate"
4419
+ },
4420
+ "produces": [
4421
+ "REFACTOR.md"
4422
+ ],
4423
+ "consumes": [],
4424
+ "when": "refactor.trigger_enabled",
4425
+ "onError": "skip"
4173
4426
  }
4174
4427
  ],
4175
4428
  "contributions": [],
@@ -4373,6 +4626,10 @@ const configKeys = {
4373
4626
  "review.models.opencode": "opencode",
4374
4627
  "workflow.pattern_mapper": "pattern-mapper",
4375
4628
  "profile-pipeline.enabled": "profile-pipeline",
4629
+ "refactor.trigger_enabled": "refactor-trigger",
4630
+ "refactor.complexity_threshold": "refactor-trigger",
4631
+ "refactor.complexity_jump_delta": "refactor-trigger",
4632
+ "refactor.trigger_strict": "refactor-trigger",
4376
4633
  "workflow.research": "research",
4377
4634
  "workflow.schema_push_detection": "schema-gate",
4378
4635
  "workflow.security_enforcement": "security",
@@ -4701,6 +4958,30 @@ const configSchema = {
4701
4958
  "default": false,
4702
4959
  "description": "Enable the developer profiling pipeline commands (scan-sessions, extract-messages, profile-sample, write-profile, etc.)."
4703
4960
  },
4961
+ "refactor.trigger_enabled": {
4962
+ "owner": "refactor-trigger",
4963
+ "type": "boolean",
4964
+ "default": false,
4965
+ "description": "Enable the complexity-triggered refactor hook. When true, an execute:post step evaluates the complexity of the files the phase touched and writes a scoped refactor proposal if a function crosses refactor.complexity_threshold or jumps past refactor.complexity_jump_delta. Opt-in; when false the hook never runs. Issue #1953."
4966
+ },
4967
+ "refactor.complexity_threshold": {
4968
+ "owner": "refactor-trigger",
4969
+ "type": "number",
4970
+ "default": 15,
4971
+ "description": "Absolute per-function complexity above which a refactor proposal is surfaced. Semantics match ESLint's `complexity: {max: N}` — the trigger is STRICTLY GREATER, so a score of exactly N does not trigger. Default 15 follows SonarSource's default; ESLint's own default is 20 and radon's rank C begins at 11. Raise it if proposals feel like noise."
4972
+ },
4973
+ "refactor.complexity_jump_delta": {
4974
+ "owner": "refactor-trigger",
4975
+ "type": "number",
4976
+ "default": 5,
4977
+ "description": "Complexity growth above which a refactor proposal is surfaced even when the absolute threshold is not reached. Measured against the function's anchor — the score recorded the last time the function was consciously dispositioned — so it accumulates across phases and catches slow creep the absolute threshold would miss. Strictly greater, as with the threshold."
4978
+ },
4979
+ "refactor.trigger_strict": {
4980
+ "owner": "refactor-trigger",
4981
+ "type": "boolean",
4982
+ "default": false,
4983
+ "description": "Record an untriaged refactor proposal as an open `deviation` entry in the broken-windows ledger, so it becomes a tracked task that must be resolved before ship. Off by default and deliberately so: a blocking complexity number is a metric an executor can satisfy by splitting one coherent function into two incoherent ones, so the entry clears on the proposal being DISPOSITIONED (gsd-tools refactor accept|decline), never on the score improving. Ship blocking is the broken-windows capability's existing ship:pre gate — enable it with workflow.windows_enforce. With broken-windows absent, strict mode still records the proposal locally and says so; it cannot block on its own. Advisory mode (the default) surfaces the same proposal and tracks nothing."
4984
+ },
4704
4985
  "workflow.research": {
4705
4986
  "owner": "research",
4706
4987
  "type": "boolean",
@@ -4768,7 +5049,7 @@ const runtimes = {
4768
5049
  "antigravity": {
4769
5050
  "id": "antigravity",
4770
5051
  "role": "runtime",
4771
- "version": "1.9.1",
5052
+ "version": "1.11.0",
4772
5053
  "title": "Antigravity",
4773
5054
  "description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; flat skill layout; tier-1 support.",
4774
5055
  "tier": "core",
@@ -4831,6 +5112,10 @@ const runtimes = {
4831
5112
  }
4832
5113
  ]
4833
5114
  },
5115
+ "triggerPrecedence": [
5116
+ "skills",
5117
+ "commands"
5118
+ ],
4834
5119
  "commandStyle": "slash-hyphen",
4835
5120
  "hooksSurface": "settings-json",
4836
5121
  "hookEvents": "gemini",
@@ -4860,7 +5145,6 @@ const runtimes = {
4860
5145
  "effortSurface": "undocumented"
4861
5146
  },
4862
5147
  "hostBehaviors": {
4863
- "reviewerCli": true,
4864
5148
  "projectInstructionFile": "GEMINI.md",
4865
5149
  "noPathRewrite": true,
4866
5150
  "hookPathStyle": "raw",
@@ -4912,7 +5196,7 @@ const runtimes = {
4912
5196
  "augment": {
4913
5197
  "id": "augment",
4914
5198
  "role": "runtime",
4915
- "version": "1.9.1",
5199
+ "version": "1.11.0",
4916
5200
  "title": "Augment Code",
4917
5201
  "description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
4918
5202
  "tier": "core",
@@ -4984,6 +5268,10 @@ const runtimes = {
4984
5268
  }
4985
5269
  ]
4986
5270
  },
5271
+ "triggerPrecedence": [
5272
+ "skills",
5273
+ "commands"
5274
+ ],
4987
5275
  "commandStyle": "slash-hyphen",
4988
5276
  "hooksSurface": "settings-json",
4989
5277
  "hookEvents": "claude",
@@ -5021,7 +5309,7 @@ const runtimes = {
5021
5309
  "claude": {
5022
5310
  "id": "claude",
5023
5311
  "role": "runtime",
5024
- "version": "1.9.1",
5312
+ "version": "1.11.0",
5025
5313
  "title": "Claude Code",
5026
5314
  "description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
5027
5315
  "tier": "core",
@@ -5048,6 +5336,14 @@ const runtimes = {
5048
5336
  "nesting": "flat",
5049
5337
  "recursive": false,
5050
5338
  "converter": "convertClaudeCommandToClaudeSkill"
5339
+ },
5340
+ {
5341
+ "kind": "agents",
5342
+ "destSubpath": "agents",
5343
+ "prefix": "gsd-",
5344
+ "nesting": "flat",
5345
+ "recursive": false,
5346
+ "converter": null
5051
5347
  }
5052
5348
  ],
5053
5349
  "local": [
@@ -5069,6 +5365,10 @@ const runtimes = {
5069
5365
  }
5070
5366
  ]
5071
5367
  },
5368
+ "triggerPrecedence": [
5369
+ "skills",
5370
+ "commands"
5371
+ ],
5072
5372
  "commandStyle": "slash-hyphen",
5073
5373
  "hooksSurface": "settings-json",
5074
5374
  "hookEvents": "claude",
@@ -5121,8 +5421,7 @@ const runtimes = {
5121
5421
  "skillsGlobalOnboarding": true,
5122
5422
  "legacyCommandsGsdInstallMigration": true,
5123
5423
  "legacyCommandsGsdUninstall": "global",
5124
- "hyphenNameAgentBody": true,
5125
- "reviewerCli": true
5424
+ "hyphenNameAgentBody": true
5126
5425
  }
5127
5426
  },
5128
5427
  "reviewer": {
@@ -5146,7 +5445,11 @@ const runtimes = {
5146
5445
  "promptChannel": "stdin",
5147
5446
  "outputChannel": "stdout",
5148
5447
  "modelArg": "--model",
5149
- "effortChannel": "argv"
5448
+ "effortChannel": "argv",
5449
+ "env": {
5450
+ "CLAUDE_CODE_DISABLE_CLAUDE_MDS": "1",
5451
+ "CLAUDE_CODE_DISABLE_AUTO_MEMORY": "1"
5452
+ }
5150
5453
  },
5151
5454
  "timeoutFloorMs": 1200000,
5152
5455
  "emptyOutput": "stub-with-stderr",
@@ -5168,7 +5471,7 @@ const runtimes = {
5168
5471
  "cline": {
5169
5472
  "id": "cline",
5170
5473
  "role": "runtime",
5171
- "version": "1.9.1",
5474
+ "version": "1.11.0",
5172
5475
  "title": "Cline",
5173
5476
  "description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
5174
5477
  "tier": "core",
@@ -5195,10 +5498,31 @@ const runtimes = {
5195
5498
  "nesting": "nested",
5196
5499
  "recursive": false,
5197
5500
  "converter": "convertClaudeCommandToClineSkill"
5501
+ },
5502
+ {
5503
+ "kind": "agents",
5504
+ "destSubpath": "agents",
5505
+ "prefix": "gsd-",
5506
+ "nesting": "flat",
5507
+ "recursive": false,
5508
+ "converter": "convertClaudeAgentToClineAgent"
5198
5509
  }
5199
5510
  ],
5200
- "local": []
5511
+ "local": [
5512
+ {
5513
+ "kind": "agents",
5514
+ "destSubpath": "agents",
5515
+ "prefix": "gsd-",
5516
+ "nesting": "flat",
5517
+ "recursive": false,
5518
+ "converter": "convertClaudeAgentToClineAgent"
5519
+ }
5520
+ ]
5201
5521
  },
5522
+ "triggerPrecedence": [
5523
+ "skills",
5524
+ "commands"
5525
+ ],
5202
5526
  "commandStyle": "slash-hyphen",
5203
5527
  "hooksSurface": "cline-rules",
5204
5528
  "sandboxTier": "none",
@@ -5239,7 +5563,7 @@ const runtimes = {
5239
5563
  "codebuddy": {
5240
5564
  "id": "codebuddy",
5241
5565
  "role": "runtime",
5242
- "version": "1.9.1",
5566
+ "version": "1.11.0",
5243
5567
  "title": "CodeBuddy",
5244
5568
  "description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
5245
5569
  "tier": "core",
@@ -5311,6 +5635,10 @@ const runtimes = {
5311
5635
  }
5312
5636
  ]
5313
5637
  },
5638
+ "triggerPrecedence": [
5639
+ "skills",
5640
+ "commands"
5641
+ ],
5314
5642
  "commandStyle": "slash-hyphen",
5315
5643
  "hooksSurface": "settings-json",
5316
5644
  "hookEvents": "claude",
@@ -5352,7 +5680,7 @@ const runtimes = {
5352
5680
  "codex": {
5353
5681
  "id": "codex",
5354
5682
  "role": "runtime",
5355
- "version": "1.9.1",
5683
+ "version": "1.11.0",
5356
5684
  "title": "OpenAI Codex CLI",
5357
5685
  "description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
5358
5686
  "tier": "core",
@@ -5380,6 +5708,14 @@ const runtimes = {
5380
5708
  "recursive": false,
5381
5709
  "converter": "convertClaudeCommandToCodexSkill",
5382
5710
  "home": ".agents"
5711
+ },
5712
+ {
5713
+ "kind": "agents",
5714
+ "destSubpath": "agents",
5715
+ "prefix": "gsd-",
5716
+ "nesting": "flat",
5717
+ "recursive": false,
5718
+ "converter": "convertClaudeAgentToCodexAgent"
5383
5719
  }
5384
5720
  ],
5385
5721
  "local": [
@@ -5389,11 +5725,22 @@ const runtimes = {
5389
5725
  "prefix": "gsd-",
5390
5726
  "nesting": "flat",
5391
5727
  "recursive": false,
5392
- "converter": "convertClaudeCommandToCodexSkill",
5393
- "home": ".agents"
5728
+ "converter": "convertClaudeCommandToCodexSkill"
5729
+ },
5730
+ {
5731
+ "kind": "agents",
5732
+ "destSubpath": "agents",
5733
+ "prefix": "gsd-",
5734
+ "nesting": "flat",
5735
+ "recursive": false,
5736
+ "converter": "convertClaudeAgentToCodexAgent"
5394
5737
  }
5395
5738
  ]
5396
5739
  },
5740
+ "triggerPrecedence": [
5741
+ "skills",
5742
+ "commands"
5743
+ ],
5397
5744
  "commandStyle": "shell-var",
5398
5745
  "hooksSurface": "codex-hooks-json",
5399
5746
  "hookEvents": "claude",
@@ -5439,8 +5786,7 @@ const runtimes = {
5439
5786
  "tomlConfigInstall": true,
5440
5787
  "cleanupSkillSidecars": true,
5441
5788
  "agentTomlFiles": true,
5442
- "frontmatterDialect": "codex",
5443
- "reviewerCli": true
5789
+ "frontmatterDialect": "codex"
5444
5790
  }
5445
5791
  },
5446
5792
  "reviewer": {
@@ -5490,7 +5836,7 @@ const runtimes = {
5490
5836
  "copilot": {
5491
5837
  "id": "copilot",
5492
5838
  "role": "runtime",
5493
- "version": "1.9.1",
5839
+ "version": "1.11.0",
5494
5840
  "title": "GitHub Copilot",
5495
5841
  "description": "GitHub Copilot (VS Code) — markdown config format; copilot-inline hook surface; no hook events emitted; flat skill nesting (unconfirmed recursive loader); tier-2 support.",
5496
5842
  "tier": "core",
@@ -5547,6 +5893,10 @@ const runtimes = {
5547
5893
  }
5548
5894
  ]
5549
5895
  },
5896
+ "triggerPrecedence": [
5897
+ "skills",
5898
+ "commands"
5899
+ ],
5550
5900
  "commandStyle": "slash-hyphen",
5551
5901
  "hooksSurface": "copilot-inline",
5552
5902
  "sandboxTier": "none",
@@ -5585,9 +5935,9 @@ const runtimes = {
5585
5935
  "cursor": {
5586
5936
  "id": "cursor",
5587
5937
  "role": "runtime",
5588
- "version": "1.9.1",
5938
+ "version": "1.11.0",
5589
5939
  "title": "Cursor",
5590
- "description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
5940
+ "description": "Cursor IDE — skills-only workflow surface; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
5591
5941
  "tier": "core",
5592
5942
  "requires": [],
5593
5943
  "engines": {
@@ -5613,14 +5963,6 @@ const runtimes = {
5613
5963
  "recursive": true,
5614
5964
  "converter": "convertClaudeCommandToCursorSkill"
5615
5965
  },
5616
- {
5617
- "kind": "commands",
5618
- "destSubpath": "commands",
5619
- "prefix": "gsd-",
5620
- "nesting": "flat",
5621
- "recursive": false,
5622
- "converter": "convertClaudeCommandToCursorCommand"
5623
- },
5624
5966
  {
5625
5967
  "kind": "agents",
5626
5968
  "destSubpath": "agents",
@@ -5639,14 +5981,6 @@ const runtimes = {
5639
5981
  "recursive": true,
5640
5982
  "converter": "convertClaudeCommandToCursorSkill"
5641
5983
  },
5642
- {
5643
- "kind": "commands",
5644
- "destSubpath": "commands",
5645
- "prefix": "gsd-",
5646
- "nesting": "flat",
5647
- "recursive": false,
5648
- "converter": "convertClaudeCommandToCursorCommand"
5649
- },
5650
5984
  {
5651
5985
  "kind": "agents",
5652
5986
  "destSubpath": "agents",
@@ -5657,6 +5991,10 @@ const runtimes = {
5657
5991
  }
5658
5992
  ]
5659
5993
  },
5994
+ "triggerPrecedence": [
5995
+ "skills",
5996
+ "commands"
5997
+ ],
5660
5998
  "commandStyle": "slash-hyphen",
5661
5999
  "hooksSurface": "cursor-hooks-json",
5662
6000
  "hookEvents": "claude",
@@ -5691,7 +6029,13 @@ const runtimes = {
5691
6029
  "frontmatterDialect": "cursor",
5692
6030
  "hooksJsonSurface": true,
5693
6031
  "skipSharedHooksInstall": true,
5694
- "reportCommandsDir": true,
6032
+ "retiredArtifacts": [
6033
+ {
6034
+ "destSubpath": "commands",
6035
+ "prefix": "gsd-",
6036
+ "suffix": ".md"
6037
+ }
6038
+ ],
5695
6039
  "skipUpdateBannerCommand": true,
5696
6040
  "skipSettingsUi": true,
5697
6041
  "managedHookEvents": [
@@ -5701,8 +6045,7 @@ const runtimes = {
5701
6045
  "stop",
5702
6046
  "subagentStart",
5703
6047
  "subagentStop"
5704
- ],
5705
- "reviewerCli": true
6048
+ ]
5706
6049
  }
5707
6050
  },
5708
6051
  "reviewer": {
@@ -5744,7 +6087,7 @@ const runtimes = {
5744
6087
  "hermes": {
5745
6088
  "id": "hermes",
5746
6089
  "role": "runtime",
5747
- "version": "1.9.1",
6090
+ "version": "1.11.0",
5748
6091
  "title": "Hermes Agent",
5749
6092
  "description": "Hermes Agent (NousResearch) — skills nest under skills/gsd/ category bucket; nested skill layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
5750
6093
  "tier": "core",
@@ -5771,6 +6114,14 @@ const runtimes = {
5771
6114
  "nesting": "nested",
5772
6115
  "recursive": false,
5773
6116
  "converter": "convertClaudeCommandToClaudeSkill"
6117
+ },
6118
+ {
6119
+ "kind": "agents",
6120
+ "destSubpath": "agents",
6121
+ "prefix": "gsd-",
6122
+ "nesting": "flat",
6123
+ "recursive": false,
6124
+ "converter": "convertClaudeAgentToHermesAgent"
5774
6125
  }
5775
6126
  ],
5776
6127
  "local": [
@@ -5781,9 +6132,21 @@ const runtimes = {
5781
6132
  "nesting": "nested",
5782
6133
  "recursive": false,
5783
6134
  "converter": "convertClaudeCommandToClaudeSkill"
6135
+ },
6136
+ {
6137
+ "kind": "agents",
6138
+ "destSubpath": "agents",
6139
+ "prefix": "gsd-",
6140
+ "nesting": "flat",
6141
+ "recursive": false,
6142
+ "converter": "convertClaudeAgentToHermesAgent"
5784
6143
  }
5785
6144
  ]
5786
6145
  },
6146
+ "triggerPrecedence": [
6147
+ "skills",
6148
+ "commands"
6149
+ ],
5787
6150
  "commandStyle": "slash-hyphen",
5788
6151
  "hooksSurface": "settings-json",
5789
6152
  "hookEvents": "claude",
@@ -5835,7 +6198,7 @@ const runtimes = {
5835
6198
  "kilo": {
5836
6199
  "id": "kilo",
5837
6200
  "role": "runtime",
5838
- "version": "1.9.1",
6201
+ "version": "1.11.0",
5839
6202
  "title": "Kilo Code",
5840
6203
  "description": "Kilo Code — XDG-based config dir; global skills at ~/.kilo/skills (separate from XDG config); flat command/ + skills artifact layout; no lifecycle hook registration; tier-2 support.",
5841
6204
  "tier": "core",
@@ -5877,6 +6240,14 @@ const runtimes = {
5877
6240
  "nesting": "flat",
5878
6241
  "recursive": true,
5879
6242
  "converter": "convertClaudeCommandToKiloSkill"
6243
+ },
6244
+ {
6245
+ "kind": "agents",
6246
+ "destSubpath": "agents",
6247
+ "prefix": "gsd-",
6248
+ "nesting": "flat",
6249
+ "recursive": false,
6250
+ "converter": "convertClaudeToKiloFrontmatter"
5880
6251
  }
5881
6252
  ],
5882
6253
  "local": [
@@ -5895,9 +6266,21 @@ const runtimes = {
5895
6266
  "nesting": "flat",
5896
6267
  "recursive": true,
5897
6268
  "converter": "convertClaudeCommandToKiloSkill"
6269
+ },
6270
+ {
6271
+ "kind": "agents",
6272
+ "destSubpath": "agents",
6273
+ "prefix": "gsd-",
6274
+ "nesting": "flat",
6275
+ "recursive": false,
6276
+ "converter": "convertClaudeToKiloFrontmatter"
5898
6277
  }
5899
6278
  ]
5900
6279
  },
6280
+ "triggerPrecedence": [
6281
+ "skills",
6282
+ "commands"
6283
+ ],
5901
6284
  "commandStyle": "slash-hyphen",
5902
6285
  "hooksSurface": "none",
5903
6286
  "extensionEvents": "kilo",
@@ -5944,7 +6327,7 @@ const runtimes = {
5944
6327
  "kimi": {
5945
6328
  "id": "kimi",
5946
6329
  "role": "runtime",
5947
- "version": "1.9.1",
6330
+ "version": "1.11.0",
5948
6331
  "title": "Kimi CLI",
5949
6332
  "description": "Kimi CLI (Moonshot AI) — generic agents root at ~/.config/agents; skills + kimi-agents artifact layout; native config.toml [[hooks]] bus at ~/.kimi/config.toml; background dispatch; tier-2 support.",
5950
6333
  "tier": "core",
@@ -5988,6 +6371,10 @@ const runtimes = {
5988
6371
  ],
5989
6372
  "local": []
5990
6373
  },
6374
+ "triggerPrecedence": [
6375
+ "skills",
6376
+ "commands"
6377
+ ],
5991
6378
  "commandStyle": "slash-hyphen",
5992
6379
  "hooksSurface": "kimi-hooks-toml",
5993
6380
  "hookEvents": "claude",
@@ -6042,7 +6429,7 @@ const runtimes = {
6042
6429
  "kimi-code": {
6043
6430
  "id": "kimi-code",
6044
6431
  "role": "runtime",
6045
- "version": "1.9.1",
6432
+ "version": "1.11.0",
6046
6433
  "title": "Kimi Code CLI",
6047
6434
  "description": "Kimi Code CLI (Moonshot AI, Node) — Agent Skills auto-discovered at ~/.kimi-code/skills; global AGENTS.md at ~/.kimi-code/AGENTS.md; native config.toml + [[hooks]] bus; three built-in subagents (coder/explore/plan), NO custom named subagents; background dispatch; tier-2 support. Distinct from Python kimi-cli (the 'kimi' capability) per ADR-1239 EoS — Kimi Code cannot dispatch named subagents so the kimi-agents YAML layout does NOT apply; persona injection rides the existing ${AGENT_SKILLS_*} workflow fallback. Install-layout, agent-install-check, and install-time decision (kimi vs kimi-code) land in follow-up PRs; this descriptor is the EoS foundation.",
6048
6435
  "tier": "core",
@@ -6073,10 +6460,31 @@ const runtimes = {
6073
6460
  "nesting": "flat",
6074
6461
  "recursive": false,
6075
6462
  "converter": "convertClaudeCommandToKimiCodeSkill"
6463
+ },
6464
+ {
6465
+ "kind": "agents",
6466
+ "destSubpath": "agents",
6467
+ "prefix": "gsd-",
6468
+ "nesting": "flat",
6469
+ "recursive": false,
6470
+ "converter": null
6076
6471
  }
6077
6472
  ],
6078
- "local": []
6473
+ "local": [
6474
+ {
6475
+ "kind": "agents",
6476
+ "destSubpath": "agents",
6477
+ "prefix": "gsd-",
6478
+ "nesting": "flat",
6479
+ "recursive": false,
6480
+ "converter": null
6481
+ }
6482
+ ]
6079
6483
  },
6484
+ "triggerPrecedence": [
6485
+ "skills",
6486
+ "commands"
6487
+ ],
6080
6488
  "commandStyle": "slash-hyphen",
6081
6489
  "hooksSurface": "kimi-hooks-toml",
6082
6490
  "hookEvents": "claude",
@@ -6174,7 +6582,7 @@ const runtimes = {
6174
6582
  "opencode": {
6175
6583
  "id": "opencode",
6176
6584
  "role": "runtime",
6177
- "version": "1.9.1",
6585
+ "version": "1.11.0",
6178
6586
  "title": "OpenCode",
6179
6587
  "description": "OpenCode — XDG-based config dir; flat commands/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
6180
6588
  "tier": "core",
@@ -6211,6 +6619,14 @@ const runtimes = {
6211
6619
  "nesting": "flat",
6212
6620
  "recursive": true,
6213
6621
  "converter": "convertClaudeCommandToOpencodeSkill"
6622
+ },
6623
+ {
6624
+ "kind": "agents",
6625
+ "destSubpath": "agents",
6626
+ "prefix": "gsd-",
6627
+ "nesting": "flat",
6628
+ "recursive": false,
6629
+ "converter": "convertClaudeToOpencodeFrontmatter"
6214
6630
  }
6215
6631
  ],
6216
6632
  "local": [
@@ -6229,9 +6645,21 @@ const runtimes = {
6229
6645
  "nesting": "flat",
6230
6646
  "recursive": true,
6231
6647
  "converter": "convertClaudeCommandToOpencodeSkill"
6648
+ },
6649
+ {
6650
+ "kind": "agents",
6651
+ "destSubpath": "agents",
6652
+ "prefix": "gsd-",
6653
+ "nesting": "flat",
6654
+ "recursive": false,
6655
+ "converter": "convertClaudeToOpencodeFrontmatter"
6232
6656
  }
6233
6657
  ]
6234
6658
  },
6659
+ "triggerPrecedence": [
6660
+ "skills",
6661
+ "commands"
6662
+ ],
6235
6663
  "commandStyle": "slash-hyphen",
6236
6664
  "hooksSurface": "none",
6237
6665
  "extensionEvents": "opencode",
@@ -6282,8 +6710,7 @@ const runtimes = {
6282
6710
  "skipHomePrefixSubstitution": true,
6283
6711
  "skipSettingsUi": true,
6284
6712
  "skipUpdateBannerCommand": true,
6285
- "skipCodexSkillsManifest": true,
6286
- "reviewerCli": true
6713
+ "skipCodexSkillsManifest": true
6287
6714
  }
6288
6715
  },
6289
6716
  "reviewer": {
@@ -6331,7 +6758,7 @@ const runtimes = {
6331
6758
  "pi": {
6332
6759
  "id": "pi",
6333
6760
  "role": "runtime",
6334
- "version": "1.9.1",
6761
+ "version": "1.11.0",
6335
6762
  "title": "pi",
6336
6763
  "description": "pi (pi.dev) — bun-runtime programmatic-CLI; TS ExtensionAPI (registerCommand/registerTool/registerProvider/pi.on); single native-extension file at ~/.pi/agent/extensions/gsd.js (.js, not .cjs — pi's extension auto-discovery accepts only .ts/.js, #2470); no shared-settings hook surface; tier-2 support.",
6337
6764
  "tier": "core",
@@ -6344,7 +6771,9 @@ const runtimes = {
6344
6771
  "kind": "dot-home-nested",
6345
6772
  "name": "agent",
6346
6773
  "parent": ".pi",
6347
- "env": []
6774
+ "env": [
6775
+ "PI_CODING_AGENT_DIR"
6776
+ ]
6348
6777
  },
6349
6778
  "localConfigDir": ".pi",
6350
6779
  "configFormat": "none",
@@ -6352,6 +6781,10 @@ const runtimes = {
6352
6781
  "global": [],
6353
6782
  "local": []
6354
6783
  },
6784
+ "triggerPrecedence": [
6785
+ "skills",
6786
+ "commands"
6787
+ ],
6355
6788
  "commandStyle": "slash-hyphen",
6356
6789
  "hooksSurface": "none",
6357
6790
  "extensionEvents": "pi",
@@ -6386,14 +6819,15 @@ const runtimes = {
6386
6819
  "file": "gsd.js",
6387
6820
  "source": "pi/gsd.cjs"
6388
6821
  },
6389
- "pluginOnlyInstall": true
6822
+ "pluginOnlyInstall": true,
6823
+ "sharedHooksDirName": "gsd-hooks"
6390
6824
  }
6391
6825
  }
6392
6826
  },
6393
6827
  "qwen": {
6394
6828
  "id": "qwen",
6395
6829
  "role": "runtime",
6396
- "version": "1.9.1",
6830
+ "version": "1.11.0",
6397
6831
  "title": "Qwen Code",
6398
6832
  "description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
6399
6833
  "tier": "core",
@@ -6449,6 +6883,10 @@ const runtimes = {
6449
6883
  }
6450
6884
  ]
6451
6885
  },
6886
+ "triggerPrecedence": [
6887
+ "skills",
6888
+ "commands"
6889
+ ],
6452
6890
  "commandStyle": "slash-hyphen",
6453
6891
  "hooksSurface": "settings-json",
6454
6892
  "hookEvents": "claude",
@@ -6492,8 +6930,7 @@ const runtimes = {
6492
6930
  "legacyCommandsGsdCleanup": true,
6493
6931
  "legacyCommandsGsdInstallMigration": true,
6494
6932
  "legacyCommandsGsdUninstall": true,
6495
- "hyphenNameAgentBody": true,
6496
- "reviewerCli": true
6933
+ "hyphenNameAgentBody": true
6497
6934
  }
6498
6935
  },
6499
6936
  "reviewer": {
@@ -6529,7 +6966,7 @@ const runtimes = {
6529
6966
  "trae": {
6530
6967
  "id": "trae",
6531
6968
  "role": "runtime",
6532
- "version": "1.9.1",
6969
+ "version": "1.11.0",
6533
6970
  "title": "Trae IDE",
6534
6971
  "description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
6535
6972
  "tier": "core",
@@ -6585,6 +7022,10 @@ const runtimes = {
6585
7022
  }
6586
7023
  ]
6587
7024
  },
7025
+ "triggerPrecedence": [
7026
+ "skills",
7027
+ "commands"
7028
+ ],
6588
7029
  "commandStyle": "slash-hyphen",
6589
7030
  "hooksSurface": "none",
6590
7031
  "sandboxTier": "none",
@@ -6614,14 +7055,15 @@ const runtimes = {
6614
7055
  },
6615
7056
  "hostBehaviors": {
6616
7057
  "skipSharedHooksInstall": true,
6617
- "soloStageMetadata": "workflow"
7058
+ "soloStageMetadata": "workflow",
7059
+ "projectInstructionFile": ".trae/rules/rules.md"
6618
7060
  }
6619
7061
  }
6620
7062
  },
6621
7063
  "vscode": {
6622
7064
  "id": "vscode",
6623
7065
  "role": "runtime",
6624
- "version": "1.9.1",
7066
+ "version": "1.11.0",
6625
7067
  "title": "VS Code",
6626
7068
  "description": "VS Code — Marketplace/VSIX extension; no file-projected config directory; IDE-profile reference host (active vscode.lm model, engine-owned hook bus, sandboxed globalState/workspaceState stateIO).",
6627
7069
  "tier": "core",
@@ -6641,6 +7083,10 @@ const runtimes = {
6641
7083
  "global": [],
6642
7084
  "local": []
6643
7085
  },
7086
+ "triggerPrecedence": [
7087
+ "skills",
7088
+ "commands"
7089
+ ],
6644
7090
  "commandStyle": "slash-hyphen",
6645
7091
  "hooksSurface": "none",
6646
7092
  "extensionEvents": "none",
@@ -6674,7 +7120,7 @@ const runtimes = {
6674
7120
  "windsurf": {
6675
7121
  "id": "windsurf",
6676
7122
  "role": "runtime",
6677
- "version": "1.9.1",
7123
+ "version": "1.11.0",
6678
7124
  "title": "Windsurf",
6679
7125
  "description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; Cascade native hooks.json blocking hook bus (pre_write_code, pre_run_command); tier-2 support.",
6680
7126
  "tier": "core",
@@ -6723,6 +7169,10 @@ const runtimes = {
6723
7169
  }
6724
7170
  ]
6725
7171
  },
7172
+ "triggerPrecedence": [
7173
+ "skills",
7174
+ "commands"
7175
+ ],
6726
7176
  "commandStyle": "slash-hyphen",
6727
7177
  "hooksSurface": "windsurf-hooks-json",
6728
7178
  "sandboxTier": "none",
@@ -6761,7 +7211,7 @@ const runtimes = {
6761
7211
  "zcode": {
6762
7212
  "id": "zcode",
6763
7213
  "role": "runtime",
6764
- "version": "1.9.1",
7214
+ "version": "1.11.0",
6765
7215
  "title": "ZCode",
6766
7216
  "description": "ZCode (Z.ai) — desktop Agentic Development Environment for GLM-5.2; Claude-shaped nested skills at ~/.zcode/skills/<name>/SKILL.md, slash commands, named subagents, native MCP; declarative plugin surface; profile-marker install; tier-2 community support.",
6767
7217
  "tier": "core",
@@ -6803,7 +7253,7 @@ const runtimes = {
6803
7253
  "prefix": "gsd-",
6804
7254
  "nesting": "flat",
6805
7255
  "recursive": false,
6806
- "converter": null
7256
+ "converter": "convertClaudeAgentToZcodeAgent"
6807
7257
  }
6808
7258
  ],
6809
7259
  "local": [
@@ -6829,10 +7279,14 @@ const runtimes = {
6829
7279
  "prefix": "gsd-",
6830
7280
  "nesting": "flat",
6831
7281
  "recursive": false,
6832
- "converter": null
7282
+ "converter": "convertClaudeAgentToZcodeAgent"
6833
7283
  }
6834
7284
  ]
6835
7285
  },
7286
+ "triggerPrecedence": [
7287
+ "skills",
7288
+ "commands"
7289
+ ],
6836
7290
  "commandStyle": "slash-hyphen",
6837
7291
  "hooksSurface": "none",
6838
7292
  "sandboxTier": "none",
@@ -6923,6 +7377,11 @@ const commandFamilies = {
6923
7377
  "module": "profile-pipeline-command-router.cjs",
6924
7378
  "router": "routeProfileSample"
6925
7379
  },
7380
+ "refactor": {
7381
+ "capId": "refactor-trigger",
7382
+ "module": "refactor-trigger-command-router.cjs",
7383
+ "router": "routeRefactorTriggerCommand"
7384
+ },
6926
7385
  "scan-sessions": {
6927
7386
  "capId": "profile-pipeline",
6928
7387
  "module": "profile-pipeline-command-router.cjs",
@@ -7053,6 +7512,7 @@ const _requiresGraph = {
7053
7512
  "pi": [],
7054
7513
  "profile-pipeline": [],
7055
7514
  "qwen": [],
7515
+ "refactor-trigger": [],
7056
7516
  "research": [],
7057
7517
  "schema-gate": [],
7058
7518
  "security": [],