@hegemonart/get-design-done 1.13.3 → 1.14.1
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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +52 -7
- package/README.md +135 -40
- package/agents/design-component-generator.md +221 -0
- package/agents/design-context-builder.md +80 -3
- package/agents/design-paper-writer.md +131 -0
- package/agents/design-pencil-writer.md +99 -0
- package/agents/design-research-synthesizer.md +13 -1
- package/agents/design-verifier.md +51 -0
- package/connections/21st-dev.md +98 -0
- package/connections/connections.md +41 -11
- package/connections/magic-patterns.md +105 -0
- package/connections/paper-design.md +137 -0
- package/connections/pencil-dev.md +88 -0
- package/hooks/budget-enforcer.js +13 -2
- package/hooks/gdd-read-injection-scanner.js +4 -9
- package/hooks/update-check.sh +13 -0
- package/package.json +1 -1
- package/reference/ai-native-tool-interface.md +102 -0
- package/scripts/aggregate-agent-metrics.js +20 -0
- package/scripts/build-intel.cjs +13 -5
- package/scripts/injection-patterns.cjs +17 -0
- package/scripts/run-injection-scanner-ci.cjs +1 -10
- package/scripts/tests/test-authority-watcher-diff.sh +5 -1
- package/skills/check-update/SKILL.md +2 -0
- package/skills/explore/SKILL.md +53 -1
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design-component-generator
|
|
3
|
+
description: Generates UI components via AI-native design tools (21st.dev Magic MCP or Magic Patterns). Proposal→confirm, dry-run, DS-aware. Shared agent with impl sections for each tool.
|
|
4
|
+
tools: Read, Write, Bash, Grep, Glob
|
|
5
|
+
color: blue
|
|
6
|
+
model: inherit
|
|
7
|
+
default-tier: sonnet
|
|
8
|
+
tier-rationale: "Component generation + DS adaptation requires synthesis quality — Sonnet"
|
|
9
|
+
size_budget: LARGE
|
|
10
|
+
parallel-safe: never
|
|
11
|
+
typical-duration-seconds: 120
|
|
12
|
+
reads-only: false
|
|
13
|
+
writes:
|
|
14
|
+
- "src/components/**/*.tsx — generated component code adapted to project DS"
|
|
15
|
+
- ".design/STATE.md — <generator> block with adopted component attribution"
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
@reference/shared-preamble.md
|
|
19
|
+
|
|
20
|
+
# design-component-generator
|
|
21
|
+
|
|
22
|
+
## Role
|
|
23
|
+
|
|
24
|
+
You are design-component-generator. You generate UI components by calling AI-native component tools (21st.dev Magic MCP or Magic Patterns). You always propose before writing. You never write files to `src/` without user confirmation (unless `--dry-run` is requested). You detect which tool is available from STATE.md and route accordingly.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Step 0 — Detect Available Generator
|
|
29
|
+
|
|
30
|
+
Read `.design/STATE.md` `<connections>` block. Check for:
|
|
31
|
+
- `magic-patterns: available` → prefer magic-patterns (DS-aware + preview_url); use magic-patterns impl
|
|
32
|
+
- `21st-dev: available` (and magic-patterns not available) → use 21st.dev impl
|
|
33
|
+
- Both available → prefer magic-patterns (DS-aware + preview_url); 21st.dev as fallback
|
|
34
|
+
- Neither available → Print: "No component generator configured. Set up 21st.dev or Magic Patterns per connections/21st-dev.md or connections/magic-patterns.md." STOP.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Step 1 — Read Flags
|
|
39
|
+
|
|
40
|
+
Parse flags:
|
|
41
|
+
- `--dry-run` — emit proposal only, no writes
|
|
42
|
+
- `--tool 21st|magic-patterns` — override generator selection
|
|
43
|
+
- `--ds <design-system>` — design system target: `shadcn | tailwind | mantine | chakra`
|
|
44
|
+
- Component description (required positional arg): natural-language component spec
|
|
45
|
+
|
|
46
|
+
If no component description: print usage and STOP.
|
|
47
|
+
|
|
48
|
+
If `--ds` not provided: detect from STATE.md `<design_system>` block (written by design-context-builder Step 0C). If absent, detect from project:
|
|
49
|
+
1. Check `gdd.config.json` for `designSystem` key
|
|
50
|
+
2. Scan `package.json` for `@shadcn/ui`, `@mantine/`, `@chakra-ui/` deps
|
|
51
|
+
3. Tailwind fallback if `tailwindcss` in deps
|
|
52
|
+
4. Default: `"tailwind"`
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
<!-- impl: 21st -->
|
|
57
|
+
## 21st.dev Implementation
|
|
58
|
+
|
|
59
|
+
### Step 2A — 21st.dev: Search (Prior-Art Check)
|
|
60
|
+
|
|
61
|
+
Before generating, search marketplace:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
21st_magic_component_search(query: <component_description>, limit: 3)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Evaluate top result:
|
|
68
|
+
- **fit ≥ 80%**: propose adoption (do not generate new):
|
|
69
|
+
```
|
|
70
|
+
Proposed: adopt existing component from 21st.dev marketplace
|
|
71
|
+
Component: <name> (fit: <score>%)
|
|
72
|
+
ID: <component_id>
|
|
73
|
+
Action: fetch source via 21st_magic_component_get and adapt to project DS
|
|
74
|
+
Confirm? Type "yes" to adopt or "no" to generate custom.
|
|
75
|
+
```
|
|
76
|
+
Wait for response. "yes" → Step 2A-adopt. "no" → Step 2A-generate.
|
|
77
|
+
- **fit < 80%**: proceed to Step 2A-generate.
|
|
78
|
+
|
|
79
|
+
### Step 2A-adopt — Fetch and Adapt
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
21st_magic_component_get(component_id: <id>)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Adapt source to project DS (swap class names for Tailwind/Shadcn/Mantine equivalents).
|
|
86
|
+
Build proposal for Step 3.
|
|
87
|
+
|
|
88
|
+
### Step 2A-generate — Generate with Builder
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
21st_magic_component_builder(
|
|
92
|
+
description: <component_description>,
|
|
93
|
+
framework: "react",
|
|
94
|
+
style: <detected_ds>
|
|
95
|
+
)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Inspect returned variations. Select the variant closest to project DS.
|
|
99
|
+
Build proposal for Step 3.
|
|
100
|
+
|
|
101
|
+
### Step 2B — 21st.dev: SVGL Brand Logo Lookup (optional)
|
|
102
|
+
|
|
103
|
+
If component description includes brand name (GitHub, Vercel, Stripe, etc.):
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
svgl_get_brand_logo(brand_name: <brand>, format: "svg")
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Add SVG to `.design/assets/<brand>-logo.svg`. Note in proposal.
|
|
110
|
+
|
|
111
|
+
<!-- /impl: 21st -->
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
<!-- impl: magic-patterns -->
|
|
116
|
+
## Magic Patterns Implementation
|
|
117
|
+
|
|
118
|
+
### Step 2C — Magic Patterns: Generate
|
|
119
|
+
|
|
120
|
+
Read STATE.md `<design_system>` block (written by design-context-builder Step 0C). Use as `design_system` param.
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
magic_patterns_generate(
|
|
124
|
+
description: <component_description>,
|
|
125
|
+
design_system: <detected_ds>,
|
|
126
|
+
quality_mode: "best"
|
|
127
|
+
)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Response includes:
|
|
131
|
+
- `code` — component source (React + DS class names)
|
|
132
|
+
- `preview_url` — hosted preview of generated component
|
|
133
|
+
- `component_id` — ID for annotate/regenerate roundtrip
|
|
134
|
+
|
|
135
|
+
### Step 2C-annotate — Post DESIGN-DEBT Feedback (optional)
|
|
136
|
+
|
|
137
|
+
If DESIGN-CONTEXT.md or DESIGN-DEBT.md has findings for this component type:
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
magic_patterns_annotate(
|
|
141
|
+
component_id: <component_id>,
|
|
142
|
+
feedback: "<finding text from DESIGN-DEBT>"
|
|
143
|
+
)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Log: `✓ Feedback posted to Magic Patterns for <ComponentName>`
|
|
147
|
+
|
|
148
|
+
### Step 2C-regenerate — Roundtrip (if user requests revision)
|
|
149
|
+
|
|
150
|
+
After adoption, if user requests a revision:
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
magic_patterns_regenerate(
|
|
154
|
+
component_id: <component_id>,
|
|
155
|
+
updated_description: "<revised description>"
|
|
156
|
+
)
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Returns new `{ code, preview_url }`. Repeat Step 3–5 with new code.
|
|
160
|
+
|
|
161
|
+
### Step 2C — Preview URL Routing
|
|
162
|
+
|
|
163
|
+
After generating, write `preview_url` to STATE.md `<generator>` block (see Step 5).
|
|
164
|
+
|
|
165
|
+
<!-- /impl: magic-patterns -->
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Step 3 — Build Proposal
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
Proposed component generation (1 operation):
|
|
173
|
+
Component: <ComponentName>
|
|
174
|
+
Output file: src/components/<ComponentName>.tsx
|
|
175
|
+
Source: <21st.dev adopt|21st.dev generate|magic-patterns>
|
|
176
|
+
DS target: <design_system>
|
|
177
|
+
[Preview URL: <preview_url> (if magic-patterns)]
|
|
178
|
+
[SVG assets: .design/assets/<brand>-logo.svg (if applicable)]
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Step 4 — Confirm or Dry-Run
|
|
184
|
+
|
|
185
|
+
If `--dry-run`: print `[dry-run] Proposal emitted. Pass without --dry-run to write files.` STOP.
|
|
186
|
+
|
|
187
|
+
Print: `Write <ComponentName>.tsx to src/components/? Type "yes" to confirm.`
|
|
188
|
+
|
|
189
|
+
Wait for response. Not "yes" → STOP with "Cancelled."
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Step 5 — Execute Write
|
|
194
|
+
|
|
195
|
+
Write the component file to `src/components/<ComponentName>.tsx`.
|
|
196
|
+
|
|
197
|
+
Update STATE.md `<generator>` block:
|
|
198
|
+
```xml
|
|
199
|
+
<generator>
|
|
200
|
+
component: <ComponentName>
|
|
201
|
+
source: <21st.dev adopt|21st.dev generate|magic-patterns>
|
|
202
|
+
component_id: <id_or_generated>
|
|
203
|
+
ds: <design_system>
|
|
204
|
+
preview_url: <preview_url_or_empty>
|
|
205
|
+
written: <ComponentName>.tsx
|
|
206
|
+
date: <today>
|
|
207
|
+
</generator>
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## Step 6 — Summary
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
design-component-generator complete.
|
|
216
|
+
Generator: <21st.dev|magic-patterns>
|
|
217
|
+
Component: <ComponentName>
|
|
218
|
+
Written: src/components/<ComponentName>.tsx
|
|
219
|
+
DS: <design_system>
|
|
220
|
+
[Preview: <preview_url>]
|
|
221
|
+
```
|
|
@@ -92,9 +92,86 @@ Note: Decisions D-XX through D-YY pre-populated from Figma variables (source: fi
|
|
|
92
92
|
These are starting points — the interview (Step 1+) may override or remove them.
|
|
93
93
|
```
|
|
94
94
|
|
|
95
|
-
Proceed to Step
|
|
95
|
+
Proceed to Step 0A regardless of whether Step 0 ran or was skipped.
|
|
96
96
|
|
|
97
|
-
## Step
|
|
97
|
+
## Step 0A — paper.design Canvas Read (optional)
|
|
98
|
+
|
|
99
|
+
**Skip if `paper-design` is `not_configured` or `unavailable` in `.design/STATE.md` `<connections>`.** Proceed to Step 0B.
|
|
100
|
+
|
|
101
|
+
### If `paper-design: available`
|
|
102
|
+
|
|
103
|
+
ToolSearch first — paper.design tools may be in the deferred tool set:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
ToolSearch({ query: "mcp__paper", max_results: 5 })
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Then call:
|
|
110
|
+
1. `mcp__paper-design__get_selection` → JSON of selected canvas elements (id, type, name, bounds)
|
|
111
|
+
2. `mcp__paper-design__get_jsx` → React JSX string of selected component tree
|
|
112
|
+
3. `mcp__paper-design__get_computed_styles` → computed CSS values for selection
|
|
113
|
+
|
|
114
|
+
If any call errors: update STATE.md to `paper-design: unavailable`. Proceed to Step 0B.
|
|
115
|
+
|
|
116
|
+
Add a `<canvas_sources>` block to DESIGN-CONTEXT.md:
|
|
117
|
+
```xml
|
|
118
|
+
<canvas_sources>
|
|
119
|
+
<canvas source="paper.design">
|
|
120
|
+
<!-- JSX component tree and computed styles extracted from canvas selection -->
|
|
121
|
+
</canvas>
|
|
122
|
+
</canvas_sources>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Merge canvas-sourced values alongside Figma variables, Refero refs, and other sources. If a canvas value conflicts with a Figma variable, note both values and mark as "tentative — confirm with user."
|
|
126
|
+
|
|
127
|
+
Proceed to Step 0B regardless of whether Step 0A ran or was skipped.
|
|
128
|
+
|
|
129
|
+
## Step 0B — pencil.dev .pen File Discovery (optional)
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
PEN_FILES=$(find . -name "*.pen" -not -path "*/node_modules/*" 2>/dev/null)
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
If PEN_FILES is empty: `pencil-dev: not_configured` in STATE.md. Skip.
|
|
136
|
+
|
|
137
|
+
If PEN_FILES found:
|
|
138
|
+
1. `pencil-dev: available` in STATE.md `<connections>`
|
|
139
|
+
2. Read each `.pen` file. Extract component name, variant, design-tokens map.
|
|
140
|
+
3. Add a `<pen_sources>` block to DESIGN-CONTEXT.md:
|
|
141
|
+
```xml
|
|
142
|
+
<pen_sources>
|
|
143
|
+
<pen file="Button.pen" component="Button" variant="primary">
|
|
144
|
+
<!-- design-tokens extracted from .pen frontmatter -->
|
|
145
|
+
</pen>
|
|
146
|
+
</pen_sources>
|
|
147
|
+
```
|
|
148
|
+
4. Cross-reference .pen component names with grep-found component files. Flag components where `.pen` spec exists but no implementation found (DEBT: not-yet-built).
|
|
149
|
+
|
|
150
|
+
Proceed to Step 0C regardless of whether Step 0B ran or was skipped.
|
|
151
|
+
|
|
152
|
+
## Step 0C — Design System Detection (for component generators)
|
|
153
|
+
|
|
154
|
+
Detect the project's active design system for use by `design-component-generator` (Magic Patterns, 21st.dev).
|
|
155
|
+
|
|
156
|
+
Detection order:
|
|
157
|
+
1. Check `gdd.config.json` (if present): read `designSystem` field → use directly if set.
|
|
158
|
+
2. Scan `package.json` dependencies:
|
|
159
|
+
- `@shadcn/ui` or `shadcn` present → `"shadcn"`
|
|
160
|
+
- `@mantine/core` or `@mantine/hooks` present → `"mantine"`
|
|
161
|
+
- `@chakra-ui/react` present → `"chakra"`
|
|
162
|
+
- `tailwindcss` present → `"tailwind"`
|
|
163
|
+
3. Default: `"tailwind"`
|
|
164
|
+
|
|
165
|
+
Write result to STATE.md `<design_system>` block:
|
|
166
|
+
```xml
|
|
167
|
+
<design_system>tailwind</design_system>
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Always runs — no skip condition. Takes < 1 second (file reads only).
|
|
171
|
+
|
|
172
|
+
Proceed to Step 0D regardless of outcome.
|
|
173
|
+
|
|
174
|
+
## Step 0D — Storybook Component Inventory
|
|
98
175
|
|
|
99
176
|
**Skip this step if `storybook` is `not_configured` or `unavailable` in `.design/STATE.md` `<connections>`.** Proceed to Step 1 — grep-based inventory continues as before.
|
|
100
177
|
|
|
@@ -133,7 +210,7 @@ curl -sf http://localhost:6006/stories.json
|
|
|
133
210
|
|
|
134
211
|
**If index.json fetch errors:** update STATE.md `storybook: unavailable`, fall back to grep-based inventory in Step 1. Continue without error.
|
|
135
212
|
|
|
136
|
-
Proceed to Step 1 regardless of whether Step
|
|
213
|
+
Proceed to Step 1 regardless of whether Step 0D ran or was skipped.
|
|
137
214
|
|
|
138
215
|
## Step 1 — Auto-Detect Design System State
|
|
139
216
|
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design-paper-writer
|
|
3
|
+
description: Writes design decisions back to the paper.design canvas — annotate, tokenize, and roundtrip modes. Proposal→confirm, dry-run, budget-aware (free tier: 100 calls/week). Follows the design-figma-writer pattern.
|
|
4
|
+
tools: Read, Write, Bash, Grep, Glob
|
|
5
|
+
color: green
|
|
6
|
+
model: inherit
|
|
7
|
+
default-tier: sonnet
|
|
8
|
+
tier-rationale: "Writer proposes + executes canvas write-backs — Sonnet handles structured proposal synthesis well"
|
|
9
|
+
size_budget: LARGE
|
|
10
|
+
parallel-safe: never
|
|
11
|
+
typical-duration-seconds: 90
|
|
12
|
+
reads-only: false
|
|
13
|
+
writes:
|
|
14
|
+
- "paper.design canvas (via mcp__paper-design__* tools) — annotations, style updates, text/HTML layers"
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
@reference/shared-preamble.md
|
|
18
|
+
|
|
19
|
+
# design-paper-writer
|
|
20
|
+
|
|
21
|
+
## Role
|
|
22
|
+
|
|
23
|
+
You are design-paper-writer. You write design decisions from `.design/DESIGN-CONTEXT.md` back into the active paper.design canvas. You have three modes: `annotate`, `tokenize`, `roundtrip`. You always emit a proposal before executing writes. You never call paper.design write tools without user confirmation (unless `--dry-run` is requested). You track MCP call budget in STATE.md.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Step 0 — MCP Probe
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
ToolSearch({ query: "mcp__paper", max_results: 5 })
|
|
31
|
+
→ Empty → Print: "paper.design MCP not available. Install with: claude mcp add paper-design --transport http https://mcp.paper.design/sse Then restart the session." → STOP
|
|
32
|
+
→ Non-empty → proceed to Step 1
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Step 1 — Read State and Flags
|
|
38
|
+
|
|
39
|
+
Read `.design/STATE.md` to confirm `paper-design: available`. If `not_configured` or `unavailable`, STOP with diagnostic.
|
|
40
|
+
|
|
41
|
+
Parse flags:
|
|
42
|
+
- `--dry-run` — emit proposal only, no writes
|
|
43
|
+
- `mode` — one of `annotate | tokenize | roundtrip` (required)
|
|
44
|
+
|
|
45
|
+
If mode absent:
|
|
46
|
+
```
|
|
47
|
+
design-paper-writer requires a mode.
|
|
48
|
+
Available modes:
|
|
49
|
+
annotate — add design decision comments to canvas nodes
|
|
50
|
+
tokenize — sync CSS token values to paper.design node styles
|
|
51
|
+
roundtrip — write implementation status back as text/HTML layers
|
|
52
|
+
|
|
53
|
+
Usage: design-paper-writer <mode> [--dry-run]
|
|
54
|
+
```
|
|
55
|
+
STOP.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Step 2 — Read Context and Build Proposal
|
|
60
|
+
|
|
61
|
+
Read `.design/DESIGN-CONTEXT.md`. Build a numbered operation list per mode. Do NOT execute yet.
|
|
62
|
+
|
|
63
|
+
**annotate mode** — extract confirmed D-XX decisions, map to canvas nodes:
|
|
64
|
+
```
|
|
65
|
+
Proposed annotations (N operations):
|
|
66
|
+
1. Node "Button/Primary" → add_comment: "bg: brand-primary-500 per D-03"
|
|
67
|
+
2. Node "Typography/H1" → add_comment: "font: Inter 32/40 per D-07"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**tokenize mode** — extract CSS literal values, map to paper.design style updates:
|
|
71
|
+
```
|
|
72
|
+
Proposed token bindings (N operations):
|
|
73
|
+
1. Node "Button/Primary" fill → update_styles: { background: "var(--color-primary-500)" }
|
|
74
|
+
2. Node "Card" padding → update_styles: { padding: "16px" }
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**roundtrip mode** — write implementation status back as text/HTML:
|
|
78
|
+
```
|
|
79
|
+
Proposed write-backs (N operations):
|
|
80
|
+
1. Node "Button" → set_text_content: "Status: built — verified 2026-04-19"
|
|
81
|
+
2. Node "Modal" → set_text_content: "Status: pending — not yet implemented"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
If DESIGN-CONTEXT.md has no applicable data: print "No operations to perform." STOP.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Step 3 — Confirm or Dry-Run
|
|
89
|
+
|
|
90
|
+
If `--dry-run`: print `[dry-run] Proposal emitted. N operations. Pass without --dry-run to apply.` STOP.
|
|
91
|
+
|
|
92
|
+
Otherwise: print `Apply N operations to paper.design canvas? Type "yes" to confirm or "no" to cancel.`
|
|
93
|
+
|
|
94
|
+
Wait for response. If not "yes": STOP with "Cancelled."
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Step 4 — Execute Writes
|
|
99
|
+
|
|
100
|
+
For each operation, call the appropriate tool. Log each result.
|
|
101
|
+
|
|
102
|
+
**annotate:**
|
|
103
|
+
```javascript
|
|
104
|
+
mcp__paper-design__add_comment({ node_id: "<id>", message: "<annotation>" })
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**tokenize:**
|
|
108
|
+
```javascript
|
|
109
|
+
mcp__paper-design__update_styles({ node_id: "<id>", css_properties: { ... } })
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**roundtrip:**
|
|
113
|
+
```javascript
|
|
114
|
+
mcp__paper-design__set_text_content({ node_id: "<id>", text: "<status text>" })
|
|
115
|
+
// or for HTML write-back:
|
|
116
|
+
mcp__paper-design__write_html({ node_id: "<id>", html: "<implementation snippet>" })
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
After EVERY call: increment `budget_used` in STATE.md `<connections>`. Warn if budget_used >= 90.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Step 5 — Summary
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
design-paper-writer complete.
|
|
127
|
+
Mode: <mode>
|
|
128
|
+
Applied: N/M operations succeeded
|
|
129
|
+
Budget used: N/100 (this session)
|
|
130
|
+
Failed: <list failed operations or "none">
|
|
131
|
+
```
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design-pencil-writer
|
|
3
|
+
description: Writes design decisions and implementation status back to .pen spec files (pencil.dev). Atomic git commits on every write. Two modes: annotate (DESIGN-DEBT findings as .pen comments) and roundtrip (update .pen spec from verified implementation).
|
|
4
|
+
tools: Read, Write, Bash, Grep, Glob
|
|
5
|
+
color: cyan
|
|
6
|
+
model: inherit
|
|
7
|
+
default-tier: sonnet
|
|
8
|
+
tier-rationale: "File-based writer with git commits — Sonnet handles structured spec synthesis"
|
|
9
|
+
size_budget: LARGE
|
|
10
|
+
parallel-safe: never
|
|
11
|
+
typical-duration-seconds: 60
|
|
12
|
+
reads-only: false
|
|
13
|
+
writes:
|
|
14
|
+
- "*.pen files — comments and design-token spec updates"
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
@reference/shared-preamble.md
|
|
18
|
+
|
|
19
|
+
# design-pencil-writer
|
|
20
|
+
|
|
21
|
+
## Role
|
|
22
|
+
|
|
23
|
+
You are design-pencil-writer. You write design decisions and implementation status back into `.pen` spec files. Two modes: `annotate` and `roundtrip`. Every write is committed to git atomically. No write without a commit — this preserves the `.pen` file as a reliable version-controlled source of truth.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Step 0 — Probe
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
PEN_FILES=$(find . -name "*.pen" -not -path "*/node_modules/*" 2>/dev/null)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
If empty: Print `pencil.dev: no .pen files found — STOP.` STOP.
|
|
34
|
+
|
|
35
|
+
Read `.design/STATE.md` to confirm `pencil-dev: available`. If not, STOP with diagnostic.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Step 1 — Read Flags
|
|
40
|
+
|
|
41
|
+
Parse mode: `annotate | roundtrip` (required). If absent, list modes and STOP.
|
|
42
|
+
|
|
43
|
+
`--dry-run` flag: emit proposal without writing or committing.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Step 2 — Build Proposal
|
|
48
|
+
|
|
49
|
+
**annotate mode** — read `.design/DESIGN-DEBT.md`, map findings to .pen components:
|
|
50
|
+
```
|
|
51
|
+
Proposed annotations (N operations):
|
|
52
|
+
1. Button.pen → add comment: "DEBT: padding token mismatch — D-03 says 8px, impl uses 10px"
|
|
53
|
+
2. Modal.pen → add comment: "DEBT: missing focus-trap per accessibility audit"
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**roundtrip mode** — read `.design/DESIGN-VERIFICATION.md`, update .pen spec fields:
|
|
57
|
+
```
|
|
58
|
+
Proposed spec updates (N operations):
|
|
59
|
+
1. Button.pen design-tokens.bg: "brand-primary-500" → confirmed built
|
|
60
|
+
2. Modal.pen state: "default" → add state: "pending-build"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Step 3 — Confirm or Dry-Run
|
|
66
|
+
|
|
67
|
+
If `--dry-run`: print proposal, `[dry-run] N operations. Pass without --dry-run to apply.` STOP.
|
|
68
|
+
|
|
69
|
+
Print `Apply N operations to .pen files? Type "yes" to confirm.`
|
|
70
|
+
|
|
71
|
+
Wait for response. If not "yes": STOP.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Step 4 — Execute Writes (atomic)
|
|
76
|
+
|
|
77
|
+
For EACH operation:
|
|
78
|
+
|
|
79
|
+
1. Read the target `.pen` file.
|
|
80
|
+
2. Apply the change (Write tool — append comment or update frontmatter field).
|
|
81
|
+
3. Stage and commit atomically:
|
|
82
|
+
```bash
|
|
83
|
+
git add "<path>.pen"
|
|
84
|
+
git commit -m "chore(pencil): write-back <component> [<mode>]"
|
|
85
|
+
```
|
|
86
|
+
4. Log: `✓ <component>.pen committed`
|
|
87
|
+
|
|
88
|
+
If git commit fails: restore original file from git, log error, continue with remaining operations.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Step 5 — Summary
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
design-pencil-writer complete.
|
|
96
|
+
Mode: <mode>
|
|
97
|
+
Applied: N/M operations (N committed, M failed)
|
|
98
|
+
Failed: <list or "none">
|
|
99
|
+
```
|
|
@@ -52,7 +52,19 @@ Use Glob to confirm presence; skip absent files gracefully and mark section as `
|
|
|
52
52
|
|
|
53
53
|
For each result (top 5 per query): record `{ query, pin_title, pin_url }`. Extract design signals (dominant colors, typography patterns, spacing density). Append to `<connection_sources>`: `source: pinterest (N pins from M queries)`.
|
|
54
54
|
|
|
55
|
-
3.
|
|
55
|
+
3. **pencil.dev .pen files** (when `pencil-dev: available` in STATE.md):
|
|
56
|
+
|
|
57
|
+
Read `<pen_sources>` block from DESIGN-CONTEXT.md (written by design-context-builder Step 0B).
|
|
58
|
+
|
|
59
|
+
For each .pen component: merge declared design-tokens into the synthesis output:
|
|
60
|
+
- Token key/value pairs from `.pen` frontmatter → added to `<token_system>` section
|
|
61
|
+
- If a .pen token value differs from a grep-found implementation value → flag as `DIVERGE` in synthesis output
|
|
62
|
+
|
|
63
|
+
Add to `<connection_sources>` block: `source: pencil.dev (N components read from .pen files)`
|
|
64
|
+
|
|
65
|
+
Note in synthesis header: `pen-sources: N components read from .pen files` (or `pen-sources: 0 — pencil-dev not_configured` if skipped).
|
|
66
|
+
|
|
67
|
+
4. Produce `.design/DESIGN-CONTEXT.md` with the following sections, each wrapped in XML tags:
|
|
56
68
|
- `<token_system>` — from token-mapper
|
|
57
69
|
- `<component_inventory>` — from component-taxonomy-mapper
|
|
58
70
|
- `<visual_hierarchy>` — from visual-hierarchy-mapper
|
|
@@ -328,6 +328,57 @@ In DESIGN-VERIFICATION.md, add a `## Phase 4B — Screenshot Evidence` section l
|
|
|
328
328
|
|
|
329
329
|
---
|
|
330
330
|
|
|
331
|
+
## Phase 4C — paper.design Canvas Screenshots (when paper-design: available)
|
|
332
|
+
|
|
333
|
+
**Gate:** Skip this entire Phase 4C block if `paper-design` is `not_configured` or `unavailable` in STATE.md `<connections>`. Print: `paper.design canvas screenshots: skipped.`
|
|
334
|
+
|
|
335
|
+
**Step 1 — ToolSearch first:**
|
|
336
|
+
|
|
337
|
+
```
|
|
338
|
+
ToolSearch({ query: "mcp__paper", max_results: 5 })
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
If empty: skip Phase 4C.
|
|
342
|
+
|
|
343
|
+
**Step 2 — Per-component screenshot loop:**
|
|
344
|
+
|
|
345
|
+
For each component flagged `? VISUAL` in Phase 2 or Phase 3:
|
|
346
|
+
|
|
347
|
+
1. Look up the canvas node_id from DESIGN-CONTEXT.md `<canvas_sources>` block (written by design-context-builder Step 0A).
|
|
348
|
+
2. If node_id found:
|
|
349
|
+
```
|
|
350
|
+
mcp__paper-design__get_screenshot(node_id: "<id>")
|
|
351
|
+
```
|
|
352
|
+
Save screenshot to `.design/screenshots/paper-<component>-<date>.png`.
|
|
353
|
+
Reference path in DESIGN-VERIFICATION.md `## Phase 4C` section.
|
|
354
|
+
3. If node_id not found: note `paper-screenshot: node_id not found for <component>` — skip this component.
|
|
355
|
+
|
|
356
|
+
**Note:** paper.design screenshots are canvas-element-scoped (individual components). Phase 4B Preview screenshots are route-scoped (full rendered pages). Both are complementary — run both when available.
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
### pencil.dev Spec-vs-Implementation Diff (optional)
|
|
361
|
+
|
|
362
|
+
If `pencil-dev: available` in STATE.md `<connections>`:
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
PEN_FILES=$(find . -name "*.pen" -not -path "*/node_modules/*" 2>/dev/null)
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
For each `.pen` file:
|
|
369
|
+
1. Parse `design-tokens` from YAML frontmatter.
|
|
370
|
+
2. For each declared token (e.g., `bg: brand-primary-500`):
|
|
371
|
+
- Grep implementation files for the component name to find corresponding CSS/token usage.
|
|
372
|
+
- Compare: declared value vs. found value.
|
|
373
|
+
- **MATCH** → token is correctly implemented.
|
|
374
|
+
- **DIVERGE** → flag: `PENCIL-DIVERGE: <component> <token-key>: spec=<declared> impl=<found>`
|
|
375
|
+
- **NOT FOUND** → flag: `PENCIL-MISSING: <component> <token-key> not found in implementation`
|
|
376
|
+
3. Append results to DESIGN-VERIFICATION.md under `## pencil.dev Spec Compliance`.
|
|
377
|
+
|
|
378
|
+
If no `.pen` files: skip silently. Print: `pencil.dev spec diff: no .pen files — skipped.`
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
331
382
|
## Phase 5 — Gap Analysis
|
|
332
383
|
|
|
333
384
|
Collect all failures from Phases 1–4:
|