@hegemonart/get-design-done 1.31.0 → 1.32.0

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 (180) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +75 -0
  4. package/NOTICE +262 -0
  5. package/README.md +13 -1
  6. package/SKILL.md +4 -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/hooks/hooks.json +9 -0
  26. package/hooks/inject-using-gdd.sh +72 -0
  27. package/hooks/run-hook.cmd +35 -0
  28. package/package.json +20 -9
  29. package/recipes/.gitkeep +0 -0
  30. package/reference/schemas/events.schema.json +63 -1
  31. package/reference/schemas/recipe.schema.json +33 -0
  32. package/scripts/cli/gdd-events.mjs +5 -5
  33. package/scripts/lib/cache/gdd-cache-manager.cjs +1 -1
  34. package/scripts/lib/cli/index.ts +22 -160
  35. package/scripts/lib/connection-probe/index.cjs +1 -1
  36. package/scripts/lib/discuss-parallel-runner/aggregator.ts +1 -1
  37. package/scripts/lib/discuss-parallel-runner/index.ts +1 -1
  38. package/scripts/lib/error-classifier.cjs +24 -227
  39. package/scripts/lib/event-stream/index.ts +25 -193
  40. package/scripts/lib/gdd-errors/index.ts +24 -213
  41. package/scripts/lib/gdd-state/index.ts +23 -161
  42. package/scripts/lib/health-mirror/index.cjs +79 -1
  43. package/scripts/lib/iteration-budget.cjs +23 -199
  44. package/scripts/lib/jittered-backoff.cjs +24 -107
  45. package/scripts/lib/lockfile.cjs +23 -195
  46. package/scripts/lib/logger/index.ts +1 -1
  47. package/scripts/lib/parallelism-engine/concurrency-tuner.cjs +1 -1
  48. package/scripts/lib/perf-analyzer/index.cjs +1 -1
  49. package/scripts/lib/pipeline-runner/index.ts +4 -4
  50. package/scripts/lib/pipeline-runner/state-machine.ts +1 -1
  51. package/scripts/lib/prompt-dedup/index.cjs +1 -1
  52. package/scripts/lib/rate-guard.cjs +2 -2
  53. package/scripts/lib/recipe-loader.cjs +142 -0
  54. package/scripts/lib/session-runner/errors.ts +3 -3
  55. package/scripts/lib/session-runner/index.ts +3 -3
  56. package/scripts/lib/session-runner/transcript.ts +1 -1
  57. package/scripts/lib/tool-scoping/index.ts +1 -1
  58. package/scripts/mcp-servers/gdd-mcp/server.ts +29 -311
  59. package/scripts/mcp-servers/gdd-state/server.ts +28 -282
  60. package/sdk/README.md +45 -0
  61. package/{scripts/lib → sdk}/cli/commands/audit.ts +3 -3
  62. package/{scripts/lib → sdk}/cli/commands/init.ts +3 -3
  63. package/{scripts/lib → sdk}/cli/commands/query.ts +4 -4
  64. package/{scripts/lib → sdk}/cli/commands/run.ts +5 -5
  65. package/{scripts/lib → sdk}/cli/commands/stage.ts +5 -5
  66. package/sdk/cli/index.js +8091 -0
  67. package/sdk/cli/index.ts +172 -0
  68. package/{scripts/lib → sdk}/cli/parse-args.ts +2 -2
  69. package/{scripts/lib/gdd-errors → sdk/errors}/classification.ts +1 -1
  70. package/sdk/errors/index.ts +218 -0
  71. package/{scripts/lib → sdk}/event-stream/emitter.ts +1 -1
  72. package/sdk/event-stream/index.ts +197 -0
  73. package/{scripts/lib → sdk}/event-stream/reader.ts +1 -1
  74. package/{scripts/lib → sdk}/event-stream/types.ts +2 -2
  75. package/{scripts/lib → sdk}/event-stream/writer.ts +1 -1
  76. package/sdk/index.ts +19 -0
  77. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/README.md +3 -3
  78. package/sdk/mcp/gdd-mcp/server.js +1966 -0
  79. package/sdk/mcp/gdd-mcp/server.ts +325 -0
  80. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_cycle_recap.ts +3 -3
  81. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_decisions_list.ts +2 -2
  82. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_events_tail.ts +3 -3
  83. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_health.ts +2 -2
  84. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_intel_get.ts +2 -2
  85. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_learnings_digest.ts +2 -2
  86. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_phase_current.ts +2 -2
  87. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_phases_list.ts +2 -2
  88. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_plans_list.ts +2 -2
  89. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_reflections_latest.ts +2 -2
  90. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_status.ts +3 -3
  91. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_telemetry_query.ts +3 -3
  92. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/index.ts +2 -2
  93. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/shared.ts +3 -3
  94. package/sdk/mcp/gdd-state/server.js +2790 -0
  95. package/sdk/mcp/gdd-state/server.ts +294 -0
  96. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/add_blocker.ts +3 -3
  97. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/add_decision.ts +3 -3
  98. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/add_must_have.ts +3 -3
  99. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/checkpoint.ts +2 -2
  100. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/frontmatter_update.ts +2 -2
  101. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/get.ts +3 -3
  102. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/index.ts +1 -1
  103. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/probe_connections.ts +3 -3
  104. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/resolve_blocker.ts +3 -3
  105. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/set_status.ts +2 -2
  106. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/shared.ts +8 -8
  107. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/transition_stage.ts +4 -4
  108. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/update_progress.ts +2 -2
  109. package/sdk/primitives/error-classifier.cjs +232 -0
  110. package/sdk/primitives/iteration-budget.cjs +205 -0
  111. package/sdk/primitives/jittered-backoff.cjs +112 -0
  112. package/sdk/primitives/lockfile.cjs +201 -0
  113. package/{scripts/lib/gdd-state → sdk/state}/gates.ts +1 -1
  114. package/sdk/state/index.ts +167 -0
  115. package/{scripts/lib/gdd-state → sdk/state}/lockfile.ts +1 -1
  116. package/{scripts/lib/gdd-state → sdk/state}/mutator.ts +1 -1
  117. package/{scripts/lib/gdd-state → sdk/state}/parser.ts +1 -1
  118. package/{scripts/lib/gdd-state → sdk/state}/types.ts +4 -4
  119. package/skills/audit/SKILL.md +13 -0
  120. package/skills/brief/SKILL.md +25 -0
  121. package/skills/design/SKILL.md +17 -0
  122. package/skills/discuss/SKILL.md +13 -0
  123. package/skills/explore/SKILL.md +17 -0
  124. package/skills/health/SKILL.md +6 -0
  125. package/skills/plan/SKILL.md +25 -0
  126. package/skills/quality-gate/SKILL.md +2 -2
  127. package/skills/router/SKILL.md +4 -0
  128. package/skills/router/router-pick-emitter.md +78 -0
  129. package/skills/using-gdd/SKILL.md +78 -0
  130. package/skills/verify/SKILL.md +17 -0
  131. package/scripts/aggregate-agent-metrics.ts +0 -282
  132. package/scripts/bootstrap-manifest.txt +0 -3
  133. package/scripts/bootstrap.sh +0 -80
  134. package/scripts/build-distribution-bundles.cjs +0 -549
  135. package/scripts/build-intel.cjs +0 -486
  136. package/scripts/codegen-schema-types.ts +0 -149
  137. package/scripts/detect-stale-refs.cjs +0 -107
  138. package/scripts/e2e/run-headless.ts +0 -514
  139. package/scripts/extract-changelog-section.cjs +0 -58
  140. package/scripts/gsd-cleanup-incubator.cjs +0 -367
  141. package/scripts/injection-patterns.cjs +0 -58
  142. package/scripts/lint-agentskills-spec.cjs +0 -457
  143. package/scripts/release-smoke-test.cjs +0 -200
  144. package/scripts/rollback-release.sh +0 -42
  145. package/scripts/run-injection-scanner-ci.cjs +0 -83
  146. package/scripts/tests/test-authority-rejected-kinds.sh +0 -58
  147. package/scripts/tests/test-authority-watcher-diff.sh +0 -113
  148. package/scripts/tests/test-motion-provenance.sh +0 -64
  149. package/scripts/validate-frontmatter.ts +0 -409
  150. package/scripts/validate-incubator-scope.cjs +0 -133
  151. package/scripts/validate-schemas.ts +0 -401
  152. package/scripts/validate-skill-length.cjs +0 -283
  153. package/scripts/verify-version-sync.cjs +0 -30
  154. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_cycle_recap.schema.json +0 -0
  155. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_decisions_list.schema.json +0 -0
  156. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_events_tail.schema.json +0 -0
  157. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_health.schema.json +0 -0
  158. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_intel_get.schema.json +0 -0
  159. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_learnings_digest.schema.json +0 -0
  160. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_phase_current.schema.json +0 -0
  161. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_phases_list.schema.json +0 -0
  162. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_plans_list.schema.json +0 -0
  163. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_reflections_latest.schema.json +0 -0
  164. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_status.schema.json +0 -0
  165. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_telemetry_query.schema.json +0 -0
  166. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/add_blocker.schema.json +0 -0
  167. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/add_decision.schema.json +0 -0
  168. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/add_must_have.schema.json +0 -0
  169. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/checkpoint.schema.json +0 -0
  170. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/frontmatter_update.schema.json +0 -0
  171. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/get.schema.json +0 -0
  172. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/probe_connections.schema.json +0 -0
  173. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/resolve_blocker.schema.json +0 -0
  174. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/set_status.schema.json +0 -0
  175. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/transition_stage.schema.json +0 -0
  176. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/update_progress.schema.json +0 -0
  177. /package/{scripts/lib → sdk/primitives}/error-classifier.d.cts +0 -0
  178. /package/{scripts/lib → sdk/primitives}/iteration-budget.d.cts +0 -0
  179. /package/{scripts/lib → sdk/primitives}/jittered-backoff.d.cts +0 -0
  180. /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.31.0"
8
+ "version": "1.32.0"
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.31.0",
15
+ "version": "1.32.0",
16
16
  "author": {
17
17
  "name": "hegemonart"
18
18
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "get-design-done",
3
3
  "short_name": "gdd",
4
- "version": "1.31.0",
4
+ "version": "1.32.0",
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",
package/CHANGELOG.md CHANGED
@@ -4,6 +4,81 @@ All notable changes to get-design-done are documented here. Versions follow [sem
4
4
 
5
5
  ---
6
6
 
7
+ ## [1.32.0] - 2026-05-30
8
+
9
+ ### Phase 32 — Skill Auto-Trigger Discipline + Defensive Guardrails
10
+
11
+ Closes the auto-trigger gap between GDD's 70+ skills and the harness's description-match skill-discovery layer. GDD had zero forcing functions — agents consulted skills opportunistically, not disciplinedly. This release ports the skill-discipline **mechanism** (not content) from [`obra/superpowers`](https://github.com/obra/superpowers) (MIT): a SessionStart-injected bootstrap contract, defensive guardrails at every stage transition, and two lightweight skill-discovery instruments that feed Phase 33's behavioral A/B. 9 plans across Waves A–C.
12
+
13
+ ### Added
14
+
15
+ - **`using-gdd` SessionStart bootstrap (the forcing function GDD lacked).** A new `skills/using-gdd/SKILL.md` discipline contract — the **1%-rule** ("if you think there is even a 1% chance a skill applies, you ABSOLUTELY MUST invoke it"), a ≥10-row **red-flags table** (Thought → Reality), a skill-priority order (Process → Implementation → Audit), an instruction-priority precedence (user CLAUDE.md > GDD skill > defaults), and the GDD pipeline flow. Carries `disable-model-invocation: true` (it is injected, not model-invoked) and a pure-trigger description (no `<what>` clause, per superpowers' shortcut finding — proof-by-implementation; Phase 28.5's description-format validator stays open pending Phase 33's A/B evidence).
16
+ - **Per-harness SessionStart inject emitter.** `hooks/inject-using-gdd.sh` is a single polyglot script that reads `using-gdd` and emits it as the host harness's SessionStart `additionalContext` shape — Cursor (`additional_context`), Claude Code (`hookSpecificOutput.additionalContext`), and SDK-standard (top-level `additionalContext`) branches via env-var detection, with a pure-bash JSON escaper (no jq/python dependency). A `hooks/run-hook.cmd` polyglot Windows wrapper and a 5th `hooks/hooks.json` SessionStart entry (matcher `startup|clear|compact`) wire it in.
17
+ - **`<SUBAGENT-STOP>` no-cascade structural guarantee.** The inject is wired ONLY under the SessionStart hook event; subagent spawns do not fire SessionStart, so the bootstrap contract cannot cascade into a subagent's context. The `using-gdd` body opens with a `<SUBAGENT-STOP>` tag. (Structural guarantee here; the behavioral proof under pressure is deferred to Phase 33.)
18
+ - **`<HARD-GATE>` at the 5 stage transitions.** `skills/{brief,explore,plan,design,verify}/SKILL.md` each gain a `<HARD-GATE>` block that refuses to advance the pipeline until the stage's required artifact (`.design/BRIEF.md`, `DESIGN.md` + `DESIGN-CONTEXT.md`, etc.) exists and is approved — reading the artifact path from `.design/STATE.md` when a project uses a custom location.
19
+ - **Rationalization tables in the 7 stage-orchestrator skills.** `brief / explore / plan / design / verify / discuss / audit` each carry a `| Thought | Reality |` rationalization table (≥6 rows) that names the common "skip the stage" justifications and rebuts each.
20
+ - **Inline self-review blocks** in `brief` and `plan` (the 2 spec-producing transitions) — a 4-line inline checklist (Phase 28.5 progressive-disclosure: a short check belongs at the transition surface, not behind a skill-discovery hop).
21
+ - **Portable discipline blocks** in `AGENTS.md` + `GEMINI.md` so non-Claude-Code harnesses (Codex, Gemini, etc.) inherit the same skill-discipline contract.
22
+ - **`router_pick` skill-discovery telemetry** — a new `router_pick` event in `reference/schemas/events.schema.json` plus an emit point (`skills/router/router-pick-emitter.md`). Records a sha256 `context_hash` (never the raw intent — no PII) so Phase 33 can measure which skill the router actually selected.
23
+ - **`lint-skill-descriptions.cjs` drift detector** — a maintainer/CI script (not shipped to npm) that flags any skill whose one-line `description:` is stale while its body changed ≥3 times since (the D-02 heuristic).
24
+ - **`gdd-health` `skill_discipline` check (#7).** `scripts/lib/health-mirror/index.cjs` gains a 7th read-only check reporting `skill-discipline: ready` (using-gdd present AND `hooks.json` SessionStart wires the inject), `skill-discipline: missing using-gdd`, or `skill-discipline: hook not wired`. Documented in `skills/health/SKILL.md`.
25
+
26
+ ### Attribution
27
+
28
+ - **Mechanism ported from [`obra/superpowers`](https://github.com/obra/superpowers) (MIT).** Three artifacts: the SessionStart hook-script structure, the 1%-rule + red-flags-table format, and the defensive-guardrail patterns (`<HARD-GATE>` / `<SUBAGENT-STOP>` / rationalization-table). See `NOTICE`. We port the MECHANISM, not the content — GDD's skills, gates, and tables are GDD-specific.
29
+
30
+ ### Notes
31
+
32
+ - The pure-trigger `using-gdd` description ships as **proof-by-implementation** of superpowers' shortcut finding (a `<what>`-clause can make agents follow the description summary instead of reading the body). The counterfactual A/B description test and the pressure-scenario behavior runner are **deferred to Phase 33** (D-02); Phase 32 ships the `router_pick` events + drift-lint instruments that Phase 33 consumes. Phase 28.5's global description-format validator regex stays open until that evidence lands.
33
+ - 4 stage skills (`brief`, `explore`, `plan`, `verify`) sit in the validator's advisory **warn** band (≥100 lines) after gaining the mandatory discipline blocks — well under the **block** threshold (250). Accepted by design: the gates + tables are the deliverable.
34
+ - 6-manifest lockstep at **v1.32.0** (`package.json` + `.claude-plugin/plugin.json` + `.claude-plugin/marketplace.json` (metadata.version + plugins[0].version) + `.cursor-plugin/plugin.json` + `.codex-plugin/plugin.json`).
35
+
36
+ ---
37
+
38
+ ## [1.31.5] - 2026-05-29
39
+
40
+ ### Phase 31.5 — Repo Structure Consolidation
41
+
42
+ 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).
43
+
44
+ ### Added
45
+
46
+ - **`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).
47
+ - **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).
48
+ - **`recipes/` scaffold** — `recipes/` + a recipe-loader + `reference/schemas/recipe.schema.json`. Ships empty of recipes (the loading machinery, not content).
49
+ - **`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.
50
+ - **`.npmignore`** — a defense-in-depth duplicate of the `package.json` `files` allowlist (D-10).
51
+ - **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).
52
+ - **`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/`.
53
+
54
+ ### Changed
55
+
56
+ - **`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:**
57
+ - **ADDED:** `sdk/` (the SDK, incl. the 3 compiled-bin `.js` siblings), `recipes/`, `docs/i18n/`, `NOTICE`.
58
+ - **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/`.
59
+ - **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`.
60
+ - Tarball golden manifest pinned at **620 paths** (paths-only per D-07).
61
+ - **`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/`.
62
+
63
+ ### Deprecated
64
+
65
+ - **`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/`.
66
+
67
+ ### Backward compatibility
68
+
69
+ - 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.
70
+ - 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`).
71
+
72
+ ### Decisions
73
+
74
+ - **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).
75
+ - **D-02**: Deprecation-shim removal target is **v1.33.0** (the stale ROADMAP v1.29.0 is already shipped/past). One-minor grace window.
76
+ - **D-03**: The private-file leak was already remediated on main; Plan 01 ships only the CI guard.
77
+ - **D-08**: `gdd-mcp` (Phase 27.7) folded in for full symmetry with `gdd-state-mcp` — both MCP servers live under `sdk/mcp/`.
78
+ - **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.
79
+
80
+ ---
81
+
7
82
  ## [1.31.0] - 2026-05-29
8
83
 
9
84
  ### Phase 31 — Figma Off-Context Extractor + Variables Sync Plugin
package/NOTICE ADDED
@@ -0,0 +1,262 @@
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
+ Phase 32 — Skill Auto-Trigger Discipline + Defensive Guardrails (v1.32.0, 2026-05-30)
216
+ ──────────────────────────────────────────────────────────────────────────────
217
+
218
+ The skill-discipline layer shipped in v1.32.0 ports the MECHANISM (not the
219
+ content) from:
220
+
221
+ obra/superpowers (https://github.com/obra/superpowers)
222
+ License: MIT
223
+
224
+ GDD had 70+ skills and zero forcing functions; superpowers ships exactly one
225
+ (`using-superpowers` SessionStart inject) plus the `<HARD-GATE>` /
226
+ `<SUBAGENT-STOP>` / rationalization-table guardrail patterns, and reliably
227
+ auto-triggers its skills. We re-derive the mechanism in GDD's own runtime and
228
+ skill set; the skill bodies, gates, tables, and pipeline flow are GDD-specific.
229
+ Three ported artifacts:
230
+
231
+ hooks/inject-using-gdd.sh
232
+ └─ SessionStart hook-script structure adapted from superpowers'
233
+ `using-superpowers` inject: one polyglot script, env-var branch per
234
+ harness, pure-bash escape_for_json (no jq/python dependency).
235
+
236
+ skills/using-gdd/SKILL.md
237
+ └─ The 1%-rule ("even a 1% chance a skill applies → invoke it") + the
238
+ red-flags `| Thought | Reality |` table format adapted from
239
+ superpowers' using-superpowers discipline contract. GDD content:
240
+ GDD pipeline stages, skill-priority order, instruction-priority.
241
+
242
+ skills/{brief,explore,plan,design,verify,discuss,audit}/SKILL.md
243
+ └─ The defensive-guardrail patterns — `<HARD-GATE>` (refuse to advance a
244
+ stage without its artifact), `<SUBAGENT-STOP>` (no-cascade into
245
+ subagents), and the rationalization-table pattern — adapted from
246
+ superpowers. The specific gates, artifact paths, and table rows are
247
+ GDD-specific.
248
+
249
+ The mechanism is the contribution being attributed; the discipline content is
250
+ original to get-design-done.
251
+
252
+ ────────────────────────────────────────────────────────────────────────
253
+
254
+ Note on the broader codebase: get-design-done as a whole is licensed under
255
+ the MIT License (see LICENSE). The Apache 2.0 attribution above applies
256
+ specifically to the cc-multi-cli-derived files listed under the Phase 27
257
+ block. The MIT attributions under Phase 28.5, Phase 28.7, and Phase 32 cover
258
+ content/mechanism adapted from mattpocock/skills (MIT), gsd-build/get-shit-done
259
+ (MIT), and obra/superpowers (MIT) respectively — the MIT-to-MIT re-licensing is
260
+ straightforward and the attributions above provide the required source
261
+ citation. The MIT and Apache 2.0 licenses are compatible — see
262
+ 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
 
@@ -276,6 +276,18 @@ node scripts/lib/figma-extract/digest.cjs --raw <cache>/raw/<key> --out .design/
276
276
 
277
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
278
 
279
+ ### Skill discipline bootstrap (v1.32.0+)
280
+
281
+ GDD ships 70+ skills, but a description-match skill router consults them opportunistically — easy to skip a stage under pressure. v1.32.0 adds the forcing function GDD lacked, porting the skill-discipline **mechanism** (not content) from [`obra/superpowers`](https://github.com/obra/superpowers) (MIT):
282
+
283
+ - **SessionStart inject.** A `using-gdd` bootstrap contract is injected at every session start / `/clear` / compact (`hooks/inject-using-gdd.sh`, per-harness: Cursor / Claude Code / SDK). It carries the **1%-rule** ("even a 1% chance a skill applies → invoke it"), a red-flags `Thought → Reality` table, and the skill-priority + instruction-priority order — so the agent is primed to find the right skill before it acts.
284
+ - **`<HARD-GATE>` at every stage transition.** Brief / Explore / Plan / Design / Verify each refuse to advance until the stage's artifact exists and is approved — no free-handing a stage.
285
+ - **Rationalization tables** in all 7 stage skills name the common "skip it" justifications and rebut each; **inline self-review** blocks gate the brief and plan specs.
286
+ - **`<SUBAGENT-STOP>` no-cascade.** The inject fires only on SessionStart, so the bootstrap never cascades into spawned subagents.
287
+ - **Portable + health-aware.** `AGENTS.md` + `GEMINI.md` carry the same discipline block for non-Claude-Code harnesses, and `/gdd:health` reports a `skill-discipline` readiness line.
288
+
289
+ See [`skills/using-gdd/SKILL.md`](skills/using-gdd/SKILL.md) and the `NOTICE` attribution for details.
290
+
279
291
 
280
292
  ## How It Works
281
293
 
package/SKILL.md CHANGED
@@ -243,6 +243,10 @@ If `$ARGUMENTS` is a stage or command name — invoke it directly, no state chec
243
243
  /gdd:sketch-wrap-up → Skill("get-design-done:gdd-sketch-wrap-up")
244
244
  /gdd:spike → Skill("get-design-done:gdd-spike")
245
245
  /gdd:spike-wrap-up → Skill("get-design-done:gdd-spike-wrap-up")
246
+ # --- Bootstrap (not slash-routed) ---
247
+ # using-gdd → injected at SessionStart by hooks/inject-using-gdd.sh
248
+ # (disable-model-invocation: true). The skill-discipline contract;
249
+ # not a user-invoked command — see skills/using-gdd/SKILL.md.
246
250
  ```
247
251
 
248
252
  Pass remaining arguments through: `/gdd:explore --skip-interview` → `Skill("get-design-done:gdd-explore", "--skip-interview")`.
@@ -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
+ });
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
  });