@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
@@ -5,14 +5,14 @@
5
5
  },
6
6
  "metadata": {
7
7
  "description": "Get Design Done — 5-stage agent-orchestrated design pipeline with 9 connections, handoff-first workflow, bidirectional Figma write-back, 22+ specialized agents, queryable knowledge layer (intel store, dependency analysis, learnings extraction), and a self-improvement loop (reflector, frontmatter + budget feedback, global-skills layer). v1.20.0 ships the SDK foundation: gdd-state MCP server (11 typed tools), lockfile-safe STATE.md mutations, event stream, and resilience primitives (jittered-backoff, rate-guard, error-classifier, iteration-budget) for rate-limit + 429 + context-overflow recovery. Full CI/CD pipeline (Node 22/24 × Linux/macOS/Windows) and release automation (auto-tag + GitHub Release + release-time smoke test).",
8
- "version": "1.30.6"
8
+ "version": "1.31.5"
9
9
  },
10
10
  "plugins": [
11
11
  {
12
12
  "name": "get-design-done",
13
13
  "source": "./",
14
14
  "description": "Agent-orchestrated 5-stage design pipeline: Brief → Explore → Plan → Design → Verify. 22+ specialized agents, 9 connections (Figma, Refero, Preview, Storybook, Chromatic, Figma Writer, Graphify, Pinterest, Claude Design), Claude Design handoff, bidirectional Figma write-back, and a queryable intel store (.design/intel/) for dependency and learnings queries. Standalone commands: style, darkmode, compare, figma-write, graphify, handoff, analyze-dependencies, skill-manifest, extract-learnings. Embeds NNG heuristics, WCAG thresholds, typographic systems, motion framework, and anti-pattern catalog. Ships with a full CI/CD pipeline (Node 22/24 × Linux/macOS/Windows) and release automation. Optimization layer (v1.0.4.1, retroactive): gdd-router + gdd-cache-manager skills, PreToolUse budget-enforcer hook, tier-aware agent frontmatter, lazy checker gates, streaming synthesizer, /gdd:warm-cache + /gdd:optimize commands, and cost telemetry at .design/telemetry/costs.jsonl — targeting 50-70% per-task token-cost reduction with no quality-floor regression. v1.20.0 SDK foundation: gdd-state MCP server (11 typed tools), lockfile-safe STATE.md mutations, event stream at .design/telemetry/events.jsonl, resilience primitives (jittered-backoff, rate-guard, error-classifier, iteration-budget) with rate-limit + 429 + context-overflow recovery, and TypeScript toolchain.",
15
- "version": "1.30.6",
15
+ "version": "1.31.5",
16
16
  "author": {
17
17
  "name": "hegemonart"
18
18
  },
@@ -68,7 +68,10 @@
68
68
  "gemini",
69
69
  "mcp",
70
70
  "parallel-agents",
71
- "agent-sdk"
71
+ "agent-sdk",
72
+ "figma",
73
+ "extractor",
74
+ "design-system-sync"
72
75
  ]
73
76
  }
74
77
  ]
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "get-design-done",
3
3
  "short_name": "gdd",
4
- "version": "1.30.6",
4
+ "version": "1.31.5",
5
5
  "description": "Agent-orchestrated 5-stage design pipeline: Brief → Explore → Plan → Design → Verify. 22+ specialized agents, 9 connections (Figma, Refero, Preview, Storybook, Chromatic, Figma Writer, Graphify, Pinterest, Claude Design), handoff-first workflow via Claude Design bundles, bidirectional Figma write-back (annotations, Code Connect), queryable intel store (`.design/intel/`) for O(1) design surface lookups, and self-improvement loop (reflector agent, frontmatter + budget feedback, global-skills layer at `~/.claude/gdd/global-skills/`). Standalone commands: style, darkmode, compare, figma-write, graphify, handoff, analyze-dependencies, skill-manifest, extract-learnings, reflect, apply-reflections. Embeds NNG heuristics, WCAG thresholds, typographic systems, motion framework, and anti-pattern catalog. Ships with a full CI/CD pipeline (Node 22/24 × Linux/macOS/Windows, lint + schema + frontmatter + stale-ref + shellcheck + gitleaks + injection-scan + blocking size-budget) and release automation (auto-tag + GitHub Release + release-time smoke test). Optimization layer (v1.0.4.1, retroactive): gdd-router + gdd-cache-manager skills, PreToolUse budget-enforcer hook, tier-aware agent frontmatter, lazy checker gates, streaming synthesizer, /gdd:warm-cache + /gdd:optimize commands, and cost telemetry at .design/telemetry/costs.jsonl — targeting 50-70% per-task token-cost reduction with no quality-floor regression. v1.20.0 SDK foundation: gdd-state MCP server (11 typed tools), lockfile-safe STATE.md mutations, event stream at .design/telemetry/events.jsonl, resilience primitives (jittered-backoff, rate-guard, error-classifier, iteration-budget) with rate-limit + 429 + context-overflow recovery, and TypeScript toolchain. v1.27.7 ships gdd-mcp (Phase 27.7): 12 read-only MCP tools for sub-3s priming. v1.28.0 (Phase 28): Foundational References Tier 2 — 5 new reference files (color-theory, composition, proportion-systems, i18n, contrast-advanced), 2 verifier i18n probes + 1 explore i18n-readiness probe, 12 additive cross-link insertions across 10 existing references, 2 orthogonal audit-scoring lens-tags (composition_alignment + i18n_readiness).",
6
6
  "author": {
7
7
  "name": "hegemonart",
@@ -62,7 +62,10 @@
62
62
  "agent-sdk",
63
63
  "mcp-server",
64
64
  "context-loading",
65
- "cross-session"
65
+ "cross-session",
66
+ "figma",
67
+ "extractor",
68
+ "design-system-sync"
66
69
  ],
67
70
  "skills": [
68
71
  "./skills/"
package/CHANGELOG.md CHANGED
@@ -4,6 +4,111 @@ All notable changes to get-design-done are documented here. Versions follow [sem
4
4
 
5
5
  ---
6
6
 
7
+ ## [1.31.5] - 2026-05-29
8
+
9
+ ### Phase 31.5 — Repo Structure Consolidation
10
+
11
+ One audit-clean repo layout with **zero changes to the public surface** (commands, agents, skills, hooks, connections, install flow) and **no file content lost**. The SDK that `plugin.json` has advertised since v1.20.0 now actually lives in `sdk/`; the npm tarball ships only what plugin users need; the repo root is decluttered. Every move was history-preserving (`git mv`), guarded by three independent regression nets (test-parity, tarball-diff golden, headless-E2E install) and a one-minor deprecation-shim grace window. 10 plans + 1 follow-up across Waves A–E (31-5-01..31-5-10 + 31-5-9.5).
12
+
13
+ ### Added
14
+
15
+ - **`sdk/` — the public SDK, collected.** `git mv` consolidated the strewn modules into one place: `sdk/cli`, `sdk/state`, `sdk/event-stream`, `sdk/errors`, `sdk/primitives/*` (the 4 typed `.cjs`+`.d.cts` pairs), and **both** MCP servers under `sdk/mcp/` (`sdk/mcp/gdd-state`, `sdk/mcp/gdd-mcp` — D-08). A `sdk/index.ts` barrel re-exports the surface, and `sdk/README.md` (≤120 lines, D-06) documents what the SDK is with a per-module import-path table (module → public import → helpers → stability tag). Public import paths are explicit per-module (`/sdk/cli`, `/sdk/state`, `/sdk/event-stream`, `/sdk/primitives/*`, `/sdk/errors`, `/sdk/mcp/gdd-state`, `/sdk/mcp/gdd-mcp`) plus the barrel (D-04).
16
+ - **3 SDK bins that now work from an npm install.** `bin/gdd-sdk`, `bin/gdd-state-mcp`, and `bin/gdd-mcp` are dual-mode trampolines (prefer a compiled `.js` sibling, fall back to `.ts` strip in-repo). A `prepack` step (`npm run build:sdk` → esbuild) bundles the three TS-entry bins to self-contained CommonJS siblings that ship in the tarball — fixing a **pre-existing latent break**: raw `.ts` bins cannot run under `--experimental-strip-types` from inside `node_modules` (`ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING`), which had silently shipped since the TS bins were introduced. The `.ts` remain the source of truth; the `.js` are gitignored build artifacts (`postpack` cleans them).
17
+ - **`recipes/` scaffold** — `recipes/` + a recipe-loader + `reference/schemas/recipe.schema.json`. Ships empty of recipes (the loading machinery, not content).
18
+ - **`docs/i18n/`** — the 6 `README.{de,fr,it,ja,ko,zh-CN}.md` translations relocated from the repo root (D-11). English `README.md` stays at root; its language-selector links were repointed.
19
+ - **`.npmignore`** — a defense-in-depth duplicate of the `package.json` `files` allowlist (D-10).
20
+ - **Private-files CI guard** — `test/suite/no-private-files-tracked.test.cjs` asserts 0 tracked `.planning/` / `REVIEW.md` / `tmp_support_preview*` files so the (already-remediated) leak stays closed (D-03).
21
+ - **`no-stale-internal-refs` static guard** — `test/suite/no-stale-internal-refs.test.cjs` greps the shipped user-facing surface (hooks/, agents/, skills/, bin/, scripts/cli/, scripts/install.cjs) for any reference to an OLD moved-SDK path and fails on any hit outside a deprecation shim. Proves every internal caller was repointed to `sdk/`.
22
+
23
+ ### Changed
24
+
25
+ - **`package.json` `files` narrowed to an explicit allowlist (+ `.npmignore`).** Maintainer-only top-level scripts no longer reach a user's `node_modules`. **Tarball diff vs the prior (v1.31.0) tarball:**
26
+ - **ADDED:** `sdk/` (the SDK, incl. the 3 compiled-bin `.js` siblings), `recipes/`, `docs/i18n/`, `NOTICE`.
27
+ - **DROPPED (23 maintainer-only files):** `scripts/` wholesale + the top-level `bootstrap*`, `rollback-release.sh`, `apply-branch-protection.sh`, `release-smoke-test.cjs`, `verify-version-sync.cjs`, `extract-changelog-section.cjs`, `detect-stale-refs.cjs`, `run-injection-scanner-ci.cjs`, `injection-patterns.cjs`, `build-*.cjs`, `validate-*` (`.cjs`/`.ts`), `codegen-schema-types.ts`, `aggregate-agent-metrics.ts`, `lint-agentskills-spec.cjs`, `scripts/e2e/`, `scripts/tests/`.
28
+ - **KEPT (runtime subtrees, D-09) — a "drop `scripts/` wholesale" allowlist would have shipped a *broken* package:** `scripts/lib/` (incl. `scripts/lib/graph/` for `gdd-graph` per D-14 and `scripts/lib/figma-extract/` for the figma-extract SKILL per D-15), `scripts/mcp-servers/` (the residual MCP deprecation shims), `scripts/cli/` (the `gdd-events` target), and `scripts/install.cjs`.
29
+ - Tarball golden manifest pinned at **620 paths** (paths-only per D-07).
30
+ - **`tests/` → `test/suite/` and `test-fixture/` → `test/fixtures/`** (D-12) — a pure mechanical, history-preserving relocation done with an identical full-suite pass before/after. Contributor-facing only; not shipped in the tarball. All subsequent tests are authored into `test/suite/`.
31
+
32
+ ### Deprecated
33
+
34
+ - **`scripts/lib/{cli,gdd-state,event-stream,gdd-errors}/`, the 4 primitive `.cjs` (`error-classifier`, `iteration-budget`, `jittered-backoff`, `lockfile`), and `scripts/mcp-servers/{gdd-state,gdd-mcp}/server.ts` are now thin deprecation shims** that re-export from `sdk/*` and emit a one-time `DeprecationWarning`. They exist for undocumented EXTERNAL importers who reached into `node_modules/.../scripts/lib/...` directly. **Removed in v1.33.0** (D-02). Grace window: v1.31.5 ships with shims → v1.32.0 still has them → v1.33.0 removes them with a breaking-change note. **If you imported from `node_modules/@hegemonart/get-design-done/scripts/lib/...` directly, switch to `sdk/...`** (e.g. `scripts/lib/cli` → `sdk/cli`, `scripts/lib/error-classifier.cjs` → `sdk/primitives/error-classifier.cjs`, `scripts/mcp-servers/gdd-state/server.ts` → `sdk/mcp/gdd-state/server.ts`). Internal callers already use `sdk/`.
35
+
36
+ ### Backward compatibility
37
+
38
+ - Public surface unchanged — no command, agent, skill, hook, or connection was renamed (zero-rename discipline). All install flows and all 6 bins resolve identically; MCP handshakes and primitive imports verified by the headless pack→install→run E2E.
39
+ - 6-manifest lockstep at v1.31.5 (`package.json` + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` (metadata.version + plugins[0].version) + `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json`).
40
+
41
+ ### Decisions
42
+
43
+ - **D-01**: Target version is **v1.31.5** (the stale ROADMAP v1.28.0 was a pre-renumber artifact — the phase was renumbered 2026-05-16 to monotonic-with-phase-number).
44
+ - **D-02**: Deprecation-shim removal target is **v1.33.0** (the stale ROADMAP v1.29.0 is already shipped/past). One-minor grace window.
45
+ - **D-03**: The private-file leak was already remediated on main; Plan 01 ships only the CI guard.
46
+ - **D-08**: `gdd-mcp` (Phase 27.7) folded in for full symmetry with `gdd-state-mcp` — both MCP servers live under `sdk/mcp/`.
47
+ - **D-09**: The `files` allowlist keeps the runtime subtrees `scripts/lib` + `scripts/mcp-servers` + `scripts/cli` + `scripts/install.cjs` so `gdd-graph`, `figma-extract`, and `gdd-mcp` keep working.
48
+
49
+ ---
50
+
51
+ ## [1.31.0] - 2026-05-29
52
+
53
+ ### Phase 31 — Figma Off-Context Extractor + Variables Sync Plugin
54
+
55
+ Ships `gdd-figma-extract` — pull a whole Figma design system into a compact, queryable local digest (`DESIGN.md` + `tokens.json` + `components.json`) **without the raw JSON ever entering Claude's context**. One command extracts the file via the Figma REST API to a local raw cache; a separate digest stage reduces it to an LLM-readable spec. Plus a thin **"GDD Sync"** Figma plugin that fills the Variables-API-Enterprise gap by reading `figma.variables` from inside Figma (works on any plan — including Free) and POSTing them to an ephemeral localhost receiver. 10 plans across 4 waves: Wave A (raw puller + digest + styles resolver + SKILL), Wave B (plugin scaffold + export + receiver), Wave C (`--component` slice + `figma_extract` health check), Wave D (closeout).
56
+
57
+ ### Motivation — the spike trail
58
+
59
+ Spike 001 (commit `c3a9cf6`, `.planning/spikes/001-figma-offcontext-extractor/`) validated the economics: **898× compression** (223 MB raw → 254 KB digest), a 15.7K-token DESIGN.md (under the 20K target), 127 component sets + 40 singletons captured with variants/props/defaults, ~33s wall time, and crucially **0 Claude tokens + 0 Figma MCP calls during extraction**. This is the economic alternative to Figma MCP for whole-design-system workflows (Figma MCP remains correct for spot questions on individual components). The spike surfaced two gaps, both closed by this phase:
60
+
61
+ 1. **Variables API → 403 (Enterprise-only)** — closed by **Path C** (the GDD Sync plugin reads variables locally and POSTs to the receiver).
62
+ 2. **Legacy styles → 0 tokens** — closed by **Path B** (two-step `/styles` + `/nodes?ids=` lookup; published-style source nodes live in canvas frames, not the main document tree).
63
+
64
+ ### Added
65
+
66
+ - **`gdd-figma-extract` off-context extractor** — the two-stage pipeline (D-01: extract → digest stay separated, re-digest without re-pulling):
67
+ - `scripts/lib/figma-extract/pull.cjs` — productionized Figma REST puller (retry/backoff, version-based cache invalidation with 1h TTL fallback per D-11, drops `geometry=paths` per D-03). Writes raw JSON to disk only; raw bodies never returned to a logging caller.
68
+ - `scripts/lib/figma-extract/digest.cjs` — reads the raw cache, walks the node tree with **variant rollup** (D-02 — naive walk inflates ~16×), assembles tokens via the 3-path chain, renders `DESIGN.md` + `tokens.json` + `components.json`.
69
+ - `scripts/lib/figma-extract/styles-resolver.cjs` — **Path B** two-step `/styles` + `/nodes?ids=` resolver (fixes the spike's 0-tokens bug).
70
+ - `scripts/lib/figma-extract/render-md.cjs` + `walk.cjs` — deterministic, byte-stable DESIGN.md renderer + the variant-rollup walker.
71
+ - **Three-path token extraction (D-04)** with a fallback chain — Path A (Variables API, Enterprise; 403 skipped silently), Path B (`/styles` + `/nodes`), Path C (plugin sync). Resolution priority on collision: Variables > plugin sync > styles, with a `--prefer-styles` escape hatch.
72
+ - **"GDD Sync" Figma plugin** (`figma-plugin/`, D-05) — TypeScript, single "Export to GDD" button. Reads ALL local variables (D-13 — digest filters later), resolves aliases + modes, and POSTs to the localhost receiver.
73
+ - **Localhost receiver** (`scripts/lib/figma-extract/receiver.cjs`, D-06) — ephemeral, **127.0.0.1-only**, port hardcoded to 5179, schema-validated, refuses non-loopback remotes, exits on first valid receipt or timeout.
74
+ - **`--component <name|glob>` digest slice** (D-08) — a ~500-token per-component slice instead of the full ~16K digest; strictly additive (omitting it reproduces the full digest unchanged).
75
+ - **`figma_extract` health check** (Plan 31-09) — `/gdd:health` now reports one of three exact states: `figma extract: ready (token set)`, `figma extract: token missing`, or `figma extract: plugin sync needed for variables (Free tier detected)`. Presence-only token check (D-10); the Free-tier signal is read from the local raw-pull cache only (no network call).
76
+ - **`skills/figma-extract/SKILL.md`** (`name: gdd-figma-extract`) — off-context orchestration that never instructs reading `raw/*.json` (D-12).
77
+ - **`tests/phase-31-baseline.test.cjs`** + 6 baseline files at `test-fixture/baselines/phase-31/` (design-md, components-json, tokens-json, health-line, manifest-network-scope, token-isolation-static), **`tests/phase-31-end-to-end.test.cjs`** (offline pull+digest against fixtures), and **`tests/figma-extract-token-isolation.test.cjs`** (the D-10 static scanner + meta-tests).
78
+
79
+ ### Security & guarantees
80
+
81
+ - **Off-context guarantee (D-12) — statically enforced.** The SKILL never instructs reading `raw/*.json`; the digest is a pure function of the raw cache. The raw pull consumes 0 Claude tokens.
82
+ - **Token isolation (D-10) — statically enforced.** `FIGMA_TOKEN` (fallback `FIGMA_PERSONAL_ACCESS_TOKEN`) is read from the environment only and is sent ONLY as the `X-Figma-Token` request header — never logged, never written to disk. `tests/figma-extract-token-isolation.test.cjs` scans every file under `scripts/lib/figma-extract/` for any `writeFile`/`appendFile`/`console.*`/`logger.*`/`process.std*.write` call referencing the token and fails on a non-zero count (meta-tested to prove the scanner is not vacuous).
83
+ - **Receiver network scope (D-06).** The plugin manifest's `allowedDomains` is exactly the localhost pair (`http://localhost:5179`, `http://127.0.0.1:5179`) — any widening trips the baseline test. No external host, no wildcard.
84
+
85
+ ### Deferred
86
+
87
+ - **Live Figma validation (D-07).** The phase ships with hermetic offline tests (stubbed fetch against committed fixtures); a one-time end-to-end run against a real Figma file with a live token is a maintainer follow-up, not a v1.31.0 blocker. Plugin Community-directory submission is likewise deferred (dev-install path ships now).
88
+
89
+ ### Decisions (D-01 through D-13)
90
+
91
+ - **D-01**: Two-stage pipeline (extract → digest) stays separated. Re-run digest without re-pulling.
92
+ - **D-02**: Variant rollup default-on — skip COMPONENT children of a COMPONENT_SET; record variants as a field on the parent (naive walk inflates ~16×).
93
+ - **D-03**: Drop the `geometry=paths` query param (~30% smaller raw; geometry is discarded in the digest).
94
+ - **D-04**: Three-path token extraction with a fallback chain (Variables > plugin sync > styles; `--prefer-styles` escape).
95
+ - **D-05**: "GDD Sync" plugin as a separate `figma-plugin/` package (TypeScript, single button).
96
+ - **D-06**: Receiver is ephemeral + 127.0.0.1-only + hardcoded port 5179; refuses non-loopback; closes on receipt or timeout.
97
+ - **D-07**: Plugin distribution is dev-build now, Community submission as a follow-up; live-Figma validation is a maintainer follow-up — neither blocks v1.31.0.
98
+ - **D-08**: `--component <name|glob>` filter on digest for per-component slicing (~500 tokens vs ~16K).
99
+ - **D-09**: Raw cache gitignored (`.figma-extract-cache/`), reproducible from `pull.cjs`; `digest/` artifacts may be committed.
100
+ - **D-10**: Token never logged or persisted — `FIGMA_TOKEN` from env only; CI static-analysis test enforces it library-wide.
101
+ - **D-11**: Cache invalidation is content-based via Figma's `version` field, with a 1h wall-clock TTL fallback.
102
+ - **D-12**: Off-context guarantee enforced statically — the skill never instructs reading `raw/*.json`.
103
+ - **D-13**: Plugin emits ALL local variables (not just published-collection ones); filtering happens at the digest stage.
104
+
105
+ ### Backward compatibility
106
+
107
+ - 4-manifest + 2 Tier-2 manifest lockstep at v1.31.0 (`package.json` + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` (metadata.version + plugins[0].version) + `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json`). Keywords `figma`, `extractor`, `design-system-sync` added across the manifest keyword arrays.
108
+ - `NOTICE` preserved verbatim — Phase 31 productionizes our own spike (`c3a9cf6`) and uses Figma's official REST + plugin APIs plus `@figma/plugin-typings` (a normal npm devDependency, not a vendored code transplant). No third-party CODE was vendored, so no new attribution is owed.
109
+
110
+ ---
111
+
7
112
  ## [1.30.6] - 2026-05-28
8
113
 
9
114
  ### Phase 30.6 — Graphify Self-Ownership
package/NOTICE ADDED
@@ -0,0 +1,224 @@
1
+ get-design-done
2
+ Copyright (c) 2026 hegemonart
3
+
4
+ This product includes software developed by third parties under the
5
+ Apache License, Version 2.0. See https://www.apache.org/licenses/LICENSE-2.0
6
+ for the full license text.
7
+
8
+ ──────────────────────────────────────────────────────────────────────────────
9
+ Phase 27 — Peer-CLI Delegation Layer (v1.27.0, 2026-04-30)
10
+ ──────────────────────────────────────────────────────────────────────────────
11
+
12
+ The peer-CLI delegation layer ports protocol shapes and skill patterns from:
13
+
14
+ greenpolo/cc-multi-cli-plugin (https://github.com/greenpolo/cc-multi-cli-plugin)
15
+ License: Apache License, Version 2.0
16
+ Version reference: cc-multi-cli v2.0.0 (shipped 2026-04-24)
17
+
18
+ The following gdd files re-derive logic, contracts, or procedural patterns
19
+ from cc-multi-cli's source. We re-derive in our own runtime (CommonJS in
20
+ gdd's case; cc-multi-cli ships ESM); we do NOT vendor their runtime —
21
+ their hub assumes Claude-as-host while gdd needs any-runtime-as-host.
22
+ Attribution is provided here per Apache 2.0 §4.
23
+
24
+ scripts/lib/peer-cli/acp-client.cjs
25
+ └─ Adapts the line-delimited JSON-RPC + initialize/prompt/notification
26
+ framing from cc-multi-cli's `acp-client.mjs`.
27
+
28
+ scripts/lib/peer-cli/asp-client.cjs
29
+ └─ Adapts the App Server Protocol thread-start + thread-resume + turn
30
+ lifecycle from cc-multi-cli's `asp-client.mjs`. service_name and
31
+ experimentalRawEvents conventions match cc-multi-cli.
32
+
33
+ scripts/lib/peer-cli/spawn-cmd.cjs
34
+ └─ Implements the Windows `.cmd` EINVAL workaround documented in
35
+ cc-multi-cli's `transport-decisions.md`
36
+ (`spawn(`"<absolute-fwd-slash-path>" <args>`, [], {shell: true})`).
37
+
38
+ skills/peer-cli-customize/SKILL.md
39
+ └─ Procedural pattern adapted from cc-multi-cli's `customize` skill.
40
+
41
+ skills/peer-cli-add/SKILL.md
42
+ └─ Procedural pattern adapted from cc-multi-cli's `multi-cli-anything`
43
+ skill, including the verification ladder, model-ID `-preview`-suffix
44
+ trap, and Windows quirk handling.
45
+
46
+ ──────────────────────────────────────────────────────────────────────────────
47
+ Phase 28.5 — Skill Authoring Contract + Rework + Project Artifacts (v1.28.5, 2026-05-18)
48
+ ──────────────────────────────────────────────────────────────────────────────
49
+
50
+ The skill-authoring contract, project-artifact format files, the
51
+ debug-feedback-loops reference, and the new zoom-out micro-skill port
52
+ content from:
53
+
54
+ mattpocock/skills (https://github.com/mattpocock/skills)
55
+ License: MIT
56
+ Adapted with permission.
57
+
58
+ The following gdd files contain content adapted from mattpocock/skills:
59
+
60
+ reference/skill-authoring-contract.md
61
+ └─ Adapts the SKILL.md <=100-line cap, description-format contract
62
+ (lax-mode default per Phase 33 A/B pending), frontmatter required
63
+ fields, and progressive-disclosure-one-level-deep rules from
64
+ mattpocock's productivity/write-a-skill/SKILL.md.
65
+
66
+ reference/context-md-format.md
67
+ └─ Adapts mattpocock's productivity/grill-with-docs/CONTEXT-FORMAT.md
68
+ (DDD-style ubiquitous-language glossary schema, inline-write
69
+ trigger, multi-context CONTEXT-MAP.md pattern). GDD additions:
70
+ optional first-seen + aliases on term entries.
71
+
72
+ reference/adr-format.md
73
+ └─ Adapts mattpocock's productivity/grill-with-docs/ADR-FORMAT.md
74
+ (3-criteria offer gate: hard-to-reverse AND surprising-without-
75
+ context AND real-tradeoff; 4-state status lifecycle). GDD
76
+ additions: optional cycle-id + phase-id cross-refs back to
77
+ STATE.md.
78
+
79
+ reference/architecture-vocabulary.md
80
+ └─ Ports Ousterhout's *A Philosophy of Software Design* glossary via
81
+ mattpocock's improve-codebase-architecture/LANGUAGE.md (8 core
82
+ terms — Module / Interface / Implementation / Depth / Seam /
83
+ Adapter / Leverage / Locality — plus 3 principles: deletion test,
84
+ interface-is-test-surface, two-adapters-rule).
85
+
86
+ reference/debug-feedback-loops.md
87
+ └─ Adapts mattpocock's engineering/diagnose Phase 1 — feedback-loop
88
+ discipline, 10 construction paths in priority order (failing test
89
+ -> curl -> CLI fixture -> headless browser -> trace replay ->
90
+ throwaway harness -> fuzz -> bisect harness -> differential loop
91
+ -> HITL bash), iterate-on-loop sub-discipline, non-determinism
92
+ reproduction-rate branch.
93
+
94
+ skills/zoom-out/SKILL.md
95
+ └─ Direct port of mattpocock's engineering/zoom-out (~10 lines body,
96
+ disable-model-invocation: true, zoom-out-and-map-the-area
97
+ instruction). User-invoked-only shortcut.
98
+
99
+ skills/debug/SKILL.md (Phase 1 ordering)
100
+ └─ Adopts the feedback-loop-discipline-first ordering — build the
101
+ deterministic, fast, agent-runnable signal before hypothesizing.
102
+ (Skill body itself is GDD original; the Phase 1 ordering +
103
+ cross-link to reference/debug-feedback-loops.md is adapted.)
104
+
105
+ ──────────────────────────────────────────────────────────────────────────────
106
+ Phase 28.7 — Multi-Runtime Install Architecture (v1.28.7, 2026-05-19)
107
+ ──────────────────────────────────────────────────────────────────────────────
108
+
109
+ The multi-runtime install pipeline shipped in v1.28.7 — the runtime-homes /
110
+ runtime-artifact-layout / runtime-slash trio plus the per-runtime content
111
+ converters — is a re-implementation of the architecture from:
112
+
113
+ gsd-build/get-shit-done (https://github.com/gsd-build/get-shit-done)
114
+ License: MIT
115
+
116
+ The following gdd modules are an architectural port from gsd-build's MIT-
117
+ licensed install machinery. We re-implemented in GDD's existing module
118
+ conventions rather than byte-copying source, per Phase 28.7 D-02, to keep
119
+ the GDD codebase free of upstream version drift and the bundled
120
+ `bin/install.js` monolith:
121
+
122
+ scripts/lib/install/runtime-homes.cjs
123
+ └─ Per-runtime config-dir resolver (env-var + XDG + special-case nests).
124
+ Same shape as gsd-build's `bin/lib/runtime-homes.cjs`.
125
+
126
+ scripts/lib/install/runtime-artifact-layout.cjs
127
+ └─ Per-(runtime, scope) layout table mapping to kinds[]. Same shape as
128
+ gsd-build's `bin/lib/runtime-artifact-layout.cjs`. Adapted to GDD's
129
+ 14-runtime set (gsd-build's Hermes is omitted per D-03 + D-10).
130
+
131
+ scripts/lib/install/runtime-slash.cjs
132
+ └─ Per-runtime slash-command surface emitter. Adapted from gsd-build's
133
+ `bin/lib/runtime-slash.cjs`. Codex uses `$gdd-<name>` shell-var form;
134
+ other runtimes use `/gdd-<name>`.
135
+
136
+ scripts/lib/install/converters/{antigravity,augment,cline,codebuddy,codex,
137
+ copilot,cursor,gemini,kilo,opencode,qwen,
138
+ shared,trae,windsurf}.cjs
139
+ └─ Per-runtime content converters. Each translates a Claude SKILL.md
140
+ source into the runtime's expected shape (path rewrite, tool-name
141
+ rewrite via Phase 21 cross-harness maps, frontmatter pass-through).
142
+ gsd-build implements these as `convertClaudeCommandTo<Runtime>Skill`
143
+ functions inside a bundled `bin/install.js`; we factor them into
144
+ per-runtime `.cjs` files for independent testability.
145
+
146
+ Per-file headers in the ported modules carry the same attribution. This
147
+ NOTICE block is the rollup citation.
148
+
149
+ The upstream gsd-build project remains the authoritative reference for the
150
+ install-pipeline architecture; bug reports specific to the architecture's
151
+ shape should also be filed there.
152
+
153
+ ──────────────────────────────────────────────────────────────────────────────
154
+ Phase 30 — Privacy Layer (v1.30.0, 2026-05-20)
155
+ ──────────────────────────────────────────────────────────────────────────────
156
+
157
+ scripts/lib/pseudonymize.cjs and scripts/lib/issue-reporter/payload-assembly.cjs
158
+ were authored from scratch for Phase 30 (consent-first issue reporter). No
159
+ third-party privacy or anonymization patterns were adapted into either file
160
+ — verified by inspection of the file contents (no "adapted from" / "from
161
+ <library>" / source-citation comments) and by git log on both files (commits
162
+ ed478fe, e5fc79a, e86c648 — all original to this repo).
163
+
164
+ The regex rules in pseudonymize.cjs target generic identity-correlatable
165
+ fields (usernames, hostnames, filesystem paths, repo origin URLs, env-var
166
+ values, email patterns, IP addresses). The patterns were derived from the
167
+ canonical shapes of these surfaces as they appear in plugin runtime output;
168
+ they were NOT sourced from any upstream anonymization or pseudonymization
169
+ library.
170
+
171
+ The Phase 30 — Inbound Feedback Channel design itself (consent-first issue
172
+ reporter, hardcoded destination, no plugin-side credentials, gh-CLI-only
173
+ outbound) is original to get-design-done. The architectural rationale lives
174
+ in .planning/phases/30-issue-reporter/CONTEXT.md.
175
+
176
+ ──────────────────────────────────────────────────────────────────────────────
177
+ Phase 30.6 — Graphify Self-Ownership (v1.30.6, 2026-05-28)
178
+ ──────────────────────────────────────────────────────────────────────────────
179
+
180
+ Version 1.30.6 removes the last runtime touchpoint between get-design-done
181
+ and the user's `~/.claude/get-shit-done/` install. Eight callsites
182
+ previously dispatched `node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs"
183
+ graphify *` at runtime; they now dispatch a native `bin/gdd-graph` CLI
184
+ owned end-to-end in this repository.
185
+
186
+ No historical MIT/Apache attributions in this NOTICE are removed or
187
+ modified by this change. The Phase 27 / Phase 28.5 / Phase 28.7
188
+ attribution subsections above are preserved verbatim per Phase 30.6 D-06.
189
+ Those describe historical architectural ports:
190
+
191
+ - Phase 27 — peer-CLI delegation protocol shapes adapted from
192
+ cc-multi-cli-plugin (Apache 2.0).
193
+ - Phase 28.5 — skill-authoring contract + project-artifact formats +
194
+ debug feedback-loop reference + zoom-out micro-skill, ported from
195
+ mattpocock/skills (MIT).
196
+ - Phase 28.7 — multi-runtime install pipeline architecture, ported
197
+ from gsd-build/get-shit-done (MIT).
198
+
199
+ Phase 30.6 removes a runtime touchpoint, NOT a historical port. The
200
+ architectural ports listed above remain in our tree under their original
201
+ MIT/Apache terms.
202
+
203
+ For context: the upstream `gsd-build/get-shit-done` project has since been
204
+ archived (TÂCHES rug-pull, May 2026). The community continuation lives at
205
+ `open-gsd/get-shit-done-redux` and is bit-perfect with the pre-rug tree.
206
+ The Phase 28.7 attribution above remains pointed at the original upstream
207
+ URL because that is the source of the architectural port; the redux fork
208
+ is referenced in `README.md` for users seeking a current download.
209
+
210
+ See `.planning/phases/30.6-graphify-self-ownership/` for full phase
211
+ documentation including the 10 architectural decisions (D-01 through D-10)
212
+ and the migration of the 8 dispatching callsites to native `bin/gdd-graph`.
213
+
214
+ ────────────────────────────────────────────────────────────────────────
215
+
216
+ Note on the broader codebase: get-design-done as a whole is licensed under
217
+ the MIT License (see LICENSE). The Apache 2.0 attribution above applies
218
+ specifically to the cc-multi-cli-derived files listed under the Phase 27
219
+ block. The MIT attributions under Phase 28.5 and Phase 28.7 cover content
220
+ adapted from mattpocock/skills (MIT) and gsd-build/get-shit-done (MIT)
221
+ respectively — the MIT-to-MIT re-licensing is straightforward and the
222
+ attributions above provide the required source citation. The MIT and
223
+ Apache 2.0 licenses are compatible — see
224
+ https://www.apache.org/legal/resolved.html#category-a.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # GET DESIGN DONE
4
4
 
5
- **English** · [简体中文](README.zh-CN.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · [Français](README.fr.md) · [Italiano](README.it.md) · [Deutsch](README.de.md)
5
+ **English** · [简体中文](docs/i18n/README.zh-CN.md) · [日本語](docs/i18n/README.ja.md) · [한국어](docs/i18n/README.ko.md) · [Français](docs/i18n/README.fr.md) · [Italiano](docs/i18n/README.it.md) · [Deutsch](docs/i18n/README.de.md)
6
6
 
7
7
  **A design-quality pipeline for AI coding agents: brief → explore → plan → implement → verify.**
8
8
 
@@ -256,6 +256,27 @@ When K=3 stable clusters surface across M=10 reflection cycles (defaults in `ref
256
256
  **Discipline preserved.** Reflector authors nothing that auto-ships. `/gdd:apply-reflections` remains the single human gate (Phase 11 SC-8). Stage 1 never auto-flips — user opts in.
257
257
 
258
258
 
259
+ ### Figma off-context extraction (v1.31.0+)
260
+
261
+ Pull an entire Figma design system into a compact, LLM-readable local digest — **without the raw JSON ever entering Claude's context**. One command extracts the file via the Figma REST API into a local raw cache; a separate digest stage reduces it to `DESIGN.md` + `tokens.json` + `components.json`.
262
+
263
+ ```bash
264
+ # Stage 1 — raw pull (0 Claude tokens; writes a gitignored cache)
265
+ node scripts/lib/figma-extract/pull.cjs <figma-file-url-or-key>
266
+ # Stage 2 — digest (reads the cache, writes the compact spec)
267
+ node scripts/lib/figma-extract/digest.cjs --raw <cache>/raw/<key> --out .design/figma
268
+ ```
269
+
270
+ **The economics.** A spike measured **898× compression** (223 MB raw → 254 KB digest) with a ~15.7K-token `DESIGN.md`, capturing 127 component sets + 40 singletons (variants, props, defaults) in ~33s — at **0 Claude tokens and 0 Figma MCP calls during extraction**. This is the cost-sane alternative to the Figma MCP for whole-design-system work, which can run tens of minutes and 50–500K+ tokens for the same data. (The Figma MCP remains the right tool for spot questions on a single component.)
271
+
272
+ - **Token-safe by construction.** `FIGMA_TOKEN` is read from the environment only and sent solely as a request header — never logged, never written to disk (a CI static-analysis test enforces this across the whole extract library). The digest never reads raw JSON into context.
273
+ - **Works on any Figma plan.** The optional **"GDD Sync"** Figma plugin (`figma-plugin/`) fills the Variables-API-Enterprise gap: it reads `figma.variables` from inside Figma and POSTs them to an ephemeral, 127.0.0.1-only receiver — so Free-tier users get full token coverage too.
274
+ - **Per-component slices.** `digest --component <name|glob>` renders a ~500-token slice of just the components you ask for, instead of the full digest.
275
+ - **Health-aware.** `/gdd:health` reports a `figma_extract` readiness line (token set / token missing / Free-tier plugin-sync needed).
276
+
277
+ See [`skills/figma-extract/SKILL.md`](skills/figma-extract/SKILL.md) and [`figma-plugin/README.md`](figma-plugin/README.md) for the full flow.
278
+
279
+
259
280
  ## How It Works
260
281
 
261
282
  > **New to an existing codebase?** Run `/gdd:map` first. It dispatches 5 specialist mappers in parallel (tokens, components, visual hierarchy, a11y, motion) and writes structured JSON to `.design/map/` — much higher signal than the grep-based fallback in Explore.
package/SKILL.md CHANGED
@@ -35,6 +35,7 @@ Each stage produces artifacts in `.design/` inside the current project.
35
35
  | `darkmode` | `get-design-done:gdd-darkmode` | Audit dark mode architecture + contrast + anti-patterns → .design/DARKMODE-AUDIT.md |
36
36
  | `compare` | `get-design-done:gdd-compare` | Delta between DESIGN.md baseline and DESIGN-VERIFICATION.md → .design/COMPARE-REPORT.md |
37
37
  | `figma-write <mode>` | `get-design-done:gdd-figma-write` | Write design decisions to Figma (annotate/tokenize/mappings) |
38
+ | `figma-extract <file-url-or-key>` | `get-design-done:gdd-figma-extract` | Off-context Figma design-system extraction → compact local digest (DESIGN.md + tokens.json + components.json), zero raw JSON in context |
38
39
  | `graphify <subcommand>` | `get-design-done:gdd-graphify` | Manage Graphify knowledge graph (build/query/status/diff) |
39
40
  | `discuss [topic] [--all] [--spec] [--cycle <name>]` | `get-design-done:gdd-discuss` | Adaptive design interview — spawns design-discussant; appends D-XX decisions to STATE.md |
40
41
  | `list-assumptions [--area]` | `get-design-done:gdd-list-assumptions` | Surface implicit design assumptions baked into the codebase |
@@ -194,7 +194,7 @@ After classifying the new entries (Step 5) but BEFORE writing the snapshot (Step
194
194
  - `/known issues/i`
195
195
  - `/pitfalls/i`
196
196
 
197
- For each entry whose `title` matches ANY pattern, emit a single `kfm-candidate` event to the events stream (`.design/telemetry/events.jsonl`) via `scripts/lib/event-stream/writer.ts` (or the Bash equivalent — `printf '%s\n' "<json>" >> .design/telemetry/events.jsonl`).
197
+ For each entry whose `title` matches ANY pattern, emit a single `kfm-candidate` event to the events stream (`.design/telemetry/events.jsonl`) via `sdk/event-stream/writer.ts` (or the Bash equivalent — `printf '%s\n' "<json>" >> .design/telemetry/events.jsonl`).
198
198
 
199
199
  Event payload shape — validates against `reference/schemas/events.schema.json` definitions `KfmCandidatePayload` (allOf[1] branch). Required 7 fields:
200
200
 
@@ -80,7 +80,7 @@ For each regression, emit a `perf.regression_detected` event via `appendEvent` f
80
80
 
81
81
  ```javascript
82
82
  // Pseudo-instruction for the executor — the agent runs Bash with this shape
83
- const { appendEvent } = require('./scripts/lib/event-stream');
83
+ const { appendEvent } = require('./sdk/event-stream');
84
84
  appendEvent({
85
85
  type: 'perf.regression_detected',
86
86
  timestamp: new Date().toISOString(),
@@ -89,7 +89,7 @@ appendEvent({
89
89
  });
90
90
  ```
91
91
 
92
- The `perf.regression_detected` event type is additive to the Phase 22 registry — the writer accepts unknown types (per `scripts/lib/event-stream/types.ts` envelope invariant: "unknown types are allowed; validation is structural, not a closed enum").
92
+ The `perf.regression_detected` event type is additive to the Phase 22 registry — the writer accepts unknown types (per `sdk/event-stream/types.ts` envelope invariant: "unknown types are allowed; validation is structural, not a closed enum").
93
93
 
94
94
  If `detectCostRegressions` returns `summary.regressions_count === 0`, write a single line: `No token-cost regressions detected (threshold 25%, >=3 cycles).` and skip event emission for this section.
95
95
 
package/bin/gdd-mcp ADDED
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+ // bin/gdd-mcp — Plan 31-5-05 (SDK-04, D-08); dual-mode since Plan 31-5-9.5 (D-16).
3
+ //
4
+ // DUAL-MODE CJS trampoline for the `gdd-mcp` 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-mcp/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-mcp/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-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-mcp',
37
+ 'server.js',
38
+ );
39
+ const source = path.resolve(
40
+ __dirname,
41
+ '..',
42
+ 'sdk',
43
+ 'mcp',
44
+ 'gdd-mcp',
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-mcp: failed to launch MCP server entry:', err.message);
77
+ process.exit(3);
78
+ });