Files
msd-core/gsd-core/bin/lib/capability-registry.cjs
Tom Boucher 6dbd895028 feat(#910): federated config merge in config-loader (ADR-857 phase 3b) (#914)
Build the federated config merge: each capability owns its config-key slice
(ADR-857 decision 3 / ADR-894), and loadConfig merges them defensively. The
registry now emits a full configSchema index ({key:{owner,type,default,
description}}, generator-validated); a new src/federated-config.cts resolves
federated keys defensively (skip central keys -> pending-migration warning,
skip malformed slices -> warning never throw, else type-checked user override
?? default, with nested dotted-path lookup and enum validation); and loadConfig
applies the overlay on every return path.

Wired as a provably-empty no-op channel: every UI-pilot key is still central,
so validKeys is empty and loadConfig returns byte-identical output on all paths
(identity return when the overlay is empty; shared CONFIG_DEFAULTS never
mutated). Registry-only; no key is cut over; nothing in the live loop changes.

Closes #910

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 23:37:41 -04:00

264 lines
5.1 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 = {
"ui": {
"id": "ui",
"role": "feature",
"title": "UI design contracts",
"description": "UI-SPEC design contract + retrospective UI audit for frontend phases.",
"tier": "standard",
"requires": [],
"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": "execute:wave:post",
"check": {
"query": "ui.safety-gate"
},
"when": "workflow.ui_safety_gate",
"blocking": true,
"onError": "halt"
}
]
}
};
const bySkill = {
"ui-phase": "ui",
"ui-review": "ui"
};
const byAgent = {
"gsd-ui-checker": "ui",
"gsd-ui-auditor": "ui"
};
const byLoopPoint = {
"discuss:pre": {
"steps": [],
"contributions": [],
"gates": []
},
"discuss:post": {
"steps": [],
"contributions": [],
"gates": []
},
"plan:pre": {
"steps": [
{
"capId": "ui",
"point": "plan:pre",
"ref": {
"skill": "ui-phase"
},
"produces": [
"UI-SPEC.md"
],
"consumes": [
"CONTEXT.md"
],
"when": "workflow.ui_phase",
"onError": "skip"
}
],
"contributions": [],
"gates": []
},
"plan:post": {
"steps": [],
"contributions": [],
"gates": []
},
"execute:pre": {
"steps": [],
"contributions": [],
"gates": []
},
"execute:wave:pre": {
"steps": [],
"contributions": [],
"gates": []
},
"execute:wave:post": {
"steps": [],
"contributions": [],
"gates": [
{
"capId": "ui",
"point": "execute:wave:post",
"check": {
"query": "ui.safety-gate"
},
"when": "workflow.ui_safety_gate",
"blocking": true,
"onError": "halt"
}
]
},
"execute:post": {
"steps": [],
"contributions": [],
"gates": []
},
"verify:pre": {
"steps": [],
"contributions": [],
"gates": []
},
"verify:post": {
"steps": [
{
"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": []
},
"ship:post": {
"steps": [],
"contributions": [],
"gates": []
}
};
const configKeys = {
"workflow.ui_phase": "ui",
"workflow.ui_review": "ui",
"workflow.ui_safety_gate": "ui"
};
const configSchema = {
"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 = {};
const _requiresGraph = {
"ui": []
};
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,
requiresClosure,
};