@lemoncode/lemony 0.1.1-alpha.0 → 0.1.1-alpha.2

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.
@@ -1,30 +1,49 @@
1
1
  ---
2
2
  name: grill-ui
3
- description: Design-direction interview for the UI Designer. Reuses the grill-with-docs engine (one question at a time, recommend-don't-impose, never auto-decide) with a DESIGN script — personas, aesthetic dials + tone preset, brand references, density, motion appetite, screens and flows — and produces the `ui-handoff.md` design contract (not a PRD). Inherits the task's PRD and consumes `docs/personas.md` if present. Use when a task touches UI and the design must be defined alongside the spec.
3
+ description: Design-direction interview run by the Orchestrator. Reuses the grill-with-docs engine (one question at a time, recommend-don't-impose, never auto-decide) with a DESIGN script — personas, aesthetic dials + tone preset, brand references, density, motion appetite, screens and flows — and produces the `ui-handoff.md` design contract (not a PRD). Inherits the task's PRD and consumes `docs/personas.md` if present. Use when a task touches UI and the design must be defined alongside the spec.
4
4
  origin: vendor
5
5
  vendor_version: '{{vendor_version}}'
6
- invoked-by: [ui-designer]
6
+ invoked-by: [orchestrator]
7
7
  attribution:
8
8
  - source: mattpocock/skills
9
9
  author: Matt Pocock
10
10
  url: https://github.com/mattpocock/skills
11
11
  license: MIT
12
+ copyright: Copyright (c) 2026 Matt Pocock
12
13
  relationship: derived-from
13
14
  note: grill interview engine — one question at a time, decision-by-decision interrogation
14
15
  ---
15
16
 
16
17
  # Grill UI
17
18
 
18
- The UI Designer's **DEFINE** method: a design-direction interview that turns a task into a
19
+ The Orchestrator's **DEFINE** design method: a design-direction interview that turns a task into a
19
20
  `ui-handoff.md` design contract the implementer can build from. It is the design sibling of
20
- `grill-with-docs` — the same interrogation engine, a different script and a different output.
21
-
22
- ## Core Principle
23
-
24
- You are a design director with taste. Push for **deliberate, distinctive** direction, not the
25
- generic defaults a model reaches for unprompted. Drill every design branch. Present concrete
26
- options with trade-offs never just open questions. The goal is a design the user could not have
27
- articulated alone, captured as decisions the implementer can execute and the review can verify.
21
+ `grill-with-docs` — the same interrogation engine, a different script and a different output. You
22
+ run it yourself, on your human-facing surface, and you author the handoff it produces.
23
+
24
+ ## Identity & taste
25
+
26
+ Run this interview as a **design director with real taste** the kind a solo dev without a
27
+ designer wishes they had on call. Hold a high bar and bring conviction:
28
+
29
+ - **Default to deliberate, distinctive design.** The failure mode to avoid is generic "AI slop" —
30
+ the overused font, the predictable purple gradient, the cookie-cutter card grid, the layout with
31
+ no point of view. When the user has no opinion, propose a direction, don't reach for the safe
32
+ average.
33
+ - **Have a point of view, hold it lightly.** Recommend boldly and explain _why_, then let the user
34
+ decide. It is their product; your job is to make the tasteful choice the obvious one, not to
35
+ impose it.
36
+ - **Decisions, not know-how.** You set direction — tone, dials, layout, component and state
37
+ decisions, motion appetite, accessibility targets, microcopy. _How_ to apply tokens to a stack,
38
+ _how_ to avoid slop in code, _how_ to meet WCAG — that is the implementer's and reviewer's craft,
39
+ delivered through their skills. Never restate it.
40
+ - **Ground taste in craft, not vibes.** Characterful typography, intentional colour driven by
41
+ semantic tokens, deliberate spacing and hierarchy, motion that carries meaning, accessible by
42
+ construction. Cite the reason a choice is good.
43
+
44
+ Drill every design branch. Present concrete options with trade-offs — never just open questions.
45
+ The goal is a design the user could not have articulated alone, captured as decisions the
46
+ implementer can execute and the review can verify.
28
47
 
29
48
  ## Hard rules
30
49
 
@@ -42,18 +61,19 @@ articulated alone, captured as decisions the implementer can execute and the rev
42
61
 
43
62
  ## Inheritance — don't re-ask the need
44
63
 
45
- This interview runs **after** the general grill and the spec. Before the first question:
64
+ This interview runs **after** the general grill and **before** the Spec Author writes the spec — so
65
+ the design direction it settles can inform the spec. Before the first question:
46
66
 
47
- - **Read the task's PRD** (`docs/prds/<topic>-*.md`) and the spec
48
- (`.claude/state/tasks/<id>/spec/requirements.md` / `design.md`). The _what_ and _why_ are already
49
- settled do NOT re-ask them. You are defining the _how it looks and feels_.
67
+ - **Read the task's PRD** (`docs/prds/<topic>-*.md`). The _what_ and _why_ are already settled there
68
+ — do NOT re-ask them. You are defining the _how it looks and feels_. (The spec doesn't exist yet;
69
+ don't look for it.)
50
70
  - **Consume `docs/personas.md` if it exists** — the project's user models. Treat it as input; do not
51
71
  re-derive personas the file already states. **If it is absent, ask inline** (the persona branch
52
- below) and capture the answer in the handoff's §1 — **never create `docs/personas.md`** here (it is
53
- client-owned; the harness only consumes it). When you captured personas inline **because the file
54
- was absent**, say so in your return so the Orchestrator can offer to persist them to
55
- `docs/personas.md` for future tasks (see [Persisting personas](#persisting-personas-when-absent)).
56
- The offer is the Orchestrator's — a human-facing surface never yours mid-interview.
72
+ below) and capture the answer in the handoff's §1 — **don't write `docs/personas.md` mid-interview**
73
+ (it is client-owned; the harness only consumes it). When you captured personas inline **because the
74
+ file was absent**, offer at the end to persist them to `docs/personas.md` for future tasks (see
75
+ [Persisting personas](#persisting-personas-when-absent)) — an opt-in offer on your human-facing
76
+ surface, never an unasked write.
57
77
  - **Consume `docs/design-tokens.json` if it exists** — the single source of truth for tokens. The
58
78
  handoff §11 points at it; you never inline token values.
59
79
  - **Read `docs/architecture.md` if it exists** — orient against the system's shape so design
@@ -67,8 +87,8 @@ section of [ui-handoff-format.md](./ui-handoff-format.md).
67
87
 
68
88
  1. **Personas / who it serves** (→ §1). Consume `docs/personas.md` if present; else ask: who uses
69
89
  this, in what context, with what constraints (device, expertise, frequency)? Capture only what
70
- shapes design decisions. If you asked inline because the file was absent, flag it in your return
71
- so the Orchestrator can offer to persist them ([Persisting personas](#persisting-personas-when-absent)).
90
+ shapes design decisions. If you asked inline because the file was absent, offer to persist them at
91
+ the end ([Persisting personas](#persisting-personas-when-absent)).
72
92
  2. **Aesthetic direction** (→ §2). The heart of the interview. Start from an optional **tone
73
93
  preset** (`controlled` / `impact` / `innovative`) as shorthand that seeds defaults, then set the
74
94
  three explicit **dials** — **variance** (conventional ↔ expressive), **motion** (still ↔
@@ -91,7 +111,9 @@ section of [ui-handoff-format.md](./ui-handoff-format.md).
91
111
  10. **Microcopy** (→ §10). The actual words for the task's key labels/messages, **inline**. Voice
92
112
  follows §2; no separate copy artifact.
93
113
  11. **Tokens** (→ §11). Point at `docs/design-tokens.json`. If the project has no token file yet,
94
- say so and capture it as an open question never invent a token set.
114
+ don't invent one mid-interview surface it at the end as an opt-in offer
115
+ ([Design-tokens & design-tool on-ramp](#design-tokens--design-tool-on-ramp-when-absent)); if the
116
+ human declines, capture it as an open question.
95
117
 
96
118
  After important branches, offer a checkpoint:
97
119
 
@@ -123,37 +145,77 @@ Spec Author's `requirements.md` / `design.md` / `tasks.md`. You **own** it. Use
123
145
  ## Persisting personas (when absent)
124
146
 
125
147
  `docs/personas.md` is **client-owned**: the harness consumes it, never imposes it. So when the
126
- file was **absent** and you gathered personas inline (§1 above), you do **not** write it
127
- yourself mid-interview a sub-agent must not interrupt the human, and the choice to keep a
128
- persistent user-model doc is the human's.
129
-
130
- Instead:
131
-
132
- 1. **Flag it in your return.** State plainly that `docs/personas.md` was absent and you captured
133
- personas inline in the handoff's §1. That is the signal the Orchestrator needs.
134
- 2. **The Orchestrator makes the offer** on its own human-facing surface, after you return —
135
- asking whether to persist those personas to `docs/personas.md` for future tasks.
136
- 3. **You author it only if re-dispatched** with the human's yes. Write a **minimal
137
- `docs/personas.md`** from the personas already captured in §1 — the client's own words, not an
138
- invented cast. Keep it a skeleton the client can grow: one short block per persona (who they
139
- are, their context/device, expertise, frequency, the goals and constraints that shape design).
140
- Create `docs/` if absent. This is the client's real content, surfaced from their own answers —
141
- never a vendor template, never personas the harness guessed.
142
-
143
- If the human declines, write nothing: the inline personas live on in the handoff's §1 for this
144
- task, and the next UI task will simply ask again.
148
+ file was **absent** and you gathered personas inline (§1 above), don't write it mid-interview — the
149
+ choice to keep a persistent user-model doc is the human's. Make it an explicit offer instead:
150
+
151
+ 1. **Offer at the end.** Once the design is defined, ask on your human-facing surface whether to
152
+ persist the inline personas to `docs/personas.md` for future tasks. Opt-in, never unasked.
153
+ 2. **On yes, write a minimal `docs/personas.md`** from the personas already captured in §1 — the
154
+ client's own words, not an invented cast. Keep it a skeleton the client can grow: one short block
155
+ per persona (who they are, their context/device, expertise, frequency, the goals and constraints
156
+ that shape design). Create `docs/` if absent. This is the client's real content, surfaced from
157
+ their own answers never a vendor template, never personas the harness guessed.
158
+ 3. **On no, write nothing:** the inline personas live on in the handoff's §1 for this task, and the
159
+ next UI task will simply ask again.
160
+
161
+ ## Design-tokens & design-tool on-ramp (when absent)
162
+
163
+ `docs/design-tokens.json` and a design-tool connection are **client-owned inputs** — the harness
164
+ consumes them if present and otherwise leaves them alone, the same regime as personas. For a repo
165
+ adopting the harness fresh, that silence is a dead end: no tokens, no way in. So when either is
166
+ **absent**, don't dead-end at a silent open question make an explicit, opt-in offer at the end, on
167
+ your human-facing surface. Never scaffold or connect unasked.
168
+
169
+ ### Tokens absent → offer to scaffold
170
+
171
+ When the project has **no `docs/design-tokens.json`**, offer once, after the design is defined:
172
+
173
+ 1. **Offer at the end.** Ask whether to scaffold a starter `docs/design-tokens.json` from the
174
+ direction just defined, or keep it as an open question in §11.
175
+ 2. **On yes, derive from the answers.** Build a minimal 3-tier DTCG file (`primitive` → `semantic`
176
+ → `component`) from what the human actually stated — the colours, type, spacing and radii that
177
+ came out of the aesthetic-direction branch (§2) and the components branch (§5). This is the
178
+ client's own direction, surfaced as tokens — **never a vendor template**, never a palette the
179
+ harness guessed.
180
+ 3. **Offer to cover the gaps too.** The interview rarely names every token. Ask a follow-up: for the
181
+ aspects the conversation **did not cover**, do they want a sensible **starter** set generated (a
182
+ neutral scale, default spacing and radii) so the file is usable from day one, or only the tokens
183
+ the answers implied? Opt-in — the human chooses how far to go, and you never pad the file unasked.
184
+ 4. **Validate before closing.** After writing, run `lemony design-tokens validate` and fix anything
185
+ it flags, so the scaffolded file is well-formed (3-tier, aliases resolve) — a scaffold that fails
186
+ the validator is worse than none.
187
+ 5. **On no, write nothing:** capture the missing token file as an open question in §11, exactly as
188
+ before. The next UI task simply asks again.
189
+
190
+ ### No design tool → offer to connect
191
+
192
+ When `docs/design-tokens.json` carries no `com.lemony.design-tool` binding — or there is no tokens
193
+ file at all — offer to **connect a design tool** (e.g. a Figma or Pencil bridge) so tokens can
194
+ round-trip between the repo and the tool:
195
+
196
+ 1. **Offer, opt-in.** Ask whether to connect a design tool now, or **stay pure-code** (tokens live
197
+ only in the repo). Most repos are happy pure-code — recommend that unless the human wants a
198
+ visual tool in the loop.
199
+ 2. **On yes,** write the `com.lemony.design-tool` binding (the provider) into `docs/design-tokens.json`
200
+ and run the first import to bootstrap tokens from the tool. The `design-tool-sync` skill and the
201
+ `sync-design-tokens` command own the mechanics — you point the human at them; you don't
202
+ re-implement the bridge here.
203
+ 3. **Skip gracefully.** If the tool's MCP bridge isn't connected, say so and fall back to the open
204
+ question — never block the interview on an unavailable tool.
205
+ 4. **On no, stay pure-code:** write no binding. The design tool is only ever a projection of
206
+ `docs/design-tokens.json`, never a peer source of truth — declining costs nothing.
145
207
 
146
208
  ## Pause & Resume
147
209
 
148
210
  Design definition is part of completing the spec, not a separate state. Pausing and resuming use
149
- the lifecycle the Orchestrator already owns — don't invent a parallel mechanism:
211
+ the lifecycle you already own — don't invent a parallel mechanism:
150
212
 
151
- - **Pausing**: write `ui-handoff.md` with `Status: in_progress` and the sections closed so far. The
152
- Orchestrator records the sub-state `awaiting design definition` in the task's `progress.md` and
153
- parks the task. Confirm with the user before ending the turn.
213
+ - **Pausing**: write `ui-handoff.md` with `Status: in_progress` and the sections closed so far,
214
+ record the sub-state `awaiting design definition` in the task's `progress.md`, and park the task.
215
+ Confirm with the user before ending the turn.
154
216
  - **Resuming**: `/resume <id>` re-enters via that sub-state. Read the in-progress `ui-handoff.md`,
155
217
  confirm which sections are closed and which branch comes next, then continue.
156
- - **Completing**: flip `Status: in_progress` → `Status: completed`. The Orchestrator removes the
218
+ - **Completing**: flip `Status: in_progress` → `Status: completed`, then remove the
157
219
  `harness:needs-design` flag at/before `spec-ready`.
158
220
 
159
221
  ## Tone
@@ -165,9 +227,9 @@ and conviction — push for a real direction, but the user decides.
165
227
  ## When the design is underspecified
166
228
 
167
229
  If a design decision needs input the PRD left open with more than one valid answer and the user
168
- can't resolve it in the interview, **raise it as a discovery** rather than guess the Orchestrator
169
- mediates and re-invokes you with the decision. For an independent defect unrelated to the design,
170
- note it as a side finding and keep going.
230
+ can't resolve it in the interview, **capture it as an open question** in the handoff rather than
231
+ guess, and mark the handoff `Status: in_progress` until it is settled never close a design on a
232
+ guessed fork.
171
233
 
172
234
  ## Cross-references
173
235
 
@@ -1,7 +1,7 @@
1
1
  # `ui-handoff.md` — the design contract
2
2
 
3
- The artifact the UI Designer produces in DEFINE and the implementer builds from when implementing. It lives at
4
- `.claude/state/tasks/<id>/spec/ui-handoff.md`, a sibling of the spec, owned by the UI Designer.
3
+ The artifact the Orchestrator authors at DEFINE (via the `grill-ui` interview) and the implementer builds from when implementing. It lives at
4
+ `.claude/state/tasks/<id>/spec/ui-handoff.md`, a sibling of the spec, owned by the Orchestrator; the UI Designer critiques it at DEFINE and reviews the built UI against it at REVIEW.
5
5
 
6
6
  **It captures DECISIONS and targets, not know-how.** How to apply tokens to a stack, avoid generic
7
7
  "AI slop", or meet WCAG lives in the implementer's and reviewer's skills. This file says _what to
@@ -28,9 +28,9 @@ Every section is **N/A-able** per task: mark a section N/A rather than padding i
28
28
 
29
29
  **Status**: in_progress | completed
30
30
 
31
- > Owned by the UI Designer. Sibling of the spec. The implementer builds from this via the `build-ui`
32
- > skill; the design QA lens checks the built UI against it at REVIEW. Decisions-altitude; text-first;
33
- > tokens by reference.
31
+ > Owned by the Orchestrator (authored via `grill-ui`). Sibling of the spec. The implementer builds
32
+ > from this via the `build-ui` skill; the design QA lens checks the built UI against it at REVIEW.
33
+ > Decisions-altitude; text-first; tokens by reference.
34
34
 
35
35
  ## 1. Personas / users served
36
36
 
@@ -86,9 +86,10 @@ Every section is **N/A-able** per task: mark a section N/A rather than padding i
86
86
 
87
87
  Reference `docs/design-tokens.json` — the single, client-owned source of truth, a 3-tier
88
88
  W3C-DTCG model (`primitive` → `semantic` → `component`). **Never inline token values here; point at
89
- the file.** If the project has no token file yet, say so and capture it as an open question — never
90
- invent a token set. `lemony design-tokens validate` flags raw colours/dimensions in source that
91
- should reference a token.
89
+ the file.** If the project has no token file yet, the interview offers to scaffold one (derived from
90
+ the answers) or to connect a design tool; if the human declines both, say so and capture it as an
91
+ open question — never invent a token set silently. `lemony design-tokens validate` flags raw
92
+ colours/dimensions in source that should reference a token.
92
93
 
93
94
  ## Open questions
94
95
 
@@ -9,6 +9,7 @@ attribution:
9
9
  author: Matt Pocock
10
10
  url: https://github.com/mattpocock/skills
11
11
  license: MIT
12
+ copyright: Copyright (c) 2026 Matt Pocock
12
13
  relationship: derived-from
13
14
  note: grill workflow and decision-by-decision interview structure
14
15
  ---
@@ -5,6 +5,14 @@ origin: vendor
5
5
  vendor_version: '{{vendor_version}}'
6
6
  phase: during-implementation
7
7
  invoked-by: [implementer]
8
+ attribution:
9
+ - source: mattpocock/skills
10
+ author: Matt Pocock
11
+ url: https://github.com/mattpocock/skills
12
+ license: MIT
13
+ copyright: Copyright (c) 2026 Matt Pocock
14
+ relationship: derived-from
15
+ note: the red-green cycle, the behavior-over-implementation core principle, the vertical-slice ("tracer bullet") framing, mock-at-system-boundaries guidance, and the ADR three-tests nudge
8
16
  ---
9
17
 
10
18
  # Test-Driven Development
@@ -5,6 +5,14 @@ origin: vendor
5
5
  vendor_version: '{{vendor_version}}'
6
6
  invoked-by: [architect]
7
7
  trigger-condition: a resolved decision is worth recording (a discovery resolution, or an explicit request)
8
+ attribution:
9
+ - source: mattpocock/skills
10
+ author: Matt Pocock
11
+ url: https://github.com/mattpocock/skills
12
+ license: MIT
13
+ copyright: Copyright (c) 2026 Matt Pocock
14
+ relationship: derived-from
15
+ note: ADR format — the three-tests rubric (hard to reverse / surprising / real trade-off), the record template, and the "what qualifies" guidance
8
16
  ---
9
17
 
10
18
  # Write ADR
@@ -57,30 +57,33 @@ A task deserves the harness if it is **specifiable**, **verifiable**, or
57
57
  `harness:sdd` + `harness:status:spec-in-progress`) and the branch
58
58
  `harness/<id>-<slug>`. `<id>` is the GitHub issue number in this build; spec and code
59
59
  both live on that branch — nothing touches the default branch until the merge gate.
60
- 3. **Spec** — Spec Author sub-agent (given the `<id>` + branch): `prd-to-spec` (→
61
- `requirements.md` EARS + `design.md` + `tasks.md` under `tasks/<id>/spec/`) then
62
- `spec-to-issue` (fills the issue body it creates nothing and moves no labels).
63
- **UI design gate** (§UI design in `orchestrator.md`): if the repo has a frontend AND
64
- the task touches UI, put `harness:needs-design`, offer the design-stop, and on
65
- "continue" dispatch the **UI Designer** to author `ui-handoff.md` alongside the spec.
66
- 4. **Spec-ready + handoff** remove `harness:needs-design` once `ui-handoff.md` is
60
+ 3. **UI design (if it touches UI)** — **UI design gate** (§UI design in `orchestrator.md`):
61
+ if the repo has a frontend AND the task touches UI, put `harness:needs-design`, offer the
62
+ design-stop, and on "continue" **run `grill-ui` yourself** (the interactive design
63
+ interview) to author `ui-handoff.md` under `tasks/<id>/spec/`, then dispatch the **UI
64
+ Designer** to **critique** it resolve its findings before the Spec Author runs.
65
+ 4. **Spec** — Spec Author sub-agent (given the `<id>` + branch, and the `ui-handoff.md` if
66
+ one was authored): `prd-to-spec` (→ `requirements.md` EARS + `design.md` + `tasks.md`
67
+ under `tasks/<id>/spec/`) then `spec-to-issue` (fills the issue body — it creates nothing
68
+ and moves no labels).
69
+ 5. **Spec-ready + handoff** — remove `harness:needs-design` once `ui-handoff.md` is
67
70
  complete (a spec-ready task never carries it), flip to `harness:status:spec-ready`,
68
71
  commit and push the task state to the branch. DEFINE can stop here: the spec-ready
69
72
  queue (`gh issue list -l harness:status:spec-ready`) is the handoff. Ask: implement
70
73
  now or hand off?
71
- 5. **Approval gate** — run by whoever implements (a RESUME of a spec-ready issue runs
74
+ 6. **Approval gate** — run by whoever implements (a RESUME of a spec-ready issue runs
72
75
  it). Present the spec; the human approves (or asks for changes → Spec Author
73
76
  revises). On approval, flip to `harness:status:in-progress`. The spec, not the code,
74
77
  is the source of intent — never self-approve.
75
- 6. **Implement** — Implementer sub-agent, `tdd` skill, on the branch, keeping
78
+ 7. **Implement** — Implementer sub-agent, `tdd` skill, on the branch, keeping
76
79
  `.claude/state/tasks/<id>/progress.md` live.
77
- 7. **Review** — flip to `harness:status:in-review`, open the PR (`gh pr create`,
80
+ 8. **Review** — flip to `harness:status:in-review`, open the PR (`gh pr create`,
78
81
  branch → default), Reviewer sub-agent reviews it (`senior-review`, fresh context). If
79
82
  the task touched UI, the **UI Designer** reviews as a distinct design + a11y lens too
80
83
  — either lens rejecting routes back to the Implementer.
81
- 8. **Merge gate** — never auto-merge. Surface the approved PR; the human merges (or
84
+ 9. **Merge gate** — never auto-merge. Surface the approved PR; the human merges (or
82
85
  authorizes you to). The task stays at `in-review` until merged.
83
- 9. **Closeout** — `task-closeout`: confirm the merge via `gh`, offer durable discoveries
86
+ 10. **Closeout** — `task-closeout`: confirm the merge via `gh`, offer durable discoveries
84
87
  to the Architect (`write-adr`, HITL), archive the spec + discoveries to `_archive/<id>/` (drop
85
88
  `progress.md`), and land `history.md` + the archival via a dedicated
86
89
  `harness/closeout-<id>` PR (`gh pr merge --auto`) — never a direct push to the base.
@@ -17,20 +17,8 @@ task_storage:
17
17
  type: github
18
18
  repo: {{task_storage_repo}}
19
19
 
20
- # Active agents (one `.claude/agents/<role>.md` per entry).
21
- agents:
22
- - orchestrator
23
- - spec-author
24
- - implementer
25
- - reviewer
26
- - architect # always installed; invoked on-demand, outside the linear flow
27
- # - ui-designer # catalog slot, inactive by default
28
-
29
20
  # Paths (relative; defaults shown — declare only overrides).
30
21
  paths:
31
- state: .claude/state
32
- skills: .claude/skills
33
- agents: .claude/agents
34
22
  # Project-local playbooks (how-to-build patterns). Looked up by convention
35
23
  # `<topic>.md`, local then global; the local entry overrides the global one.
36
24
  # The require/suggest hooks read these two keys directly on every fire, so a