@opengsd/gsd-core 1.10.0 → 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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/agents/gsd-debug-session-manager.md +11 -0
- package/agents/gsd-doc-synthesizer.md +2 -4
- package/agents/gsd-executor.md +5 -5
- package/agents/gsd-mempalace-curator.md +5 -2
- package/agents/gsd-phase-researcher.md +20 -1
- package/agents/gsd-plan-checker.md +37 -0
- package/agents/gsd-planner.md +44 -46
- package/agents/gsd-user-profiler.md +3 -0
- package/agents/gsd-verifier.md +12 -3
- package/bin/install.js +841 -971
- package/bin/lib/ui-safety-gate.cjs +2 -0
- package/commands/gsd/code-review.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/map-codebase.md +1 -1
- package/commands/gsd/mempalace-capture.md +1 -1
- package/commands/gsd/mempalace-recall.md +1 -1
- package/commands/gsd/new-milestone.md +1 -1
- package/commands/gsd/quick.md +1 -1
- package/commands/gsd/review-backlog.md +2 -1
- package/commands/gsd/verify-work.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +469 -88
- package/gsd-core/bin/lib/active-workstream-store.cjs +138 -22
- package/gsd-core/bin/lib/agent-install-check.cjs +230 -32
- package/gsd-core/bin/lib/api-coverage.cjs +3 -5
- package/gsd-core/bin/lib/artifacts.cjs +3 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +2 -4
- package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
- package/gsd-core/bin/lib/audit.cjs +876 -240
- package/gsd-core/bin/lib/broken-windows.cjs +1 -1
- package/gsd-core/bin/lib/capability-consent.cjs +149 -15
- package/gsd-core/bin/lib/capability-lifecycle.cjs +45 -0
- package/gsd-core/bin/lib/capability-registry.cjs +575 -101
- package/gsd-core/bin/lib/capability-source.cjs +92 -0
- package/gsd-core/bin/lib/capability-trust.cjs +444 -25
- package/gsd-core/bin/lib/capability-validator.cjs +495 -22
- package/gsd-core/bin/lib/capability-writer.cjs +3 -2
- package/gsd-core/bin/lib/check-command-router.cjs +71 -37
- package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
- package/gsd-core/bin/lib/codex-agent-toml.cjs +329 -0
- package/gsd-core/bin/lib/command-aliases.cjs +22 -0
- package/gsd-core/bin/lib/command-roster.cjs +44 -1
- package/gsd-core/bin/lib/commands.cjs +651 -86
- package/gsd-core/bin/lib/commonjs-marker.cjs +12 -6
- package/gsd-core/bin/lib/complexity-trigger.cjs +1172 -0
- package/gsd-core/bin/lib/config-loader.cjs +75 -0
- package/gsd-core/bin/lib/config.cjs +10 -1
- package/gsd-core/bin/lib/core-utils.cjs +127 -29
- package/gsd-core/bin/lib/decisions.cjs +23 -0
- package/gsd-core/bin/lib/fallow-runner.cjs +20 -44
- package/gsd-core/bin/lib/frontmatter.cjs +155 -20
- package/gsd-core/bin/lib/gap-checker.cjs +68 -7
- package/gsd-core/bin/lib/git-base-branch.cjs +102 -0
- package/gsd-core/bin/lib/gsd2-import.cjs +10 -1
- package/gsd-core/bin/lib/health-diagnostic-rules/agent-install.cjs +101 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/config-validation.cjs +348 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +145 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/install-surface-shadowing.cjs +98 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/milestone-archive-hygiene.cjs +100 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +222 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +265 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/root-existence.cjs +161 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +303 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +173 -0
- package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
- package/gsd-core/bin/lib/health-diagnostic.cjs +431 -0
- package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
- package/gsd-core/bin/lib/init.cjs +321 -129
- package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
- package/gsd-core/bin/lib/install-engine.cjs +745 -258
- package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +203 -0
- package/gsd-core/bin/lib/install-profiles.cjs +134 -57
- package/gsd-core/bin/lib/install-scope.cjs +270 -0
- package/gsd-core/bin/lib/install-shadow-report.cjs +385 -0
- package/gsd-core/bin/lib/installed-surface-resolver.cjs +381 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +138 -31
- package/gsd-core/bin/lib/io.cjs +10 -0
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +2 -1
- package/gsd-core/bin/lib/markdown-table.cjs +133 -20
- package/gsd-core/bin/lib/milestone-lock.cjs +248 -0
- package/gsd-core/bin/lib/milestone.cjs +754 -70
- package/gsd-core/bin/lib/model-catalog.cjs +59 -1
- package/gsd-core/bin/lib/model-resolver.cjs +183 -40
- package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
- package/gsd-core/bin/lib/pattern.cjs +122 -0
- package/gsd-core/bin/lib/phase-estimation.cjs +1 -1
- package/gsd-core/bin/lib/phase-id.cjs +444 -36
- package/gsd-core/bin/lib/phase-lifecycle.cjs +28 -3
- package/gsd-core/bin/lib/phase-locator.cjs +125 -18
- package/gsd-core/bin/lib/phase.cjs +646 -143
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +72 -1
- package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
- package/gsd-core/bin/lib/plan-scan.cjs +86 -2
- package/gsd-core/bin/lib/planning-scope.cjs +31 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +890 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +56 -6
- package/gsd-core/bin/lib/probe-core.cjs +1 -1
- package/gsd-core/bin/lib/profile-output.cjs +1 -1
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +740 -0
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +11 -6
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +13 -4
- package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +421 -66
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
- package/gsd-core/bin/lib/roadmap-command-router.cjs +34 -0
- package/gsd-core/bin/lib/roadmap-parser.cjs +943 -184
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
- package/gsd-core/bin/lib/roadmap.cjs +385 -94
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +608 -46
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +426 -55
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
- package/gsd-core/bin/lib/runtime-homes.cjs +69 -3
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +115 -3
- package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
- package/gsd-core/bin/lib/runtime-slash.cjs +27 -9
- package/gsd-core/bin/lib/security.cjs +104 -5
- package/gsd-core/bin/lib/shell-command-projection.cjs +275 -3
- package/gsd-core/bin/lib/smart-entry.cjs +142 -22
- package/gsd-core/bin/lib/state-command-router.cjs +5 -1
- package/gsd-core/bin/lib/state-document.cjs +152 -8
- package/gsd-core/bin/lib/state-transition.cjs +371 -117
- package/gsd-core/bin/lib/state.cjs +1794 -357
- package/gsd-core/bin/lib/surface.cjs +23 -9
- package/gsd-core/bin/lib/text-lines.cjs +80 -0
- package/gsd-core/bin/lib/token-scanner.cjs +76 -0
- package/gsd-core/bin/lib/uat-predicate.cjs +9 -3
- package/gsd-core/bin/lib/uat.cjs +399 -56
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +14 -5
- package/gsd-core/bin/lib/unusable-input.cjs +24 -0
- package/gsd-core/bin/lib/update-context.cjs +8 -2
- package/gsd-core/bin/lib/user-artifact-staging.cjs +705 -0
- package/gsd-core/bin/lib/validate.cjs +20 -6
- package/gsd-core/bin/lib/vendor/README.md +37 -0
- package/gsd-core/bin/lib/vendor/re2js.cjs +6480 -0
- package/gsd-core/bin/lib/vendor/re2js.d.cts +938 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +258 -8
- package/gsd-core/bin/lib/verify.cjs +368 -888
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +53 -32
- package/gsd-core/bin/lib/workstream-inventory.cjs +63 -10
- package/gsd-core/bin/lib/workstream.cjs +2 -2
- package/gsd-core/bin/lib/worktree-safety.cjs +176 -9
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +7 -1
- package/gsd-core/references/agent-contracts.md +43 -26
- package/gsd-core/references/checkpoints.md +2 -2
- package/gsd-core/references/context-budget.md +1 -1
- package/gsd-core/references/dispatch-isolation-gate.md +138 -0
- package/gsd-core/references/doc-conflict-engine.md +1 -1
- package/gsd-core/references/execute-mvp-tdd.md +3 -3
- package/gsd-core/references/execute-phase-between-wave-reset.md +6 -2
- package/gsd-core/references/execute-phase-context-guard.md +1 -1
- package/gsd-core/references/execute-phase-response-language.md +1 -1
- package/gsd-core/references/execute-phase-wave-guard.md +6 -2
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-planning-commit.md +2 -1
- package/gsd-core/references/loop-hook-dispatch.md +39 -2
- package/gsd-core/references/model-profiles.md +12 -4
- package/gsd-core/references/mvp-concepts.md +9 -9
- package/gsd-core/references/planner-guidance.md +3 -9
- package/gsd-core/references/planner-preconditions.md +1 -1
- package/gsd-core/references/planner-reviews.md +1 -1
- package/gsd-core/references/planning-config.md +8 -6
- package/gsd-core/references/revision-loop.md +1 -1
- package/gsd-core/references/specless-probe-fallback.md +1 -1
- package/gsd-core/references/universal-anti-patterns.md +3 -3
- package/gsd-core/references/verifier-phase-gates.md +192 -0
- package/gsd-core/references/verify-mvp-mode.md +1 -1
- package/gsd-core/references/workstream-flag.md +22 -6
- package/gsd-core/templates/discussion-log.md +1 -1
- package/gsd-core/templates/phase-prompt.md +2 -4
- package/gsd-core/templates/state.md +4 -4
- package/gsd-core/templates/verification-report.md +9 -1
- package/gsd-core/workflows/ai-integration-phase.md +9 -11
- package/gsd-core/workflows/autonomous.md +1 -1
- package/gsd-core/workflows/cleanup.md +62 -3
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +13 -3
- package/gsd-core/workflows/code-review-fix.md +37 -10
- package/gsd-core/workflows/code-review.md +38 -12
- package/gsd-core/workflows/complete-milestone.md +141 -18
- package/gsd-core/workflows/debug.md +7 -5
- package/gsd-core/workflows/diagnose-issues.md +35 -9
- package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -1
- package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions.md +2 -1
- package/gsd-core/workflows/edit-phase.md +26 -1
- package/gsd-core/workflows/eval-review.md +3 -5
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +31 -6
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +77 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +2 -0
- package/gsd-core/workflows/execute-phase.md +38 -50
- package/gsd-core/workflows/execute-plan.md +36 -4
- package/gsd-core/workflows/explore.md +131 -4
- package/gsd-core/workflows/fast.md +10 -2
- package/gsd-core/workflows/health.md +73 -4
- package/gsd-core/workflows/import.md +4 -4
- package/gsd-core/workflows/ingest-docs.md +5 -5
- package/gsd-core/workflows/mvp-phase.md +6 -3
- package/gsd-core/workflows/new-milestone.md +14 -9
- package/gsd-core/workflows/new-project.md +14 -14
- package/gsd-core/workflows/next.md +12 -0
- package/gsd-core/workflows/plan-phase.md +41 -17
- package/gsd-core/workflows/plan-review-convergence.md +50 -2
- package/gsd-core/workflows/progress.md +34 -6
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +4 -4
- package/gsd-core/workflows/quick/steps/quick-verification.md +27 -6
- package/gsd-core/workflows/quick/steps/research-phase.md +2 -2
- package/gsd-core/workflows/quick.md +35 -15
- package/gsd-core/workflows/review.md +26 -5
- package/gsd-core/workflows/secure-phase.md +1 -1
- package/gsd-core/workflows/session-report.md +2 -1
- package/gsd-core/workflows/settings.md +66 -2
- package/gsd-core/workflows/ship.md +104 -44
- package/gsd-core/workflows/spec-phase.md +30 -12
- package/gsd-core/workflows/sync-skills.md +63 -8
- package/gsd-core/workflows/transition.md +46 -11
- package/gsd-core/workflows/ui-phase.md +5 -5
- package/gsd-core/workflows/ui-review.md +2 -2
- package/gsd-core/workflows/update.md +1 -1
- package/gsd-core/workflows/validate-phase.md +1 -1
- package/gsd-core/workflows/verify-work.md +9 -7
- package/hooks/dist/gsd-agent-isolation-guard.js +103 -14
- package/hooks/dist/gsd-check-update-worker.js +56 -13
- package/hooks/dist/gsd-check-update.js +19 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +0 -3
- package/hooks/dist/gsd-cursor-subagent-start.js +77 -2
- package/hooks/dist/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/dist/gsd-prompt-guard.js +21 -20
- package/hooks/dist/gsd-read-injection-scanner.js +38 -24
- package/hooks/dist/gsd-statusline.js +18 -0
- package/hooks/dist/gsd-update-banner.js +22 -1
- package/hooks/dist/gsd-workflow-guard.js +134 -36
- package/hooks/dist/lib/git-cmd.js +92 -59
- package/hooks/dist/lib/injection-patterns.js +45 -0
- package/hooks/dist/lib/isolation-deny-reason.js +39 -0
- package/hooks/dist/lib/isolation-sentinel.js +9 -0
- package/hooks/gsd-agent-isolation-guard.js +103 -14
- package/hooks/gsd-check-update-worker.js +56 -13
- package/hooks/gsd-check-update.js +19 -1
- package/hooks/gsd-cursor-pre-tool.js +0 -3
- package/hooks/gsd-cursor-subagent-start.js +77 -2
- package/hooks/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/gsd-prompt-guard.js +21 -20
- package/hooks/gsd-read-injection-scanner.js +38 -24
- package/hooks/gsd-statusline.js +18 -0
- package/hooks/gsd-update-banner.js +22 -1
- package/hooks/gsd-workflow-guard.js +134 -36
- package/hooks/lib/git-cmd.js +92 -59
- package/hooks/lib/injection-patterns.js +45 -0
- package/hooks/lib/isolation-deny-reason.js +39 -0
- package/hooks/lib/isolation-sentinel.js +9 -0
- package/package.json +21 -9
- package/pi/gsd.cjs +19 -5
- package/scripts/baselines/planning-prompt-drift-baseline.json +4 -0
- package/scripts/baselines/planning-snapshot-bypass-baseline.json +12 -0
- package/scripts/baselines/unreachable-guard-drift-baseline.json +4 -0
- package/scripts/changeset/lint.cjs +60 -5
- package/scripts/check-alias-drift.cjs +7 -43
- package/scripts/check-contract-drift.cjs +297 -0
- package/scripts/ci-test-scope.cjs +19 -2
- package/scripts/command-contract-helpers.cjs +903 -1
- package/scripts/gen-adr-index.cjs +728 -38
- package/scripts/gen-capability-registry.cjs +3 -15
- package/scripts/gen-context-index.cjs +2 -11
- package/scripts/gen-health-docs.cjs +390 -0
- package/scripts/gen-inventory-manifest.cjs +50 -4
- package/scripts/gen-loop-host-contract.cjs +4 -24
- package/scripts/gen-registry.cjs +3 -14
- package/scripts/lib/alias-drift-families.cjs +46 -0
- package/scripts/lib/drift-scan.cjs +278 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +1 -26
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +4 -0
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +3 -0
- package/scripts/lint-canary-version-leak.cjs +73 -0
- package/scripts/lint-command-contract.cjs +96 -13
- package/scripts/lint-completion-predicate-drift.cjs +933 -0
- package/scripts/lint-completion-ratio-drift.cjs +214 -0
- package/scripts/lint-default-flip-documentation.cjs +193 -0
- package/scripts/lint-eslint-glob-coverage.allowlist.json +34 -0
- package/scripts/lint-eslint-glob-coverage.cjs +340 -0
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
- package/scripts/lint-health-diagnostic-rule-table.cjs +404 -0
- package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
- package/scripts/lint-milestone-window-drift.cjs +468 -0
- package/scripts/lint-phase-enumeration-drift.cjs +479 -0
- package/scripts/lint-plan-count-drift.cjs +318 -0
- package/scripts/lint-planning-artifact-writer-drift.cjs +398 -0
- package/scripts/lint-planning-prompt-drift.cjs +434 -0
- package/scripts/lint-planning-snapshot-bypass-drift.cjs +544 -0
- package/scripts/lint-regression-test-names.cjs +15 -13
- package/scripts/lint-removed-but-needed.cjs +320 -0
- package/scripts/lint-state-field-drift.cjs +805 -0
- package/scripts/lint-state-write-path-drift.cjs +1045 -0
- package/scripts/lint-test-file-count.allowlist.json +21 -10
- package/scripts/lint-unreachable-guard-drift.cjs +843 -0
- package/scripts/lint-vendored-deps.cjs +124 -0
- package/scripts/pr-changed-files.cjs +63 -0
- package/scripts/pr-template-policy.cjs +14 -4
- package/scripts/prompt-injection-scan.sh +25 -0
- package/scripts/require-issue-link-policy.cjs +192 -0
- package/scripts/state-write-path-drift-baseline.json +19 -0
- package/scripts/sync-runtime-launcher.cjs +2 -4
- package/skills/gsd-autonomous/SKILL.md +0 -1
- package/skills/gsd-code-review/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -2
- package/skills/gsd-map-codebase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +1 -1
- package/skills/gsd-mempalace-recall/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +1 -1
- package/skills/gsd-next/SKILL.md +0 -1
- package/skills/gsd-plan-phase/SKILL.md +0 -1
- package/skills/gsd-progress/SKILL.md +0 -1
- package/skills/gsd-quick/SKILL.md +1 -1
- package/skills/gsd-review-backlog/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +0 -1
- package/skills/gsd-verify-work/SKILL.md +1 -1
- package/vscode/package.json +1 -1
- package/gsd-core/workflows/discovery-phase.md +0 -298
- package/gsd-core/workflows/plan-milestone-gaps.md +0 -281
- package/gsd-core/workflows/verify-phase.md +0 -574
- package/scripts/affected-tests-lib.cjs +0 -554
- package/scripts/lint-allow-test-rule-refs.cjs +0 -162
- package/scripts/run-affected-tests.cjs +0 -7
- package/scripts/run-tests.cjs +0 -1051
|
@@ -10,7 +10,7 @@ const capabilities = {
|
|
|
10
10
|
"ai-integration": {
|
|
11
11
|
"id": "ai-integration",
|
|
12
12
|
"role": "feature",
|
|
13
|
-
"version": "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.
|
|
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.
|
|
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.
|
|
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.
|
|
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,7 +438,7 @@ const capabilities = {
|
|
|
431
438
|
"broken-windows": {
|
|
432
439
|
"id": "broken-windows",
|
|
433
440
|
"role": "feature",
|
|
434
|
-
"version": "1.
|
|
441
|
+
"version": "1.11.0",
|
|
435
442
|
"title": "Broken-windows ledger",
|
|
436
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",
|
|
@@ -477,7 +484,7 @@ const capabilities = {
|
|
|
477
484
|
"claude": {
|
|
478
485
|
"id": "claude",
|
|
479
486
|
"role": "runtime",
|
|
480
|
-
"version": "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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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": [
|
|
@@ -1037,9 +1092,21 @@ const capabilities = {
|
|
|
1037
1092
|
"nesting": "flat",
|
|
1038
1093
|
"recursive": false,
|
|
1039
1094
|
"converter": "convertClaudeCommandToCodexSkill"
|
|
1095
|
+
},
|
|
1096
|
+
{
|
|
1097
|
+
"kind": "agents",
|
|
1098
|
+
"destSubpath": "agents",
|
|
1099
|
+
"prefix": "gsd-",
|
|
1100
|
+
"nesting": "flat",
|
|
1101
|
+
"recursive": false,
|
|
1102
|
+
"converter": "convertClaudeAgentToCodexAgent"
|
|
1040
1103
|
}
|
|
1041
1104
|
]
|
|
1042
1105
|
},
|
|
1106
|
+
"triggerPrecedence": [
|
|
1107
|
+
"skills",
|
|
1108
|
+
"commands"
|
|
1109
|
+
],
|
|
1043
1110
|
"commandStyle": "shell-var",
|
|
1044
1111
|
"hooksSurface": "codex-hooks-json",
|
|
1045
1112
|
"hookEvents": "claude",
|
|
@@ -1085,8 +1152,7 @@ const capabilities = {
|
|
|
1085
1152
|
"tomlConfigInstall": true,
|
|
1086
1153
|
"cleanupSkillSidecars": true,
|
|
1087
1154
|
"agentTomlFiles": true,
|
|
1088
|
-
"frontmatterDialect": "codex"
|
|
1089
|
-
"reviewerCli": true
|
|
1155
|
+
"frontmatterDialect": "codex"
|
|
1090
1156
|
}
|
|
1091
1157
|
},
|
|
1092
1158
|
"reviewer": {
|
|
@@ -1136,7 +1202,7 @@ const capabilities = {
|
|
|
1136
1202
|
"copilot": {
|
|
1137
1203
|
"id": "copilot",
|
|
1138
1204
|
"role": "runtime",
|
|
1139
|
-
"version": "1.
|
|
1205
|
+
"version": "1.11.0",
|
|
1140
1206
|
"title": "GitHub Copilot",
|
|
1141
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.",
|
|
1142
1208
|
"tier": "core",
|
|
@@ -1193,6 +1259,10 @@ const capabilities = {
|
|
|
1193
1259
|
}
|
|
1194
1260
|
]
|
|
1195
1261
|
},
|
|
1262
|
+
"triggerPrecedence": [
|
|
1263
|
+
"skills",
|
|
1264
|
+
"commands"
|
|
1265
|
+
],
|
|
1196
1266
|
"commandStyle": "slash-hyphen",
|
|
1197
1267
|
"hooksSurface": "copilot-inline",
|
|
1198
1268
|
"sandboxTier": "none",
|
|
@@ -1231,7 +1301,7 @@ const capabilities = {
|
|
|
1231
1301
|
"cursor": {
|
|
1232
1302
|
"id": "cursor",
|
|
1233
1303
|
"role": "runtime",
|
|
1234
|
-
"version": "1.
|
|
1304
|
+
"version": "1.11.0",
|
|
1235
1305
|
"title": "Cursor",
|
|
1236
1306
|
"description": "Cursor IDE — skills-only workflow surface; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
|
|
1237
1307
|
"tier": "core",
|
|
@@ -1287,6 +1357,10 @@ const capabilities = {
|
|
|
1287
1357
|
}
|
|
1288
1358
|
]
|
|
1289
1359
|
},
|
|
1360
|
+
"triggerPrecedence": [
|
|
1361
|
+
"skills",
|
|
1362
|
+
"commands"
|
|
1363
|
+
],
|
|
1290
1364
|
"commandStyle": "slash-hyphen",
|
|
1291
1365
|
"hooksSurface": "cursor-hooks-json",
|
|
1292
1366
|
"hookEvents": "claude",
|
|
@@ -1337,8 +1411,7 @@ const capabilities = {
|
|
|
1337
1411
|
"stop",
|
|
1338
1412
|
"subagentStart",
|
|
1339
1413
|
"subagentStop"
|
|
1340
|
-
]
|
|
1341
|
-
"reviewerCli": true
|
|
1414
|
+
]
|
|
1342
1415
|
}
|
|
1343
1416
|
},
|
|
1344
1417
|
"reviewer": {
|
|
@@ -1380,7 +1453,7 @@ const capabilities = {
|
|
|
1380
1453
|
"drift": {
|
|
1381
1454
|
"id": "drift",
|
|
1382
1455
|
"role": "feature",
|
|
1383
|
-
"version": "1.
|
|
1456
|
+
"version": "1.11.0",
|
|
1384
1457
|
"title": "Drift detection gates",
|
|
1385
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.",
|
|
1386
1459
|
"tier": "full",
|
|
@@ -1458,7 +1531,7 @@ const capabilities = {
|
|
|
1458
1531
|
"external-job": {
|
|
1459
1532
|
"id": "external-job",
|
|
1460
1533
|
"role": "feature",
|
|
1461
|
-
"version": "1.
|
|
1534
|
+
"version": "1.11.0",
|
|
1462
1535
|
"title": "Async external-job scheduler adapter",
|
|
1463
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).",
|
|
1464
1537
|
"tier": "full",
|
|
@@ -1541,7 +1614,7 @@ const capabilities = {
|
|
|
1541
1614
|
"gap-analysis": {
|
|
1542
1615
|
"id": "gap-analysis",
|
|
1543
1616
|
"role": "feature",
|
|
1544
|
-
"version": "1.
|
|
1617
|
+
"version": "1.11.0",
|
|
1545
1618
|
"title": "Post-planning gap analysis",
|
|
1546
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.",
|
|
1547
1620
|
"tier": "standard",
|
|
@@ -1582,7 +1655,7 @@ const capabilities = {
|
|
|
1582
1655
|
"gemini": {
|
|
1583
1656
|
"id": "gemini",
|
|
1584
1657
|
"role": "reviewer",
|
|
1585
|
-
"version": "1.
|
|
1658
|
+
"version": "1.11.0",
|
|
1586
1659
|
"title": "Gemini CLI",
|
|
1587
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.",
|
|
1588
1661
|
"tier": "full",
|
|
@@ -1632,7 +1705,7 @@ const capabilities = {
|
|
|
1632
1705
|
"graphify": {
|
|
1633
1706
|
"id": "graphify",
|
|
1634
1707
|
"role": "feature",
|
|
1635
|
-
"version": "1.
|
|
1708
|
+
"version": "1.11.0",
|
|
1636
1709
|
"title": "Knowledge graph",
|
|
1637
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.",
|
|
1638
1711
|
"tier": "full",
|
|
@@ -1673,7 +1746,7 @@ const capabilities = {
|
|
|
1673
1746
|
"hermes": {
|
|
1674
1747
|
"id": "hermes",
|
|
1675
1748
|
"role": "runtime",
|
|
1676
|
-
"version": "1.
|
|
1749
|
+
"version": "1.11.0",
|
|
1677
1750
|
"title": "Hermes Agent",
|
|
1678
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.",
|
|
1679
1752
|
"tier": "core",
|
|
@@ -1700,6 +1773,14 @@ const capabilities = {
|
|
|
1700
1773
|
"nesting": "nested",
|
|
1701
1774
|
"recursive": false,
|
|
1702
1775
|
"converter": "convertClaudeCommandToClaudeSkill"
|
|
1776
|
+
},
|
|
1777
|
+
{
|
|
1778
|
+
"kind": "agents",
|
|
1779
|
+
"destSubpath": "agents",
|
|
1780
|
+
"prefix": "gsd-",
|
|
1781
|
+
"nesting": "flat",
|
|
1782
|
+
"recursive": false,
|
|
1783
|
+
"converter": "convertClaudeAgentToHermesAgent"
|
|
1703
1784
|
}
|
|
1704
1785
|
],
|
|
1705
1786
|
"local": [
|
|
@@ -1710,9 +1791,21 @@ const capabilities = {
|
|
|
1710
1791
|
"nesting": "nested",
|
|
1711
1792
|
"recursive": false,
|
|
1712
1793
|
"converter": "convertClaudeCommandToClaudeSkill"
|
|
1794
|
+
},
|
|
1795
|
+
{
|
|
1796
|
+
"kind": "agents",
|
|
1797
|
+
"destSubpath": "agents",
|
|
1798
|
+
"prefix": "gsd-",
|
|
1799
|
+
"nesting": "flat",
|
|
1800
|
+
"recursive": false,
|
|
1801
|
+
"converter": "convertClaudeAgentToHermesAgent"
|
|
1713
1802
|
}
|
|
1714
1803
|
]
|
|
1715
1804
|
},
|
|
1805
|
+
"triggerPrecedence": [
|
|
1806
|
+
"skills",
|
|
1807
|
+
"commands"
|
|
1808
|
+
],
|
|
1716
1809
|
"commandStyle": "slash-hyphen",
|
|
1717
1810
|
"hooksSurface": "settings-json",
|
|
1718
1811
|
"hookEvents": "claude",
|
|
@@ -1764,7 +1857,7 @@ const capabilities = {
|
|
|
1764
1857
|
"intel": {
|
|
1765
1858
|
"id": "intel",
|
|
1766
1859
|
"role": "feature",
|
|
1767
|
-
"version": "1.
|
|
1860
|
+
"version": "1.11.0",
|
|
1768
1861
|
"title": "Codebase intelligence",
|
|
1769
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`.",
|
|
1770
1863
|
"tier": "full",
|
|
@@ -1816,7 +1909,7 @@ const capabilities = {
|
|
|
1816
1909
|
"kilo": {
|
|
1817
1910
|
"id": "kilo",
|
|
1818
1911
|
"role": "runtime",
|
|
1819
|
-
"version": "1.
|
|
1912
|
+
"version": "1.11.0",
|
|
1820
1913
|
"title": "Kilo Code",
|
|
1821
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.",
|
|
1822
1915
|
"tier": "core",
|
|
@@ -1858,6 +1951,14 @@ const capabilities = {
|
|
|
1858
1951
|
"nesting": "flat",
|
|
1859
1952
|
"recursive": true,
|
|
1860
1953
|
"converter": "convertClaudeCommandToKiloSkill"
|
|
1954
|
+
},
|
|
1955
|
+
{
|
|
1956
|
+
"kind": "agents",
|
|
1957
|
+
"destSubpath": "agents",
|
|
1958
|
+
"prefix": "gsd-",
|
|
1959
|
+
"nesting": "flat",
|
|
1960
|
+
"recursive": false,
|
|
1961
|
+
"converter": "convertClaudeToKiloFrontmatter"
|
|
1861
1962
|
}
|
|
1862
1963
|
],
|
|
1863
1964
|
"local": [
|
|
@@ -1876,9 +1977,21 @@ const capabilities = {
|
|
|
1876
1977
|
"nesting": "flat",
|
|
1877
1978
|
"recursive": true,
|
|
1878
1979
|
"converter": "convertClaudeCommandToKiloSkill"
|
|
1980
|
+
},
|
|
1981
|
+
{
|
|
1982
|
+
"kind": "agents",
|
|
1983
|
+
"destSubpath": "agents",
|
|
1984
|
+
"prefix": "gsd-",
|
|
1985
|
+
"nesting": "flat",
|
|
1986
|
+
"recursive": false,
|
|
1987
|
+
"converter": "convertClaudeToKiloFrontmatter"
|
|
1879
1988
|
}
|
|
1880
1989
|
]
|
|
1881
1990
|
},
|
|
1991
|
+
"triggerPrecedence": [
|
|
1992
|
+
"skills",
|
|
1993
|
+
"commands"
|
|
1994
|
+
],
|
|
1882
1995
|
"commandStyle": "slash-hyphen",
|
|
1883
1996
|
"hooksSurface": "none",
|
|
1884
1997
|
"extensionEvents": "kilo",
|
|
@@ -1925,7 +2038,7 @@ const capabilities = {
|
|
|
1925
2038
|
"kimi": {
|
|
1926
2039
|
"id": "kimi",
|
|
1927
2040
|
"role": "runtime",
|
|
1928
|
-
"version": "1.
|
|
2041
|
+
"version": "1.11.0",
|
|
1929
2042
|
"title": "Kimi CLI",
|
|
1930
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.",
|
|
1931
2044
|
"tier": "core",
|
|
@@ -1969,6 +2082,10 @@ const capabilities = {
|
|
|
1969
2082
|
],
|
|
1970
2083
|
"local": []
|
|
1971
2084
|
},
|
|
2085
|
+
"triggerPrecedence": [
|
|
2086
|
+
"skills",
|
|
2087
|
+
"commands"
|
|
2088
|
+
],
|
|
1972
2089
|
"commandStyle": "slash-hyphen",
|
|
1973
2090
|
"hooksSurface": "kimi-hooks-toml",
|
|
1974
2091
|
"hookEvents": "claude",
|
|
@@ -2023,7 +2140,7 @@ const capabilities = {
|
|
|
2023
2140
|
"kimi-code": {
|
|
2024
2141
|
"id": "kimi-code",
|
|
2025
2142
|
"role": "runtime",
|
|
2026
|
-
"version": "1.
|
|
2143
|
+
"version": "1.11.0",
|
|
2027
2144
|
"title": "Kimi Code CLI",
|
|
2028
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.",
|
|
2029
2146
|
"tier": "core",
|
|
@@ -2054,10 +2171,31 @@ const capabilities = {
|
|
|
2054
2171
|
"nesting": "flat",
|
|
2055
2172
|
"recursive": false,
|
|
2056
2173
|
"converter": "convertClaudeCommandToKimiCodeSkill"
|
|
2174
|
+
},
|
|
2175
|
+
{
|
|
2176
|
+
"kind": "agents",
|
|
2177
|
+
"destSubpath": "agents",
|
|
2178
|
+
"prefix": "gsd-",
|
|
2179
|
+
"nesting": "flat",
|
|
2180
|
+
"recursive": false,
|
|
2181
|
+
"converter": null
|
|
2057
2182
|
}
|
|
2058
2183
|
],
|
|
2059
|
-
"local": [
|
|
2184
|
+
"local": [
|
|
2185
|
+
{
|
|
2186
|
+
"kind": "agents",
|
|
2187
|
+
"destSubpath": "agents",
|
|
2188
|
+
"prefix": "gsd-",
|
|
2189
|
+
"nesting": "flat",
|
|
2190
|
+
"recursive": false,
|
|
2191
|
+
"converter": null
|
|
2192
|
+
}
|
|
2193
|
+
]
|
|
2060
2194
|
},
|
|
2195
|
+
"triggerPrecedence": [
|
|
2196
|
+
"skills",
|
|
2197
|
+
"commands"
|
|
2198
|
+
],
|
|
2061
2199
|
"commandStyle": "slash-hyphen",
|
|
2062
2200
|
"hooksSurface": "kimi-hooks-toml",
|
|
2063
2201
|
"hookEvents": "claude",
|
|
@@ -2155,7 +2293,7 @@ const capabilities = {
|
|
|
2155
2293
|
"llama-cpp": {
|
|
2156
2294
|
"id": "llama-cpp",
|
|
2157
2295
|
"role": "reviewer",
|
|
2158
|
-
"version": "1.
|
|
2296
|
+
"version": "1.11.0",
|
|
2159
2297
|
"title": "llama.cpp",
|
|
2160
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).",
|
|
2161
2299
|
"tier": "full",
|
|
@@ -2213,7 +2351,7 @@ const capabilities = {
|
|
|
2213
2351
|
"lm-studio": {
|
|
2214
2352
|
"id": "lm-studio",
|
|
2215
2353
|
"role": "reviewer",
|
|
2216
|
-
"version": "1.
|
|
2354
|
+
"version": "1.11.0",
|
|
2217
2355
|
"title": "LM Studio",
|
|
2218
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).",
|
|
2219
2357
|
"tier": "full",
|
|
@@ -2271,7 +2409,7 @@ const capabilities = {
|
|
|
2271
2409
|
"mempalace": {
|
|
2272
2410
|
"id": "mempalace",
|
|
2273
2411
|
"role": "feature",
|
|
2274
|
-
"version": "1.
|
|
2412
|
+
"version": "1.11.0",
|
|
2275
2413
|
"title": "MemPalace memory",
|
|
2276
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.",
|
|
2277
2415
|
"tier": "full",
|
|
@@ -2445,7 +2583,7 @@ const capabilities = {
|
|
|
2445
2583
|
"nyquist": {
|
|
2446
2584
|
"id": "nyquist",
|
|
2447
2585
|
"role": "feature",
|
|
2448
|
-
"version": "1.
|
|
2586
|
+
"version": "1.11.0",
|
|
2449
2587
|
"title": "Nyquist validation",
|
|
2450
2588
|
"description": "Validation coverage audit that maps executed work back to tests and manual-only evidence.",
|
|
2451
2589
|
"tier": "full",
|
|
@@ -2495,7 +2633,7 @@ const capabilities = {
|
|
|
2495
2633
|
"ollama": {
|
|
2496
2634
|
"id": "ollama",
|
|
2497
2635
|
"role": "reviewer",
|
|
2498
|
-
"version": "1.
|
|
2636
|
+
"version": "1.11.0",
|
|
2499
2637
|
"title": "Ollama",
|
|
2500
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.",
|
|
2501
2639
|
"tier": "full",
|
|
@@ -2553,7 +2691,7 @@ const capabilities = {
|
|
|
2553
2691
|
"opencode": {
|
|
2554
2692
|
"id": "opencode",
|
|
2555
2693
|
"role": "runtime",
|
|
2556
|
-
"version": "1.
|
|
2694
|
+
"version": "1.11.0",
|
|
2557
2695
|
"title": "OpenCode",
|
|
2558
2696
|
"description": "OpenCode — XDG-based config dir; flat commands/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
|
|
2559
2697
|
"tier": "core",
|
|
@@ -2590,6 +2728,14 @@ const capabilities = {
|
|
|
2590
2728
|
"nesting": "flat",
|
|
2591
2729
|
"recursive": true,
|
|
2592
2730
|
"converter": "convertClaudeCommandToOpencodeSkill"
|
|
2731
|
+
},
|
|
2732
|
+
{
|
|
2733
|
+
"kind": "agents",
|
|
2734
|
+
"destSubpath": "agents",
|
|
2735
|
+
"prefix": "gsd-",
|
|
2736
|
+
"nesting": "flat",
|
|
2737
|
+
"recursive": false,
|
|
2738
|
+
"converter": "convertClaudeToOpencodeFrontmatter"
|
|
2593
2739
|
}
|
|
2594
2740
|
],
|
|
2595
2741
|
"local": [
|
|
@@ -2608,9 +2754,21 @@ const capabilities = {
|
|
|
2608
2754
|
"nesting": "flat",
|
|
2609
2755
|
"recursive": true,
|
|
2610
2756
|
"converter": "convertClaudeCommandToOpencodeSkill"
|
|
2757
|
+
},
|
|
2758
|
+
{
|
|
2759
|
+
"kind": "agents",
|
|
2760
|
+
"destSubpath": "agents",
|
|
2761
|
+
"prefix": "gsd-",
|
|
2762
|
+
"nesting": "flat",
|
|
2763
|
+
"recursive": false,
|
|
2764
|
+
"converter": "convertClaudeToOpencodeFrontmatter"
|
|
2611
2765
|
}
|
|
2612
2766
|
]
|
|
2613
2767
|
},
|
|
2768
|
+
"triggerPrecedence": [
|
|
2769
|
+
"skills",
|
|
2770
|
+
"commands"
|
|
2771
|
+
],
|
|
2614
2772
|
"commandStyle": "slash-hyphen",
|
|
2615
2773
|
"hooksSurface": "none",
|
|
2616
2774
|
"extensionEvents": "opencode",
|
|
@@ -2661,8 +2819,7 @@ const capabilities = {
|
|
|
2661
2819
|
"skipHomePrefixSubstitution": true,
|
|
2662
2820
|
"skipSettingsUi": true,
|
|
2663
2821
|
"skipUpdateBannerCommand": true,
|
|
2664
|
-
"skipCodexSkillsManifest": true
|
|
2665
|
-
"reviewerCli": true
|
|
2822
|
+
"skipCodexSkillsManifest": true
|
|
2666
2823
|
}
|
|
2667
2824
|
},
|
|
2668
2825
|
"reviewer": {
|
|
@@ -2710,7 +2867,7 @@ const capabilities = {
|
|
|
2710
2867
|
"pattern-mapper": {
|
|
2711
2868
|
"id": "pattern-mapper",
|
|
2712
2869
|
"role": "feature",
|
|
2713
|
-
"version": "1.
|
|
2870
|
+
"version": "1.11.0",
|
|
2714
2871
|
"title": "Pattern mapping",
|
|
2715
2872
|
"description": "Optional codebase-pattern mapping before planning; owns the pattern mapper agent and workflow.pattern_mapper activation key.",
|
|
2716
2873
|
"tier": "full",
|
|
@@ -2746,7 +2903,7 @@ const capabilities = {
|
|
|
2746
2903
|
},
|
|
2747
2904
|
"fragment": {
|
|
2748
2905
|
"path": "fragments/plan-pre.md",
|
|
2749
|
-
"inline": "<pattern_mapping_context>\n**Phase:** {phase_number} - {phase_name}\n**Phase directory:** {phase_dir}\n**Padded phase:** {padded_phase}\n\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"
|
|
2750
2907
|
},
|
|
2751
2908
|
"produces": [
|
|
2752
2909
|
"PATTERNS.md"
|
|
@@ -2764,7 +2921,7 @@ const capabilities = {
|
|
|
2764
2921
|
"pi": {
|
|
2765
2922
|
"id": "pi",
|
|
2766
2923
|
"role": "runtime",
|
|
2767
|
-
"version": "1.
|
|
2924
|
+
"version": "1.11.0",
|
|
2768
2925
|
"title": "pi",
|
|
2769
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.",
|
|
2770
2927
|
"tier": "core",
|
|
@@ -2787,6 +2944,10 @@ const capabilities = {
|
|
|
2787
2944
|
"global": [],
|
|
2788
2945
|
"local": []
|
|
2789
2946
|
},
|
|
2947
|
+
"triggerPrecedence": [
|
|
2948
|
+
"skills",
|
|
2949
|
+
"commands"
|
|
2950
|
+
],
|
|
2790
2951
|
"commandStyle": "slash-hyphen",
|
|
2791
2952
|
"hooksSurface": "none",
|
|
2792
2953
|
"extensionEvents": "pi",
|
|
@@ -2829,7 +2990,7 @@ const capabilities = {
|
|
|
2829
2990
|
"profile-pipeline": {
|
|
2830
2991
|
"id": "profile-pipeline",
|
|
2831
2992
|
"role": "feature",
|
|
2832
|
-
"version": "1.
|
|
2993
|
+
"version": "1.11.0",
|
|
2833
2994
|
"title": "Developer profiling pipeline",
|
|
2834
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.",
|
|
2835
2996
|
"tier": "full",
|
|
@@ -2906,7 +3067,7 @@ const capabilities = {
|
|
|
2906
3067
|
"qwen": {
|
|
2907
3068
|
"id": "qwen",
|
|
2908
3069
|
"role": "runtime",
|
|
2909
|
-
"version": "1.
|
|
3070
|
+
"version": "1.11.0",
|
|
2910
3071
|
"title": "Qwen Code",
|
|
2911
3072
|
"description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
2912
3073
|
"tier": "core",
|
|
@@ -2962,6 +3123,10 @@ const capabilities = {
|
|
|
2962
3123
|
}
|
|
2963
3124
|
]
|
|
2964
3125
|
},
|
|
3126
|
+
"triggerPrecedence": [
|
|
3127
|
+
"skills",
|
|
3128
|
+
"commands"
|
|
3129
|
+
],
|
|
2965
3130
|
"commandStyle": "slash-hyphen",
|
|
2966
3131
|
"hooksSurface": "settings-json",
|
|
2967
3132
|
"hookEvents": "claude",
|
|
@@ -3005,8 +3170,7 @@ const capabilities = {
|
|
|
3005
3170
|
"legacyCommandsGsdCleanup": true,
|
|
3006
3171
|
"legacyCommandsGsdInstallMigration": true,
|
|
3007
3172
|
"legacyCommandsGsdUninstall": true,
|
|
3008
|
-
"hyphenNameAgentBody": true
|
|
3009
|
-
"reviewerCli": true
|
|
3173
|
+
"hyphenNameAgentBody": true
|
|
3010
3174
|
}
|
|
3011
3175
|
},
|
|
3012
3176
|
"reviewer": {
|
|
@@ -3039,10 +3203,77 @@ const capabilities = {
|
|
|
3039
3203
|
"handler": null
|
|
3040
3204
|
}
|
|
3041
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
|
+
},
|
|
3042
3273
|
"research": {
|
|
3043
3274
|
"id": "research",
|
|
3044
3275
|
"role": "feature",
|
|
3045
|
-
"version": "1.
|
|
3276
|
+
"version": "1.11.0",
|
|
3046
3277
|
"title": "Phase research",
|
|
3047
3278
|
"description": "Optional phase research before planning; owns the phase researcher agent and workflow.research activation key.",
|
|
3048
3279
|
"tier": "standard",
|
|
@@ -3076,7 +3307,7 @@ const capabilities = {
|
|
|
3076
3307
|
},
|
|
3077
3308
|
"fragment": {
|
|
3078
3309
|
"path": "fragments/plan-pre.md",
|
|
3079
|
-
"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<
|
|
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"
|
|
3080
3311
|
},
|
|
3081
3312
|
"produces": [
|
|
3082
3313
|
"RESEARCH.md"
|
|
@@ -3094,7 +3325,7 @@ const capabilities = {
|
|
|
3094
3325
|
"schema-gate": {
|
|
3095
3326
|
"id": "schema-gate",
|
|
3096
3327
|
"role": "feature",
|
|
3097
|
-
"version": "1.
|
|
3328
|
+
"version": "1.11.0",
|
|
3098
3329
|
"title": "Schema push detection gate",
|
|
3099
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.",
|
|
3100
3331
|
"tier": "full",
|
|
@@ -3140,7 +3371,7 @@ const capabilities = {
|
|
|
3140
3371
|
"security": {
|
|
3141
3372
|
"id": "security",
|
|
3142
3373
|
"role": "feature",
|
|
3143
|
-
"version": "1.
|
|
3374
|
+
"version": "1.11.0",
|
|
3144
3375
|
"title": "Security enforcement",
|
|
3145
3376
|
"description": "Threat mitigation verification and ship-time security blocking for phases with security enforcement enabled.",
|
|
3146
3377
|
"tier": "full",
|
|
@@ -3239,7 +3470,7 @@ const capabilities = {
|
|
|
3239
3470
|
"tdd": {
|
|
3240
3471
|
"id": "tdd",
|
|
3241
3472
|
"role": "feature",
|
|
3242
|
-
"version": "1.
|
|
3473
|
+
"version": "1.11.0",
|
|
3243
3474
|
"title": "Test-driven development",
|
|
3244
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.",
|
|
3245
3476
|
"tier": "full",
|
|
@@ -3292,7 +3523,7 @@ const capabilities = {
|
|
|
3292
3523
|
"trae": {
|
|
3293
3524
|
"id": "trae",
|
|
3294
3525
|
"role": "runtime",
|
|
3295
|
-
"version": "1.
|
|
3526
|
+
"version": "1.11.0",
|
|
3296
3527
|
"title": "Trae IDE",
|
|
3297
3528
|
"description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
|
|
3298
3529
|
"tier": "core",
|
|
@@ -3348,6 +3579,10 @@ const capabilities = {
|
|
|
3348
3579
|
}
|
|
3349
3580
|
]
|
|
3350
3581
|
},
|
|
3582
|
+
"triggerPrecedence": [
|
|
3583
|
+
"skills",
|
|
3584
|
+
"commands"
|
|
3585
|
+
],
|
|
3351
3586
|
"commandStyle": "slash-hyphen",
|
|
3352
3587
|
"hooksSurface": "none",
|
|
3353
3588
|
"sandboxTier": "none",
|
|
@@ -3385,7 +3620,7 @@ const capabilities = {
|
|
|
3385
3620
|
"ui": {
|
|
3386
3621
|
"id": "ui",
|
|
3387
3622
|
"role": "feature",
|
|
3388
|
-
"version": "1.
|
|
3623
|
+
"version": "1.11.0",
|
|
3389
3624
|
"title": "UI design contracts",
|
|
3390
3625
|
"description": "UI-SPEC design contract + retrospective UI audit for frontend phases.",
|
|
3391
3626
|
"tier": "full",
|
|
@@ -3480,7 +3715,7 @@ const capabilities = {
|
|
|
3480
3715
|
"vscode": {
|
|
3481
3716
|
"id": "vscode",
|
|
3482
3717
|
"role": "runtime",
|
|
3483
|
-
"version": "1.
|
|
3718
|
+
"version": "1.11.0",
|
|
3484
3719
|
"title": "VS Code",
|
|
3485
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).",
|
|
3486
3721
|
"tier": "core",
|
|
@@ -3500,6 +3735,10 @@ const capabilities = {
|
|
|
3500
3735
|
"global": [],
|
|
3501
3736
|
"local": []
|
|
3502
3737
|
},
|
|
3738
|
+
"triggerPrecedence": [
|
|
3739
|
+
"skills",
|
|
3740
|
+
"commands"
|
|
3741
|
+
],
|
|
3503
3742
|
"commandStyle": "slash-hyphen",
|
|
3504
3743
|
"hooksSurface": "none",
|
|
3505
3744
|
"extensionEvents": "none",
|
|
@@ -3533,7 +3772,7 @@ const capabilities = {
|
|
|
3533
3772
|
"windsurf": {
|
|
3534
3773
|
"id": "windsurf",
|
|
3535
3774
|
"role": "runtime",
|
|
3536
|
-
"version": "1.
|
|
3775
|
+
"version": "1.11.0",
|
|
3537
3776
|
"title": "Windsurf",
|
|
3538
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.",
|
|
3539
3778
|
"tier": "core",
|
|
@@ -3582,6 +3821,10 @@ const capabilities = {
|
|
|
3582
3821
|
}
|
|
3583
3822
|
]
|
|
3584
3823
|
},
|
|
3824
|
+
"triggerPrecedence": [
|
|
3825
|
+
"skills",
|
|
3826
|
+
"commands"
|
|
3827
|
+
],
|
|
3585
3828
|
"commandStyle": "slash-hyphen",
|
|
3586
3829
|
"hooksSurface": "windsurf-hooks-json",
|
|
3587
3830
|
"sandboxTier": "none",
|
|
@@ -3620,7 +3863,7 @@ const capabilities = {
|
|
|
3620
3863
|
"zcode": {
|
|
3621
3864
|
"id": "zcode",
|
|
3622
3865
|
"role": "runtime",
|
|
3623
|
-
"version": "1.
|
|
3866
|
+
"version": "1.11.0",
|
|
3624
3867
|
"title": "ZCode",
|
|
3625
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.",
|
|
3626
3869
|
"tier": "core",
|
|
@@ -3662,7 +3905,7 @@ const capabilities = {
|
|
|
3662
3905
|
"prefix": "gsd-",
|
|
3663
3906
|
"nesting": "flat",
|
|
3664
3907
|
"recursive": false,
|
|
3665
|
-
"converter":
|
|
3908
|
+
"converter": "convertClaudeAgentToZcodeAgent"
|
|
3666
3909
|
}
|
|
3667
3910
|
],
|
|
3668
3911
|
"local": [
|
|
@@ -3688,10 +3931,14 @@ const capabilities = {
|
|
|
3688
3931
|
"prefix": "gsd-",
|
|
3689
3932
|
"nesting": "flat",
|
|
3690
3933
|
"recursive": false,
|
|
3691
|
-
"converter":
|
|
3934
|
+
"converter": "convertClaudeAgentToZcodeAgent"
|
|
3692
3935
|
}
|
|
3693
3936
|
]
|
|
3694
3937
|
},
|
|
3938
|
+
"triggerPrecedence": [
|
|
3939
|
+
"skills",
|
|
3940
|
+
"commands"
|
|
3941
|
+
],
|
|
3695
3942
|
"commandStyle": "slash-hyphen",
|
|
3696
3943
|
"hooksSurface": "none",
|
|
3697
3944
|
"sandboxTier": "none",
|
|
@@ -3848,7 +4095,7 @@ const byLoopPoint = {
|
|
|
3848
4095
|
},
|
|
3849
4096
|
"fragment": {
|
|
3850
4097
|
"path": "fragments/plan-pre.md",
|
|
3851
|
-
"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<
|
|
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"
|
|
3852
4099
|
},
|
|
3853
4100
|
"produces": [
|
|
3854
4101
|
"RESEARCH.md"
|
|
@@ -3882,7 +4129,7 @@ const byLoopPoint = {
|
|
|
3882
4129
|
},
|
|
3883
4130
|
"fragment": {
|
|
3884
4131
|
"path": "fragments/plan-pre.md",
|
|
3885
|
-
"inline": "<pattern_mapping_context>\n**Phase:** {phase_number} - {phase_name}\n**Phase directory:** {phase_dir}\n**Padded phase:** {padded_phase}\n\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"
|
|
3886
4133
|
},
|
|
3887
4134
|
"produces": [
|
|
3888
4135
|
"PATTERNS.md"
|
|
@@ -4068,7 +4315,7 @@ const byLoopPoint = {
|
|
|
4068
4315
|
"into": "executor",
|
|
4069
4316
|
"fragment": {
|
|
4070
4317
|
"path": "fragments/execute-wave-pre.md",
|
|
4071
|
-
"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"
|
|
4072
4319
|
},
|
|
4073
4320
|
"produces": [],
|
|
4074
4321
|
"consumes": [
|
|
@@ -4163,6 +4410,19 @@ const byLoopPoint = {
|
|
|
4163
4410
|
],
|
|
4164
4411
|
"when": "workflow.code_review",
|
|
4165
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"
|
|
4166
4426
|
}
|
|
4167
4427
|
],
|
|
4168
4428
|
"contributions": [],
|
|
@@ -4366,6 +4626,10 @@ const configKeys = {
|
|
|
4366
4626
|
"review.models.opencode": "opencode",
|
|
4367
4627
|
"workflow.pattern_mapper": "pattern-mapper",
|
|
4368
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",
|
|
4369
4633
|
"workflow.research": "research",
|
|
4370
4634
|
"workflow.schema_push_detection": "schema-gate",
|
|
4371
4635
|
"workflow.security_enforcement": "security",
|
|
@@ -4694,6 +4958,30 @@ const configSchema = {
|
|
|
4694
4958
|
"default": false,
|
|
4695
4959
|
"description": "Enable the developer profiling pipeline commands (scan-sessions, extract-messages, profile-sample, write-profile, etc.)."
|
|
4696
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
|
+
},
|
|
4697
4985
|
"workflow.research": {
|
|
4698
4986
|
"owner": "research",
|
|
4699
4987
|
"type": "boolean",
|
|
@@ -4761,7 +5049,7 @@ const runtimes = {
|
|
|
4761
5049
|
"antigravity": {
|
|
4762
5050
|
"id": "antigravity",
|
|
4763
5051
|
"role": "runtime",
|
|
4764
|
-
"version": "1.
|
|
5052
|
+
"version": "1.11.0",
|
|
4765
5053
|
"title": "Antigravity",
|
|
4766
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.",
|
|
4767
5055
|
"tier": "core",
|
|
@@ -4824,6 +5112,10 @@ const runtimes = {
|
|
|
4824
5112
|
}
|
|
4825
5113
|
]
|
|
4826
5114
|
},
|
|
5115
|
+
"triggerPrecedence": [
|
|
5116
|
+
"skills",
|
|
5117
|
+
"commands"
|
|
5118
|
+
],
|
|
4827
5119
|
"commandStyle": "slash-hyphen",
|
|
4828
5120
|
"hooksSurface": "settings-json",
|
|
4829
5121
|
"hookEvents": "gemini",
|
|
@@ -4853,7 +5145,6 @@ const runtimes = {
|
|
|
4853
5145
|
"effortSurface": "undocumented"
|
|
4854
5146
|
},
|
|
4855
5147
|
"hostBehaviors": {
|
|
4856
|
-
"reviewerCli": true,
|
|
4857
5148
|
"projectInstructionFile": "GEMINI.md",
|
|
4858
5149
|
"noPathRewrite": true,
|
|
4859
5150
|
"hookPathStyle": "raw",
|
|
@@ -4905,7 +5196,7 @@ const runtimes = {
|
|
|
4905
5196
|
"augment": {
|
|
4906
5197
|
"id": "augment",
|
|
4907
5198
|
"role": "runtime",
|
|
4908
|
-
"version": "1.
|
|
5199
|
+
"version": "1.11.0",
|
|
4909
5200
|
"title": "Augment Code",
|
|
4910
5201
|
"description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
4911
5202
|
"tier": "core",
|
|
@@ -4977,6 +5268,10 @@ const runtimes = {
|
|
|
4977
5268
|
}
|
|
4978
5269
|
]
|
|
4979
5270
|
},
|
|
5271
|
+
"triggerPrecedence": [
|
|
5272
|
+
"skills",
|
|
5273
|
+
"commands"
|
|
5274
|
+
],
|
|
4980
5275
|
"commandStyle": "slash-hyphen",
|
|
4981
5276
|
"hooksSurface": "settings-json",
|
|
4982
5277
|
"hookEvents": "claude",
|
|
@@ -5014,7 +5309,7 @@ const runtimes = {
|
|
|
5014
5309
|
"claude": {
|
|
5015
5310
|
"id": "claude",
|
|
5016
5311
|
"role": "runtime",
|
|
5017
|
-
"version": "1.
|
|
5312
|
+
"version": "1.11.0",
|
|
5018
5313
|
"title": "Claude Code",
|
|
5019
5314
|
"description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
|
|
5020
5315
|
"tier": "core",
|
|
@@ -5041,6 +5336,14 @@ const runtimes = {
|
|
|
5041
5336
|
"nesting": "flat",
|
|
5042
5337
|
"recursive": false,
|
|
5043
5338
|
"converter": "convertClaudeCommandToClaudeSkill"
|
|
5339
|
+
},
|
|
5340
|
+
{
|
|
5341
|
+
"kind": "agents",
|
|
5342
|
+
"destSubpath": "agents",
|
|
5343
|
+
"prefix": "gsd-",
|
|
5344
|
+
"nesting": "flat",
|
|
5345
|
+
"recursive": false,
|
|
5346
|
+
"converter": null
|
|
5044
5347
|
}
|
|
5045
5348
|
],
|
|
5046
5349
|
"local": [
|
|
@@ -5062,6 +5365,10 @@ const runtimes = {
|
|
|
5062
5365
|
}
|
|
5063
5366
|
]
|
|
5064
5367
|
},
|
|
5368
|
+
"triggerPrecedence": [
|
|
5369
|
+
"skills",
|
|
5370
|
+
"commands"
|
|
5371
|
+
],
|
|
5065
5372
|
"commandStyle": "slash-hyphen",
|
|
5066
5373
|
"hooksSurface": "settings-json",
|
|
5067
5374
|
"hookEvents": "claude",
|
|
@@ -5114,8 +5421,7 @@ const runtimes = {
|
|
|
5114
5421
|
"skillsGlobalOnboarding": true,
|
|
5115
5422
|
"legacyCommandsGsdInstallMigration": true,
|
|
5116
5423
|
"legacyCommandsGsdUninstall": "global",
|
|
5117
|
-
"hyphenNameAgentBody": true
|
|
5118
|
-
"reviewerCli": true
|
|
5424
|
+
"hyphenNameAgentBody": true
|
|
5119
5425
|
}
|
|
5120
5426
|
},
|
|
5121
5427
|
"reviewer": {
|
|
@@ -5139,7 +5445,11 @@ const runtimes = {
|
|
|
5139
5445
|
"promptChannel": "stdin",
|
|
5140
5446
|
"outputChannel": "stdout",
|
|
5141
5447
|
"modelArg": "--model",
|
|
5142
|
-
"effortChannel": "argv"
|
|
5448
|
+
"effortChannel": "argv",
|
|
5449
|
+
"env": {
|
|
5450
|
+
"CLAUDE_CODE_DISABLE_CLAUDE_MDS": "1",
|
|
5451
|
+
"CLAUDE_CODE_DISABLE_AUTO_MEMORY": "1"
|
|
5452
|
+
}
|
|
5143
5453
|
},
|
|
5144
5454
|
"timeoutFloorMs": 1200000,
|
|
5145
5455
|
"emptyOutput": "stub-with-stderr",
|
|
@@ -5161,7 +5471,7 @@ const runtimes = {
|
|
|
5161
5471
|
"cline": {
|
|
5162
5472
|
"id": "cline",
|
|
5163
5473
|
"role": "runtime",
|
|
5164
|
-
"version": "1.
|
|
5474
|
+
"version": "1.11.0",
|
|
5165
5475
|
"title": "Cline",
|
|
5166
5476
|
"description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
|
|
5167
5477
|
"tier": "core",
|
|
@@ -5188,10 +5498,31 @@ const runtimes = {
|
|
|
5188
5498
|
"nesting": "nested",
|
|
5189
5499
|
"recursive": false,
|
|
5190
5500
|
"converter": "convertClaudeCommandToClineSkill"
|
|
5501
|
+
},
|
|
5502
|
+
{
|
|
5503
|
+
"kind": "agents",
|
|
5504
|
+
"destSubpath": "agents",
|
|
5505
|
+
"prefix": "gsd-",
|
|
5506
|
+
"nesting": "flat",
|
|
5507
|
+
"recursive": false,
|
|
5508
|
+
"converter": "convertClaudeAgentToClineAgent"
|
|
5191
5509
|
}
|
|
5192
5510
|
],
|
|
5193
|
-
"local": [
|
|
5511
|
+
"local": [
|
|
5512
|
+
{
|
|
5513
|
+
"kind": "agents",
|
|
5514
|
+
"destSubpath": "agents",
|
|
5515
|
+
"prefix": "gsd-",
|
|
5516
|
+
"nesting": "flat",
|
|
5517
|
+
"recursive": false,
|
|
5518
|
+
"converter": "convertClaudeAgentToClineAgent"
|
|
5519
|
+
}
|
|
5520
|
+
]
|
|
5194
5521
|
},
|
|
5522
|
+
"triggerPrecedence": [
|
|
5523
|
+
"skills",
|
|
5524
|
+
"commands"
|
|
5525
|
+
],
|
|
5195
5526
|
"commandStyle": "slash-hyphen",
|
|
5196
5527
|
"hooksSurface": "cline-rules",
|
|
5197
5528
|
"sandboxTier": "none",
|
|
@@ -5232,7 +5563,7 @@ const runtimes = {
|
|
|
5232
5563
|
"codebuddy": {
|
|
5233
5564
|
"id": "codebuddy",
|
|
5234
5565
|
"role": "runtime",
|
|
5235
|
-
"version": "1.
|
|
5566
|
+
"version": "1.11.0",
|
|
5236
5567
|
"title": "CodeBuddy",
|
|
5237
5568
|
"description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
5238
5569
|
"tier": "core",
|
|
@@ -5304,6 +5635,10 @@ const runtimes = {
|
|
|
5304
5635
|
}
|
|
5305
5636
|
]
|
|
5306
5637
|
},
|
|
5638
|
+
"triggerPrecedence": [
|
|
5639
|
+
"skills",
|
|
5640
|
+
"commands"
|
|
5641
|
+
],
|
|
5307
5642
|
"commandStyle": "slash-hyphen",
|
|
5308
5643
|
"hooksSurface": "settings-json",
|
|
5309
5644
|
"hookEvents": "claude",
|
|
@@ -5345,7 +5680,7 @@ const runtimes = {
|
|
|
5345
5680
|
"codex": {
|
|
5346
5681
|
"id": "codex",
|
|
5347
5682
|
"role": "runtime",
|
|
5348
|
-
"version": "1.
|
|
5683
|
+
"version": "1.11.0",
|
|
5349
5684
|
"title": "OpenAI Codex CLI",
|
|
5350
5685
|
"description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
|
|
5351
5686
|
"tier": "core",
|
|
@@ -5373,6 +5708,14 @@ const runtimes = {
|
|
|
5373
5708
|
"recursive": false,
|
|
5374
5709
|
"converter": "convertClaudeCommandToCodexSkill",
|
|
5375
5710
|
"home": ".agents"
|
|
5711
|
+
},
|
|
5712
|
+
{
|
|
5713
|
+
"kind": "agents",
|
|
5714
|
+
"destSubpath": "agents",
|
|
5715
|
+
"prefix": "gsd-",
|
|
5716
|
+
"nesting": "flat",
|
|
5717
|
+
"recursive": false,
|
|
5718
|
+
"converter": "convertClaudeAgentToCodexAgent"
|
|
5376
5719
|
}
|
|
5377
5720
|
],
|
|
5378
5721
|
"local": [
|
|
@@ -5383,9 +5726,21 @@ const runtimes = {
|
|
|
5383
5726
|
"nesting": "flat",
|
|
5384
5727
|
"recursive": false,
|
|
5385
5728
|
"converter": "convertClaudeCommandToCodexSkill"
|
|
5729
|
+
},
|
|
5730
|
+
{
|
|
5731
|
+
"kind": "agents",
|
|
5732
|
+
"destSubpath": "agents",
|
|
5733
|
+
"prefix": "gsd-",
|
|
5734
|
+
"nesting": "flat",
|
|
5735
|
+
"recursive": false,
|
|
5736
|
+
"converter": "convertClaudeAgentToCodexAgent"
|
|
5386
5737
|
}
|
|
5387
5738
|
]
|
|
5388
5739
|
},
|
|
5740
|
+
"triggerPrecedence": [
|
|
5741
|
+
"skills",
|
|
5742
|
+
"commands"
|
|
5743
|
+
],
|
|
5389
5744
|
"commandStyle": "shell-var",
|
|
5390
5745
|
"hooksSurface": "codex-hooks-json",
|
|
5391
5746
|
"hookEvents": "claude",
|
|
@@ -5431,8 +5786,7 @@ const runtimes = {
|
|
|
5431
5786
|
"tomlConfigInstall": true,
|
|
5432
5787
|
"cleanupSkillSidecars": true,
|
|
5433
5788
|
"agentTomlFiles": true,
|
|
5434
|
-
"frontmatterDialect": "codex"
|
|
5435
|
-
"reviewerCli": true
|
|
5789
|
+
"frontmatterDialect": "codex"
|
|
5436
5790
|
}
|
|
5437
5791
|
},
|
|
5438
5792
|
"reviewer": {
|
|
@@ -5482,7 +5836,7 @@ const runtimes = {
|
|
|
5482
5836
|
"copilot": {
|
|
5483
5837
|
"id": "copilot",
|
|
5484
5838
|
"role": "runtime",
|
|
5485
|
-
"version": "1.
|
|
5839
|
+
"version": "1.11.0",
|
|
5486
5840
|
"title": "GitHub Copilot",
|
|
5487
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.",
|
|
5488
5842
|
"tier": "core",
|
|
@@ -5539,6 +5893,10 @@ const runtimes = {
|
|
|
5539
5893
|
}
|
|
5540
5894
|
]
|
|
5541
5895
|
},
|
|
5896
|
+
"triggerPrecedence": [
|
|
5897
|
+
"skills",
|
|
5898
|
+
"commands"
|
|
5899
|
+
],
|
|
5542
5900
|
"commandStyle": "slash-hyphen",
|
|
5543
5901
|
"hooksSurface": "copilot-inline",
|
|
5544
5902
|
"sandboxTier": "none",
|
|
@@ -5577,7 +5935,7 @@ const runtimes = {
|
|
|
5577
5935
|
"cursor": {
|
|
5578
5936
|
"id": "cursor",
|
|
5579
5937
|
"role": "runtime",
|
|
5580
|
-
"version": "1.
|
|
5938
|
+
"version": "1.11.0",
|
|
5581
5939
|
"title": "Cursor",
|
|
5582
5940
|
"description": "Cursor IDE — skills-only workflow surface; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
|
|
5583
5941
|
"tier": "core",
|
|
@@ -5633,6 +5991,10 @@ const runtimes = {
|
|
|
5633
5991
|
}
|
|
5634
5992
|
]
|
|
5635
5993
|
},
|
|
5994
|
+
"triggerPrecedence": [
|
|
5995
|
+
"skills",
|
|
5996
|
+
"commands"
|
|
5997
|
+
],
|
|
5636
5998
|
"commandStyle": "slash-hyphen",
|
|
5637
5999
|
"hooksSurface": "cursor-hooks-json",
|
|
5638
6000
|
"hookEvents": "claude",
|
|
@@ -5683,8 +6045,7 @@ const runtimes = {
|
|
|
5683
6045
|
"stop",
|
|
5684
6046
|
"subagentStart",
|
|
5685
6047
|
"subagentStop"
|
|
5686
|
-
]
|
|
5687
|
-
"reviewerCli": true
|
|
6048
|
+
]
|
|
5688
6049
|
}
|
|
5689
6050
|
},
|
|
5690
6051
|
"reviewer": {
|
|
@@ -5726,7 +6087,7 @@ const runtimes = {
|
|
|
5726
6087
|
"hermes": {
|
|
5727
6088
|
"id": "hermes",
|
|
5728
6089
|
"role": "runtime",
|
|
5729
|
-
"version": "1.
|
|
6090
|
+
"version": "1.11.0",
|
|
5730
6091
|
"title": "Hermes Agent",
|
|
5731
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.",
|
|
5732
6093
|
"tier": "core",
|
|
@@ -5753,6 +6114,14 @@ const runtimes = {
|
|
|
5753
6114
|
"nesting": "nested",
|
|
5754
6115
|
"recursive": false,
|
|
5755
6116
|
"converter": "convertClaudeCommandToClaudeSkill"
|
|
6117
|
+
},
|
|
6118
|
+
{
|
|
6119
|
+
"kind": "agents",
|
|
6120
|
+
"destSubpath": "agents",
|
|
6121
|
+
"prefix": "gsd-",
|
|
6122
|
+
"nesting": "flat",
|
|
6123
|
+
"recursive": false,
|
|
6124
|
+
"converter": "convertClaudeAgentToHermesAgent"
|
|
5756
6125
|
}
|
|
5757
6126
|
],
|
|
5758
6127
|
"local": [
|
|
@@ -5763,9 +6132,21 @@ const runtimes = {
|
|
|
5763
6132
|
"nesting": "nested",
|
|
5764
6133
|
"recursive": false,
|
|
5765
6134
|
"converter": "convertClaudeCommandToClaudeSkill"
|
|
6135
|
+
},
|
|
6136
|
+
{
|
|
6137
|
+
"kind": "agents",
|
|
6138
|
+
"destSubpath": "agents",
|
|
6139
|
+
"prefix": "gsd-",
|
|
6140
|
+
"nesting": "flat",
|
|
6141
|
+
"recursive": false,
|
|
6142
|
+
"converter": "convertClaudeAgentToHermesAgent"
|
|
5766
6143
|
}
|
|
5767
6144
|
]
|
|
5768
6145
|
},
|
|
6146
|
+
"triggerPrecedence": [
|
|
6147
|
+
"skills",
|
|
6148
|
+
"commands"
|
|
6149
|
+
],
|
|
5769
6150
|
"commandStyle": "slash-hyphen",
|
|
5770
6151
|
"hooksSurface": "settings-json",
|
|
5771
6152
|
"hookEvents": "claude",
|
|
@@ -5817,7 +6198,7 @@ const runtimes = {
|
|
|
5817
6198
|
"kilo": {
|
|
5818
6199
|
"id": "kilo",
|
|
5819
6200
|
"role": "runtime",
|
|
5820
|
-
"version": "1.
|
|
6201
|
+
"version": "1.11.0",
|
|
5821
6202
|
"title": "Kilo Code",
|
|
5822
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.",
|
|
5823
6204
|
"tier": "core",
|
|
@@ -5859,6 +6240,14 @@ const runtimes = {
|
|
|
5859
6240
|
"nesting": "flat",
|
|
5860
6241
|
"recursive": true,
|
|
5861
6242
|
"converter": "convertClaudeCommandToKiloSkill"
|
|
6243
|
+
},
|
|
6244
|
+
{
|
|
6245
|
+
"kind": "agents",
|
|
6246
|
+
"destSubpath": "agents",
|
|
6247
|
+
"prefix": "gsd-",
|
|
6248
|
+
"nesting": "flat",
|
|
6249
|
+
"recursive": false,
|
|
6250
|
+
"converter": "convertClaudeToKiloFrontmatter"
|
|
5862
6251
|
}
|
|
5863
6252
|
],
|
|
5864
6253
|
"local": [
|
|
@@ -5877,9 +6266,21 @@ const runtimes = {
|
|
|
5877
6266
|
"nesting": "flat",
|
|
5878
6267
|
"recursive": true,
|
|
5879
6268
|
"converter": "convertClaudeCommandToKiloSkill"
|
|
6269
|
+
},
|
|
6270
|
+
{
|
|
6271
|
+
"kind": "agents",
|
|
6272
|
+
"destSubpath": "agents",
|
|
6273
|
+
"prefix": "gsd-",
|
|
6274
|
+
"nesting": "flat",
|
|
6275
|
+
"recursive": false,
|
|
6276
|
+
"converter": "convertClaudeToKiloFrontmatter"
|
|
5880
6277
|
}
|
|
5881
6278
|
]
|
|
5882
6279
|
},
|
|
6280
|
+
"triggerPrecedence": [
|
|
6281
|
+
"skills",
|
|
6282
|
+
"commands"
|
|
6283
|
+
],
|
|
5883
6284
|
"commandStyle": "slash-hyphen",
|
|
5884
6285
|
"hooksSurface": "none",
|
|
5885
6286
|
"extensionEvents": "kilo",
|
|
@@ -5926,7 +6327,7 @@ const runtimes = {
|
|
|
5926
6327
|
"kimi": {
|
|
5927
6328
|
"id": "kimi",
|
|
5928
6329
|
"role": "runtime",
|
|
5929
|
-
"version": "1.
|
|
6330
|
+
"version": "1.11.0",
|
|
5930
6331
|
"title": "Kimi CLI",
|
|
5931
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.",
|
|
5932
6333
|
"tier": "core",
|
|
@@ -5970,6 +6371,10 @@ const runtimes = {
|
|
|
5970
6371
|
],
|
|
5971
6372
|
"local": []
|
|
5972
6373
|
},
|
|
6374
|
+
"triggerPrecedence": [
|
|
6375
|
+
"skills",
|
|
6376
|
+
"commands"
|
|
6377
|
+
],
|
|
5973
6378
|
"commandStyle": "slash-hyphen",
|
|
5974
6379
|
"hooksSurface": "kimi-hooks-toml",
|
|
5975
6380
|
"hookEvents": "claude",
|
|
@@ -6024,7 +6429,7 @@ const runtimes = {
|
|
|
6024
6429
|
"kimi-code": {
|
|
6025
6430
|
"id": "kimi-code",
|
|
6026
6431
|
"role": "runtime",
|
|
6027
|
-
"version": "1.
|
|
6432
|
+
"version": "1.11.0",
|
|
6028
6433
|
"title": "Kimi Code CLI",
|
|
6029
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.",
|
|
6030
6435
|
"tier": "core",
|
|
@@ -6055,10 +6460,31 @@ const runtimes = {
|
|
|
6055
6460
|
"nesting": "flat",
|
|
6056
6461
|
"recursive": false,
|
|
6057
6462
|
"converter": "convertClaudeCommandToKimiCodeSkill"
|
|
6463
|
+
},
|
|
6464
|
+
{
|
|
6465
|
+
"kind": "agents",
|
|
6466
|
+
"destSubpath": "agents",
|
|
6467
|
+
"prefix": "gsd-",
|
|
6468
|
+
"nesting": "flat",
|
|
6469
|
+
"recursive": false,
|
|
6470
|
+
"converter": null
|
|
6058
6471
|
}
|
|
6059
6472
|
],
|
|
6060
|
-
"local": [
|
|
6473
|
+
"local": [
|
|
6474
|
+
{
|
|
6475
|
+
"kind": "agents",
|
|
6476
|
+
"destSubpath": "agents",
|
|
6477
|
+
"prefix": "gsd-",
|
|
6478
|
+
"nesting": "flat",
|
|
6479
|
+
"recursive": false,
|
|
6480
|
+
"converter": null
|
|
6481
|
+
}
|
|
6482
|
+
]
|
|
6061
6483
|
},
|
|
6484
|
+
"triggerPrecedence": [
|
|
6485
|
+
"skills",
|
|
6486
|
+
"commands"
|
|
6487
|
+
],
|
|
6062
6488
|
"commandStyle": "slash-hyphen",
|
|
6063
6489
|
"hooksSurface": "kimi-hooks-toml",
|
|
6064
6490
|
"hookEvents": "claude",
|
|
@@ -6156,7 +6582,7 @@ const runtimes = {
|
|
|
6156
6582
|
"opencode": {
|
|
6157
6583
|
"id": "opencode",
|
|
6158
6584
|
"role": "runtime",
|
|
6159
|
-
"version": "1.
|
|
6585
|
+
"version": "1.11.0",
|
|
6160
6586
|
"title": "OpenCode",
|
|
6161
6587
|
"description": "OpenCode — XDG-based config dir; flat commands/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
|
|
6162
6588
|
"tier": "core",
|
|
@@ -6193,6 +6619,14 @@ const runtimes = {
|
|
|
6193
6619
|
"nesting": "flat",
|
|
6194
6620
|
"recursive": true,
|
|
6195
6621
|
"converter": "convertClaudeCommandToOpencodeSkill"
|
|
6622
|
+
},
|
|
6623
|
+
{
|
|
6624
|
+
"kind": "agents",
|
|
6625
|
+
"destSubpath": "agents",
|
|
6626
|
+
"prefix": "gsd-",
|
|
6627
|
+
"nesting": "flat",
|
|
6628
|
+
"recursive": false,
|
|
6629
|
+
"converter": "convertClaudeToOpencodeFrontmatter"
|
|
6196
6630
|
}
|
|
6197
6631
|
],
|
|
6198
6632
|
"local": [
|
|
@@ -6211,9 +6645,21 @@ const runtimes = {
|
|
|
6211
6645
|
"nesting": "flat",
|
|
6212
6646
|
"recursive": true,
|
|
6213
6647
|
"converter": "convertClaudeCommandToOpencodeSkill"
|
|
6648
|
+
},
|
|
6649
|
+
{
|
|
6650
|
+
"kind": "agents",
|
|
6651
|
+
"destSubpath": "agents",
|
|
6652
|
+
"prefix": "gsd-",
|
|
6653
|
+
"nesting": "flat",
|
|
6654
|
+
"recursive": false,
|
|
6655
|
+
"converter": "convertClaudeToOpencodeFrontmatter"
|
|
6214
6656
|
}
|
|
6215
6657
|
]
|
|
6216
6658
|
},
|
|
6659
|
+
"triggerPrecedence": [
|
|
6660
|
+
"skills",
|
|
6661
|
+
"commands"
|
|
6662
|
+
],
|
|
6217
6663
|
"commandStyle": "slash-hyphen",
|
|
6218
6664
|
"hooksSurface": "none",
|
|
6219
6665
|
"extensionEvents": "opencode",
|
|
@@ -6264,8 +6710,7 @@ const runtimes = {
|
|
|
6264
6710
|
"skipHomePrefixSubstitution": true,
|
|
6265
6711
|
"skipSettingsUi": true,
|
|
6266
6712
|
"skipUpdateBannerCommand": true,
|
|
6267
|
-
"skipCodexSkillsManifest": true
|
|
6268
|
-
"reviewerCli": true
|
|
6713
|
+
"skipCodexSkillsManifest": true
|
|
6269
6714
|
}
|
|
6270
6715
|
},
|
|
6271
6716
|
"reviewer": {
|
|
@@ -6313,7 +6758,7 @@ const runtimes = {
|
|
|
6313
6758
|
"pi": {
|
|
6314
6759
|
"id": "pi",
|
|
6315
6760
|
"role": "runtime",
|
|
6316
|
-
"version": "1.
|
|
6761
|
+
"version": "1.11.0",
|
|
6317
6762
|
"title": "pi",
|
|
6318
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.",
|
|
6319
6764
|
"tier": "core",
|
|
@@ -6336,6 +6781,10 @@ const runtimes = {
|
|
|
6336
6781
|
"global": [],
|
|
6337
6782
|
"local": []
|
|
6338
6783
|
},
|
|
6784
|
+
"triggerPrecedence": [
|
|
6785
|
+
"skills",
|
|
6786
|
+
"commands"
|
|
6787
|
+
],
|
|
6339
6788
|
"commandStyle": "slash-hyphen",
|
|
6340
6789
|
"hooksSurface": "none",
|
|
6341
6790
|
"extensionEvents": "pi",
|
|
@@ -6378,7 +6827,7 @@ const runtimes = {
|
|
|
6378
6827
|
"qwen": {
|
|
6379
6828
|
"id": "qwen",
|
|
6380
6829
|
"role": "runtime",
|
|
6381
|
-
"version": "1.
|
|
6830
|
+
"version": "1.11.0",
|
|
6382
6831
|
"title": "Qwen Code",
|
|
6383
6832
|
"description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
6384
6833
|
"tier": "core",
|
|
@@ -6434,6 +6883,10 @@ const runtimes = {
|
|
|
6434
6883
|
}
|
|
6435
6884
|
]
|
|
6436
6885
|
},
|
|
6886
|
+
"triggerPrecedence": [
|
|
6887
|
+
"skills",
|
|
6888
|
+
"commands"
|
|
6889
|
+
],
|
|
6437
6890
|
"commandStyle": "slash-hyphen",
|
|
6438
6891
|
"hooksSurface": "settings-json",
|
|
6439
6892
|
"hookEvents": "claude",
|
|
@@ -6477,8 +6930,7 @@ const runtimes = {
|
|
|
6477
6930
|
"legacyCommandsGsdCleanup": true,
|
|
6478
6931
|
"legacyCommandsGsdInstallMigration": true,
|
|
6479
6932
|
"legacyCommandsGsdUninstall": true,
|
|
6480
|
-
"hyphenNameAgentBody": true
|
|
6481
|
-
"reviewerCli": true
|
|
6933
|
+
"hyphenNameAgentBody": true
|
|
6482
6934
|
}
|
|
6483
6935
|
},
|
|
6484
6936
|
"reviewer": {
|
|
@@ -6514,7 +6966,7 @@ const runtimes = {
|
|
|
6514
6966
|
"trae": {
|
|
6515
6967
|
"id": "trae",
|
|
6516
6968
|
"role": "runtime",
|
|
6517
|
-
"version": "1.
|
|
6969
|
+
"version": "1.11.0",
|
|
6518
6970
|
"title": "Trae IDE",
|
|
6519
6971
|
"description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
|
|
6520
6972
|
"tier": "core",
|
|
@@ -6570,6 +7022,10 @@ const runtimes = {
|
|
|
6570
7022
|
}
|
|
6571
7023
|
]
|
|
6572
7024
|
},
|
|
7025
|
+
"triggerPrecedence": [
|
|
7026
|
+
"skills",
|
|
7027
|
+
"commands"
|
|
7028
|
+
],
|
|
6573
7029
|
"commandStyle": "slash-hyphen",
|
|
6574
7030
|
"hooksSurface": "none",
|
|
6575
7031
|
"sandboxTier": "none",
|
|
@@ -6607,7 +7063,7 @@ const runtimes = {
|
|
|
6607
7063
|
"vscode": {
|
|
6608
7064
|
"id": "vscode",
|
|
6609
7065
|
"role": "runtime",
|
|
6610
|
-
"version": "1.
|
|
7066
|
+
"version": "1.11.0",
|
|
6611
7067
|
"title": "VS Code",
|
|
6612
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).",
|
|
6613
7069
|
"tier": "core",
|
|
@@ -6627,6 +7083,10 @@ const runtimes = {
|
|
|
6627
7083
|
"global": [],
|
|
6628
7084
|
"local": []
|
|
6629
7085
|
},
|
|
7086
|
+
"triggerPrecedence": [
|
|
7087
|
+
"skills",
|
|
7088
|
+
"commands"
|
|
7089
|
+
],
|
|
6630
7090
|
"commandStyle": "slash-hyphen",
|
|
6631
7091
|
"hooksSurface": "none",
|
|
6632
7092
|
"extensionEvents": "none",
|
|
@@ -6660,7 +7120,7 @@ const runtimes = {
|
|
|
6660
7120
|
"windsurf": {
|
|
6661
7121
|
"id": "windsurf",
|
|
6662
7122
|
"role": "runtime",
|
|
6663
|
-
"version": "1.
|
|
7123
|
+
"version": "1.11.0",
|
|
6664
7124
|
"title": "Windsurf",
|
|
6665
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.",
|
|
6666
7126
|
"tier": "core",
|
|
@@ -6709,6 +7169,10 @@ const runtimes = {
|
|
|
6709
7169
|
}
|
|
6710
7170
|
]
|
|
6711
7171
|
},
|
|
7172
|
+
"triggerPrecedence": [
|
|
7173
|
+
"skills",
|
|
7174
|
+
"commands"
|
|
7175
|
+
],
|
|
6712
7176
|
"commandStyle": "slash-hyphen",
|
|
6713
7177
|
"hooksSurface": "windsurf-hooks-json",
|
|
6714
7178
|
"sandboxTier": "none",
|
|
@@ -6747,7 +7211,7 @@ const runtimes = {
|
|
|
6747
7211
|
"zcode": {
|
|
6748
7212
|
"id": "zcode",
|
|
6749
7213
|
"role": "runtime",
|
|
6750
|
-
"version": "1.
|
|
7214
|
+
"version": "1.11.0",
|
|
6751
7215
|
"title": "ZCode",
|
|
6752
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.",
|
|
6753
7217
|
"tier": "core",
|
|
@@ -6789,7 +7253,7 @@ const runtimes = {
|
|
|
6789
7253
|
"prefix": "gsd-",
|
|
6790
7254
|
"nesting": "flat",
|
|
6791
7255
|
"recursive": false,
|
|
6792
|
-
"converter":
|
|
7256
|
+
"converter": "convertClaudeAgentToZcodeAgent"
|
|
6793
7257
|
}
|
|
6794
7258
|
],
|
|
6795
7259
|
"local": [
|
|
@@ -6815,10 +7279,14 @@ const runtimes = {
|
|
|
6815
7279
|
"prefix": "gsd-",
|
|
6816
7280
|
"nesting": "flat",
|
|
6817
7281
|
"recursive": false,
|
|
6818
|
-
"converter":
|
|
7282
|
+
"converter": "convertClaudeAgentToZcodeAgent"
|
|
6819
7283
|
}
|
|
6820
7284
|
]
|
|
6821
7285
|
},
|
|
7286
|
+
"triggerPrecedence": [
|
|
7287
|
+
"skills",
|
|
7288
|
+
"commands"
|
|
7289
|
+
],
|
|
6822
7290
|
"commandStyle": "slash-hyphen",
|
|
6823
7291
|
"hooksSurface": "none",
|
|
6824
7292
|
"sandboxTier": "none",
|
|
@@ -6909,6 +7377,11 @@ const commandFamilies = {
|
|
|
6909
7377
|
"module": "profile-pipeline-command-router.cjs",
|
|
6910
7378
|
"router": "routeProfileSample"
|
|
6911
7379
|
},
|
|
7380
|
+
"refactor": {
|
|
7381
|
+
"capId": "refactor-trigger",
|
|
7382
|
+
"module": "refactor-trigger-command-router.cjs",
|
|
7383
|
+
"router": "routeRefactorTriggerCommand"
|
|
7384
|
+
},
|
|
6912
7385
|
"scan-sessions": {
|
|
6913
7386
|
"capId": "profile-pipeline",
|
|
6914
7387
|
"module": "profile-pipeline-command-router.cjs",
|
|
@@ -7039,6 +7512,7 @@ const _requiresGraph = {
|
|
|
7039
7512
|
"pi": [],
|
|
7040
7513
|
"profile-pipeline": [],
|
|
7041
7514
|
"qwen": [],
|
|
7515
|
+
"refactor-trigger": [],
|
|
7042
7516
|
"research": [],
|
|
7043
7517
|
"schema-gate": [],
|
|
7044
7518
|
"security": [],
|