@hegemonart/get-design-done 1.59.3 → 1.59.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +61 -0
- package/SKILL.md +2 -0
- package/figma-plugin/README.md +61 -0
- package/figma-plugin/code.ts +36 -0
- package/figma-plugin/manifest.json +12 -0
- package/figma-plugin/package-lock.json +35 -0
- package/figma-plugin/package.json +12 -0
- package/figma-plugin/src/export-variables.ts +144 -0
- package/figma-plugin/src/payload-schema.ts +250 -0
- package/figma-plugin/tsconfig.json +16 -0
- package/figma-plugin/ui.html +44 -0
- package/hooks/budget-enforcer.ts +134 -7
- package/hooks/gdd-intel-trigger.js +3 -3
- package/package.json +6 -1
- package/reference/DEPRECATIONS.md +3 -3
- package/reference/live-mode-integration.md +1 -1
- package/reference/registry.json +1 -1
- package/reference/runtime-models.md +15 -15
- package/reference/schemas/generated.d.ts +4 -0
- package/reference/schemas/runtime-models.schema.json +5 -0
- package/reference/skill-metadata.md +4 -4
- package/reference/skill-placeholders.md +2 -2
- package/scripts/build-skills.cjs +146 -0
- package/scripts/generate-skill-frontmatter.cjs +243 -0
- package/scripts/lib/bandit-router/integration.cjs +38 -0
- package/scripts/lib/install/installer.cjs +133 -1
- package/scripts/lib/manifest/scaffolder.cjs +1 -1
- package/scripts/lib/manifest/schemas/skills.schema.json +1 -1
- package/scripts/lib/manifest/skills.json +1 -1
- package/scripts/lib/new-addendum.cjs +1 -1
- package/scripts/skill-templates/README.md +90 -0
- package/scripts/skill-templates/add-backlog/SKILL.md +48 -0
- package/scripts/skill-templates/analyze-dependencies/SKILL.md +95 -0
- package/scripts/skill-templates/apply-reflections/SKILL.md +109 -0
- package/scripts/skill-templates/apply-reflections/apply-reflections-procedure.md +170 -0
- package/scripts/skill-templates/audit/SKILL.md +79 -0
- package/scripts/skill-templates/bandit-reset/SKILL.md +91 -0
- package/scripts/skill-templates/bandit-status/SKILL.md +94 -0
- package/scripts/skill-templates/benchmark/SKILL.md +65 -0
- package/scripts/skill-templates/bootstrap-ds/SKILL.md +43 -0
- package/scripts/skill-templates/brief/SKILL.md +145 -0
- package/scripts/skill-templates/budget/SKILL.md +45 -0
- package/scripts/skill-templates/cache-manager/SKILL.md +66 -0
- package/scripts/skill-templates/cache-manager/cache-policy.md +126 -0
- package/scripts/skill-templates/check-update/SKILL.md +98 -0
- package/scripts/skill-templates/compare/SKILL.md +82 -0
- package/scripts/skill-templates/compare/compare-rubric.md +171 -0
- package/scripts/skill-templates/complete-cycle/SKILL.md +81 -0
- package/scripts/skill-templates/connections/SKILL.md +71 -0
- package/scripts/skill-templates/connections/connections-onboarding.md +608 -0
- package/scripts/skill-templates/context/SKILL.md +137 -0
- package/scripts/skill-templates/continue/SKILL.md +24 -0
- package/scripts/skill-templates/darkmode/SKILL.md +76 -0
- package/scripts/skill-templates/darkmode/darkmode-audit-procedure.md +258 -0
- package/scripts/skill-templates/debug/SKILL.md +41 -0
- package/scripts/skill-templates/debug/debug-feedback-loops.md +119 -0
- package/scripts/skill-templates/design/SKILL.md +118 -0
- package/scripts/skill-templates/design/design-procedure.md +304 -0
- package/scripts/skill-templates/discuss/SKILL.md +96 -0
- package/scripts/skill-templates/do/SKILL.md +45 -0
- package/scripts/skill-templates/explore/SKILL.md +118 -0
- package/scripts/skill-templates/explore/explore-procedure.md +267 -0
- package/scripts/skill-templates/export/SKILL.md +30 -0
- package/scripts/skill-templates/extract-learnings/SKILL.md +114 -0
- package/scripts/skill-templates/fast/SKILL.md +91 -0
- package/scripts/skill-templates/figma-extract/SKILL.md +64 -0
- package/scripts/skill-templates/figma-write/SKILL.md +50 -0
- package/scripts/skill-templates/graphify/SKILL.md +49 -0
- package/scripts/skill-templates/health/SKILL.md +99 -0
- package/scripts/skill-templates/health/health-mcp-detection.md +44 -0
- package/scripts/skill-templates/health/health-skill-length-report.md +69 -0
- package/scripts/skill-templates/help/SKILL.md +60 -0
- package/scripts/skill-templates/instinct/SKILL.md +111 -0
- package/scripts/skill-templates/list-assumptions/SKILL.md +61 -0
- package/scripts/skill-templates/list-pins/SKILL.md +27 -0
- package/scripts/skill-templates/live/SKILL.md +98 -0
- package/scripts/skill-templates/locale/SKILL.md +51 -0
- package/scripts/skill-templates/map/SKILL.md +89 -0
- package/scripts/skill-templates/migrate/SKILL.md +70 -0
- package/scripts/skill-templates/migrate-context/SKILL.md +123 -0
- package/scripts/skill-templates/new-addendum/SKILL.md +81 -0
- package/scripts/skill-templates/new-cycle/SKILL.md +37 -0
- package/scripts/skill-templates/new-project/SKILL.md +53 -0
- package/scripts/skill-templates/new-skill/SKILL.md +90 -0
- package/scripts/skill-templates/next/SKILL.md +68 -0
- package/scripts/skill-templates/note/SKILL.md +48 -0
- package/scripts/skill-templates/openrouter-status/SKILL.md +86 -0
- package/scripts/skill-templates/optimize/SKILL.md +97 -0
- package/scripts/skill-templates/override/SKILL.md +86 -0
- package/scripts/skill-templates/paper-write/SKILL.md +54 -0
- package/scripts/skill-templates/pause/SKILL.md +77 -0
- package/scripts/skill-templates/peer-cli-add/SKILL.md +88 -0
- package/scripts/skill-templates/peer-cli-add/peer-cli-protocol.md +161 -0
- package/scripts/skill-templates/peer-cli-customize/SKILL.md +89 -0
- package/scripts/skill-templates/peers/SKILL.md +96 -0
- package/scripts/skill-templates/pencil-write/SKILL.md +54 -0
- package/scripts/skill-templates/pin/SKILL.md +37 -0
- package/scripts/skill-templates/plan/SKILL.md +105 -0
- package/scripts/skill-templates/plan/plan-procedure.md +278 -0
- package/scripts/skill-templates/plant-seed/SKILL.md +48 -0
- package/scripts/skill-templates/pr-branch/SKILL.md +32 -0
- package/scripts/skill-templates/progress/SKILL.md +107 -0
- package/scripts/skill-templates/quality-gate/SKILL.md +90 -0
- package/scripts/skill-templates/quality-gate/threat-modeling.md +101 -0
- package/scripts/skill-templates/quick/SKILL.md +44 -0
- package/scripts/skill-templates/reapply-patches/SKILL.md +32 -0
- package/scripts/skill-templates/recall/SKILL.md +75 -0
- package/scripts/skill-templates/reflect/SKILL.md +85 -0
- package/scripts/skill-templates/reflect/procedures/capability-gap-scan.md +119 -0
- package/scripts/skill-templates/report-issue/SKILL.md +53 -0
- package/scripts/skill-templates/report-issue/report-issue-procedure.md +119 -0
- package/scripts/skill-templates/resume/SKILL.md +93 -0
- package/scripts/skill-templates/review-backlog/SKILL.md +46 -0
- package/scripts/skill-templates/review-decisions/SKILL.md +42 -0
- package/scripts/skill-templates/roi/SKILL.md +54 -0
- package/scripts/skill-templates/rollout-status/SKILL.md +35 -0
- package/scripts/skill-templates/router/SKILL.md +89 -0
- package/scripts/skill-templates/router/capability-gap-emitter.md +65 -0
- package/scripts/skill-templates/router/router-pick-emitter.md +78 -0
- package/scripts/skill-templates/router/router-rules.md +84 -0
- package/scripts/skill-templates/settings/SKILL.md +87 -0
- package/scripts/skill-templates/ship/SKILL.md +48 -0
- package/scripts/skill-templates/sketch/SKILL.md +78 -0
- package/scripts/skill-templates/sketch-wrap-up/SKILL.md +92 -0
- package/scripts/skill-templates/skill-manifest/SKILL.md +79 -0
- package/scripts/skill-templates/spike/SKILL.md +67 -0
- package/scripts/skill-templates/spike-wrap-up/SKILL.md +86 -0
- package/scripts/skill-templates/start/SKILL.md +67 -0
- package/scripts/skill-templates/start/start-procedure.md +115 -0
- package/scripts/skill-templates/state/SKILL.md +106 -0
- package/scripts/skill-templates/stats/SKILL.md +51 -0
- package/scripts/skill-templates/style/SKILL.md +71 -0
- package/scripts/skill-templates/style/style-doc-procedure.md +150 -0
- package/scripts/skill-templates/synthesize/SKILL.md +94 -0
- package/scripts/skill-templates/timeline/SKILL.md +66 -0
- package/scripts/skill-templates/todo/SKILL.md +64 -0
- package/scripts/skill-templates/turn-closeout/SKILL.md +95 -0
- package/scripts/skill-templates/undo/SKILL.md +31 -0
- package/scripts/skill-templates/unlock-decision/SKILL.md +54 -0
- package/scripts/skill-templates/unpin/SKILL.md +31 -0
- package/scripts/skill-templates/update/SKILL.md +56 -0
- package/scripts/skill-templates/using-gdd/SKILL.md +78 -0
- package/scripts/skill-templates/verify/SKILL.md +113 -0
- package/scripts/skill-templates/verify/verify-procedure.md +511 -0
- package/scripts/skill-templates/warm-cache/SKILL.md +81 -0
- package/scripts/skill-templates/watch-authorities/SKILL.md +82 -0
- package/scripts/skill-templates/zoom-out/SKILL.md +26 -0
- package/sdk/cli/commands/build.ts +2 -2
- package/sdk/cli/index.js +2 -2
- package/sdk/cli/index.ts +1 -1
- package/skills/README.md +22 -14
- package/skills/help/SKILL.md +28 -55
- package/skills/new-skill/SKILL.md +5 -5
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2017",
|
|
4
|
+
"module": "amd",
|
|
5
|
+
"moduleResolution": "node",
|
|
6
|
+
"lib": ["ES2017"],
|
|
7
|
+
"strict": true,
|
|
8
|
+
"outFile": "code.js",
|
|
9
|
+
"noEmitOnError": true,
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
"skipLibCheck": true,
|
|
13
|
+
"typeRoots": ["./node_modules/@types", "./node_modules/@figma"]
|
|
14
|
+
},
|
|
15
|
+
"include": ["code.ts", "src/**/*.ts"]
|
|
16
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<style>
|
|
6
|
+
body {
|
|
7
|
+
font-family: Inter, system-ui, sans-serif;
|
|
8
|
+
margin: 0;
|
|
9
|
+
padding: 16px;
|
|
10
|
+
font-size: 12px;
|
|
11
|
+
color: #1a1a1a;
|
|
12
|
+
}
|
|
13
|
+
button {
|
|
14
|
+
width: 100%;
|
|
15
|
+
padding: 10px;
|
|
16
|
+
font-size: 13px;
|
|
17
|
+
font-weight: 600;
|
|
18
|
+
color: #fff;
|
|
19
|
+
background: #18a0fb;
|
|
20
|
+
border: none;
|
|
21
|
+
border-radius: 6px;
|
|
22
|
+
cursor: pointer;
|
|
23
|
+
}
|
|
24
|
+
button:hover {
|
|
25
|
+
background: #0d8de0;
|
|
26
|
+
}
|
|
27
|
+
#status {
|
|
28
|
+
margin-top: 12px;
|
|
29
|
+
min-height: 16px;
|
|
30
|
+
color: #555;
|
|
31
|
+
}
|
|
32
|
+
</style>
|
|
33
|
+
</head>
|
|
34
|
+
<body>
|
|
35
|
+
<button id="export">Export to GDD</button>
|
|
36
|
+
<p id="status">Reads local Figma variables and POSTs them to the GDD receiver on localhost:5179.</p>
|
|
37
|
+
<script>
|
|
38
|
+
document.getElementById('export').onclick = function () {
|
|
39
|
+
document.getElementById('status').textContent = 'Exporting…';
|
|
40
|
+
parent.postMessage({ pluginMessage: { type: 'export' } }, '*');
|
|
41
|
+
};
|
|
42
|
+
</script>
|
|
43
|
+
</body>
|
|
44
|
+
</html>
|
package/hooks/budget-enforcer.ts
CHANGED
|
@@ -191,6 +191,21 @@ const tierResolver = nodeRequire(
|
|
|
191
191
|
'../scripts/lib/tier-resolver.cjs',
|
|
192
192
|
) as TierResolverModule;
|
|
193
193
|
|
|
194
|
+
// Phase 59.5 P1: runtime-models parser for the BYOK/unverified provenance
|
|
195
|
+
// guard. We read the parsed runtime rows to learn a runtime's `status`
|
|
196
|
+
// ("verified" | "byok" | "unverified"). The parser is pure + never invoked
|
|
197
|
+
// for its model-resolution side here; only to classify the runtime so an
|
|
198
|
+
// unverified row never drives a HARD budget cap. Soft-imported defensively:
|
|
199
|
+
// any parser failure degrades to the built-in verified allowlist below.
|
|
200
|
+
interface RuntimeModelsParserModule {
|
|
201
|
+
parseRuntimeModels(opts?: { cwd?: string }): {
|
|
202
|
+
runtimes: Array<{ id: string; status?: string }>;
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
const runtimeModelsParser = nodeRequire(
|
|
206
|
+
'../scripts/lib/install/parse-runtime-models.cjs',
|
|
207
|
+
) as RuntimeModelsParserModule;
|
|
208
|
+
|
|
194
209
|
// Plan 33.6-03 (SC#6, D-08, D-12): OpenRouter tier-resolver adapter. When the
|
|
195
210
|
// user opts in (`.design/config.json#openrouter_enabled: true` OR
|
|
196
211
|
// `OPENROUTER_API_KEY` present), the hook consults this adapter FIRST for a
|
|
@@ -506,6 +521,75 @@ export function loadBudget(): ResolvedBudget {
|
|
|
506
521
|
}
|
|
507
522
|
}
|
|
508
523
|
|
|
524
|
+
// ── runtime provenance status (Phase 59.5 P1) ───────────────────────────────
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* Phase 59.5 P1: provenance confidence of a runtime's tier→model row, as
|
|
528
|
+
* documented in reference/runtime-models.md and enumerated by
|
|
529
|
+
* reference/schemas/runtime-models.schema.json#status.
|
|
530
|
+
*/
|
|
531
|
+
export type RuntimeStatus = 'verified' | 'byok' | 'unverified';
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* Built-in verified allowlist: the 4 runtimes whose tier maps are confirmed
|
|
535
|
+
* against runtime-author docs (the runtime-models.md banner: "4 of 14 ...
|
|
536
|
+
* verified (claude, codex, gemini, qwen)"). Used as the fallback classifier
|
|
537
|
+
* when the parsed row carries no structured `status` field yet (the markdown
|
|
538
|
+
* JSON blocks do not emit `status` at the time of this plan; the schema is
|
|
539
|
+
* ready, the parser wiring is a deferred follow-up). Once a row DOES carry
|
|
540
|
+
* `status`, the parsed value takes precedence over this allowlist.
|
|
541
|
+
*/
|
|
542
|
+
const VERIFIED_RUNTIME_IDS: ReadonlySet<string> = new Set([
|
|
543
|
+
'claude',
|
|
544
|
+
'codex',
|
|
545
|
+
'gemini',
|
|
546
|
+
'qwen',
|
|
547
|
+
]);
|
|
548
|
+
|
|
549
|
+
/** Per-process memo of runtime-id → parsed `status` (null until first read). */
|
|
550
|
+
let _runtimeStatusMap: Map<string, RuntimeStatus> | null = null;
|
|
551
|
+
|
|
552
|
+
function isRuntimeStatus(v: unknown): v is RuntimeStatus {
|
|
553
|
+
return v === 'verified' || v === 'byok' || v === 'unverified';
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* Resolve a runtime's provenance status. Reads the parsed runtime-models
|
|
558
|
+
* doc once per process; if a row carries a structured `status` it wins,
|
|
559
|
+
* otherwise the built-in verified allowlist decides (verified vs unverified).
|
|
560
|
+
* Fail-open: any parser error → allowlist-only classification. Never throws.
|
|
561
|
+
*
|
|
562
|
+
* @param runtimeId runtime id (e.g. 'claude', 'cline'); falsy → 'unverified'.
|
|
563
|
+
*/
|
|
564
|
+
export function runtimeStatus(runtimeId: string | null | undefined): RuntimeStatus {
|
|
565
|
+
if (typeof runtimeId !== 'string' || runtimeId.length === 0) {
|
|
566
|
+
return 'unverified';
|
|
567
|
+
}
|
|
568
|
+
if (_runtimeStatusMap === null) {
|
|
569
|
+
_runtimeStatusMap = new Map();
|
|
570
|
+
try {
|
|
571
|
+
const parsed = runtimeModelsParser.parseRuntimeModels({ cwd: process.cwd() });
|
|
572
|
+
const rows = Array.isArray(parsed?.runtimes) ? parsed.runtimes : [];
|
|
573
|
+
for (const row of rows) {
|
|
574
|
+
if (row && typeof row.id === 'string' && isRuntimeStatus(row.status)) {
|
|
575
|
+
_runtimeStatusMap.set(row.id, row.status);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
} catch {
|
|
579
|
+
// Fail open: parser error degrades to the verified allowlist below.
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
const parsedStatus = _runtimeStatusMap.get(runtimeId);
|
|
583
|
+
if (parsedStatus !== undefined) return parsedStatus;
|
|
584
|
+
return VERIFIED_RUNTIME_IDS.has(runtimeId) ? 'verified' : 'unverified';
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
/** True when the runtime row must NOT drive a HARD budget cap (P1 guard). */
|
|
588
|
+
export function isUnverifiedRuntime(runtimeId: string | null | undefined): boolean {
|
|
589
|
+
const s = runtimeStatus(runtimeId);
|
|
590
|
+
return s === 'byok' || s === 'unverified';
|
|
591
|
+
}
|
|
592
|
+
|
|
509
593
|
// ── cumulative phase spend (WR-02) ──────────────────────────────────────────
|
|
510
594
|
|
|
511
595
|
/**
|
|
@@ -1138,7 +1222,40 @@ export async function main(): Promise<void> {
|
|
|
1138
1222
|
// no router decision is supplied, behavior is identical to pre-25.
|
|
1139
1223
|
const perSpawnCap = resolvePerSpawnCap(budget, complexityClass);
|
|
1140
1224
|
|
|
1141
|
-
|
|
1225
|
+
// ── Phase 59.5 P1: BYOK/unverified provenance guard ────────────────────────
|
|
1226
|
+
//
|
|
1227
|
+
// Resolve the runtime id (router-supplied `runtime`, else env detection,
|
|
1228
|
+
// else 'claude', same precedence the cost-recording block uses below) so we
|
|
1229
|
+
// can consult its runtime-models provenance `status` BEFORE the hard-cap
|
|
1230
|
+
// branches. When the runtime row is byok/unverified the resolved per-runtime
|
|
1231
|
+
// model is best-effort (the user's actual provider may diverge from the
|
|
1232
|
+
// Anthropic-default fill), so an estimated cost computed against it must NOT
|
|
1233
|
+
// hard-block the user. We degrade enforce-mode to advisory ('warn') for THIS
|
|
1234
|
+
// spawn only: the per-spawn + per-phase 100% caps stop blocking and surface a
|
|
1235
|
+
// stderr warning instead, while the 80% auto-downgrade still applies (a tier
|
|
1236
|
+
// downgrade is non-blocking and strictly cheaper, so it is safe to keep).
|
|
1237
|
+
// Verified runtimes (claude/codex/gemini/qwen) are unaffected (full hard
|
|
1238
|
+
// enforcement). The project-level cap above is intentionally NOT degraded: it
|
|
1239
|
+
// is governed by total ledger spend, not a per-runtime resolved model.
|
|
1240
|
+
const guardRuntimeId =
|
|
1241
|
+
(typeof routerDecision?.runtime === 'string' && routerDecision.runtime.length > 0
|
|
1242
|
+
? routerDecision.runtime
|
|
1243
|
+
: runtimeDetect.detect()) ?? 'claude';
|
|
1244
|
+
const runtimeIsUnverified = isUnverifiedRuntime(guardRuntimeId);
|
|
1245
|
+
const effectiveEnforcementMode: ResolvedBudget['enforcement_mode'] =
|
|
1246
|
+
budget.enforcement_mode === 'enforce' && runtimeIsUnverified
|
|
1247
|
+
? 'warn'
|
|
1248
|
+
: budget.enforcement_mode;
|
|
1249
|
+
if (budget.enforcement_mode === 'enforce' && runtimeIsUnverified) {
|
|
1250
|
+
process.stderr.write(
|
|
1251
|
+
`gdd-budget-enforcer WARN: runtime '${guardRuntimeId}' has provenance status ` +
|
|
1252
|
+
`'${runtimeStatus(guardRuntimeId)}' (BYOK/unverified tier→model row); ` +
|
|
1253
|
+
`hard budget caps degraded to advisory for this spawn so an unverified ` +
|
|
1254
|
+
`cost estimate never hard-blocks you.\n`,
|
|
1255
|
+
);
|
|
1256
|
+
}
|
|
1257
|
+
|
|
1258
|
+
if (effectiveEnforcementMode === 'enforce') {
|
|
1142
1259
|
// Branch C: 100% per-spawn cap hard block (class-specific or per_task).
|
|
1143
1260
|
if (estCost >= perSpawnCap) {
|
|
1144
1261
|
writeTelemetry({
|
|
@@ -1202,12 +1319,24 @@ export async function main(): Promise<void> {
|
|
|
1202
1319
|
toolInput._tier_override = 'haiku';
|
|
1203
1320
|
toolInput._tier_downgraded = true;
|
|
1204
1321
|
}
|
|
1205
|
-
} else if (
|
|
1322
|
+
} else if (effectiveEnforcementMode === 'warn') {
|
|
1206
1323
|
if (estCost >= perSpawnCap) {
|
|
1207
1324
|
process.stderr.write(
|
|
1208
1325
|
`gdd-budget-enforcer WARN: per-spawn cap will be exceeded ($${estCost.toFixed(4)} >= $${perSpawnCap})\n`,
|
|
1209
1326
|
);
|
|
1210
1327
|
}
|
|
1328
|
+
// Phase 59.5 P1: when enforce was degraded to advisory for a byok/unverified
|
|
1329
|
+
// runtime, also surface the per-phase breach that the hard branch above
|
|
1330
|
+
// would otherwise have reported (it is skipped for unverified runtimes).
|
|
1331
|
+
if (
|
|
1332
|
+
budget.enforcement_mode === 'enforce' &&
|
|
1333
|
+
phaseSpend + estCost >= budget.per_phase_cap_usd
|
|
1334
|
+
) {
|
|
1335
|
+
process.stderr.write(
|
|
1336
|
+
`gdd-budget-enforcer WARN: per-phase cap will be exceeded for ${phase} ` +
|
|
1337
|
+
`($${(phaseSpend + estCost).toFixed(4)} >= $${budget.per_phase_cap_usd.toFixed(2)})\n`,
|
|
1338
|
+
);
|
|
1339
|
+
}
|
|
1211
1340
|
}
|
|
1212
1341
|
// enforcement_mode === 'log': telemetry only.
|
|
1213
1342
|
|
|
@@ -1230,11 +1359,9 @@ export async function main(): Promise<void> {
|
|
|
1230
1359
|
toolInput._tier_override ?? toolInput._default_tier ?? 'sonnet';
|
|
1231
1360
|
// Runtime tag: prefer the router's explicit `runtime` (D-08) field;
|
|
1232
1361
|
// fall back to env-var detection; default to 'claude' since the .ts
|
|
1233
|
-
// hook itself only runs inside Claude Code.
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
? routerDecision.runtime
|
|
1237
|
-
: runtimeDetect.detect()) ?? 'claude';
|
|
1362
|
+
// hook itself only runs inside Claude Code. Reuse the id already resolved
|
|
1363
|
+
// for the Phase 59.5 P1 provenance guard above (single resolution source).
|
|
1364
|
+
const runtimeId = guardRuntimeId;
|
|
1238
1365
|
|
|
1239
1366
|
// ── Plan 27.5-02 — bandit consultation ────────────────────────────────────
|
|
1240
1367
|
//
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* hooks/gdd-intel-trigger.js — D5 (PostToolUse on Edit|Write)
|
|
5
5
|
*
|
|
6
6
|
* On every Edit/Write that touches a design-authoritative surface
|
|
7
|
-
* (skills/**, agents/**, reference/**, skill-templates/**), spawn a
|
|
7
|
+
* (skills/**, agents/**, reference/**, scripts/skill-templates/**), spawn a
|
|
8
8
|
* background, detached refresh of the .design/intel/ store so downstream
|
|
9
9
|
* consumers (router, planner, audits) see the latest extracts without the
|
|
10
10
|
* user paying for a full rebuild on the next /gdd run.
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* camelCase field names (tool_name/toolName, tool_input/toolInput,
|
|
15
15
|
* file_path/filePath/path).
|
|
16
16
|
* 2. If the edited path matches
|
|
17
|
-
* ^(skills|agents|reference|skill-templates)/.*\.(md|json)$
|
|
17
|
+
* ^(skills|agents|reference|scripts/skill-templates)/.*\.(md|json)$
|
|
18
18
|
* (path-separator-agnostic), schedule a background refresh.
|
|
19
19
|
* 3. Otherwise no-op — write {continue:true} and exit 0.
|
|
20
20
|
* 4. Always exit 0. Never block. Never surface errors. Errors only ever
|
|
@@ -55,7 +55,7 @@ const path = require('node:path');
|
|
|
55
55
|
const { spawn } = require('node:child_process');
|
|
56
56
|
|
|
57
57
|
const LOCK_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
58
|
-
const TARGET_RE = /^(?:skills|agents|reference|
|
|
58
|
+
const TARGET_RE = /^(?:skills|agents|reference|scripts\/skill-templates)\/.*\.(?:md|json)$/;
|
|
59
59
|
|
|
60
60
|
/**
|
|
61
61
|
* Extract the edited file path + tool name from a PostToolUse payload.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hegemonart/get-design-done",
|
|
3
|
-
"version": "1.59.
|
|
3
|
+
"version": "1.59.5",
|
|
4
4
|
"description": "A design-quality pipeline for AI coding agents: brief, explore, plan, design, and verify UI work against your design system.",
|
|
5
5
|
"author": "Hegemon",
|
|
6
6
|
"homepage": "https://github.com/hegemonart/get-design-done",
|
|
@@ -25,9 +25,13 @@
|
|
|
25
25
|
"docs/i18n/",
|
|
26
26
|
"scripts/lib/",
|
|
27
27
|
"scripts/cli/",
|
|
28
|
+
"scripts/skill-templates/",
|
|
28
29
|
"scripts/install.cjs",
|
|
29
30
|
"scripts/injection-patterns.cjs",
|
|
30
31
|
"scripts/bootstrap.cjs",
|
|
32
|
+
"scripts/build-skills.cjs",
|
|
33
|
+
"scripts/generate-skill-frontmatter.cjs",
|
|
34
|
+
"figma-plugin/",
|
|
31
35
|
"SKILL.md",
|
|
32
36
|
"README.md",
|
|
33
37
|
"CHANGELOG.md",
|
|
@@ -62,6 +66,7 @@
|
|
|
62
66
|
"test:behavior": "node scripts/run-behavior-tests.cjs",
|
|
63
67
|
"typecheck": "tsc --noEmit",
|
|
64
68
|
"codegen:schemas": "node --experimental-strip-types scripts/codegen-schema-types.ts",
|
|
69
|
+
"codegen:schemas:check": "node --experimental-strip-types scripts/codegen-schema-types.ts --check",
|
|
65
70
|
"lint:md": "npx --yes markdownlint-cli2 \"**/*.md\" \"#**/node_modules\" \"#.planning\" \"#.claude\" \"#test/fixtures/baselines\"",
|
|
66
71
|
"lint:links": "npx --yes lychee --no-progress --accept 200,206,403,429 \"**/*.md\" || true",
|
|
67
72
|
"lint:agentskills": "node scripts/lint-agentskills-spec.cjs",
|
|
@@ -31,7 +31,7 @@ the scanner pattern list in lockstep.
|
|
|
31
31
|
## Authoring surfaces
|
|
32
32
|
|
|
33
33
|
- **`skills/` as the authoring source** → **`source/skills/`** (Phase 42, deprecated)
|
|
34
|
-
→ **`skill-templates/`** (v1.58.0, current).
|
|
34
|
+
→ **`skill-templates/`** (v1.58.0) → **`scripts/skill-templates/`** (v1.59, current). Migration:
|
|
35
35
|
|
|
36
36
|
- **Phase 42** introduced multi-harness compilation. Skills moved to `source/skills/` with
|
|
37
37
|
placeholders (`{{command_prefix}}` et al.; see `reference/skill-placeholders.md`) and the
|
|
@@ -43,10 +43,10 @@ the scanner pattern list in lockstep.
|
|
|
43
43
|
tarball via `prepack`. Net: 232 tracked files dropped to 116, with no change to end-user
|
|
44
44
|
install experience (the tarball still ships `skills/` pre-built).
|
|
45
45
|
|
|
46
|
-
Migration for contributors: **edit `skill-templates/`, never `skills/` directly**. After edits,
|
|
46
|
+
Migration for contributors: **edit `scripts/skill-templates/`, never `skills/` directly**. After edits,
|
|
47
47
|
`npm run build:skills` regenerates `skills/` locally (or `npm install` does it automatically).
|
|
48
48
|
`.claude-plugin/plugin.json`'s `"skills": ["./skills/"]` is unchanged - the plugin still loads
|
|
49
|
-
`skills/`, now produced from `skill-templates/`. The `detect-stale-refs.cjs` list is extended to
|
|
49
|
+
`skills/`, now produced from `scripts/skill-templates/`. The `detect-stale-refs.cjs` list is extended to
|
|
50
50
|
emit warnings on lingering `source/skills/` path references.
|
|
51
51
|
|
|
52
52
|
## Scanner scope
|
|
@@ -9,7 +9,7 @@ last_updated: 2026-06-03
|
|
|
9
9
|
|
|
10
10
|
# Live Mode Integration
|
|
11
11
|
|
|
12
|
-
This file is the meta-rules companion to the `gdd-live` skill (`skill-templates/live/SKILL.md`). It describes how `/gdd:live` turns a running dev server into a live design surface: the user picks a DOM element, the agent generates N variants in one batch, the variants hot-swap in place, the user accepts or discards, and the whole session persists. For the SKILL.md structural contract (line cap, description budget, frontmatter), see `./skill-authoring-contract.md`. The variants themselves are grounded in the Phase 45 domain indexes (`./spatial.md`, `./interaction.md`, `./color.md`, `./typography.md`, `./motion.md`).
|
|
12
|
+
This file is the meta-rules companion to the `gdd-live` skill (`scripts/skill-templates/live/SKILL.md`). It describes how `/gdd:live` turns a running dev server into a live design surface: the user picks a DOM element, the agent generates N variants in one batch, the variants hot-swap in place, the user accepts or discards, and the whole session persists. For the SKILL.md structural contract (line cap, description budget, frontmatter), see `./skill-authoring-contract.md`. The variants themselves are grounded in the Phase 45 domain indexes (`./spatial.md`, `./interaction.md`, `./color.md`, `./typography.md`, `./motion.md`).
|
|
13
13
|
|
|
14
14
|
There is NO bundled browser automation. The skill drives the Claude Preview MCP at runtime; the modules under `scripts/lib/live/` are pure and dependency-free.
|
|
15
15
|
|
package/reference/registry.json
CHANGED
|
@@ -1071,7 +1071,7 @@
|
|
|
1071
1071
|
"path": "reference/skill-placeholders.md",
|
|
1072
1072
|
"type": "meta-rules",
|
|
1073
1073
|
"phase": 42,
|
|
1074
|
-
"description": "Multi-harness skill-placeholder catalogue: the four placeholders ({{command_prefix}}/{{model}}/{{config_file}}/{{ask_instruction}}) + per-harness substitution table + the \\{{...}} escape + the <!-- harness-only: a,b --> block rule. Skills authored once in skill-templates/, compiled per-harness by scripts/build-skills.cjs via scripts/lib/build/factory.cjs reading scripts/lib/manifest/harnesses.json."
|
|
1074
|
+
"description": "Multi-harness skill-placeholder catalogue: the four placeholders ({{command_prefix}}/{{model}}/{{config_file}}/{{ask_instruction}}) + per-harness substitution table + the \\{{...}} escape + the <!-- harness-only: a,b --> block rule. Skills authored once in scripts/skill-templates/, compiled per-harness by scripts/build-skills.cjs via scripts/lib/build/factory.cjs reading scripts/lib/manifest/harnesses.json."
|
|
1075
1075
|
},
|
|
1076
1076
|
{
|
|
1077
1077
|
"name": "color",
|
|
@@ -10,7 +10,7 @@ Single canonical map from Anthropic tier names (`opus|sonnet|haiku`) and runtime
|
|
|
10
10
|
>
|
|
11
11
|
> Unverified: kilo, copilot, cursor, windsurf, antigravity, augment, trae, codebuddy, cline, opencode.
|
|
12
12
|
>
|
|
13
|
-
> The schema (`reference/schemas/runtime-models.schema.json`)
|
|
13
|
+
> **Provenance status field.** Each row below is annotated with a structured `status` in its section heading: `verified` (confirmed against runtime-author docs), `byok` (BYOK / multi-provider, where the user-configured model may diverge from the Anthropic-default fill), or `unverified` (placeholder fill pending researcher confirmation). The schema (`reference/schemas/runtime-models.schema.json`) accepts an optional `status` enum of exactly these three values, so verified rows MAY omit it and remain shape-valid. The `hooks/budget-enforcer.ts` guard consults this status (or its built-in verified allowlist) so a `byok`/`unverified` row never drives a HARD budget cap: it degrades to advisory enforcement for that spawn. This makes the unverified-ness machine-readable, not just a content gap in prose.
|
|
14
14
|
|
|
15
15
|
This file is parsed by `scripts/lib/install/parse-runtime-models.cjs` and consumed by:
|
|
16
16
|
|
|
@@ -36,7 +36,7 @@ This file is parsed by `scripts/lib/install/parse-runtime-models.cjs` and consum
|
|
|
36
36
|
|
|
37
37
|
---
|
|
38
38
|
|
|
39
|
-
## claude - Claude Code
|
|
39
|
+
## claude - Claude Code (status: verified)
|
|
40
40
|
|
|
41
41
|
Anthropic's first-party runtime. Public tier docs at https://docs.anthropic.com/en/docs/about-claude/models. Seed picks per CONTEXT.md D-02.
|
|
42
42
|
|
|
@@ -66,7 +66,7 @@ Anthropic's first-party runtime. Public tier docs at https://docs.anthropic.com/
|
|
|
66
66
|
|
|
67
67
|
---
|
|
68
68
|
|
|
69
|
-
## codex - OpenAI Codex CLI
|
|
69
|
+
## codex - OpenAI Codex CLI (status: verified)
|
|
70
70
|
|
|
71
71
|
OpenAI's Codex CLI runtime. Public tier docs at https://platform.openai.com/docs/models. Seed picks per CONTEXT.md D-02.
|
|
72
72
|
|
|
@@ -96,7 +96,7 @@ OpenAI's Codex CLI runtime. Public tier docs at https://platform.openai.com/docs
|
|
|
96
96
|
|
|
97
97
|
---
|
|
98
98
|
|
|
99
|
-
## gemini - Gemini CLI
|
|
99
|
+
## gemini - Gemini CLI (status: verified)
|
|
100
100
|
|
|
101
101
|
Google's Gemini CLI runtime. Public tier docs at https://ai.google.dev/gemini-api/docs/models. Seed picks per CONTEXT.md D-02.
|
|
102
102
|
|
|
@@ -126,7 +126,7 @@ Google's Gemini CLI runtime. Public tier docs at https://ai.google.dev/gemini-ap
|
|
|
126
126
|
|
|
127
127
|
---
|
|
128
128
|
|
|
129
|
-
## qwen - Qwen Code
|
|
129
|
+
## qwen - Qwen Code (status: verified)
|
|
130
130
|
|
|
131
131
|
Alibaba's Qwen Code runtime. Public tier docs at https://github.com/QwenLM/qwen-code. Seed picks per CONTEXT.md D-02.
|
|
132
132
|
|
|
@@ -156,7 +156,7 @@ Alibaba's Qwen Code runtime. Public tier docs at https://github.com/QwenLM/qwen-
|
|
|
156
156
|
|
|
157
157
|
---
|
|
158
158
|
|
|
159
|
-
## kilo - Kilo Code
|
|
159
|
+
## kilo - Kilo Code (status: byok)
|
|
160
160
|
|
|
161
161
|
Kilo Code adapter - multi-provider, Anthropic-default fill until runtime-author docs confirm. Researcher fill needed (CONTEXT.md D-02).
|
|
162
162
|
|
|
@@ -186,7 +186,7 @@ Kilo Code adapter - multi-provider, Anthropic-default fill until runtime-author
|
|
|
186
186
|
|
|
187
187
|
---
|
|
188
188
|
|
|
189
|
-
## copilot - GitHub Copilot CLI
|
|
189
|
+
## copilot - GitHub Copilot CLI (status: byok)
|
|
190
190
|
|
|
191
191
|
GitHub Copilot CLI - multi-provider routing under the hood. Researcher fill needed (CONTEXT.md D-02).
|
|
192
192
|
|
|
@@ -216,7 +216,7 @@ GitHub Copilot CLI - multi-provider routing under the hood. Researcher fill need
|
|
|
216
216
|
|
|
217
217
|
---
|
|
218
218
|
|
|
219
|
-
## cursor - Cursor
|
|
219
|
+
## cursor - Cursor (status: byok)
|
|
220
220
|
|
|
221
221
|
Cursor IDE/CLI - multi-provider routing. Researcher fill needed (CONTEXT.md D-02).
|
|
222
222
|
|
|
@@ -246,7 +246,7 @@ Cursor IDE/CLI - multi-provider routing. Researcher fill needed (CONTEXT.md D-02
|
|
|
246
246
|
|
|
247
247
|
---
|
|
248
248
|
|
|
249
|
-
## windsurf - Windsurf
|
|
249
|
+
## windsurf - Windsurf (status: byok)
|
|
250
250
|
|
|
251
251
|
Windsurf (formerly Codeium) - multi-provider Cascade router. Researcher fill needed (CONTEXT.md D-02).
|
|
252
252
|
|
|
@@ -276,7 +276,7 @@ Windsurf (formerly Codeium) - multi-provider Cascade router. Researcher fill nee
|
|
|
276
276
|
|
|
277
277
|
---
|
|
278
278
|
|
|
279
|
-
## antigravity - Antigravity
|
|
279
|
+
## antigravity - Antigravity (status: unverified)
|
|
280
280
|
|
|
281
281
|
Antigravity - Google's agentic coding platform. Researcher fill needed (CONTEXT.md D-02).
|
|
282
282
|
|
|
@@ -306,7 +306,7 @@ Antigravity - Google's agentic coding platform. Researcher fill needed (CONTEXT.
|
|
|
306
306
|
|
|
307
307
|
---
|
|
308
308
|
|
|
309
|
-
## augment - Augment
|
|
309
|
+
## augment - Augment (status: byok)
|
|
310
310
|
|
|
311
311
|
Augment Code - multi-provider agentic IDE. Researcher fill needed (CONTEXT.md D-02).
|
|
312
312
|
|
|
@@ -336,7 +336,7 @@ Augment Code - multi-provider agentic IDE. Researcher fill needed (CONTEXT.md D-
|
|
|
336
336
|
|
|
337
337
|
---
|
|
338
338
|
|
|
339
|
-
## trae - Trae
|
|
339
|
+
## trae - Trae (status: unverified)
|
|
340
340
|
|
|
341
341
|
Trae - single-model session runtime per CONTEXT.md D-02 example. `single_tier: true` annotates the row. Researcher fill needed.
|
|
342
342
|
|
|
@@ -367,7 +367,7 @@ Trae - single-model session runtime per CONTEXT.md D-02 example. `single_tier: t
|
|
|
367
367
|
|
|
368
368
|
---
|
|
369
369
|
|
|
370
|
-
## codebuddy - CodeBuddy
|
|
370
|
+
## codebuddy - CodeBuddy (status: byok)
|
|
371
371
|
|
|
372
372
|
CodeBuddy (Tencent) - multi-provider routing. Researcher fill needed (CONTEXT.md D-02).
|
|
373
373
|
|
|
@@ -397,7 +397,7 @@ CodeBuddy (Tencent) - multi-provider routing. Researcher fill needed (CONTEXT.md
|
|
|
397
397
|
|
|
398
398
|
---
|
|
399
399
|
|
|
400
|
-
## cline - Cline
|
|
400
|
+
## cline - Cline (status: byok)
|
|
401
401
|
|
|
402
402
|
Cline (formerly Claude Dev) - multi-provider VS Code agent. Researcher fill needed (CONTEXT.md D-02).
|
|
403
403
|
|
|
@@ -427,7 +427,7 @@ Cline (formerly Claude Dev) - multi-provider VS Code agent. Researcher fill need
|
|
|
427
427
|
|
|
428
428
|
---
|
|
429
429
|
|
|
430
|
-
## opencode - OpenCode
|
|
430
|
+
## opencode - OpenCode (status: byok)
|
|
431
431
|
|
|
432
432
|
OpenCode - open-source AI coding agent, BYOK multi-provider. Researcher fill needed (CONTEXT.md D-02).
|
|
433
433
|
|
|
@@ -1042,6 +1042,10 @@ export interface RuntimeEntry {
|
|
|
1042
1042
|
* When true, the runtime exposes a single model that maps to all three tiers (D-02). Downstream consumers (router, budget-enforcer) may render a UI affordance noting tier-selection has no cost effect for this runtime.
|
|
1043
1043
|
*/
|
|
1044
1044
|
single_tier?: boolean;
|
|
1045
|
+
/**
|
|
1046
|
+
* Provenance confidence of this runtime's tier map. 'verified' = confirmed against runtime-author docs (claude, codex, gemini, qwen). 'byok' = BYOK / multi-provider runtime whose user-configured model may diverge from the Anthropic-default fill. 'unverified' = placeholder fill pending researcher confirmation. Optional: rows omitting this field are treated as unverified-unless-stated by consumers, and verified rows MAY omit it. The budget-enforcer guard reads this (or its built-in verified allowlist) so a byok/unverified row never drives a HARD budget cap (degrades to advisory).
|
|
1047
|
+
*/
|
|
1048
|
+
status?: 'verified' | 'byok' | 'unverified';
|
|
1045
1049
|
/**
|
|
1046
1050
|
* Map of canonical Anthropic tier names (D-03) to the runtime's concrete model identifier. All three keys are required even when single_tier=true (assign the same model three times).
|
|
1047
1051
|
*/
|
|
@@ -47,6 +47,11 @@
|
|
|
47
47
|
"type": "boolean",
|
|
48
48
|
"description": "When true, the runtime exposes a single model that maps to all three tiers (D-02). Downstream consumers (router, budget-enforcer) may render a UI affordance noting tier-selection has no cost effect for this runtime."
|
|
49
49
|
},
|
|
50
|
+
"status": {
|
|
51
|
+
"type": "string",
|
|
52
|
+
"enum": ["verified", "byok", "unverified"],
|
|
53
|
+
"description": "Provenance confidence of this runtime's tier map. 'verified' = confirmed against runtime-author docs (claude, codex, gemini, qwen). 'byok' = BYOK / multi-provider runtime whose user-configured model may diverge from the Anthropic-default fill. 'unverified' = placeholder fill pending researcher confirmation. Optional: rows omitting this field are treated as unverified-unless-stated by consumers, and verified rows MAY omit it. The budget-enforcer guard reads this (or its built-in verified allowlist) so a byok/unverified row never drives a HARD budget cap (degrades to advisory)."
|
|
54
|
+
},
|
|
50
55
|
"tier_to_model": {
|
|
51
56
|
"type": "object",
|
|
52
57
|
"additionalProperties": false,
|
|
@@ -10,7 +10,7 @@ last_updated: 2026-06-02
|
|
|
10
10
|
# Skill Metadata Single Source of Truth
|
|
11
11
|
|
|
12
12
|
`scripts/lib/manifest/skills.json` is the one place skill frontmatter is authored. A
|
|
13
|
-
generator projects it onto every `skill-templates/<id>/SKILL.md`, the build step compiles
|
|
13
|
+
generator projects it onto every `scripts/skill-templates/<id>/SKILL.md`, the build step compiles
|
|
14
14
|
those into the shipped trees, and CI gates keep the three copies identical. This doc
|
|
15
15
|
explains the file, the generator, and the description budget. For the structural rules a
|
|
16
16
|
SKILL.md body must follow (line cap, progressive disclosure, frontmatter required fields),
|
|
@@ -20,7 +20,7 @@ see `./skill-authoring-contract.md`.
|
|
|
20
20
|
|
|
21
21
|
The file is a JSON object: a `schema_version` integer and a `skills` array. Each array
|
|
22
22
|
element is one skill record. Only `name` is required (it must equal the
|
|
23
|
-
`skill-templates/<id>/` directory name); every other field is optional and omitted when it
|
|
23
|
+
`scripts/skill-templates/<id>/` directory name); every other field is optional and omitted when it
|
|
24
24
|
has no value.
|
|
25
25
|
|
|
26
26
|
```json
|
|
@@ -50,7 +50,7 @@ Metadata flows in one direction, and a `*:check` gate guards each hop:
|
|
|
50
50
|
```text
|
|
51
51
|
skills.json
|
|
52
52
|
-> generate-skill-frontmatter (npm run generate:skill-frontmatter)
|
|
53
|
-
-> skill-templates/<id>/SKILL.md
|
|
53
|
+
-> scripts/skill-templates/<id>/SKILL.md
|
|
54
54
|
-> build:skills (npm run build:skills)
|
|
55
55
|
-> skills/ + dist/claude-code/
|
|
56
56
|
```
|
|
@@ -64,7 +64,7 @@ skills.json
|
|
|
64
64
|
- `--check`: the CI drift gate. It writes nothing and exits non-zero when any committed
|
|
65
65
|
frontmatter differs from what the manifest would generate.
|
|
66
66
|
|
|
67
|
-
`scripts/build-skills.cjs` then propagates `skill-templates/` into the committed `skills/`
|
|
67
|
+
`scripts/build-skills.cjs` then propagates `scripts/skill-templates/` into the committed `skills/`
|
|
68
68
|
tree and `dist/claude-code/`; its own check mode asserts that the built output equals the
|
|
69
69
|
committed output. So the contract is: edit `skills.json`, regenerate, build. Never
|
|
70
70
|
hand-edit a managed frontmatter line in `SKILL.md`, because the drift gate will fail.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Skill Placeholders - Multi-Harness Source Compilation
|
|
2
2
|
|
|
3
|
-
> Phase 42. Skills are authored once in `skill-templates/` with placeholders and compiled per-harness into
|
|
3
|
+
> Phase 42. Skills are authored once in `scripts/skill-templates/` with placeholders and compiled per-harness into
|
|
4
4
|
> `dist/<bundle>/<config-dir>/skills/...` by `scripts/build-skills.cjs` (the pure transform lives in
|
|
5
5
|
> `scripts/lib/build/factory.cjs`; the per-harness values in `scripts/lib/build/harness-configs.cjs`,
|
|
6
6
|
> which reads the Phase 41.5 manifest root `scripts/lib/manifest/harnesses.json`). The Claude-Code
|
|
@@ -68,4 +68,4 @@ scope (a maintenance trap) - see the Phase 42 CONTEXT.
|
|
|
68
68
|
## Validation
|
|
69
69
|
|
|
70
70
|
`test/suite/phase-42-placeholders.test.cjs` asserts that every placeholder actually used across
|
|
71
|
-
`skill-templates/` is documented in this file, and that `skill-templates/` mirrors the `skills/` skill count.
|
|
71
|
+
`scripts/skill-templates/` is documented in this file, and that `scripts/skill-templates/` mirrors the `skills/` skill count.
|