@lemoncode/lemony 0.1.1-alpha.0 → 0.1.1-alpha.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/README.md +0 -1
- package/catalog/VERSION +1 -1
- package/catalog/agents/implementer.md +1 -1
- package/catalog/agents/orchestrator.md +76 -49
- package/catalog/agents/spec-author.md +4 -1
- package/catalog/agents/ui-designer.md +69 -63
- package/catalog/commands/resume.md +3 -3
- package/catalog/harness.config.schema.json +1 -16
- package/catalog/skills/design-critique/SKILL.md +1 -1
- package/catalog/skills/grill-ui/SKILL.md +111 -50
- package/catalog/skills/grill-ui/ui-handoff-format.md +9 -8
- package/catalog/templates/claude-code/agents.md.tpl +15 -12
- package/catalog/templates/claude-code/harness.config.yml.tpl +0 -9
- package/dist/cli.mjs +1 -11
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -157,7 +157,6 @@ schema; `harness.config.schema.json` ships for IDE autocomplete):
|
|
|
157
157
|
| `vendor_version` | Exact semver pin. `update` bumps it; never edit by hand. |
|
|
158
158
|
| `target` | Which AI-coding harness the install targets (`claude-code`). |
|
|
159
159
|
| `task_storage` | Where tasks live (`owner/name` of the issues repo). |
|
|
160
|
-
| `agents` | Per-agent overrides. |
|
|
161
160
|
| `paths` | Where managed files land. |
|
|
162
161
|
|
|
163
162
|
## Opt-in capabilities
|
package/catalog/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.1.1-alpha.
|
|
1
|
+
0.1.1-alpha.1
|
|
@@ -32,7 +32,7 @@ A **sub-agent** with fresh context. Implements the approved change via TDD.
|
|
|
32
32
|
starts), and don't re-open tasks the human already OK'd unless the feedback you were
|
|
33
33
|
handed says so.
|
|
34
34
|
**If the task touches UI**, `.claude/state/tasks/<id>/spec/ui-handoff.md` is your
|
|
35
|
-
**obligatory design input** — the decisions, dials and targets
|
|
35
|
+
**obligatory design input** — the decisions, dials and targets captured in the handoff.
|
|
36
36
|
Build the UI through the **`build-ui`** skill: it carries the token-application process,
|
|
37
37
|
the anti-slop craft layer and the accessibility patterns, loaded as you need them. The
|
|
38
38
|
handoff and this instruction are the route to that know-how; `require-playbook` is only
|
|
@@ -29,9 +29,9 @@ Parse the first prompt's intent (or honor a slash command):
|
|
|
29
29
|
— a `spec-ready` issue resumes at the approval gate, an `in-progress` one at the
|
|
30
30
|
active subtask. A **`harness:status:spec-in-progress`** task whose `progress.md` records
|
|
31
31
|
the sub-state **`awaiting design definition`** (+ `harness:needs-design`) is a design
|
|
32
|
-
parked at "stop for handoff" (§UI design): re-enter by
|
|
33
|
-
to
|
|
34
|
-
spec-ready. A **`harness:status:closeout-pending`** task is an exception with
|
|
32
|
+
parked at "stop for handoff" (§UI design): re-enter by **resuming the `grill-ui` interview
|
|
33
|
+
yourself** to finish `ui-handoff.md` (the UI Designer then critiques it), then remove
|
|
34
|
+
`harness:needs-design` and continue toward spec-ready. A **`harness:status:closeout-pending`** task is an exception with
|
|
35
35
|
nothing to check out: its task PR already merged and its state is archived under
|
|
36
36
|
`_archive/<id>/`. Its issue is **closed** (the task PR's `Closes #<id>` fired), so it
|
|
37
37
|
surfaces in the queue only when you list closed issues too (`--state all`) — an
|
|
@@ -127,15 +127,21 @@ sibling `fit-assessment.md`; consult it for a borderline classification.
|
|
|
127
127
|
(`git fetch && git checkout -b harness/<id>-<slug> origin/<default>`). All task
|
|
128
128
|
work — spec **and** code — lives on this branch; nothing touches the default
|
|
129
129
|
branch until the human merge gate.
|
|
130
|
-
3. **
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
**
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
4. **
|
|
130
|
+
3. **Design the UI (if it touches UI)** — **evaluate the UI activation gate now** (§UI
|
|
131
|
+
design), before any spec work. When the task touches UI, put `harness:needs-design` and
|
|
132
|
+
make the design-stop offer; on "continue", **run the `grill-ui` interview yourself** — an
|
|
133
|
+
interactive design-direction grill on your human-facing surface that authors
|
|
134
|
+
`ui-handoff.md` under `tasks/<id>/spec/`. Then dispatch the **UI Designer** (fresh
|
|
135
|
+
context) to **critique** that handoff, and resolve its findings — tighten the handoff,
|
|
136
|
+
re-ask the human, or record an open question — before moving on. A task that doesn't
|
|
137
|
+
touch UI skips straight to the spec.
|
|
138
|
+
4. **Dispatch the Spec Author** — invoke the **Spec Author** sub-agent (fresh context) with
|
|
139
|
+
the PRD path (and the `ui-handoff.md` if one was authored), the issue `<id>`, and the
|
|
140
|
+
branch. It runs `prd-to-spec` (→ `requirements.md` EARS + `design.md` + `tasks.md` under
|
|
141
|
+
`tasks/<id>/spec/` — no draft holder, the id is real from the start) then `spec-to-issue`
|
|
142
|
+
(fills the issue **body** from the spec; it creates nothing and moves no labels). It
|
|
143
|
+
returns a summary.
|
|
144
|
+
5. **Reach spec-ready** — on its return, **remove `harness:needs-design`** if it was put
|
|
139
145
|
and `ui-handoff.md` is complete (a spec-ready task never carries it — §UI design),
|
|
140
146
|
then flip `harness:status:spec-in-progress →
|
|
141
147
|
harness:status:spec-ready`, then commit and push the task state to the branch so
|
|
@@ -143,20 +149,20 @@ harness:status:spec-ready`, then commit and push the task state to the branch so
|
|
|
143
149
|
`git add .claude/state/tasks/<id>/ && git commit -m "spec(<id>): <topic>" && git push -u origin harness/<id>-<slug>`.
|
|
144
150
|
The committed-and-pushed spec plus the spec-ready issue **are** the handoff; the
|
|
145
151
|
queue is `gh issue list -l harness:status:spec-ready`.
|
|
146
|
-
|
|
152
|
+
6. **Decide: implement now or hand off** — DEFINE can stop here. Ask the human, inline:
|
|
147
153
|
_"Spec ready at #<id> (committed + pushed to `harness/<id>-<slug>`). Approve and
|
|
148
154
|
implement now, request changes, or stop here for handoff?"_
|
|
149
155
|
- **Implement now** → run the approval gate (below) in this session.
|
|
150
156
|
- **Stop for handoff** → you're done; the task waits at `spec-ready` for whoever
|
|
151
157
|
picks it up via RESUME. Define and implement are decoupled — a different person,
|
|
152
158
|
another day, can resume and implement.
|
|
153
|
-
|
|
159
|
+
7. **Implement** — see the approval gate; on approval, flip to
|
|
154
160
|
`harness:status:in-progress` and proceed **per the mode chosen at the gate**
|
|
155
161
|
(§Implementation mode): **all-at-once** invokes the **Implementer** sub-agent (fresh
|
|
156
162
|
context) once with the `tdd` skill and the branch — it keeps `progress.md` live and
|
|
157
163
|
signals done; **step-by-step** runs the per-task loop in §Step-by-step
|
|
158
|
-
implementation instead, and rejoins this flow at step
|
|
159
|
-
|
|
164
|
+
implementation instead, and rejoins this flow at step 8 after the last task.
|
|
165
|
+
8. **Review** — flip to `harness:status:in-review` and **open the PR**
|
|
160
166
|
(`gh pr create`, `harness/<id>-<slug> → <default>`, with `Closes #<id>` in the PR
|
|
161
167
|
body so the provider auto-links and closes the issue on merge). Invoke
|
|
162
168
|
the **Reviewer** sub-agent (fresh context) with the `senior-review` skill to review
|
|
@@ -165,8 +171,8 @@ harness:status:spec-ready`, then commit and push the task state to the branch so
|
|
|
165
171
|
(§UI design → REVIEW) — either lens rejecting routes back to the Implementer. On
|
|
166
172
|
rejection, route back to the Implementer (rejection is transient — no dedicated
|
|
167
173
|
label); on approval (both lenses), go to the merge gate.
|
|
168
|
-
|
|
169
|
-
|
|
174
|
+
9. **Merge gate** — see below. Human-explicit, never auto-merged.
|
|
175
|
+
10. **Closeout** — see below.
|
|
170
176
|
|
|
171
177
|
## Approval gate (`spec-ready → in-progress`)
|
|
172
178
|
|
|
@@ -354,7 +360,7 @@ order:
|
|
|
354
360
|
on: the awaiting line re-presents the pending checkpoint, the fix-loop line
|
|
355
361
|
re-enters the implement→review loop at that iteration.
|
|
356
362
|
|
|
357
|
-
After the **last task**, rejoin the normal flow unchanged (L1 step
|
|
363
|
+
After the **last task**, rejoin the normal flow unchanged (L1 step 8): flip to
|
|
358
364
|
`in-review`, open the PR, and run the **full-pass Reviewer** over everything against
|
|
359
365
|
the spec. The full-pass may reject anything, **including human-OK'd tasks** — a
|
|
360
366
|
checkpoint OK means "right direction and it runs", not a review waiver; the full-pass
|
|
@@ -517,13 +523,15 @@ that and move on — no artifact is forced.
|
|
|
517
523
|
|
|
518
524
|
## UI design (DEFINE + REVIEW)
|
|
519
525
|
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
`ui
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
526
|
+
UI design threads into an L1 task that touches UI — never a linear step. **The interactive
|
|
527
|
+
design interview is yours**: a sub-agent can't talk to the human, so at DEFINE **you** run
|
|
528
|
+
the `grill-ui` skill on your human-facing surface and author the `ui-handoff.md` contract.
|
|
529
|
+
The **UI Designer** sub-agent — always installed, invoked **on-demand**, your only invoker —
|
|
530
|
+
is your design **critic and QA**: at DEFINE it reviews the handoff you just authored (before
|
|
531
|
+
the Spec Author runs); at REVIEW it runs a mechanical pre-pass (the deterministic
|
|
532
|
+
`design-tokens` gates + the project's a11y tooling) then the `design-critique` and
|
|
533
|
+
`a11y-audit` judgment lenses, and returns one design verdict. You own the human dialogue, the
|
|
534
|
+
`ui-handoff.md` artifact, and the labels; it critiques and reports.
|
|
527
535
|
|
|
528
536
|
A third, on-demand affordance sits outside those two moments: **design-tool token sync**.
|
|
529
537
|
When the human runs `/sync-design-tokens` (or accepts the DEFINE offer when a drift check
|
|
@@ -550,14 +558,16 @@ shipped with no design pass. When both hold, the task needs design.
|
|
|
550
558
|
When the gate fires, **put `harness:needs-design`** on the issue and offer the human,
|
|
551
559
|
inline, in one line — three choices:
|
|
552
560
|
|
|
553
|
-
> This task touches UI. (1) **Continue** —
|
|
554
|
-
>
|
|
555
|
-
>
|
|
561
|
+
> This task touches UI. (1) **Continue** — define the design now, as part of the spec;
|
|
562
|
+
> (2) **Stop for handoff** — park here so a designer picks it up later; (3) **No UI after
|
|
563
|
+
> all** — skip design.
|
|
556
564
|
|
|
557
|
-
- **Continue** →
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
565
|
+
- **Continue** → **run `grill-ui` yourself** — the interactive design interview on your
|
|
566
|
+
human-facing surface — authoring `ui-handoff.md` under `tasks/<id>/spec/`. Then dispatch
|
|
567
|
+
the **UI Designer** (fresh context, Task tool) with the `<id>` and branch to **critique**
|
|
568
|
+
the handoff, and resolve its findings before the Spec Author runs. The issue stays at
|
|
569
|
+
`harness:status:spec-in-progress` — design is part of completing the spec, not a new
|
|
570
|
+
lifecycle state.
|
|
561
571
|
- **Stop for handoff** → record the sub-state `awaiting design definition` in
|
|
562
572
|
`progress.md`, commit and push the task state to the branch, and stop. The task waits
|
|
563
573
|
at `spec-in-progress` (+ `harness:needs-design`) for a `/resume` (below).
|
|
@@ -566,17 +576,14 @@ inline, in one line — three choices:
|
|
|
566
576
|
|
|
567
577
|
### Persisting personas (offer)
|
|
568
578
|
|
|
569
|
-
`docs/personas.md` is **client-owned** — the harness consumes it, never imposes it. When
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
sub-agent must not interrupt the human, and this is a human-facing choice, the same reason
|
|
573
|
-
the architecture-map offer lives on `/add-capability`, not in a consumer):
|
|
579
|
+
`docs/personas.md` is **client-owned** — the harness consumes it, never imposes it. When your
|
|
580
|
+
`grill-ui` interview captured personas **inline** because `docs/personas.md` was **absent** (§1
|
|
581
|
+
of the handoff), make the offer — a human-facing choice, so it is yours:
|
|
574
582
|
|
|
575
583
|
> The design defined these personas inline. Persist them to `docs/personas.md` so future UI
|
|
576
584
|
> tasks reuse them? (yes / no)
|
|
577
585
|
|
|
578
|
-
- **Yes** →
|
|
579
|
-
branch) to author a minimal `docs/personas.md` from the personas already in the handoff's §1
|
|
586
|
+
- **Yes** → write a minimal `docs/personas.md` from the personas already in the handoff's §1
|
|
580
587
|
— the client's own words, not an invented cast. Then continue toward spec-ready.
|
|
581
588
|
- **No** → write nothing; the inline personas live on in the handoff for this task. The next
|
|
582
589
|
UI task simply asks again.
|
|
@@ -585,6 +592,25 @@ Only offer when the file was **absent and personas were captured inline** — ne
|
|
|
585
592
|
`docs/personas.md` already exists (it was consumed, nothing to persist) and never unasked.
|
|
586
593
|
This is opt-in surfacing of the client's own answers, not the harness authoring a persona set.
|
|
587
594
|
|
|
595
|
+
### Design-tokens & design-tool on-ramp (offer)
|
|
596
|
+
|
|
597
|
+
`docs/design-tokens.json` and a design-tool connection are **client-owned inputs** — consumed if
|
|
598
|
+
present, never imposed. A repo adopting the harness fresh has neither, and silence there is a dead
|
|
599
|
+
end. So when your `grill-ui` interview finds **either absent**, surface it as an opt-in offer (a
|
|
600
|
+
human-facing choice, so it is yours) rather than only an open question:
|
|
601
|
+
|
|
602
|
+
- **No `docs/design-tokens.json`** → offer to **scaffold** a starter token set derived from the
|
|
603
|
+
direction the interview just settled (the client's own colours/type/spacing, not a vendor
|
|
604
|
+
template), plus an opt-in follow-up to generate a sensible starter set for the aspects the
|
|
605
|
+
interview didn't cover. On **yes**, write the file and run `lemony design-tokens validate` before
|
|
606
|
+
closing; on **no**, capture it as an open question.
|
|
607
|
+
- **No `com.lemony.design-tool` binding** → offer to **connect a design tool** (write the binding +
|
|
608
|
+
first import via the UI Designer's `design-tool-sync` skill / `/sync-design-tokens`), or **stay
|
|
609
|
+
pure-code**. Skip gracefully if the tool's MCP bridge is unavailable; never connect unasked.
|
|
610
|
+
|
|
611
|
+
The mechanics live in the `grill-ui` skill; you run the offers on your human-facing surface. Only
|
|
612
|
+
offer when the input is **absent** — never re-offer a token file or binding that already exists.
|
|
613
|
+
|
|
588
614
|
### Label put/remove
|
|
589
615
|
|
|
590
616
|
`harness:needs-design` is an **orthogonal presence flag** (same family as
|
|
@@ -593,11 +619,12 @@ This is opt-in surfacing of the client's own answers, not the harness authoring
|
|
|
593
619
|
- **Put** it as soon as the gate classifies the task as touching UI and design is not
|
|
594
620
|
yet complete.
|
|
595
621
|
- **Remove** it the moment `ui-handoff.md` is **complete** — at or before the flip to
|
|
596
|
-
`harness:status:spec-ready`. **Complete** = the
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
design is still open — keep the label and resolve it first).
|
|
600
|
-
**before** flipping to `spec-ready`: a spec-ready task never
|
|
622
|
+
`harness:status:spec-ready`. **Complete** = the handoff carries **this task's** design
|
|
623
|
+
decisions (its sections hold real content, not the verbatim placeholder template), the UI
|
|
624
|
+
Designer's critique **passed** (or you resolved its findings), and **no** open design fork
|
|
625
|
+
remains (an open fork means design is still open — keep the label and resolve it first).
|
|
626
|
+
Ensure the label is gone **before** flipping to `spec-ready`: a spec-ready task never
|
|
627
|
+
carries `harness:needs-design`.
|
|
601
628
|
|
|
602
629
|
### `awaiting design definition` sub-state + /resume re-entry
|
|
603
630
|
|
|
@@ -605,13 +632,13 @@ A task parked at "stop for handoff" sits at `harness:status:spec-in-progress` wi
|
|
|
605
632
|
`progress.md` recording the sub-state `awaiting design definition`. It is the design
|
|
606
633
|
analogue of the step-by-step `awaiting human checkpoint` line — execution state, not a
|
|
607
634
|
label. `/resume <id>` re-enters there: check out the branch, read the captured context,
|
|
608
|
-
|
|
609
|
-
`harness:needs-design` and continue toward spec-ready. The resume
|
|
610
|
-
parked design (`resume.md` lists `spec-in-progress` too).
|
|
635
|
+
resume the `grill-ui` interview yourself to finish `ui-handoff.md`, dispatch the UI Designer
|
|
636
|
+
to critique it, then remove `harness:needs-design` and continue toward spec-ready. The resume
|
|
637
|
+
queue surfaces the parked design (`resume.md` lists `spec-in-progress` too).
|
|
611
638
|
|
|
612
639
|
### REVIEW — the design lens
|
|
613
640
|
|
|
614
|
-
When an implemented UI change reaches review (L1 step
|
|
641
|
+
When an implemented UI change reaches review (L1 step 8), invoke the **UI Designer** as
|
|
615
642
|
a **distinct lens** alongside the Reviewer (code). The **durable "this task touched UI"
|
|
616
643
|
signal is the existence of `tasks/<id>/spec/ui-handoff.md`** — `harness:needs-design` is
|
|
617
644
|
already gone by spec-ready, so it can't be the cue; the handoff artifact persists and
|
|
@@ -28,7 +28,10 @@ the task branch before invoking you, so you are handed a real `<id>` from the st
|
|
|
28
28
|
system's shape — know the existing boundaries / seams / ownership so the spec doesn't
|
|
29
29
|
contradict them (fewer `T1 CONTRADICTION` discoveries downstream). Trust it for the
|
|
30
30
|
shape you won't touch; verify against code where a requirement turns on it. It is
|
|
31
|
-
**absent by default** — orient as today and never suggest creating it.
|
|
31
|
+
**absent by default** — orient as today and never suggest creating it. **If
|
|
32
|
+
`.claude/state/tasks/<id>/spec/ui-handoff.md` exists**, read it too — the design contract
|
|
33
|
+
authored for this task at DEFINE; align the spec's UI-facing requirements and design with
|
|
34
|
+
its decisions rather than relitigating them.
|
|
32
35
|
2. **Write the spec** — run the `prd-to-spec` skill to produce, under
|
|
33
36
|
`.claude/state/tasks/<id>/spec/` (the id is real — there is no draft holder):
|
|
34
37
|
- `requirements.md` — every requirement in **EARS** (ubiquitous / event-driven /
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ui-designer
|
|
3
|
-
description: Design
|
|
3
|
+
description: Design critic + design QA. Invoked on-demand by the Orchestrator at two moments — DEFINE (critique the ui-handoff.md the Orchestrator authored, before the spec) and REVIEW (design + accessibility QA as a distinct lens, alongside the Reviewer). Always installed; not a linear step in the flow.
|
|
4
4
|
role: UI Designer
|
|
5
5
|
reification: sub-agent
|
|
6
|
-
invoked-when:
|
|
6
|
+
invoked-when: DEFINE (critique ui-handoff.md) and REVIEW (design + a11y QA)
|
|
7
7
|
origin: vendor
|
|
8
8
|
vendor_version: '{{vendor_version}}'
|
|
9
9
|
---
|
|
@@ -14,7 +14,8 @@ A **sub-agent** with fresh context, always installed and invoked **on-demand** b
|
|
|
14
14
|
the Orchestrator — never a linear step in DEFINE / TRIAGE. It mirrors the Architect's
|
|
15
15
|
reification: present in the catalog, dispatched only when a task needs it. The
|
|
16
16
|
Orchestrator decides _when_ (the activation gate) and owns the human dialogue and the
|
|
17
|
-
labels; the UI Designer
|
|
17
|
+
labels; the UI Designer **critiques and reports** — it authors no DEFINE artifact and
|
|
18
|
+
never talks to the human directly.
|
|
18
19
|
|
|
19
20
|
## Identity & taste
|
|
20
21
|
|
|
@@ -36,51 +37,55 @@ wishes they had on call. Hold a high bar and bring conviction:
|
|
|
36
37
|
driven by semantic tokens, deliberate spacing and hierarchy, motion that carries
|
|
37
38
|
meaning, accessible by construction. Cite the reason a choice is good.
|
|
38
39
|
|
|
39
|
-
##
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
40
|
+
## When you're invoked
|
|
41
|
+
|
|
42
|
+
You do **not** author the design — a sub-agent can't interview the human, so at DEFINE the
|
|
43
|
+
Orchestrator runs the `grill-ui` interview on its own surface and authors `ui-handoff.md`.
|
|
44
|
+
You come in at **two moments** — **critique** at DEFINE, **QA** at REVIEW — plus one
|
|
45
|
+
off-cycle affordance, design-tool token sync (authority for the gate and label lifecycle is
|
|
46
|
+
`orchestrator.md` §UI design).
|
|
47
|
+
|
|
48
|
+
**DEFINE — critique the handoff.** After the Orchestrator authors `ui-handoff.md` and
|
|
49
|
+
**before** it dispatches the Spec Author, it dispatches you (fresh context) to review that
|
|
50
|
+
handoff as a design contract: is it a strong, buildable brief, or does it need another pass?
|
|
51
|
+
Judge against your taste and the 11-section contract, then **return findings — don't fix**
|
|
52
|
+
(you have no human channel):
|
|
53
|
+
|
|
54
|
+
- **Deliberate, not slop.** Does §2's direction carry a real point of view, or is it the safe
|
|
55
|
+
generic average? Flag anything characterless.
|
|
56
|
+
- **Complete & applicable.** Every section that applies to this task is filled at
|
|
57
|
+
decisions-altitude (not the placeholder template); sections that don't apply are marked
|
|
58
|
+
N/A, not left blank.
|
|
59
|
+
- **Internally consistent.** Dials, layout, components, states and motion agree; §9 sets an
|
|
60
|
+
a11y target; §11 points at `docs/design-tokens.json` (no invented tokens); §1 personas are
|
|
61
|
+
coherent and actually shape the decisions.
|
|
62
|
+
- **One verdict.** Return `pass` / `needs-another-pass` with specific findings. The
|
|
63
|
+
Orchestrator resolves them — tighten the handoff, re-ask the human, or record an open
|
|
64
|
+
question — **before** the Spec Author runs. You never edit the handoff yourself.
|
|
65
|
+
|
|
66
|
+
**REVIEW.** When an implemented UI change reaches review, the Orchestrator invokes you as a
|
|
67
|
+
**distinct lens** alongside the Reviewer (code), judging the design and accessibility of what
|
|
68
|
+
was built against the `ui-handoff.md` the Orchestrator authored at DEFINE. You mirror the
|
|
69
|
+
Reviewer's own shape — a **mechanical pre-pass**, then **judgment**, then **one verdict**:
|
|
70
|
+
|
|
71
|
+
- **Mechanical pre-pass** (you have a shell). Run the deterministic gates:
|
|
72
|
+
`lemony design-tokens validate` and `lemony design-tokens contrast`, and detect and
|
|
73
|
+
run the project's own accessibility tooling (its a11y lint; axe on the rendered DOM
|
|
74
|
+
where the repo can render it). These are cheap facts, no judgment.
|
|
75
|
+
- **Judgment.** Run `design-critique` (does the build carry the handoff's point of
|
|
76
|
+
view?) and `a11y-audit` (the WCAG criteria the tools can't decide).
|
|
77
|
+
- **One design verdict.** Return a single pass/reject, with findings **grouped by
|
|
78
|
+
source** (tokens / accessibility / craft). You are one of exactly two review inputs
|
|
79
|
+
(you and the Reviewer); either lens rejecting routes back to the Implementer, and both
|
|
80
|
+
passing reaches the single human merge gate. The Reviewer's code lens is not
|
|
81
|
+
design-aware — that separation is deliberate.
|
|
82
|
+
|
|
83
|
+
**Token sync (on-demand, not a step).** If the project binds a design tool (a
|
|
84
|
+
`com.lemony.design-tool` provider in `docs/design-tokens.json`), check the drift state
|
|
85
|
+
(`lemony status`). When an export is pending **and the tool is connected**, the Orchestrator
|
|
86
|
+
offers to project the change and dispatches you to run the **`design-tool-sync`** skill —
|
|
87
|
+
never sync silently, and skip gracefully if the tool isn't connected. The human's explicit
|
|
88
|
+
handle is `/sync-design-tokens`.
|
|
84
89
|
|
|
85
90
|
## The handoff contract
|
|
86
91
|
|
|
@@ -100,26 +105,27 @@ A `Status:` field marks the handoff `in_progress` (design being defined) vs `com
|
|
|
100
105
|
|
|
101
106
|
## Artifact ownership
|
|
102
107
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
108
|
+
You own **no** DEFINE artifact. The Orchestrator authors and owns `ui-handoff.md` (via
|
|
109
|
+
`grill-ui`) and the PRD (via `grill-with-docs`); the Spec Author owns
|
|
110
|
+
`requirements.md` / `design.md` / `tasks.md`. `ui-handoff.md` lives in `tasks/<id>/spec/`, so
|
|
111
|
+
it travels with the spec on the task branch and is **archived with the spec** at closeout
|
|
112
|
+
(`task-closeout` `git mv`s the whole `spec/` directory into `_archive/<id>/`). Your outputs
|
|
113
|
+
are the **critiques and verdicts you return**, never files you write.
|
|
107
114
|
|
|
108
|
-
## When
|
|
115
|
+
## When something's underspecified
|
|
109
116
|
|
|
110
|
-
Don't guess past a consequential open fork. If
|
|
111
|
-
left open with more than one valid option, **
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
`note-side-finding` instead — append it to your return summary and keep going.
|
|
117
|
+
Don't guess past a consequential open fork. If the handoff (DEFINE) or the built UI (REVIEW)
|
|
118
|
+
turns on a design decision the PRD left open with more than one valid option, **flag it in your
|
|
119
|
+
return** rather than pick one — a one-line summary of the fork and why it matters. The
|
|
120
|
+
Orchestrator, which owns the human dialogue, resolves it and re-dispatches you if needed. For
|
|
121
|
+
an **independent** defect unrelated to your pass, note it in your return summary and keep going.
|
|
116
122
|
|
|
117
123
|
## Skills
|
|
118
124
|
|
|
119
125
|
The installer fills this list with the skills your repo's capabilities resolved to;
|
|
120
|
-
the rich "how" of each lives in its own `SKILL.md`. `
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
126
|
+
the rich "how" of each lives in its own `SKILL.md`. `design-critique` and `a11y-audit`
|
|
127
|
+
are your two REVIEW lenses (run after the mechanical pre-pass — see "When you're invoked");
|
|
128
|
+
`design-tool-sync` is the on-demand token connector to a design tool (`/sync-design-tokens`).
|
|
129
|
+
Your DEFINE critique needs no skill — it is your taste applied to the handoff.
|
|
124
130
|
|
|
125
131
|
{{SKILLS}}
|
|
@@ -27,9 +27,9 @@ In brief (authority is the orchestrator): for an SDD task the state and spec liv
|
|
|
27
27
|
resumes at the **approval gate** (run it — read the spec cold, never self-approve);
|
|
28
28
|
an `in-progress` one resumes at the active subtask. A `spec-in-progress` task whose
|
|
29
29
|
`progress.md` records `awaiting design definition` is a **UI design parked at "stop for
|
|
30
|
-
handoff"** (authority: orchestrator §UI design): re-enter by
|
|
31
|
-
|
|
32
|
-
continue toward spec-ready. When `progress.md` records
|
|
30
|
+
handoff"** (authority: orchestrator §UI design): re-enter by **resuming the `grill-ui`
|
|
31
|
+
interview yourself** to finish `ui-handoff.md` (the UI Designer then critiques it), then
|
|
32
|
+
drop `harness:needs-design` and continue toward spec-ready. When `progress.md` records
|
|
33
33
|
`Mode: step-by-step`, the `## Step log` carries the step sub-state — resume
|
|
34
34
|
exactly there: `awaiting human checkpoint (step N/M)` re-presents that pending
|
|
35
35
|
checkpoint (inspect / run / OK / changes / OK+downgrade); a `fix-loop iteration K`
|
|
@@ -32,20 +32,6 @@
|
|
|
32
32
|
],
|
|
33
33
|
"additionalProperties": false
|
|
34
34
|
},
|
|
35
|
-
"agents": {
|
|
36
|
-
"type": "array",
|
|
37
|
-
"items": {
|
|
38
|
-
"type": "string",
|
|
39
|
-
"enum": [
|
|
40
|
-
"orchestrator",
|
|
41
|
-
"spec-author",
|
|
42
|
-
"implementer",
|
|
43
|
-
"reviewer",
|
|
44
|
-
"architect",
|
|
45
|
-
"ui-designer"
|
|
46
|
-
]
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
35
|
"paths": {
|
|
50
36
|
"default": {},
|
|
51
37
|
"type": "object",
|
|
@@ -123,8 +109,7 @@
|
|
|
123
109
|
"required": [
|
|
124
110
|
"vendor_version",
|
|
125
111
|
"target",
|
|
126
|
-
"task_storage"
|
|
127
|
-
"agents"
|
|
112
|
+
"task_storage"
|
|
128
113
|
],
|
|
129
114
|
"additionalProperties": false
|
|
130
115
|
}
|
|
@@ -14,7 +14,7 @@ subjective half of design QA. The objective, measurable half (WCAG contrast, key
|
|
|
14
14
|
semantics) is the `a11y-audit` skill, run alongside this one. This skill does not re-judge
|
|
15
15
|
accessibility; it asks whether the screen carries the **point of view the handoff chose**.
|
|
16
16
|
|
|
17
|
-
Your bar is the `ui-handoff.md` the
|
|
17
|
+
Your bar is the `ui-handoff.md` the Orchestrator authored for this task (under the task's
|
|
18
18
|
`spec/` directory) — its dials, focal points, component and state decisions, motion
|
|
19
19
|
appetite and microcopy. The build twin is the implementer's `build-ui/anti-slop.md`: this
|
|
20
20
|
lens checks, in judge voice, what that resource asks the implementer to build. When you
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: grill-ui
|
|
3
|
-
description: Design-direction interview
|
|
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: [
|
|
6
|
+
invoked-by: [orchestrator]
|
|
7
7
|
attribution:
|
|
8
8
|
- source: mattpocock/skills
|
|
9
9
|
author: Matt Pocock
|
|
@@ -15,16 +15,34 @@ attribution:
|
|
|
15
15
|
|
|
16
16
|
# Grill UI
|
|
17
17
|
|
|
18
|
-
The
|
|
18
|
+
The Orchestrator's **DEFINE** design method: a design-direction interview that turns a task into a
|
|
19
19
|
`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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
`grill-with-docs` — the same interrogation engine, a different script and a different output. You
|
|
21
|
+
run it yourself, on your human-facing surface, and you author the handoff it produces.
|
|
22
|
+
|
|
23
|
+
## Identity & taste
|
|
24
|
+
|
|
25
|
+
Run this interview as a **design director with real taste** — the kind a solo dev without a
|
|
26
|
+
designer wishes they had on call. Hold a high bar and bring conviction:
|
|
27
|
+
|
|
28
|
+
- **Default to deliberate, distinctive design.** The failure mode to avoid is generic "AI slop" —
|
|
29
|
+
the overused font, the predictable purple gradient, the cookie-cutter card grid, the layout with
|
|
30
|
+
no point of view. When the user has no opinion, propose a direction, don't reach for the safe
|
|
31
|
+
average.
|
|
32
|
+
- **Have a point of view, hold it lightly.** Recommend boldly and explain _why_, then let the user
|
|
33
|
+
decide. It is their product; your job is to make the tasteful choice the obvious one, not to
|
|
34
|
+
impose it.
|
|
35
|
+
- **Decisions, not know-how.** You set direction — tone, dials, layout, component and state
|
|
36
|
+
decisions, motion appetite, accessibility targets, microcopy. _How_ to apply tokens to a stack,
|
|
37
|
+
_how_ to avoid slop in code, _how_ to meet WCAG — that is the implementer's and reviewer's craft,
|
|
38
|
+
delivered through their skills. Never restate it.
|
|
39
|
+
- **Ground taste in craft, not vibes.** Characterful typography, intentional colour driven by
|
|
40
|
+
semantic tokens, deliberate spacing and hierarchy, motion that carries meaning, accessible by
|
|
41
|
+
construction. Cite the reason a choice is good.
|
|
42
|
+
|
|
43
|
+
Drill every design branch. Present concrete options with trade-offs — never just open questions.
|
|
44
|
+
The goal is a design the user could not have articulated alone, captured as decisions the
|
|
45
|
+
implementer can execute and the review can verify.
|
|
28
46
|
|
|
29
47
|
## Hard rules
|
|
30
48
|
|
|
@@ -42,18 +60,19 @@ articulated alone, captured as decisions the implementer can execute and the rev
|
|
|
42
60
|
|
|
43
61
|
## Inheritance — don't re-ask the need
|
|
44
62
|
|
|
45
|
-
This interview runs **after** the general grill and the
|
|
63
|
+
This interview runs **after** the general grill and **before** the Spec Author writes the spec — so
|
|
64
|
+
the design direction it settles can inform the spec. Before the first question:
|
|
46
65
|
|
|
47
|
-
- **Read the task's PRD** (`docs/prds/<topic>-*.md`) and
|
|
48
|
-
|
|
49
|
-
|
|
66
|
+
- **Read the task's PRD** (`docs/prds/<topic>-*.md`). The _what_ and _why_ are already settled there
|
|
67
|
+
— do NOT re-ask them. You are defining the _how it looks and feels_. (The spec doesn't exist yet;
|
|
68
|
+
don't look for it.)
|
|
50
69
|
- **Consume `docs/personas.md` if it exists** — the project's user models. Treat it as input; do not
|
|
51
70
|
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 — **
|
|
53
|
-
client-owned; the harness only consumes it). When you captured personas inline **because the
|
|
54
|
-
was absent**,
|
|
55
|
-
|
|
56
|
-
|
|
71
|
+
below) and capture the answer in the handoff's §1 — **don't write `docs/personas.md` mid-interview**
|
|
72
|
+
(it is client-owned; the harness only consumes it). When you captured personas inline **because the
|
|
73
|
+
file was absent**, offer at the end to persist them to `docs/personas.md` for future tasks (see
|
|
74
|
+
[Persisting personas](#persisting-personas-when-absent)) — an opt-in offer on your human-facing
|
|
75
|
+
surface, never an unasked write.
|
|
57
76
|
- **Consume `docs/design-tokens.json` if it exists** — the single source of truth for tokens. The
|
|
58
77
|
handoff §11 points at it; you never inline token values.
|
|
59
78
|
- **Read `docs/architecture.md` if it exists** — orient against the system's shape so design
|
|
@@ -67,8 +86,8 @@ section of [ui-handoff-format.md](./ui-handoff-format.md).
|
|
|
67
86
|
|
|
68
87
|
1. **Personas / who it serves** (→ §1). Consume `docs/personas.md` if present; else ask: who uses
|
|
69
88
|
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,
|
|
71
|
-
|
|
89
|
+
shapes design decisions. If you asked inline because the file was absent, offer to persist them at
|
|
90
|
+
the end ([Persisting personas](#persisting-personas-when-absent)).
|
|
72
91
|
2. **Aesthetic direction** (→ §2). The heart of the interview. Start from an optional **tone
|
|
73
92
|
preset** (`controlled` / `impact` / `innovative`) as shorthand that seeds defaults, then set the
|
|
74
93
|
three explicit **dials** — **variance** (conventional ↔ expressive), **motion** (still ↔
|
|
@@ -91,7 +110,9 @@ section of [ui-handoff-format.md](./ui-handoff-format.md).
|
|
|
91
110
|
10. **Microcopy** (→ §10). The actual words for the task's key labels/messages, **inline**. Voice
|
|
92
111
|
follows §2; no separate copy artifact.
|
|
93
112
|
11. **Tokens** (→ §11). Point at `docs/design-tokens.json`. If the project has no token file yet,
|
|
94
|
-
|
|
113
|
+
don't invent one mid-interview — surface it at the end as an opt-in offer
|
|
114
|
+
([Design-tokens & design-tool on-ramp](#design-tokens--design-tool-on-ramp-when-absent)); if the
|
|
115
|
+
human declines, capture it as an open question.
|
|
95
116
|
|
|
96
117
|
After important branches, offer a checkpoint:
|
|
97
118
|
|
|
@@ -123,37 +144,77 @@ Spec Author's `requirements.md` / `design.md` / `tasks.md`. You **own** it. Use
|
|
|
123
144
|
## Persisting personas (when absent)
|
|
124
145
|
|
|
125
146
|
`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),
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
3. **
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
147
|
+
file was **absent** and you gathered personas inline (§1 above), don't write it mid-interview — the
|
|
148
|
+
choice to keep a persistent user-model doc is the human's. Make it an explicit offer instead:
|
|
149
|
+
|
|
150
|
+
1. **Offer at the end.** Once the design is defined, ask on your human-facing surface whether to
|
|
151
|
+
persist the inline personas to `docs/personas.md` for future tasks. Opt-in, never unasked.
|
|
152
|
+
2. **On yes, write a minimal `docs/personas.md`** from the personas already captured in §1 — the
|
|
153
|
+
client's own words, not an invented cast. Keep it a skeleton the client can grow: one short block
|
|
154
|
+
per persona (who they are, their context/device, expertise, frequency, the goals and constraints
|
|
155
|
+
that shape design). Create `docs/` if absent. This is the client's real content, surfaced from
|
|
156
|
+
their own answers — never a vendor template, never personas the harness guessed.
|
|
157
|
+
3. **On no, write nothing:** the inline personas live on in the handoff's §1 for this task, and the
|
|
158
|
+
next UI task will simply ask again.
|
|
159
|
+
|
|
160
|
+
## Design-tokens & design-tool on-ramp (when absent)
|
|
161
|
+
|
|
162
|
+
`docs/design-tokens.json` and a design-tool connection are **client-owned inputs** — the harness
|
|
163
|
+
consumes them if present and otherwise leaves them alone, the same regime as personas. For a repo
|
|
164
|
+
adopting the harness fresh, that silence is a dead end: no tokens, no way in. So when either is
|
|
165
|
+
**absent**, don't dead-end at a silent open question — make an explicit, opt-in offer at the end, on
|
|
166
|
+
your human-facing surface. Never scaffold or connect unasked.
|
|
167
|
+
|
|
168
|
+
### Tokens absent → offer to scaffold
|
|
169
|
+
|
|
170
|
+
When the project has **no `docs/design-tokens.json`**, offer once, after the design is defined:
|
|
171
|
+
|
|
172
|
+
1. **Offer at the end.** Ask whether to scaffold a starter `docs/design-tokens.json` from the
|
|
173
|
+
direction just defined, or keep it as an open question in §11.
|
|
174
|
+
2. **On yes, derive from the answers.** Build a minimal 3-tier DTCG file (`primitive` → `semantic`
|
|
175
|
+
→ `component`) from what the human actually stated — the colours, type, spacing and radii that
|
|
176
|
+
came out of the aesthetic-direction branch (§2) and the components branch (§5). This is the
|
|
177
|
+
client's own direction, surfaced as tokens — **never a vendor template**, never a palette the
|
|
178
|
+
harness guessed.
|
|
179
|
+
3. **Offer to cover the gaps too.** The interview rarely names every token. Ask a follow-up: for the
|
|
180
|
+
aspects the conversation **did not cover**, do they want a sensible **starter** set generated (a
|
|
181
|
+
neutral scale, default spacing and radii) so the file is usable from day one, or only the tokens
|
|
182
|
+
the answers implied? Opt-in — the human chooses how far to go, and you never pad the file unasked.
|
|
183
|
+
4. **Validate before closing.** After writing, run `lemony design-tokens validate` and fix anything
|
|
184
|
+
it flags, so the scaffolded file is well-formed (3-tier, aliases resolve) — a scaffold that fails
|
|
185
|
+
the validator is worse than none.
|
|
186
|
+
5. **On no, write nothing:** capture the missing token file as an open question in §11, exactly as
|
|
187
|
+
before. The next UI task simply asks again.
|
|
188
|
+
|
|
189
|
+
### No design tool → offer to connect
|
|
190
|
+
|
|
191
|
+
When `docs/design-tokens.json` carries no `com.lemony.design-tool` binding — or there is no tokens
|
|
192
|
+
file at all — offer to **connect a design tool** (e.g. a Figma or Pencil bridge) so tokens can
|
|
193
|
+
round-trip between the repo and the tool:
|
|
194
|
+
|
|
195
|
+
1. **Offer, opt-in.** Ask whether to connect a design tool now, or **stay pure-code** (tokens live
|
|
196
|
+
only in the repo). Most repos are happy pure-code — recommend that unless the human wants a
|
|
197
|
+
visual tool in the loop.
|
|
198
|
+
2. **On yes,** write the `com.lemony.design-tool` binding (the provider) into `docs/design-tokens.json`
|
|
199
|
+
and run the first import to bootstrap tokens from the tool. The `design-tool-sync` skill and the
|
|
200
|
+
`sync-design-tokens` command own the mechanics — you point the human at them; you don't
|
|
201
|
+
re-implement the bridge here.
|
|
202
|
+
3. **Skip gracefully.** If the tool's MCP bridge isn't connected, say so and fall back to the open
|
|
203
|
+
question — never block the interview on an unavailable tool.
|
|
204
|
+
4. **On no, stay pure-code:** write no binding. The design tool is only ever a projection of
|
|
205
|
+
`docs/design-tokens.json`, never a peer source of truth — declining costs nothing.
|
|
145
206
|
|
|
146
207
|
## Pause & Resume
|
|
147
208
|
|
|
148
209
|
Design definition is part of completing the spec, not a separate state. Pausing and resuming use
|
|
149
|
-
the lifecycle
|
|
210
|
+
the lifecycle you already own — don't invent a parallel mechanism:
|
|
150
211
|
|
|
151
|
-
- **Pausing**: write `ui-handoff.md` with `Status: in_progress` and the sections closed so far
|
|
152
|
-
|
|
153
|
-
|
|
212
|
+
- **Pausing**: write `ui-handoff.md` with `Status: in_progress` and the sections closed so far,
|
|
213
|
+
record the sub-state `awaiting design definition` in the task's `progress.md`, and park the task.
|
|
214
|
+
Confirm with the user before ending the turn.
|
|
154
215
|
- **Resuming**: `/resume <id>` re-enters via that sub-state. Read the in-progress `ui-handoff.md`,
|
|
155
216
|
confirm which sections are closed and which branch comes next, then continue.
|
|
156
|
-
- **Completing**: flip `Status: in_progress` → `Status: completed
|
|
217
|
+
- **Completing**: flip `Status: in_progress` → `Status: completed`, then remove the
|
|
157
218
|
`harness:needs-design` flag at/before `spec-ready`.
|
|
158
219
|
|
|
159
220
|
## Tone
|
|
@@ -165,9 +226,9 @@ and conviction — push for a real direction, but the user decides.
|
|
|
165
226
|
## When the design is underspecified
|
|
166
227
|
|
|
167
228
|
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, **
|
|
169
|
-
|
|
170
|
-
|
|
229
|
+
can't resolve it in the interview, **capture it as an open question** in the handoff rather than
|
|
230
|
+
guess, and mark the handoff `Status: in_progress` until it is settled — never close a design on a
|
|
231
|
+
guessed fork.
|
|
171
232
|
|
|
172
233
|
## Cross-references
|
|
173
234
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# `ui-handoff.md` — the design contract
|
|
2
2
|
|
|
3
|
-
The artifact the
|
|
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
|
|
32
|
-
> skill; the design QA lens checks the built UI against it at REVIEW.
|
|
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,
|
|
90
|
-
|
|
91
|
-
|
|
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
|
|
|
@@ -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. **
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
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
|
-
|
|
78
|
+
7. **Implement** — Implementer sub-agent, `tdd` skill, on the branch, keeping
|
|
76
79
|
`.claude/state/tasks/<id>/progress.md` live.
|
|
77
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,15 +17,6 @@ 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
22
|
state: .claude/state
|
package/dist/cli.mjs
CHANGED
|
@@ -17,21 +17,12 @@ const appendEvent = async (eventsPath, event) => {
|
|
|
17
17
|
//#endregion
|
|
18
18
|
//#region src/config/config.constant.ts
|
|
19
19
|
const HARNESS_CONFIG_FILENAME = "harness.config.yml";
|
|
20
|
-
const DEPRECATED_CONFIG_KEYS = ["profile"];
|
|
20
|
+
const DEPRECATED_CONFIG_KEYS = ["profile", "agents"];
|
|
21
21
|
const HARNESS_CONFIG_SCHEMA_FILENAME = "harness.config.schema.json";
|
|
22
22
|
const TASK_STORAGE_REPO_PLACEHOLDER = "OWNER/REPO";
|
|
23
23
|
const TARGETS = ["claude-code"];
|
|
24
24
|
const TASK_STORAGE_TYPES = ["github"];
|
|
25
25
|
const TASK_STORAGE_REPO_PATTERN = /^[^\s/]+\/[^\s/]+$/;
|
|
26
|
-
const AGENTS = [
|
|
27
|
-
"orchestrator",
|
|
28
|
-
"spec-author",
|
|
29
|
-
"implementer",
|
|
30
|
-
"reviewer",
|
|
31
|
-
"architect",
|
|
32
|
-
"ui-designer"
|
|
33
|
-
];
|
|
34
|
-
const REQUIRED_AGENT = "orchestrator";
|
|
35
26
|
const VENDOR_VERSION_REGEX = /^\d+\.\d+\.\d+(-(alpha|beta|rc)\.\d+)?$/;
|
|
36
27
|
const VENDOR_VERSION_EXAMPLE = "0.1.0-alpha.0";
|
|
37
28
|
const PATHS_DEFAULTS = {
|
|
@@ -123,7 +114,6 @@ const harnessConfigSchema = z.object({
|
|
|
123
114
|
vendor_version: z.string().regex(VENDOR_VERSION_REGEX),
|
|
124
115
|
target: z.enum(TARGETS),
|
|
125
116
|
task_storage: taskStorageSchema,
|
|
126
|
-
agents: z.array(z.enum(AGENTS)).refine((agents) => agents.includes(REQUIRED_AGENT), { error: `agents must include "${REQUIRED_AGENT}" (the orchestrator is the hat).` }),
|
|
127
117
|
paths: pathsSchema,
|
|
128
118
|
rollback: rollbackSchema,
|
|
129
119
|
telemetry: telemetrySchema,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lemoncode/lemony",
|
|
3
|
-
"version": "0.1.1-alpha.
|
|
3
|
+
"version": "0.1.1-alpha.1",
|
|
4
4
|
"description": "Lemony — a Harness for AI Coding. Vendor package: installer, agent role catalog, generic skill catalog, hooks, and templates for a Spec-Driven Development workflow.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|