@hegemonart/get-design-done 1.59.3 → 1.59.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +61 -0
  4. package/SKILL.md +2 -0
  5. package/figma-plugin/README.md +61 -0
  6. package/figma-plugin/code.ts +36 -0
  7. package/figma-plugin/manifest.json +12 -0
  8. package/figma-plugin/package-lock.json +35 -0
  9. package/figma-plugin/package.json +12 -0
  10. package/figma-plugin/src/export-variables.ts +144 -0
  11. package/figma-plugin/src/payload-schema.ts +250 -0
  12. package/figma-plugin/tsconfig.json +16 -0
  13. package/figma-plugin/ui.html +44 -0
  14. package/hooks/budget-enforcer.ts +134 -7
  15. package/hooks/gdd-intel-trigger.js +3 -3
  16. package/package.json +6 -1
  17. package/reference/DEPRECATIONS.md +3 -3
  18. package/reference/live-mode-integration.md +1 -1
  19. package/reference/registry.json +1 -1
  20. package/reference/runtime-models.md +15 -15
  21. package/reference/schemas/generated.d.ts +4 -0
  22. package/reference/schemas/runtime-models.schema.json +5 -0
  23. package/reference/skill-metadata.md +4 -4
  24. package/reference/skill-placeholders.md +2 -2
  25. package/scripts/build-skills.cjs +146 -0
  26. package/scripts/generate-skill-frontmatter.cjs +243 -0
  27. package/scripts/lib/bandit-router/integration.cjs +38 -0
  28. package/scripts/lib/install/installer.cjs +133 -1
  29. package/scripts/lib/manifest/scaffolder.cjs +1 -1
  30. package/scripts/lib/manifest/schemas/skills.schema.json +1 -1
  31. package/scripts/lib/manifest/skills.json +1 -1
  32. package/scripts/lib/new-addendum.cjs +1 -1
  33. package/scripts/skill-templates/README.md +90 -0
  34. package/scripts/skill-templates/add-backlog/SKILL.md +48 -0
  35. package/scripts/skill-templates/analyze-dependencies/SKILL.md +95 -0
  36. package/scripts/skill-templates/apply-reflections/SKILL.md +109 -0
  37. package/scripts/skill-templates/apply-reflections/apply-reflections-procedure.md +170 -0
  38. package/scripts/skill-templates/audit/SKILL.md +79 -0
  39. package/scripts/skill-templates/bandit-reset/SKILL.md +91 -0
  40. package/scripts/skill-templates/bandit-status/SKILL.md +94 -0
  41. package/scripts/skill-templates/benchmark/SKILL.md +65 -0
  42. package/scripts/skill-templates/bootstrap-ds/SKILL.md +43 -0
  43. package/scripts/skill-templates/brief/SKILL.md +145 -0
  44. package/scripts/skill-templates/budget/SKILL.md +45 -0
  45. package/scripts/skill-templates/cache-manager/SKILL.md +66 -0
  46. package/scripts/skill-templates/cache-manager/cache-policy.md +126 -0
  47. package/scripts/skill-templates/check-update/SKILL.md +98 -0
  48. package/scripts/skill-templates/compare/SKILL.md +82 -0
  49. package/scripts/skill-templates/compare/compare-rubric.md +171 -0
  50. package/scripts/skill-templates/complete-cycle/SKILL.md +81 -0
  51. package/scripts/skill-templates/connections/SKILL.md +71 -0
  52. package/scripts/skill-templates/connections/connections-onboarding.md +608 -0
  53. package/scripts/skill-templates/context/SKILL.md +137 -0
  54. package/scripts/skill-templates/continue/SKILL.md +24 -0
  55. package/scripts/skill-templates/darkmode/SKILL.md +76 -0
  56. package/scripts/skill-templates/darkmode/darkmode-audit-procedure.md +258 -0
  57. package/scripts/skill-templates/debug/SKILL.md +41 -0
  58. package/scripts/skill-templates/debug/debug-feedback-loops.md +119 -0
  59. package/scripts/skill-templates/design/SKILL.md +118 -0
  60. package/scripts/skill-templates/design/design-procedure.md +304 -0
  61. package/scripts/skill-templates/discuss/SKILL.md +96 -0
  62. package/scripts/skill-templates/do/SKILL.md +45 -0
  63. package/scripts/skill-templates/explore/SKILL.md +118 -0
  64. package/scripts/skill-templates/explore/explore-procedure.md +267 -0
  65. package/scripts/skill-templates/export/SKILL.md +30 -0
  66. package/scripts/skill-templates/extract-learnings/SKILL.md +114 -0
  67. package/scripts/skill-templates/fast/SKILL.md +91 -0
  68. package/scripts/skill-templates/figma-extract/SKILL.md +64 -0
  69. package/scripts/skill-templates/figma-write/SKILL.md +50 -0
  70. package/scripts/skill-templates/graphify/SKILL.md +49 -0
  71. package/scripts/skill-templates/health/SKILL.md +99 -0
  72. package/scripts/skill-templates/health/health-mcp-detection.md +44 -0
  73. package/scripts/skill-templates/health/health-skill-length-report.md +69 -0
  74. package/scripts/skill-templates/help/SKILL.md +60 -0
  75. package/scripts/skill-templates/instinct/SKILL.md +111 -0
  76. package/scripts/skill-templates/list-assumptions/SKILL.md +61 -0
  77. package/scripts/skill-templates/list-pins/SKILL.md +27 -0
  78. package/scripts/skill-templates/live/SKILL.md +98 -0
  79. package/scripts/skill-templates/locale/SKILL.md +51 -0
  80. package/scripts/skill-templates/map/SKILL.md +89 -0
  81. package/scripts/skill-templates/migrate/SKILL.md +70 -0
  82. package/scripts/skill-templates/migrate-context/SKILL.md +123 -0
  83. package/scripts/skill-templates/new-addendum/SKILL.md +81 -0
  84. package/scripts/skill-templates/new-cycle/SKILL.md +37 -0
  85. package/scripts/skill-templates/new-project/SKILL.md +53 -0
  86. package/scripts/skill-templates/new-skill/SKILL.md +90 -0
  87. package/scripts/skill-templates/next/SKILL.md +68 -0
  88. package/scripts/skill-templates/note/SKILL.md +48 -0
  89. package/scripts/skill-templates/openrouter-status/SKILL.md +86 -0
  90. package/scripts/skill-templates/optimize/SKILL.md +97 -0
  91. package/scripts/skill-templates/override/SKILL.md +86 -0
  92. package/scripts/skill-templates/paper-write/SKILL.md +54 -0
  93. package/scripts/skill-templates/pause/SKILL.md +77 -0
  94. package/scripts/skill-templates/peer-cli-add/SKILL.md +88 -0
  95. package/scripts/skill-templates/peer-cli-add/peer-cli-protocol.md +161 -0
  96. package/scripts/skill-templates/peer-cli-customize/SKILL.md +89 -0
  97. package/scripts/skill-templates/peers/SKILL.md +96 -0
  98. package/scripts/skill-templates/pencil-write/SKILL.md +54 -0
  99. package/scripts/skill-templates/pin/SKILL.md +37 -0
  100. package/scripts/skill-templates/plan/SKILL.md +105 -0
  101. package/scripts/skill-templates/plan/plan-procedure.md +278 -0
  102. package/scripts/skill-templates/plant-seed/SKILL.md +48 -0
  103. package/scripts/skill-templates/pr-branch/SKILL.md +32 -0
  104. package/scripts/skill-templates/progress/SKILL.md +107 -0
  105. package/scripts/skill-templates/quality-gate/SKILL.md +90 -0
  106. package/scripts/skill-templates/quality-gate/threat-modeling.md +101 -0
  107. package/scripts/skill-templates/quick/SKILL.md +44 -0
  108. package/scripts/skill-templates/reapply-patches/SKILL.md +32 -0
  109. package/scripts/skill-templates/recall/SKILL.md +75 -0
  110. package/scripts/skill-templates/reflect/SKILL.md +85 -0
  111. package/scripts/skill-templates/reflect/procedures/capability-gap-scan.md +119 -0
  112. package/scripts/skill-templates/report-issue/SKILL.md +53 -0
  113. package/scripts/skill-templates/report-issue/report-issue-procedure.md +119 -0
  114. package/scripts/skill-templates/resume/SKILL.md +93 -0
  115. package/scripts/skill-templates/review-backlog/SKILL.md +46 -0
  116. package/scripts/skill-templates/review-decisions/SKILL.md +42 -0
  117. package/scripts/skill-templates/roi/SKILL.md +54 -0
  118. package/scripts/skill-templates/rollout-status/SKILL.md +35 -0
  119. package/scripts/skill-templates/router/SKILL.md +89 -0
  120. package/scripts/skill-templates/router/capability-gap-emitter.md +65 -0
  121. package/scripts/skill-templates/router/router-pick-emitter.md +78 -0
  122. package/scripts/skill-templates/router/router-rules.md +84 -0
  123. package/scripts/skill-templates/settings/SKILL.md +87 -0
  124. package/scripts/skill-templates/ship/SKILL.md +48 -0
  125. package/scripts/skill-templates/sketch/SKILL.md +78 -0
  126. package/scripts/skill-templates/sketch-wrap-up/SKILL.md +92 -0
  127. package/scripts/skill-templates/skill-manifest/SKILL.md +79 -0
  128. package/scripts/skill-templates/spike/SKILL.md +67 -0
  129. package/scripts/skill-templates/spike-wrap-up/SKILL.md +86 -0
  130. package/scripts/skill-templates/start/SKILL.md +67 -0
  131. package/scripts/skill-templates/start/start-procedure.md +115 -0
  132. package/scripts/skill-templates/state/SKILL.md +106 -0
  133. package/scripts/skill-templates/stats/SKILL.md +51 -0
  134. package/scripts/skill-templates/style/SKILL.md +71 -0
  135. package/scripts/skill-templates/style/style-doc-procedure.md +150 -0
  136. package/scripts/skill-templates/synthesize/SKILL.md +94 -0
  137. package/scripts/skill-templates/timeline/SKILL.md +66 -0
  138. package/scripts/skill-templates/todo/SKILL.md +64 -0
  139. package/scripts/skill-templates/turn-closeout/SKILL.md +95 -0
  140. package/scripts/skill-templates/undo/SKILL.md +31 -0
  141. package/scripts/skill-templates/unlock-decision/SKILL.md +54 -0
  142. package/scripts/skill-templates/unpin/SKILL.md +31 -0
  143. package/scripts/skill-templates/update/SKILL.md +56 -0
  144. package/scripts/skill-templates/using-gdd/SKILL.md +78 -0
  145. package/scripts/skill-templates/verify/SKILL.md +113 -0
  146. package/scripts/skill-templates/verify/verify-procedure.md +511 -0
  147. package/scripts/skill-templates/warm-cache/SKILL.md +81 -0
  148. package/scripts/skill-templates/watch-authorities/SKILL.md +82 -0
  149. package/scripts/skill-templates/zoom-out/SKILL.md +26 -0
  150. package/sdk/cli/commands/build.ts +2 -2
  151. package/sdk/cli/index.js +2 -2
  152. package/sdk/cli/index.ts +1 -1
  153. package/skills/README.md +22 -14
  154. package/skills/help/SKILL.md +28 -55
  155. package/skills/new-skill/SKILL.md +5 -5
@@ -0,0 +1,608 @@
1
+ ---
2
+ name: connections-onboarding
3
+ type: meta-rules
4
+ version: 1.0.0
5
+ phase: 28.5
6
+ tags: [connections, onboarding, probes, mcp, wizard, procedure, extracted]
7
+ last_updated: 2026-05-18
8
+ ---
9
+
10
+ Source: extracted from `skills/connections/SKILL.md` (Phase 28.5 rework - D-10 extract-then-link).
11
+ The skill's essential routing + invocation-mode dispatch stays in `../skills/connections/SKILL.md`;
12
+ this file holds the 33 probe scripts, bucket categorization, per-connection setup screen,
13
+ auto-run eligibility matrix, value-prop one-liners, and STATE.md / config.json write contracts.
14
+
15
+ # Connections Onboarding Procedure
16
+
17
+ Detailed procedure for the `{{command_prefix}}connections` interactive wizard - companion to
18
+ `../skills/connections/SKILL.md`. Read this file when executing a specific probe, deciding
19
+ auto-run vs manual, writing config.json, or merging STATE.md `<connections>`. The SKILL.md
20
+ keeps the essential top-level flow + AskUserQuestion routing; this file holds the deep
21
+ methodology + per-connection detail.
22
+
23
+ For the cross-skill probe pattern + connection handshake (ToolSearch → live call → STATE.md
24
+ write), see `./shared-preamble.md#connection-handshake-summary`. The canonical per-connection
25
+ specs (setup commands, OAuth flows, capability matrix) live in `../connections/<name>.md` -
26
+ this file does NOT duplicate them; it points at them by name.
27
+
28
+ ---
29
+
30
+ ## Step 1 - Probe all 33 connections
31
+
32
+ Run every probe below in order. MCP probes call `ToolSearch` first (deferred tools fail silently without it). Write every result to `STATE.md <connections>` when done.
33
+
34
+ ### MCP-based probes
35
+
36
+ **figma:**
37
+ ```
38
+ ToolSearch({ query: "select:mcp__figma__get_metadata", max_results: 1 })
39
+ → Empty → figma: not_configured
40
+ → Non-empty → call mcp__figma__get_metadata
41
+ Success → figma: available
42
+ Error → figma: unavailable
43
+ ```
44
+
45
+ **refero:**
46
+ ```
47
+ ToolSearch({ query: "refero", max_results: 5 })
48
+ → Empty → refero: not_configured
49
+ → Non-empty → refero: available
50
+ ```
51
+
52
+ **preview:**
53
+ ```
54
+ ToolSearch({ query: "Claude_Preview", max_results: 5 })
55
+ → Empty → preview: not_configured
56
+ → Non-empty → call mcp__Claude_Preview__preview_list
57
+ Success → preview: available
58
+ Error → preview: unavailable
59
+ ```
60
+
61
+ **pinterest:**
62
+ ```
63
+ ToolSearch({ query: "mcp-pinterest", max_results: 5 })
64
+ → Empty → pinterest: not_configured
65
+ → Non-empty → pinterest: available
66
+ ```
67
+
68
+ **paper-design:**
69
+ ```
70
+ ToolSearch({ query: "mcp__paper", max_results: 5 })
71
+ → Empty → paper_design: not_configured
72
+ → Non-empty → paper_design: available
73
+ ```
74
+
75
+ **21st-dev:**
76
+ ```
77
+ ToolSearch({ query: "mcp__21st", max_results: 5 })
78
+ → Empty → twenty_first: not_configured
79
+ → Non-empty → twenty_first: available
80
+ ```
81
+
82
+ **magic-patterns:**
83
+ ```
84
+ ToolSearch({ query: "mcp__magic_patterns", max_results: 5 })
85
+ → Empty → magic_patterns: not_configured
86
+ → Non-empty → magic_patterns: available
87
+ ```
88
+
89
+ **lazyweb:** (discover Tier 1 - free, tried first; D-01)
90
+ ```
91
+ ToolSearch({ query: "lazyweb", max_results: 5 })
92
+ → Empty → lazyweb: not_configured
93
+ → Non-empty → lazyweb: available
94
+ ```
95
+
96
+ **mobbin:** (discover Tier 2 - paid, mobile/flow-level; D-01)
97
+ ```
98
+ ToolSearch({ query: "mobbin", max_results: 5 })
99
+ → Empty → mobbin: not_configured
100
+ → Non-empty → mobbin: available
101
+ ```
102
+
103
+ **slack:** (notify - Team Surfaces, env-based)
104
+ ```
105
+ Bash: test -n "$SLACK_WEBHOOK_URL" (and GDD_DISABLE_SLACK != 1)
106
+ → empty / disabled → slack: not_configured
107
+ → non-empty → slack: available
108
+ ```
109
+
110
+ **discord:** (notify - parity, env-based)
111
+ ```
112
+ Bash: test -n "$DISCORD_WEBHOOK_URL" (and GDD_DISABLE_DISCORD != 1)
113
+ → empty / disabled → discord: not_configured
114
+ → non-empty → discord: available
115
+ ```
116
+
117
+ **linear:** (ticket-sync - MCP)
118
+ ```
119
+ ToolSearch({ query: "linear", max_results: 5 })
120
+ → Empty / GDD_DISABLE_LINEAR=1 → linear: not_configured
121
+ → Non-empty → linear: available
122
+ ```
123
+
124
+ **jira:** (ticket-sync - Atlassian MCP)
125
+ ```
126
+ ToolSearch({ query: "atlassian jira", max_results: 5 })
127
+ → Empty / GDD_DISABLE_JIRA=1 → jira: not_configured
128
+ → Non-empty → jira: available
129
+ ```
130
+
131
+ **notion:** (export write-path - MCP)
132
+ ```
133
+ ToolSearch({ query: "notion", max_results: 5 })
134
+ → Empty / GDD_DISABLE_NOTION=1 → notion: not_configured
135
+ → Non-empty → notion: available
136
+ ```
137
+
138
+ ### Non-MCP probes
139
+
140
+ **storybook** (HTTP):
141
+ ```
142
+ Bash: curl -sf http://localhost:6006/index.json 2>/dev/null
143
+ → Success → storybook: available
144
+ → Fail → curl -sf http://localhost:6006/stories.json 2>/dev/null
145
+ Success → storybook: available
146
+ Fail → storybook: not_configured
147
+ ```
148
+
149
+ **chromatic** (CLI + env):
150
+ ```
151
+ Bash: command -v chromatic >/dev/null 2>&1 || npx --yes chromatic --version 2>/dev/null
152
+ → Fail (non-zero) → chromatic: not_configured
153
+ → Success → check env CHROMATIC_PROJECT_TOKEN
154
+ Empty → chromatic: unavailable
155
+ Set → chromatic: available
156
+ ```
157
+
158
+ **graphify** (native CLI + file):
159
+ ```
160
+ Bash: node -e "try{const c=JSON.parse(require('fs').readFileSync('.design/config.json','utf8'));process.stdout.write(String(c.graphify?.enabled===true))}catch{process.stdout.write('false')}"
161
+ → false → graphify: not_configured
162
+ → true → Bash: node bin/gdd-graph status --format json
163
+ → { configured: true, exists: false } → graphify: unavailable
164
+ → { configured: true, exists: true } → graphify: available
165
+ ```
166
+
167
+ **pencil-dev** (file probe):
168
+ ```
169
+ Bash: find . -name "*.pen" -not -path "*/node_modules/*" -not -path "*/.git/*" 2>/dev/null | head -1
170
+ → Empty → pencil_dev: not_configured
171
+ → Non-empty → pencil_dev: available
172
+ ```
173
+
174
+ **claude-design** (file probe - handoff bundle):
175
+ ```
176
+ Bash: ls .design/handoff/ 2>/dev/null || find . -maxdepth 3 \
177
+ \( -name "*.claude-design.html" -o -name "*.claude-design.zip" \
178
+ -o -name "claude-design-*.html" \) 2>/dev/null | head -1
179
+ → Empty → claude_design: not_configured
180
+ → Non-empty → claude_design: available
181
+ ```
182
+
183
+ **lottie** (file probe - Lottie JSON motion export):
184
+ ```
185
+ Bash: find . -name "*.json" -not -path "*/node_modules/*" 2>/dev/null | head (confirm the Lottie signature: top-level v / fr / layers)
186
+ grep -lE '"lottie-web"|@lottiefiles|lottie-react' package.json 2>/dev/null
187
+ → Lottie exports or a lottie dep found → lottie: available
188
+ → none → lottie: not_configured
189
+ ```
190
+
191
+ **rive** (file probe - Rive .riv motion export):
192
+ ```
193
+ Bash: find . -name "*.riv" -not -path "*/node_modules/*" 2>/dev/null | head
194
+ grep -E '@rive-app|rive-react' package.json 2>/dev/null
195
+ → .riv files or a @rive-app dep found → rive: available
196
+ → none → rive: not_configured
197
+ ```
198
+
199
+ **framer:** (AI-native Wave 2 - canvas; MCP or API token)
200
+ ```
201
+ ToolSearch({ query: "framer", max_results: 5 })
202
+ → Empty → framer: not_configured
203
+ → Non-empty → framer: available
204
+ ```
205
+
206
+ **penpot:** (AI-native Wave 2 - canvas; self-hosted URL/token or cloud)
207
+ ```
208
+ ToolSearch({ query: "penpot", max_results: 5 })
209
+ → Empty → penpot: not_configured
210
+ → Non-empty → penpot: available
211
+ ```
212
+
213
+ **webflow:** (AI-native Wave 2 - generator; MCP or WEBFLOW token)
214
+ ```
215
+ ToolSearch({ query: "webflow", max_results: 5 })
216
+ → Empty → webflow: not_configured
217
+ → Non-empty → webflow: available
218
+ ```
219
+
220
+ **v0-dev:** (AI-native Wave 2 - generator; MCP-first, else V0_API_KEY)
221
+ ```
222
+ ToolSearch({ query: "v0", max_results: 5 })
223
+ → Empty → v0-dev: not_configured
224
+ → Non-empty → v0-dev: available
225
+ ```
226
+
227
+ **plasmic:** (AI-native Wave 2 - generator+canvas; MCP or token)
228
+ ```
229
+ ToolSearch({ query: "plasmic", max_results: 5 })
230
+ → Empty → plasmic: not_configured
231
+ → Non-empty → plasmic: available
232
+ ```
233
+
234
+ **builder-io:** (AI-native Wave 2 - generator; MCP-first, else BUILDER_API_KEY)
235
+ ```
236
+ ToolSearch({ query: "builder", max_results: 5 })
237
+ → Empty → builder-io: not_configured
238
+ → Non-empty → builder-io: available
239
+ ```
240
+
241
+ **launchdarkly:** (Outcome - experiment-source; read-only A/B)
242
+ ```
243
+ ToolSearch({ query: "launchdarkly", max_results: 5 }) (else check the platform API-key env)
244
+ → Empty / GDD_DISABLE_LAUNCHDARKLY=1 → launchdarkly: not_configured
245
+ → Non-empty / key set → launchdarkly: available
246
+ ```
247
+
248
+ **statsig:** (Outcome - experiment-source; read-only)
249
+ ```
250
+ ToolSearch({ query: "statsig", max_results: 5 }) (else check the platform API-key env)
251
+ → Empty / GDD_DISABLE_STATSIG=1 → statsig: not_configured
252
+ → Non-empty / key set → statsig: available
253
+ ```
254
+
255
+ **growthbook:** (Outcome - experiment-source; self-host/cloud)
256
+ ```
257
+ ToolSearch({ query: "growthbook", max_results: 5 }) (else check the platform API-key env)
258
+ → Empty / GDD_DISABLE_GROWTHBOOK=1 → growthbook: not_configured
259
+ → Non-empty / key set → growthbook: available
260
+ ```
261
+
262
+ **usertesting:** (Outcome - user-research; pseudonymize-first)
263
+ ```
264
+ ToolSearch({ query: "usertesting", max_results: 5 }) (else check the platform API-key env)
265
+ → Empty / GDD_DISABLE_USERTESTING=1 → usertesting: not_configured
266
+ → Non-empty / key set → usertesting: available
267
+ ```
268
+
269
+ **maze:** (Outcome - user-research; pseudonymize-first)
270
+ ```
271
+ ToolSearch({ query: "maze", max_results: 5 }) (else check the platform API-key env)
272
+ → Empty / GDD_DISABLE_MAZE=1 → maze: not_configured
273
+ → Non-empty / key set → maze: available
274
+ ```
275
+
276
+ **hotjar:** (Outcome - user-research; indexed insights only)
277
+ ```
278
+ ToolSearch({ query: "hotjar", max_results: 5 }) (else check the platform API-key env)
279
+ → Empty / GDD_DISABLE_HOTJAR=1 → hotjar: not_configured
280
+ → Non-empty / key set → hotjar: available
281
+ ```
282
+
283
+ After all 33 probes complete, merge results into `STATE.md <connections>`. Preserve the three-value schema verbatim (`available | unavailable | not_configured`). Do not add new values.
284
+
285
+ ---
286
+
287
+ ## Step 2 - Bucket categorization
288
+
289
+ ### Project-hint detection
290
+
291
+ Run once, cache in-memory:
292
+
293
+ ```bash
294
+ HAS_TAILWIND=$( ls tailwind.config.* 2>/dev/null | head -1 )
295
+ HAS_STORYBOOK_DIR=$( test -d .storybook && echo yes )
296
+ HAS_PEN_FILES=$( find . -name "*.pen" -not -path "*/node_modules/*" 2>/dev/null | head -1 )
297
+ HAS_REACT=$( grep -l '"react"' package.json 2>/dev/null )
298
+ HAS_FIGMA_HINT=$( grep -r "figma\.com/file" -l . --include="*.md" 2>/dev/null | head -1 )
299
+ ```
300
+
301
+ ### Bucketing rules
302
+
303
+ | Bucket | Criteria |
304
+ |---|---|
305
+ | **available** | probe returned `available` |
306
+ | **recommended** | probe returned `not_configured` AND matches a project hint below |
307
+ | **optional** | probe returned `not_configured` AND no project hint match |
308
+ | **skipped** | name appears in `config.json connections.skip[]` |
309
+ | **unavailable** | probe returned `unavailable` (configured but broken - needs attention) |
310
+
311
+ ### Recommendation mapping
312
+
313
+ | Project hint | Recommend |
314
+ |---|---|
315
+ | `HAS_TAILWIND` or `HAS_FIGMA_HINT` | figma |
316
+ | `HAS_STORYBOOK_DIR` or storybook available | storybook, chromatic |
317
+ | `HAS_PEN_FILES` | pencil-dev |
318
+ | `HAS_REACT` | 21st-dev, magic-patterns |
319
+ | Always | refero, preview, lazyweb (free - cost-aware default, D-01) |
320
+
321
+ ---
322
+
323
+ ## Step 3 - Summary table
324
+
325
+ ```
326
+ ┌── Connections ──────────────────────────
327
+ Available (<N>)
328
+ • <name> <one-line detail from probe>
329
+ ...
330
+
331
+ Unavailable (<N>) — configured but not responding
332
+ ⚠ <name> <reason>
333
+ ...
334
+
335
+ Recommended for this project (<N>)
336
+ ▸ <name> <one-line value prop>
337
+ ...
338
+
339
+ Optional (<N>)
340
+ ▸ <name> <one-line value prop>
341
+ ...
342
+
343
+ Skipped by you (<N>)
344
+ · <name> (re-enable: {{command_prefix}}connections <name>)
345
+ ─────────────────────────────────────────
346
+ ```
347
+
348
+ One-line value props (use verbatim):
349
+
350
+ | Name | Value prop |
351
+ |---|---|
352
+ | figma | design-token extraction, annotations, Code Connect |
353
+ | refero | design reference search for discover stage |
354
+ | preview | live browser screenshots for verify visual checks |
355
+ | storybook | component inventory + per-story a11y |
356
+ | chromatic | visual regression against your Storybook baseline |
357
+ | graphify | knowledge-graph queries over component–token–decision |
358
+ | pinterest | visual inspiration collection |
359
+ | claude-design | Claude Design handoff bundle ingestion |
360
+ | paper-design | bidirectional canvas (free tier: 100 calls/week) |
361
+ | pencil-dev | `.pen` spec files as canonical design source |
362
+ | 21st-dev | AI component generator (marketplace search) |
363
+ | magic-patterns | AI component generator (DS-aware) |
364
+ | lazyweb | free design reference search (pricing/onboarding/redesign) - discover Tier 1 |
365
+ | mobbin | curated mobile + flow-level references (paid) - discover Tier 2 |
366
+ | slack | notify - route verify-fail/audit-pass/ship to a Slack channel (redacted) |
367
+ | discord | notify - route pipeline events to a Discord channel (redacted) |
368
+ | linear | ticket-sync - link a cycle to a Linear issue; read comments + transition on completion |
369
+ | jira | ticket-sync - parity with Linear via the Atlassian MCP |
370
+ | notion | export - `{{command_prefix}}export --format notion` writes a stakeholder page (degrade-to-HTML) |
371
+ | lottie | verify - Lottie JSON motion check (frame-rate / duration / bloat / perf-budget), WARN-never-block |
372
+ | rive | verify - Rive `.riv` motion check (size + state-machine reachability via the opt-in runtime), WARN-never-block |
373
+ | framer | design - read Framer frames + write proposals (canvas, Wave 2) |
374
+ | penpot | design - open-source Figma alt; read boards (self-hosted or cloud) |
375
+ | webflow | design - read site structure as an adaptation source (Wave 2) |
376
+ | v0-dev | generator - Vercel v0 prompt→component (MCP-first → REST + V0_API_KEY) |
377
+ | plasmic | generator + canvas - emit code + read the Plasmic canvas |
378
+ | builder-io | generator - Builder.io Visual Copilot (pull-only this phase) |
379
+ | launchdarkly | outcome - read A/B results → design_arms posterior (experiment-source) |
380
+ | statsig | outcome - read experiment/pulse results → design_arms (experiment-source) |
381
+ | growthbook | outcome - read experiment results → design_arms (experiment-source; OSS) |
382
+ | usertesting | outcome - read test reports → brief findings (user-research; pseudonymized) |
383
+ | maze | outcome - read usability metrics → brief findings (user-research; pseudonymized) |
384
+ | hotjar | outcome - read indexed insights → brief findings (user-research; pseudonymized) |
385
+
386
+ ---
387
+
388
+ ## Step 4 - Route by mode
389
+
390
+ ### Mode: `list` or `--auto`
391
+
392
+ After printing the summary, write STATE.md, append one-line hint: `Run {{command_prefix}}connections to configure.` Emit `## CONNECTIONS COMPLETE`. Exit.
393
+
394
+ ### Mode: `<connection-name>`
395
+
396
+ Skip the top-level AskUserQuestion. Jump directly to Step 5 for that single connection.
397
+
398
+ ### Mode: interactive (default)
399
+
400
+ AskUserQuestion:
401
+
402
+ ```
403
+ question: "What would you like to do?"
404
+ options:
405
+ - "Configure recommended (<N>)" → loop Step 5 over recommended bucket
406
+ - "Pick one by one" → loop Step 5 over all not_configured
407
+ - "Configure all optional" → loop Step 5 over optional bucket
408
+ - "Re-check a specific connection" → prompt for name, run Step 1 for it only
409
+ - "Exit" → emit ## CONNECTIONS COMPLETE, exit
410
+ ```
411
+
412
+ If recommended bucket is empty, swap that option for "Show all 33 and pick."
413
+
414
+ ---
415
+
416
+ ## Step 5 - Per-connection setup screen
417
+
418
+ ### 5.1 Read the spec
419
+
420
+ Read `connections/<name>.md`. Extract:
421
+ - The "Setup" section (prerequisites + install command)
422
+ - The "Contributes at" row from the capability matrix (stages affected)
423
+
424
+ ### 5.2 Present the screen
425
+
426
+ Print:
427
+
428
+ ```
429
+ ┌─ <name> ────────────────────────────────────────
430
+ │ Status: <current probe result>
431
+ │ Contributes: <one-line value prop from Step 3>
432
+ │ Stages affected: <list from capability matrix>
433
+ │ Requires: <prereqs line from spec>
434
+
435
+ │ Setup command:
436
+ │ <install command from spec>
437
+ └─────────────────────────────────────────────────
438
+ ```
439
+
440
+ ### 5.3 AskUserQuestion
441
+
442
+ ```
443
+ question: "Install <name>?"
444
+ options:
445
+ - "Run install command now" → 5.4a (auto-run path)
446
+ - "Copy command — I'll run it" → 5.4b (manual path)
447
+ - "Skip for now" → 5.4c (no config change)
448
+ - "Never ask again" → 5.4d (add to skip list)
449
+ ```
450
+
451
+ ### 5.4 Auto-run eligibility matrix
452
+
453
+ **Only auto-run if the install command is reversible.** The matrix:
454
+
455
+ | Connection | Install kind | Auto-run? | Rationale |
456
+ |---|---|---|---|
457
+ | figma | `claude mcp add` (remote MCP) | ✓ yes | Reversible via `claude mcp remove` |
458
+ | preview | built-in, no install | - | Already present or not - no command to run |
459
+ | paper-design | `claude mcp add` | ✓ yes | Reversible |
460
+ | magic-patterns | `claude mcp add` | ✓ yes | Reversible |
461
+ | pinterest | `npx -y @smithery/cli install` | ✓ yes | Smithery CLI manages entry |
462
+ | refero | vendor-specific install | ✗ no | Vendor doesn't document a stable CLI - print link only |
463
+ | storybook | `npx storybook init` | ✗ no | Mutates repo files - force manual |
464
+ | chromatic | `npm install --save-dev chromatic` + env var | ✗ no | Writes package.json + needs `CHROMATIC_PROJECT_TOKEN` - force manual |
465
+ | graphify | `pip install` + `gsd-tools config-set` | ✗ no | Python install + cross-tool config - force manual |
466
+ | 21st-dev | `npx @21st-dev/magic init` + env var | ✗ no | Env var required - force manual |
467
+ | pencil-dev | VS Code extension | ✗ no | IDE-level install - force manual |
468
+ | claude-design | handoff bundle drop | ✗ no | User-driven file drop - force manual |
469
+ | mobbin | `claude mcp add mobbin --transport http https://api.mobbin.com/mcp` | ✓ yes | Reversible MCP add; no credential filesystem-write (OAuth on first call) |
470
+ | lazyweb | `claude plugin install lazyweb@lazyweb` (after token write to `~/.lazyweb/`) | ✗ no | Writes a bearer token to disk - force manual (user-consent step) |
471
+ | slack | set `SLACK_WEBHOOK_URL` env (Slack Incoming Webhook URL) | ✗ no | Env credential - user sets it; no install command (degrade-to-noop when unset) |
472
+ | discord | set `DISCORD_WEBHOOK_URL` env (Discord channel Webhook URL) | ✗ no | Env credential - user sets it; no install command (degrade-to-noop when unset) |
473
+ | linear | `claude mcp add linear ...` (Linear MCP) | ✓ yes | Reversible MCP add; OAuth on first call, no credential filesystem-write |
474
+ | jira | `claude mcp add atlassian ...` (Atlassian MCP) | ✓ yes | Reversible MCP add; OAuth on first call |
475
+ | notion | `claude mcp add notion ...` (Notion MCP) | ✓ yes | Reversible MCP add; OAuth on first call |
476
+ | lottie | (file-based - no install; drop a Lottie `.json` export in the repo) | n/a | Detected from Lottie exports / a `lottie-web` dep; live player opt-in |
477
+ | rive | (file-based - no install; add a `.riv` export / `@rive-app` dep) | n/a | Detected from `.riv` files / a `@rive-app` dep; Rive runtime opt-in |
478
+ | framer | `claude mcp add framer ...` (or API token) | ✓ yes | Reversible MCP add; canvas-category |
479
+ | penpot | `claude mcp add penpot ...` (self-hosted URL or cloud + token) | ✓ yes | Reversible; self-host vs cloud |
480
+ | webflow | `claude mcp add webflow ...` (or WEBFLOW token) | ✓ yes | Reversible; reads structure, not CMS authoring |
481
+ | v0-dev | `claude mcp add v0 ...` (or V0_API_KEY) | ✓ yes | Reversible; MCP-first → REST fallback |
482
+ | plasmic | `claude mcp add plasmic ...` (or token) | ✓ yes | Reversible; dual canvas+generator |
483
+ | builder-io | `claude mcp add builder ...` (or BUILDER_API_KEY) | ✓ yes | Reversible; pull-only this phase |
484
+ | launchdarkly | (set `LAUNCHDARKLY_API_KEY` / add the LaunchDarkly MCP) | ✓ yes | Reversible; read-only experiment-source |
485
+ | statsig | (set `STATSIG_API_KEY` / add the Statsig MCP) | ✓ yes | Reversible; read-only experiment-source |
486
+ | growthbook | (set `GROWTHBOOK_API_KEY` [+ host] / add the MCP) | ✓ yes | Reversible; self-host or cloud |
487
+ | usertesting | (set `USERTESTING_API_KEY` / add the MCP) | ✓ yes | Reversible; read-only; pseudonymize-first |
488
+ | maze | (set `MAZE_API_KEY` / add the MCP) | ✓ yes | Reversible; read-only; pseudonymize-first |
489
+ | hotjar | (set `HOTJAR_API_KEY` / add the MCP) | ✓ yes | Reversible; indexed insights only; pseudonymize-first |
490
+
491
+ For non-auto-run connections, hide the "Run install command now" option entirely in 5.3.
492
+
493
+ ### 5.4a - Auto-run path
494
+
495
+ Bash the install command. On success: print stdout, print `"Installed. Session restart required before <name> is usable."`, append `<name>` to `.design/config.json > connections_onboarding.pending_verification[]`.
496
+
497
+ On failure: print stderr, print `"Install failed. Copy the command and run it manually, then rerun {{command_prefix}}connections <name> to verify."` Do not record pending_verification.
498
+
499
+ ### 5.4b - Manual path
500
+
501
+ Print the install command inside a fenced code block for easy copy. Print: `"After installing, restart the session and run {{command_prefix}}connections <name> to verify."` Append `<name>` to `connections_onboarding.pending_verification[]`.
502
+
503
+ ### 5.4c - Skip for now
504
+
505
+ No config change. Continue loop.
506
+
507
+ ### 5.4d - Never ask again
508
+
509
+ Read `.design/config.json`. Ensure `connections.skip` is an array. Append `<name>` if not present. Write back.
510
+
511
+ ### 5.5 After every per-connection screen
512
+
513
+ If mode is `<connection-name>` (single-target invocation), skip straight to Step 6. Otherwise continue the loop.
514
+
515
+ ---
516
+
517
+ ## Step 6 - Verification pass
518
+
519
+ Re-probe every connection whose name appears in `connections_onboarding.pending_verification[]`. For each:
520
+
521
+ - Now `available` → remove from `pending_verification[]`. Update STATE.md.
522
+ - Still `not_configured` → leave in `pending_verification[]`. User probably needs a session restart.
523
+ - Now `unavailable` → leave in `pending_verification[]`, print: `"<name> installed but probe errored — OAuth or auth may be required."`
524
+
525
+ Write STATE.md `<connections>` and `.design/config.json`.
526
+
527
+ ### Print summary
528
+
529
+ ```
530
+ ┌── Setup complete ──
531
+ Newly available: <list>
532
+ Still pending (needs session restart): <list>
533
+ Skipped permanently: <list>
534
+ ─────────────────────
535
+ ```
536
+
537
+ If any pending remain, print: `"After restarting the session, run {{command_prefix}}connections to verify remaining."`
538
+
539
+ If no pending remain and at least one install happened, print: `"Run {{command_prefix}}scan to start your first cycle, or {{command_prefix}}brief to capture a design problem."`
540
+
541
+ ---
542
+
543
+ ## Resumability
544
+
545
+ If `.design/config.json > connections_onboarding.pending_verification[]` is non-empty at entry, this is a resumed session (most likely after a restart for a just-installed MCP):
546
+
547
+ 1. Print: `"Resuming — <N> connections pending verification: <list>"`
548
+ 2. Run Step 6 (verification pass) immediately.
549
+ 3. If resumption completes cleanly (empty pending list), emit `## CONNECTIONS COMPLETE` and exit - do not re-enter the wizard.
550
+ 4. Otherwise, fall through to Step 3 (summary) with the still-pending connections visible as `unavailable`.
551
+
552
+ ---
553
+
554
+ ## Config file writes
555
+
556
+ ### `.design/config.json > connections.skip[]`
557
+
558
+ Pattern: read whole file, merge one field, write back (matches `{{command_prefix}}settings` pattern).
559
+
560
+ ```json
561
+ {
562
+ "model_profile": "balanced",
563
+ "parallelism": { ... },
564
+ "connections": {
565
+ "skip": ["pinterest", "graphify"]
566
+ }
567
+ }
568
+ ```
569
+
570
+ ### `.design/config.json > connections_onboarding` (scratch block)
571
+
572
+ Deleted automatically when empty after a verification pass:
573
+
574
+ ```json
575
+ {
576
+ "connections_onboarding": {
577
+ "started_at": "<ISO 8601>",
578
+ "pending_verification": ["figma", "chromatic"]
579
+ }
580
+ }
581
+ ```
582
+
583
+ ### `STATE.md <connections>` write
584
+
585
+ Always merge, never replace - other stages may have written entries this skill did not probe.
586
+
587
+ Key normalization:
588
+ - `21st-dev` → `twenty_first` in STATE.md (no leading digit in XML-ish key).
589
+ - `magic-patterns` → `magic_patterns`.
590
+ - `paper-design` → `paper_design`.
591
+ - `pencil-dev` → `pencil_dev`.
592
+ - `claude-design` → `claude_design`.
593
+ - All other names map 1:1.
594
+
595
+ ---
596
+
597
+ ## Do Not
598
+
599
+ - Never run `npm install -g` globals automatically. Always force manual path for globals.
600
+ - Never write to `~/.bashrc`, `~/.zshrc`, or shell RC files. Env-var setup is always manual.
601
+ - Never run `claude mcp add` without explicit `"Run install command now"` confirmation.
602
+ - Never auto-restart the Claude Code session. Print the instruction and let the user act.
603
+ - Never re-prompt for names in `connections.skip[]`. If the user wants to re-enable, they invoke `{{command_prefix}}connections <name>` explicitly.
604
+ - Never overwrite existing `<connections>` entries that this skill did not probe. Merge only.
605
+
606
+ ---
607
+
608
+ *Imported by: `../skills/connections/SKILL.md`. Maintained as part of Phase 28.5 (Bucket 2 rework - D-10).*