@hegemonart/get-design-done 1.30.6 → 1.31.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 (175) hide show
  1. package/.claude-plugin/marketplace.json +6 -3
  2. package/.claude-plugin/plugin.json +5 -2
  3. package/CHANGELOG.md +105 -0
  4. package/NOTICE +224 -0
  5. package/README.md +22 -1
  6. package/SKILL.md +1 -0
  7. package/agents/design-authority-watcher.md +1 -1
  8. package/agents/perf-analyzer.md +2 -2
  9. package/bin/gdd-mcp +78 -0
  10. package/bin/gdd-sdk +34 -24
  11. package/bin/gdd-state-mcp +78 -0
  12. package/{README.de.md → docs/i18n/README.de.md} +1 -1
  13. package/{README.fr.md → docs/i18n/README.fr.md} +1 -1
  14. package/{README.it.md → docs/i18n/README.it.md} +1 -1
  15. package/{README.ja.md → docs/i18n/README.ja.md} +1 -1
  16. package/{README.ko.md → docs/i18n/README.ko.md} +1 -1
  17. package/{README.zh-CN.md → docs/i18n/README.zh-CN.md} +1 -1
  18. package/hooks/_hook-emit.js +1 -1
  19. package/hooks/budget-enforcer.ts +5 -5
  20. package/hooks/context-exhaustion.ts +2 -2
  21. package/hooks/gdd-precompact-snapshot.js +3 -3
  22. package/hooks/gdd-read-injection-scanner.ts +2 -2
  23. package/hooks/gdd-sessionstart-recap.js +1 -1
  24. package/hooks/gdd-turn-closeout.js +1 -1
  25. package/package.json +24 -10
  26. package/recipes/.gitkeep +0 -0
  27. package/reference/schemas/recipe.schema.json +33 -0
  28. package/scripts/cli/gdd-events.mjs +5 -5
  29. package/scripts/lib/cache/gdd-cache-manager.cjs +1 -1
  30. package/scripts/lib/cli/index.ts +22 -160
  31. package/scripts/lib/connection-probe/index.cjs +1 -1
  32. package/scripts/lib/discuss-parallel-runner/aggregator.ts +1 -1
  33. package/scripts/lib/discuss-parallel-runner/index.ts +1 -1
  34. package/scripts/lib/error-classifier.cjs +24 -227
  35. package/scripts/lib/event-stream/index.ts +25 -193
  36. package/scripts/lib/figma-extract/digest.cjs +430 -0
  37. package/scripts/lib/figma-extract/parse-url.cjs +87 -0
  38. package/scripts/lib/figma-extract/payload-schema.json +108 -0
  39. package/scripts/lib/figma-extract/pull.cjs +394 -0
  40. package/scripts/lib/figma-extract/receiver.cjs +273 -0
  41. package/scripts/lib/figma-extract/render-md.cjs +143 -0
  42. package/scripts/lib/figma-extract/styles-resolver.cjs +147 -0
  43. package/scripts/lib/figma-extract/walk.cjs +100 -0
  44. package/scripts/lib/gdd-errors/index.ts +24 -213
  45. package/scripts/lib/gdd-state/index.ts +23 -161
  46. package/scripts/lib/health-mirror/index.cjs +88 -1
  47. package/scripts/lib/iteration-budget.cjs +23 -199
  48. package/scripts/lib/jittered-backoff.cjs +24 -107
  49. package/scripts/lib/lockfile.cjs +23 -195
  50. package/scripts/lib/logger/index.ts +1 -1
  51. package/scripts/lib/parallelism-engine/concurrency-tuner.cjs +1 -1
  52. package/scripts/lib/perf-analyzer/index.cjs +1 -1
  53. package/scripts/lib/pipeline-runner/index.ts +4 -4
  54. package/scripts/lib/pipeline-runner/state-machine.ts +1 -1
  55. package/scripts/lib/prompt-dedup/index.cjs +1 -1
  56. package/scripts/lib/rate-guard.cjs +2 -2
  57. package/scripts/lib/recipe-loader.cjs +142 -0
  58. package/scripts/lib/session-runner/errors.ts +3 -3
  59. package/scripts/lib/session-runner/index.ts +3 -3
  60. package/scripts/lib/session-runner/transcript.ts +1 -1
  61. package/scripts/lib/tool-scoping/index.ts +1 -1
  62. package/scripts/mcp-servers/gdd-mcp/server.ts +29 -311
  63. package/scripts/mcp-servers/gdd-state/server.ts +28 -282
  64. package/sdk/README.md +45 -0
  65. package/{scripts/lib → sdk}/cli/commands/audit.ts +3 -3
  66. package/{scripts/lib → sdk}/cli/commands/init.ts +3 -3
  67. package/{scripts/lib → sdk}/cli/commands/query.ts +4 -4
  68. package/{scripts/lib → sdk}/cli/commands/run.ts +5 -5
  69. package/{scripts/lib → sdk}/cli/commands/stage.ts +5 -5
  70. package/sdk/cli/index.js +8091 -0
  71. package/sdk/cli/index.ts +172 -0
  72. package/{scripts/lib → sdk}/cli/parse-args.ts +2 -2
  73. package/{scripts/lib/gdd-errors → sdk/errors}/classification.ts +1 -1
  74. package/sdk/errors/index.ts +218 -0
  75. package/{scripts/lib → sdk}/event-stream/emitter.ts +1 -1
  76. package/sdk/event-stream/index.ts +197 -0
  77. package/{scripts/lib → sdk}/event-stream/reader.ts +1 -1
  78. package/{scripts/lib → sdk}/event-stream/types.ts +2 -2
  79. package/{scripts/lib → sdk}/event-stream/writer.ts +1 -1
  80. package/sdk/index.ts +19 -0
  81. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/README.md +3 -3
  82. package/sdk/mcp/gdd-mcp/server.js +1924 -0
  83. package/sdk/mcp/gdd-mcp/server.ts +325 -0
  84. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_cycle_recap.ts +3 -3
  85. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_decisions_list.ts +2 -2
  86. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_events_tail.ts +3 -3
  87. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_health.ts +2 -2
  88. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_intel_get.ts +2 -2
  89. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_learnings_digest.ts +2 -2
  90. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_phase_current.ts +2 -2
  91. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_phases_list.ts +2 -2
  92. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_plans_list.ts +2 -2
  93. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_reflections_latest.ts +2 -2
  94. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_status.ts +3 -3
  95. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_telemetry_query.ts +3 -3
  96. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/index.ts +2 -2
  97. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/shared.ts +3 -3
  98. package/sdk/mcp/gdd-state/server.js +2790 -0
  99. package/sdk/mcp/gdd-state/server.ts +294 -0
  100. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/add_blocker.ts +3 -3
  101. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/add_decision.ts +3 -3
  102. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/add_must_have.ts +3 -3
  103. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/checkpoint.ts +2 -2
  104. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/frontmatter_update.ts +2 -2
  105. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/get.ts +3 -3
  106. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/index.ts +1 -1
  107. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/probe_connections.ts +3 -3
  108. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/resolve_blocker.ts +3 -3
  109. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/set_status.ts +2 -2
  110. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/shared.ts +8 -8
  111. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/transition_stage.ts +4 -4
  112. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/update_progress.ts +2 -2
  113. package/sdk/primitives/error-classifier.cjs +232 -0
  114. package/sdk/primitives/iteration-budget.cjs +205 -0
  115. package/sdk/primitives/jittered-backoff.cjs +112 -0
  116. package/sdk/primitives/lockfile.cjs +201 -0
  117. package/{scripts/lib/gdd-state → sdk/state}/gates.ts +1 -1
  118. package/sdk/state/index.ts +167 -0
  119. package/{scripts/lib/gdd-state → sdk/state}/lockfile.ts +1 -1
  120. package/{scripts/lib/gdd-state → sdk/state}/mutator.ts +1 -1
  121. package/{scripts/lib/gdd-state → sdk/state}/parser.ts +1 -1
  122. package/{scripts/lib/gdd-state → sdk/state}/types.ts +4 -4
  123. package/skills/figma-extract/SKILL.md +64 -0
  124. package/skills/health/SKILL.md +10 -0
  125. package/skills/quality-gate/SKILL.md +2 -2
  126. package/scripts/aggregate-agent-metrics.ts +0 -282
  127. package/scripts/bootstrap-manifest.txt +0 -3
  128. package/scripts/bootstrap.sh +0 -80
  129. package/scripts/build-distribution-bundles.cjs +0 -549
  130. package/scripts/build-intel.cjs +0 -486
  131. package/scripts/codegen-schema-types.ts +0 -149
  132. package/scripts/detect-stale-refs.cjs +0 -107
  133. package/scripts/e2e/run-headless.ts +0 -514
  134. package/scripts/extract-changelog-section.cjs +0 -58
  135. package/scripts/gsd-cleanup-incubator.cjs +0 -367
  136. package/scripts/injection-patterns.cjs +0 -58
  137. package/scripts/lint-agentskills-spec.cjs +0 -457
  138. package/scripts/release-smoke-test.cjs +0 -200
  139. package/scripts/rollback-release.sh +0 -42
  140. package/scripts/run-injection-scanner-ci.cjs +0 -83
  141. package/scripts/tests/test-authority-rejected-kinds.sh +0 -58
  142. package/scripts/tests/test-authority-watcher-diff.sh +0 -113
  143. package/scripts/tests/test-motion-provenance.sh +0 -64
  144. package/scripts/validate-frontmatter.ts +0 -409
  145. package/scripts/validate-incubator-scope.cjs +0 -133
  146. package/scripts/validate-schemas.ts +0 -401
  147. package/scripts/validate-skill-length.cjs +0 -283
  148. package/scripts/verify-version-sync.cjs +0 -30
  149. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_cycle_recap.schema.json +0 -0
  150. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_decisions_list.schema.json +0 -0
  151. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_events_tail.schema.json +0 -0
  152. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_health.schema.json +0 -0
  153. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_intel_get.schema.json +0 -0
  154. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_learnings_digest.schema.json +0 -0
  155. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_phase_current.schema.json +0 -0
  156. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_phases_list.schema.json +0 -0
  157. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_plans_list.schema.json +0 -0
  158. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_reflections_latest.schema.json +0 -0
  159. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_status.schema.json +0 -0
  160. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_telemetry_query.schema.json +0 -0
  161. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/add_blocker.schema.json +0 -0
  162. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/add_decision.schema.json +0 -0
  163. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/add_must_have.schema.json +0 -0
  164. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/checkpoint.schema.json +0 -0
  165. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/frontmatter_update.schema.json +0 -0
  166. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/get.schema.json +0 -0
  167. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/probe_connections.schema.json +0 -0
  168. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/resolve_blocker.schema.json +0 -0
  169. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/set_status.schema.json +0 -0
  170. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/transition_stage.schema.json +0 -0
  171. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/update_progress.schema.json +0 -0
  172. /package/{scripts/lib → sdk/primitives}/error-classifier.d.cts +0 -0
  173. /package/{scripts/lib → sdk/primitives}/iteration-budget.d.cts +0 -0
  174. /package/{scripts/lib → sdk/primitives}/jittered-backoff.d.cts +0 -0
  175. /package/{scripts/lib → sdk/primitives}/lockfile.d.cts +0 -0
package/bin/gdd-sdk CHANGED
@@ -1,37 +1,47 @@
1
1
  #!/usr/bin/env node
2
- // bin/gdd-sdk — Plan 21-09 Task 7 (SDK-21).
2
+ // bin/gdd-sdk — Plan 21-09 Task 7 (SDK-21); dual-mode since Plan 31-5-9.5 (D-16).
3
3
  //
4
- // CJS trampoline: spawns `node --experimental-strip-types` against the
5
- // real TS entry point in `scripts/lib/cli/index.ts` and forwards argv +
6
- // exit code. Windows-compatible (npm's generated .cmd shim on Windows
7
- // has no way to inject the --experimental-strip-types flag otherwise).
4
+ // DUAL-MODE CJS trampoline. Resolves the SDK CLI entry and re-launches it under
5
+ // `node`, forwarding argv + exit code/signal. Two modes:
8
6
  //
9
- // Why a trampoline:
7
+ // COMPILED (installed / packed): if the esbuild-bundled sibling
8
+ // `sdk/cli/index.js` exists, spawn `node <js>` with NO flag. This is the
9
+ // path a user gets from `npm i` — the entry lives under node_modules where
10
+ // Node refuses --experimental-strip-types on `.ts`
11
+ // (ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING). `prepack` compiles the .js
12
+ // before every pack/publish (see scripts/build-sdk-bins.cjs).
13
+ // • SOURCE (in-repo dev): otherwise spawn
14
+ // `node --experimental-strip-types sdk/cli/index.ts` — the raw TS, no build
15
+ // step, exactly as before this plan.
16
+ //
17
+ // Why a trampoline at all:
10
18
  // POSIX shebangs can use `#!/usr/bin/env -S node --experimental-strip-types`,
11
- // but Windows cmd.exe does not honor shebangs. npm's auto-generated
12
- // .cmd shim invokes plain `node bin/gdd-sdk` without passing the
13
- // experimental flag. The trampoline re-launches node with the flag
14
- // explicitly so both platforms end up at the same TS entry.
19
+ // but Windows cmd.exe does not honor shebangs and npm's auto-generated .cmd
20
+ // shim invokes plain `node bin/gdd-sdk` with no way to inject the flag. The
21
+ // trampoline re-launches node correctly on both platforms.
15
22
 
16
23
  'use strict';
17
24
 
18
25
  const { spawn } = require('node:child_process');
26
+ const fs = require('node:fs');
19
27
  const path = require('node:path');
20
28
 
21
- const entry = path.resolve(
22
- __dirname,
23
- '..',
24
- 'scripts',
25
- 'lib',
26
- 'cli',
27
- 'index.ts',
28
- );
29
+ // Sibling compiled JS (preferred) and the TS source (dev fallback).
30
+ const compiled = path.resolve(__dirname, '..', 'sdk', 'cli', 'index.js');
31
+ const source = path.resolve(__dirname, '..', 'sdk', 'cli', 'index.ts');
32
+
33
+ // fs.existsSync (not a try/require) — the entry is launched in a child node,
34
+ // not require()'d here, and we must not evaluate it in this process.
35
+ const useCompiled = fs.existsSync(compiled);
36
+ const entry = useCompiled ? compiled : source;
37
+ const nodeArgs = useCompiled
38
+ ? [entry, ...process.argv.slice(2)]
39
+ : ['--experimental-strip-types', entry, ...process.argv.slice(2)];
29
40
 
30
- const child = spawn(
31
- process.execPath,
32
- ['--experimental-strip-types', entry, ...process.argv.slice(2)],
33
- { stdio: 'inherit', shell: false },
34
- );
41
+ const child = spawn(process.execPath, nodeArgs, {
42
+ stdio: 'inherit',
43
+ shell: false,
44
+ });
35
45
 
36
46
  child.on('exit', (code, signal) => {
37
47
  if (signal) {
@@ -50,6 +60,6 @@ child.on('exit', (code, signal) => {
50
60
  child.on('error', (err) => {
51
61
  // Failure to spawn node itself — extremely rare; surface to stderr.
52
62
  // eslint-disable-next-line no-console
53
- console.error('gdd-sdk: failed to launch TypeScript entry:', err.message);
63
+ console.error('gdd-sdk: failed to launch SDK CLI entry:', err.message);
54
64
  process.exit(3);
55
65
  });
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+ // bin/gdd-state-mcp — Plan 31-5-05 (SDK-03, D-08); dual-mode since Plan 31-5-9.5 (D-16).
3
+ //
4
+ // DUAL-MODE CJS trampoline for the `gdd-state` MCP server. Resolves the server
5
+ // entry and re-launches it under `node`, forwarding argv + exit code/signal.
6
+ // Two modes:
7
+ //
8
+ // • COMPILED (installed / packed): if the esbuild-bundled sibling
9
+ // `sdk/mcp/gdd-state/server.js` exists, spawn `node <js>` with NO flag.
10
+ // This is the path a user gets from `npm i` — the entry lives under
11
+ // node_modules where Node refuses --experimental-strip-types on `.ts`
12
+ // (ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING). `prepack` compiles the .js
13
+ // before every pack/publish (see scripts/build-sdk-bins.cjs).
14
+ // • SOURCE (in-repo dev): otherwise spawn
15
+ // `node --experimental-strip-types sdk/mcp/gdd-state/server.ts` — raw TS, no
16
+ // build step, exactly as before this plan.
17
+ //
18
+ // Why a trampoline at all:
19
+ // POSIX shebangs can use `#!/usr/bin/env -S node --experimental-strip-types`,
20
+ // but Windows cmd.exe does not honor shebangs and npm's auto-generated .cmd
21
+ // shim invokes plain `node bin/gdd-state-mcp` with no way to inject the flag.
22
+ // Mirrors the proven bin/gdd-sdk trampoline pattern.
23
+
24
+ 'use strict';
25
+
26
+ const { spawn } = require('node:child_process');
27
+ const fs = require('node:fs');
28
+ const path = require('node:path');
29
+
30
+ // Sibling compiled JS (preferred) and the TS source (dev fallback).
31
+ const compiled = path.resolve(
32
+ __dirname,
33
+ '..',
34
+ 'sdk',
35
+ 'mcp',
36
+ 'gdd-state',
37
+ 'server.js',
38
+ );
39
+ const source = path.resolve(
40
+ __dirname,
41
+ '..',
42
+ 'sdk',
43
+ 'mcp',
44
+ 'gdd-state',
45
+ 'server.ts',
46
+ );
47
+
48
+ const useCompiled = fs.existsSync(compiled);
49
+ const entry = useCompiled ? compiled : source;
50
+ const nodeArgs = useCompiled
51
+ ? [entry, ...process.argv.slice(2)]
52
+ : ['--experimental-strip-types', entry, ...process.argv.slice(2)];
53
+
54
+ const child = spawn(process.execPath, nodeArgs, {
55
+ stdio: 'inherit',
56
+ shell: false,
57
+ });
58
+
59
+ child.on('exit', (code, signal) => {
60
+ if (signal) {
61
+ // Re-raise the signal to ourselves so the parent shell sees the same
62
+ // termination mode (e.g., Ctrl+C propagates as SIGINT exit).
63
+ try {
64
+ process.kill(process.pid, signal);
65
+ } catch {
66
+ process.exit(1);
67
+ }
68
+ return;
69
+ }
70
+ process.exit(typeof code === 'number' ? code : 0);
71
+ });
72
+
73
+ child.on('error', (err) => {
74
+ // Failure to spawn node itself — extremely rare; surface to stderr.
75
+ // eslint-disable-next-line no-console
76
+ console.error('gdd-state-mcp: failed to launch MCP server entry:', err.message);
77
+ process.exit(3);
78
+ });
@@ -2,7 +2,7 @@
2
2
 
3
3
  # GET DESIGN DONE
4
4
 
5
- [English](README.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · [Français](README.fr.md) · [Italiano](README.it.md) · **Deutsch**
5
+ [English](../../README.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · [Français](README.fr.md) · [Italiano](README.it.md) · **Deutsch**
6
6
 
7
7
  **Eine Design-Quality-Pipeline für AI-Coding-Agenten: Brief → Explore → Plan → Implementierung → Verifikation.**
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # GET DESIGN DONE
4
4
 
5
- [English](README.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · **Français** · [Italiano](README.it.md) · [Deutsch](README.de.md)
5
+ [English](../../README.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · **Français** · [Italiano](README.it.md) · [Deutsch](README.de.md)
6
6
 
7
7
  **Un pipeline de qualité design pour agents de code IA : brief → exploration → plan → implémentation → vérification.**
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # GET DESIGN DONE
4
4
 
5
- [English](README.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · [Français](README.fr.md) · **Italiano** · [Deutsch](README.de.md)
5
+ [English](../../README.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · [Français](README.fr.md) · **Italiano** · [Deutsch](README.de.md)
6
6
 
7
7
  **Una pipeline di qualità del design per agenti di coding IA: brief → esplorazione → piano → implementazione → verifica.**
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # GET DESIGN DONE
4
4
 
5
- [English](README.md) · [简体中文](README.zh-CN.md) · **日本語** · [한국어](README.ko.md) · [Français](README.fr.md) · [Italiano](README.it.md) · [Deutsch](README.de.md)
5
+ [English](../../README.md) · [简体中文](README.zh-CN.md) · **日本語** · [한국어](README.ko.md) · [Français](README.fr.md) · [Italiano](README.it.md) · [Deutsch](README.de.md)
6
6
 
7
7
  **AI コーディングエージェントのためのデザイン品質パイプライン: ブリーフ → 探索 → 計画 → 実装 → 検証。**
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # GET DESIGN DONE
4
4
 
5
- [English](README.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · **한국어** · [Français](README.fr.md) · [Italiano](README.it.md) · [Deutsch](README.de.md)
5
+ [English](../../README.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · **한국어** · [Français](README.fr.md) · [Italiano](README.it.md) · [Deutsch](README.de.md)
6
6
 
7
7
  **AI 코딩 에이전트를 위한 디자인 품질 파이프라인: 브리프 → 탐색 → 계획 → 구현 → 검증.**
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # GET DESIGN DONE
4
4
 
5
- [English](README.md) · **简体中文** · [日本語](README.ja.md) · [한국어](README.ko.md) · [Français](README.fr.md) · [Italiano](README.it.md) · [Deutsch](README.de.md)
5
+ [English](../../README.md) · **简体中文** · [日本語](README.ja.md) · [한국어](README.ko.md) · [Français](README.fr.md) · [Italiano](README.it.md) · [Deutsch](README.de.md)
6
6
 
7
7
  **面向 AI 编码智能体的设计质量流水线:简报 → 探索 → 规划 → 实现 → 验证。**
8
8
 
@@ -45,7 +45,7 @@ function getAppendEvent() {
45
45
  // require()'ing — if Node refuses to parse `.ts`, we silently fall
46
46
  // back to no-op.
47
47
  // eslint-disable-next-line node/no-missing-require, global-require
48
- cachedAppendEvent = require('../scripts/lib/event-stream/index.ts').appendEvent;
48
+ cachedAppendEvent = require('../sdk/event-stream/index.ts').appendEvent;
49
49
  return cachedAppendEvent;
50
50
  } catch {
51
51
  cachedAppendEvent = null;
@@ -44,8 +44,8 @@ import { spawn } from 'node:child_process';
44
44
  import { createInterface } from 'node:readline';
45
45
  import { createRequire } from 'node:module';
46
46
 
47
- import { appendEvent } from '../scripts/lib/event-stream/index.ts';
48
- import type { HookFiredEvent } from '../scripts/lib/event-stream/index.ts';
47
+ import { appendEvent } from '../sdk/event-stream/index.ts';
48
+ import type { HookFiredEvent } from '../sdk/event-stream/index.ts';
49
49
  // Consume the generated BudgetSchema so this hook participates in the
50
50
  // Plan 20-00 codegen graph. We treat parsed JSON as BudgetSchema after
51
51
  // the structural merge with defaults — the schema permits every field
@@ -71,7 +71,7 @@ function resolveHookPath(): string {
71
71
  }
72
72
  const nodeRequire = createRequire(resolveHookPath());
73
73
  const rateGuard = nodeRequire('../scripts/lib/rate-guard.cjs') as typeof import('../scripts/lib/rate-guard.cjs');
74
- const iterationBudget = nodeRequire('../scripts/lib/iteration-budget.cjs') as typeof import('../scripts/lib/iteration-budget.cjs');
74
+ const iterationBudget = nodeRequire('../sdk/primitives/iteration-budget.cjs') as typeof import('../sdk/primitives/iteration-budget.cjs');
75
75
  // Plan 26-05: shared cost-computation backend for the resolved_models
76
76
  // consumer path. Pure module — takes (model_id, runtime, token_counts) →
77
77
  // cost_usd by reading per-runtime price tables under reference/prices/.
@@ -612,9 +612,9 @@ export function writeTelemetry(partial: TelemetryRowPartial): void {
612
612
 
613
613
  /**
614
614
  * Emit one hook.fired event per hook decision. Uses the pre-registered
615
- * HookFiredEvent subtype from scripts/lib/event-stream/types.ts and
615
+ * HookFiredEvent subtype from sdk/event-stream/types.ts and
616
616
  * stamps sessionId from the process PID + boot time — same scheme as
617
- * scripts/mcp-servers/gdd-state/tools/shared.ts but inlined here so the
617
+ * sdk/mcp/gdd-state/tools/shared.ts but inlined here so the
618
618
  * hook stays dependency-light.
619
619
  */
620
620
  let CACHED_SESSION_ID: string | null = null;
@@ -28,8 +28,8 @@ import {
28
28
  import { dirname, join } from 'node:path';
29
29
  import { createInterface } from 'node:readline';
30
30
 
31
- import { appendEvent } from '../scripts/lib/event-stream/index.ts';
32
- import type { HookFiredEvent } from '../scripts/lib/event-stream/index.ts';
31
+ import { appendEvent } from '../sdk/event-stream/index.ts';
32
+ import type { HookFiredEvent } from '../sdk/event-stream/index.ts';
33
33
 
34
34
  // ── Types ───────────────────────────────────────────────────────────────────
35
35
 
@@ -6,7 +6,7 @@
6
6
  * writes an atomic snapshot of STATE.md sections + last-N event-chain
7
7
  * entries + last-N decisions to `.design/snapshots/<ts>.json`.
8
8
  *
9
- * Phase 27.6 D-08: atomic .tmp + rename via scripts/lib/lockfile.cjs.
9
+ * Phase 27.6 D-08: atomic .tmp + rename via sdk/primitives/lockfile.cjs.
10
10
  * - Lockfile serializes concurrent PreCompact writers.
11
11
  * - .tmp + rename guarantees no partial file ever appears at target path
12
12
  * (a SIGKILL between writeFileSync and renameSync leaves an orphan
@@ -52,7 +52,7 @@ function detectHarness() {
52
52
 
53
53
  function getAppendEvent() {
54
54
  try {
55
- const m = require('../scripts/lib/event-stream');
55
+ const m = require('../sdk/event-stream');
56
56
  if (m && typeof m.appendEvent === 'function') return m.appendEvent;
57
57
  } catch {
58
58
  /* swallow — event-stream is optional infrastructure */
@@ -224,7 +224,7 @@ async function main() {
224
224
  // PreCompact writers; the second writer either waits or fails-silent.
225
225
  let release = null;
226
226
  try {
227
- const lockfile = require('../scripts/lib/lockfile.cjs');
227
+ const lockfile = require('../sdk/primitives/lockfile.cjs');
228
228
  release = await lockfile.acquire(snapshotPath, {
229
229
  staleMs: 60_000,
230
230
  maxWaitMs: 10_000,
@@ -29,8 +29,8 @@ import { createRequire } from 'node:module';
29
29
  import { createInterface } from 'node:readline';
30
30
  import { dirname, isAbsolute, join, resolve } from 'node:path';
31
31
 
32
- import { appendEvent } from '../scripts/lib/event-stream/index.ts';
33
- import type { HookFiredEvent } from '../scripts/lib/event-stream/index.ts';
32
+ import { appendEvent } from '../sdk/event-stream/index.ts';
33
+ import type { HookFiredEvent } from '../sdk/event-stream/index.ts';
34
34
 
35
35
  // ── require-bridge to the shared .cjs pattern file ──────────────────────────
36
36
 
@@ -45,7 +45,7 @@ function detectHarness() {
45
45
 
46
46
  function getAppendEvent() {
47
47
  try {
48
- const m = require('../scripts/lib/event-stream');
48
+ const m = require('../sdk/event-stream');
49
49
  if (m && typeof m.appendEvent === 'function') return m.appendEvent;
50
50
  } catch {
51
51
  /* swallow — event-stream is optional infrastructure */
@@ -49,7 +49,7 @@ const TAIL_BYTES = 8_192; // last 8 KiB is plenty for one event line (<<64KiB ca
49
49
  * Lightweight parse of the `<position>` block in STATE.md. Returns the fields
50
50
  * we care about, or null if the block isn't present / well-formed.
51
51
  *
52
- * We intentionally avoid the full parser at scripts/lib/gdd-state/parser.ts
52
+ * We intentionally avoid the full parser at sdk/state/parser.ts
53
53
  * because (a) it requires TS execution and (b) its overhead would blow the
54
54
  * 10ms budget. The position block is k=v lines so a regex pass is fine.
55
55
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hegemonart/get-design-done",
3
- "version": "1.30.6",
3
+ "version": "1.31.5",
4
4
  "description": "A design-quality pipeline for AI coding agents: brief, plan, implement, and verify UI work against your design system.",
5
5
  "author": "Hegemon",
6
6
  "homepage": "https://github.com/hegemonart/get-design-done",
@@ -17,21 +17,28 @@
17
17
  "agents/",
18
18
  "skills/",
19
19
  "hooks/",
20
- "scripts/",
21
20
  "connections/",
22
21
  "reference/",
23
22
  "bin/",
23
+ "sdk/",
24
+ "recipes/",
25
+ "docs/i18n/",
26
+ "scripts/lib/",
27
+ "scripts/mcp-servers/",
28
+ "scripts/cli/",
29
+ "scripts/install.cjs",
24
30
  "SKILL.md",
25
31
  "README.md",
26
32
  "CHANGELOG.md",
27
- "LICENSE"
33
+ "LICENSE",
34
+ "NOTICE"
28
35
  ],
29
36
  "bin": {
30
37
  "gdd-events": "./scripts/cli/gdd-events.mjs",
31
38
  "gdd-graph": "./bin/gdd-graph",
32
- "gdd-mcp": "./scripts/mcp-servers/gdd-mcp/server.ts",
39
+ "gdd-mcp": "./bin/gdd-mcp",
33
40
  "gdd-sdk": "./bin/gdd-sdk",
34
- "gdd-state-mcp": "./scripts/mcp-servers/gdd-state/server.ts",
41
+ "gdd-state-mcp": "./bin/gdd-state-mcp",
35
42
  "get-design-done": "./scripts/install.cjs"
36
43
  },
37
44
  "publishConfig": {
@@ -40,26 +47,30 @@
40
47
  },
41
48
  "scripts": {
42
49
  "build:bundles": "node scripts/build-distribution-bundles.cjs",
43
- "test": "node --test --experimental-strip-types \"tests/**/*.test.cjs\" \"tests/**/*.test.ts\"",
50
+ "build:sdk": "node scripts/build-sdk-bins.cjs",
51
+ "prepack": "npm run build:sdk",
52
+ "postpack": "node scripts/build-sdk-bins.cjs --clean",
53
+ "test": "node --test --experimental-strip-types \"test/suite/**/*.test.cjs\" \"test/suite/**/*.test.ts\"",
44
54
  "typecheck": "tsc --noEmit",
45
55
  "codegen:schemas": "node --experimental-strip-types scripts/codegen-schema-types.ts",
46
- "lint:md": "npx --yes markdownlint-cli2 \"**/*.md\" \"#node_modules\" \"#.planning\" \"#.claude\" \"#test-fixture/baselines\"",
56
+ "lint:md": "npx --yes markdownlint-cli2 \"**/*.md\" \"#node_modules\" \"#.planning\" \"#.claude\" \"#test/fixtures/baselines\"",
47
57
  "lint:links": "npx --yes lychee --no-progress --accept 200,206,403,429 \"**/*.md\" || true",
48
58
  "lint:agentskills": "node scripts/lint-agentskills-spec.cjs",
49
59
  "validate:schemas": "node --experimental-strip-types scripts/validate-schemas.ts",
50
60
  "validate:frontmatter": "node --experimental-strip-types scripts/validate-frontmatter.ts agents/",
51
61
  "detect:stale-refs": "node scripts/detect-stale-refs.cjs",
52
62
  "scan:injection": "node scripts/run-injection-scanner-ci.cjs",
53
- "test:size-budget": "node --test tests/agent-size-budget.test.cjs",
63
+ "test:size-budget": "node --test test/suite/agent-size-budget.test.cjs",
54
64
  "release:extract-changelog": "node scripts/extract-changelog-section.cjs",
55
65
  "verify:version-sync": "node scripts/verify-version-sync.cjs",
56
66
  "typecheck:session-runner": "tsc --noEmit",
57
- "gdd-sdk": "node --experimental-strip-types scripts/lib/cli/index.ts"
67
+ "gdd-sdk": "node --experimental-strip-types sdk/cli/index.ts"
58
68
  },
59
69
  "devDependencies": {
60
70
  "@types/node": "^25.6.0",
61
71
  "ajv-cli": "^5.0.0",
62
72
  "ajv-formats": "^3.0.1",
73
+ "esbuild": "^0.25.12",
63
74
  "json-schema-to-typescript": "^15.0.0",
64
75
  "typescript": "^6.0.3"
65
76
  },
@@ -80,7 +91,10 @@
80
91
  "gemini",
81
92
  "mcp",
82
93
  "parallel-agents",
83
- "agent-sdk"
94
+ "agent-sdk",
95
+ "figma",
96
+ "extractor",
97
+ "design-system-sync"
84
98
  ],
85
99
  "skills": [
86
100
  "SKILL.md"
File without changes
@@ -0,0 +1,33 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://raw.githubusercontent.com/hegemonart/get-design-done/main/reference/schemas/recipe.schema.json",
4
+ "title": "Recipe",
5
+ "description": "Shape of a declarative recipe loaded from recipes/<name>.json by scripts/lib/recipe-loader.cjs (Plan 31-5-03, RECIPE-01 / SC#14). The recipes/ directory ships EMPTY of recipes and is populated downstream by Phase 32 (skill-trigger recipes), Phase 33.6 (per-provider), Phase 26 (per-runtime/per-model), and Phase 23.5 (bandit-arm shape). This is a minimal, forward-compatible envelope: a recipe MUST carry name/version/steps; additionalProperties:true lets the populating phases extend the envelope without breaking the loader contract. Modelled on Storybloq's src/autonomous/recipes/ loader.ts pattern.",
6
+ "type": "object",
7
+ "additionalProperties": true,
8
+ "required": ["name", "version", "steps"],
9
+ "properties": {
10
+ "name": {
11
+ "type": "string",
12
+ "minLength": 1,
13
+ "description": "The recipe identifier. Matches the filename stem (recipes/<name>.json)."
14
+ },
15
+ "version": {
16
+ "type": "string",
17
+ "minLength": 1,
18
+ "description": "Recipe/schema version string for forward-compatibility. Lets the loader and downstream phases reason about envelope evolution."
19
+ },
20
+ "steps": {
21
+ "type": "array",
22
+ "description": "The ordered recipe body. Item shape is kept permissive for now — each step is an object carrying at least a `kind` OR an `id` string. Downstream phases (32/33.6/26/23.5) tighten the step contract per their domain.",
23
+ "items": {
24
+ "type": "object",
25
+ "additionalProperties": true,
26
+ "anyOf": [
27
+ { "required": ["kind"], "properties": { "kind": { "type": "string", "minLength": 1 } } },
28
+ { "required": ["id"], "properties": { "id": { "type": "string", "minLength": 1 } } }
29
+ ]
30
+ }
31
+ }
32
+ }
33
+ }
@@ -138,7 +138,7 @@ export function compileFilter(terms) {
138
138
 
139
139
  async function cmdTail(parsed) {
140
140
  const path = resolvePath(parsed.flags.path);
141
- const { readEvents } = await import('../lib/event-stream/reader.ts');
141
+ const { readEvents } = await import('../../sdk/event-stream/reader.ts');
142
142
  if (!parsed.flags.follow) {
143
143
  for await (const ev of readEvents({ path })) {
144
144
  stdout.write(JSON.stringify(ev) + '\n');
@@ -188,7 +188,7 @@ async function cmdGrep(parsed) {
188
188
  return 2;
189
189
  }
190
190
  const predicate = compileFilter(terms);
191
- const { readEvents } = await import('../lib/event-stream/reader.ts');
191
+ const { readEvents } = await import('../../sdk/event-stream/reader.ts');
192
192
  for await (const ev of readEvents({ path, predicate })) {
193
193
  stdout.write(JSON.stringify(ev) + '\n');
194
194
  }
@@ -197,7 +197,7 @@ async function cmdGrep(parsed) {
197
197
 
198
198
  async function cmdCat(parsed) {
199
199
  const path = resolvePath(parsed.flags.path);
200
- const { readEvents } = await import('../lib/event-stream/reader.ts');
200
+ const { readEvents } = await import('../../sdk/event-stream/reader.ts');
201
201
  for await (const ev of readEvents({ path })) {
202
202
  const ts = ev.timestamp ?? '?';
203
203
  const tp = ev.type ?? '?';
@@ -207,7 +207,7 @@ async function cmdCat(parsed) {
207
207
  }
208
208
 
209
209
  async function cmdListTypes() {
210
- const { KNOWN_EVENT_TYPES } = await import('../lib/event-stream/types.ts');
210
+ const { KNOWN_EVENT_TYPES } = await import('../../sdk/event-stream/types.ts');
211
211
  for (const t of KNOWN_EVENT_TYPES) stdout.write(t + '\n');
212
212
  return 0;
213
213
  }
@@ -236,7 +236,7 @@ async function cmdServe(parsed) {
236
236
  // Bridge live bus → ws transport. The transport is CommonJS and cannot
237
237
  // require .ts directly, so we import the bus here and pass subscribeAll
238
238
  // as a callback factory.
239
- const { subscribeAll } = await import('../lib/event-stream/index.ts');
239
+ const { subscribeAll } = await import('../../sdk/event-stream/index.ts');
240
240
  const subscribe = (handler) => subscribeAll(handler);
241
241
  const handle = await mod.startServer({ port, token, tailFrom, subscribe });
242
242
  stderr.write(`gdd-events: WebSocket listening on :${port} (auth required)\n`);
@@ -83,7 +83,7 @@ function clamp01(n) {
83
83
  function getAppendEvent() {
84
84
  try {
85
85
  // Resolved relative to this file: `scripts/lib/cache/` → `../event-stream`.
86
- const m = require('../event-stream');
86
+ const m = require('../../../sdk/event-stream');
87
87
  if (m && typeof m.appendEvent === 'function') return m.appendEvent;
88
88
  } catch {
89
89
  // Swallow — fall through to the no-op below. The event is