@opengsd/gsd-core 1.7.0 → 1.8.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/.opencode/plugins/gsd-core.js +14 -0
- package/README.md +2 -0
- package/agents/gsd-debug-session-manager.md +42 -4
- package/agents/gsd-debugger.md +87 -29
- package/agents/gsd-executor.md +29 -2
- package/agents/gsd-planner.md +29 -36
- package/agents/gsd-verifier.md +2 -2
- package/bin/install.js +1152 -80
- package/commands/gsd/ai-integration-phase.md +1 -1
- package/commands/gsd/mempalace-capture.md +9 -5
- package/commands/gsd/new-milestone.md +1 -1
- package/commands/gsd/plan-phase.md +5 -3
- package/commands/gsd/plan-review-convergence.md +3 -2
- package/gsd-core/bin/gsd-tools.cjs +1878 -2507
- package/gsd-core/bin/lib/adapter-imperative.cjs +8 -1
- package/gsd-core/bin/lib/agent-command-router.cjs +20 -5
- package/gsd-core/bin/lib/api-coverage.cjs +338 -45
- package/gsd-core/bin/lib/broken-windows.cjs +716 -0
- package/gsd-core/bin/lib/capability-command-router.cjs +733 -0
- package/gsd-core/bin/lib/capability-registry.cjs +155 -86
- package/gsd-core/bin/lib/capability-writer.cjs +6 -1
- package/gsd-core/bin/lib/check-command-router.cjs +128 -25
- package/gsd-core/bin/lib/claude-orchestration-command-router.cjs +115 -27
- package/gsd-core/bin/lib/claude-orchestration.cjs +84 -9
- package/gsd-core/bin/lib/command-aliases.cjs +14 -0
- package/gsd-core/bin/lib/commands.cjs +81 -4
- package/gsd-core/bin/lib/config-loader.cjs +14 -2
- package/gsd-core/bin/lib/config.cjs +69 -18
- package/gsd-core/bin/lib/core-utils.cjs +6 -1
- package/gsd-core/bin/lib/decisions.cjs +32 -8
- package/gsd-core/bin/lib/docs.cjs +6 -0
- package/gsd-core/bin/lib/external-descriptor-trust.cjs +14 -2
- package/gsd-core/bin/lib/gap-checker.cjs +17 -2
- package/gsd-core/bin/lib/init.cjs +111 -47
- package/gsd-core/bin/lib/install-engine.cjs +298 -23
- package/gsd-core/bin/lib/install-profiles.cjs +239 -1
- package/gsd-core/bin/lib/installer-migrations/005-opencode-baseline-commands-dir.cjs +146 -0
- package/gsd-core/bin/lib/installer-migrations/006-pi-extension-cjs-to-js.cjs +91 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +44 -5
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +107 -0
- package/gsd-core/bin/lib/milestone.cjs +246 -12
- package/gsd-core/bin/lib/model-catalog.cjs +19 -4
- package/gsd-core/bin/lib/model-resolver.cjs +189 -7
- package/gsd-core/bin/lib/onboard-projection.cjs +11 -8
- package/gsd-core/bin/lib/phase-id.cjs +26 -4
- package/gsd-core/bin/lib/phase.cjs +201 -12
- package/gsd-core/bin/lib/plan-scan.cjs +70 -2
- package/gsd-core/bin/lib/roadmap-parser.cjs +7 -4
- package/gsd-core/bin/lib/roadmap.cjs +13 -3
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +7 -1
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +22 -8
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +16 -0
- package/gsd-core/bin/lib/smart-entry.cjs +69 -4
- package/gsd-core/bin/lib/state-document.cjs +7 -4
- package/gsd-core/bin/lib/state-transition.cjs +22 -1
- package/gsd-core/bin/lib/state.cjs +65 -11
- package/gsd-core/bin/lib/surface.cjs +51 -9
- package/gsd-core/bin/lib/uat.cjs +420 -5
- package/gsd-core/bin/lib/validate.cjs +12 -8
- package/gsd-core/bin/lib/verification.cjs +112 -17
- package/gsd-core/bin/lib/verify.cjs +220 -22
- package/gsd-core/bin/shared/config-schema.manifest.json +3 -2
- package/gsd-core/references/api-coverage.md +37 -7
- package/gsd-core/references/checkpoints.md +1 -1
- package/gsd-core/references/common-bug-patterns.md +13 -0
- package/gsd-core/references/debugger-bug-taxonomy.md +111 -0
- package/gsd-core/references/debugger-fix-acceptance.md +157 -0
- package/gsd-core/references/debugger-philosophy.md +1 -0
- package/gsd-core/references/debugger-prevention.md +98 -0
- package/gsd-core/references/debugger-rca-branching.md +98 -0
- package/gsd-core/references/debugger-repro-hardening.md +130 -0
- package/gsd-core/references/debugger-sbfl.md +110 -0
- package/gsd-core/references/debugger-semantic-recall.md +81 -0
- package/gsd-core/references/execute-phase-quota-recovery.md +55 -0
- package/gsd-core/references/execute-phase-requirement-revert.md +8 -0
- package/gsd-core/references/execute-phase-response-language.md +7 -0
- package/gsd-core/references/planner-antipatterns.md +6 -0
- package/gsd-core/references/planner-mvp-mode.md +12 -13
- package/gsd-core/references/planner-preconditions.md +156 -0
- package/gsd-core/references/planner-reversibility.md +132 -0
- package/gsd-core/references/reviewer-instances.md +9 -7
- package/gsd-core/references/skeleton-template.md +1 -1
- package/gsd-core/references/thinking-models-planning.md +3 -1
- package/gsd-core/templates/DEBUG.md +5 -3
- package/gsd-core/workflows/add-phase.md +2 -0
- package/gsd-core/workflows/add-tests.md +3 -1
- package/gsd-core/workflows/add-todo.md +32 -1
- package/gsd-core/workflows/ai-integration-phase.md +4 -2
- package/gsd-core/workflows/audit-fix.md +2 -2
- package/gsd-core/workflows/check-todos.md +3 -1
- package/gsd-core/workflows/cleanup.md +7 -1
- package/gsd-core/workflows/code-review.md +17 -5
- package/gsd-core/workflows/complete-milestone.md +3 -0
- package/gsd-core/workflows/debug.md +25 -5
- package/gsd-core/workflows/diagnose-issues.md +1 -1
- package/gsd-core/workflows/discovery-phase.md +7 -0
- package/gsd-core/workflows/discuss-phase/templates/context.md +16 -2
- package/gsd-core/workflows/discuss-phase-assumptions.md +3 -0
- package/gsd-core/workflows/do.md +7 -1
- package/gsd-core/workflows/docs-update.md +1 -0
- package/gsd-core/workflows/eval-review.md +3 -0
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +4 -4
- package/gsd-core/workflows/execute-phase/steps/regression-gate.md +2 -2
- package/gsd-core/workflows/execute-phase.md +25 -34
- package/gsd-core/workflows/execute-plan.md +15 -4
- package/gsd-core/workflows/graduation.md +3 -0
- package/gsd-core/workflows/health.md +7 -1
- package/gsd-core/workflows/help/modes/full.md +6 -2
- package/gsd-core/workflows/import.md +8 -2
- package/gsd-core/workflows/inbox.md +7 -0
- package/gsd-core/workflows/ingest-docs.md +15 -10
- package/gsd-core/workflows/manager.md +3 -1
- package/gsd-core/workflows/map-codebase.md +4 -4
- package/gsd-core/workflows/mvp-phase.md +3 -0
- package/gsd-core/workflows/new-milestone.md +69 -21
- package/gsd-core/workflows/new-project.md +17 -15
- package/gsd-core/workflows/new-workspace.md +3 -1
- package/gsd-core/workflows/onboard.md +3 -0
- package/gsd-core/workflows/plan-phase.md +14 -5
- package/gsd-core/workflows/plan-review-convergence.md +48 -3
- package/gsd-core/workflows/plant-seed.md +3 -0
- package/gsd-core/workflows/profile-user.md +7 -1
- package/gsd-core/workflows/progress.md +31 -3
- package/gsd-core/workflows/quick.md +19 -7
- package/gsd-core/workflows/remove-workspace.md +3 -0
- package/gsd-core/workflows/review.md +89 -73
- package/gsd-core/workflows/scan.md +1 -1
- package/gsd-core/workflows/secure-phase.md +3 -0
- package/gsd-core/workflows/settings-integrations.md +3 -0
- package/gsd-core/workflows/settings.md +3 -0
- package/gsd-core/workflows/ship.md +50 -3
- package/gsd-core/workflows/sketch.md +3 -0
- package/gsd-core/workflows/smart-entry.md +3 -0
- package/gsd-core/workflows/spike.md +7 -1
- package/gsd-core/workflows/ui-phase.md +3 -1
- package/gsd-core/workflows/ui-review.md +3 -0
- package/gsd-core/workflows/undo.md +7 -0
- package/gsd-core/workflows/update.md +2 -0
- package/gsd-core/workflows/validate-phase.md +3 -0
- package/gsd-core/workflows/verify-phase.md +2 -2
- package/gsd-core/workflows/verify-work.md +7 -3
- package/hooks/dist/gsd-context-monitor.js +27 -9
- package/hooks/dist/gsd-statusline.js +88 -3
- package/hooks/gsd-context-monitor.js +27 -9
- package/hooks/gsd-statusline.js +88 -3
- package/package.json +6 -4
- package/pi/gsd.cjs +8 -2
- package/scripts/changeset/lint.cjs +1 -0
- package/scripts/changeset/parse.cjs +26 -0
- package/scripts/check-glossary-refs.cjs +220 -0
- package/scripts/ci-rebase-check.cjs +48 -4
- package/scripts/gen-adr-index.cjs +526 -0
- package/scripts/gen-test-timings.cjs +201 -0
- package/scripts/lint-portable-timeout.cjs +140 -0
- package/scripts/lint-test-file-count.allowlist.json +1 -0
- package/scripts/release-tarball-smoke.cjs +18 -11
- package/scripts/run-tests.cjs +420 -58
- package/skills/gsd-ai-integration-phase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +9 -5
- package/skills/gsd-new-milestone/SKILL.md +1 -1
- package/skills/gsd-plan-phase/SKILL.md +5 -3
- package/skills/gsd-plan-review-convergence/SKILL.md +3 -2
- package/vscode/package.json +1 -1
|
@@ -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.8.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",
|
|
@@ -68,7 +68,7 @@ const capabilities = {
|
|
|
68
68
|
"into": "planner",
|
|
69
69
|
"fragment": {
|
|
70
70
|
"path": "fragments/api-coverage-plan-pre.md",
|
|
71
|
-
"inline": "# API Coverage Decision Checkpoint\n\n> Full API Coverage by Default — Opt Out, Never Opt In. Fires when a phase\n> integrates an external API / SDK / service. Most non-API phases will not fire\n> it — that is the point.\n\n## Why this exists\n\n\"We integrated the API\" too often silently means \"we integrated whatever the\nfirst use case exercised.\" Every un-built capability is then an invisible hole,\ndiscovered later by a user who reasonably expected it to work. The phase sealed\ngreen because its tasks completed; nobody decided the gaps were acceptable,\nbecause nobody enumerated them. This checkpoint makes the surface **visible and\ndecided** before the phase can seal.\n\n## Detect whether this phase integrates an external API\n\nThe detector is a deterministic scan over the phase scope. It strips fenced\ncode blocks first, so a trigger term inside a code snippet does not fire. It\nreturns a typed result: `{ detected, signals[], terms }`. Run it on the phase\nscope (the concatenation of this phase's ROADMAP section + the PLAN body):\n\n```bash\nSCOPE=\"$(cat \"${PHASE_DIR}\"/*-PLAN.md 2>/dev/null) $(gsd_run query roadmap.get-phase \"${PHASE}\" 2>/dev/null || true)\"\nAPI_COVERAGE_JSON=$(printf '%s' \"$SCOPE\" | node gsd-core/bin/lib/api-coverage.cjs --json 2>/dev/null || echo '{\"detected\":false,\"signals\":[]}')\n```\n\nRead `API_COVERAGE_JSON.detected`. Act on it only — do **not** pattern-match the\nprose yourself.\n\n**If `detected` is `false`:** this phase does not integrate an external API. Skip\nthe checkpoint entirely and continue planning. Do not raise it with the user.\n\n**If `detected` is `true`:** an external-API integration is in scope. You MUST\nproduce a **coverage matrix** before the plan is finalized.\n\n## Produce the coverage matrix\n\nEnumerate the external API's full **capability surface** — the verb/endpoint/method\nlist (e.g. for a music service: `search`, `play`, `pause`, `skip`, `set_volume`,\n`get_playlist`, `create_playlist`, `add_to_playlist`, …). For each capability\nrecord a decision, starting from **full coverage** as the default:\n\n| capability | decision | reason |\n|---|---|---|\n| `<capability-id>` | `INTEGRATE` \\| `OPT-OUT` | `<one-line reason if OPT-OUT>` |\n\nRules:\n\n- **`INTEGRATE` is the default.** Every capability starts as INTEGRATE; the\n matrix is the *subtraction record*.\n- **Every `OPT-OUT` MUST carry a one-line reason** (`not needed`, `not needed\n yet`, `explicitly out of scope`, …). An opt-out without a reason is an\n un-decided hole — the exact failure mode this gate exists to close.\n- **A second integration against the same need** (e.g. a second platform for the\n same capability) starts from the **same full-coverage baseline** as the first.\n Do not carry over the first integration's opt-outs silently — re-decide each\n capability for the new surface, so a first-class/fallback asymmetry cannot\n accumulate.\n\nWrite the matrix to `${PHASE_DIR}/COVERAGE.md` (canonical markdown-table form):\n\n```markdown\n# API Coverage — <service>\n\n> Full coverage by default. Opt-outs are explicit, reasoned decisions.\n\n| capability | decision | reason |\n|---|---|---|\n| search | INTEGRATE | |\n| playlists | INTEGRATE | |\n| skip | OPT-OUT | not needed yet — tracked for follow-up phase |\n```\n\nA fenced ` ```coverage ` JSON block is also accepted for machine-generated\nmatrices; the markdown table is preferred (human-editable, diff-friendly).\n\n## The seal-time gate\n\nThis checkpoint is enforced. At `verify:pre` the `api-coverage.verify-pre` gate\nruns `check api-coverage.verify-pre <phase-dir>`:\n\n- If `COVERAGE.md` exists, it is validated — every row needs a valid decision and\n every `OPT-OUT` a reason. A malformed/partial matrix **blocks the seal
|
|
71
|
+
"inline": "# API Coverage Decision Checkpoint\n\n> Full API Coverage by Default — Opt Out, Never Opt In. Fires when a phase\n> integrates an external API / SDK / service. Most non-API phases will not fire\n> it — that is the point.\n\n## Why this exists\n\n\"We integrated the API\" too often silently means \"we integrated whatever the\nfirst use case exercised.\" Every un-built capability is then an invisible hole,\ndiscovered later by a user who reasonably expected it to work. The phase sealed\ngreen because its tasks completed; nobody decided the gaps were acceptable,\nbecause nobody enumerated them. This checkpoint makes the surface **visible and\ndecided** before the phase can seal.\n\n## Detect whether this phase integrates an external API\n\nThe detector is a deterministic scan over the phase scope. It strips fenced\ncode blocks first, so a trigger term inside a code snippet does not fire. It\nreturns a typed result: `{ detected, signals[], terms }`. Run it on the phase\nscope (the concatenation of this phase's ROADMAP section + the PLAN body):\n\n```bash\nSCOPE=\"$(cat \"${PHASE_DIR}\"/*-PLAN.md 2>/dev/null) $(gsd_run query roadmap.get-phase \"${PHASE}\" 2>/dev/null || true)\"\nAPI_COVERAGE_JSON=$(printf '%s' \"$SCOPE\" | node gsd-core/bin/lib/api-coverage.cjs --json 2>/dev/null || echo '{\"detected\":false,\"signals\":[]}')\n```\n\nRead `API_COVERAGE_JSON.detected`. Act on it only — do **not** pattern-match the\nprose yourself.\n\n**If `detected` is `false`:** this phase does not integrate an external API. Skip\nthe checkpoint entirely and continue planning. Do not raise it with the user.\n\n**If `detected` is `true`:** an external-API integration is in scope. You MUST\nproduce a **coverage matrix** before the plan is finalized.\n\n**If `detected` is `true` but the phase genuinely integrates no external API**\n(the detector is deterministic, not infallible — confirm by re-reading the phase\nscope, not by preference): do NOT fabricate a matrix row for a capability that\ndoes not exist. Write a reasoned declaration to `${PHASE_DIR}/COVERAGE.md`\ninstead:\n\n```markdown\nNo external API integration: <one-line reason — what the phase touches instead>.\n```\n\nThe reason is required, exactly like an `OPT-OUT` reason. The seal-time gate\naccepts this declaration in place of a matrix.\n\n## Produce the coverage matrix\n\nEnumerate the external API's full **capability surface** — the verb/endpoint/method\nlist (e.g. for a music service: `search`, `play`, `pause`, `skip`, `set_volume`,\n`get_playlist`, `create_playlist`, `add_to_playlist`, …). For each capability\nrecord a decision, starting from **full coverage** as the default:\n\n| capability | decision | reason |\n|---|---|---|\n| `<capability-id>` | `INTEGRATE` \\| `OPT-OUT` | `<one-line reason if OPT-OUT>` |\n\nRules:\n\n- **`INTEGRATE` is the default.** Every capability starts as INTEGRATE; the\n matrix is the *subtraction record*.\n- **Every `OPT-OUT` MUST carry a one-line reason** (`not needed`, `not needed\n yet`, `explicitly out of scope`, …). An opt-out without a reason is an\n un-decided hole — the exact failure mode this gate exists to close.\n- **A second integration against the same need** (e.g. a second platform for the\n same capability) starts from the **same full-coverage baseline** as the first.\n Do not carry over the first integration's opt-outs silently — re-decide each\n capability for the new surface, so a first-class/fallback asymmetry cannot\n accumulate.\n\nWrite the matrix to `${PHASE_DIR}/COVERAGE.md` (canonical markdown-table form):\n\n```markdown\n# API Coverage — <service>\n\n> Full coverage by default. Opt-outs are explicit, reasoned decisions.\n\n| capability | decision | reason |\n|---|---|---|\n| search | INTEGRATE | |\n| playlists | INTEGRATE | |\n| skip | OPT-OUT | not needed yet — tracked for follow-up phase |\n```\n\nA fenced ` ```coverage ` JSON block is also accepted for machine-generated\nmatrices; the markdown table is preferred (human-editable, diff-friendly).\n\n## The seal-time gate\n\nThis checkpoint is enforced. At `verify:pre` the `api-coverage.verify-pre` gate\nruns `check api-coverage.verify-pre <phase-dir>`:\n\n- If `COVERAGE.md` exists, it is validated — every row needs a valid decision and\n every `OPT-OUT` a reason. A malformed/partial matrix **blocks the seal**. A\n reasoned `No external API integration: …` declaration (and no rows) passes.\n- If `COVERAGE.md` is absent, the detector runs again over the phase scope. If a\n strong external-API-integration signal is found, the seal is **blocked** until a\n matrix is produced. If no signal is found, the phase is treated as a non-API\n phase and the seal proceeds.\n\nSo: an API-integrating phase cannot seal without a decided matrix. Produce it at\nplan time; do not leave it for seal time.\n\n## Tuning the vocabulary (optional)\n\nThe trigger vocabulary is a curated, additive-only set in\n`gsd-core/bin/lib/api-coverage.cjs` (`DEFAULT_API_COVERAGE_TERMS`). To widen it\nfor a project, override at the call site:\n\n```bash\nprintf '%s' \"$SCOPE\" | node gsd-core/bin/lib/api-coverage.cjs --json \\\n --verbs integrate,wrap,connect,embed --nouns api,sdk,rest,grpc,webhook,plugin\n```\n\nThe whole checkpoint is toggleable via `workflow.api_coverage_gate` in\n`.planning/config.json`.\n"
|
|
72
72
|
},
|
|
73
73
|
"produces": [
|
|
74
74
|
"COVERAGE.md"
|
|
@@ -95,7 +95,7 @@ const capabilities = {
|
|
|
95
95
|
"antigravity": {
|
|
96
96
|
"id": "antigravity",
|
|
97
97
|
"role": "runtime",
|
|
98
|
-
"version": "1.
|
|
98
|
+
"version": "1.8.0",
|
|
99
99
|
"title": "Antigravity",
|
|
100
100
|
"description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; flat skill layout; tier-1 support.",
|
|
101
101
|
"tier": "core",
|
|
@@ -196,7 +196,7 @@ const capabilities = {
|
|
|
196
196
|
"assumption-delta": {
|
|
197
197
|
"id": "assumption-delta",
|
|
198
198
|
"role": "feature",
|
|
199
|
-
"version": "1.
|
|
199
|
+
"version": "1.8.0",
|
|
200
200
|
"title": "Assumption-delta architecture checkpoint",
|
|
201
201
|
"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.",
|
|
202
202
|
"tier": "full",
|
|
@@ -242,7 +242,7 @@ const capabilities = {
|
|
|
242
242
|
"audit": {
|
|
243
243
|
"id": "audit",
|
|
244
244
|
"role": "feature",
|
|
245
|
-
"version": "1.
|
|
245
|
+
"version": "1.8.0",
|
|
246
246
|
"title": "Audit",
|
|
247
247
|
"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).",
|
|
248
248
|
"tier": "full",
|
|
@@ -279,7 +279,7 @@ const capabilities = {
|
|
|
279
279
|
"augment": {
|
|
280
280
|
"id": "augment",
|
|
281
281
|
"role": "runtime",
|
|
282
|
-
"version": "1.
|
|
282
|
+
"version": "1.8.0",
|
|
283
283
|
"title": "Augment Code",
|
|
284
284
|
"description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
285
285
|
"tier": "core",
|
|
@@ -383,10 +383,56 @@ const capabilities = {
|
|
|
383
383
|
}
|
|
384
384
|
}
|
|
385
385
|
},
|
|
386
|
+
"broken-windows": {
|
|
387
|
+
"id": "broken-windows",
|
|
388
|
+
"role": "feature",
|
|
389
|
+
"version": "1.8.0",
|
|
390
|
+
"title": "Broken-windows ledger",
|
|
391
|
+
"description": "Cross-phase defect register accumulating stubs, TODOs, skipped tests, unrun verifies, and unmet truths into .planning/WINDOWS.md. Blocks /gsd-ship while any window is open unless explicitly waived with a recorded reason. Operationalizes GSD's no-defer discipline as a tracked, enforced artifact (issue #1950).",
|
|
392
|
+
"tier": "full",
|
|
393
|
+
"requires": [],
|
|
394
|
+
"engines": {
|
|
395
|
+
"gsd": ">=1.7.0"
|
|
396
|
+
},
|
|
397
|
+
"runtimeCompat": {
|
|
398
|
+
"supported": [
|
|
399
|
+
"*"
|
|
400
|
+
],
|
|
401
|
+
"unsupported": []
|
|
402
|
+
},
|
|
403
|
+
"skills": [],
|
|
404
|
+
"agents": [],
|
|
405
|
+
"hooks": [],
|
|
406
|
+
"config": {
|
|
407
|
+
"workflow.windows_enforce": {
|
|
408
|
+
"type": "boolean",
|
|
409
|
+
"default": false,
|
|
410
|
+
"description": "Enable the blocking ship:pre gate for the broken-windows ledger. When true (opt-in), /gsd-ship blocks while .planning/WINDOWS.md has any open entry. When false (default), windows are still tracked (the executor and verifier still populate WINDOWS.md via gsd-tools windows append) but ship does not block — teams can adopt tracking before enforcement. Issue #1950."
|
|
411
|
+
}
|
|
412
|
+
},
|
|
413
|
+
"steps": [],
|
|
414
|
+
"contributions": [],
|
|
415
|
+
"gates": [
|
|
416
|
+
{
|
|
417
|
+
"point": "ship:pre",
|
|
418
|
+
"check": {
|
|
419
|
+
"predicate": {
|
|
420
|
+
"kind": "artifact-frontmatter-equals",
|
|
421
|
+
"artifact": "WINDOWS.md",
|
|
422
|
+
"field": "open_count",
|
|
423
|
+
"equals": 0
|
|
424
|
+
}
|
|
425
|
+
},
|
|
426
|
+
"when": "workflow.windows_enforce",
|
|
427
|
+
"blocking": true,
|
|
428
|
+
"onError": "halt"
|
|
429
|
+
}
|
|
430
|
+
]
|
|
431
|
+
},
|
|
386
432
|
"claude": {
|
|
387
433
|
"id": "claude",
|
|
388
434
|
"role": "runtime",
|
|
389
|
-
"version": "1.
|
|
435
|
+
"version": "1.8.0",
|
|
390
436
|
"title": "Claude Code",
|
|
391
437
|
"description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
|
|
392
438
|
"tier": "core",
|
|
@@ -491,7 +537,7 @@ const capabilities = {
|
|
|
491
537
|
"claude-orchestration": {
|
|
492
538
|
"id": "claude-orchestration",
|
|
493
539
|
"role": "feature",
|
|
494
|
-
"version": "1.
|
|
540
|
+
"version": "1.8.0",
|
|
495
541
|
"title": "Claude orchestration (Workflow backend)",
|
|
496
542
|
"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.",
|
|
497
543
|
"tier": "full",
|
|
@@ -515,7 +561,8 @@ const capabilities = {
|
|
|
515
561
|
"router": "routeClaudeOrchestrationCommand",
|
|
516
562
|
"subcommands": [
|
|
517
563
|
"detect-backend",
|
|
518
|
-
"emit-workflow"
|
|
564
|
+
"emit-workflow",
|
|
565
|
+
"resolve-wave-dispatch"
|
|
519
566
|
]
|
|
520
567
|
}
|
|
521
568
|
],
|
|
@@ -545,11 +592,11 @@ const capabilities = {
|
|
|
545
592
|
"steps": [],
|
|
546
593
|
"contributions": [
|
|
547
594
|
{
|
|
548
|
-
"point": "execute:wave:
|
|
595
|
+
"point": "execute:wave:pre",
|
|
549
596
|
"into": "executor",
|
|
550
597
|
"fragment": {
|
|
551
|
-
"path": "fragments/execute-wave-
|
|
552
|
-
"inline": "# Claude orchestration — Workflow execution backend (BETA)\n\n> Injected at `execute:wave:
|
|
598
|
+
"path": "fragments/execute-wave-pre.md",
|
|
599
|
+
"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 ${AGENT_SDK_VERSION:+--agent-sdk-version \"$AGENT_SDK_VERSION\"} \\\n --phase-dir \"$PHASE_DIR\" --raw\n```\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`, `$AGENT_SDK_VERSION`)\n\nThese are NOT pre-existing execute-phase.md variables — the orchestrator builds\nthem at this step, from data it already has in-context from `discover_and_group_plans`\n(the `PLAN_INDEX` JSON) and step 2.5 (the per-plan `USE_WORKTREES_FOR_PLAN` decision):\n\n1. **`$PHASE_DIR`** — reuse `{phase_dir}` from the `INIT` bundle (already loaded\n in the `initialize` step). No new value needed.\n\n2. **`$PHASE_RUN_ID`** — a stable identifier for THIS phase-execution attempt, so\n `resumeFromRunId` can resume an interrupted run without re-dispatching plans\n the Workflow tool already completed. Construct it deterministically —\n `execute-{phase_number}-{phase_slug}` — from `INIT`'s `phase_number`/`phase_slug`\n (both are already validated identifiers used elsewhere in this workflow, so\n they satisfy `emitWorkflowScript`'s `isScriptableIdentifier` check). Do NOT\n mint a new random id per wave — the SAME `$PHASE_RUN_ID` is reused for every\n wave in the phase so the Workflow tool can correctly track cross-wave resume\n state.\n\n3. **`$WAVE_MANIFEST_PATH`** — a fresh temp file for THIS wave's manifest (one\n wave = one `waves` array with a single entry, matching the wave-by-wave\n dispatch loop; do not batch multiple waves into one manifest — waves are\n dispatched in wave order, not all at once):\n\n ```bash\n WAVE_MANIFEST_PATH=$(mktemp \"${TMPDIR:-/tmp}/gsd-wave-dispatch-XXXXXX\") && mv \"$WAVE_MANIFEST_PATH\" \"$WAVE_MANIFEST_PATH.json\" && WAVE_MANIFEST_PATH=\"$WAVE_MANIFEST_PATH.json\"\n ```\n\n Then **use the Write tool** (not a bash/jq pipeline — the orchestrator already\n has every field parsed in-context) to write the manifest JSON to\n `$WAVE_MANIFEST_PATH`:\n\n ```json\n {\n \"waves\": [\n {\n \"id\": \"wave-{N}\",\n \"plans\": [\n {\n \"id\": \"{plan_id}\",\n \"brief\": \"{the SAME <objective>...<success_criteria> prompt block step 3 builds for this plan's inline Agent() call}\",\n \"files_modified\": [\"{from PLAN_INDEX.plans[].files_modified for this plan}\"],\n \"use_worktree\": {true unless step 2.5 set USE_WORKTREES_FOR_PLAN=false for this plan}\n }\n ]\n }\n ]\n }\n ```\n\n - **`id`** — the plan id from `PLAN_INDEX`, e.g. `\"01-01\"`.\n - **`brief`** — MUST carry the same task content as step 3's inline `Agent()`\n prompt (the `<objective>`/`<execution_context>`/`<files_to_read>`/\n `<success_criteria>` block, with `{plan_number}`/`{phase_number}`/\n `{phase_name}` substituted) — a short summary here would NOT reproduce\n step 3's behavior and would violate the \"identical artifacts\" contract.\n - **`files_modified`** — copy verbatim from the plan's `PLAN_INDEX` entry.\n - **`use_worktree`** — `true` for every plan UNLESS step 2.5's per-plan\n worktree gate (`execute-phase/steps/per-plan-worktree-gate.md`) set\n `USE_WORKTREES_FOR_PLAN=false` for that plan (submodule-touching plan, or\n project-level `USE_WORKTREES=false`) — in which case pass `false` here so\n `emitWorkflowScript` omits `isolation: \"worktree\"` for that plan (#2772 /\n #2285 finding 1). **Never** hardcode `true` — that would force worktree\n isolation on a plan the inline path explicitly keeps out of worktrees.\n\n4. **`$AGENT_SDK_VERSION`** — see below; OMIT when unknown (fails closed).\n\n**Agent SDK version:** the orchestrator has no scriptable (bash-computable) way\nto introspect the live Agent SDK version. When it can determine the version\n(e.g. from a host-exposed value it can read directly), pass\n`--agent-sdk-version`. When it cannot, OMIT the flag — `resolveWaveDispatch`'s\ngate 5 (`agent_sdk_version_unknown`) then fails closed to `inline` by design;\nthis is not a bug, it is the same fail-closed posture documented above applied\nto a real absence of information.\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`** — wired to the phase run id, so an interrupted phase\n resumes without re-running completed plans.\n\nThe orchestrator still runs steps 4–5.8 (wait for completion, worktree cleanup,\npost-merge gate, tracking update) exactly as it does for inline dispatch — the\nWorkflow backend only replaces HOW agents are spawned for this wave, not what\nhappens after they return.\n\n**If `backend == \"inline\"`** (any gate miss, or `resolve-wave-dispatch` itself\nunavailable/erroring): proceed to step 3's standard per-message `Agent()`\ndispatch — the default, byte-identical-to-today path. `onError: skip` on this\ncontribution means a `resolve-wave-dispatch` command failure is treated exactly\nlike an `inline` result, never as a fatal wave error.\n\n## Fallback contract\n\nDetection is fail-closed end-to-end: capability disabled, non-Claude runtime,\n`execution_backend:\"inline\"`, missing/incapable host descriptor, unknown or\nbelow-floor Agent SDK version, or an `emitWorkflowScript` failure on a malformed\nwave manifest — ANY of these degrades to `backend:\"inline\"` and execute-phase's\nstandard inline dispatch (step 3) runs unmodified. The Workflow backend never\npartially activates; the executor MUST NOT assume parallelism, a shared budget,\nor resume-from-run-id semantics when `backend == \"inline\"`.\n"
|
|
553
600
|
},
|
|
554
601
|
"produces": [],
|
|
555
602
|
"consumes": [
|
|
@@ -578,7 +625,7 @@ const capabilities = {
|
|
|
578
625
|
"cline": {
|
|
579
626
|
"id": "cline",
|
|
580
627
|
"role": "runtime",
|
|
581
|
-
"version": "1.
|
|
628
|
+
"version": "1.8.0",
|
|
582
629
|
"title": "Cline",
|
|
583
630
|
"description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
|
|
584
631
|
"tier": "core",
|
|
@@ -647,7 +694,7 @@ const capabilities = {
|
|
|
647
694
|
"code-review": {
|
|
648
695
|
"id": "code-review",
|
|
649
696
|
"role": "feature",
|
|
650
|
-
"version": "1.
|
|
697
|
+
"version": "1.8.0",
|
|
651
698
|
"title": "Code review",
|
|
652
699
|
"description": "Source-file code review and review-fix workflow support for completed execution work.",
|
|
653
700
|
"tier": "full",
|
|
@@ -708,7 +755,7 @@ const capabilities = {
|
|
|
708
755
|
"codebuddy": {
|
|
709
756
|
"id": "codebuddy",
|
|
710
757
|
"role": "runtime",
|
|
711
|
-
"version": "1.
|
|
758
|
+
"version": "1.8.0",
|
|
712
759
|
"title": "CodeBuddy",
|
|
713
760
|
"description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
714
761
|
"tier": "core",
|
|
@@ -819,7 +866,7 @@ const capabilities = {
|
|
|
819
866
|
"codex": {
|
|
820
867
|
"id": "codex",
|
|
821
868
|
"role": "runtime",
|
|
822
|
-
"version": "1.
|
|
869
|
+
"version": "1.8.0",
|
|
823
870
|
"title": "OpenAI Codex CLI",
|
|
824
871
|
"description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
|
|
825
872
|
"tier": "core",
|
|
@@ -904,7 +951,7 @@ const capabilities = {
|
|
|
904
951
|
"copilot": {
|
|
905
952
|
"id": "copilot",
|
|
906
953
|
"role": "runtime",
|
|
907
|
-
"version": "1.
|
|
954
|
+
"version": "1.8.0",
|
|
908
955
|
"title": "GitHub Copilot",
|
|
909
956
|
"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.",
|
|
910
957
|
"tier": "core",
|
|
@@ -997,7 +1044,7 @@ const capabilities = {
|
|
|
997
1044
|
"cursor": {
|
|
998
1045
|
"id": "cursor",
|
|
999
1046
|
"role": "runtime",
|
|
1000
|
-
"version": "1.
|
|
1047
|
+
"version": "1.8.0",
|
|
1001
1048
|
"title": "Cursor",
|
|
1002
1049
|
"description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
|
|
1003
1050
|
"tier": "core",
|
|
@@ -1118,7 +1165,7 @@ const capabilities = {
|
|
|
1118
1165
|
"drift": {
|
|
1119
1166
|
"id": "drift",
|
|
1120
1167
|
"role": "feature",
|
|
1121
|
-
"version": "1.
|
|
1168
|
+
"version": "1.8.0",
|
|
1122
1169
|
"title": "Drift detection gates",
|
|
1123
1170
|
"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.",
|
|
1124
1171
|
"tier": "full",
|
|
@@ -1196,7 +1243,7 @@ const capabilities = {
|
|
|
1196
1243
|
"external-job": {
|
|
1197
1244
|
"id": "external-job",
|
|
1198
1245
|
"role": "feature",
|
|
1199
|
-
"version": "1.
|
|
1246
|
+
"version": "1.8.0",
|
|
1200
1247
|
"title": "Async external-job scheduler adapter",
|
|
1201
1248
|
"description": "Default-off producer of the async external-job manifest (#1164). At execute:wave:post an executor can externalize long-running compute (SLURM first, scheduler-pluggable), commit a .planning/async-jobs/<job>.json manifest, defer SUMMARY.md, and return external_job_waiting. The core loop (#1165) consumes the manifest; this capability is the only thing that writes it. NOTE on contribution point: #1164 specifies execute:wave:pre, but execute-phase.md only dispatches execute:wave:post today (wave:pre is declared in the loop host contract but not rendered); wiring wave:pre dispatch is a core-loop change #1164 explicitly puts out of scope, so this capability registers at wave:post and the executor honors the runtime_budget classification guidance before running any tagged task. The adapter (scripts/slurm-adapter.cjs) reads external_job.submit_timeout_ms / poll_timeout_ms / artifact_dir through the canonical capability-config seam (env override > config > registry default).",
|
|
1202
1249
|
"tier": "full",
|
|
@@ -1279,7 +1326,7 @@ const capabilities = {
|
|
|
1279
1326
|
"gap-analysis": {
|
|
1280
1327
|
"id": "gap-analysis",
|
|
1281
1328
|
"role": "feature",
|
|
1282
|
-
"version": "1.
|
|
1329
|
+
"version": "1.8.0",
|
|
1283
1330
|
"title": "Post-planning gap analysis",
|
|
1284
1331
|
"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.",
|
|
1285
1332
|
"tier": "standard",
|
|
@@ -1320,7 +1367,7 @@ const capabilities = {
|
|
|
1320
1367
|
"graphify": {
|
|
1321
1368
|
"id": "graphify",
|
|
1322
1369
|
"role": "feature",
|
|
1323
|
-
"version": "1.
|
|
1370
|
+
"version": "1.8.0",
|
|
1324
1371
|
"title": "Knowledge graph",
|
|
1325
1372
|
"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.",
|
|
1326
1373
|
"tier": "full",
|
|
@@ -1361,7 +1408,7 @@ const capabilities = {
|
|
|
1361
1408
|
"hermes": {
|
|
1362
1409
|
"id": "hermes",
|
|
1363
1410
|
"role": "runtime",
|
|
1364
|
-
"version": "1.
|
|
1411
|
+
"version": "1.8.0",
|
|
1365
1412
|
"title": "Hermes Agent",
|
|
1366
1413
|
"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.",
|
|
1367
1414
|
"tier": "core",
|
|
@@ -1450,7 +1497,7 @@ const capabilities = {
|
|
|
1450
1497
|
"intel": {
|
|
1451
1498
|
"id": "intel",
|
|
1452
1499
|
"role": "feature",
|
|
1453
|
-
"version": "1.
|
|
1500
|
+
"version": "1.8.0",
|
|
1454
1501
|
"title": "Codebase intelligence",
|
|
1455
1502
|
"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`.",
|
|
1456
1503
|
"tier": "full",
|
|
@@ -1502,7 +1549,7 @@ const capabilities = {
|
|
|
1502
1549
|
"kilo": {
|
|
1503
1550
|
"id": "kilo",
|
|
1504
1551
|
"role": "runtime",
|
|
1505
|
-
"version": "1.
|
|
1552
|
+
"version": "1.8.0",
|
|
1506
1553
|
"title": "Kilo Code",
|
|
1507
1554
|
"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.",
|
|
1508
1555
|
"tier": "core",
|
|
@@ -1602,15 +1649,14 @@ const capabilities = {
|
|
|
1602
1649
|
"file": "gsd-core.js",
|
|
1603
1650
|
"source": ".kilo/plugins/gsd-core.js"
|
|
1604
1651
|
},
|
|
1605
|
-
"skipUpdateBannerCommand": true
|
|
1606
|
-
"skipSharedHooksInstall": true
|
|
1652
|
+
"skipUpdateBannerCommand": true
|
|
1607
1653
|
}
|
|
1608
1654
|
}
|
|
1609
1655
|
},
|
|
1610
1656
|
"kimi": {
|
|
1611
1657
|
"id": "kimi",
|
|
1612
1658
|
"role": "runtime",
|
|
1613
|
-
"version": "1.
|
|
1659
|
+
"version": "1.8.0",
|
|
1614
1660
|
"title": "Kimi CLI",
|
|
1615
1661
|
"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.",
|
|
1616
1662
|
"tier": "core",
|
|
@@ -1698,7 +1744,7 @@ const capabilities = {
|
|
|
1698
1744
|
"mempalace": {
|
|
1699
1745
|
"id": "mempalace",
|
|
1700
1746
|
"role": "feature",
|
|
1701
|
-
"version": "1.
|
|
1747
|
+
"version": "1.8.0",
|
|
1702
1748
|
"title": "MemPalace memory",
|
|
1703
1749
|
"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.",
|
|
1704
1750
|
"tier": "full",
|
|
@@ -1872,7 +1918,7 @@ const capabilities = {
|
|
|
1872
1918
|
"nyquist": {
|
|
1873
1919
|
"id": "nyquist",
|
|
1874
1920
|
"role": "feature",
|
|
1875
|
-
"version": "1.
|
|
1921
|
+
"version": "1.8.0",
|
|
1876
1922
|
"title": "Nyquist validation",
|
|
1877
1923
|
"description": "Validation coverage audit that maps executed work back to tests and manual-only evidence.",
|
|
1878
1924
|
"tier": "full",
|
|
@@ -1922,9 +1968,9 @@ const capabilities = {
|
|
|
1922
1968
|
"opencode": {
|
|
1923
1969
|
"id": "opencode",
|
|
1924
1970
|
"role": "runtime",
|
|
1925
|
-
"version": "1.
|
|
1971
|
+
"version": "1.8.0",
|
|
1926
1972
|
"title": "OpenCode",
|
|
1927
|
-
"description": "OpenCode — XDG-based config dir; flat
|
|
1973
|
+
"description": "OpenCode — XDG-based config dir; flat commands/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
|
|
1928
1974
|
"tier": "core",
|
|
1929
1975
|
"requires": [],
|
|
1930
1976
|
"engines": {
|
|
@@ -1946,7 +1992,7 @@ const capabilities = {
|
|
|
1946
1992
|
"global": [
|
|
1947
1993
|
{
|
|
1948
1994
|
"kind": "commands",
|
|
1949
|
-
"destSubpath": "
|
|
1995
|
+
"destSubpath": "commands",
|
|
1950
1996
|
"prefix": "gsd-",
|
|
1951
1997
|
"nesting": "flat",
|
|
1952
1998
|
"recursive": false,
|
|
@@ -1964,7 +2010,7 @@ const capabilities = {
|
|
|
1964
2010
|
"local": [
|
|
1965
2011
|
{
|
|
1966
2012
|
"kind": "commands",
|
|
1967
|
-
"destSubpath": "
|
|
2013
|
+
"destSubpath": "commands",
|
|
1968
2014
|
"prefix": "gsd-",
|
|
1969
2015
|
"nesting": "flat",
|
|
1970
2016
|
"recursive": false,
|
|
@@ -2009,7 +2055,7 @@ const capabilities = {
|
|
|
2009
2055
|
"hostBehaviors": {
|
|
2010
2056
|
"reapplyCommand": "/gsd-update --reapply",
|
|
2011
2057
|
"attributionConfigResolver": "opencode",
|
|
2012
|
-
"flatCommandDir": "
|
|
2058
|
+
"flatCommandDir": "commands",
|
|
2013
2059
|
"combinedFamilyInstall": true,
|
|
2014
2060
|
"frontmatterDialect": "opencode",
|
|
2015
2061
|
"nativePlugin": {
|
|
@@ -2028,7 +2074,7 @@ const capabilities = {
|
|
|
2028
2074
|
"pattern-mapper": {
|
|
2029
2075
|
"id": "pattern-mapper",
|
|
2030
2076
|
"role": "feature",
|
|
2031
|
-
"version": "1.
|
|
2077
|
+
"version": "1.8.0",
|
|
2032
2078
|
"title": "Pattern mapping",
|
|
2033
2079
|
"description": "Optional codebase-pattern mapping before planning; owns the pattern mapper agent and workflow.pattern_mapper activation key.",
|
|
2034
2080
|
"tier": "full",
|
|
@@ -2082,9 +2128,9 @@ const capabilities = {
|
|
|
2082
2128
|
"pi": {
|
|
2083
2129
|
"id": "pi",
|
|
2084
2130
|
"role": "runtime",
|
|
2085
|
-
"version": "1.
|
|
2131
|
+
"version": "1.8.0",
|
|
2086
2132
|
"title": "pi",
|
|
2087
|
-
"description": "pi (pi.dev) — bun-runtime programmatic-CLI; TS ExtensionAPI (registerCommand/registerTool/registerProvider/pi.on); single native-extension file at ~/.pi/agent/extensions/gsd.cjs; no shared-settings hook surface; tier-2 support.",
|
|
2133
|
+
"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.",
|
|
2088
2134
|
"tier": "core",
|
|
2089
2135
|
"requires": [],
|
|
2090
2136
|
"engines": {
|
|
@@ -2132,7 +2178,7 @@ const capabilities = {
|
|
|
2132
2178
|
"hostBehaviors": {
|
|
2133
2179
|
"nativePlugin": {
|
|
2134
2180
|
"dir": "extensions",
|
|
2135
|
-
"file": "gsd.
|
|
2181
|
+
"file": "gsd.js",
|
|
2136
2182
|
"source": "pi/gsd.cjs"
|
|
2137
2183
|
},
|
|
2138
2184
|
"pluginOnlyInstall": true
|
|
@@ -2142,7 +2188,7 @@ const capabilities = {
|
|
|
2142
2188
|
"profile-pipeline": {
|
|
2143
2189
|
"id": "profile-pipeline",
|
|
2144
2190
|
"role": "feature",
|
|
2145
|
-
"version": "1.
|
|
2191
|
+
"version": "1.8.0",
|
|
2146
2192
|
"title": "Developer profiling pipeline",
|
|
2147
2193
|
"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.",
|
|
2148
2194
|
"tier": "full",
|
|
@@ -2219,7 +2265,7 @@ const capabilities = {
|
|
|
2219
2265
|
"qwen": {
|
|
2220
2266
|
"id": "qwen",
|
|
2221
2267
|
"role": "runtime",
|
|
2222
|
-
"version": "1.
|
|
2268
|
+
"version": "1.8.0",
|
|
2223
2269
|
"title": "Qwen Code",
|
|
2224
2270
|
"description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
2225
2271
|
"tier": "core",
|
|
@@ -2324,7 +2370,7 @@ const capabilities = {
|
|
|
2324
2370
|
"research": {
|
|
2325
2371
|
"id": "research",
|
|
2326
2372
|
"role": "feature",
|
|
2327
|
-
"version": "1.
|
|
2373
|
+
"version": "1.8.0",
|
|
2328
2374
|
"title": "Phase research",
|
|
2329
2375
|
"description": "Optional phase research before planning; owns the phase researcher agent and workflow.research activation key.",
|
|
2330
2376
|
"tier": "standard",
|
|
@@ -2376,7 +2422,7 @@ const capabilities = {
|
|
|
2376
2422
|
"schema-gate": {
|
|
2377
2423
|
"id": "schema-gate",
|
|
2378
2424
|
"role": "feature",
|
|
2379
|
-
"version": "1.
|
|
2425
|
+
"version": "1.8.0",
|
|
2380
2426
|
"title": "Schema push detection gate",
|
|
2381
2427
|
"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.",
|
|
2382
2428
|
"tier": "full",
|
|
@@ -2422,7 +2468,7 @@ const capabilities = {
|
|
|
2422
2468
|
"security": {
|
|
2423
2469
|
"id": "security",
|
|
2424
2470
|
"role": "feature",
|
|
2425
|
-
"version": "1.
|
|
2471
|
+
"version": "1.8.0",
|
|
2426
2472
|
"title": "Security enforcement",
|
|
2427
2473
|
"description": "Threat mitigation verification and ship-time security blocking for phases with security enforcement enabled.",
|
|
2428
2474
|
"tier": "full",
|
|
@@ -2521,7 +2567,7 @@ const capabilities = {
|
|
|
2521
2567
|
"tdd": {
|
|
2522
2568
|
"id": "tdd",
|
|
2523
2569
|
"role": "feature",
|
|
2524
|
-
"version": "1.
|
|
2570
|
+
"version": "1.8.0",
|
|
2525
2571
|
"title": "Test-driven development",
|
|
2526
2572
|
"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.",
|
|
2527
2573
|
"tier": "full",
|
|
@@ -2574,7 +2620,7 @@ const capabilities = {
|
|
|
2574
2620
|
"trae": {
|
|
2575
2621
|
"id": "trae",
|
|
2576
2622
|
"role": "runtime",
|
|
2577
|
-
"version": "1.
|
|
2623
|
+
"version": "1.8.0",
|
|
2578
2624
|
"title": "Trae IDE",
|
|
2579
2625
|
"description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
|
|
2580
2626
|
"tier": "core",
|
|
@@ -2664,7 +2710,7 @@ const capabilities = {
|
|
|
2664
2710
|
"ui": {
|
|
2665
2711
|
"id": "ui",
|
|
2666
2712
|
"role": "feature",
|
|
2667
|
-
"version": "1.
|
|
2713
|
+
"version": "1.8.0",
|
|
2668
2714
|
"title": "UI design contracts",
|
|
2669
2715
|
"description": "UI-SPEC design contract + retrospective UI audit for frontend phases.",
|
|
2670
2716
|
"tier": "full",
|
|
@@ -2759,7 +2805,7 @@ const capabilities = {
|
|
|
2759
2805
|
"vscode": {
|
|
2760
2806
|
"id": "vscode",
|
|
2761
2807
|
"role": "runtime",
|
|
2762
|
-
"version": "1.
|
|
2808
|
+
"version": "1.8.0",
|
|
2763
2809
|
"title": "VS Code",
|
|
2764
2810
|
"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).",
|
|
2765
2811
|
"tier": "core",
|
|
@@ -2810,7 +2856,7 @@ const capabilities = {
|
|
|
2810
2856
|
"windsurf": {
|
|
2811
2857
|
"id": "windsurf",
|
|
2812
2858
|
"role": "runtime",
|
|
2813
|
-
"version": "1.
|
|
2859
|
+
"version": "1.8.0",
|
|
2814
2860
|
"title": "Windsurf",
|
|
2815
2861
|
"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.",
|
|
2816
2862
|
"tier": "core",
|
|
@@ -2895,7 +2941,7 @@ const capabilities = {
|
|
|
2895
2941
|
"zcode": {
|
|
2896
2942
|
"id": "zcode",
|
|
2897
2943
|
"role": "runtime",
|
|
2898
|
-
"version": "1.
|
|
2944
|
+
"version": "1.8.0",
|
|
2899
2945
|
"title": "ZCode",
|
|
2900
2946
|
"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.",
|
|
2901
2947
|
"tier": "core",
|
|
@@ -3174,7 +3220,7 @@ const byLoopPoint = {
|
|
|
3174
3220
|
"into": "planner",
|
|
3175
3221
|
"fragment": {
|
|
3176
3222
|
"path": "fragments/api-coverage-plan-pre.md",
|
|
3177
|
-
"inline": "# API Coverage Decision Checkpoint\n\n> Full API Coverage by Default — Opt Out, Never Opt In. Fires when a phase\n> integrates an external API / SDK / service. Most non-API phases will not fire\n> it — that is the point.\n\n## Why this exists\n\n\"We integrated the API\" too often silently means \"we integrated whatever the\nfirst use case exercised.\" Every un-built capability is then an invisible hole,\ndiscovered later by a user who reasonably expected it to work. The phase sealed\ngreen because its tasks completed; nobody decided the gaps were acceptable,\nbecause nobody enumerated them. This checkpoint makes the surface **visible and\ndecided** before the phase can seal.\n\n## Detect whether this phase integrates an external API\n\nThe detector is a deterministic scan over the phase scope. It strips fenced\ncode blocks first, so a trigger term inside a code snippet does not fire. It\nreturns a typed result: `{ detected, signals[], terms }`. Run it on the phase\nscope (the concatenation of this phase's ROADMAP section + the PLAN body):\n\n```bash\nSCOPE=\"$(cat \"${PHASE_DIR}\"/*-PLAN.md 2>/dev/null) $(gsd_run query roadmap.get-phase \"${PHASE}\" 2>/dev/null || true)\"\nAPI_COVERAGE_JSON=$(printf '%s' \"$SCOPE\" | node gsd-core/bin/lib/api-coverage.cjs --json 2>/dev/null || echo '{\"detected\":false,\"signals\":[]}')\n```\n\nRead `API_COVERAGE_JSON.detected`. Act on it only — do **not** pattern-match the\nprose yourself.\n\n**If `detected` is `false`:** this phase does not integrate an external API. Skip\nthe checkpoint entirely and continue planning. Do not raise it with the user.\n\n**If `detected` is `true`:** an external-API integration is in scope. You MUST\nproduce a **coverage matrix** before the plan is finalized.\n\n## Produce the coverage matrix\n\nEnumerate the external API's full **capability surface** — the verb/endpoint/method\nlist (e.g. for a music service: `search`, `play`, `pause`, `skip`, `set_volume`,\n`get_playlist`, `create_playlist`, `add_to_playlist`, …). For each capability\nrecord a decision, starting from **full coverage** as the default:\n\n| capability | decision | reason |\n|---|---|---|\n| `<capability-id>` | `INTEGRATE` \\| `OPT-OUT` | `<one-line reason if OPT-OUT>` |\n\nRules:\n\n- **`INTEGRATE` is the default.** Every capability starts as INTEGRATE; the\n matrix is the *subtraction record*.\n- **Every `OPT-OUT` MUST carry a one-line reason** (`not needed`, `not needed\n yet`, `explicitly out of scope`, …). An opt-out without a reason is an\n un-decided hole — the exact failure mode this gate exists to close.\n- **A second integration against the same need** (e.g. a second platform for the\n same capability) starts from the **same full-coverage baseline** as the first.\n Do not carry over the first integration's opt-outs silently — re-decide each\n capability for the new surface, so a first-class/fallback asymmetry cannot\n accumulate.\n\nWrite the matrix to `${PHASE_DIR}/COVERAGE.md` (canonical markdown-table form):\n\n```markdown\n# API Coverage — <service>\n\n> Full coverage by default. Opt-outs are explicit, reasoned decisions.\n\n| capability | decision | reason |\n|---|---|---|\n| search | INTEGRATE | |\n| playlists | INTEGRATE | |\n| skip | OPT-OUT | not needed yet — tracked for follow-up phase |\n```\n\nA fenced ` ```coverage ` JSON block is also accepted for machine-generated\nmatrices; the markdown table is preferred (human-editable, diff-friendly).\n\n## The seal-time gate\n\nThis checkpoint is enforced. At `verify:pre` the `api-coverage.verify-pre` gate\nruns `check api-coverage.verify-pre <phase-dir>`:\n\n- If `COVERAGE.md` exists, it is validated — every row needs a valid decision and\n every `OPT-OUT` a reason. A malformed/partial matrix **blocks the seal
|
|
3223
|
+
"inline": "# API Coverage Decision Checkpoint\n\n> Full API Coverage by Default — Opt Out, Never Opt In. Fires when a phase\n> integrates an external API / SDK / service. Most non-API phases will not fire\n> it — that is the point.\n\n## Why this exists\n\n\"We integrated the API\" too often silently means \"we integrated whatever the\nfirst use case exercised.\" Every un-built capability is then an invisible hole,\ndiscovered later by a user who reasonably expected it to work. The phase sealed\ngreen because its tasks completed; nobody decided the gaps were acceptable,\nbecause nobody enumerated them. This checkpoint makes the surface **visible and\ndecided** before the phase can seal.\n\n## Detect whether this phase integrates an external API\n\nThe detector is a deterministic scan over the phase scope. It strips fenced\ncode blocks first, so a trigger term inside a code snippet does not fire. It\nreturns a typed result: `{ detected, signals[], terms }`. Run it on the phase\nscope (the concatenation of this phase's ROADMAP section + the PLAN body):\n\n```bash\nSCOPE=\"$(cat \"${PHASE_DIR}\"/*-PLAN.md 2>/dev/null) $(gsd_run query roadmap.get-phase \"${PHASE}\" 2>/dev/null || true)\"\nAPI_COVERAGE_JSON=$(printf '%s' \"$SCOPE\" | node gsd-core/bin/lib/api-coverage.cjs --json 2>/dev/null || echo '{\"detected\":false,\"signals\":[]}')\n```\n\nRead `API_COVERAGE_JSON.detected`. Act on it only — do **not** pattern-match the\nprose yourself.\n\n**If `detected` is `false`:** this phase does not integrate an external API. Skip\nthe checkpoint entirely and continue planning. Do not raise it with the user.\n\n**If `detected` is `true`:** an external-API integration is in scope. You MUST\nproduce a **coverage matrix** before the plan is finalized.\n\n**If `detected` is `true` but the phase genuinely integrates no external API**\n(the detector is deterministic, not infallible — confirm by re-reading the phase\nscope, not by preference): do NOT fabricate a matrix row for a capability that\ndoes not exist. Write a reasoned declaration to `${PHASE_DIR}/COVERAGE.md`\ninstead:\n\n```markdown\nNo external API integration: <one-line reason — what the phase touches instead>.\n```\n\nThe reason is required, exactly like an `OPT-OUT` reason. The seal-time gate\naccepts this declaration in place of a matrix.\n\n## Produce the coverage matrix\n\nEnumerate the external API's full **capability surface** — the verb/endpoint/method\nlist (e.g. for a music service: `search`, `play`, `pause`, `skip`, `set_volume`,\n`get_playlist`, `create_playlist`, `add_to_playlist`, …). For each capability\nrecord a decision, starting from **full coverage** as the default:\n\n| capability | decision | reason |\n|---|---|---|\n| `<capability-id>` | `INTEGRATE` \\| `OPT-OUT` | `<one-line reason if OPT-OUT>` |\n\nRules:\n\n- **`INTEGRATE` is the default.** Every capability starts as INTEGRATE; the\n matrix is the *subtraction record*.\n- **Every `OPT-OUT` MUST carry a one-line reason** (`not needed`, `not needed\n yet`, `explicitly out of scope`, …). An opt-out without a reason is an\n un-decided hole — the exact failure mode this gate exists to close.\n- **A second integration against the same need** (e.g. a second platform for the\n same capability) starts from the **same full-coverage baseline** as the first.\n Do not carry over the first integration's opt-outs silently — re-decide each\n capability for the new surface, so a first-class/fallback asymmetry cannot\n accumulate.\n\nWrite the matrix to `${PHASE_DIR}/COVERAGE.md` (canonical markdown-table form):\n\n```markdown\n# API Coverage — <service>\n\n> Full coverage by default. Opt-outs are explicit, reasoned decisions.\n\n| capability | decision | reason |\n|---|---|---|\n| search | INTEGRATE | |\n| playlists | INTEGRATE | |\n| skip | OPT-OUT | not needed yet — tracked for follow-up phase |\n```\n\nA fenced ` ```coverage ` JSON block is also accepted for machine-generated\nmatrices; the markdown table is preferred (human-editable, diff-friendly).\n\n## The seal-time gate\n\nThis checkpoint is enforced. At `verify:pre` the `api-coverage.verify-pre` gate\nruns `check api-coverage.verify-pre <phase-dir>`:\n\n- If `COVERAGE.md` exists, it is validated — every row needs a valid decision and\n every `OPT-OUT` a reason. A malformed/partial matrix **blocks the seal**. A\n reasoned `No external API integration: …` declaration (and no rows) passes.\n- If `COVERAGE.md` is absent, the detector runs again over the phase scope. If a\n strong external-API-integration signal is found, the seal is **blocked** until a\n matrix is produced. If no signal is found, the phase is treated as a non-API\n phase and the seal proceeds.\n\nSo: an API-integrating phase cannot seal without a decided matrix. Produce it at\nplan time; do not leave it for seal time.\n\n## Tuning the vocabulary (optional)\n\nThe trigger vocabulary is a curated, additive-only set in\n`gsd-core/bin/lib/api-coverage.cjs` (`DEFAULT_API_COVERAGE_TERMS`). To widen it\nfor a project, override at the call site:\n\n```bash\nprintf '%s' \"$SCOPE\" | node gsd-core/bin/lib/api-coverage.cjs --json \\\n --verbs integrate,wrap,connect,embed --nouns api,sdk,rest,grpc,webhook,plugin\n```\n\nThe whole checkpoint is toggleable via `workflow.api_coverage_gate` in\n`.planning/config.json`.\n"
|
|
3178
3224
|
},
|
|
3179
3225
|
"produces": [
|
|
3180
3226
|
"COVERAGE.md"
|
|
@@ -3333,20 +3379,15 @@ const byLoopPoint = {
|
|
|
3333
3379
|
"gates": []
|
|
3334
3380
|
},
|
|
3335
3381
|
"execute:wave:pre": {
|
|
3336
|
-
"steps": [],
|
|
3337
|
-
"contributions": [],
|
|
3338
|
-
"gates": []
|
|
3339
|
-
},
|
|
3340
|
-
"execute:wave:post": {
|
|
3341
3382
|
"steps": [],
|
|
3342
3383
|
"contributions": [
|
|
3343
3384
|
{
|
|
3344
3385
|
"capId": "claude-orchestration",
|
|
3345
|
-
"point": "execute:wave:
|
|
3386
|
+
"point": "execute:wave:pre",
|
|
3346
3387
|
"into": "executor",
|
|
3347
3388
|
"fragment": {
|
|
3348
|
-
"path": "fragments/execute-wave-
|
|
3349
|
-
"inline": "# Claude orchestration — Workflow execution backend (BETA)\n\n> Injected at `execute:wave:
|
|
3389
|
+
"path": "fragments/execute-wave-pre.md",
|
|
3390
|
+
"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 ${AGENT_SDK_VERSION:+--agent-sdk-version \"$AGENT_SDK_VERSION\"} \\\n --phase-dir \"$PHASE_DIR\" --raw\n```\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`, `$AGENT_SDK_VERSION`)\n\nThese are NOT pre-existing execute-phase.md variables — the orchestrator builds\nthem at this step, from data it already has in-context from `discover_and_group_plans`\n(the `PLAN_INDEX` JSON) and step 2.5 (the per-plan `USE_WORKTREES_FOR_PLAN` decision):\n\n1. **`$PHASE_DIR`** — reuse `{phase_dir}` from the `INIT` bundle (already loaded\n in the `initialize` step). No new value needed.\n\n2. **`$PHASE_RUN_ID`** — a stable identifier for THIS phase-execution attempt, so\n `resumeFromRunId` can resume an interrupted run without re-dispatching plans\n the Workflow tool already completed. Construct it deterministically —\n `execute-{phase_number}-{phase_slug}` — from `INIT`'s `phase_number`/`phase_slug`\n (both are already validated identifiers used elsewhere in this workflow, so\n they satisfy `emitWorkflowScript`'s `isScriptableIdentifier` check). Do NOT\n mint a new random id per wave — the SAME `$PHASE_RUN_ID` is reused for every\n wave in the phase so the Workflow tool can correctly track cross-wave resume\n state.\n\n3. **`$WAVE_MANIFEST_PATH`** — a fresh temp file for THIS wave's manifest (one\n wave = one `waves` array with a single entry, matching the wave-by-wave\n dispatch loop; do not batch multiple waves into one manifest — waves are\n dispatched in wave order, not all at once):\n\n ```bash\n WAVE_MANIFEST_PATH=$(mktemp \"${TMPDIR:-/tmp}/gsd-wave-dispatch-XXXXXX\") && mv \"$WAVE_MANIFEST_PATH\" \"$WAVE_MANIFEST_PATH.json\" && WAVE_MANIFEST_PATH=\"$WAVE_MANIFEST_PATH.json\"\n ```\n\n Then **use the Write tool** (not a bash/jq pipeline — the orchestrator already\n has every field parsed in-context) to write the manifest JSON to\n `$WAVE_MANIFEST_PATH`:\n\n ```json\n {\n \"waves\": [\n {\n \"id\": \"wave-{N}\",\n \"plans\": [\n {\n \"id\": \"{plan_id}\",\n \"brief\": \"{the SAME <objective>...<success_criteria> prompt block step 3 builds for this plan's inline Agent() call}\",\n \"files_modified\": [\"{from PLAN_INDEX.plans[].files_modified for this plan}\"],\n \"use_worktree\": {true unless step 2.5 set USE_WORKTREES_FOR_PLAN=false for this plan}\n }\n ]\n }\n ]\n }\n ```\n\n - **`id`** — the plan id from `PLAN_INDEX`, e.g. `\"01-01\"`.\n - **`brief`** — MUST carry the same task content as step 3's inline `Agent()`\n prompt (the `<objective>`/`<execution_context>`/`<files_to_read>`/\n `<success_criteria>` block, with `{plan_number}`/`{phase_number}`/\n `{phase_name}` substituted) — a short summary here would NOT reproduce\n step 3's behavior and would violate the \"identical artifacts\" contract.\n - **`files_modified`** — copy verbatim from the plan's `PLAN_INDEX` entry.\n - **`use_worktree`** — `true` for every plan UNLESS step 2.5's per-plan\n worktree gate (`execute-phase/steps/per-plan-worktree-gate.md`) set\n `USE_WORKTREES_FOR_PLAN=false` for that plan (submodule-touching plan, or\n project-level `USE_WORKTREES=false`) — in which case pass `false` here so\n `emitWorkflowScript` omits `isolation: \"worktree\"` for that plan (#2772 /\n #2285 finding 1). **Never** hardcode `true` — that would force worktree\n isolation on a plan the inline path explicitly keeps out of worktrees.\n\n4. **`$AGENT_SDK_VERSION`** — see below; OMIT when unknown (fails closed).\n\n**Agent SDK version:** the orchestrator has no scriptable (bash-computable) way\nto introspect the live Agent SDK version. When it can determine the version\n(e.g. from a host-exposed value it can read directly), pass\n`--agent-sdk-version`. When it cannot, OMIT the flag — `resolveWaveDispatch`'s\ngate 5 (`agent_sdk_version_unknown`) then fails closed to `inline` by design;\nthis is not a bug, it is the same fail-closed posture documented above applied\nto a real absence of information.\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`** — wired to the phase run id, so an interrupted phase\n resumes without re-running completed plans.\n\nThe orchestrator still runs steps 4–5.8 (wait for completion, worktree cleanup,\npost-merge gate, tracking update) exactly as it does for inline dispatch — the\nWorkflow backend only replaces HOW agents are spawned for this wave, not what\nhappens after they return.\n\n**If `backend == \"inline\"`** (any gate miss, or `resolve-wave-dispatch` itself\nunavailable/erroring): proceed to step 3's standard per-message `Agent()`\ndispatch — the default, byte-identical-to-today path. `onError: skip` on this\ncontribution means a `resolve-wave-dispatch` command failure is treated exactly\nlike an `inline` result, never as a fatal wave error.\n\n## Fallback contract\n\nDetection is fail-closed end-to-end: capability disabled, non-Claude runtime,\n`execution_backend:\"inline\"`, missing/incapable host descriptor, unknown or\nbelow-floor Agent SDK version, or an `emitWorkflowScript` failure on a malformed\nwave manifest — ANY of these degrades to `backend:\"inline\"` and execute-phase's\nstandard inline dispatch (step 3) runs unmodified. The Workflow backend never\npartially activates; the executor MUST NOT assume parallelism, a shared budget,\nor resume-from-run-id semantics when `backend == \"inline\"`.\n"
|
|
3350
3391
|
},
|
|
3351
3392
|
"produces": [],
|
|
3352
3393
|
"consumes": [
|
|
@@ -3354,7 +3395,13 @@ const byLoopPoint = {
|
|
|
3354
3395
|
],
|
|
3355
3396
|
"when": "claude_orchestration.enabled",
|
|
3356
3397
|
"onError": "skip"
|
|
3357
|
-
}
|
|
3398
|
+
}
|
|
3399
|
+
],
|
|
3400
|
+
"gates": []
|
|
3401
|
+
},
|
|
3402
|
+
"execute:wave:post": {
|
|
3403
|
+
"steps": [],
|
|
3404
|
+
"contributions": [
|
|
3358
3405
|
{
|
|
3359
3406
|
"capId": "external-job",
|
|
3360
3407
|
"point": "execute:wave:post",
|
|
@@ -3535,6 +3582,21 @@ const byLoopPoint = {
|
|
|
3535
3582
|
"steps": [],
|
|
3536
3583
|
"contributions": [],
|
|
3537
3584
|
"gates": [
|
|
3585
|
+
{
|
|
3586
|
+
"capId": "broken-windows",
|
|
3587
|
+
"point": "ship:pre",
|
|
3588
|
+
"check": {
|
|
3589
|
+
"predicate": {
|
|
3590
|
+
"kind": "artifact-frontmatter-equals",
|
|
3591
|
+
"artifact": "WINDOWS.md",
|
|
3592
|
+
"field": "open_count",
|
|
3593
|
+
"equals": 0
|
|
3594
|
+
}
|
|
3595
|
+
},
|
|
3596
|
+
"when": "workflow.windows_enforce",
|
|
3597
|
+
"blocking": true,
|
|
3598
|
+
"onError": "halt"
|
|
3599
|
+
},
|
|
3538
3600
|
{
|
|
3539
3601
|
"capId": "security",
|
|
3540
3602
|
"point": "ship:pre",
|
|
@@ -3577,6 +3639,7 @@ const configKeys = {
|
|
|
3577
3639
|
"workflow.ai_integration_phase": "ai-integration",
|
|
3578
3640
|
"workflow.api_coverage_gate": "ai-integration",
|
|
3579
3641
|
"workflow.assumption_delta": "assumption-delta",
|
|
3642
|
+
"workflow.windows_enforce": "broken-windows",
|
|
3580
3643
|
"claude_orchestration.enabled": "claude-orchestration",
|
|
3581
3644
|
"claude_orchestration.execution_backend": "claude-orchestration",
|
|
3582
3645
|
"claude_orchestration.min_agent_sdk_version": "claude-orchestration",
|
|
@@ -3637,6 +3700,12 @@ const configSchema = {
|
|
|
3637
3700
|
"default": true,
|
|
3638
3701
|
"description": "Enable the assumption-delta architecture checkpoint during planning. When a pluralization/optional/chosen signal is detected in the phase scope, the planner is prompted to re-ask whether the primary key / identity model still names the right thing. Advisory (non-blocking)."
|
|
3639
3702
|
},
|
|
3703
|
+
"workflow.windows_enforce": {
|
|
3704
|
+
"owner": "broken-windows",
|
|
3705
|
+
"type": "boolean",
|
|
3706
|
+
"default": false,
|
|
3707
|
+
"description": "Enable the blocking ship:pre gate for the broken-windows ledger. When true (opt-in), /gsd-ship blocks while .planning/WINDOWS.md has any open entry. When false (default), windows are still tracked (the executor and verifier still populate WINDOWS.md via gsd-tools windows append) but ship does not block — teams can adopt tracking before enforcement. Issue #1950."
|
|
3708
|
+
},
|
|
3640
3709
|
"claude_orchestration.enabled": {
|
|
3641
3710
|
"owner": "claude-orchestration",
|
|
3642
3711
|
"type": "boolean",
|
|
@@ -3906,7 +3975,7 @@ const runtimes = {
|
|
|
3906
3975
|
"antigravity": {
|
|
3907
3976
|
"id": "antigravity",
|
|
3908
3977
|
"role": "runtime",
|
|
3909
|
-
"version": "1.
|
|
3978
|
+
"version": "1.8.0",
|
|
3910
3979
|
"title": "Antigravity",
|
|
3911
3980
|
"description": "Google Antigravity IDE — nested under ~/.gemini/antigravity; probed across 1.x and 2.x layouts; Gemini hook event dialect; flat skill layout; tier-1 support.",
|
|
3912
3981
|
"tier": "core",
|
|
@@ -4007,7 +4076,7 @@ const runtimes = {
|
|
|
4007
4076
|
"augment": {
|
|
4008
4077
|
"id": "augment",
|
|
4009
4078
|
"role": "runtime",
|
|
4010
|
-
"version": "1.
|
|
4079
|
+
"version": "1.8.0",
|
|
4011
4080
|
"title": "Augment Code",
|
|
4012
4081
|
"description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
4013
4082
|
"tier": "core",
|
|
@@ -4114,7 +4183,7 @@ const runtimes = {
|
|
|
4114
4183
|
"claude": {
|
|
4115
4184
|
"id": "claude",
|
|
4116
4185
|
"role": "runtime",
|
|
4117
|
-
"version": "1.
|
|
4186
|
+
"version": "1.8.0",
|
|
4118
4187
|
"title": "Claude Code",
|
|
4119
4188
|
"description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
|
|
4120
4189
|
"tier": "core",
|
|
@@ -4219,7 +4288,7 @@ const runtimes = {
|
|
|
4219
4288
|
"cline": {
|
|
4220
4289
|
"id": "cline",
|
|
4221
4290
|
"role": "runtime",
|
|
4222
|
-
"version": "1.
|
|
4291
|
+
"version": "1.8.0",
|
|
4223
4292
|
"title": "Cline",
|
|
4224
4293
|
"description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
|
|
4225
4294
|
"tier": "core",
|
|
@@ -4288,7 +4357,7 @@ const runtimes = {
|
|
|
4288
4357
|
"codebuddy": {
|
|
4289
4358
|
"id": "codebuddy",
|
|
4290
4359
|
"role": "runtime",
|
|
4291
|
-
"version": "1.
|
|
4360
|
+
"version": "1.8.0",
|
|
4292
4361
|
"title": "CodeBuddy",
|
|
4293
4362
|
"description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
4294
4363
|
"tier": "core",
|
|
@@ -4399,7 +4468,7 @@ const runtimes = {
|
|
|
4399
4468
|
"codex": {
|
|
4400
4469
|
"id": "codex",
|
|
4401
4470
|
"role": "runtime",
|
|
4402
|
-
"version": "1.
|
|
4471
|
+
"version": "1.8.0",
|
|
4403
4472
|
"title": "OpenAI Codex CLI",
|
|
4404
4473
|
"description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
|
|
4405
4474
|
"tier": "core",
|
|
@@ -4484,7 +4553,7 @@ const runtimes = {
|
|
|
4484
4553
|
"copilot": {
|
|
4485
4554
|
"id": "copilot",
|
|
4486
4555
|
"role": "runtime",
|
|
4487
|
-
"version": "1.
|
|
4556
|
+
"version": "1.8.0",
|
|
4488
4557
|
"title": "GitHub Copilot",
|
|
4489
4558
|
"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.",
|
|
4490
4559
|
"tier": "core",
|
|
@@ -4577,7 +4646,7 @@ const runtimes = {
|
|
|
4577
4646
|
"cursor": {
|
|
4578
4647
|
"id": "cursor",
|
|
4579
4648
|
"role": "runtime",
|
|
4580
|
-
"version": "1.
|
|
4649
|
+
"version": "1.8.0",
|
|
4581
4650
|
"title": "Cursor",
|
|
4582
4651
|
"description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
|
|
4583
4652
|
"tier": "core",
|
|
@@ -4698,7 +4767,7 @@ const runtimes = {
|
|
|
4698
4767
|
"hermes": {
|
|
4699
4768
|
"id": "hermes",
|
|
4700
4769
|
"role": "runtime",
|
|
4701
|
-
"version": "1.
|
|
4770
|
+
"version": "1.8.0",
|
|
4702
4771
|
"title": "Hermes Agent",
|
|
4703
4772
|
"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.",
|
|
4704
4773
|
"tier": "core",
|
|
@@ -4787,7 +4856,7 @@ const runtimes = {
|
|
|
4787
4856
|
"kilo": {
|
|
4788
4857
|
"id": "kilo",
|
|
4789
4858
|
"role": "runtime",
|
|
4790
|
-
"version": "1.
|
|
4859
|
+
"version": "1.8.0",
|
|
4791
4860
|
"title": "Kilo Code",
|
|
4792
4861
|
"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.",
|
|
4793
4862
|
"tier": "core",
|
|
@@ -4887,15 +4956,14 @@ const runtimes = {
|
|
|
4887
4956
|
"file": "gsd-core.js",
|
|
4888
4957
|
"source": ".kilo/plugins/gsd-core.js"
|
|
4889
4958
|
},
|
|
4890
|
-
"skipUpdateBannerCommand": true
|
|
4891
|
-
"skipSharedHooksInstall": true
|
|
4959
|
+
"skipUpdateBannerCommand": true
|
|
4892
4960
|
}
|
|
4893
4961
|
}
|
|
4894
4962
|
},
|
|
4895
4963
|
"kimi": {
|
|
4896
4964
|
"id": "kimi",
|
|
4897
4965
|
"role": "runtime",
|
|
4898
|
-
"version": "1.
|
|
4966
|
+
"version": "1.8.0",
|
|
4899
4967
|
"title": "Kimi CLI",
|
|
4900
4968
|
"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.",
|
|
4901
4969
|
"tier": "core",
|
|
@@ -4983,9 +5051,9 @@ const runtimes = {
|
|
|
4983
5051
|
"opencode": {
|
|
4984
5052
|
"id": "opencode",
|
|
4985
5053
|
"role": "runtime",
|
|
4986
|
-
"version": "1.
|
|
5054
|
+
"version": "1.8.0",
|
|
4987
5055
|
"title": "OpenCode",
|
|
4988
|
-
"description": "OpenCode — XDG-based config dir; flat
|
|
5056
|
+
"description": "OpenCode — XDG-based config dir; flat commands/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
|
|
4989
5057
|
"tier": "core",
|
|
4990
5058
|
"requires": [],
|
|
4991
5059
|
"engines": {
|
|
@@ -5007,7 +5075,7 @@ const runtimes = {
|
|
|
5007
5075
|
"global": [
|
|
5008
5076
|
{
|
|
5009
5077
|
"kind": "commands",
|
|
5010
|
-
"destSubpath": "
|
|
5078
|
+
"destSubpath": "commands",
|
|
5011
5079
|
"prefix": "gsd-",
|
|
5012
5080
|
"nesting": "flat",
|
|
5013
5081
|
"recursive": false,
|
|
@@ -5025,7 +5093,7 @@ const runtimes = {
|
|
|
5025
5093
|
"local": [
|
|
5026
5094
|
{
|
|
5027
5095
|
"kind": "commands",
|
|
5028
|
-
"destSubpath": "
|
|
5096
|
+
"destSubpath": "commands",
|
|
5029
5097
|
"prefix": "gsd-",
|
|
5030
5098
|
"nesting": "flat",
|
|
5031
5099
|
"recursive": false,
|
|
@@ -5070,7 +5138,7 @@ const runtimes = {
|
|
|
5070
5138
|
"hostBehaviors": {
|
|
5071
5139
|
"reapplyCommand": "/gsd-update --reapply",
|
|
5072
5140
|
"attributionConfigResolver": "opencode",
|
|
5073
|
-
"flatCommandDir": "
|
|
5141
|
+
"flatCommandDir": "commands",
|
|
5074
5142
|
"combinedFamilyInstall": true,
|
|
5075
5143
|
"frontmatterDialect": "opencode",
|
|
5076
5144
|
"nativePlugin": {
|
|
@@ -5089,9 +5157,9 @@ const runtimes = {
|
|
|
5089
5157
|
"pi": {
|
|
5090
5158
|
"id": "pi",
|
|
5091
5159
|
"role": "runtime",
|
|
5092
|
-
"version": "1.
|
|
5160
|
+
"version": "1.8.0",
|
|
5093
5161
|
"title": "pi",
|
|
5094
|
-
"description": "pi (pi.dev) — bun-runtime programmatic-CLI; TS ExtensionAPI (registerCommand/registerTool/registerProvider/pi.on); single native-extension file at ~/.pi/agent/extensions/gsd.cjs; no shared-settings hook surface; tier-2 support.",
|
|
5162
|
+
"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.",
|
|
5095
5163
|
"tier": "core",
|
|
5096
5164
|
"requires": [],
|
|
5097
5165
|
"engines": {
|
|
@@ -5139,7 +5207,7 @@ const runtimes = {
|
|
|
5139
5207
|
"hostBehaviors": {
|
|
5140
5208
|
"nativePlugin": {
|
|
5141
5209
|
"dir": "extensions",
|
|
5142
|
-
"file": "gsd.
|
|
5210
|
+
"file": "gsd.js",
|
|
5143
5211
|
"source": "pi/gsd.cjs"
|
|
5144
5212
|
},
|
|
5145
5213
|
"pluginOnlyInstall": true
|
|
@@ -5149,7 +5217,7 @@ const runtimes = {
|
|
|
5149
5217
|
"qwen": {
|
|
5150
5218
|
"id": "qwen",
|
|
5151
5219
|
"role": "runtime",
|
|
5152
|
-
"version": "1.
|
|
5220
|
+
"version": "1.8.0",
|
|
5153
5221
|
"title": "Qwen Code",
|
|
5154
5222
|
"description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
|
5155
5223
|
"tier": "core",
|
|
@@ -5254,7 +5322,7 @@ const runtimes = {
|
|
|
5254
5322
|
"trae": {
|
|
5255
5323
|
"id": "trae",
|
|
5256
5324
|
"role": "runtime",
|
|
5257
|
-
"version": "1.
|
|
5325
|
+
"version": "1.8.0",
|
|
5258
5326
|
"title": "Trae IDE",
|
|
5259
5327
|
"description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
|
|
5260
5328
|
"tier": "core",
|
|
@@ -5344,7 +5412,7 @@ const runtimes = {
|
|
|
5344
5412
|
"vscode": {
|
|
5345
5413
|
"id": "vscode",
|
|
5346
5414
|
"role": "runtime",
|
|
5347
|
-
"version": "1.
|
|
5415
|
+
"version": "1.8.0",
|
|
5348
5416
|
"title": "VS Code",
|
|
5349
5417
|
"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).",
|
|
5350
5418
|
"tier": "core",
|
|
@@ -5395,7 +5463,7 @@ const runtimes = {
|
|
|
5395
5463
|
"windsurf": {
|
|
5396
5464
|
"id": "windsurf",
|
|
5397
5465
|
"role": "runtime",
|
|
5398
|
-
"version": "1.
|
|
5466
|
+
"version": "1.8.0",
|
|
5399
5467
|
"title": "Windsurf",
|
|
5400
5468
|
"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.",
|
|
5401
5469
|
"tier": "core",
|
|
@@ -5480,7 +5548,7 @@ const runtimes = {
|
|
|
5480
5548
|
"zcode": {
|
|
5481
5549
|
"id": "zcode",
|
|
5482
5550
|
"role": "runtime",
|
|
5483
|
-
"version": "1.
|
|
5551
|
+
"version": "1.8.0",
|
|
5484
5552
|
"title": "ZCode",
|
|
5485
5553
|
"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.",
|
|
5486
5554
|
"tier": "core",
|
|
@@ -5738,6 +5806,7 @@ const _requiresGraph = {
|
|
|
5738
5806
|
"assumption-delta": [],
|
|
5739
5807
|
"audit": [],
|
|
5740
5808
|
"augment": [],
|
|
5809
|
+
"broken-windows": [],
|
|
5741
5810
|
"claude": [],
|
|
5742
5811
|
"claude-orchestration": [],
|
|
5743
5812
|
"cline": [],
|