Add ZCode as a first-party runtime via a declarative capability descriptor (capabilities/zcode/capability.json) with zero hardcoded runtime === 'zcode' branches — exercising the de-hardcoded, data-driven runtime path that 1.7.0 (ADR-1016 / ADR-1239) enables. Descriptor (all axes sourced verbatim from zcode.z.ai docs): - configHome ~/.zcode; nested skills + flat commands/agents; profile-marker install - Claude-shaped skill format reuses convertClaudeCommandToClaudeSkill (no new converter) - hostIntegration: declarative / slash-file / mcp / electron; dispatch background=false (foreground-only per docs); nested+maxDepth undocumented; passive model mode Installer registration (data, not branches): --zcode flag, allRuntimes, runtimeMap, interactive menu, --all list. getGlobalConfigDir + resolveRuntimeArtifactLayout + ALLOWED_CONFIG_RUNTIMES + resolveInstallPlan all derive from the descriptor. Revamped the brittle per-runtime golden-master tests to be count-agnostic, descriptor-derived property tests (1.7.0 makes runtimes pluggable data, so pinning frozen '15 runtime' snapshots is the wrong invariant): getdirname, label-policy, config-adapter-registry (intent + install-plan golden master), capability-registry, host-integration-descriptors (counts derive from curated maps). Adding a runtime descriptor now extends coverage with zero edits to those suites. Welcome banner, --zcode help, supported-runtimes how-to, and the host-integration capability matrix (every axis cited) updated.
4917 lines
170 KiB
JavaScript
4917 lines
170 KiB
JavaScript
'use strict';
|
||
|
||
/**
|
||
* capability-registry.cjs — generated by scripts/gen-capability-registry.cjs
|
||
* DO NOT EDIT BY HAND. Run: node scripts/gen-capability-registry.cjs --write
|
||
* ADR-894 §5 — role-partitioned Capability Registry.
|
||
*/
|
||
|
||
const capabilities = {
|
||
"ai-integration": {
|
||
"id": "ai-integration",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "AI design contract",
|
||
"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.",
|
||
"tier": "full",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [
|
||
"ai-integration-phase"
|
||
],
|
||
"agents": [
|
||
"gsd-framework-selector",
|
||
"gsd-ai-researcher",
|
||
"gsd-domain-researcher",
|
||
"gsd-eval-planner"
|
||
],
|
||
"hooks": [],
|
||
"config": {
|
||
"workflow.ai_integration_phase": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Prompt for an AI-SPEC design contract before planning phases that involve AI systems."
|
||
}
|
||
},
|
||
"steps": [
|
||
{
|
||
"point": "plan:pre",
|
||
"ref": {
|
||
"skill": "ai-integration-phase"
|
||
},
|
||
"produces": [
|
||
"AI-SPEC.md"
|
||
],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "workflow.ai_integration_phase",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"contributions": [],
|
||
"gates": []
|
||
},
|
||
"antigravity": {
|
||
"id": "antigravity",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Antigravity",
|
||
"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.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home-nested",
|
||
"name": "antigravity",
|
||
"parent": ".gemini",
|
||
"env": [
|
||
"ANTIGRAVITY_CONFIG_DIR"
|
||
],
|
||
"probe": [
|
||
"antigravity",
|
||
"antigravity-ide",
|
||
"antigravity-cli"
|
||
],
|
||
"probeExists": "gsd-core/VERSION"
|
||
},
|
||
"localConfigDir": ".agents",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToAntigravitySkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToAntigravitySkill"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "settings-json",
|
||
"hookEvents": "gemini",
|
||
"sandboxTier": "none",
|
||
"supportTier": 1,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": true,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "declarative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": "undocumented",
|
||
"nested": "undocumented",
|
||
"maxDepth": "undocumented",
|
||
"background": true,
|
||
"subagentToolkit": "undocumented",
|
||
"backgroundDispatch": "undocumented"
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "go"
|
||
}
|
||
}
|
||
},
|
||
"assumption-delta": {
|
||
"id": "assumption-delta",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Assumption-delta architecture checkpoint",
|
||
"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.",
|
||
"tier": "full",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [],
|
||
"agents": [],
|
||
"hooks": [],
|
||
"config": {
|
||
"workflow.assumption_delta": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"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)."
|
||
}
|
||
},
|
||
"steps": [],
|
||
"contributions": [
|
||
{
|
||
"point": "plan:pre",
|
||
"into": "planner",
|
||
"fragment": {
|
||
"path": "fragments/plan-pre.md",
|
||
"inline": "# Assumption-Delta Architecture Checkpoint\n\n> Advisory, non-blocking. Fires **only** when the phase scope shows a singular→plural / required→optional / derived→chosen transition. When it fires, it surfaces ONE identity-model question before the plan is finalized. Most phases will not fire it — that is the point.\n\n## Why this exists\n\nMost quietly-imported architectural debt does not come from a missing upfront design phase. It comes at the *seam*: a later phase introduces a second case (a second platform, auth method, tenant, region, source of truth) and nobody re-asks whether the original abstraction still names the right thing. The phase that adds the second case is exactly the 20-minute conversation that prevents an afternoon of later cleanup.\n\n## Run the detector\n\nThe detector is a deterministic scan over the phase scope text. It strips fenced code blocks first, so a trigger word that appears only inside a code snippet does not fire. It returns a typed result: `{ detected, signals[], terms }`. Resolve it through the `assumption-delta scan` query (same phase-section resolver as `roadmap.get-phase`):\n\n```bash\nASSUMPTION_DELTA_JSON=$(gsd_run query assumption-delta scan \"${PHASE}\" --json 2>/dev/null || echo '{\"detected\":false,\"signals\":[],\"terms\":{}}')\n```\n\n> If the phase section cannot be resolved (no `ROADMAP.md` / unknown phase), the query emits `{ \"detected\": false, ... }` — the checkpoint does not fire. Do not block on it.\n>\n> Optional tuning — pass `--terms <comma-list>` to replace the curated pluralization cues for this project (the `optional`/`chosen` cues keep their defaults): `gsd_run query assumption-delta scan \"${PHASE}\" --json --terms second,alternative,fallback`.\n\n## Decision branch\n\nRead `ASSUMPTION_DELTA_JSON`. Act on `detected` only — do **not** pattern-match the human prose.\n\n**If `detected` is `false`:** this phase does not change a core assumption. Skip the checkpoint entirely and continue planning. Do not raise it with the user.\n\n**If `detected` is `true`:** a core assumption may have lost its monopoly. The `signals[]` array tells you which family fired:\n\n| `kind` | What changed | The question to answer |\n|---|---|---|\n| `pluralization` | A second X was introduced where there was one (second platform / auth method / tenant / region / source of truth) | Does the current primary key / identity model still name the right noun? |\n| `optional` | A required / `only` field became optional | Is the field still the right anchor, or has the anchor moved? |\n| `chosen` | A derived value became chosen, or a constant became a parameter | Has a configuration decision become a modeling decision? |\n\nBefore finalizing the plan, answer this for the user and record the decision explicitly:\n\n> **Promote vs. add-alongside.** The usual correct move when a generalization occurs is to **promote** the new general representation to the primary and **demote** the old specific one to a detail of one variant — *not* to add the new one alongside the still-required old one. Adding alongside silently contradicts the generalized intent (a later variant that does not fit the old primary can be stored but never confirmed as a default).\n\nRecord the outcome in the PLAN.md front matter / a `<assumption_delta_decision>` block:\n\n- The **noun** that is now primary (the generalized identity).\n- The **decision**: `promote` | `add-alongside` | `no-change`, with a one-line rationale.\n- If `add-alongside`: call it out as accepted debt and note what would force a later promote.\n\n## Optional companion: an invariant test\n\nWhen `detected` is `true`, suggest (do not require) a contract/invariant test that encodes the now-generalized intent — e.g. *\"every confirmed default round-trips through the primary use-path, for every supported variant.\"* That test goes red the instant a future phase reintroduces the singular assumption, so the regression cannot land silently. If the user accepts, add the test as a task in the plan.\n\n## Tuning the vocabulary (optional)\n\nThe trigger vocabulary is a curated, additive-only set in `gsd-core/bin/lib/assumption-delta.cjs` (`DEFAULT_ASSUMPTION_DELTA_TERMS`). Bare \"or\" is intentionally excluded — it is too common in prose and would make the gate fire constantly. To widen or narrow the cues for a project, override at the call site with `--terms <comma-list>` (replaces the pluralization cues; `optional`/`chosen` keep defaults). The whole checkpoint is toggleable via `workflow.assumption_delta` in `.planning/config.json`.\n\nThis checkpoint is advisory: it informs and records; it never blocks the phase.\n"
|
||
},
|
||
"produces": [],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "workflow.assumption_delta",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"gates": []
|
||
},
|
||
"audit": {
|
||
"id": "audit",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Audit",
|
||
"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).",
|
||
"tier": "full",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [],
|
||
"agents": [],
|
||
"config": {},
|
||
"commands": [
|
||
{
|
||
"family": "audit-uat",
|
||
"module": "audit-command-router.cjs",
|
||
"router": "routeAuditUat"
|
||
},
|
||
{
|
||
"family": "audit-open",
|
||
"module": "audit-command-router.cjs",
|
||
"router": "routeAuditOpen"
|
||
}
|
||
],
|
||
"hooks": [],
|
||
"steps": [],
|
||
"contributions": [],
|
||
"gates": []
|
||
},
|
||
"augment": {
|
||
"id": "augment",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Augment Code",
|
||
"description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".augment",
|
||
"env": [
|
||
"AUGMENT_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".augment",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToAugmentSkill"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToAugmentAgent"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToAugmentSkill"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToAugmentAgent"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "settings-json",
|
||
"hookEvents": "claude",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": true,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "declarative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": "undocumented",
|
||
"maxDepth": "undocumented",
|
||
"background": true,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": "undocumented"
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"claude": {
|
||
"id": "claude",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Claude Code",
|
||
"description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".claude",
|
||
"env": [
|
||
"CLAUDE_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".claude",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClaudeSkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "settings-json",
|
||
"hookEvents": "claude",
|
||
"sandboxTier": "none",
|
||
"supportTier": 1,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": true,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [
|
||
"SubagentStop",
|
||
"Stop",
|
||
"PreCompact",
|
||
"FileChanged"
|
||
],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": true,
|
||
"maxDepth": 5,
|
||
"background": true,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"cline": {
|
||
"id": "cline",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Cline",
|
||
"description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".cline",
|
||
"env": [
|
||
"CLINE_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".cline",
|
||
"configFormat": "markdown-dir",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClineSkill"
|
||
}
|
||
],
|
||
"local": []
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "cline-rules",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "cline-rules",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": false,
|
||
"maxDepth": 1,
|
||
"background": true,
|
||
"subagentToolkit": "read-only",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "active",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"code-review": {
|
||
"id": "code-review",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Code review",
|
||
"description": "Source-file code review and review-fix workflow support for completed execution work.",
|
||
"tier": "full",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [
|
||
"code-review"
|
||
],
|
||
"agents": [
|
||
"gsd-code-reviewer",
|
||
"gsd-code-fixer"
|
||
],
|
||
"hooks": [],
|
||
"config": {
|
||
"workflow.code_review": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable code-review participation in post-execution review flows."
|
||
},
|
||
"workflow.code_review_depth": {
|
||
"type": "enum",
|
||
"values": [
|
||
"quick",
|
||
"standard",
|
||
"deep"
|
||
],
|
||
"default": "standard",
|
||
"description": "Default depth for code review when no --depth override is supplied."
|
||
}
|
||
},
|
||
"steps": [
|
||
{
|
||
"point": "execute:post",
|
||
"ref": {
|
||
"skill": "code-review"
|
||
},
|
||
"produces": [
|
||
"REVIEW.md"
|
||
],
|
||
"consumes": [
|
||
"SUMMARY.md"
|
||
],
|
||
"when": "workflow.code_review",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"contributions": [],
|
||
"gates": []
|
||
},
|
||
"codebuddy": {
|
||
"id": "codebuddy",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "CodeBuddy",
|
||
"description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".codebuddy",
|
||
"env": [
|
||
"CODEBUDDY_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".codebuddy",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCodebuddyCommand"
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCodebuddySkill"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToCodebuddyAgent"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCodebuddyCommand"
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCodebuddySkill"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToCodebuddyAgent"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "settings-json",
|
||
"hookEvents": "claude",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": true,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "declarative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": false,
|
||
"maxDepth": 1,
|
||
"background": true,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"codex": {
|
||
"id": "codex",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "OpenAI Codex CLI",
|
||
"description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".codex",
|
||
"env": [
|
||
"CODEX_HOME"
|
||
]
|
||
},
|
||
"localConfigDir": ".codex",
|
||
"configFormat": "toml",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCodexSkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCodexSkill"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "shell-var",
|
||
"hooksSurface": "codex-hooks-json",
|
||
"hookEvents": "claude",
|
||
"sandboxTier": "codex-agent-sandbox",
|
||
"supportTier": 1,
|
||
"installSurface": "codex-toml",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "declarative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": true,
|
||
"maxDepth": 1,
|
||
"background": true,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": true
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"copilot": {
|
||
"id": "copilot",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "GitHub Copilot",
|
||
"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.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".copilot",
|
||
"env": [
|
||
"COPILOT_CONFIG_DIR",
|
||
"COPILOT_HOME"
|
||
]
|
||
},
|
||
"localConfigDir": ".github",
|
||
"configFormat": "markdown",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCopilotSkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCopilotSkill"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "copilot-inline",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "copilot-instructions",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "declarative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": false,
|
||
"maxDepth": 1,
|
||
"background": true,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "undocumented"
|
||
}
|
||
}
|
||
},
|
||
"cursor": {
|
||
"id": "cursor",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Cursor",
|
||
"description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".cursor",
|
||
"env": [
|
||
"CURSOR_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".cursor",
|
||
"configFormat": "none",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": true,
|
||
"converter": "convertClaudeCommandToCursorSkill"
|
||
},
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCursorCommand"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToCursorAgent"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": true,
|
||
"converter": "convertClaudeCommandToCursorSkill"
|
||
},
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCursorCommand"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToCursorAgent"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "cursor-hooks-json",
|
||
"hookEvents": "claude",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "cursor-hooks-json",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": true,
|
||
"maxDepth": 2,
|
||
"background": true,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": true
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"drift": {
|
||
"id": "drift",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Drift detection gates",
|
||
"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.",
|
||
"tier": "full",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [],
|
||
"agents": [],
|
||
"hooks": [],
|
||
"config": {
|
||
"workflow.drift_threshold": {
|
||
"type": "number",
|
||
"default": 3,
|
||
"description": "Minimum number of new structural elements (directories, barrel exports, migrations, routes) before the codebase drift gate triggers a warn or auto-remap action."
|
||
},
|
||
"workflow.drift_action": {
|
||
"type": "enum",
|
||
"values": [
|
||
"warn",
|
||
"auto-remap"
|
||
],
|
||
"default": "warn",
|
||
"description": "Action taken by the codebase drift gate when the threshold is exceeded: warn (advisory message) or auto-remap (spawn gsd-codebase-mapper agent to refresh STRUCTURE.md)."
|
||
},
|
||
"workflow.schema_drift_gate": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable the drift gates at execute:wave:post. When enabled, the schema drift gate blocks verification if schema-relevant files changed during execution but no database push command was executed; the codebase drift gate (non-blocking) warns when structural additions exceed the drift_threshold."
|
||
},
|
||
"workflow.plan_drift_precheck": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable the non-blocking codebase drift pre-check at plan:pre, before /gsd:plan-phase spawns the planner. When enabled, a stale STRUCTURE.md (structural additions exceeding drift_threshold) is surfaced up front as a warn-only advisory pointing to /gsd:map-codebase; it never blocks planning and never spawns the mapper agent. Separate from schema_drift_gate so autonomous/CI runs can silence the plan-time advisory while keeping the execute:wave:post gates enabled."
|
||
}
|
||
},
|
||
"steps": [],
|
||
"contributions": [],
|
||
"gates": [
|
||
{
|
||
"point": "execute:wave:post",
|
||
"check": {
|
||
"query": "verify.schema-drift"
|
||
},
|
||
"when": "workflow.schema_drift_gate",
|
||
"blocking": true,
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"point": "execute:wave:post",
|
||
"check": {
|
||
"query": "verify.codebase-drift"
|
||
},
|
||
"when": "workflow.schema_drift_gate",
|
||
"blocking": false,
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"point": "plan:pre",
|
||
"check": {
|
||
"query": "verify.codebase-drift"
|
||
},
|
||
"when": "workflow.plan_drift_precheck",
|
||
"blocking": false,
|
||
"onError": "skip"
|
||
}
|
||
]
|
||
},
|
||
"external-job": {
|
||
"id": "external-job",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Async external-job scheduler adapter",
|
||
"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).",
|
||
"tier": "full",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.7.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [],
|
||
"agents": [],
|
||
"hooks": [],
|
||
"config": {
|
||
"external_job.enabled": {
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Master toggle for the async external-job producer capability. Default-off: the core loop consumes manifests whether or not this is on, but no manifest is ever written unless an executor opts in here."
|
||
},
|
||
"external_job.backend": {
|
||
"type": "enum",
|
||
"values": [
|
||
"slurm"
|
||
],
|
||
"default": "slurm",
|
||
"description": "Scheduler backend. SLURM is the first adapter; the field is the pluggability seam for future backends (LSF, PBS, Kubernetes batch). Core never interprets this value."
|
||
},
|
||
"external_job.artifact_dir": {
|
||
"type": "string",
|
||
"default": "Artifacts/jobs",
|
||
"description": "Root for per-job artifact directories (e.g. Artifacts/jobs/<jobid>/). Avoids fixed log paths and hardcoding a cluster/project layout. Surfaced by the adapter (`slurm-adapter.cjs submit` prints the resolved value); override via GSD_EXTERNAL_JOB_ARTIFACT_DIR."
|
||
},
|
||
"external_job.submit_timeout_ms": {
|
||
"type": "number",
|
||
"default": 30000,
|
||
"description": "Hard timeout (ms) for the scheduler submit subprocess (e.g. sbatch). Bounded per CLAUDE.md unbounded-subprocess policy. Read by the adapter (env GSD_SLURM_SUBMIT_TIMEOUT_MS overrides)."
|
||
},
|
||
"external_job.poll_timeout_ms": {
|
||
"type": "number",
|
||
"default": 15000,
|
||
"description": "Hard timeout (ms) for the scheduler poll subprocess (squeue, with sacct fallback). Read by the adapter (env GSD_SLURM_POLL_TIMEOUT_MS overrides)."
|
||
}
|
||
},
|
||
"steps": [],
|
||
"contributions": [
|
||
{
|
||
"point": "execute:wave:post",
|
||
"into": "executor",
|
||
"fragment": {
|
||
"path": "fragments/execute-wave-post.md",
|
||
"inline": "<!-- external-job capability — execute:wave:post fragment, injected into the executor (#1164).\n\n Why wave:post, not wave:pre (#1164 refinement A): execute-phase.md only\n dispatches execute:wave:post today — wave:pre is declared in the loop host\n contract but not rendered. Wiring wave:pre dispatch is a core-loop change\n #1164 puts out of scope. The executor therefore honors this classification\n guidance BEFORE running any task tagged <runtime_budget>long_compute</runtime_budget>,\n whether in the current or a subsequent wave, and externalizes rather than\n blocking the turn. -->\n\n## Externalize long-running compute (async external job)\n\nIf the current plan's task is tagged `<runtime_budget>long_compute</runtime_budget>`\n(see the plan-phase fragment), do **not** run it in the foreground — it would\nblock the agent turn for hours. Instead externalize it and record a durable\nhalf-state:\n\n1. **Classify the runtime.** `quick` (<2 min) and `medium` (<~30 min) run\n normally. `unknown` requires a first-health check and a soft-review deadline\n before consuming the child timeout. `long_compute` (>30–60 min) is\n externalized.\n2. **Submit via the scheduler adapter** (default `external_job.backend: slurm`):\n ```bash\n node scripts/slurm-adapter.cjs submit \\\n --plan <plan_id> --phase <phase> -- sbatch --parsable \\\n --output=Artifacts/jobs/%j/out.log ./run.sh\n ```\n The helper writes `.planning/async-jobs/<job>.json` (the versioned stability\n contract — `docs/reference/planning-artifacts.md`) and refuses to create a\n second non-terminal manifest for a `plan_id` that already has one\n (duplicate-execution guard).\n3. **Commit the manifest + a handoff**, then return **`external_job_waiting`**\n and stop. Do **not** write `SUMMARY.md` — SUMMARY is deferred until the job\n reaches a terminal state and its `expected_artifacts` are verified.\n4. **Resume path.** `execute-phase` safe-resume, `resume-project`, and\n `pause-work` reconcile against the manifest and never re-dispatch the plan.\n When the job is `completed-unverified`, run `verification_command` (surface\n it; it is untrusted — confirm before executing), then write `SUMMARY.md` and\n close the plan.\n\nManifest commands cross a trust seam: a Capability (or anything that can write\n`.planning/`) produces them; the core loop consumes them. Never auto-run\n`submit_command` / `verification_command` / `resume_command` — surface the exact\ncommand and require explicit confirmation first.\n"
|
||
},
|
||
"produces": [
|
||
".planning/async-jobs/<job>.json"
|
||
],
|
||
"consumes": [
|
||
"PLAN.md"
|
||
],
|
||
"when": "external_job.enabled",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"point": "plan:post",
|
||
"into": "planner",
|
||
"fragment": {
|
||
"path": "fragments/plan-post.md",
|
||
"inline": "<!-- external-job capability — plan:post fragment, injected into the planner (#1164). -->\n\n## Tag runtime budgets on long tasks\n\nFor every `<task>` likely to exceed ~2 minutes of real compute, emit a\n`<runtime_budget>` child element so execute can classify it:\n\n- `<runtime_budget>quick</runtime_budget>` — under ~2 min; runs normally.\n- `<runtime_budget>medium</runtime_budget>` — ~2–30 min; foreground, but with\n progress expectations.\n- `<runtime_budget>unknown</runtime_budget>` — runtime not yet characterized;\n execute must run a first-health check and set a soft-review deadline before\n trusting the child timeout. Define a progress signal and an abort condition.\n- `<runtime_budget>long_compute</runtime_budget>` — legitimately over ~30–60 min\n (HPC solver, model training, large simulations). Execute must **externalize**\n this as an async external job (see the execute:wave:post fragment) rather than\n blocking the agent turn.\n\nFor any `long_compute` task, also declare the async contract the executor will\nneed: the `submit_command`, the `expected_artifacts` the job must produce, and\nthe `verification_command` that proves the output before the plan can close.\nDo not hardcode a cluster account, partition, or project path — the planner\nnever knows the scheduler layout; it declares the contract, the executor's\nadapter fills the backend specifics.\n"
|
||
},
|
||
"produces": [],
|
||
"consumes": [],
|
||
"when": "external_job.enabled",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"gates": []
|
||
},
|
||
"gap-analysis": {
|
||
"id": "gap-analysis",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Post-planning gap analysis",
|
||
"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.",
|
||
"tier": "standard",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [],
|
||
"agents": [],
|
||
"hooks": [],
|
||
"config": {
|
||
"workflow.post_planning_gaps": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Run the post-planning gap analysis report after plans are generated."
|
||
}
|
||
},
|
||
"steps": [],
|
||
"contributions": [],
|
||
"gates": [
|
||
{
|
||
"point": "plan:post",
|
||
"check": {
|
||
"query": "gap-analysis.plan-post"
|
||
},
|
||
"when": "workflow.post_planning_gaps",
|
||
"blocking": false,
|
||
"onError": "skip"
|
||
}
|
||
]
|
||
},
|
||
"graphify": {
|
||
"id": "graphify",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Knowledge graph",
|
||
"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.",
|
||
"tier": "full",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [
|
||
"graphify"
|
||
],
|
||
"agents": [],
|
||
"activationKey": "graphify.enabled",
|
||
"config": {
|
||
"graphify.enabled": {
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Enable the graphify knowledge-graph command + skill."
|
||
}
|
||
},
|
||
"commands": [
|
||
{
|
||
"family": "graphify",
|
||
"module": "graphify-command-router.cjs",
|
||
"router": "routeGraphifyCommand"
|
||
}
|
||
],
|
||
"hooks": [],
|
||
"steps": [],
|
||
"contributions": [],
|
||
"gates": []
|
||
},
|
||
"hermes": {
|
||
"id": "hermes",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Hermes Agent",
|
||
"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.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".hermes",
|
||
"env": [
|
||
"HERMES_HOME"
|
||
]
|
||
},
|
||
"localConfigDir": ".hermes",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills/gsd",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClaudeSkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills/gsd",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClaudeSkill"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "settings-json",
|
||
"hookEvents": "claude",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": true,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-programmatic",
|
||
"dispatch": {
|
||
"namedDispatch": false,
|
||
"nested": true,
|
||
"maxDepth": 1,
|
||
"background": true,
|
||
"subagentToolkit": "read-only",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "active",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "python"
|
||
}
|
||
}
|
||
},
|
||
"intel": {
|
||
"id": "intel",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Codebase intelligence",
|
||
"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`.",
|
||
"tier": "full",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [],
|
||
"agents": [],
|
||
"activationKey": "intel.enabled",
|
||
"config": {
|
||
"intel.enabled": {
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Enable the intel code-intelligence command."
|
||
}
|
||
},
|
||
"commands": [
|
||
{
|
||
"family": "intel",
|
||
"module": "intel-command-router.cjs",
|
||
"router": "routeIntelCommand"
|
||
}
|
||
],
|
||
"hooks": [],
|
||
"steps": [
|
||
{
|
||
"point": "plan:pre",
|
||
"ref": {
|
||
"command": "intel api-surface"
|
||
},
|
||
"produces": [
|
||
".planning/intel/API-SURFACE.md"
|
||
],
|
||
"consumes": [],
|
||
"when": "intel.enabled",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"contributions": [],
|
||
"gates": []
|
||
},
|
||
"kilo": {
|
||
"id": "kilo",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Kilo Code",
|
||
"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.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "xdg",
|
||
"name": "kilo",
|
||
"env": [
|
||
"KILO_CONFIG_DIR",
|
||
"KILO_CONFIG",
|
||
"XDG_CONFIG_HOME"
|
||
],
|
||
"skillsHome": {
|
||
"kind": "dot-home",
|
||
"name": ".kilo",
|
||
"env": []
|
||
}
|
||
},
|
||
"localConfigDir": ".kilo",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "command",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": true,
|
||
"converter": "convertClaudeCommandToKiloSkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "command",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": true,
|
||
"converter": "convertClaudeCommandToKiloSkill"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "none",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": "kilo",
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": true,
|
||
"maxDepth": -1,
|
||
"background": true,
|
||
"subagentToolkit": "undocumented",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "active",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "bun"
|
||
}
|
||
}
|
||
},
|
||
"kimi": {
|
||
"id": "kimi",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Kimi CLI",
|
||
"description": "Kimi CLI (Moonshot AI) — generic agents root at ~/.config/agents; skills + kimi-agents artifact layout; no hook surface; no hook events; tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "generic-agents-root",
|
||
"name": "agents",
|
||
"env": [
|
||
"KIMI_CONFIG_DIR"
|
||
],
|
||
"probe": [
|
||
"~/.config/agents",
|
||
"~/.agents"
|
||
],
|
||
"probeExists": "skills"
|
||
},
|
||
"localConfigDir": ".kimi-code",
|
||
"configFormat": "none",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToKimiSkill"
|
||
},
|
||
{
|
||
"kind": "kimi-agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
}
|
||
],
|
||
"local": []
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "none",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "profile-marker-only",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": false,
|
||
"maxDepth": 1,
|
||
"background": true,
|
||
"subagentToolkit": "undocumented",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "python"
|
||
}
|
||
}
|
||
},
|
||
"mempalace": {
|
||
"id": "mempalace",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "MemPalace memory",
|
||
"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.",
|
||
"tier": "full",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [
|
||
"mempalace-recall",
|
||
"mempalace-capture"
|
||
],
|
||
"agents": [
|
||
"gsd-mempalace-curator"
|
||
],
|
||
"hooks": [],
|
||
"config": {
|
||
"mempalace.enabled": {
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Master toggle for the MemPalace memory capability."
|
||
},
|
||
"mempalace.memory_mode": {
|
||
"type": "enum",
|
||
"values": [
|
||
"augment",
|
||
"kg_backend",
|
||
"replace"
|
||
],
|
||
"default": "augment",
|
||
"description": "How MemPalace relates to GSD native memory during recall/capture. 'augment' (default): the palace is an additive layer alongside .planning/graphs/ — native memory stays authoritative. 'kg_backend': knowledge-graph queries resolve against the palace's temporal KG as the primary source, with .planning/graphs/ as fallback. 'replace': recall resolves through the palace as the source of truth, native memory as fallback. Every mode stays onError:skip and default-resilient — an unreachable palace degrades to native memory, and GSD keeps writing .planning/graphs/ so no memory is lost. Cross-mode migration of existing .planning/graphs/ into the palace is a separate, not-yet-implemented concern."
|
||
},
|
||
"mempalace.wing": {
|
||
"type": "string",
|
||
"default": "",
|
||
"description": "Palace wing name; empty derives from project_code / project dir."
|
||
},
|
||
"mempalace.recall_on_discuss": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Inject wake-up + search recall at discuss:pre."
|
||
},
|
||
"mempalace.recall_on_plan": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Produce MEMORY-RECALL.md at plan:pre."
|
||
},
|
||
"mempalace.capture_artifacts": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "File CONTEXT/PLAN/SUMMARY and learnings into the palace at phase boundaries."
|
||
},
|
||
"mempalace.mirror_kg": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Mirror decisions/learnings into MemPalace's temporal knowledge graph."
|
||
},
|
||
"mempalace.cross_project_tunnels": {
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Propose/create cross-wing tunnels at ship:post."
|
||
},
|
||
"mempalace.diary_journal": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Write a per-agent diary entry at ship:post."
|
||
},
|
||
"mempalace.auto_capture_hooks": {
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Reserved / not yet implemented: will install MemPalace's native stop/precompact Claude Code hooks for passive mid-session capture (the capability's hooks array is currently empty)."
|
||
}
|
||
},
|
||
"steps": [
|
||
{
|
||
"point": "discuss:post",
|
||
"ref": {
|
||
"skill": "mempalace-capture"
|
||
},
|
||
"produces": [],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "mempalace.enabled",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"point": "plan:pre",
|
||
"ref": {
|
||
"skill": "mempalace-recall"
|
||
},
|
||
"produces": [
|
||
"MEMORY-RECALL.md"
|
||
],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "mempalace.enabled",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"point": "plan:post",
|
||
"ref": {
|
||
"skill": "mempalace-capture"
|
||
},
|
||
"produces": [],
|
||
"consumes": [
|
||
"PLAN.md"
|
||
],
|
||
"when": "mempalace.enabled",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"point": "verify:post",
|
||
"ref": {
|
||
"skill": "mempalace-capture"
|
||
},
|
||
"produces": [],
|
||
"consumes": [
|
||
"SUMMARY.md"
|
||
],
|
||
"when": "mempalace.enabled",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"point": "ship:post",
|
||
"ref": {
|
||
"agent": "gsd-mempalace-curator"
|
||
},
|
||
"produces": [],
|
||
"consumes": [
|
||
"UAT.md"
|
||
],
|
||
"when": "mempalace.enabled",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"contributions": [
|
||
{
|
||
"point": "discuss:pre",
|
||
"into": "orchestrator",
|
||
"fragment": {
|
||
"path": "fragments/recall-discuss.md",
|
||
"inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the discuss:pre orchestrator prompt when `mempalace.recall_on_discuss` is true.\n Contributes DATA (recall instructions), not control flow. onError: skip — never blocks discussion.\n-->\n### Memory recall (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.recall_on_discuss` is `false`, **skip this entire section** and continue the discussion unchanged. (This contribution is only injected when the capability is enabled; the `recall_on_discuss` check lets you turn discuss-time recall off without disabling the rest of the capability.)\n\nOtherwise — before gathering new context, surface what you already know. This is read-only and side-effect-free; if MemPalace is unreachable, note \"memory unavailable\" and continue — recall never blocks discussion.\n\n1. **Resolve the wing.** Use `mempalace.wing` if set; otherwise derive it from `project_code` (fall back to the project directory name).\n2. **Wake up (cheap, ~600–900 tokens).**\n - Interactive run → call `mempalace_search` after a wake-up read of the wing.\n - Headless/cron run (no MCP server) → run `mempalace wake-up --wing <wing>` via the CLI.\n3. **Targeted recall.** Search the palace for prior work on this phase's topic:\n - Interactive → `mempalace_search(query=<phase topic>, wing=<wing>)` and, when `mempalace.mirror_kg` is on, `mempalace_kg_query` / `mempalace_kg_timeline` for decision facts and their validity windows.\n - Headless → `mempalace search \"<phase topic>\" --wing <wing>`.\n4. **Mode awareness** (`mempalace.memory_mode`). `augment` (default): the palace is an *additional* layer — never skip `.planning/graphs/` or STATE. `kg_backend`: query the palace's temporal KG as the *primary* graph source, with `.planning/graphs/` as fallback. `replace`: resolve recall *through the palace as the source of truth*, native memory as fallback. In every mode an unreachable palace falls back to native memory — recall never blocks.\n5. **Surface, don't dump.** Fold the top relevant drawers, decisions, patterns, and *surprises* into the discussion as prior context — cite drawer/fact provenance. Do not paste raw search output.\n\nIf any MemPalace call errors or times out, skip the rest of recall and proceed with discussion as normal.\n"
|
||
},
|
||
"produces": [],
|
||
"consumes": [],
|
||
"when": "mempalace.enabled",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"point": "execute:wave:post",
|
||
"into": "verifier",
|
||
"fragment": {
|
||
"path": "fragments/capture-problems.md",
|
||
"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: `mempalace mine` / `mempalace hook run`. 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"
|
||
},
|
||
"produces": [],
|
||
"consumes": [],
|
||
"when": "mempalace.enabled",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"gates": []
|
||
},
|
||
"nyquist": {
|
||
"id": "nyquist",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Nyquist validation",
|
||
"description": "Validation coverage audit that maps executed work back to tests and manual-only evidence.",
|
||
"tier": "full",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [
|
||
"validate-phase"
|
||
],
|
||
"agents": [
|
||
"gsd-nyquist-auditor"
|
||
],
|
||
"hooks": [],
|
||
"config": {
|
||
"workflow.nyquist_validation": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable Nyquist validation coverage auditing."
|
||
}
|
||
},
|
||
"steps": [
|
||
{
|
||
"point": "verify:post",
|
||
"ref": {
|
||
"skill": "validate-phase"
|
||
},
|
||
"produces": [
|
||
"VALIDATION.md"
|
||
],
|
||
"consumes": [
|
||
"SUMMARY.md"
|
||
],
|
||
"when": "workflow.nyquist_validation",
|
||
"onError": "halt"
|
||
}
|
||
],
|
||
"contributions": [],
|
||
"gates": []
|
||
},
|
||
"opencode": {
|
||
"id": "opencode",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "OpenCode",
|
||
"description": "OpenCode — XDG-based config dir; flat command/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "xdg",
|
||
"name": "opencode",
|
||
"env": [
|
||
"OPENCODE_CONFIG_DIR",
|
||
"OPENCODE_CONFIG",
|
||
"XDG_CONFIG_HOME"
|
||
]
|
||
},
|
||
"localConfigDir": ".opencode",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "command",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": true,
|
||
"converter": "convertClaudeCommandToOpencodeSkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "command",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": true,
|
||
"converter": "convertClaudeCommandToOpencodeSkill"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "none",
|
||
"extensionEvents": "opencode",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": true,
|
||
"permissionWriter": "opencode",
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": "undocumented",
|
||
"maxDepth": "undocumented",
|
||
"background": false,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": "undocumented"
|
||
},
|
||
"modelMode": "active",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "bun"
|
||
}
|
||
}
|
||
},
|
||
"pattern-mapper": {
|
||
"id": "pattern-mapper",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Pattern mapping",
|
||
"description": "Optional codebase-pattern mapping before planning; owns the pattern mapper agent and workflow.pattern_mapper activation key.",
|
||
"tier": "full",
|
||
"requires": [
|
||
"research"
|
||
],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [],
|
||
"agents": [
|
||
"gsd-pattern-mapper"
|
||
],
|
||
"hooks": [],
|
||
"config": {
|
||
"workflow.pattern_mapper": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Run the pattern mapper before planning when context or research is available."
|
||
}
|
||
},
|
||
"steps": [
|
||
{
|
||
"point": "plan:pre",
|
||
"ref": {
|
||
"agent": "gsd-pattern-mapper"
|
||
},
|
||
"fragment": {
|
||
"path": "fragments/plan-pre.md",
|
||
"inline": "<pattern_mapping_context>\n**Phase:** {phase_number} - {phase_name}\n**Phase directory:** {phase_dir}\n**Padded phase:** {padded_phase}\n\n<files_to_read>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {research_path} (Technical Research)\n</files_to_read>\n\n**Output file:** {phase_dir}/{padded_phase}-PATTERNS.md\n\nExtract the list of files to be created/modified from CONTEXT.md and RESEARCH.md. For each file, classify by role and data flow, find the closest existing analog in the codebase, extract concrete code excerpts, and produce PATTERNS.md.\n</pattern_mapping_context>\n"
|
||
},
|
||
"produces": [
|
||
"PATTERNS.md"
|
||
],
|
||
"consumes": [
|
||
"RESEARCH.md"
|
||
],
|
||
"when": "workflow.pattern_mapper",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"contributions": [],
|
||
"gates": []
|
||
},
|
||
"profile-pipeline": {
|
||
"id": "profile-pipeline",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Developer profiling pipeline",
|
||
"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.",
|
||
"tier": "full",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [
|
||
"profile-user"
|
||
],
|
||
"agents": [
|
||
"gsd-user-profiler"
|
||
],
|
||
"config": {
|
||
"profile-pipeline.enabled": {
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Enable the developer profiling pipeline commands (scan-sessions, extract-messages, profile-sample, write-profile, etc.)."
|
||
}
|
||
},
|
||
"commands": [
|
||
{
|
||
"family": "scan-sessions",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeScanSessions"
|
||
},
|
||
{
|
||
"family": "extract-messages",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeExtractMessages"
|
||
},
|
||
{
|
||
"family": "profile-sample",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeProfileSample"
|
||
},
|
||
{
|
||
"family": "write-profile",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeWriteProfile"
|
||
},
|
||
{
|
||
"family": "profile-questionnaire",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeProfileQuestionnaire"
|
||
},
|
||
{
|
||
"family": "generate-dev-preferences",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeGenerateDevPreferences"
|
||
},
|
||
{
|
||
"family": "generate-claude-profile",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeGenerateClaudeProfile"
|
||
},
|
||
{
|
||
"family": "generate-claude-md",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeGenerateClaudeMd"
|
||
}
|
||
],
|
||
"hooks": [],
|
||
"steps": [],
|
||
"contributions": [],
|
||
"gates": []
|
||
},
|
||
"qwen": {
|
||
"id": "qwen",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Qwen Code",
|
||
"description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".qwen",
|
||
"env": [
|
||
"QWEN_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".qwen",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClaudeSkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClaudeSkill"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "settings-json",
|
||
"hookEvents": "claude",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": true,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [
|
||
"SubagentStop",
|
||
"Stop",
|
||
"PreCompact"
|
||
],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": false,
|
||
"maxDepth": 1,
|
||
"background": true,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"research": {
|
||
"id": "research",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Phase research",
|
||
"description": "Optional phase research before planning; owns the phase researcher agent and workflow.research activation key.",
|
||
"tier": "standard",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [],
|
||
"agents": [
|
||
"gsd-phase-researcher"
|
||
],
|
||
"hooks": [],
|
||
"config": {
|
||
"workflow.research": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Run phase research before planning when research artifacts are missing or explicitly refreshed."
|
||
}
|
||
},
|
||
"steps": [
|
||
{
|
||
"point": "plan:pre",
|
||
"ref": {
|
||
"agent": "gsd-phase-researcher"
|
||
},
|
||
"fragment": {
|
||
"path": "fragments/plan-pre.md",
|
||
"inline": "<objective>\nResearch how to implement Phase {phase_number}: {phase_name}\nAnswer: \"What do I need to know to PLAN this phase well?\"\n</objective>\n\n<files_to_read>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {requirements_path} (Project requirements)\n- {state_path} (Project decisions and history)\n</files_to_read>\n\n${AGENT_SKILLS_RESEARCHER}\n\n<additional_context>\n**Phase description:** {phase_description}\n**Phase requirement IDs (MUST address):** {phase_req_ids}\n\n**Project instructions:** Read ./CLAUDE.md or ./.claude/CLAUDE.md if either exists; follow project-specific guidelines.\n**Project skills:** Check .claude/skills/ or .agents/skills/ directory if either exists. Read SKILL.md files and account for project skill patterns.\n</additional_context>\n\n<output>\nWrite to: {phase_dir}/{phase_num}-RESEARCH.md\n</output>\n"
|
||
},
|
||
"produces": [
|
||
"RESEARCH.md"
|
||
],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "workflow.research",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"contributions": [],
|
||
"gates": []
|
||
},
|
||
"schema-gate": {
|
||
"id": "schema-gate",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Schema push detection gate",
|
||
"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.",
|
||
"tier": "full",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [],
|
||
"agents": [],
|
||
"hooks": [],
|
||
"config": {
|
||
"workflow.schema_push_detection": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable ORM schema push detection during planning. When schema-relevant files are detected in the phase scope, a [BLOCKING] push task is injected into the plan."
|
||
}
|
||
},
|
||
"steps": [],
|
||
"contributions": [
|
||
{
|
||
"point": "plan:pre",
|
||
"into": "planner",
|
||
"fragment": {
|
||
"path": "fragments/plan-pre.md",
|
||
"inline": "# Schema Push Detection Gate\n\n> Detects schema-relevant files in the phase scope 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.\n\nCheck if any files in the phase scope match schema patterns:\n\n```bash\nPHASE_SECTION=$(gsd_run query roadmap.get-phase \"${PHASE}\" --pick section 2>/dev/null)\n```\n\nScan `PHASE_SECTION`, `CONTEXT.md` (if loaded), and `RESEARCH.md` (if exists) for file paths matching these ORM patterns:\n\n| ORM | File Patterns |\n|-----|--------------|\n| Payload CMS | `src/collections/**/*.ts`, `src/globals/**/*.ts` |\n| Prisma | `prisma/schema.prisma`, `prisma/schema/*.prisma` |\n| Drizzle | `drizzle/schema.ts`, `src/db/schema.ts`, `drizzle/*.ts` |\n| Supabase | `supabase/migrations/*.sql` |\n| TypeORM | `src/entities/**/*.ts`, `src/migrations/**/*.ts` |\n\nAlso check if any existing PLAN.md files for this phase already reference these file patterns in `files_modified`.\n\n**If schema-relevant files detected:**\n\nSet `SCHEMA_PUSH_REQUIRED=true` and `SCHEMA_ORM={detected_orm}`.\n\nDetermine the push command for the detected ORM:\n\n| ORM | Push Command | Non-TTY Workaround |\n|-----|-------------|-------------------|\n| Payload CMS | `npx payload migrate` | `CI=true PAYLOAD_MIGRATING=true npx payload migrate` |\n| Prisma | `npx prisma db push` | `npx prisma db push --accept-data-loss` (if destructive) |\n| Drizzle | `npx drizzle-kit push` | `npx drizzle-kit push` |\n| Supabase | `supabase db push` | Set `SUPABASE_ACCESS_TOKEN` env var |\n| TypeORM | `npx typeorm migration:run` | `npx typeorm migration:run -d src/data-source.ts` |\n\nInject the following into the planner prompt (step 8) as an additional constraint:\n\n```markdown\n<schema_push_requirement>\n**[BLOCKING] Schema Push Required**\n\nThis phase modifies schema-relevant files ({detected_files}). The planner MUST include\na `[BLOCKING]` task that runs the database schema push command AFTER all schema file\nmodifications are complete but BEFORE verification.\n\n- ORM detected: {SCHEMA_ORM}\n- Push command: {push_command}\n- Non-TTY workaround: {env_hint}\n- If push requires interactive prompts that cannot be suppressed, flag the task for\n manual intervention with `autonomous: false`\n\nThis task is mandatory — the phase CANNOT pass verification without it. Build and\ntype checks will pass without the push (types come from config, not the live database),\ncreating a false-positive verification state.\n</schema_push_requirement>\n```\n\nDisplay: `Schema files detected ({SCHEMA_ORM}) — [BLOCKING] push task will be injected into plans`\n\n**If no schema-relevant files detected:** Skip silently.\n"
|
||
},
|
||
"produces": [],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "workflow.schema_push_detection",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"gates": []
|
||
},
|
||
"security": {
|
||
"id": "security",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Security enforcement",
|
||
"description": "Threat mitigation verification and ship-time security blocking for phases with security enforcement enabled.",
|
||
"tier": "full",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [
|
||
"secure-phase"
|
||
],
|
||
"agents": [
|
||
"gsd-security-auditor"
|
||
],
|
||
"hooks": [],
|
||
"config": {
|
||
"workflow.security_enforcement": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable security threat-mitigation verification before phase advancement."
|
||
},
|
||
"workflow.security_asvs_level": {
|
||
"type": "number",
|
||
"default": 1,
|
||
"description": "OWASP ASVS level used by security review guidance."
|
||
},
|
||
"workflow.security_block_on": {
|
||
"type": "enum",
|
||
"values": [
|
||
"critical",
|
||
"high",
|
||
"medium",
|
||
"low",
|
||
"none"
|
||
],
|
||
"default": "high",
|
||
"description": "Minimum open threat severity that blocks advancement."
|
||
}
|
||
},
|
||
"steps": [
|
||
{
|
||
"point": "verify:post",
|
||
"ref": {
|
||
"skill": "secure-phase"
|
||
},
|
||
"produces": [
|
||
"SECURITY.md"
|
||
],
|
||
"consumes": [
|
||
"SUMMARY.md"
|
||
],
|
||
"when": "workflow.security_enforcement",
|
||
"onError": "halt"
|
||
}
|
||
],
|
||
"contributions": [
|
||
{
|
||
"point": "plan:pre",
|
||
"into": "planner",
|
||
"fragment": {
|
||
"inline": "Each PLAN.md must include a <threat_model> block when security enforcement is active. Use the configured ASVS level and blocking threshold from workflow.security_asvs_level and workflow.security_block_on."
|
||
},
|
||
"configValues": {
|
||
"security_asvs_level": "workflow.security_asvs_level",
|
||
"security_block_on": "workflow.security_block_on"
|
||
},
|
||
"produces": [],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "workflow.security_enforcement"
|
||
}
|
||
],
|
||
"gates": [
|
||
{
|
||
"point": "ship:pre",
|
||
"check": {
|
||
"predicate": {
|
||
"kind": "artifact-frontmatter-equals",
|
||
"artifact": "SECURITY.md",
|
||
"field": "threats_open",
|
||
"equals": 0
|
||
}
|
||
},
|
||
"when": "workflow.security_enforcement",
|
||
"blocking": true,
|
||
"onError": "halt"
|
||
}
|
||
]
|
||
},
|
||
"tdd": {
|
||
"id": "tdd",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Test-driven development",
|
||
"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.",
|
||
"tier": "full",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [],
|
||
"agents": [],
|
||
"hooks": [],
|
||
"config": {
|
||
"workflow.tdd_mode": {
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Enable TDD mode: planner annotates eligible tasks type:tdd and executor enforces RED/GREEN/REFACTOR gate sequence."
|
||
}
|
||
},
|
||
"steps": [],
|
||
"contributions": [
|
||
{
|
||
"point": "plan:pre",
|
||
"into": "planner",
|
||
"fragment": {
|
||
"inline": "<tdd_mode_active>\n**TDD Mode is ENABLED.** Apply TDD heuristics to all eligible tasks:\n- Business logic with defined I/O → type: tdd\n- API endpoints with request/response contracts → type: tdd\n- Data transformations, validation, algorithms → type: tdd\n- UI, config, glue code, CRUD → standard plan (type: execute)\nEach TDD plan gets one feature with RED/GREEN/REFACTOR gate sequence.\n</tdd_mode_active>"
|
||
},
|
||
"produces": [],
|
||
"consumes": [],
|
||
"when": "workflow.tdd_mode",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"gates": [
|
||
{
|
||
"point": "execute:post",
|
||
"check": {
|
||
"query": "tdd.review-checkpoint"
|
||
},
|
||
"when": "workflow.tdd_mode",
|
||
"blocking": false,
|
||
"onError": "skip"
|
||
}
|
||
]
|
||
},
|
||
"trae": {
|
||
"id": "trae",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Trae IDE",
|
||
"description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".trae",
|
||
"env": [
|
||
"TRAE_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".trae",
|
||
"configFormat": "none",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToTraeSkill"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToTraeAgent"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToTraeSkill"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToTraeAgent"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "none",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "profile-marker-only",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": "undocumented",
|
||
"maxDepth": "undocumented",
|
||
"background": true,
|
||
"subagentToolkit": "undocumented",
|
||
"backgroundDispatch": "undocumented"
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "engine",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"ui": {
|
||
"id": "ui",
|
||
"role": "feature",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "UI design contracts",
|
||
"description": "UI-SPEC design contract + retrospective UI audit for frontend phases.",
|
||
"tier": "full",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtimeCompat": {
|
||
"supported": [
|
||
"*"
|
||
],
|
||
"unsupported": []
|
||
},
|
||
"skills": [
|
||
"ui-phase",
|
||
"ui-review"
|
||
],
|
||
"agents": [
|
||
"gsd-ui-checker",
|
||
"gsd-ui-auditor"
|
||
],
|
||
"hooks": [],
|
||
"config": {
|
||
"workflow.ui_phase": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable the UI design-contract gate during planning."
|
||
},
|
||
"workflow.ui_review": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable the retrospective UI audit."
|
||
},
|
||
"workflow.ui_safety_gate": {
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Block execution on unmet UI-SPEC contracts."
|
||
}
|
||
},
|
||
"steps": [
|
||
{
|
||
"point": "plan:pre",
|
||
"ref": {
|
||
"skill": "ui-phase"
|
||
},
|
||
"produces": [
|
||
"UI-SPEC.md"
|
||
],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "workflow.ui_phase",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"point": "verify:post",
|
||
"ref": {
|
||
"skill": "ui-review"
|
||
},
|
||
"produces": [
|
||
"UI-REVIEW.md"
|
||
],
|
||
"consumes": [
|
||
"UI-SPEC.md"
|
||
],
|
||
"when": "workflow.ui_review",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"contributions": [],
|
||
"gates": [
|
||
{
|
||
"point": "plan:pre",
|
||
"check": {
|
||
"query": "ui.plan-gate"
|
||
},
|
||
"when": "workflow.ui_safety_gate",
|
||
"blocking": true,
|
||
"onError": "halt"
|
||
},
|
||
{
|
||
"point": "execute:wave:post",
|
||
"check": {
|
||
"query": "ui.safety-gate"
|
||
},
|
||
"when": "workflow.ui_safety_gate",
|
||
"blocking": true,
|
||
"onError": "halt"
|
||
}
|
||
]
|
||
},
|
||
"windsurf": {
|
||
"id": "windsurf",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Windsurf",
|
||
"description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; no hook surface; no hook events; tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home-nested",
|
||
"name": "windsurf",
|
||
"parent": ".codeium",
|
||
"env": [
|
||
"WINDSURF_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".windsurf",
|
||
"configFormat": "none",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToWindsurfAgent"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "workflows",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToWindsurfWorkflow"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToWindsurfAgent"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "none",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "profile-marker-only",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "declarative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": "undocumented",
|
||
"nested": "undocumented",
|
||
"maxDepth": "undocumented",
|
||
"background": "undocumented",
|
||
"subagentToolkit": "undocumented",
|
||
"backgroundDispatch": "undocumented"
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "undocumented"
|
||
}
|
||
}
|
||
},
|
||
"zcode": {
|
||
"id": "zcode",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.2",
|
||
"title": "ZCode",
|
||
"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.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".zcode",
|
||
"env": [
|
||
"ZCODE_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".zcode",
|
||
"configFormat": "none",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClaudeSkill"
|
||
},
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClaudeSkill"
|
||
},
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "none",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "profile-marker-only",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "declarative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": "undocumented",
|
||
"maxDepth": "undocumented",
|
||
"background": false,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "electron"
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
const bySkill = {
|
||
"ai-integration-phase": "ai-integration",
|
||
"code-review": "code-review",
|
||
"graphify": "graphify",
|
||
"mempalace-recall": "mempalace",
|
||
"mempalace-capture": "mempalace",
|
||
"validate-phase": "nyquist",
|
||
"profile-user": "profile-pipeline",
|
||
"secure-phase": "security",
|
||
"ui-phase": "ui",
|
||
"ui-review": "ui"
|
||
};
|
||
|
||
const byAgent = {
|
||
"gsd-framework-selector": "ai-integration",
|
||
"gsd-ai-researcher": "ai-integration",
|
||
"gsd-domain-researcher": "ai-integration",
|
||
"gsd-eval-planner": "ai-integration",
|
||
"gsd-code-reviewer": "code-review",
|
||
"gsd-code-fixer": "code-review",
|
||
"gsd-mempalace-curator": "mempalace",
|
||
"gsd-nyquist-auditor": "nyquist",
|
||
"gsd-pattern-mapper": "pattern-mapper",
|
||
"gsd-user-profiler": "profile-pipeline",
|
||
"gsd-phase-researcher": "research",
|
||
"gsd-security-auditor": "security",
|
||
"gsd-ui-checker": "ui",
|
||
"gsd-ui-auditor": "ui"
|
||
};
|
||
|
||
const byLoopPoint = {
|
||
"discuss:pre": {
|
||
"steps": [],
|
||
"contributions": [
|
||
{
|
||
"capId": "mempalace",
|
||
"point": "discuss:pre",
|
||
"into": "orchestrator",
|
||
"fragment": {
|
||
"path": "fragments/recall-discuss.md",
|
||
"inline": "<!--\n MemPalace capability — contribution fragment.\n Rendered into the discuss:pre orchestrator prompt when `mempalace.recall_on_discuss` is true.\n Contributes DATA (recall instructions), not control flow. onError: skip — never blocks discussion.\n-->\n### Memory recall (MemPalace)\n\n**Gate first.** Read `.planning/config.json`. If `mempalace.enabled` is not `true`, or `mempalace.recall_on_discuss` is `false`, **skip this entire section** and continue the discussion unchanged. (This contribution is only injected when the capability is enabled; the `recall_on_discuss` check lets you turn discuss-time recall off without disabling the rest of the capability.)\n\nOtherwise — before gathering new context, surface what you already know. This is read-only and side-effect-free; if MemPalace is unreachable, note \"memory unavailable\" and continue — recall never blocks discussion.\n\n1. **Resolve the wing.** Use `mempalace.wing` if set; otherwise derive it from `project_code` (fall back to the project directory name).\n2. **Wake up (cheap, ~600–900 tokens).**\n - Interactive run → call `mempalace_search` after a wake-up read of the wing.\n - Headless/cron run (no MCP server) → run `mempalace wake-up --wing <wing>` via the CLI.\n3. **Targeted recall.** Search the palace for prior work on this phase's topic:\n - Interactive → `mempalace_search(query=<phase topic>, wing=<wing>)` and, when `mempalace.mirror_kg` is on, `mempalace_kg_query` / `mempalace_kg_timeline` for decision facts and their validity windows.\n - Headless → `mempalace search \"<phase topic>\" --wing <wing>`.\n4. **Mode awareness** (`mempalace.memory_mode`). `augment` (default): the palace is an *additional* layer — never skip `.planning/graphs/` or STATE. `kg_backend`: query the palace's temporal KG as the *primary* graph source, with `.planning/graphs/` as fallback. `replace`: resolve recall *through the palace as the source of truth*, native memory as fallback. In every mode an unreachable palace falls back to native memory — recall never blocks.\n5. **Surface, don't dump.** Fold the top relevant drawers, decisions, patterns, and *surprises* into the discussion as prior context — cite drawer/fact provenance. Do not paste raw search output.\n\nIf any MemPalace call errors or times out, skip the rest of recall and proceed with discussion as normal.\n"
|
||
},
|
||
"produces": [],
|
||
"consumes": [],
|
||
"when": "mempalace.enabled",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"gates": []
|
||
},
|
||
"discuss:post": {
|
||
"steps": [
|
||
{
|
||
"capId": "mempalace",
|
||
"point": "discuss:post",
|
||
"ref": {
|
||
"skill": "mempalace-capture"
|
||
},
|
||
"produces": [],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "mempalace.enabled",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"contributions": [],
|
||
"gates": []
|
||
},
|
||
"plan:pre": {
|
||
"steps": [
|
||
{
|
||
"capId": "ai-integration",
|
||
"point": "plan:pre",
|
||
"ref": {
|
||
"skill": "ai-integration-phase"
|
||
},
|
||
"produces": [
|
||
"AI-SPEC.md"
|
||
],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "workflow.ai_integration_phase",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"capId": "intel",
|
||
"point": "plan:pre",
|
||
"ref": {
|
||
"command": "intel api-surface"
|
||
},
|
||
"produces": [
|
||
".planning/intel/API-SURFACE.md"
|
||
],
|
||
"consumes": [],
|
||
"when": "intel.enabled",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"capId": "mempalace",
|
||
"point": "plan:pre",
|
||
"ref": {
|
||
"skill": "mempalace-recall"
|
||
},
|
||
"produces": [
|
||
"MEMORY-RECALL.md"
|
||
],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "mempalace.enabled",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"capId": "research",
|
||
"point": "plan:pre",
|
||
"ref": {
|
||
"agent": "gsd-phase-researcher"
|
||
},
|
||
"fragment": {
|
||
"path": "fragments/plan-pre.md",
|
||
"inline": "<objective>\nResearch how to implement Phase {phase_number}: {phase_name}\nAnswer: \"What do I need to know to PLAN this phase well?\"\n</objective>\n\n<files_to_read>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {requirements_path} (Project requirements)\n- {state_path} (Project decisions and history)\n</files_to_read>\n\n${AGENT_SKILLS_RESEARCHER}\n\n<additional_context>\n**Phase description:** {phase_description}\n**Phase requirement IDs (MUST address):** {phase_req_ids}\n\n**Project instructions:** Read ./CLAUDE.md or ./.claude/CLAUDE.md if either exists; follow project-specific guidelines.\n**Project skills:** Check .claude/skills/ or .agents/skills/ directory if either exists. Read SKILL.md files and account for project skill patterns.\n</additional_context>\n\n<output>\nWrite to: {phase_dir}/{phase_num}-RESEARCH.md\n</output>\n"
|
||
},
|
||
"produces": [
|
||
"RESEARCH.md"
|
||
],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "workflow.research",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"capId": "ui",
|
||
"point": "plan:pre",
|
||
"ref": {
|
||
"skill": "ui-phase"
|
||
},
|
||
"produces": [
|
||
"UI-SPEC.md"
|
||
],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "workflow.ui_phase",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"capId": "pattern-mapper",
|
||
"point": "plan:pre",
|
||
"ref": {
|
||
"agent": "gsd-pattern-mapper"
|
||
},
|
||
"fragment": {
|
||
"path": "fragments/plan-pre.md",
|
||
"inline": "<pattern_mapping_context>\n**Phase:** {phase_number} - {phase_name}\n**Phase directory:** {phase_dir}\n**Padded phase:** {padded_phase}\n\n<files_to_read>\n- {context_path} (USER DECISIONS from /gsd:discuss-phase)\n- {research_path} (Technical Research)\n</files_to_read>\n\n**Output file:** {phase_dir}/{padded_phase}-PATTERNS.md\n\nExtract the list of files to be created/modified from CONTEXT.md and RESEARCH.md. For each file, classify by role and data flow, find the closest existing analog in the codebase, extract concrete code excerpts, and produce PATTERNS.md.\n</pattern_mapping_context>\n"
|
||
},
|
||
"produces": [
|
||
"PATTERNS.md"
|
||
],
|
||
"consumes": [
|
||
"RESEARCH.md"
|
||
],
|
||
"when": "workflow.pattern_mapper",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"contributions": [
|
||
{
|
||
"capId": "assumption-delta",
|
||
"point": "plan:pre",
|
||
"into": "planner",
|
||
"fragment": {
|
||
"path": "fragments/plan-pre.md",
|
||
"inline": "# Assumption-Delta Architecture Checkpoint\n\n> Advisory, non-blocking. Fires **only** when the phase scope shows a singular→plural / required→optional / derived→chosen transition. When it fires, it surfaces ONE identity-model question before the plan is finalized. Most phases will not fire it — that is the point.\n\n## Why this exists\n\nMost quietly-imported architectural debt does not come from a missing upfront design phase. It comes at the *seam*: a later phase introduces a second case (a second platform, auth method, tenant, region, source of truth) and nobody re-asks whether the original abstraction still names the right thing. The phase that adds the second case is exactly the 20-minute conversation that prevents an afternoon of later cleanup.\n\n## Run the detector\n\nThe detector is a deterministic scan over the phase scope text. It strips fenced code blocks first, so a trigger word that appears only inside a code snippet does not fire. It returns a typed result: `{ detected, signals[], terms }`. Resolve it through the `assumption-delta scan` query (same phase-section resolver as `roadmap.get-phase`):\n\n```bash\nASSUMPTION_DELTA_JSON=$(gsd_run query assumption-delta scan \"${PHASE}\" --json 2>/dev/null || echo '{\"detected\":false,\"signals\":[],\"terms\":{}}')\n```\n\n> If the phase section cannot be resolved (no `ROADMAP.md` / unknown phase), the query emits `{ \"detected\": false, ... }` — the checkpoint does not fire. Do not block on it.\n>\n> Optional tuning — pass `--terms <comma-list>` to replace the curated pluralization cues for this project (the `optional`/`chosen` cues keep their defaults): `gsd_run query assumption-delta scan \"${PHASE}\" --json --terms second,alternative,fallback`.\n\n## Decision branch\n\nRead `ASSUMPTION_DELTA_JSON`. Act on `detected` only — do **not** pattern-match the human prose.\n\n**If `detected` is `false`:** this phase does not change a core assumption. Skip the checkpoint entirely and continue planning. Do not raise it with the user.\n\n**If `detected` is `true`:** a core assumption may have lost its monopoly. The `signals[]` array tells you which family fired:\n\n| `kind` | What changed | The question to answer |\n|---|---|---|\n| `pluralization` | A second X was introduced where there was one (second platform / auth method / tenant / region / source of truth) | Does the current primary key / identity model still name the right noun? |\n| `optional` | A required / `only` field became optional | Is the field still the right anchor, or has the anchor moved? |\n| `chosen` | A derived value became chosen, or a constant became a parameter | Has a configuration decision become a modeling decision? |\n\nBefore finalizing the plan, answer this for the user and record the decision explicitly:\n\n> **Promote vs. add-alongside.** The usual correct move when a generalization occurs is to **promote** the new general representation to the primary and **demote** the old specific one to a detail of one variant — *not* to add the new one alongside the still-required old one. Adding alongside silently contradicts the generalized intent (a later variant that does not fit the old primary can be stored but never confirmed as a default).\n\nRecord the outcome in the PLAN.md front matter / a `<assumption_delta_decision>` block:\n\n- The **noun** that is now primary (the generalized identity).\n- The **decision**: `promote` | `add-alongside` | `no-change`, with a one-line rationale.\n- If `add-alongside`: call it out as accepted debt and note what would force a later promote.\n\n## Optional companion: an invariant test\n\nWhen `detected` is `true`, suggest (do not require) a contract/invariant test that encodes the now-generalized intent — e.g. *\"every confirmed default round-trips through the primary use-path, for every supported variant.\"* That test goes red the instant a future phase reintroduces the singular assumption, so the regression cannot land silently. If the user accepts, add the test as a task in the plan.\n\n## Tuning the vocabulary (optional)\n\nThe trigger vocabulary is a curated, additive-only set in `gsd-core/bin/lib/assumption-delta.cjs` (`DEFAULT_ASSUMPTION_DELTA_TERMS`). Bare \"or\" is intentionally excluded — it is too common in prose and would make the gate fire constantly. To widen or narrow the cues for a project, override at the call site with `--terms <comma-list>` (replaces the pluralization cues; `optional`/`chosen` keep defaults). The whole checkpoint is toggleable via `workflow.assumption_delta` in `.planning/config.json`.\n\nThis checkpoint is advisory: it informs and records; it never blocks the phase.\n"
|
||
},
|
||
"produces": [],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "workflow.assumption_delta",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"capId": "schema-gate",
|
||
"point": "plan:pre",
|
||
"into": "planner",
|
||
"fragment": {
|
||
"path": "fragments/plan-pre.md",
|
||
"inline": "# Schema Push Detection Gate\n\n> Detects schema-relevant files in the phase scope 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.\n\nCheck if any files in the phase scope match schema patterns:\n\n```bash\nPHASE_SECTION=$(gsd_run query roadmap.get-phase \"${PHASE}\" --pick section 2>/dev/null)\n```\n\nScan `PHASE_SECTION`, `CONTEXT.md` (if loaded), and `RESEARCH.md` (if exists) for file paths matching these ORM patterns:\n\n| ORM | File Patterns |\n|-----|--------------|\n| Payload CMS | `src/collections/**/*.ts`, `src/globals/**/*.ts` |\n| Prisma | `prisma/schema.prisma`, `prisma/schema/*.prisma` |\n| Drizzle | `drizzle/schema.ts`, `src/db/schema.ts`, `drizzle/*.ts` |\n| Supabase | `supabase/migrations/*.sql` |\n| TypeORM | `src/entities/**/*.ts`, `src/migrations/**/*.ts` |\n\nAlso check if any existing PLAN.md files for this phase already reference these file patterns in `files_modified`.\n\n**If schema-relevant files detected:**\n\nSet `SCHEMA_PUSH_REQUIRED=true` and `SCHEMA_ORM={detected_orm}`.\n\nDetermine the push command for the detected ORM:\n\n| ORM | Push Command | Non-TTY Workaround |\n|-----|-------------|-------------------|\n| Payload CMS | `npx payload migrate` | `CI=true PAYLOAD_MIGRATING=true npx payload migrate` |\n| Prisma | `npx prisma db push` | `npx prisma db push --accept-data-loss` (if destructive) |\n| Drizzle | `npx drizzle-kit push` | `npx drizzle-kit push` |\n| Supabase | `supabase db push` | Set `SUPABASE_ACCESS_TOKEN` env var |\n| TypeORM | `npx typeorm migration:run` | `npx typeorm migration:run -d src/data-source.ts` |\n\nInject the following into the planner prompt (step 8) as an additional constraint:\n\n```markdown\n<schema_push_requirement>\n**[BLOCKING] Schema Push Required**\n\nThis phase modifies schema-relevant files ({detected_files}). The planner MUST include\na `[BLOCKING]` task that runs the database schema push command AFTER all schema file\nmodifications are complete but BEFORE verification.\n\n- ORM detected: {SCHEMA_ORM}\n- Push command: {push_command}\n- Non-TTY workaround: {env_hint}\n- If push requires interactive prompts that cannot be suppressed, flag the task for\n manual intervention with `autonomous: false`\n\nThis task is mandatory — the phase CANNOT pass verification without it. Build and\ntype checks will pass without the push (types come from config, not the live database),\ncreating a false-positive verification state.\n</schema_push_requirement>\n```\n\nDisplay: `Schema files detected ({SCHEMA_ORM}) — [BLOCKING] push task will be injected into plans`\n\n**If no schema-relevant files detected:** Skip silently.\n"
|
||
},
|
||
"produces": [],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "workflow.schema_push_detection",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"capId": "security",
|
||
"point": "plan:pre",
|
||
"into": "planner",
|
||
"fragment": {
|
||
"inline": "Each PLAN.md must include a <threat_model> block when security enforcement is active. Use the configured ASVS level and blocking threshold from workflow.security_asvs_level and workflow.security_block_on."
|
||
},
|
||
"configValues": {
|
||
"security_asvs_level": "workflow.security_asvs_level",
|
||
"security_block_on": "workflow.security_block_on"
|
||
},
|
||
"produces": [],
|
||
"consumes": [
|
||
"CONTEXT.md"
|
||
],
|
||
"when": "workflow.security_enforcement"
|
||
},
|
||
{
|
||
"capId": "tdd",
|
||
"point": "plan:pre",
|
||
"into": "planner",
|
||
"fragment": {
|
||
"inline": "<tdd_mode_active>\n**TDD Mode is ENABLED.** Apply TDD heuristics to all eligible tasks:\n- Business logic with defined I/O → type: tdd\n- API endpoints with request/response contracts → type: tdd\n- Data transformations, validation, algorithms → type: tdd\n- UI, config, glue code, CRUD → standard plan (type: execute)\nEach TDD plan gets one feature with RED/GREEN/REFACTOR gate sequence.\n</tdd_mode_active>"
|
||
},
|
||
"produces": [],
|
||
"consumes": [],
|
||
"when": "workflow.tdd_mode",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"gates": [
|
||
{
|
||
"capId": "drift",
|
||
"point": "plan:pre",
|
||
"check": {
|
||
"query": "verify.codebase-drift"
|
||
},
|
||
"when": "workflow.plan_drift_precheck",
|
||
"blocking": false,
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"capId": "ui",
|
||
"point": "plan:pre",
|
||
"check": {
|
||
"query": "ui.plan-gate"
|
||
},
|
||
"when": "workflow.ui_safety_gate",
|
||
"blocking": true,
|
||
"onError": "halt"
|
||
}
|
||
]
|
||
},
|
||
"plan:post": {
|
||
"steps": [
|
||
{
|
||
"capId": "mempalace",
|
||
"point": "plan:post",
|
||
"ref": {
|
||
"skill": "mempalace-capture"
|
||
},
|
||
"produces": [],
|
||
"consumes": [
|
||
"PLAN.md"
|
||
],
|
||
"when": "mempalace.enabled",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"contributions": [
|
||
{
|
||
"capId": "external-job",
|
||
"point": "plan:post",
|
||
"into": "planner",
|
||
"fragment": {
|
||
"path": "fragments/plan-post.md",
|
||
"inline": "<!-- external-job capability — plan:post fragment, injected into the planner (#1164). -->\n\n## Tag runtime budgets on long tasks\n\nFor every `<task>` likely to exceed ~2 minutes of real compute, emit a\n`<runtime_budget>` child element so execute can classify it:\n\n- `<runtime_budget>quick</runtime_budget>` — under ~2 min; runs normally.\n- `<runtime_budget>medium</runtime_budget>` — ~2–30 min; foreground, but with\n progress expectations.\n- `<runtime_budget>unknown</runtime_budget>` — runtime not yet characterized;\n execute must run a first-health check and set a soft-review deadline before\n trusting the child timeout. Define a progress signal and an abort condition.\n- `<runtime_budget>long_compute</runtime_budget>` — legitimately over ~30–60 min\n (HPC solver, model training, large simulations). Execute must **externalize**\n this as an async external job (see the execute:wave:post fragment) rather than\n blocking the agent turn.\n\nFor any `long_compute` task, also declare the async contract the executor will\nneed: the `submit_command`, the `expected_artifacts` the job must produce, and\nthe `verification_command` that proves the output before the plan can close.\nDo not hardcode a cluster account, partition, or project path — the planner\nnever knows the scheduler layout; it declares the contract, the executor's\nadapter fills the backend specifics.\n"
|
||
},
|
||
"produces": [],
|
||
"consumes": [],
|
||
"when": "external_job.enabled",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"gates": [
|
||
{
|
||
"capId": "gap-analysis",
|
||
"point": "plan:post",
|
||
"check": {
|
||
"query": "gap-analysis.plan-post"
|
||
},
|
||
"when": "workflow.post_planning_gaps",
|
||
"blocking": false,
|
||
"onError": "skip"
|
||
}
|
||
]
|
||
},
|
||
"execute:pre": {
|
||
"steps": [],
|
||
"contributions": [],
|
||
"gates": []
|
||
},
|
||
"execute:wave:pre": {
|
||
"steps": [],
|
||
"contributions": [],
|
||
"gates": []
|
||
},
|
||
"execute:wave:post": {
|
||
"steps": [],
|
||
"contributions": [
|
||
{
|
||
"capId": "external-job",
|
||
"point": "execute:wave:post",
|
||
"into": "executor",
|
||
"fragment": {
|
||
"path": "fragments/execute-wave-post.md",
|
||
"inline": "<!-- external-job capability — execute:wave:post fragment, injected into the executor (#1164).\n\n Why wave:post, not wave:pre (#1164 refinement A): execute-phase.md only\n dispatches execute:wave:post today — wave:pre is declared in the loop host\n contract but not rendered. Wiring wave:pre dispatch is a core-loop change\n #1164 puts out of scope. The executor therefore honors this classification\n guidance BEFORE running any task tagged <runtime_budget>long_compute</runtime_budget>,\n whether in the current or a subsequent wave, and externalizes rather than\n blocking the turn. -->\n\n## Externalize long-running compute (async external job)\n\nIf the current plan's task is tagged `<runtime_budget>long_compute</runtime_budget>`\n(see the plan-phase fragment), do **not** run it in the foreground — it would\nblock the agent turn for hours. Instead externalize it and record a durable\nhalf-state:\n\n1. **Classify the runtime.** `quick` (<2 min) and `medium` (<~30 min) run\n normally. `unknown` requires a first-health check and a soft-review deadline\n before consuming the child timeout. `long_compute` (>30–60 min) is\n externalized.\n2. **Submit via the scheduler adapter** (default `external_job.backend: slurm`):\n ```bash\n node scripts/slurm-adapter.cjs submit \\\n --plan <plan_id> --phase <phase> -- sbatch --parsable \\\n --output=Artifacts/jobs/%j/out.log ./run.sh\n ```\n The helper writes `.planning/async-jobs/<job>.json` (the versioned stability\n contract — `docs/reference/planning-artifacts.md`) and refuses to create a\n second non-terminal manifest for a `plan_id` that already has one\n (duplicate-execution guard).\n3. **Commit the manifest + a handoff**, then return **`external_job_waiting`**\n and stop. Do **not** write `SUMMARY.md` — SUMMARY is deferred until the job\n reaches a terminal state and its `expected_artifacts` are verified.\n4. **Resume path.** `execute-phase` safe-resume, `resume-project`, and\n `pause-work` reconcile against the manifest and never re-dispatch the plan.\n When the job is `completed-unverified`, run `verification_command` (surface\n it; it is untrusted — confirm before executing), then write `SUMMARY.md` and\n close the plan.\n\nManifest commands cross a trust seam: a Capability (or anything that can write\n`.planning/`) produces them; the core loop consumes them. Never auto-run\n`submit_command` / `verification_command` / `resume_command` — surface the exact\ncommand and require explicit confirmation first.\n"
|
||
},
|
||
"produces": [
|
||
".planning/async-jobs/<job>.json"
|
||
],
|
||
"consumes": [
|
||
"PLAN.md"
|
||
],
|
||
"when": "external_job.enabled",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"capId": "mempalace",
|
||
"point": "execute:wave:post",
|
||
"into": "verifier",
|
||
"fragment": {
|
||
"path": "fragments/capture-problems.md",
|
||
"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: `mempalace mine` / `mempalace hook run`. 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"
|
||
},
|
||
"produces": [],
|
||
"consumes": [],
|
||
"when": "mempalace.enabled",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"gates": [
|
||
{
|
||
"capId": "drift",
|
||
"point": "execute:wave:post",
|
||
"check": {
|
||
"query": "verify.schema-drift"
|
||
},
|
||
"when": "workflow.schema_drift_gate",
|
||
"blocking": true,
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"capId": "drift",
|
||
"point": "execute:wave:post",
|
||
"check": {
|
||
"query": "verify.codebase-drift"
|
||
},
|
||
"when": "workflow.schema_drift_gate",
|
||
"blocking": false,
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"capId": "ui",
|
||
"point": "execute:wave:post",
|
||
"check": {
|
||
"query": "ui.safety-gate"
|
||
},
|
||
"when": "workflow.ui_safety_gate",
|
||
"blocking": true,
|
||
"onError": "halt"
|
||
}
|
||
]
|
||
},
|
||
"execute:post": {
|
||
"steps": [
|
||
{
|
||
"capId": "code-review",
|
||
"point": "execute:post",
|
||
"ref": {
|
||
"skill": "code-review"
|
||
},
|
||
"produces": [
|
||
"REVIEW.md"
|
||
],
|
||
"consumes": [
|
||
"SUMMARY.md"
|
||
],
|
||
"when": "workflow.code_review",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"contributions": [],
|
||
"gates": [
|
||
{
|
||
"capId": "tdd",
|
||
"point": "execute:post",
|
||
"check": {
|
||
"query": "tdd.review-checkpoint"
|
||
},
|
||
"when": "workflow.tdd_mode",
|
||
"blocking": false,
|
||
"onError": "skip"
|
||
}
|
||
]
|
||
},
|
||
"verify:pre": {
|
||
"steps": [],
|
||
"contributions": [],
|
||
"gates": []
|
||
},
|
||
"verify:post": {
|
||
"steps": [
|
||
{
|
||
"capId": "mempalace",
|
||
"point": "verify:post",
|
||
"ref": {
|
||
"skill": "mempalace-capture"
|
||
},
|
||
"produces": [],
|
||
"consumes": [
|
||
"SUMMARY.md"
|
||
],
|
||
"when": "mempalace.enabled",
|
||
"onError": "skip"
|
||
},
|
||
{
|
||
"capId": "nyquist",
|
||
"point": "verify:post",
|
||
"ref": {
|
||
"skill": "validate-phase"
|
||
},
|
||
"produces": [
|
||
"VALIDATION.md"
|
||
],
|
||
"consumes": [
|
||
"SUMMARY.md"
|
||
],
|
||
"when": "workflow.nyquist_validation",
|
||
"onError": "halt"
|
||
},
|
||
{
|
||
"capId": "security",
|
||
"point": "verify:post",
|
||
"ref": {
|
||
"skill": "secure-phase"
|
||
},
|
||
"produces": [
|
||
"SECURITY.md"
|
||
],
|
||
"consumes": [
|
||
"SUMMARY.md"
|
||
],
|
||
"when": "workflow.security_enforcement",
|
||
"onError": "halt"
|
||
},
|
||
{
|
||
"capId": "ui",
|
||
"point": "verify:post",
|
||
"ref": {
|
||
"skill": "ui-review"
|
||
},
|
||
"produces": [
|
||
"UI-REVIEW.md"
|
||
],
|
||
"consumes": [
|
||
"UI-SPEC.md"
|
||
],
|
||
"when": "workflow.ui_review",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"contributions": [],
|
||
"gates": []
|
||
},
|
||
"ship:pre": {
|
||
"steps": [],
|
||
"contributions": [],
|
||
"gates": [
|
||
{
|
||
"capId": "security",
|
||
"point": "ship:pre",
|
||
"check": {
|
||
"predicate": {
|
||
"kind": "artifact-frontmatter-equals",
|
||
"artifact": "SECURITY.md",
|
||
"field": "threats_open",
|
||
"equals": 0
|
||
}
|
||
},
|
||
"when": "workflow.security_enforcement",
|
||
"blocking": true,
|
||
"onError": "halt"
|
||
}
|
||
]
|
||
},
|
||
"ship:post": {
|
||
"steps": [
|
||
{
|
||
"capId": "mempalace",
|
||
"point": "ship:post",
|
||
"ref": {
|
||
"agent": "gsd-mempalace-curator"
|
||
},
|
||
"produces": [],
|
||
"consumes": [
|
||
"UAT.md"
|
||
],
|
||
"when": "mempalace.enabled",
|
||
"onError": "skip"
|
||
}
|
||
],
|
||
"contributions": [],
|
||
"gates": []
|
||
}
|
||
};
|
||
|
||
const configKeys = {
|
||
"workflow.ai_integration_phase": "ai-integration",
|
||
"workflow.assumption_delta": "assumption-delta",
|
||
"workflow.code_review": "code-review",
|
||
"workflow.code_review_depth": "code-review",
|
||
"workflow.drift_threshold": "drift",
|
||
"workflow.drift_action": "drift",
|
||
"workflow.schema_drift_gate": "drift",
|
||
"workflow.plan_drift_precheck": "drift",
|
||
"external_job.enabled": "external-job",
|
||
"external_job.backend": "external-job",
|
||
"external_job.artifact_dir": "external-job",
|
||
"external_job.submit_timeout_ms": "external-job",
|
||
"external_job.poll_timeout_ms": "external-job",
|
||
"workflow.post_planning_gaps": "gap-analysis",
|
||
"graphify.enabled": "graphify",
|
||
"intel.enabled": "intel",
|
||
"mempalace.enabled": "mempalace",
|
||
"mempalace.memory_mode": "mempalace",
|
||
"mempalace.wing": "mempalace",
|
||
"mempalace.recall_on_discuss": "mempalace",
|
||
"mempalace.recall_on_plan": "mempalace",
|
||
"mempalace.capture_artifacts": "mempalace",
|
||
"mempalace.mirror_kg": "mempalace",
|
||
"mempalace.cross_project_tunnels": "mempalace",
|
||
"mempalace.diary_journal": "mempalace",
|
||
"mempalace.auto_capture_hooks": "mempalace",
|
||
"workflow.nyquist_validation": "nyquist",
|
||
"workflow.pattern_mapper": "pattern-mapper",
|
||
"profile-pipeline.enabled": "profile-pipeline",
|
||
"workflow.research": "research",
|
||
"workflow.schema_push_detection": "schema-gate",
|
||
"workflow.security_enforcement": "security",
|
||
"workflow.security_asvs_level": "security",
|
||
"workflow.security_block_on": "security",
|
||
"workflow.tdd_mode": "tdd",
|
||
"workflow.ui_phase": "ui",
|
||
"workflow.ui_review": "ui",
|
||
"workflow.ui_safety_gate": "ui"
|
||
};
|
||
|
||
const configSchema = {
|
||
"workflow.ai_integration_phase": {
|
||
"owner": "ai-integration",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Prompt for an AI-SPEC design contract before planning phases that involve AI systems."
|
||
},
|
||
"workflow.assumption_delta": {
|
||
"owner": "assumption-delta",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"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)."
|
||
},
|
||
"workflow.code_review": {
|
||
"owner": "code-review",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable code-review participation in post-execution review flows."
|
||
},
|
||
"workflow.code_review_depth": {
|
||
"owner": "code-review",
|
||
"type": "enum",
|
||
"default": "standard",
|
||
"description": "Default depth for code review when no --depth override is supplied.",
|
||
"values": [
|
||
"quick",
|
||
"standard",
|
||
"deep"
|
||
]
|
||
},
|
||
"workflow.drift_threshold": {
|
||
"owner": "drift",
|
||
"type": "number",
|
||
"default": 3,
|
||
"description": "Minimum number of new structural elements (directories, barrel exports, migrations, routes) before the codebase drift gate triggers a warn or auto-remap action."
|
||
},
|
||
"workflow.drift_action": {
|
||
"owner": "drift",
|
||
"type": "enum",
|
||
"default": "warn",
|
||
"description": "Action taken by the codebase drift gate when the threshold is exceeded: warn (advisory message) or auto-remap (spawn gsd-codebase-mapper agent to refresh STRUCTURE.md).",
|
||
"values": [
|
||
"warn",
|
||
"auto-remap"
|
||
]
|
||
},
|
||
"workflow.schema_drift_gate": {
|
||
"owner": "drift",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable the drift gates at execute:wave:post. When enabled, the schema drift gate blocks verification if schema-relevant files changed during execution but no database push command was executed; the codebase drift gate (non-blocking) warns when structural additions exceed the drift_threshold."
|
||
},
|
||
"workflow.plan_drift_precheck": {
|
||
"owner": "drift",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable the non-blocking codebase drift pre-check at plan:pre, before /gsd:plan-phase spawns the planner. When enabled, a stale STRUCTURE.md (structural additions exceeding drift_threshold) is surfaced up front as a warn-only advisory pointing to /gsd:map-codebase; it never blocks planning and never spawns the mapper agent. Separate from schema_drift_gate so autonomous/CI runs can silence the plan-time advisory while keeping the execute:wave:post gates enabled."
|
||
},
|
||
"external_job.enabled": {
|
||
"owner": "external-job",
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Master toggle for the async external-job producer capability. Default-off: the core loop consumes manifests whether or not this is on, but no manifest is ever written unless an executor opts in here."
|
||
},
|
||
"external_job.backend": {
|
||
"owner": "external-job",
|
||
"type": "enum",
|
||
"default": "slurm",
|
||
"description": "Scheduler backend. SLURM is the first adapter; the field is the pluggability seam for future backends (LSF, PBS, Kubernetes batch). Core never interprets this value.",
|
||
"values": [
|
||
"slurm"
|
||
]
|
||
},
|
||
"external_job.artifact_dir": {
|
||
"owner": "external-job",
|
||
"type": "string",
|
||
"default": "Artifacts/jobs",
|
||
"description": "Root for per-job artifact directories (e.g. Artifacts/jobs/<jobid>/). Avoids fixed log paths and hardcoding a cluster/project layout. Surfaced by the adapter (`slurm-adapter.cjs submit` prints the resolved value); override via GSD_EXTERNAL_JOB_ARTIFACT_DIR."
|
||
},
|
||
"external_job.submit_timeout_ms": {
|
||
"owner": "external-job",
|
||
"type": "number",
|
||
"default": 30000,
|
||
"description": "Hard timeout (ms) for the scheduler submit subprocess (e.g. sbatch). Bounded per CLAUDE.md unbounded-subprocess policy. Read by the adapter (env GSD_SLURM_SUBMIT_TIMEOUT_MS overrides)."
|
||
},
|
||
"external_job.poll_timeout_ms": {
|
||
"owner": "external-job",
|
||
"type": "number",
|
||
"default": 15000,
|
||
"description": "Hard timeout (ms) for the scheduler poll subprocess (squeue, with sacct fallback). Read by the adapter (env GSD_SLURM_POLL_TIMEOUT_MS overrides)."
|
||
},
|
||
"workflow.post_planning_gaps": {
|
||
"owner": "gap-analysis",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Run the post-planning gap analysis report after plans are generated."
|
||
},
|
||
"graphify.enabled": {
|
||
"owner": "graphify",
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Enable the graphify knowledge-graph command + skill."
|
||
},
|
||
"intel.enabled": {
|
||
"owner": "intel",
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Enable the intel code-intelligence command."
|
||
},
|
||
"mempalace.enabled": {
|
||
"owner": "mempalace",
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Master toggle for the MemPalace memory capability."
|
||
},
|
||
"mempalace.memory_mode": {
|
||
"owner": "mempalace",
|
||
"type": "enum",
|
||
"default": "augment",
|
||
"description": "How MemPalace relates to GSD native memory during recall/capture. 'augment' (default): the palace is an additive layer alongside .planning/graphs/ — native memory stays authoritative. 'kg_backend': knowledge-graph queries resolve against the palace's temporal KG as the primary source, with .planning/graphs/ as fallback. 'replace': recall resolves through the palace as the source of truth, native memory as fallback. Every mode stays onError:skip and default-resilient — an unreachable palace degrades to native memory, and GSD keeps writing .planning/graphs/ so no memory is lost. Cross-mode migration of existing .planning/graphs/ into the palace is a separate, not-yet-implemented concern.",
|
||
"values": [
|
||
"augment",
|
||
"kg_backend",
|
||
"replace"
|
||
]
|
||
},
|
||
"mempalace.wing": {
|
||
"owner": "mempalace",
|
||
"type": "string",
|
||
"default": "",
|
||
"description": "Palace wing name; empty derives from project_code / project dir."
|
||
},
|
||
"mempalace.recall_on_discuss": {
|
||
"owner": "mempalace",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Inject wake-up + search recall at discuss:pre."
|
||
},
|
||
"mempalace.recall_on_plan": {
|
||
"owner": "mempalace",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Produce MEMORY-RECALL.md at plan:pre."
|
||
},
|
||
"mempalace.capture_artifacts": {
|
||
"owner": "mempalace",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "File CONTEXT/PLAN/SUMMARY and learnings into the palace at phase boundaries."
|
||
},
|
||
"mempalace.mirror_kg": {
|
||
"owner": "mempalace",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Mirror decisions/learnings into MemPalace's temporal knowledge graph."
|
||
},
|
||
"mempalace.cross_project_tunnels": {
|
||
"owner": "mempalace",
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Propose/create cross-wing tunnels at ship:post."
|
||
},
|
||
"mempalace.diary_journal": {
|
||
"owner": "mempalace",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Write a per-agent diary entry at ship:post."
|
||
},
|
||
"mempalace.auto_capture_hooks": {
|
||
"owner": "mempalace",
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Reserved / not yet implemented: will install MemPalace's native stop/precompact Claude Code hooks for passive mid-session capture (the capability's hooks array is currently empty)."
|
||
},
|
||
"workflow.nyquist_validation": {
|
||
"owner": "nyquist",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable Nyquist validation coverage auditing."
|
||
},
|
||
"workflow.pattern_mapper": {
|
||
"owner": "pattern-mapper",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Run the pattern mapper before planning when context or research is available."
|
||
},
|
||
"profile-pipeline.enabled": {
|
||
"owner": "profile-pipeline",
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Enable the developer profiling pipeline commands (scan-sessions, extract-messages, profile-sample, write-profile, etc.)."
|
||
},
|
||
"workflow.research": {
|
||
"owner": "research",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Run phase research before planning when research artifacts are missing or explicitly refreshed."
|
||
},
|
||
"workflow.schema_push_detection": {
|
||
"owner": "schema-gate",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable ORM schema push detection during planning. When schema-relevant files are detected in the phase scope, a [BLOCKING] push task is injected into the plan."
|
||
},
|
||
"workflow.security_enforcement": {
|
||
"owner": "security",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable security threat-mitigation verification before phase advancement."
|
||
},
|
||
"workflow.security_asvs_level": {
|
||
"owner": "security",
|
||
"type": "number",
|
||
"default": 1,
|
||
"description": "OWASP ASVS level used by security review guidance."
|
||
},
|
||
"workflow.security_block_on": {
|
||
"owner": "security",
|
||
"type": "enum",
|
||
"default": "high",
|
||
"description": "Minimum open threat severity that blocks advancement.",
|
||
"values": [
|
||
"critical",
|
||
"high",
|
||
"medium",
|
||
"low",
|
||
"none"
|
||
]
|
||
},
|
||
"workflow.tdd_mode": {
|
||
"owner": "tdd",
|
||
"type": "boolean",
|
||
"default": false,
|
||
"description": "Enable TDD mode: planner annotates eligible tasks type:tdd and executor enforces RED/GREEN/REFACTOR gate sequence."
|
||
},
|
||
"workflow.ui_phase": {
|
||
"owner": "ui",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable the UI design-contract gate during planning."
|
||
},
|
||
"workflow.ui_review": {
|
||
"owner": "ui",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Enable the retrospective UI audit."
|
||
},
|
||
"workflow.ui_safety_gate": {
|
||
"owner": "ui",
|
||
"type": "boolean",
|
||
"default": true,
|
||
"description": "Block execution on unmet UI-SPEC contracts."
|
||
}
|
||
};
|
||
|
||
const runtimes = {
|
||
"antigravity": {
|
||
"id": "antigravity",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Antigravity",
|
||
"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.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home-nested",
|
||
"name": "antigravity",
|
||
"parent": ".gemini",
|
||
"env": [
|
||
"ANTIGRAVITY_CONFIG_DIR"
|
||
],
|
||
"probe": [
|
||
"antigravity",
|
||
"antigravity-ide",
|
||
"antigravity-cli"
|
||
],
|
||
"probeExists": "gsd-core/VERSION"
|
||
},
|
||
"localConfigDir": ".agents",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToAntigravitySkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToAntigravitySkill"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "settings-json",
|
||
"hookEvents": "gemini",
|
||
"sandboxTier": "none",
|
||
"supportTier": 1,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": true,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "declarative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": "undocumented",
|
||
"nested": "undocumented",
|
||
"maxDepth": "undocumented",
|
||
"background": true,
|
||
"subagentToolkit": "undocumented",
|
||
"backgroundDispatch": "undocumented"
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "go"
|
||
}
|
||
}
|
||
},
|
||
"augment": {
|
||
"id": "augment",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Augment Code",
|
||
"description": "Augment Code CLI — commands + nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".augment",
|
||
"env": [
|
||
"AUGMENT_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".augment",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToAugmentSkill"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToAugmentAgent"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToAugmentSkill"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToAugmentAgent"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "settings-json",
|
||
"hookEvents": "claude",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": true,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "declarative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": "undocumented",
|
||
"maxDepth": "undocumented",
|
||
"background": true,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": "undocumented"
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"claude": {
|
||
"id": "claude",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Claude Code",
|
||
"description": "Anthropic Claude Code — primary development runtime; tier-1 support with full hook surface and skills-based global install.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".claude",
|
||
"env": [
|
||
"CLAUDE_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".claude",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClaudeSkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "settings-json",
|
||
"hookEvents": "claude",
|
||
"sandboxTier": "none",
|
||
"supportTier": 1,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": true,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [
|
||
"SubagentStop",
|
||
"Stop",
|
||
"PreCompact",
|
||
"FileChanged"
|
||
],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": true,
|
||
"maxDepth": 5,
|
||
"background": true,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"cline": {
|
||
"id": "cline",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Cline",
|
||
"description": "Cline (VS Code extension) — global-only nested-skill layout; cline-rules hook surface (.clinerules); no hook events emitted; tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".cline",
|
||
"env": [
|
||
"CLINE_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".cline",
|
||
"configFormat": "markdown-dir",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClineSkill"
|
||
}
|
||
],
|
||
"local": []
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "cline-rules",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "cline-rules",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": false,
|
||
"maxDepth": 1,
|
||
"background": true,
|
||
"subagentToolkit": "read-only",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "active",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"codebuddy": {
|
||
"id": "codebuddy",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "CodeBuddy",
|
||
"description": "CodeBuddy (Tencent) — converted commands + skills artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".codebuddy",
|
||
"env": [
|
||
"CODEBUDDY_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".codebuddy",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCodebuddyCommand"
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCodebuddySkill"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToCodebuddyAgent"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCodebuddyCommand"
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCodebuddySkill"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToCodebuddyAgent"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "settings-json",
|
||
"hookEvents": "claude",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": true,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "declarative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": false,
|
||
"maxDepth": 1,
|
||
"background": true,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"codex": {
|
||
"id": "codex",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "OpenAI Codex CLI",
|
||
"description": "OpenAI Codex CLI — shell-var command style; per-agent sandbox tiers; config.toml + hooks.json hook surface; tier-1 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".codex",
|
||
"env": [
|
||
"CODEX_HOME"
|
||
]
|
||
},
|
||
"localConfigDir": ".codex",
|
||
"configFormat": "toml",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCodexSkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCodexSkill"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "shell-var",
|
||
"hooksSurface": "codex-hooks-json",
|
||
"hookEvents": "claude",
|
||
"sandboxTier": "codex-agent-sandbox",
|
||
"supportTier": 1,
|
||
"installSurface": "codex-toml",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "declarative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": true,
|
||
"maxDepth": 1,
|
||
"background": true,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": true
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"copilot": {
|
||
"id": "copilot",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "GitHub Copilot",
|
||
"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.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".copilot",
|
||
"env": [
|
||
"COPILOT_CONFIG_DIR",
|
||
"COPILOT_HOME"
|
||
]
|
||
},
|
||
"localConfigDir": ".github",
|
||
"configFormat": "markdown",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCopilotSkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCopilotSkill"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "copilot-inline",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "copilot-instructions",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "declarative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": false,
|
||
"maxDepth": 1,
|
||
"background": true,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "undocumented"
|
||
}
|
||
}
|
||
},
|
||
"cursor": {
|
||
"id": "cursor",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Cursor",
|
||
"description": "Cursor IDE — skills + converted commands artifact layout; hooks.json surface; Claude hook event dialect; recursive skill loader (flat nesting); tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".cursor",
|
||
"env": [
|
||
"CURSOR_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".cursor",
|
||
"configFormat": "none",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": true,
|
||
"converter": "convertClaudeCommandToCursorSkill"
|
||
},
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCursorCommand"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToCursorAgent"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": true,
|
||
"converter": "convertClaudeCommandToCursorSkill"
|
||
},
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToCursorCommand"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToCursorAgent"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "cursor-hooks-json",
|
||
"hookEvents": "claude",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "cursor-hooks-json",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": true,
|
||
"maxDepth": 2,
|
||
"background": true,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": true
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"hermes": {
|
||
"id": "hermes",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Hermes Agent",
|
||
"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.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".hermes",
|
||
"env": [
|
||
"HERMES_HOME"
|
||
]
|
||
},
|
||
"localConfigDir": ".hermes",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills/gsd",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClaudeSkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills/gsd",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClaudeSkill"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "settings-json",
|
||
"hookEvents": "claude",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": true,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-programmatic",
|
||
"dispatch": {
|
||
"namedDispatch": false,
|
||
"nested": true,
|
||
"maxDepth": 1,
|
||
"background": true,
|
||
"subagentToolkit": "read-only",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "active",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "python"
|
||
}
|
||
}
|
||
},
|
||
"kilo": {
|
||
"id": "kilo",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Kilo Code",
|
||
"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.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "xdg",
|
||
"name": "kilo",
|
||
"env": [
|
||
"KILO_CONFIG_DIR",
|
||
"KILO_CONFIG",
|
||
"XDG_CONFIG_HOME"
|
||
],
|
||
"skillsHome": {
|
||
"kind": "dot-home",
|
||
"name": ".kilo",
|
||
"env": []
|
||
}
|
||
},
|
||
"localConfigDir": ".kilo",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "command",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": true,
|
||
"converter": "convertClaudeCommandToKiloSkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "command",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": true,
|
||
"converter": "convertClaudeCommandToKiloSkill"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "none",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": "kilo",
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": true,
|
||
"maxDepth": -1,
|
||
"background": true,
|
||
"subagentToolkit": "undocumented",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "active",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "bun"
|
||
}
|
||
}
|
||
},
|
||
"kimi": {
|
||
"id": "kimi",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Kimi CLI",
|
||
"description": "Kimi CLI (Moonshot AI) — generic agents root at ~/.config/agents; skills + kimi-agents artifact layout; no hook surface; no hook events; tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "generic-agents-root",
|
||
"name": "agents",
|
||
"env": [
|
||
"KIMI_CONFIG_DIR"
|
||
],
|
||
"probe": [
|
||
"~/.config/agents",
|
||
"~/.agents"
|
||
],
|
||
"probeExists": "skills"
|
||
},
|
||
"localConfigDir": ".kimi-code",
|
||
"configFormat": "none",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToKimiSkill"
|
||
},
|
||
{
|
||
"kind": "kimi-agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
}
|
||
],
|
||
"local": []
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "none",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "profile-marker-only",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": false,
|
||
"maxDepth": 1,
|
||
"background": true,
|
||
"subagentToolkit": "undocumented",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "python"
|
||
}
|
||
}
|
||
},
|
||
"opencode": {
|
||
"id": "opencode",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "OpenCode",
|
||
"description": "OpenCode — XDG-based config dir; flat command/ + skills artifact layout; settings-json config format; no lifecycle hook registration; tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "xdg",
|
||
"name": "opencode",
|
||
"env": [
|
||
"OPENCODE_CONFIG_DIR",
|
||
"OPENCODE_CONFIG",
|
||
"XDG_CONFIG_HOME"
|
||
]
|
||
},
|
||
"localConfigDir": ".opencode",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "command",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": true,
|
||
"converter": "convertClaudeCommandToOpencodeSkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "command",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": true,
|
||
"converter": "convertClaudeCommandToOpencodeSkill"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "none",
|
||
"extensionEvents": "opencode",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": true,
|
||
"permissionWriter": "opencode",
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": "undocumented",
|
||
"maxDepth": "undocumented",
|
||
"background": false,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": "undocumented"
|
||
},
|
||
"modelMode": "active",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "bun"
|
||
}
|
||
}
|
||
},
|
||
"qwen": {
|
||
"id": "qwen",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Qwen Code",
|
||
"description": "Qwen Code (Alibaba) — nested-skill artifact layout; settings-json hook surface; Claude hook event dialect; tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".qwen",
|
||
"env": [
|
||
"QWEN_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".qwen",
|
||
"configFormat": "settings-json",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClaudeSkill"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClaudeSkill"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "settings-json",
|
||
"hookEvents": "claude",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "settings-json",
|
||
"writesSharedSettings": true,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [
|
||
"SubagentStop",
|
||
"Stop",
|
||
"PreCompact"
|
||
],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": false,
|
||
"maxDepth": 1,
|
||
"background": true,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"trae": {
|
||
"id": "trae",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Trae IDE",
|
||
"description": "Trae IDE — nested-skill artifact layout; no hook surface (profile-marker-only config); tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".trae",
|
||
"env": [
|
||
"TRAE_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".trae",
|
||
"configFormat": "none",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToTraeSkill"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToTraeAgent"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToTraeSkill"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToTraeAgent"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "none",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "profile-marker-only",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "imperative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": "undocumented",
|
||
"maxDepth": "undocumented",
|
||
"background": true,
|
||
"subagentToolkit": "undocumented",
|
||
"backgroundDispatch": "undocumented"
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "engine",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "node"
|
||
}
|
||
}
|
||
},
|
||
"windsurf": {
|
||
"id": "windsurf",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.3",
|
||
"title": "Windsurf",
|
||
"description": "Windsurf (Codeium) — workspace workflow artifact layout for slash commands; no hook surface; no hook events; tier-2 support.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home-nested",
|
||
"name": "windsurf",
|
||
"parent": ".codeium",
|
||
"env": [
|
||
"WINDSURF_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".windsurf",
|
||
"configFormat": "none",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToWindsurfAgent"
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "workflows",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToWindsurfWorkflow"
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": "convertClaudeAgentToWindsurfAgent"
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "none",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "profile-marker-only",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "declarative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": "undocumented",
|
||
"nested": "undocumented",
|
||
"maxDepth": "undocumented",
|
||
"background": "undocumented",
|
||
"subagentToolkit": "undocumented",
|
||
"backgroundDispatch": "undocumented"
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "undocumented"
|
||
}
|
||
}
|
||
},
|
||
"zcode": {
|
||
"id": "zcode",
|
||
"role": "runtime",
|
||
"version": "1.7.0-rc.2",
|
||
"title": "ZCode",
|
||
"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.",
|
||
"tier": "core",
|
||
"requires": [],
|
||
"engines": {
|
||
"gsd": ">=1.6.0"
|
||
},
|
||
"runtime": {
|
||
"configHome": {
|
||
"kind": "dot-home",
|
||
"name": ".zcode",
|
||
"env": [
|
||
"ZCODE_CONFIG_DIR"
|
||
]
|
||
},
|
||
"localConfigDir": ".zcode",
|
||
"configFormat": "none",
|
||
"artifactLayout": {
|
||
"global": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClaudeSkill"
|
||
},
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
}
|
||
],
|
||
"local": [
|
||
{
|
||
"kind": "skills",
|
||
"destSubpath": "skills",
|
||
"prefix": "gsd-",
|
||
"nesting": "nested",
|
||
"recursive": false,
|
||
"converter": "convertClaudeCommandToClaudeSkill"
|
||
},
|
||
{
|
||
"kind": "commands",
|
||
"destSubpath": "commands",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
},
|
||
{
|
||
"kind": "agents",
|
||
"destSubpath": "agents",
|
||
"prefix": "gsd-",
|
||
"nesting": "flat",
|
||
"recursive": false,
|
||
"converter": null
|
||
}
|
||
]
|
||
},
|
||
"commandStyle": "slash-hyphen",
|
||
"hooksSurface": "none",
|
||
"sandboxTier": "none",
|
||
"supportTier": 2,
|
||
"installSurface": "profile-marker-only",
|
||
"writesSharedSettings": false,
|
||
"permissionWriter": null,
|
||
"extendedHookEvents": [],
|
||
"hostIntegration": {
|
||
"embeddingMode": "declarative",
|
||
"commandSurface": "slash-file",
|
||
"dispatch": {
|
||
"namedDispatch": true,
|
||
"nested": "undocumented",
|
||
"maxDepth": "undocumented",
|
||
"background": false,
|
||
"subagentToolkit": "full",
|
||
"backgroundDispatch": false
|
||
},
|
||
"modelMode": "passive",
|
||
"hookBus": "host",
|
||
"stateIO": "filesystem",
|
||
"transport": "mcp",
|
||
"runtime": "electron"
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
const commandFamilies = {
|
||
"audit-open": {
|
||
"capId": "audit",
|
||
"module": "audit-command-router.cjs",
|
||
"router": "routeAuditOpen"
|
||
},
|
||
"audit-uat": {
|
||
"capId": "audit",
|
||
"module": "audit-command-router.cjs",
|
||
"router": "routeAuditUat"
|
||
},
|
||
"extract-messages": {
|
||
"capId": "profile-pipeline",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeExtractMessages"
|
||
},
|
||
"generate-claude-md": {
|
||
"capId": "profile-pipeline",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeGenerateClaudeMd"
|
||
},
|
||
"generate-claude-profile": {
|
||
"capId": "profile-pipeline",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeGenerateClaudeProfile"
|
||
},
|
||
"generate-dev-preferences": {
|
||
"capId": "profile-pipeline",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeGenerateDevPreferences"
|
||
},
|
||
"graphify": {
|
||
"capId": "graphify",
|
||
"module": "graphify-command-router.cjs",
|
||
"router": "routeGraphifyCommand"
|
||
},
|
||
"intel": {
|
||
"capId": "intel",
|
||
"module": "intel-command-router.cjs",
|
||
"router": "routeIntelCommand"
|
||
},
|
||
"profile-questionnaire": {
|
||
"capId": "profile-pipeline",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeProfileQuestionnaire"
|
||
},
|
||
"profile-sample": {
|
||
"capId": "profile-pipeline",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeProfileSample"
|
||
},
|
||
"scan-sessions": {
|
||
"capId": "profile-pipeline",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeScanSessions"
|
||
},
|
||
"write-profile": {
|
||
"capId": "profile-pipeline",
|
||
"module": "profile-pipeline-command-router.cjs",
|
||
"router": "routeWriteProfile"
|
||
}
|
||
};
|
||
|
||
const capabilityClusters = {
|
||
"ai-integration": [
|
||
"ai-integration-phase"
|
||
],
|
||
"code-review": [
|
||
"code-review"
|
||
],
|
||
"graphify": [
|
||
"graphify"
|
||
],
|
||
"mempalace": [
|
||
"mempalace-capture",
|
||
"mempalace-recall"
|
||
],
|
||
"nyquist": [
|
||
"validate-phase"
|
||
],
|
||
"profile-pipeline": [
|
||
"profile-user"
|
||
],
|
||
"security": [
|
||
"secure-phase"
|
||
],
|
||
"ui": [
|
||
"ui-phase",
|
||
"ui-review"
|
||
]
|
||
};
|
||
|
||
const profileMembership = {
|
||
"ai-integration": {
|
||
"tier": "full",
|
||
"profiles": [
|
||
"full"
|
||
]
|
||
},
|
||
"code-review": {
|
||
"tier": "full",
|
||
"profiles": [
|
||
"full"
|
||
]
|
||
},
|
||
"graphify": {
|
||
"tier": "full",
|
||
"profiles": [
|
||
"full"
|
||
]
|
||
},
|
||
"mempalace": {
|
||
"tier": "full",
|
||
"profiles": [
|
||
"full"
|
||
]
|
||
},
|
||
"nyquist": {
|
||
"tier": "full",
|
||
"profiles": [
|
||
"full"
|
||
]
|
||
},
|
||
"profile-pipeline": {
|
||
"tier": "full",
|
||
"profiles": [
|
||
"full"
|
||
]
|
||
},
|
||
"security": {
|
||
"tier": "full",
|
||
"profiles": [
|
||
"full"
|
||
]
|
||
},
|
||
"ui": {
|
||
"tier": "full",
|
||
"profiles": [
|
||
"full"
|
||
]
|
||
}
|
||
};
|
||
|
||
const _requiresGraph = {
|
||
"ai-integration": [],
|
||
"antigravity": [],
|
||
"assumption-delta": [],
|
||
"audit": [],
|
||
"augment": [],
|
||
"claude": [],
|
||
"cline": [],
|
||
"code-review": [],
|
||
"codebuddy": [],
|
||
"codex": [],
|
||
"copilot": [],
|
||
"cursor": [],
|
||
"drift": [],
|
||
"external-job": [],
|
||
"gap-analysis": [],
|
||
"graphify": [],
|
||
"hermes": [],
|
||
"intel": [],
|
||
"kilo": [],
|
||
"kimi": [],
|
||
"mempalace": [],
|
||
"nyquist": [],
|
||
"opencode": [],
|
||
"pattern-mapper": [
|
||
"research"
|
||
],
|
||
"profile-pipeline": [],
|
||
"qwen": [],
|
||
"research": [],
|
||
"schema-gate": [],
|
||
"security": [],
|
||
"tdd": [],
|
||
"trae": [],
|
||
"ui": [],
|
||
"windsurf": [],
|
||
"zcode": []
|
||
};
|
||
|
||
function requiresClosure(id) {
|
||
const visited = new Set();
|
||
const queue = [id];
|
||
while (queue.length > 0) {
|
||
const current = queue.shift();
|
||
const reqs = _requiresGraph[current] || [];
|
||
for (const req of reqs) {
|
||
if (!visited.has(req)) {
|
||
visited.add(req);
|
||
queue.push(req);
|
||
}
|
||
}
|
||
}
|
||
return visited;
|
||
}
|
||
|
||
module.exports = {
|
||
version: '1',
|
||
capabilities,
|
||
bySkill,
|
||
byAgent,
|
||
byLoopPoint,
|
||
configKeys,
|
||
configSchema,
|
||
runtimes,
|
||
commandFamilies,
|
||
capabilityClusters,
|
||
profileMembership,
|
||
requiresClosure,
|
||
};
|