@hegemonart/get-design-done 1.28.0 → 1.28.6

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 (98) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +134 -0
  4. package/SKILL.md +1 -1
  5. package/hooks/gdd-decision-injector.js +149 -3
  6. package/package.json +1 -1
  7. package/reference/adr-format.md +96 -0
  8. package/reference/architecture-vocabulary.md +102 -0
  9. package/reference/context-md-format.md +106 -0
  10. package/reference/heuristics.md +84 -0
  11. package/reference/registry.json +29 -1
  12. package/reference/registry.schema.json +1 -1
  13. package/reference/shared-preamble.md +78 -6
  14. package/reference/skill-authoring-contract.md +159 -0
  15. package/scripts/validate-skill-length.cjs +283 -0
  16. package/skills/add-backlog/SKILL.md +1 -0
  17. package/skills/analyze-dependencies/SKILL.md +33 -122
  18. package/skills/apply-reflections/SKILL.md +1 -40
  19. package/skills/apply-reflections/apply-reflections-procedure.md +68 -0
  20. package/skills/audit/SKILL.md +3 -1
  21. package/skills/bandit-status/SKILL.md +31 -66
  22. package/skills/benchmark/SKILL.md +15 -55
  23. package/skills/brief/SKILL.md +12 -1
  24. package/skills/cache-manager/SKILL.md +3 -57
  25. package/skills/cache-manager/cache-policy.md +126 -0
  26. package/skills/check-update/SKILL.md +38 -75
  27. package/skills/compare/SKILL.md +29 -269
  28. package/skills/compare/compare-rubric.md +171 -0
  29. package/skills/complete-cycle/SKILL.md +1 -1
  30. package/skills/connections/SKILL.md +21 -427
  31. package/skills/connections/connections-onboarding.md +417 -0
  32. package/skills/continue/SKILL.md +1 -0
  33. package/skills/darkmode/SKILL.md +32 -287
  34. package/skills/darkmode/darkmode-audit-procedure.md +258 -0
  35. package/skills/debug/SKILL.md +11 -8
  36. package/skills/debug/debug-feedback-loops.md +119 -0
  37. package/skills/design/SKILL.md +27 -245
  38. package/skills/design/design-procedure.md +304 -0
  39. package/skills/discover/SKILL.md +26 -133
  40. package/skills/discover/discover-procedure.md +204 -0
  41. package/skills/discuss/SKILL.md +18 -2
  42. package/skills/explore/SKILL.md +40 -205
  43. package/skills/explore/explore-procedure.md +267 -0
  44. package/skills/fast/SKILL.md +1 -0
  45. package/skills/figma-write/SKILL.md +2 -2
  46. package/skills/health/SKILL.md +11 -33
  47. package/skills/health/health-mcp-detection.md +44 -0
  48. package/skills/health/health-skill-length-report.md +69 -0
  49. package/skills/help/SKILL.md +1 -0
  50. package/skills/list-assumptions/SKILL.md +1 -0
  51. package/skills/map/SKILL.md +8 -31
  52. package/skills/new-cycle/SKILL.md +3 -1
  53. package/skills/new-cycle/milestone-completeness-rubric.md +87 -0
  54. package/skills/next/SKILL.md +1 -0
  55. package/skills/note/SKILL.md +1 -0
  56. package/skills/optimize/SKILL.md +21 -44
  57. package/skills/pause/SKILL.md +1 -0
  58. package/skills/peer-cli-add/SKILL.md +26 -108
  59. package/skills/peer-cli-add/peer-cli-protocol.md +161 -0
  60. package/skills/peer-cli-customize/SKILL.md +22 -42
  61. package/skills/peers/SKILL.md +33 -57
  62. package/skills/plan/SKILL.md +33 -220
  63. package/skills/plan/plan-procedure.md +278 -0
  64. package/skills/plant-seed/SKILL.md +1 -0
  65. package/skills/pr-branch/SKILL.md +1 -0
  66. package/skills/progress/SKILL.md +1 -7
  67. package/skills/quality-gate/SKILL.md +34 -166
  68. package/skills/quality-gate/threat-modeling.md +101 -0
  69. package/skills/quick/SKILL.md +1 -0
  70. package/skills/reapply-patches/SKILL.md +1 -0
  71. package/skills/recall/SKILL.md +1 -0
  72. package/skills/resume/SKILL.md +1 -0
  73. package/skills/review-backlog/SKILL.md +1 -0
  74. package/skills/router/SKILL.md +3 -59
  75. package/skills/router/router-rules.md +84 -0
  76. package/skills/scan/SKILL.md +36 -675
  77. package/skills/scan/scan-procedure.md +731 -0
  78. package/skills/settings/SKILL.md +1 -0
  79. package/skills/ship/SKILL.md +1 -0
  80. package/skills/sketch/SKILL.md +1 -1
  81. package/skills/sketch-wrap-up/SKILL.md +13 -54
  82. package/skills/spike/SKILL.md +1 -1
  83. package/skills/spike-wrap-up/SKILL.md +12 -46
  84. package/skills/start/SKILL.md +13 -112
  85. package/skills/start/start-procedure.md +115 -0
  86. package/skills/stats/SKILL.md +1 -0
  87. package/skills/style/SKILL.md +18 -140
  88. package/skills/style/style-doc-procedure.md +150 -0
  89. package/skills/synthesize/SKILL.md +1 -0
  90. package/skills/timeline/SKILL.md +1 -0
  91. package/skills/todo/SKILL.md +1 -0
  92. package/skills/turn-closeout/SKILL.md +36 -56
  93. package/skills/undo/SKILL.md +1 -0
  94. package/skills/update/SKILL.md +1 -0
  95. package/skills/verify/SKILL.md +42 -457
  96. package/skills/verify/verify-procedure.md +512 -0
  97. package/skills/warm-cache/SKILL.md +3 -35
  98. package/skills/zoom-out/SKILL.md +26 -0
@@ -0,0 +1,267 @@
1
+ ---
2
+ name: explore-procedure
3
+ type: meta-rules
4
+ version: 1.0.0
5
+ phase: 28.5
6
+ tags: [explore, procedure, extracted, pipeline-stage, connection-probe, design-interview, i18n]
7
+ last_updated: 2026-05-18
8
+ ---
9
+
10
+ Source: extracted from `skills/explore/SKILL.md` (Phase 28.5 rework — D-10 extract-then-link).
11
+ The skill's load-bearing workflow stays in `../skills/explore/SKILL.md`; this file holds the
12
+ detail the agent reaches for when executing a specific step (six connection probes, 21st.dev
13
+ prior-art check, inventory scan grep, design interview protocol, i18n probe, decision
14
+ recording).
15
+
16
+ # Explore Procedure
17
+
18
+ Detailed procedure for the get-design-done `explore` Stage 2 orchestrator. Companion to
19
+ `../skills/explore/SKILL.md`. Read this file when executing a specific step; the SKILL.md
20
+ keeps the load-bearing workflow + decision tree, this file holds the deep methodology.
21
+
22
+ ---
23
+
24
+ ## Stage entry
25
+
26
+ All STATE.md persistence in this skill goes through `gdd-state` MCP tools — no direct edits. The skill writes to `.design/STATE.md` (connections, decisions, progress, checkpoint) via those tools, and to plain design docs (DESIGN.md / DESIGN-DEBT.md / DESIGN-CONTEXT.md) via `Write`.
27
+
28
+ 1. Call `mcp__gdd_state__transition_stage` with `to: "explore"`.
29
+ - On success: proceed to probes.
30
+ - On gate failure: emit blockers to the user (do not advance). Each blocker is a line in the `error.context.blockers` array; print them verbatim.
31
+ 2. Call `mcp__gdd_state__get` with no arguments — snapshot the parsed state into a local `state` variable for downstream steps.
32
+
33
+ ---
34
+
35
+ ## Step 1 — Connection probe
36
+
37
+ Probe connection availability (the batched write lands at the end of this step — see "Commit probe results" below):
38
+
39
+ **A — Figma probe (variant-agnostic):**
40
+ ```
41
+ ToolSearch({ query: "figma get_metadata use_figma", max_results: 10 })
42
+ Parse tool names matching /^mcp__([^_]*figma[^_]*)__(get_metadata|use_figma)$/i
43
+ into read-capable and write-capable prefix sets.
44
+ Empty read set -> figma: not_configured
45
+ One+ matches -> pick prefix via tiebreaker:
46
+ (1) both-sets > reads-only,
47
+ (2) `figma` > others,
48
+ (3) non-`figma-desktop` > desktop,
49
+ (4) alphabetical.
50
+ Then call {prefix}get_metadata:
51
+ success -> figma: available (prefix=mcp__<prefix>__, writes=<true|false>)
52
+ error -> figma: unavailable
53
+ ```
54
+
55
+ **B — Refero probe:**
56
+ ```
57
+ ToolSearch({ query: "refero", max_results: 5 })
58
+ Empty -> refero: not_configured
59
+ Non-empty -> refero: available
60
+ ```
61
+
62
+ **C — 21st.dev probe:**
63
+ ```
64
+ ToolSearch({ query: "mcp__21st", max_results: 5 })
65
+ Empty -> 21st-dev: not_configured
66
+ Non-empty -> 21st-dev: available
67
+ ```
68
+
69
+ **D — Magic Patterns probe:**
70
+ ```
71
+ ToolSearch({ query: "mcp__magic_patterns", max_results: 5 })
72
+ Empty -> magic-patterns: not_configured
73
+ Non-empty -> magic-patterns: available
74
+ ```
75
+
76
+ **E — paper.design probe:**
77
+ ```
78
+ ToolSearch({ query: "mcp__paper", max_results: 5 })
79
+ Empty -> paper-design: not_configured
80
+ Non-empty -> call mcp__paper-design__get_selection; success -> available; error -> unavailable
81
+ ```
82
+
83
+ **F — pencil.dev probe (file-based):**
84
+ ```bash
85
+ find . -name "*.pen" -not -path "*/node_modules/*" 2>/dev/null | head -1
86
+ Empty -> pencil-dev: not_configured
87
+ Found -> pencil-dev: available
88
+ ```
89
+
90
+ ## Commit probe results
91
+
92
+ After all probes complete, commit results in a single call:
93
+
94
+ `mcp__gdd_state__probe_connections` with `probe_results` = an array of `{ name, status }` entries — one per probed connection. Example:
95
+
96
+ ```json
97
+ {
98
+ "probe_results": [
99
+ { "name": "figma", "status": "available" },
100
+ { "name": "refero", "status": "not_configured" },
101
+ { "name": "preview", "status": "unavailable" }
102
+ ]
103
+ }
104
+ ```
105
+
106
+ Unspecified connections keep their existing value. Do NOT issue multiple `probe_connections` calls — the tool is designed for a single batch write per stage.
107
+
108
+ ## Step 1.5 — 21st.dev Prior-Art Check (when 21st-dev: available)
109
+
110
+ If `state.connections.21st-dev === "not_configured"` (from the snapshot captured at stage entry): skip this step entirely.
111
+
112
+ When the explore stage identifies any greenfield component in scope (component name from BRIEF.md or user request that does not yet have an implementation file):
113
+
114
+ 1. `21st_magic_component_search(component_name, limit: 3)`
115
+ 2. Evaluate top result:
116
+ - **fit >= 80%**: add `<prior-art>` block to DESIGN.md:
117
+ ```xml
118
+ <prior-art source="21st.dev" component="<name>" fit="<score>%" id="<component_id>">
119
+ Recommendation: adopt — do not build custom. Confirm with design-executor.
120
+ </prior-art>
121
+ ```
122
+ - **fit < 80%**: note top candidate in DESIGN.md as a reference, proceed with custom build:
123
+ ```xml
124
+ <prior-art source="21st.dev" component="<name>" fit="<score>%" id="<component_id>">
125
+ Low fit — noted for reference. Building custom component.
126
+ </prior-art>
127
+ ```
128
+ 3. If `svgl_get_brand_logo` is available and explore scope includes brand logo assets: call `svgl_get_brand_logo(brand_name)` for each required brand asset; add SVG results to `.design/assets/` and note in DESIGN.md.
129
+
130
+ If no greenfield components in scope: skip this step.
131
+
132
+ ---
133
+
134
+ ## Step 2 — Inventory scan (unless `--skip-scan`)
135
+
136
+ **Map pre-check:** If `.design/map/` exists and all 5 files (`tokens.md`, `components.md`, `visual-hierarchy.md`, `a11y.md`, `motion.md`) are present AND fresher than `src/` (mtime), consume them as the inventory source and skip the grep pass. Otherwise proceed with grep below and, after Step 4, suggest running `/gdd:map` for richer parallel-scanned data on the next cycle.
137
+
138
+ **Parallelism decision (before any multi-agent spawn):**
139
+ 1. Read `.design/config.json` `parallelism` (or defaults from `reference/config-schema.md`).
140
+ 2. Apply rules from `reference/parallelism-rules.md` (hard -> soft).
141
+ 3. Record the verdict via `mcp__gdd_state__set_status` with a short status label (e.g., `status: "explore_parallel"` or `"explore_serial"`) carrying the stage/verdict/reason/agents payload.
142
+ 4. If verdict is `parallel`, dispatch via multiple `Task()` calls in one response; if `serial`, spawn sequentially.
143
+
144
+ Run the canonical scan grep/glob inventory (preserves PLAT-01/02 POSIX ERE patterns from Phase 1):
145
+
146
+ - **Component detection** — `Glob` for `**/*.{tsx,jsx,vue,svelte}`; count exports, identify shared UI primitives.
147
+ - **Color extraction** — `Grep` for hex (`#[0-9a-fA-F]{3,8}`), `rgb(`, `hsl(`, Tailwind arbitrary color classes; dedupe.
148
+ - **Typography scan** — Grep font-family declarations, Tailwind `font-*`, `text-*` size classes; identify type scale.
149
+ - **Motion scan** — Grep `transition`, `animate-`, `@keyframes`, `framer-motion` imports.
150
+ - **Token detection** — Check for `tailwind.config.{js,cjs,mjs,ts}`, CSS custom properties (`--*`), design-token JSON.
151
+ - **Layout detection** — Ordered fallback: `src/` -> `app/` -> `pages/` -> `lib/` -> unknown.
152
+
153
+ Write findings to:
154
+ - `.design/DESIGN.md` — current design system inventory + baseline score
155
+ - `.design/DESIGN-DEBT.md` — prioritized debt roadmap
156
+
157
+ Record scan progress: call `mcp__gdd_state__update_progress` with `task_progress: "<completed>/<total>"` to reflect the scan pass.
158
+
159
+ ### Step 2.x — i18n readiness probe (informational)
160
+
161
+ Phase 28 D-04 probe — 3-state classification, **informational only**. NO gate, NO blocking, NO required-action. Output appears as a single line in the explore report.
162
+
163
+ Classification logic (matches `./reference/i18n.md` §Explore Integration Spec):
164
+
165
+ ```txt
166
+ 1. Read package.json (dependencies + devDependencies).
167
+
168
+ 2. Check against library matrix:
169
+ react-intl, next-intl, i18next, vue-i18n, formatjs, lingui
170
+ >=1 library found in deps or devDeps -> state = "framework-managed"
171
+ -> STOP, emit line, exit probe.
172
+
173
+ 3. Else (no library):
174
+ grep -RE "Intl\.(DateTimeFormat|NumberFormat|PluralRules|RelativeTimeFormat|ListFormat|Collator|Segmenter)" src/
175
+ >=1 match -> state = "partial"
176
+ -> emit line, exit probe.
177
+
178
+ 4. Else: state = "none"
179
+ -> emit line, exit probe.
180
+ ```
181
+
182
+ Output line in explore report (single informational line, per D-04):
183
+
184
+ ```txt
185
+ Localization readiness: framework-managed | partial | none
186
+ ```
187
+
188
+ (Exactly one of the three values, single line.) A consumer downstream (a planning agent, a roadmap reviewer, the user) can act on the signal if a gap is meaningful for the project, but the probe itself never forces a step — surface signal, do not bolt on a new pillar (D-07 orthogonal-lens discipline).
189
+
190
+ ## Step 2.5 — Detect prior sketches and project-local conventions
191
+
192
+ **Sketches**: If `.design/sketches/` exists, list all sketch slugs — group by those with `WINNER.md` (completed wrap-ups) vs without (pending). Call `mcp__gdd_state__set_status` with a brief note (e.g., `status: "explore_sketches_present"`) so downstream stages see the history. Include the inventory in DESIGN.md under a "Prior Explorations" section.
193
+
194
+ **Project-local skills**: Read any `./.claude/skills/design-*-conventions.md` files if present. Include their content in DESIGN-CONTEXT.md under a `<project_conventions>` section — these are codified decisions from prior `/gdd:sketch-wrap-up` runs or manual edits, and they override defaults.
195
+
196
+ **Global skills**: If `~/.claude/gdd/global-skills/` exists and contains `.md` files (other than README.md), read them and prepend their content to the `<project_conventions>` section under a `<global_conventions>` sub-block. Global skills represent cross-project personal conventions. They inform but do not override project-local decisions — when a project-local D-XX decision conflicts with a global skill, the project-local decision wins.
197
+
198
+ ---
199
+
200
+ ## Step 3 — Design interview (unless `--skip-interview`)
201
+
202
+ **Run this inline — do NOT spawn `design-discussant` as a subagent.** Subagent UI tools (`AskUserQuestion`) only render the native picker when called from the top-level skill context; spawning a Task() degrades the interview to plain markdown in chat (broken in Claude Desktop).
203
+
204
+ ### 3.a — Pre-load context
205
+
206
+ Read in this order:
207
+ 1. `state.decisions` from the snapshot captured at stage entry — existing D-XX entries (do NOT re-ask anything covered). If the snapshot is stale, refresh by calling `mcp__gdd_state__get`.
208
+ 2. `.design/BRIEF.md` — problem statement, audience, constraints
209
+ 3. `.design/DESIGN.md` — auto-detected inventory from Step 2
210
+ 4. `.design/DESIGN-CONTEXT.md` if it exists — `<gray_areas>` block lists unresolved topics
211
+ 5. `./.claude/skills/design-*-conventions.md` if any — locked project conventions, treat as authoritative
212
+
213
+ If `state.connections` shows `figma: available`, read the resolved `prefix=` from the same entry and call `{prefix}get_variable_defs`, then draft tentative D-XX entries (mark `(tentative — confirm with user)`) before asking.
214
+
215
+ ### 3.b — Identify question set
216
+
217
+ Build the list of areas needing input. Skip any area already answered by an existing D-XX or covered by a project convention. Default coverage:
218
+
219
+ - Cycle goal / outcome that matters most
220
+ - Audience and primary use context
221
+ - Brand direction (only if no tokens detected in DESIGN.md)
222
+ - Color primitives (only if no palette detected)
223
+ - Typography scale (only if no type system detected)
224
+ - Spacing scale (only if no spacing tokens detected)
225
+ - Motion preferences (only if no motion patterns detected)
226
+ - Any `<gray_areas>` from DESIGN-CONTEXT.md
227
+
228
+ ### 3.c — Ask, one question at a time
229
+
230
+ For each area, call `AskUserQuestion` with a single focused question. Provide 4 concrete options plus "Other" / "Skip" where it helps. Do not batch questions into one call. Do not print the question as markdown — always go through the tool.
231
+
232
+ Reject generic answers ("modern", "clean", "professional"). If the answer is vague, ask one follow-up before recording.
233
+
234
+ ### 3.d — Record after each answer
235
+
236
+ After each confirmed answer:
237
+ 1. Call `mcp__gdd_state__add_decision` with the decision payload. The tool assigns the next `D-NN` id and persists atomically. Format the summary as:
238
+ ```
239
+ [Category] Decision summary — short rationale
240
+ ```
241
+ 2. Append one JSON line to `.design/learnings/question-quality.jsonl` (create if absent):
242
+ ```json
243
+ {"ts":"<iso>","question_id":"Q-NN","question_text":"<verbatim>","answer_summary":"<one sentence>","quality":"high|medium|low|skipped","evidence":"<why>","cycle":"<active-cycle-slug>"}
244
+ ```
245
+ Quality classification: `skipped` if user picked Skip / "doesn't matter"; `low` if < 10 words and not a specific value; `medium` if hedged ("maybe", "I think", "not sure"); `high` otherwise.
246
+ 3. `add_decision` commits incrementally — the decision survives a crash mid-interview without an explicit save step.
247
+
248
+ ### 3.e — Produce DESIGN-CONTEXT.md
249
+
250
+ When all questions are answered, write `.design/DESIGN-CONTEXT.md` summarizing the locked decisions, remaining gray areas, and any Figma-sourced tentatives that were confirmed or rejected. Set frontmatter `status: complete`.
251
+
252
+ ---
253
+
254
+ ## Step 4 — Close out explore
255
+
256
+ - If the synthesizer (or equivalent mapper batch) ran in Step 2, call `mcp__gdd_state__update_progress` with `task_progress: "<mappers-completed>/<mappers-total>"` and `status: "explore_mappers_done"` before advancing.
257
+ - Call `mcp__gdd_state__checkpoint` — bumps `frontmatter.last_checkpoint` + appends a timestamp entry.
258
+ - Stage advance to `plan` happens at the next stage's entry (the plan skill will transition from its own entry step); do not edit frontmatter directly from this skill.
259
+
260
+ ## After Writing
261
+
262
+ ```
263
+ === Explore complete ===
264
+ Saved: .design/DESIGN.md, .design/DESIGN-DEBT.md, .design/DESIGN-CONTEXT.md
265
+ Next: @get-design-done plan
266
+ =========================
267
+ ```
@@ -3,6 +3,7 @@ name: gdd-fast
3
3
  description: "Trivial inline design task. No subagents, no planning documents, no pipeline stages. Just do the thing described."
4
4
  argument-hint: "<task description>"
5
5
  tools: Read, Write, Edit, Bash, Grep, Glob
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  # /gdd:fast
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: get-design-done:figma-write
3
- description: Write design decisions from DESIGN-CONTEXT.md back into the active Figma file. Three modes: annotate (layer comments), tokenize (variable bindings), mappings (Code Connect). Operates in proposal→confirm mode. Pass --dry-run to preview without writing.
3
+ description: "Write design decisions from `.design/DESIGN-CONTEXT.md` back into the active Figma file by dispatching the `design-figma-writer` agent in one of three modes (annotate / tokenize / mappings). Use when the user has completed a design pipeline cycle and wants the decisions (layer comments, variable bindings, or Code Connect mappings) reflected in Figma. Operates proposal→confirm with `--dry-run` and `--confirm-shared` flags."
4
4
  ---
5
5
 
6
6
  # get-design-done:figma-write
7
7
 
8
- Dispatches the `design-figma-writer` agent to write design decisions back to the open Figma file.
8
+ Dispatches the `design-figma-writer` agent to write design decisions back to the open Figma file. The shared probe pattern (ToolSearch → live call → STATE.md write) and connection handshake are documented at `../../reference/shared-preamble.md#connection-handshake-summary` and `../../connections/figma.md`.
9
9
 
10
10
  ## Usage
11
11
 
@@ -2,6 +2,7 @@
2
2
  name: gdd-health
3
3
  description: "Reports .design/ artifact health — staleness, missing files, token drift, broken state transitions."
4
4
  tools: Read, Bash, Glob, Grep, mcp__gdd_state__get
5
+ disable-model-invocation: true
5
6
  ---
6
7
 
7
8
  # /gdd:health
@@ -52,41 +53,9 @@ Health: 5 / 6 checks passing.
52
53
  ━━━━━━━━━━━━━━━━━━━━━
53
54
  ```
54
55
 
55
- <step name="check-mcp-registration">
56
-
57
56
  ## Check MCP registration (gdd-mcp)
58
57
 
59
- This step inspects whether `gdd-mcp` (Phase 27.7+) is registered with any installed harness and renders a one-line status row after the health table. Dismissable via `.design/config.json#mcp_nudge=false`. This step is non-blocking: a fail-safe fallback ensures malformed config or missing harness settings MUST NOT crash the SKILL skip silently to `unknown` status when anything goes wrong.
60
-
61
- ### Dismissal check
62
-
63
- 1. Read `.design/config.json` (if present). Parse JSON inside a try/catch.
64
- 2. If `config.mcp_nudge === false`, SKIP this step entirely (render nothing).
65
- 3. On parse failure: default to `mcp_nudge=true` (show the row) — fail-safe per threat T-27.7-04-05.
66
-
67
- ### Detection
68
-
69
- 1. Read `.claude/settings.local.json` (or equivalent harness settings file) and inspect its `mcpServers` object — alternatively run `claude mcp list` / `codex mcp list` if a CLI is available (see fallback below).
70
- 2. Preferred invocation via the install-lib: call `detectMcpRegistration()` from `scripts/lib/install/mcp-register.cjs`. Returns `{harnesses: [{harness, present, registered}], summary}`.
71
-
72
- ### Row rendering
73
-
74
- Based on the detection result, render exactly ONE of these row strings:
75
-
76
- - When `claude` and `codex` both present + both registered:
77
- `MCP server: registered with claude+codex`
78
- - When only one harness is present and registered:
79
- `MCP server: registered with claude` (or `MCP server: registered with codex`)
80
- - When at least one harness is present but `gdd-mcp` is NOT in its registered list:
81
- `MCP server: not registered (run: npx @hegemonart/get-design-done --register-mcp; dismiss: .design/config.json#mcp_nudge=false)`
82
- - When neither harness CLI is found on PATH:
83
- `MCP server: unknown (claude/codex CLI not found)`
84
-
85
- ### Fallback (if `mcp-register.cjs` not yet shipped)
86
-
87
- Skip this step silently with status `MCP server: unknown`. This step is non-blocking — failures here MUST NOT crash the SKILL.
88
-
89
- </step>
58
+ After the health table, inspect whether `gdd-mcp` (Phase 27.7+) is registered with any installed harness and render a one-line status row. Dismissable via `.design/config.json#mcp_nudge=false`. Non-blocking: failure paths render `MCP server: unknown` rather than crash. Full detection procedure (dismissal check, detection via `scripts/lib/install/mcp-register.cjs`, row rendering for claude/codex/both/neither, fallback) lives in `./health-mcp-detection.md`.
90
59
 
91
60
  ## Update notice (safe-window surface)
92
61
 
@@ -98,6 +67,15 @@ After the health table, emit the plugin-update banner if one is present:
98
67
 
99
68
  Written by `hooks/update-check.sh`; suppressed mid-pipeline and when the latest release is dismissed.
100
69
 
70
+ ## Skill-length report
71
+
72
+ After the health table, surface the Phase 28.5 skill-authoring contract drift signal by running `node scripts/validate-skill-length.cjs --quiet --json` and reading `summary` from stdout. Print two prose lines:
73
+
74
+ - `Skill-length: <total> total | <clean> clean | <warnings> warn (>=100) | <blockers> block (>=250)`
75
+ - If blockers > 0: list each blocker as a row `- <name> (<lines> lines)`. Else: print `All skills within contract.`
76
+
77
+ Thresholds: warn >=100, block >=250 (D-01). Strict description-format off by default (D-02). See `./health-skill-length-report.md` for the JSON shape and threshold rationale.
78
+
101
79
  ## Do Not
102
80
 
103
81
  - Do not mutate STATE.md — this skill is read-only. Only `mcp__gdd_state__get` is permitted.
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: health-mcp-detection
3
+ type: heuristic
4
+ version: 1.0.0
5
+ phase: 28.5
6
+ tags: [health, mcp, detection, gdd-mcp, registration-nudge]
7
+ last_updated: 2026-05-18
8
+ ---
9
+
10
+ # Health MCP-Registration Detection Procedure
11
+
12
+ Extracted from `skills/health/SKILL.md` per Phase 28.5 D-10 (extract-then-link, never delete content).
13
+ This file documents the canonical procedure for inspecting whether `gdd-mcp` (Phase 27.7+) is
14
+ registered with any installed harness and rendering a one-line status row after the health
15
+ table. The procedure is non-blocking by design: any failure path renders `unknown` rather
16
+ than crashing the skill.
17
+
18
+ ## Dismissal check
19
+
20
+ 1. Read `.design/config.json` (if present). Parse JSON inside a try/catch.
21
+ 2. If `config.mcp_nudge === false`, SKIP this step entirely (render nothing).
22
+ 3. On parse failure: default to `mcp_nudge=true` (show the row) — fail-safe per threat T-27.7-04-05.
23
+
24
+ ## Detection
25
+
26
+ 1. Read `.claude/settings.local.json` (or equivalent harness settings file) and inspect its `mcpServers` object — alternatively run `claude mcp list` / `codex mcp list` if a CLI is available (see fallback below).
27
+ 2. Preferred invocation via the install-lib: call `detectMcpRegistration()` from `scripts/lib/install/mcp-register.cjs`. Returns `{harnesses: [{harness, present, registered}], summary}`.
28
+
29
+ ## Row rendering
30
+
31
+ Based on the detection result, render exactly ONE of these row strings:
32
+
33
+ - When `claude` and `codex` both present + both registered:
34
+ `MCP server: registered with claude+codex`
35
+ - When only one harness is present and registered:
36
+ `MCP server: registered with claude` (or `MCP server: registered with codex`)
37
+ - When at least one harness is present but `gdd-mcp` is NOT in its registered list:
38
+ `MCP server: not registered (run: npx @hegemonart/get-design-done --register-mcp; dismiss: .design/config.json#mcp_nudge=false)`
39
+ - When neither harness CLI is found on PATH:
40
+ `MCP server: unknown (claude/codex CLI not found)`
41
+
42
+ ## Fallback (if `mcp-register.cjs` not yet shipped)
43
+
44
+ Skip this step silently with status `MCP server: unknown`. This step is non-blocking — failures here MUST NOT crash the SKILL.
@@ -0,0 +1,69 @@
1
+ # Health skill — skill-length report subsection
2
+
3
+ Phase 28.5-11 / D-11 reference. Read by `skills/health/SKILL.md` to render the
4
+ "Skill-length report" subsection after the standard health checks.
5
+
6
+ ## JSON shape (from `validate-skill-length.cjs --quiet --json`)
7
+
8
+ ```jsonc
9
+ {
10
+ "summary": {
11
+ "total": 70, // number of SKILL.md files under skills/
12
+ "clean": 70, // skills with 0 errors and 0 warnings
13
+ "warnings": 0, // skills with >=100 lines but <250 (D-01 warn band)
14
+ "blockers": 0 // skills with any block-level error (>=250 lines,
15
+ // missing frontmatter field, description out of
16
+ // range, disable-model-invocation non-whitelisted)
17
+ },
18
+ "skills": [
19
+ {
20
+ "name": "...", // skill folder name (matches skills/<name>/SKILL.md)
21
+ "path": "...", // absolute path to the file on disk
22
+ "lines": 0, // wc -l semantics
23
+ "descriptionLength": 0, // length of frontmatter.description string
24
+ "hasRequiredFields": true,
25
+ "level": "clean", // "clean" | "warn" | "block"
26
+ "errors": [{ "code": "...", "message": "..." }],
27
+ "warnings": [{ "code": "...", "message": "..." }],
28
+ "reasons": ["..."] // human-readable summary lines
29
+ }
30
+ ]
31
+ }
32
+ ```
33
+
34
+ ## Render contract
35
+
36
+ The health skill prints two lines after the existing checks table:
37
+
38
+ ```
39
+ Skill-length: <total> total | <clean> clean | <warnings> warn (>=100) | <blockers> block (>=250)
40
+ All skills within contract.
41
+ ```
42
+
43
+ If `summary.blockers > 0`, replace the second line with one indented row per
44
+ blocker entry (skills where `level === "block"`):
45
+
46
+ ```
47
+ Skill-length: 70 total | 67 clean | 2 warn (>=100) | 1 block (>=250)
48
+ - <name> (<lines> lines)
49
+ ```
50
+
51
+ ## Thresholds (D-01)
52
+
53
+ - `warn >=100` — skill flagged as advisory; CI emits `::warning::` annotation
54
+ but does not fail the build.
55
+ - `block >=250` — skill flagged as blocker; CI emits `::error::` and fails
56
+ the build via exit code 2.
57
+
58
+ ## Strict description-format (D-02)
59
+
60
+ `STRICT_DESCRIPTION=1` / `--strict-description` is OFF by default. Phase 33
61
+ will graduate the strict `<what>. Use when <triggers>.` regex from advisory
62
+ to hard-block based on A/B evidence at
63
+ `.design/research/description-format-ab.md`.
64
+
65
+ ## Cross-link from health
66
+
67
+ - `skills/health/SKILL.md` — emits the report after the main checks table.
68
+ - `scripts/validate-skill-length.cjs` — provides the JSON.
69
+ - `tests/phase-28.5-baseline.test.cjs` — locks the post-rework distribution.
@@ -2,6 +2,7 @@
2
2
  name: gdd-help
3
3
  description: "Lists all available get-design-done commands with one-line descriptions"
4
4
  tools: Read
5
+ disable-model-invocation: true
5
6
  ---
6
7
 
7
8
  # Get Design Done — Help
@@ -3,6 +3,7 @@ name: gdd-list-assumptions
3
3
  description: "Surfaces hidden design assumptions baked into the codebase before planning — pattern-based detection plus user-surfaced items."
4
4
  argument-hint: "[--area typography|color|layout|motion|a11y]"
5
5
  tools: Read, Grep, Glob
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  # /gdd:list-assumptions
@@ -8,7 +8,7 @@ user-invocable: true
8
8
 
9
9
  # Get Design Done — Map
10
10
 
11
- Parallel orchestrator. Spawns 5 specialist mappers, each writing one file under `.design/map/`. The explore stage consumes these when present.
11
+ Parallel orchestrator. Spawns 5 specialist mappers, each writing one file under `.design/map/`. The explore stage consumes these when present. See `./reference/heuristics.md` §"Optimization rules" for parallel-spawn cost considerations.
12
12
 
13
13
  ## Mapper → Output
14
14
 
@@ -29,11 +29,7 @@ Parallel orchestrator. Spawns 5 specialist mappers, each writing one file under
29
29
 
30
30
  ## Step 2 — Parallelism Decision
31
31
 
32
- Follow `reference/parallelism-rules.md`:
33
-
34
- - All 5 mappers have `parallel-safe: auto` with disjoint `writes:` (each writes a different `.design/map/*.md` file) → no hard-rule conflict.
35
- - `typical-duration-seconds` sum (~210s) minus slowest (~45s) ≈ 165s savings → clears `min_estimated_savings_seconds`.
36
- - Verdict: **parallel**.
32
+ Per `reference/parallelism-rules.md`: all 5 mappers have `parallel-safe: auto` with disjoint `writes:` (each writes a different `.design/map/*.md` file) — no hard-rule conflict. `typical-duration-seconds` sum (~210s) minus slowest (~45s) ≈ 165s savings → clears `min_estimated_savings_seconds`. Verdict: **parallel**.
37
33
 
38
34
  Write the verdict to STATE.md:
39
35
 
@@ -48,11 +44,11 @@ Write the verdict to STATE.md:
48
44
  </parallelism_decision>
49
45
  ```
50
46
 
51
- If `--only` was passed, adjust `agents` and set `verdict: serial` with `reason: "single mapper requested"`.
47
+ `--only` adjust `agents` and set `verdict: serial` with `reason: "single mapper requested"`.
52
48
 
53
49
  ## Step 3 — Dispatch (concurrent)
54
50
 
55
- Spawn all selected mappers in a single response using multiple `Task()` calls. Standard prompt shape:
51
+ Spawn all selected mappers in a single response with multiple `Task()` calls:
56
52
 
57
53
  ```
58
54
  Task("<mapper-name>", """
@@ -68,36 +64,17 @@ output file under .design/map/. Emit your completion marker when done.
68
64
  """)
69
65
  ```
70
66
 
71
- Wait for every mapper's completion marker:
72
- - `## TOKEN MAP COMPLETE`
73
- - `## COMPONENT MAP COMPLETE`
74
- - `## VISUAL HIERARCHY MAP COMPLETE`
75
- - `## A11Y MAP COMPLETE`
76
- - `## MOTION MAP COMPLETE`
67
+ Wait for each completion marker: `## TOKEN MAP COMPLETE`, `## COMPONENT MAP COMPLETE`, `## VISUAL HIERARCHY MAP COMPLETE`, `## A11Y MAP COMPLETE`, `## MOTION MAP COMPLETE`.
77
68
 
78
69
  ## Step 3.5 — Synthesize parallel mapper outputs (Plan 10.1-04, D-13/D-14/D-15)
79
70
 
80
- Each mapper has already written its own `.design/map/*.md` (disjoint writes). Main-context doesn't need all 5 verbatim — invoke the `synthesize` skill inline:
81
-
82
- Skill("synthesize", {
83
- outputs: [
84
- "=== from token-mapper ===\n" + <read .design/map/tokens.md>,
85
- "=== from component-taxonomy-mapper ===\n" + <read .design/map/components.md>,
86
- "=== from visual-hierarchy-mapper ===\n" + <read .design/map/visual-hierarchy.md>,
87
- "=== from a11y-mapper ===\n" + <read .design/map/a11y.md>,
88
- "=== from motion-mapper ===\n" + <read .design/map/motion.md>
89
- ],
90
- directive: "Merge into a single cross-cutting DESIGN-PATTERNS.md summary preserving each mapper's top-level section header. Consolidate duplicates across mappers into single entries with source-agent names listed. Target ~120 lines.",
91
- output_shape: "markdown"
92
- })
93
-
94
- Wait for `## SYNTHESIS COMPLETE`. Capture the merged markdown, write to `.design/DESIGN-PATTERNS.md` (overwrite if present). This becomes the primary explore-stage input; per-mapper `.design/map/*.md` files remain on disk as drill-down evidence.
71
+ Each mapper has written its own `.design/map/*.md` (disjoint writes). Main-context doesn't need all 5 verbatim — invoke `synthesize` inline with `outputs:[<each file's text labelled "=== from <mapper> ==="]`, `directive: "Merge into cross-cutting DESIGN-PATTERNS.md preserving section headers; consolidate cross-mapper duplicates with source-agent names; target ~120 lines."`, `output_shape:"markdown"`.
95
72
 
96
- If `--only <name>` was passed (single mapper), skip this step entirely.
73
+ Wait for `## SYNTHESIS COMPLETE`. Write merged markdown to `.design/DESIGN-PATTERNS.md` (overwrite if present) — the primary explore-stage input; per-mapper files remain as drill-down evidence. `--only` (single mapper) skip this step.
97
74
 
98
75
  ## Step 4 — Collate
99
76
 
100
- Write `.design/DESIGN-MAP.md` — a thin index linking to each `.design/map/*.md` with a one-paragraph summary pulled from each file's header. If Step 3.5 ran, also cross-link to the synthesized `.design/DESIGN-PATTERNS.md` and note at the top: "See DESIGN-PATTERNS.md for the merged cross-cutting summary — this index preserves per-mapper drill-down."
77
+ Write `.design/DESIGN-MAP.md` — thin index linking to each `.design/map/*.md` with a one-paragraph summary from each file's header. If Step 3.5 ran, also cross-link to `.design/DESIGN-PATTERNS.md` and note at the top: "See DESIGN-PATTERNS.md for the merged cross-cutting summary — this index preserves per-mapper drill-down."
101
78
 
102
79
  ## Step 5 — Report
103
80
 
@@ -7,7 +7,7 @@ tools: Read, Write, AskUserQuestion
7
7
 
8
8
  # /gdd:new-cycle
9
9
 
10
- The cycle is the hierarchical unit above individual pipeline runs: **Cycle > Pipeline run > Wave > Task**. Each cycle has a goal, tracks its own decisions, and can span many pipeline runs.
10
+ The cycle is the hierarchical unit above individual pipeline runs: **Cycle > Pipeline run > Wave > Task**. Each cycle has a goal, tracks its own decisions, and can span many pipeline runs. See `./milestone-completeness-rubric.md` §"Cycle level" for what counts as cycle completion (used by `/gdd:complete-cycle` to close the cycle).
11
11
 
12
12
  ## Steps
13
13
 
@@ -16,6 +16,7 @@ The cycle is the hierarchical unit above individual pipeline runs: **Cycle > Pip
16
16
  3. Generate cycle ID: read `.design/CYCLES.md` if present, find the max `cycle-N`, increment. If CYCLES.md is missing, start at `cycle-1`.
17
17
  4. Update `.design/STATE.md` frontmatter: set `cycle: cycle-N`.
18
18
  5. Create or append to `.design/CYCLES.md`:
19
+
19
20
  ```markdown
20
21
  ## cycle-N: <goal>
21
22
  **Started**: <date>
@@ -24,6 +25,7 @@ The cycle is the hierarchical unit above individual pipeline runs: **Cycle > Pip
24
25
  **Pipeline runs**: 0
25
26
  **Decisions made**: 0
26
27
  ```
28
+
27
29
  6. Reset the `<decisions>` section in STATE.md for the new cycle. Preserve prior decisions by prepending a comment marker `<!-- prior cycle decisions archived in CYCLES.md -->`.
28
30
  7. Print: "Cycle cycle-N started. Run `@get-design-done brief` or `@get-design-done explore` to begin."
29
31