@opengsd/gsd-core 1.13.0 → 1.15.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/README.ja-JP.md +3 -3
- package/README.ko-KR.md +3 -3
- package/README.pt-BR.md +3 -3
- package/README.zh-CN.md +3 -3
- package/agents/gsd-advisor-researcher.compact.md +85 -0
- package/agents/gsd-ai-researcher.compact.md +96 -0
- package/agents/gsd-assumptions-analyzer.compact.md +81 -0
- package/agents/gsd-code-fixer.compact.md +459 -0
- package/agents/gsd-code-fixer.md +9 -8
- package/agents/gsd-code-reviewer.compact.md +269 -0
- package/agents/gsd-code-reviewer.md +15 -3
- package/agents/gsd-codebase-mapper.compact.md +760 -0
- package/agents/gsd-debug-session-manager.compact.md +360 -0
- package/agents/gsd-debug-session-manager.md +17 -2
- package/agents/gsd-debugger.md +2 -2
- package/agents/gsd-doc-classifier.compact.md +192 -0
- package/agents/gsd-doc-synthesizer.compact.md +200 -0
- package/agents/gsd-doc-verifier.compact.md +143 -0
- package/agents/gsd-doc-writer.compact.md +440 -0
- package/agents/gsd-dom-verifier.compact.md +138 -0
- package/agents/gsd-domain-researcher.compact.md +141 -0
- package/agents/gsd-eval-auditor.compact.md +160 -0
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-eval-planner.compact.md +137 -0
- package/agents/gsd-executor.md +13 -8
- package/agents/gsd-framework-selector.compact.md +82 -0
- package/agents/gsd-integration-checker.compact.md +245 -0
- package/agents/gsd-intel-updater.compact.md +226 -0
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.compact.md +45 -0
- package/agents/gsd-nyquist-auditor.compact.md +179 -0
- package/agents/gsd-pattern-mapper.compact.md +275 -0
- package/agents/gsd-phase-researcher.md +19 -11
- package/agents/gsd-plan-checker.md +8 -7
- package/agents/gsd-planner.md +12 -8
- package/agents/gsd-project-researcher.compact.md +587 -0
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.compact.md +212 -0
- package/agents/gsd-research-synthesizer.md +1 -1
- package/agents/gsd-roadmapper.compact.md +454 -0
- package/agents/gsd-roadmapper.md +13 -0
- package/agents/gsd-security-auditor.compact.md +162 -0
- package/agents/gsd-ui-auditor.compact.md +404 -0
- package/agents/gsd-ui-auditor.md +155 -17
- package/agents/gsd-ui-checker.compact.md +277 -0
- package/agents/gsd-ui-researcher.compact.md +282 -0
- package/agents/gsd-ui-researcher.md +1 -1
- package/agents/gsd-user-profiler.compact.md +108 -0
- package/agents/gsd-verifier.md +10 -9
- package/bin/install.js +848 -163
- package/commands/gsd/autonomous.md +2 -2
- package/commands/gsd/capture.md +1 -1
- package/commands/gsd/cleanup.md +1 -0
- package/commands/gsd/code-review.md +2 -1
- package/commands/gsd/complete-milestone.md +1 -0
- package/commands/gsd/config.md +1 -0
- package/commands/gsd/debug.md +1 -0
- package/commands/gsd/graphify.md +1 -0
- package/commands/gsd/health.md +1 -0
- package/commands/gsd/mempalace-capture.md +8 -3
- package/commands/gsd/mempalace-recall.md +1 -0
- package/commands/gsd/new-milestone.md +1 -0
- package/commands/gsd/new-project.md +1 -0
- package/commands/gsd/next.md +1 -0
- package/commands/gsd/pause-work.md +1 -0
- package/commands/gsd/phase.md +1 -0
- package/commands/gsd/plan-review-convergence.md +6 -6
- package/commands/gsd/pr-branch.md +1 -0
- package/commands/gsd/progress.md +1 -1
- package/commands/gsd/quick-batch.md +1 -1
- package/commands/gsd/resume-work.md +1 -0
- package/commands/gsd/review-backlog.md +1 -0
- package/commands/gsd/review.md +2 -3
- package/commands/gsd/settings.md +2 -1
- package/commands/gsd/stats.md +1 -0
- package/commands/gsd/thread.md +1 -0
- package/commands/gsd/workspace.md +1 -0
- package/commands/gsd/workstreams.md +1 -0
- package/gsd-core/bin/check-latest-version.cjs +8 -3
- package/gsd-core/bin/gsd-tools.cjs +672 -146
- package/gsd-core/bin/lib/adr-parser.cjs +4 -2
- package/gsd-core/bin/lib/artifacts.cjs +2 -1
- package/gsd-core/bin/lib/audit.cjs +119 -34
- package/gsd-core/bin/lib/broken-windows.cjs +168 -49
- package/gsd-core/bin/lib/capability-lifecycle.cjs +10 -6
- package/gsd-core/bin/lib/capability-loader.cjs +135 -1
- package/gsd-core/bin/lib/capability-registry.cjs +96 -189
- package/gsd-core/bin/lib/capability-source.cjs +19 -2
- package/gsd-core/bin/lib/capability-validator.cjs +14 -2
- package/gsd-core/bin/lib/check-command-router.cjs +213 -49
- package/gsd-core/bin/lib/code-review-depth.cjs +2 -2
- package/gsd-core/bin/lib/codex-agent-toml.cjs +21 -25
- package/gsd-core/bin/lib/commands.cjs +823 -112
- package/gsd-core/bin/lib/config-loader.cjs +66 -4
- package/gsd-core/bin/lib/config.cjs +186 -45
- package/gsd-core/bin/lib/coverage.cjs +1 -1
- package/gsd-core/bin/lib/decisions.cjs +164 -45
- package/gsd-core/bin/lib/external-descriptor-trust.cjs +29 -14
- package/gsd-core/bin/lib/frontmatter.cjs +13 -0
- package/gsd-core/bin/lib/graphify.cjs +10 -2
- package/gsd-core/bin/lib/gsd2-import.cjs +1 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +12 -1
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +1 -1
- package/gsd-core/bin/lib/host-runtime-detection.cjs +9 -0
- package/gsd-core/bin/lib/init.cjs +614 -86
- package/gsd-core/bin/lib/install-engine.cjs +29 -3
- package/gsd-core/bin/lib/install-profiles.cjs +14 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +41 -5
- package/gsd-core/bin/lib/loop-resolver.cjs +50 -31
- package/gsd-core/bin/lib/mcp-catalog.cjs +2 -2
- package/gsd-core/bin/lib/milestone.cjs +37 -13
- package/gsd-core/bin/lib/model-resolver.cjs +253 -53
- package/gsd-core/bin/lib/phase-command-router.cjs +16 -2
- package/gsd-core/bin/lib/phase-id-card.cjs +32 -0
- package/gsd-core/bin/lib/phase-id-display.cjs +78 -0
- package/gsd-core/bin/lib/phase-id.cjs +268 -27
- package/gsd-core/bin/lib/phase-lifecycle.cjs +61 -0
- package/gsd-core/bin/lib/phase-locator.cjs +29 -10
- package/gsd-core/bin/lib/phase.cjs +393 -88
- package/gsd-core/bin/lib/plan-document.cjs +49 -1
- package/gsd-core/bin/lib/planning-document.cjs +459 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +52 -19
- package/gsd-core/bin/lib/planning-snapshot.cjs +61 -12
- package/gsd-core/bin/lib/planning-workspace.cjs +57 -3
- package/gsd-core/bin/lib/pr-branch-patterns.cjs +57 -0
- package/gsd-core/bin/lib/pristine-baseline.cjs +182 -0
- package/gsd-core/bin/lib/probe-core.cjs +7 -1
- package/gsd-core/bin/lib/prohibition-enforcement.cjs +91 -4
- package/gsd-core/bin/lib/project-root.cjs +41 -2
- package/gsd-core/bin/lib/quick-batch.cjs +1 -1
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +61 -2
- package/gsd-core/bin/lib/research-store.cjs +11 -12
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +10 -30
- package/gsd-core/bin/lib/review-lane-invocation.cjs +23 -0
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +2 -2
- package/gsd-core/bin/lib/reviewer-step-dispatch.cjs +337 -0
- package/gsd-core/bin/lib/roadmap-command-router.cjs +12 -4
- package/gsd-core/bin/lib/roadmap-parser.cjs +219 -18
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +1539 -13
- package/gsd-core/bin/lib/roadmap.cjs +356 -42
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +310 -41
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +15 -4
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +13 -5
- package/gsd-core/bin/lib/runtime-homes.cjs +4 -0
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +408 -37
- package/gsd-core/bin/lib/runtime-name-policy.cjs +111 -1
- package/gsd-core/bin/lib/security.cjs +126 -7
- package/gsd-core/bin/lib/shell-command-projection.cjs +10 -6
- package/gsd-core/bin/lib/state-document.cjs +130 -28
- package/gsd-core/bin/lib/state-md-schema.cjs +21 -14
- package/gsd-core/bin/lib/state-transition.cjs +181 -30
- package/gsd-core/bin/lib/state.cjs +265 -27
- package/gsd-core/bin/lib/surface.cjs +77 -3
- package/gsd-core/bin/lib/task-command-router.cjs +12 -6
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +78 -5
- package/gsd-core/bin/lib/uat-predicate.cjs +47 -4
- package/gsd-core/bin/lib/uat.cjs +9 -1
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +15 -2
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +100 -9
- package/gsd-core/bin/lib/undo-commit-selection.cjs +131 -0
- package/gsd-core/bin/lib/update-context.cjs +30 -24
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +11 -3
- package/gsd-core/bin/lib/verification.cjs +315 -30
- package/gsd-core/bin/lib/verify-command-grounding.cjs +47 -3
- package/gsd-core/bin/lib/verify.cjs +320 -48
- package/gsd-core/bin/lib/workstream-inventory.cjs +1 -0
- package/gsd-core/bin/lib/worktree-base-ref.cjs +482 -73
- package/gsd-core/bin/lib/worktree-safety.cjs +797 -58
- package/gsd-core/bin/shared/config-defaults.manifest.json +4 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +6 -0
- package/gsd-core/bin/verify-reapply-patches.cjs +439 -80
- package/gsd-core/references/checkpoints.md +5 -3
- package/gsd-core/references/compact-content-gate.md +66 -0
- package/gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json +28 -3
- package/gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json +37 -4
- package/gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json +28 -3
- package/gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json +28 -3
- package/gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json +37 -4
- package/gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json +37 -4
- package/gsd-core/references/edge-probe.md +195 -21
- package/gsd-core/references/execute-phase-between-wave-reset.md +7 -6
- package/gsd-core/references/execute-phase-wave-guard.md +22 -11
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +18 -0
- package/gsd-core/references/model-profiles.md +13 -4
- package/gsd-core/references/phase-argument-parsing.md +9 -7
- package/gsd-core/references/phase-id-convention.md +28 -0
- package/gsd-core/references/planner-gap-closure.md +2 -0
- package/gsd-core/references/planner-load-graph-context.md +24 -13
- package/gsd-core/references/planner-verify-command-grounding.md +14 -0
- package/gsd-core/references/planning-config.md +14 -2
- package/gsd-core/references/tdd.md +30 -4
- package/gsd-core/references/thinking-models-planning.md +18 -2
- package/gsd-core/references/ui-consideration-probe.md +10 -5
- package/gsd-core/references/verification-patterns.md +17 -4
- package/gsd-core/references/verify-command-path-resolvability.md +10 -2
- package/gsd-core/references/worktree-path-safety.md +433 -2
- package/gsd-core/templates/README.md +7 -1
- package/gsd-core/templates/state.md +6 -3
- package/gsd-core/templates/summary.compact.md +212 -0
- package/gsd-core/templates/user-setup.compact.md +199 -0
- package/gsd-core/templates/user-setup.md +0 -9
- package/gsd-core/templates/verification-report.md +1 -1
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
- package/gsd-core/workflows/add-backlog.md +1 -1
- package/gsd-core/workflows/add-phase.md +1 -1
- package/gsd-core/workflows/add-tests.md +2 -2
- package/gsd-core/workflows/add-todo.md +6 -5
- package/gsd-core/workflows/ai-integration-phase.md +11 -3
- package/gsd-core/workflows/audit-fix.md +1 -1
- package/gsd-core/workflows/audit-milestone.md +1 -1
- package/gsd-core/workflows/audit-uat.md +1 -1
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +9 -18
- package/gsd-core/workflows/autonomous.md +29 -16
- package/gsd-core/workflows/check-todos.md +6 -4
- package/gsd-core/workflows/cleanup.md +5 -3
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +4 -3
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +8 -1
- package/gsd-core/workflows/code-review-fix.md +108 -22
- package/gsd-core/workflows/code-review.md +216 -73
- package/gsd-core/workflows/complete-milestone/detail/elaboration.md +274 -0
- package/gsd-core/workflows/complete-milestone.md +41 -264
- package/gsd-core/workflows/debug.md +3 -3
- package/gsd-core/workflows/diagnose-issues.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/chain.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions.md +1 -1
- package/gsd-core/workflows/discuss-phase.md +1 -1
- package/gsd-core/workflows/do.md +2 -2
- package/gsd-core/workflows/docs-update/detail/elaboration.md +179 -0
- package/gsd-core/workflows/docs-update.md +17 -158
- package/gsd-core/workflows/edit-phase.md +1 -1
- package/gsd-core/workflows/eval-review.md +10 -3
- package/gsd-core/workflows/execute-phase/detail/elaboration.md +124 -0
- package/gsd-core/workflows/execute-phase/steps/code-review-disposition.md +1017 -0
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +19 -4
- package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +56 -0
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +43 -4
- package/gsd-core/workflows/execute-phase/steps/executor-progress-policy.md +43 -0
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +46 -9
- package/gsd-core/workflows/execute-phase/steps/protected-branch.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/ready-wave-gate.md +37 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/sequential-root-pin.md +35 -0
- package/gsd-core/workflows/execute-phase/steps/stale-reverification.md +24 -0
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/threat-id-gate.md +28 -0
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/worktree-base-check.md +25 -0
- package/gsd-core/workflows/execute-phase.md +83 -172
- package/gsd-core/workflows/execute-plan.md +24 -10
- package/gsd-core/workflows/explore.md +3 -3
- package/gsd-core/workflows/extract-learnings.md +2 -1
- package/gsd-core/workflows/fast.md +1 -1
- package/gsd-core/workflows/forensics.md +1 -1
- package/gsd-core/workflows/graduation.md +1 -1
- package/gsd-core/workflows/health.md +2 -2
- package/gsd-core/workflows/help/modes/full.compact.md +398 -0
- package/gsd-core/workflows/help/modes/full.md +5 -5
- package/gsd-core/workflows/help/modes/topic.md +15 -5
- package/gsd-core/workflows/help.md +1 -1
- package/gsd-core/workflows/import.md +2 -2
- package/gsd-core/workflows/inbox.md +2 -2
- package/gsd-core/workflows/ingest-docs.md +3 -3
- package/gsd-core/workflows/insert-phase.md +1 -1
- package/gsd-core/workflows/list-seeds.md +1 -1
- package/gsd-core/workflows/list-workspaces.md +1 -1
- package/gsd-core/workflows/manager.md +2 -2
- package/gsd-core/workflows/map-codebase.md +52 -5
- package/gsd-core/workflows/milestone-summary.md +1 -1
- package/gsd-core/workflows/mvp-phase.md +1 -1
- package/gsd-core/workflows/new-milestone.md +56 -14
- package/gsd-core/workflows/new-project/detail/elaboration.md +216 -0
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +3 -3
- package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +1 -1
- package/gsd-core/workflows/new-project.md +39 -209
- package/gsd-core/workflows/new-workspace.md +2 -2
- package/gsd-core/workflows/next.md +1 -1
- package/gsd-core/workflows/note.md +1 -1
- package/gsd-core/workflows/onboard.md +1 -1
- package/gsd-core/workflows/pause-work.md +1 -1
- package/gsd-core/workflows/plan-phase/detail/elaboration.md +209 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +17 -5
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +23 -5
- package/gsd-core/workflows/plan-phase.md +45 -187
- package/gsd-core/workflows/plan-review-convergence.md +21 -5
- package/gsd-core/workflows/plant-seed.md +62 -20
- package/gsd-core/workflows/pr-branch.md +132 -20
- package/gsd-core/workflows/profile-user.md +2 -2
- package/gsd-core/workflows/progress.md +1 -1
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +25 -0
- package/gsd-core/workflows/quick/steps/quick-verification.md +1 -1
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/batch-init.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/completion.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/merge-wave.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/planner-wave.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/research-phase.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/resume-mode.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/verification-wave.md +1 -1
- package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +1 -1
- package/gsd-core/workflows/quick-batch.md +1 -1
- package/gsd-core/workflows/quick.md +29 -10
- package/gsd-core/workflows/reapply-patches.md +86 -6
- package/gsd-core/workflows/remove-phase.md +1 -1
- package/gsd-core/workflows/remove-workspace.md +2 -2
- package/gsd-core/workflows/resume-project.md +1 -1
- package/gsd-core/workflows/review.md +31 -16
- package/gsd-core/workflows/scan.md +1 -1
- package/gsd-core/workflows/secure-phase.md +3 -2
- package/gsd-core/workflows/settings-advanced.md +30 -10
- package/gsd-core/workflows/settings-integrations.md +2 -3
- package/gsd-core/workflows/settings.md +22 -9
- package/gsd-core/workflows/ship.md +3 -2
- package/gsd-core/workflows/sketch-wrap-up.md +1 -1
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/smart-entry.md +2 -2
- package/gsd-core/workflows/spec-phase.md +15 -5
- package/gsd-core/workflows/spike-wrap-up.md +1 -1
- package/gsd-core/workflows/spike.md +1 -1
- package/gsd-core/workflows/stats.md +1 -1
- package/gsd-core/workflows/sync-skills.md +5 -5
- package/gsd-core/workflows/thread.md +1 -1
- package/gsd-core/workflows/transition.md +1 -1
- package/gsd-core/workflows/ui-phase.md +44 -8
- package/gsd-core/workflows/ui-review.md +18 -4
- package/gsd-core/workflows/ultraplan-phase.md +1 -1
- package/gsd-core/workflows/undo.md +339 -20
- package/gsd-core/workflows/update.md +14 -12
- package/gsd-core/workflows/validate-phase.md +3 -2
- package/gsd-core/workflows/verify-work/detail/elaboration.md +230 -0
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +1 -1
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +1 -1
- package/gsd-core/workflows/verify-work.md +101 -196
- package/hooks/dist/gsd-agent-isolation-guard.js +66 -16
- package/hooks/dist/gsd-context-monitor.js +88 -15
- package/hooks/dist/gsd-cursor-subagent-start.js +34 -14
- package/hooks/dist/gsd-secret-read-guard.js +71 -19
- package/hooks/dist/gsd-statusline.js +81 -20
- package/hooks/dist/gsd-validate-commit.sh +97 -8
- package/hooks/dist/gsd-worktree-path-guard.js +25 -14
- package/hooks/dist/gsd-write-guard.js +46 -1
- package/hooks/dist/lib/dispatch-identity.js +187 -0
- package/hooks/dist/lib/filename-classification.js +64 -0
- package/hooks/dist/lib/isolation-deny-reason.js +53 -1
- package/hooks/dist/lib/isolation-sentinel.js +58 -19
- package/hooks/gsd-agent-isolation-guard.js +66 -16
- package/hooks/gsd-context-monitor.js +88 -15
- package/hooks/gsd-cursor-subagent-start.js +34 -14
- package/hooks/gsd-secret-read-guard.js +71 -19
- package/hooks/gsd-statusline.js +81 -20
- package/hooks/gsd-validate-commit.sh +97 -8
- package/hooks/gsd-worktree-path-guard.js +25 -14
- package/hooks/gsd-write-guard.js +46 -1
- package/hooks/lib/dispatch-identity.js +187 -0
- package/hooks/lib/filename-classification.js +64 -0
- package/hooks/lib/isolation-deny-reason.js +53 -1
- package/hooks/lib/isolation-sentinel.js +58 -19
- package/package.json +11 -6
- package/scripts/benchmark-compact-content-variants.cjs +298 -0
- package/scripts/benchmark-compact-content.cjs +368 -0
- package/scripts/build-hooks.js +15 -6
- package/scripts/check-contract-drift.cjs +131 -12
- package/scripts/check-env.cjs +36 -8
- package/scripts/check-glossary-refs.cjs +25 -21
- package/scripts/ci-next-health.cjs +271 -0
- package/scripts/ci-prepare-test-scope.cjs +7 -7
- package/scripts/ci-test-scope.cjs +126 -20
- package/scripts/ci-timeout-report.cjs +1 -1
- package/scripts/command-contract-helpers.cjs +3 -0
- package/scripts/diff-touches-shipped-paths.cjs +1 -1
- package/scripts/docs-guard-registry.cjs +35 -2
- package/scripts/gen-adr-index.cjs +8 -2
- package/scripts/gen-inventory-manifest.cjs +12 -0
- package/scripts/gen-loop-host-contract.cjs +69 -0
- package/scripts/gen-platform-conformance-tier.cjs +557 -0
- package/scripts/lib/drift-scan.cjs +1 -1
- package/scripts/lib/macos-conformance-tier.generated.cjs +224 -0
- package/scripts/lib/ndjson-reporter.cjs +3 -2
- package/scripts/lib/npm-version-check-diagnosis.cjs +59 -0
- package/scripts/lib/platform-conformance-tier.generated.cjs +287 -0
- package/scripts/lib/suite-detection.cjs +32 -0
- package/scripts/lint-allowed-tools-parity.cjs +221 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +47 -3
- package/scripts/lint-phase-arg-assignment.cjs +257 -0
- package/scripts/lint-phase-id-drift.cjs +623 -13
- package/scripts/lint-pr-branch-pattern-drift.cjs +148 -0
- package/scripts/lint-response-language-coverage.cjs +9 -3
- package/scripts/lint-retired-runtime-name.cjs +619 -0
- package/scripts/lint-source-test-name-collision.cjs +1 -1
- package/scripts/lint-state-write-path-drift.cjs +93 -0
- package/scripts/lint-test-file-count.allowlist.json +29 -9
- package/scripts/lint-vendored-deps.cjs +128 -17
- package/scripts/lint-workflow-shellcheck-baseline.json +100 -0
- package/scripts/prompt-injection-scan.sh +18 -0
- package/scripts/release-tarball-smoke.cjs +194 -1
- package/scripts/workflow-size.cjs +139 -0
- package/skills/gsd-autonomous/SKILL.md +2 -2
- package/skills/gsd-capture/SKILL.md +1 -1
- package/skills/gsd-cleanup/SKILL.md +1 -0
- package/skills/gsd-code-review/SKILL.md +2 -1
- package/skills/gsd-complete-milestone/SKILL.md +1 -0
- package/skills/gsd-config/SKILL.md +1 -0
- package/skills/gsd-debug/SKILL.md +1 -0
- package/skills/gsd-graphify/SKILL.md +1 -0
- package/skills/gsd-health/SKILL.md +1 -0
- package/skills/gsd-mempalace-capture/SKILL.md +8 -3
- package/skills/gsd-mempalace-recall/SKILL.md +1 -0
- package/skills/gsd-new-milestone/SKILL.md +1 -0
- package/skills/gsd-new-project/SKILL.md +1 -0
- package/skills/gsd-next/SKILL.md +1 -0
- package/skills/gsd-pause-work/SKILL.md +1 -0
- package/skills/gsd-phase/SKILL.md +1 -0
- package/skills/gsd-plan-review-convergence/SKILL.md +5 -5
- package/skills/gsd-pr-branch/SKILL.md +1 -0
- package/skills/gsd-progress/SKILL.md +1 -1
- package/skills/gsd-quick-batch/SKILL.md +1 -1
- package/skills/gsd-resume-work/SKILL.md +1 -0
- package/skills/gsd-review/SKILL.md +2 -3
- package/skills/gsd-review-backlog/SKILL.md +1 -0
- package/skills/gsd-settings/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +1 -0
- package/skills/gsd-thread/SKILL.md +1 -0
- package/skills/gsd-workspace/SKILL.md +1 -0
- package/skills/gsd-workstreams/SKILL.md +1 -0
- package/vscode/package.json +1 -1
- package/gsd-core/templates/claude-md.md +0 -145
- package/gsd-core/templates/codebase/concerns.md +0 -310
- package/gsd-core/templates/codebase/conventions.md +0 -307
- package/gsd-core/templates/codebase/integrations.md +0 -280
- package/gsd-core/templates/codebase/structure.md +0 -285
- package/gsd-core/templates/codebase/testing.md +0 -480
- package/gsd-core/templates/debug-subagent-prompt.md +0 -91
- package/gsd-core/templates/discovery.md +0 -146
|
@@ -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.15.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.15.0",
|
|
99
99
|
"title": "Antigravity",
|
|
100
100
|
"description": "Google Antigravity IDE — config/settings home nested under ~/.gemini/antigravity (probed across 1.x and 2.x layouts); global skills/agents install under ~/.gemini/config, the dir AGY scans for global discovery (#3738); Gemini hook event dialect; flat skill layout; tier-1 support.",
|
|
101
101
|
"tier": "core",
|
|
@@ -258,7 +258,7 @@ const capabilities = {
|
|
|
258
258
|
"assumption-delta": {
|
|
259
259
|
"id": "assumption-delta",
|
|
260
260
|
"role": "feature",
|
|
261
|
-
"version": "1.
|
|
261
|
+
"version": "1.15.0",
|
|
262
262
|
"title": "Assumption-delta architecture checkpoint",
|
|
263
263
|
"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.",
|
|
264
264
|
"tier": "full",
|
|
@@ -304,7 +304,7 @@ const capabilities = {
|
|
|
304
304
|
"audit": {
|
|
305
305
|
"id": "audit",
|
|
306
306
|
"role": "feature",
|
|
307
|
-
"version": "1.
|
|
307
|
+
"version": "1.15.0",
|
|
308
308
|
"title": "Audit",
|
|
309
309
|
"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).",
|
|
310
310
|
"tier": "full",
|
|
@@ -341,7 +341,7 @@ const capabilities = {
|
|
|
341
341
|
"augment": {
|
|
342
342
|
"id": "augment",
|
|
343
343
|
"role": "runtime",
|
|
344
|
-
"version": "1.
|
|
344
|
+
"version": "1.15.0",
|
|
345
345
|
"title": "Augment Code",
|
|
346
346
|
"description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
347
347
|
"tier": "core",
|
|
@@ -455,7 +455,7 @@ const capabilities = {
|
|
|
455
455
|
"broken-windows": {
|
|
456
456
|
"id": "broken-windows",
|
|
457
457
|
"role": "feature",
|
|
458
|
-
"version": "1.
|
|
458
|
+
"version": "1.15.0",
|
|
459
459
|
"title": "Broken-windows ledger",
|
|
460
460
|
"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).",
|
|
461
461
|
"tier": "full",
|
|
@@ -501,7 +501,7 @@ const capabilities = {
|
|
|
501
501
|
"claude": {
|
|
502
502
|
"id": "claude",
|
|
503
503
|
"role": "runtime",
|
|
504
|
-
"version": "1.
|
|
504
|
+
"version": "1.15.0",
|
|
505
505
|
"title": "Claude Code",
|
|
506
506
|
"description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
|
|
507
507
|
"tier": "core",
|
|
@@ -682,7 +682,7 @@ const capabilities = {
|
|
|
682
682
|
"claude-orchestration": {
|
|
683
683
|
"id": "claude-orchestration",
|
|
684
684
|
"role": "feature",
|
|
685
|
-
"version": "1.
|
|
685
|
+
"version": "1.15.0",
|
|
686
686
|
"title": "Claude orchestration (Workflow backend)",
|
|
687
687
|
"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.",
|
|
688
688
|
"tier": "full",
|
|
@@ -736,20 +736,6 @@ const capabilities = {
|
|
|
736
736
|
},
|
|
737
737
|
"steps": [],
|
|
738
738
|
"contributions": [
|
|
739
|
-
{
|
|
740
|
-
"point": "execute:wave:pre",
|
|
741
|
-
"into": "executor",
|
|
742
|
-
"fragment": {
|
|
743
|
-
"path": "fragments/execute-wave-pre.md",
|
|
744
|
-
"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 --deletions \"<plan files_deleted, space-separated>\"\n ```\n\n `--deletions` (#3003) carries the plan's declared `files_deleted` so a plan that scoped a file\n removal merges through `cleanup-wave` instead of being blocked. Unlike `--files` it is not\n advisory: omitting it leaves the deletions guard blocking on any deletion at all, so this\n dispatch path must pass it or plans declaring a removal fail to merge here while succeeding on\n the inline path.\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"
|
|
745
|
-
},
|
|
746
|
-
"produces": [],
|
|
747
|
-
"consumes": [
|
|
748
|
-
"PLAN.md"
|
|
749
|
-
],
|
|
750
|
-
"when": "claude_orchestration.enabled",
|
|
751
|
-
"onError": "skip"
|
|
752
|
-
},
|
|
753
739
|
{
|
|
754
740
|
"point": "plan:post",
|
|
755
741
|
"into": "planner",
|
|
@@ -770,7 +756,7 @@ const capabilities = {
|
|
|
770
756
|
"cline": {
|
|
771
757
|
"id": "cline",
|
|
772
758
|
"role": "runtime",
|
|
773
|
-
"version": "1.
|
|
759
|
+
"version": "1.15.0",
|
|
774
760
|
"title": "Cline",
|
|
775
761
|
"description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
|
|
776
762
|
"tier": "core",
|
|
@@ -863,7 +849,7 @@ const capabilities = {
|
|
|
863
849
|
"code-review": {
|
|
864
850
|
"id": "code-review",
|
|
865
851
|
"role": "feature",
|
|
866
|
-
"version": "1.
|
|
852
|
+
"version": "1.15.0",
|
|
867
853
|
"title": "Code review",
|
|
868
854
|
"description": "Source-file code review and review-fix workflow support for completed execution work.",
|
|
869
855
|
"tier": "full",
|
|
@@ -923,6 +909,7 @@ const capabilities = {
|
|
|
923
909
|
"consumes": [
|
|
924
910
|
"SUMMARY.md"
|
|
925
911
|
],
|
|
912
|
+
"supportsReviewerLanes": true,
|
|
926
913
|
"when": "workflow.code_review",
|
|
927
914
|
"pointFrom": "workflow.code_review_point",
|
|
928
915
|
"onError": "skip"
|
|
@@ -936,6 +923,7 @@ const capabilities = {
|
|
|
936
923
|
"REVIEW.md"
|
|
937
924
|
],
|
|
938
925
|
"consumes": [],
|
|
926
|
+
"supportsReviewerLanes": true,
|
|
939
927
|
"when": "workflow.code_review",
|
|
940
928
|
"pointFrom": "workflow.code_review_point",
|
|
941
929
|
"onError": "skip"
|
|
@@ -947,7 +935,7 @@ const capabilities = {
|
|
|
947
935
|
"codebuddy": {
|
|
948
936
|
"id": "codebuddy",
|
|
949
937
|
"role": "runtime",
|
|
950
|
-
"version": "1.
|
|
938
|
+
"version": "1.15.0",
|
|
951
939
|
"title": "CodeBuddy",
|
|
952
940
|
"description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
953
941
|
"tier": "core",
|
|
@@ -1065,7 +1053,7 @@ const capabilities = {
|
|
|
1065
1053
|
"coderabbit": {
|
|
1066
1054
|
"id": "coderabbit",
|
|
1067
1055
|
"role": "reviewer",
|
|
1068
|
-
"version": "1.
|
|
1056
|
+
"version": "1.15.0",
|
|
1069
1057
|
"title": "CodeRabbit",
|
|
1070
1058
|
"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).",
|
|
1071
1059
|
"tier": "full",
|
|
@@ -1117,7 +1105,7 @@ const capabilities = {
|
|
|
1117
1105
|
"codex": {
|
|
1118
1106
|
"id": "codex",
|
|
1119
1107
|
"role": "runtime",
|
|
1120
|
-
"version": "1.
|
|
1108
|
+
"version": "1.15.0",
|
|
1121
1109
|
"title": "OpenAI Codex CLI",
|
|
1122
1110
|
"description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
|
|
1123
1111
|
"tier": "core",
|
|
@@ -1225,7 +1213,11 @@ const capabilities = {
|
|
|
1225
1213
|
"tomlConfigInstall": true,
|
|
1226
1214
|
"cleanupSkillSidecars": true,
|
|
1227
1215
|
"agentTomlFiles": true,
|
|
1228
|
-
"frontmatterDialect": "codex"
|
|
1216
|
+
"frontmatterDialect": "codex",
|
|
1217
|
+
"unsupportedFeatures": [
|
|
1218
|
+
"context-warnings",
|
|
1219
|
+
"phase-lifecycle-display"
|
|
1220
|
+
]
|
|
1229
1221
|
}
|
|
1230
1222
|
},
|
|
1231
1223
|
"reviewer": {
|
|
@@ -1293,7 +1285,7 @@ const capabilities = {
|
|
|
1293
1285
|
"copilot": {
|
|
1294
1286
|
"id": "copilot",
|
|
1295
1287
|
"role": "runtime",
|
|
1296
|
-
"version": "1.
|
|
1288
|
+
"version": "1.15.0",
|
|
1297
1289
|
"title": "GitHub Copilot",
|
|
1298
1290
|
"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.",
|
|
1299
1291
|
"tier": "core",
|
|
@@ -1393,7 +1385,7 @@ const capabilities = {
|
|
|
1393
1385
|
"cursor": {
|
|
1394
1386
|
"id": "cursor",
|
|
1395
1387
|
"role": "runtime",
|
|
1396
|
-
"version": "1.
|
|
1388
|
+
"version": "1.15.0",
|
|
1397
1389
|
"title": "Cursor",
|
|
1398
1390
|
"description": "Cursor IDE — skills-only workflow surface; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
|
|
1399
1391
|
"tier": "core",
|
|
@@ -1562,7 +1554,7 @@ const capabilities = {
|
|
|
1562
1554
|
"drift": {
|
|
1563
1555
|
"id": "drift",
|
|
1564
1556
|
"role": "feature",
|
|
1565
|
-
"version": "1.
|
|
1557
|
+
"version": "1.15.0",
|
|
1566
1558
|
"title": "Drift detection gates",
|
|
1567
1559
|
"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.",
|
|
1568
1560
|
"tier": "full",
|
|
@@ -1663,7 +1655,7 @@ const capabilities = {
|
|
|
1663
1655
|
"external-job": {
|
|
1664
1656
|
"id": "external-job",
|
|
1665
1657
|
"role": "feature",
|
|
1666
|
-
"version": "1.
|
|
1658
|
+
"version": "1.15.0",
|
|
1667
1659
|
"title": "Async external-job scheduler adapter",
|
|
1668
1660
|
"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 classification at execute:wave:pre and recording at execute:wave:post. This capability still contributes executor guidance at wave:post; execute-phase now renders wave:pre entries and dispatches generic step hooks there independently. Moving external-job classification to wave:pre is a separate capability change, not part of #4148. 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).",
|
|
1669
1661
|
"tier": "full",
|
|
@@ -1746,7 +1738,7 @@ const capabilities = {
|
|
|
1746
1738
|
"gap-analysis": {
|
|
1747
1739
|
"id": "gap-analysis",
|
|
1748
1740
|
"role": "feature",
|
|
1749
|
-
"version": "1.
|
|
1741
|
+
"version": "1.15.0",
|
|
1750
1742
|
"title": "Post-planning gap analysis",
|
|
1751
1743
|
"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.",
|
|
1752
1744
|
"tier": "standard",
|
|
@@ -1784,73 +1776,10 @@ const capabilities = {
|
|
|
1784
1776
|
}
|
|
1785
1777
|
]
|
|
1786
1778
|
},
|
|
1787
|
-
"gemini": {
|
|
1788
|
-
"id": "gemini",
|
|
1789
|
-
"role": "reviewer",
|
|
1790
|
-
"version": "1.13.0",
|
|
1791
|
-
"title": "Gemini CLI",
|
|
1792
|
-
"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.",
|
|
1793
|
-
"tier": "full",
|
|
1794
|
-
"requires": [],
|
|
1795
|
-
"engines": {
|
|
1796
|
-
"gsd": ">=1.8.0"
|
|
1797
|
-
},
|
|
1798
|
-
"reviewer": {
|
|
1799
|
-
"slug": "gemini",
|
|
1800
|
-
"flags": [
|
|
1801
|
-
"--gemini"
|
|
1802
|
-
],
|
|
1803
|
-
"transport": "spawn",
|
|
1804
|
-
"probe": {
|
|
1805
|
-
"kind": "command-exists",
|
|
1806
|
-
"binary": "gemini"
|
|
1807
|
-
},
|
|
1808
|
-
"invoke": {
|
|
1809
|
-
"binary": "gemini",
|
|
1810
|
-
"args": [
|
|
1811
|
-
"{{model}}",
|
|
1812
|
-
"-p",
|
|
1813
|
-
"-"
|
|
1814
|
-
],
|
|
1815
|
-
"promptChannel": "stdin",
|
|
1816
|
-
"outputChannel": "stdout",
|
|
1817
|
-
"modelArg": "-m",
|
|
1818
|
-
"effortChannel": "none"
|
|
1819
|
-
},
|
|
1820
|
-
"timeoutFloorMs": 900000,
|
|
1821
|
-
"timeoutConfigKey": "review.timeouts.gemini",
|
|
1822
|
-
"emptyOutput": "stub-with-stderr",
|
|
1823
|
-
"reviewsSection": "Gemini",
|
|
1824
|
-
"evidenceClass": "source-grounded",
|
|
1825
|
-
"requiresBinaries": [],
|
|
1826
|
-
"promptBudgetKey": "review.max_prompt_tokens_per_reviewer.gemini",
|
|
1827
|
-
"modelConfigKey": "review.models.gemini",
|
|
1828
|
-
"effortConfigKey": null,
|
|
1829
|
-
"defaultEffort": null,
|
|
1830
|
-
"handler": null
|
|
1831
|
-
},
|
|
1832
|
-
"config": {
|
|
1833
|
-
"review.models.gemini": {
|
|
1834
|
-
"type": "string",
|
|
1835
|
-
"default": "",
|
|
1836
|
-
"description": "Model passed to the Gemini reviewer lane."
|
|
1837
|
-
},
|
|
1838
|
-
"review.max_prompt_tokens_per_reviewer.gemini": {
|
|
1839
|
-
"type": "number",
|
|
1840
|
-
"default": -1,
|
|
1841
|
-
"description": "Prompt-token budget for the Gemini reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
|
|
1842
|
-
},
|
|
1843
|
-
"review.timeouts.gemini": {
|
|
1844
|
-
"type": "number",
|
|
1845
|
-
"default": -1,
|
|
1846
|
-
"description": "Outer wall-clock timeout override (seconds) for the Gemini reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
|
|
1847
|
-
}
|
|
1848
|
-
}
|
|
1849
|
-
},
|
|
1850
1779
|
"graphify": {
|
|
1851
1780
|
"id": "graphify",
|
|
1852
1781
|
"role": "feature",
|
|
1853
|
-
"version": "1.
|
|
1782
|
+
"version": "1.15.0",
|
|
1854
1783
|
"title": "Knowledge graph",
|
|
1855
1784
|
"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.",
|
|
1856
1785
|
"tier": "full",
|
|
@@ -1891,7 +1820,7 @@ const capabilities = {
|
|
|
1891
1820
|
"hermes": {
|
|
1892
1821
|
"id": "hermes",
|
|
1893
1822
|
"role": "runtime",
|
|
1894
|
-
"version": "1.
|
|
1823
|
+
"version": "1.15.0",
|
|
1895
1824
|
"title": "Hermes Agent",
|
|
1896
1825
|
"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.",
|
|
1897
1826
|
"tier": "core",
|
|
@@ -2003,7 +1932,7 @@ const capabilities = {
|
|
|
2003
1932
|
"intel": {
|
|
2004
1933
|
"id": "intel",
|
|
2005
1934
|
"role": "feature",
|
|
2006
|
-
"version": "1.
|
|
1935
|
+
"version": "1.15.0",
|
|
2007
1936
|
"title": "Codebase intelligence",
|
|
2008
1937
|
"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`.",
|
|
2009
1938
|
"tier": "full",
|
|
@@ -2055,7 +1984,7 @@ const capabilities = {
|
|
|
2055
1984
|
"kilo": {
|
|
2056
1985
|
"id": "kilo",
|
|
2057
1986
|
"role": "runtime",
|
|
2058
|
-
"version": "1.
|
|
1987
|
+
"version": "1.15.0",
|
|
2059
1988
|
"title": "Kilo Code",
|
|
2060
1989
|
"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.",
|
|
2061
1990
|
"tier": "core",
|
|
@@ -2185,7 +2114,7 @@ const capabilities = {
|
|
|
2185
2114
|
"kimi": {
|
|
2186
2115
|
"id": "kimi",
|
|
2187
2116
|
"role": "runtime",
|
|
2188
|
-
"version": "1.
|
|
2117
|
+
"version": "1.15.0",
|
|
2189
2118
|
"title": "Kimi CLI",
|
|
2190
2119
|
"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.",
|
|
2191
2120
|
"tier": "core",
|
|
@@ -2289,7 +2218,7 @@ const capabilities = {
|
|
|
2289
2218
|
"kimi-code": {
|
|
2290
2219
|
"id": "kimi-code",
|
|
2291
2220
|
"role": "runtime",
|
|
2292
|
-
"version": "1.
|
|
2221
|
+
"version": "1.15.0",
|
|
2293
2222
|
"title": "Kimi Code CLI",
|
|
2294
2223
|
"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.",
|
|
2295
2224
|
"tier": "core",
|
|
@@ -2456,7 +2385,7 @@ const capabilities = {
|
|
|
2456
2385
|
"live-dom-uat": {
|
|
2457
2386
|
"id": "live-dom-uat",
|
|
2458
2387
|
"role": "feature",
|
|
2459
|
-
"version": "1.
|
|
2388
|
+
"version": "1.15.0",
|
|
2460
2389
|
"title": "Live-DOM UAT",
|
|
2461
2390
|
"description": "Default-off live-DOM verification (#2856). Confines browser MCP reach to one purpose-built agent (gsd-dom-verifier) that carries the browser globs in its own tools: line, registered as an additive step hook at execute:wave:post. agents/gsd-executor.md is deliberately NOT widened: for a first-party agent the static tool list is the only control that exists, no capability can grant tools to one (ADR-1244 D2), no hook kind grants tool permissions (ADR-857 D4), and there is no per-dispatch tool override. Gated by activationKey workflow.live_dom_uat (default false), so with the key off the capability resolves inactive and the hook does not render at all. NOTE on the browser profile lock: chrome-devtools-mcp holds an exclusive lock on $HOME/.cache/chrome-devtools-mcp/chrome-profile, and --isolated is a flag on the user's own MCP-server registration that GSD cannot pass. Concurrent execution waves sharing one profile will therefore collide; the step tolerates and reports that (onError: skip, never blocking) rather than pretending to coordinate a resource it does not own.",
|
|
2462
2391
|
"tier": "full",
|
|
@@ -2509,7 +2438,7 @@ const capabilities = {
|
|
|
2509
2438
|
"llama-cpp": {
|
|
2510
2439
|
"id": "llama-cpp",
|
|
2511
2440
|
"role": "reviewer",
|
|
2512
|
-
"version": "1.
|
|
2441
|
+
"version": "1.15.0",
|
|
2513
2442
|
"title": "llama.cpp",
|
|
2514
2443
|
"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).",
|
|
2515
2444
|
"tier": "full",
|
|
@@ -2575,7 +2504,7 @@ const capabilities = {
|
|
|
2575
2504
|
"lm-studio": {
|
|
2576
2505
|
"id": "lm-studio",
|
|
2577
2506
|
"role": "reviewer",
|
|
2578
|
-
"version": "1.
|
|
2507
|
+
"version": "1.15.0",
|
|
2579
2508
|
"title": "LM Studio",
|
|
2580
2509
|
"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).",
|
|
2581
2510
|
"tier": "full",
|
|
@@ -2641,7 +2570,7 @@ const capabilities = {
|
|
|
2641
2570
|
"mempalace": {
|
|
2642
2571
|
"id": "mempalace",
|
|
2643
2572
|
"role": "feature",
|
|
2644
|
-
"version": "1.
|
|
2573
|
+
"version": "1.15.0",
|
|
2645
2574
|
"title": "MemPalace memory",
|
|
2646
2575
|
"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.",
|
|
2647
2576
|
"tier": "full",
|
|
@@ -2802,7 +2731,7 @@ const capabilities = {
|
|
|
2802
2731
|
"into": "verifier",
|
|
2803
2732
|
"fragment": {
|
|
2804
2733
|
"path": "fragments/capture-problems.md",
|
|
2805
|
-
"inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the execute:wave:post verifier prompt when `mempalace.capture_artifacts` is true.\n Contributes DATA (capture instructions), not control flow. onError: skip — never fails a wave.\n-->\n### Capture problems → fixes (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.capture_artifacts` is `false`, **skip this entire section** and let the wave complete unchanged. (This contribution is only injected when the capability is enabled; the `capture_artifacts` check lets you turn capture off without disabling the rest of the capability.)\n\nOtherwise — after verifying this wave, persist any *confirmed* problem→fix pairs into the palace so they are recalled in future phases. This is best-effort; if MemPalace is unreachable, skip silently — capture never fails a wave.\n\nFor each confirmed bug/issue resolved in this wave:\n\n1. **Resolve the wing** (`mempalace.wing`, else `project_code`, else project dir) and target `room: problems`.\n2. **Dedupe first.** Call `mempalace_check_duplicate` (interactive) before filing so re-runs don't create duplicate drawers.\n3. **File the drawer verbatim.** Store the problem statement and its fix as a drawer in `room: problems` — interactive: `mempalace_add_drawer`; headless: stage the artifact under the `problems/` folder and run `mempalace mine` (no `--room` flag — see [CLI reference](https://mempalaceofficial.com/reference/cli.html); room assignment is via `detect_room()` folder-path match per the [mining guide](https://mempalaceofficial.com/guide/mining.html); use the same staging pattern documented in `gsd-mempalace-capture` Step 3). Include provenance (`source_file`, phase id).\n4. **Mirror the KG fact** when `mempalace.mirror_kg` is on: add `(<bug>, fixed_by, <fix>)` with `valid_from` = the phase date via `mempalace_kg_add`.\n5. **Mode awareness** (`mempalace.memory_mode`). Under `augment` the fact is an *additive* mirror alongside `.planning/graphs/`. Under `kg_backend`/`replace` the palace is the *authoritative* store for the fact; GSD still writes `.planning/graphs/` through its normal graphify, so an unreachable palace never loses it.\n\nCaptures are idempotent: deterministic drawer IDs + `check_duplicate` mean re-running the wave re-files the same content without duplication. On any error, skip and let the wave complete normally.\n"
|
|
2734
|
+
"inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the execute:wave:post verifier prompt when `mempalace.capture_artifacts` is true.\n Contributes DATA (capture instructions), not control flow. onError: skip — never fails a wave.\n-->\n### Capture problems → fixes (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.capture_artifacts` is `false`, **skip this entire section** and let the wave complete unchanged. (This contribution is only injected when the capability is enabled; the `capture_artifacts` check lets you turn capture off without disabling the rest of the capability.)\n\nOtherwise — after verifying this wave, persist any *confirmed* problem→fix pairs into the palace so they are recalled in future phases. This is best-effort; if MemPalace is unreachable, skip silently — capture never fails a wave.\n\nFor each confirmed bug/issue resolved in this wave:\n\n1. **Resolve the wing** (`mempalace.wing`, else `project_code`, else project dir) and target `room: problems`.\n2. **Dedupe first.** Call `mempalace_check_duplicate` (interactive) before filing so re-runs don't create duplicate drawers.\n3. **File the drawer verbatim.** Store the problem statement and its fix as a drawer in `room: problems` — interactive: `mempalace_add_drawer`; headless: stage the artifact under the `problems/` folder and run `mempalace mine --daemon --background` (no `--room` flag; the background queue defers the write when another writer holds the palace lock, #4700 — see [CLI reference](https://mempalaceofficial.com/reference/cli.html); room assignment is via `detect_room()` folder-path match per the [mining guide](https://mempalaceofficial.com/guide/mining.html); use the same staging pattern documented in `gsd-mempalace-capture` Step 3). Include provenance (`source_file`, phase id).\n4. **Mirror the KG fact** when `mempalace.mirror_kg` is on: add `(<bug>, fixed_by, <fix>)` with `valid_from` = the phase date via `mempalace_kg_add`.\n5. **Mode awareness** (`mempalace.memory_mode`). Under `augment` the fact is an *additive* mirror alongside `.planning/graphs/`. Under `kg_backend`/`replace` the palace is the *authoritative* store for the fact; GSD still writes `.planning/graphs/` through its normal graphify, so an unreachable palace never loses it.\n\nCaptures are idempotent: deterministic drawer IDs + `check_duplicate` mean re-running the wave re-files the same content without duplication. On any error, skip and let the wave complete normally.\n"
|
|
2806
2735
|
},
|
|
2807
2736
|
"produces": [],
|
|
2808
2737
|
"consumes": [],
|
|
@@ -2815,7 +2744,7 @@ const capabilities = {
|
|
|
2815
2744
|
"nyquist": {
|
|
2816
2745
|
"id": "nyquist",
|
|
2817
2746
|
"role": "feature",
|
|
2818
|
-
"version": "1.
|
|
2747
|
+
"version": "1.15.0",
|
|
2819
2748
|
"title": "Nyquist validation",
|
|
2820
2749
|
"description": "Validation coverage audit that maps executed work back to tests and manual-only evidence.",
|
|
2821
2750
|
"tier": "full",
|
|
@@ -2865,7 +2794,7 @@ const capabilities = {
|
|
|
2865
2794
|
"ollama": {
|
|
2866
2795
|
"id": "ollama",
|
|
2867
2796
|
"role": "reviewer",
|
|
2868
|
-
"version": "1.
|
|
2797
|
+
"version": "1.15.0",
|
|
2869
2798
|
"title": "Ollama",
|
|
2870
2799
|
"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.",
|
|
2871
2800
|
"tier": "full",
|
|
@@ -2931,7 +2860,7 @@ const capabilities = {
|
|
|
2931
2860
|
"opencode": {
|
|
2932
2861
|
"id": "opencode",
|
|
2933
2862
|
"role": "runtime",
|
|
2934
|
-
"version": "1.
|
|
2863
|
+
"version": "1.15.0",
|
|
2935
2864
|
"title": "OpenCode",
|
|
2936
2865
|
"description": "OpenCode — XDG-based config dir; flat commands/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
|
|
2937
2866
|
"tier": "core",
|
|
@@ -3059,8 +2988,7 @@ const capabilities = {
|
|
|
3059
2988
|
},
|
|
3060
2989
|
"skipHomePrefixSubstitution": true,
|
|
3061
2990
|
"skipSettingsUi": true,
|
|
3062
|
-
"skipUpdateBannerCommand": true
|
|
3063
|
-
"skipCodexSkillsManifest": true
|
|
2991
|
+
"skipUpdateBannerCommand": true
|
|
3064
2992
|
}
|
|
3065
2993
|
},
|
|
3066
2994
|
"reviewer": {
|
|
@@ -3126,7 +3054,7 @@ const capabilities = {
|
|
|
3126
3054
|
"pattern-mapper": {
|
|
3127
3055
|
"id": "pattern-mapper",
|
|
3128
3056
|
"role": "feature",
|
|
3129
|
-
"version": "1.
|
|
3057
|
+
"version": "1.15.0",
|
|
3130
3058
|
"title": "Pattern mapping",
|
|
3131
3059
|
"description": "Optional codebase-pattern mapping before planning; owns the pattern mapper agent and workflow.pattern_mapper activation key.",
|
|
3132
3060
|
"tier": "full",
|
|
@@ -3180,7 +3108,7 @@ const capabilities = {
|
|
|
3180
3108
|
"pi": {
|
|
3181
3109
|
"id": "pi",
|
|
3182
3110
|
"role": "runtime",
|
|
3183
|
-
"version": "1.
|
|
3111
|
+
"version": "1.15.0",
|
|
3184
3112
|
"title": "pi",
|
|
3185
3113
|
"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.",
|
|
3186
3114
|
"tier": "core",
|
|
@@ -3250,7 +3178,7 @@ const capabilities = {
|
|
|
3250
3178
|
"profile-pipeline": {
|
|
3251
3179
|
"id": "profile-pipeline",
|
|
3252
3180
|
"role": "feature",
|
|
3253
|
-
"version": "1.
|
|
3181
|
+
"version": "1.15.0",
|
|
3254
3182
|
"title": "Developer profiling pipeline",
|
|
3255
3183
|
"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.",
|
|
3256
3184
|
"tier": "full",
|
|
@@ -3327,7 +3255,7 @@ const capabilities = {
|
|
|
3327
3255
|
"qwen": {
|
|
3328
3256
|
"id": "qwen",
|
|
3329
3257
|
"role": "runtime",
|
|
3330
|
-
"version": "1.
|
|
3258
|
+
"version": "1.15.0",
|
|
3331
3259
|
"title": "Qwen Code",
|
|
3332
3260
|
"description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
3333
3261
|
"tier": "core",
|
|
@@ -3477,7 +3405,7 @@ const capabilities = {
|
|
|
3477
3405
|
"refactor-trigger": {
|
|
3478
3406
|
"id": "refactor-trigger",
|
|
3479
3407
|
"role": "feature",
|
|
3480
|
-
"version": "1.
|
|
3408
|
+
"version": "1.15.0",
|
|
3481
3409
|
"title": "Complexity-triggered refactor",
|
|
3482
3410
|
"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).",
|
|
3483
3411
|
"tier": "full",
|
|
@@ -3544,7 +3472,7 @@ const capabilities = {
|
|
|
3544
3472
|
"research": {
|
|
3545
3473
|
"id": "research",
|
|
3546
3474
|
"role": "feature",
|
|
3547
|
-
"version": "1.
|
|
3475
|
+
"version": "1.15.0",
|
|
3548
3476
|
"title": "Phase research",
|
|
3549
3477
|
"description": "Optional phase research before planning; owns the phase researcher agent and workflow.research activation key.",
|
|
3550
3478
|
"tier": "standard",
|
|
@@ -3596,7 +3524,7 @@ const capabilities = {
|
|
|
3596
3524
|
"schema-gate": {
|
|
3597
3525
|
"id": "schema-gate",
|
|
3598
3526
|
"role": "feature",
|
|
3599
|
-
"version": "1.
|
|
3527
|
+
"version": "1.15.0",
|
|
3600
3528
|
"title": "Schema push detection gate",
|
|
3601
3529
|
"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.",
|
|
3602
3530
|
"tier": "full",
|
|
@@ -3642,7 +3570,7 @@ const capabilities = {
|
|
|
3642
3570
|
"security": {
|
|
3643
3571
|
"id": "security",
|
|
3644
3572
|
"role": "feature",
|
|
3645
|
-
"version": "1.
|
|
3573
|
+
"version": "1.15.0",
|
|
3646
3574
|
"title": "Security enforcement",
|
|
3647
3575
|
"description": "Threat mitigation verification and ship-time security blocking for phases with security enforcement enabled.",
|
|
3648
3576
|
"tier": "full",
|
|
@@ -3741,7 +3669,7 @@ const capabilities = {
|
|
|
3741
3669
|
"tdd": {
|
|
3742
3670
|
"id": "tdd",
|
|
3743
3671
|
"role": "feature",
|
|
3744
|
-
"version": "1.
|
|
3672
|
+
"version": "1.15.0",
|
|
3745
3673
|
"title": "Test-driven development",
|
|
3746
3674
|
"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.",
|
|
3747
3675
|
"tier": "full",
|
|
@@ -3794,7 +3722,7 @@ const capabilities = {
|
|
|
3794
3722
|
"trae": {
|
|
3795
3723
|
"id": "trae",
|
|
3796
3724
|
"role": "runtime",
|
|
3797
|
-
"version": "1.
|
|
3725
|
+
"version": "1.15.0",
|
|
3798
3726
|
"title": "Trae IDE",
|
|
3799
3727
|
"description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
|
|
3800
3728
|
"tier": "core",
|
|
@@ -3892,7 +3820,7 @@ const capabilities = {
|
|
|
3892
3820
|
"ui": {
|
|
3893
3821
|
"id": "ui",
|
|
3894
3822
|
"role": "feature",
|
|
3895
|
-
"version": "1.
|
|
3823
|
+
"version": "1.15.0",
|
|
3896
3824
|
"title": "UI design contracts",
|
|
3897
3825
|
"description": "UI-SPEC design contract + retrospective UI audit for frontend phases.",
|
|
3898
3826
|
"tier": "full",
|
|
@@ -3930,6 +3858,11 @@ const capabilities = {
|
|
|
3930
3858
|
"type": "boolean",
|
|
3931
3859
|
"default": true,
|
|
3932
3860
|
"description": "Block execution on unmet UI-SPEC contracts."
|
|
3861
|
+
},
|
|
3862
|
+
"workflow.ui_interaction_capture": {
|
|
3863
|
+
"type": "boolean",
|
|
3864
|
+
"default": false,
|
|
3865
|
+
"description": "Default-off. Let gsd-ui-auditor add post-interaction captures (hover, focus, open menus, filled forms) through the chrome-devtools CLI, driven from Bash — no MCP server and no tools: change (#4223). Requires an installed Chrome; when off, or when none resolves, the auditor's Playwright-only static capture is unchanged."
|
|
3933
3866
|
}
|
|
3934
3867
|
},
|
|
3935
3868
|
"steps": [
|
|
@@ -3987,7 +3920,7 @@ const capabilities = {
|
|
|
3987
3920
|
"vscode": {
|
|
3988
3921
|
"id": "vscode",
|
|
3989
3922
|
"role": "runtime",
|
|
3990
|
-
"version": "1.
|
|
3923
|
+
"version": "1.15.0",
|
|
3991
3924
|
"title": "VS Code",
|
|
3992
3925
|
"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).",
|
|
3993
3926
|
"tier": "core",
|
|
@@ -4045,7 +3978,7 @@ const capabilities = {
|
|
|
4045
3978
|
"windsurf": {
|
|
4046
3979
|
"id": "windsurf",
|
|
4047
3980
|
"role": "runtime",
|
|
4048
|
-
"version": "1.
|
|
3981
|
+
"version": "1.15.0",
|
|
4049
3982
|
"title": "Windsurf",
|
|
4050
3983
|
"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.",
|
|
4051
3984
|
"tier": "core",
|
|
@@ -4137,7 +4070,7 @@ const capabilities = {
|
|
|
4137
4070
|
"zcode": {
|
|
4138
4071
|
"id": "zcode",
|
|
4139
4072
|
"role": "runtime",
|
|
4140
|
-
"version": "1.
|
|
4073
|
+
"version": "1.15.0",
|
|
4141
4074
|
"title": "ZCode",
|
|
4142
4075
|
"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.",
|
|
4143
4076
|
"tier": "core",
|
|
@@ -4594,23 +4527,7 @@ const byLoopPoint = {
|
|
|
4594
4527
|
},
|
|
4595
4528
|
"execute:wave:pre": {
|
|
4596
4529
|
"steps": [],
|
|
4597
|
-
"contributions": [
|
|
4598
|
-
{
|
|
4599
|
-
"capId": "claude-orchestration",
|
|
4600
|
-
"point": "execute:wave:pre",
|
|
4601
|
-
"into": "executor",
|
|
4602
|
-
"fragment": {
|
|
4603
|
-
"path": "fragments/execute-wave-pre.md",
|
|
4604
|
-
"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 --deletions \"<plan files_deleted, space-separated>\"\n ```\n\n `--deletions` (#3003) carries the plan's declared `files_deleted` so a plan that scoped a file\n removal merges through `cleanup-wave` instead of being blocked. Unlike `--files` it is not\n advisory: omitting it leaves the deletions guard blocking on any deletion at all, so this\n dispatch path must pass it or plans declaring a removal fail to merge here while succeeding on\n the inline path.\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"
|
|
4605
|
-
},
|
|
4606
|
-
"produces": [],
|
|
4607
|
-
"consumes": [
|
|
4608
|
-
"PLAN.md"
|
|
4609
|
-
],
|
|
4610
|
-
"when": "claude_orchestration.enabled",
|
|
4611
|
-
"onError": "skip"
|
|
4612
|
-
}
|
|
4613
|
-
],
|
|
4530
|
+
"contributions": [],
|
|
4614
4531
|
"gates": []
|
|
4615
4532
|
},
|
|
4616
4533
|
"execute:wave:post": {
|
|
@@ -4625,6 +4542,7 @@ const byLoopPoint = {
|
|
|
4625
4542
|
"REVIEW.md"
|
|
4626
4543
|
],
|
|
4627
4544
|
"consumes": [],
|
|
4545
|
+
"supportsReviewerLanes": true,
|
|
4628
4546
|
"when": "workflow.code_review",
|
|
4629
4547
|
"pointFrom": "workflow.code_review_point",
|
|
4630
4548
|
"onError": "skip"
|
|
@@ -4673,7 +4591,7 @@ const byLoopPoint = {
|
|
|
4673
4591
|
"into": "verifier",
|
|
4674
4592
|
"fragment": {
|
|
4675
4593
|
"path": "fragments/capture-problems.md",
|
|
4676
|
-
"inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the execute:wave:post verifier prompt when `mempalace.capture_artifacts` is true.\n Contributes DATA (capture instructions), not control flow. onError: skip — never fails a wave.\n-->\n### Capture problems → fixes (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.capture_artifacts` is `false`, **skip this entire section** and let the wave complete unchanged. (This contribution is only injected when the capability is enabled; the `capture_artifacts` check lets you turn capture off without disabling the rest of the capability.)\n\nOtherwise — after verifying this wave, persist any *confirmed* problem→fix pairs into the palace so they are recalled in future phases. This is best-effort; if MemPalace is unreachable, skip silently — capture never fails a wave.\n\nFor each confirmed bug/issue resolved in this wave:\n\n1. **Resolve the wing** (`mempalace.wing`, else `project_code`, else project dir) and target `room: problems`.\n2. **Dedupe first.** Call `mempalace_check_duplicate` (interactive) before filing so re-runs don't create duplicate drawers.\n3. **File the drawer verbatim.** Store the problem statement and its fix as a drawer in `room: problems` — interactive: `mempalace_add_drawer`; headless: stage the artifact under the `problems/` folder and run `mempalace mine` (no `--room` flag — see [CLI reference](https://mempalaceofficial.com/reference/cli.html); room assignment is via `detect_room()` folder-path match per the [mining guide](https://mempalaceofficial.com/guide/mining.html); use the same staging pattern documented in `gsd-mempalace-capture` Step 3). Include provenance (`source_file`, phase id).\n4. **Mirror the KG fact** when `mempalace.mirror_kg` is on: add `(<bug>, fixed_by, <fix>)` with `valid_from` = the phase date via `mempalace_kg_add`.\n5. **Mode awareness** (`mempalace.memory_mode`). Under `augment` the fact is an *additive* mirror alongside `.planning/graphs/`. Under `kg_backend`/`replace` the palace is the *authoritative* store for the fact; GSD still writes `.planning/graphs/` through its normal graphify, so an unreachable palace never loses it.\n\nCaptures are idempotent: deterministic drawer IDs + `check_duplicate` mean re-running the wave re-files the same content without duplication. On any error, skip and let the wave complete normally.\n"
|
|
4594
|
+
"inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the execute:wave:post verifier prompt when `mempalace.capture_artifacts` is true.\n Contributes DATA (capture instructions), not control flow. onError: skip — never fails a wave.\n-->\n### Capture problems → fixes (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.capture_artifacts` is `false`, **skip this entire section** and let the wave complete unchanged. (This contribution is only injected when the capability is enabled; the `capture_artifacts` check lets you turn capture off without disabling the rest of the capability.)\n\nOtherwise — after verifying this wave, persist any *confirmed* problem→fix pairs into the palace so they are recalled in future phases. This is best-effort; if MemPalace is unreachable, skip silently — capture never fails a wave.\n\nFor each confirmed bug/issue resolved in this wave:\n\n1. **Resolve the wing** (`mempalace.wing`, else `project_code`, else project dir) and target `room: problems`.\n2. **Dedupe first.** Call `mempalace_check_duplicate` (interactive) before filing so re-runs don't create duplicate drawers.\n3. **File the drawer verbatim.** Store the problem statement and its fix as a drawer in `room: problems` — interactive: `mempalace_add_drawer`; headless: stage the artifact under the `problems/` folder and run `mempalace mine --daemon --background` (no `--room` flag; the background queue defers the write when another writer holds the palace lock, #4700 — see [CLI reference](https://mempalaceofficial.com/reference/cli.html); room assignment is via `detect_room()` folder-path match per the [mining guide](https://mempalaceofficial.com/guide/mining.html); use the same staging pattern documented in `gsd-mempalace-capture` Step 3). Include provenance (`source_file`, phase id).\n4. **Mirror the KG fact** when `mempalace.mirror_kg` is on: add `(<bug>, fixed_by, <fix>)` with `valid_from` = the phase date via `mempalace_kg_add`.\n5. **Mode awareness** (`mempalace.memory_mode`). Under `augment` the fact is an *additive* mirror alongside `.planning/graphs/`. Under `kg_backend`/`replace` the palace is the *authoritative* store for the fact; GSD still writes `.planning/graphs/` through its normal graphify, so an unreachable palace never loses it.\n\nCaptures are idempotent: deterministic drawer IDs + `check_duplicate` mean re-running the wave re-files the same content without duplication. On any error, skip and let the wave complete normally.\n"
|
|
4677
4595
|
},
|
|
4678
4596
|
"produces": [],
|
|
4679
4597
|
"consumes": [],
|
|
@@ -4728,6 +4646,7 @@ const byLoopPoint = {
|
|
|
4728
4646
|
"consumes": [
|
|
4729
4647
|
"SUMMARY.md"
|
|
4730
4648
|
],
|
|
4649
|
+
"supportsReviewerLanes": true,
|
|
4731
4650
|
"when": "workflow.code_review",
|
|
4732
4651
|
"pointFrom": "workflow.code_review_point",
|
|
4733
4652
|
"onError": "skip"
|
|
@@ -4934,9 +4853,6 @@ const configKeys = {
|
|
|
4934
4853
|
"external_job.submit_timeout_ms": "external-job",
|
|
4935
4854
|
"external_job.poll_timeout_ms": "external-job",
|
|
4936
4855
|
"workflow.post_planning_gaps": "gap-analysis",
|
|
4937
|
-
"review.models.gemini": "gemini",
|
|
4938
|
-
"review.max_prompt_tokens_per_reviewer.gemini": "gemini",
|
|
4939
|
-
"review.timeouts.gemini": "gemini",
|
|
4940
4856
|
"graphify.enabled": "graphify",
|
|
4941
4857
|
"intel.enabled": "intel",
|
|
4942
4858
|
"review.models.kimi-code": "kimi-code",
|
|
@@ -4985,7 +4901,8 @@ const configKeys = {
|
|
|
4985
4901
|
"workflow.tdd_mode": "tdd",
|
|
4986
4902
|
"workflow.ui_phase": "ui",
|
|
4987
4903
|
"workflow.ui_review": "ui",
|
|
4988
|
-
"workflow.ui_safety_gate": "ui"
|
|
4904
|
+
"workflow.ui_safety_gate": "ui",
|
|
4905
|
+
"workflow.ui_interaction_capture": "ui"
|
|
4989
4906
|
};
|
|
4990
4907
|
|
|
4991
4908
|
const configSchema = {
|
|
@@ -5230,24 +5147,6 @@ const configSchema = {
|
|
|
5230
5147
|
"default": true,
|
|
5231
5148
|
"description": "Run the post-planning gap analysis report after plans are generated."
|
|
5232
5149
|
},
|
|
5233
|
-
"review.models.gemini": {
|
|
5234
|
-
"owner": "gemini",
|
|
5235
|
-
"type": "string",
|
|
5236
|
-
"default": "",
|
|
5237
|
-
"description": "Model passed to the Gemini reviewer lane."
|
|
5238
|
-
},
|
|
5239
|
-
"review.max_prompt_tokens_per_reviewer.gemini": {
|
|
5240
|
-
"owner": "gemini",
|
|
5241
|
-
"type": "number",
|
|
5242
|
-
"default": -1,
|
|
5243
|
-
"description": "Prompt-token budget for the Gemini reviewer lane. Unset is -1, a sentinel: 0 is a legitimate value meaning \"do not trim this lane\", so it cannot double as \"not configured\"."
|
|
5244
|
-
},
|
|
5245
|
-
"review.timeouts.gemini": {
|
|
5246
|
-
"owner": "gemini",
|
|
5247
|
-
"type": "number",
|
|
5248
|
-
"default": -1,
|
|
5249
|
-
"description": "Outer wall-clock timeout override (seconds) for the Gemini reviewer lane. Unset is -1, a sentinel: 0 or a negative number is also treated as unset (a timeout has no legitimate zero/negative value), so no second sentinel is needed. Falls back to the lane's built-in timeoutFloorMs when unset."
|
|
5250
|
-
},
|
|
5251
5150
|
"graphify.enabled": {
|
|
5252
5151
|
"owner": "graphify",
|
|
5253
5152
|
"type": "boolean",
|
|
@@ -5553,6 +5452,12 @@ const configSchema = {
|
|
|
5553
5452
|
"type": "boolean",
|
|
5554
5453
|
"default": true,
|
|
5555
5454
|
"description": "Block execution on unmet UI-SPEC contracts."
|
|
5455
|
+
},
|
|
5456
|
+
"workflow.ui_interaction_capture": {
|
|
5457
|
+
"owner": "ui",
|
|
5458
|
+
"type": "boolean",
|
|
5459
|
+
"default": false,
|
|
5460
|
+
"description": "Default-off. Let gsd-ui-auditor add post-interaction captures (hover, focus, open menus, filled forms) through the chrome-devtools CLI, driven from Bash — no MCP server and no tools: change (#4223). Requires an installed Chrome; when off, or when none resolves, the auditor's Playwright-only static capture is unchanged."
|
|
5556
5461
|
}
|
|
5557
5462
|
};
|
|
5558
5463
|
|
|
@@ -5560,7 +5465,7 @@ const runtimes = {
|
|
|
5560
5465
|
"antigravity": {
|
|
5561
5466
|
"id": "antigravity",
|
|
5562
5467
|
"role": "runtime",
|
|
5563
|
-
"version": "1.
|
|
5468
|
+
"version": "1.15.0",
|
|
5564
5469
|
"title": "Antigravity",
|
|
5565
5470
|
"description": "Google Antigravity IDE — config/settings home nested under ~/.gemini/antigravity (probed across 1.x and 2.x layouts); global skills/agents install under ~/.gemini/config, the dir AGY scans for global discovery (#3738); Gemini hook event dialect; flat skill layout; tier-1 support.",
|
|
5566
5471
|
"tier": "core",
|
|
@@ -5723,7 +5628,7 @@ const runtimes = {
|
|
|
5723
5628
|
"augment": {
|
|
5724
5629
|
"id": "augment",
|
|
5725
5630
|
"role": "runtime",
|
|
5726
|
-
"version": "1.
|
|
5631
|
+
"version": "1.15.0",
|
|
5727
5632
|
"title": "Augment Code",
|
|
5728
5633
|
"description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
5729
5634
|
"tier": "core",
|
|
@@ -5837,7 +5742,7 @@ const runtimes = {
|
|
|
5837
5742
|
"claude": {
|
|
5838
5743
|
"id": "claude",
|
|
5839
5744
|
"role": "runtime",
|
|
5840
|
-
"version": "1.
|
|
5745
|
+
"version": "1.15.0",
|
|
5841
5746
|
"title": "Claude Code",
|
|
5842
5747
|
"description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
|
|
5843
5748
|
"tier": "core",
|
|
@@ -6018,7 +5923,7 @@ const runtimes = {
|
|
|
6018
5923
|
"cline": {
|
|
6019
5924
|
"id": "cline",
|
|
6020
5925
|
"role": "runtime",
|
|
6021
|
-
"version": "1.
|
|
5926
|
+
"version": "1.15.0",
|
|
6022
5927
|
"title": "Cline",
|
|
6023
5928
|
"description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
|
|
6024
5929
|
"tier": "core",
|
|
@@ -6111,7 +6016,7 @@ const runtimes = {
|
|
|
6111
6016
|
"codebuddy": {
|
|
6112
6017
|
"id": "codebuddy",
|
|
6113
6018
|
"role": "runtime",
|
|
6114
|
-
"version": "1.
|
|
6019
|
+
"version": "1.15.0",
|
|
6115
6020
|
"title": "CodeBuddy",
|
|
6116
6021
|
"description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
6117
6022
|
"tier": "core",
|
|
@@ -6229,7 +6134,7 @@ const runtimes = {
|
|
|
6229
6134
|
"codex": {
|
|
6230
6135
|
"id": "codex",
|
|
6231
6136
|
"role": "runtime",
|
|
6232
|
-
"version": "1.
|
|
6137
|
+
"version": "1.15.0",
|
|
6233
6138
|
"title": "OpenAI Codex CLI",
|
|
6234
6139
|
"description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
|
|
6235
6140
|
"tier": "core",
|
|
@@ -6337,7 +6242,11 @@ const runtimes = {
|
|
|
6337
6242
|
"tomlConfigInstall": true,
|
|
6338
6243
|
"cleanupSkillSidecars": true,
|
|
6339
6244
|
"agentTomlFiles": true,
|
|
6340
|
-
"frontmatterDialect": "codex"
|
|
6245
|
+
"frontmatterDialect": "codex",
|
|
6246
|
+
"unsupportedFeatures": [
|
|
6247
|
+
"context-warnings",
|
|
6248
|
+
"phase-lifecycle-display"
|
|
6249
|
+
]
|
|
6341
6250
|
}
|
|
6342
6251
|
},
|
|
6343
6252
|
"reviewer": {
|
|
@@ -6405,7 +6314,7 @@ const runtimes = {
|
|
|
6405
6314
|
"copilot": {
|
|
6406
6315
|
"id": "copilot",
|
|
6407
6316
|
"role": "runtime",
|
|
6408
|
-
"version": "1.
|
|
6317
|
+
"version": "1.15.0",
|
|
6409
6318
|
"title": "GitHub Copilot",
|
|
6410
6319
|
"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.",
|
|
6411
6320
|
"tier": "core",
|
|
@@ -6505,7 +6414,7 @@ const runtimes = {
|
|
|
6505
6414
|
"cursor": {
|
|
6506
6415
|
"id": "cursor",
|
|
6507
6416
|
"role": "runtime",
|
|
6508
|
-
"version": "1.
|
|
6417
|
+
"version": "1.15.0",
|
|
6509
6418
|
"title": "Cursor",
|
|
6510
6419
|
"description": "Cursor IDE — skills-only workflow surface; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
|
|
6511
6420
|
"tier": "core",
|
|
@@ -6674,7 +6583,7 @@ const runtimes = {
|
|
|
6674
6583
|
"hermes": {
|
|
6675
6584
|
"id": "hermes",
|
|
6676
6585
|
"role": "runtime",
|
|
6677
|
-
"version": "1.
|
|
6586
|
+
"version": "1.15.0",
|
|
6678
6587
|
"title": "Hermes Agent",
|
|
6679
6588
|
"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.",
|
|
6680
6589
|
"tier": "core",
|
|
@@ -6786,7 +6695,7 @@ const runtimes = {
|
|
|
6786
6695
|
"kilo": {
|
|
6787
6696
|
"id": "kilo",
|
|
6788
6697
|
"role": "runtime",
|
|
6789
|
-
"version": "1.
|
|
6698
|
+
"version": "1.15.0",
|
|
6790
6699
|
"title": "Kilo Code",
|
|
6791
6700
|
"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.",
|
|
6792
6701
|
"tier": "core",
|
|
@@ -6916,7 +6825,7 @@ const runtimes = {
|
|
|
6916
6825
|
"kimi": {
|
|
6917
6826
|
"id": "kimi",
|
|
6918
6827
|
"role": "runtime",
|
|
6919
|
-
"version": "1.
|
|
6828
|
+
"version": "1.15.0",
|
|
6920
6829
|
"title": "Kimi CLI",
|
|
6921
6830
|
"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.",
|
|
6922
6831
|
"tier": "core",
|
|
@@ -7020,7 +6929,7 @@ const runtimes = {
|
|
|
7020
6929
|
"kimi-code": {
|
|
7021
6930
|
"id": "kimi-code",
|
|
7022
6931
|
"role": "runtime",
|
|
7023
|
-
"version": "1.
|
|
6932
|
+
"version": "1.15.0",
|
|
7024
6933
|
"title": "Kimi Code CLI",
|
|
7025
6934
|
"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.",
|
|
7026
6935
|
"tier": "core",
|
|
@@ -7187,7 +7096,7 @@ const runtimes = {
|
|
|
7187
7096
|
"opencode": {
|
|
7188
7097
|
"id": "opencode",
|
|
7189
7098
|
"role": "runtime",
|
|
7190
|
-
"version": "1.
|
|
7099
|
+
"version": "1.15.0",
|
|
7191
7100
|
"title": "OpenCode",
|
|
7192
7101
|
"description": "OpenCode — XDG-based config dir; flat commands/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
|
|
7193
7102
|
"tier": "core",
|
|
@@ -7315,8 +7224,7 @@ const runtimes = {
|
|
|
7315
7224
|
},
|
|
7316
7225
|
"skipHomePrefixSubstitution": true,
|
|
7317
7226
|
"skipSettingsUi": true,
|
|
7318
|
-
"skipUpdateBannerCommand": true
|
|
7319
|
-
"skipCodexSkillsManifest": true
|
|
7227
|
+
"skipUpdateBannerCommand": true
|
|
7320
7228
|
}
|
|
7321
7229
|
},
|
|
7322
7230
|
"reviewer": {
|
|
@@ -7382,7 +7290,7 @@ const runtimes = {
|
|
|
7382
7290
|
"pi": {
|
|
7383
7291
|
"id": "pi",
|
|
7384
7292
|
"role": "runtime",
|
|
7385
|
-
"version": "1.
|
|
7293
|
+
"version": "1.15.0",
|
|
7386
7294
|
"title": "pi",
|
|
7387
7295
|
"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.",
|
|
7388
7296
|
"tier": "core",
|
|
@@ -7452,7 +7360,7 @@ const runtimes = {
|
|
|
7452
7360
|
"qwen": {
|
|
7453
7361
|
"id": "qwen",
|
|
7454
7362
|
"role": "runtime",
|
|
7455
|
-
"version": "1.
|
|
7363
|
+
"version": "1.15.0",
|
|
7456
7364
|
"title": "Qwen Code",
|
|
7457
7365
|
"description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
7458
7366
|
"tier": "core",
|
|
@@ -7602,7 +7510,7 @@ const runtimes = {
|
|
|
7602
7510
|
"trae": {
|
|
7603
7511
|
"id": "trae",
|
|
7604
7512
|
"role": "runtime",
|
|
7605
|
-
"version": "1.
|
|
7513
|
+
"version": "1.15.0",
|
|
7606
7514
|
"title": "Trae IDE",
|
|
7607
7515
|
"description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
|
|
7608
7516
|
"tier": "core",
|
|
@@ -7700,7 +7608,7 @@ const runtimes = {
|
|
|
7700
7608
|
"vscode": {
|
|
7701
7609
|
"id": "vscode",
|
|
7702
7610
|
"role": "runtime",
|
|
7703
|
-
"version": "1.
|
|
7611
|
+
"version": "1.15.0",
|
|
7704
7612
|
"title": "VS Code",
|
|
7705
7613
|
"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).",
|
|
7706
7614
|
"tier": "core",
|
|
@@ -7758,7 +7666,7 @@ const runtimes = {
|
|
|
7758
7666
|
"windsurf": {
|
|
7759
7667
|
"id": "windsurf",
|
|
7760
7668
|
"role": "runtime",
|
|
7761
|
-
"version": "1.
|
|
7669
|
+
"version": "1.15.0",
|
|
7762
7670
|
"title": "Windsurf",
|
|
7763
7671
|
"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.",
|
|
7764
7672
|
"tier": "core",
|
|
@@ -7850,7 +7758,7 @@ const runtimes = {
|
|
|
7850
7758
|
"zcode": {
|
|
7851
7759
|
"id": "zcode",
|
|
7852
7760
|
"role": "runtime",
|
|
7853
|
-
"version": "1.
|
|
7761
|
+
"version": "1.15.0",
|
|
7854
7762
|
"title": "ZCode",
|
|
7855
7763
|
"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.",
|
|
7856
7764
|
"tier": "core",
|
|
@@ -8133,7 +8041,6 @@ const _requiresGraph = {
|
|
|
8133
8041
|
"drift": [],
|
|
8134
8042
|
"external-job": [],
|
|
8135
8043
|
"gap-analysis": [],
|
|
8136
|
-
"gemini": [],
|
|
8137
8044
|
"graphify": [],
|
|
8138
8045
|
"hermes": [],
|
|
8139
8046
|
"intel": [],
|