@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.
Files changed (155) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +61 -0
  4. package/SKILL.md +2 -0
  5. package/figma-plugin/README.md +61 -0
  6. package/figma-plugin/code.ts +36 -0
  7. package/figma-plugin/manifest.json +12 -0
  8. package/figma-plugin/package-lock.json +35 -0
  9. package/figma-plugin/package.json +12 -0
  10. package/figma-plugin/src/export-variables.ts +144 -0
  11. package/figma-plugin/src/payload-schema.ts +250 -0
  12. package/figma-plugin/tsconfig.json +16 -0
  13. package/figma-plugin/ui.html +44 -0
  14. package/hooks/budget-enforcer.ts +134 -7
  15. package/hooks/gdd-intel-trigger.js +3 -3
  16. package/package.json +6 -1
  17. package/reference/DEPRECATIONS.md +3 -3
  18. package/reference/live-mode-integration.md +1 -1
  19. package/reference/registry.json +1 -1
  20. package/reference/runtime-models.md +15 -15
  21. package/reference/schemas/generated.d.ts +4 -0
  22. package/reference/schemas/runtime-models.schema.json +5 -0
  23. package/reference/skill-metadata.md +4 -4
  24. package/reference/skill-placeholders.md +2 -2
  25. package/scripts/build-skills.cjs +146 -0
  26. package/scripts/generate-skill-frontmatter.cjs +243 -0
  27. package/scripts/lib/bandit-router/integration.cjs +38 -0
  28. package/scripts/lib/install/installer.cjs +133 -1
  29. package/scripts/lib/manifest/scaffolder.cjs +1 -1
  30. package/scripts/lib/manifest/schemas/skills.schema.json +1 -1
  31. package/scripts/lib/manifest/skills.json +1 -1
  32. package/scripts/lib/new-addendum.cjs +1 -1
  33. package/scripts/skill-templates/README.md +90 -0
  34. package/scripts/skill-templates/add-backlog/SKILL.md +48 -0
  35. package/scripts/skill-templates/analyze-dependencies/SKILL.md +95 -0
  36. package/scripts/skill-templates/apply-reflections/SKILL.md +109 -0
  37. package/scripts/skill-templates/apply-reflections/apply-reflections-procedure.md +170 -0
  38. package/scripts/skill-templates/audit/SKILL.md +79 -0
  39. package/scripts/skill-templates/bandit-reset/SKILL.md +91 -0
  40. package/scripts/skill-templates/bandit-status/SKILL.md +94 -0
  41. package/scripts/skill-templates/benchmark/SKILL.md +65 -0
  42. package/scripts/skill-templates/bootstrap-ds/SKILL.md +43 -0
  43. package/scripts/skill-templates/brief/SKILL.md +145 -0
  44. package/scripts/skill-templates/budget/SKILL.md +45 -0
  45. package/scripts/skill-templates/cache-manager/SKILL.md +66 -0
  46. package/scripts/skill-templates/cache-manager/cache-policy.md +126 -0
  47. package/scripts/skill-templates/check-update/SKILL.md +98 -0
  48. package/scripts/skill-templates/compare/SKILL.md +82 -0
  49. package/scripts/skill-templates/compare/compare-rubric.md +171 -0
  50. package/scripts/skill-templates/complete-cycle/SKILL.md +81 -0
  51. package/scripts/skill-templates/connections/SKILL.md +71 -0
  52. package/scripts/skill-templates/connections/connections-onboarding.md +608 -0
  53. package/scripts/skill-templates/context/SKILL.md +137 -0
  54. package/scripts/skill-templates/continue/SKILL.md +24 -0
  55. package/scripts/skill-templates/darkmode/SKILL.md +76 -0
  56. package/scripts/skill-templates/darkmode/darkmode-audit-procedure.md +258 -0
  57. package/scripts/skill-templates/debug/SKILL.md +41 -0
  58. package/scripts/skill-templates/debug/debug-feedback-loops.md +119 -0
  59. package/scripts/skill-templates/design/SKILL.md +118 -0
  60. package/scripts/skill-templates/design/design-procedure.md +304 -0
  61. package/scripts/skill-templates/discuss/SKILL.md +96 -0
  62. package/scripts/skill-templates/do/SKILL.md +45 -0
  63. package/scripts/skill-templates/explore/SKILL.md +118 -0
  64. package/scripts/skill-templates/explore/explore-procedure.md +267 -0
  65. package/scripts/skill-templates/export/SKILL.md +30 -0
  66. package/scripts/skill-templates/extract-learnings/SKILL.md +114 -0
  67. package/scripts/skill-templates/fast/SKILL.md +91 -0
  68. package/scripts/skill-templates/figma-extract/SKILL.md +64 -0
  69. package/scripts/skill-templates/figma-write/SKILL.md +50 -0
  70. package/scripts/skill-templates/graphify/SKILL.md +49 -0
  71. package/scripts/skill-templates/health/SKILL.md +99 -0
  72. package/scripts/skill-templates/health/health-mcp-detection.md +44 -0
  73. package/scripts/skill-templates/health/health-skill-length-report.md +69 -0
  74. package/scripts/skill-templates/help/SKILL.md +60 -0
  75. package/scripts/skill-templates/instinct/SKILL.md +111 -0
  76. package/scripts/skill-templates/list-assumptions/SKILL.md +61 -0
  77. package/scripts/skill-templates/list-pins/SKILL.md +27 -0
  78. package/scripts/skill-templates/live/SKILL.md +98 -0
  79. package/scripts/skill-templates/locale/SKILL.md +51 -0
  80. package/scripts/skill-templates/map/SKILL.md +89 -0
  81. package/scripts/skill-templates/migrate/SKILL.md +70 -0
  82. package/scripts/skill-templates/migrate-context/SKILL.md +123 -0
  83. package/scripts/skill-templates/new-addendum/SKILL.md +81 -0
  84. package/scripts/skill-templates/new-cycle/SKILL.md +37 -0
  85. package/scripts/skill-templates/new-project/SKILL.md +53 -0
  86. package/scripts/skill-templates/new-skill/SKILL.md +90 -0
  87. package/scripts/skill-templates/next/SKILL.md +68 -0
  88. package/scripts/skill-templates/note/SKILL.md +48 -0
  89. package/scripts/skill-templates/openrouter-status/SKILL.md +86 -0
  90. package/scripts/skill-templates/optimize/SKILL.md +97 -0
  91. package/scripts/skill-templates/override/SKILL.md +86 -0
  92. package/scripts/skill-templates/paper-write/SKILL.md +54 -0
  93. package/scripts/skill-templates/pause/SKILL.md +77 -0
  94. package/scripts/skill-templates/peer-cli-add/SKILL.md +88 -0
  95. package/scripts/skill-templates/peer-cli-add/peer-cli-protocol.md +161 -0
  96. package/scripts/skill-templates/peer-cli-customize/SKILL.md +89 -0
  97. package/scripts/skill-templates/peers/SKILL.md +96 -0
  98. package/scripts/skill-templates/pencil-write/SKILL.md +54 -0
  99. package/scripts/skill-templates/pin/SKILL.md +37 -0
  100. package/scripts/skill-templates/plan/SKILL.md +105 -0
  101. package/scripts/skill-templates/plan/plan-procedure.md +278 -0
  102. package/scripts/skill-templates/plant-seed/SKILL.md +48 -0
  103. package/scripts/skill-templates/pr-branch/SKILL.md +32 -0
  104. package/scripts/skill-templates/progress/SKILL.md +107 -0
  105. package/scripts/skill-templates/quality-gate/SKILL.md +90 -0
  106. package/scripts/skill-templates/quality-gate/threat-modeling.md +101 -0
  107. package/scripts/skill-templates/quick/SKILL.md +44 -0
  108. package/scripts/skill-templates/reapply-patches/SKILL.md +32 -0
  109. package/scripts/skill-templates/recall/SKILL.md +75 -0
  110. package/scripts/skill-templates/reflect/SKILL.md +85 -0
  111. package/scripts/skill-templates/reflect/procedures/capability-gap-scan.md +119 -0
  112. package/scripts/skill-templates/report-issue/SKILL.md +53 -0
  113. package/scripts/skill-templates/report-issue/report-issue-procedure.md +119 -0
  114. package/scripts/skill-templates/resume/SKILL.md +93 -0
  115. package/scripts/skill-templates/review-backlog/SKILL.md +46 -0
  116. package/scripts/skill-templates/review-decisions/SKILL.md +42 -0
  117. package/scripts/skill-templates/roi/SKILL.md +54 -0
  118. package/scripts/skill-templates/rollout-status/SKILL.md +35 -0
  119. package/scripts/skill-templates/router/SKILL.md +89 -0
  120. package/scripts/skill-templates/router/capability-gap-emitter.md +65 -0
  121. package/scripts/skill-templates/router/router-pick-emitter.md +78 -0
  122. package/scripts/skill-templates/router/router-rules.md +84 -0
  123. package/scripts/skill-templates/settings/SKILL.md +87 -0
  124. package/scripts/skill-templates/ship/SKILL.md +48 -0
  125. package/scripts/skill-templates/sketch/SKILL.md +78 -0
  126. package/scripts/skill-templates/sketch-wrap-up/SKILL.md +92 -0
  127. package/scripts/skill-templates/skill-manifest/SKILL.md +79 -0
  128. package/scripts/skill-templates/spike/SKILL.md +67 -0
  129. package/scripts/skill-templates/spike-wrap-up/SKILL.md +86 -0
  130. package/scripts/skill-templates/start/SKILL.md +67 -0
  131. package/scripts/skill-templates/start/start-procedure.md +115 -0
  132. package/scripts/skill-templates/state/SKILL.md +106 -0
  133. package/scripts/skill-templates/stats/SKILL.md +51 -0
  134. package/scripts/skill-templates/style/SKILL.md +71 -0
  135. package/scripts/skill-templates/style/style-doc-procedure.md +150 -0
  136. package/scripts/skill-templates/synthesize/SKILL.md +94 -0
  137. package/scripts/skill-templates/timeline/SKILL.md +66 -0
  138. package/scripts/skill-templates/todo/SKILL.md +64 -0
  139. package/scripts/skill-templates/turn-closeout/SKILL.md +95 -0
  140. package/scripts/skill-templates/undo/SKILL.md +31 -0
  141. package/scripts/skill-templates/unlock-decision/SKILL.md +54 -0
  142. package/scripts/skill-templates/unpin/SKILL.md +31 -0
  143. package/scripts/skill-templates/update/SKILL.md +56 -0
  144. package/scripts/skill-templates/using-gdd/SKILL.md +78 -0
  145. package/scripts/skill-templates/verify/SKILL.md +113 -0
  146. package/scripts/skill-templates/verify/verify-procedure.md +511 -0
  147. package/scripts/skill-templates/warm-cache/SKILL.md +81 -0
  148. package/scripts/skill-templates/watch-authorities/SKILL.md +82 -0
  149. package/scripts/skill-templates/zoom-out/SKILL.md +26 -0
  150. package/sdk/cli/commands/build.ts +2 -2
  151. package/sdk/cli/index.js +2 -2
  152. package/sdk/cli/index.ts +1 -1
  153. package/skills/README.md +22 -14
  154. package/skills/help/SKILL.md +28 -55
  155. 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>
@@ -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
- if (budget.enforcement_mode === 'enforce') {
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 (budget.enforcement_mode === 'warn') {
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
- const runtimeId =
1235
- (typeof routerDecision?.runtime === 'string' && routerDecision.runtime.length > 0
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|source\/skills)\/.*\.(?:md|json)$/;
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",
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). Two-step migration:
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
 
@@ -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`) explicitly accepts the placeholder marker so the file ships shape-valid; the unverified-ness is a content gap, not a structural defect.
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.