@lemoncode/lemony 0.1.0 → 0.1.1-alpha.0
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/NOTICE +39 -0
- package/catalog/VERSION +1 -1
- package/catalog/agents/architect.md +4 -4
- package/catalog/agents/fit-assessment.md +1 -1
- package/catalog/agents/implementer.md +15 -8
- package/catalog/agents/orchestrator.md +165 -24
- package/catalog/agents/reviewer.md +7 -7
- package/catalog/agents/spec-author.md +4 -4
- package/catalog/agents/ui-designer.md +115 -15
- package/catalog/commands/add-capability.md +3 -3
- package/catalog/commands/resume.md +10 -4
- package/catalog/commands/spinoff.md +2 -2
- package/catalog/commands/sync-design-tokens.md +29 -0
- package/catalog/harness.config.schema.json +14 -0
- package/catalog/hooks/init.sh +11 -11
- package/catalog/hooks/lib/lemony.sh +3 -3
- package/catalog/hooks/lib/playbook-scan.sh +10 -11
- package/catalog/hooks/session-close.sh +7 -7
- package/catalog/schemas/tier2-events-history.md +11 -11
- package/catalog/schemas/tier2-events.md +46 -47
- package/catalog/skills/a11y-audit/SKILL.md +121 -0
- package/catalog/skills/bootstrap-architecture/SKILL.md +3 -3
- package/catalog/skills/build-ui/SKILL.md +147 -0
- package/catalog/skills/build-ui/accessibility.md +101 -0
- package/catalog/skills/build-ui/anti-slop.md +107 -0
- package/catalog/skills/code-explorer/SKILL.md +1 -1
- package/catalog/skills/design-critique/SKILL.md +110 -0
- package/catalog/skills/design-tool-sync/SKILL.md +120 -0
- package/catalog/skills/grill-ui/SKILL.md +187 -0
- package/catalog/skills/grill-ui/ui-handoff-format.md +148 -0
- package/catalog/skills/grill-with-docs/SKILL.md +9 -2
- package/catalog/skills/mutation-testing/SKILL.md +1 -1
- package/catalog/skills/note-side-finding/SKILL.md +1 -1
- package/catalog/skills/playbook-iterate/SKILL.md +2 -2
- package/catalog/skills/review-pr/SKILL.md +3 -3
- package/catalog/skills/task-closeout/SKILL.md +9 -8
- package/catalog/skills/update-architecture/SKILL.md +3 -3
- package/catalog/templates/claude-code/agents.md.tpl +16 -10
- package/catalog/templates/claude-code/docs/playbooks/README.md.tpl +1 -3
- package/catalog/templates/claude-code/harness.config.yml.tpl +9 -1
- package/dist/cli.mjs +1286 -1665
- package/package.json +13 -4
- package/catalog/agents/README.md +0 -29
- package/catalog/hooks/README.md +0 -56
- package/catalog/playbook-format.md +0 -198
- package/catalog/schemas/README.md +0 -13
- package/catalog/skills/README.md +0 -62
- package/catalog/templates/README.md +0 -32
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# `ui-handoff.md` — the design contract
|
|
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.
|
|
5
|
+
|
|
6
|
+
**It captures DECISIONS and targets, not know-how.** How to apply tokens to a stack, avoid generic
|
|
7
|
+
"AI slop", or meet WCAG lives in the implementer's and reviewer's skills. This file says _what to
|
|
8
|
+
build_ and _how it should look and feel_, at a level the implementer can execute and the review can
|
|
9
|
+
check.
|
|
10
|
+
|
|
11
|
+
## Two principles that shape every section
|
|
12
|
+
|
|
13
|
+
- **Graduated altitude.** Default to **decisions-altitude**: reference the design system, name the
|
|
14
|
+
variant, state the few things that matter. Drop to the full **component anatomy** (below) ONLY for
|
|
15
|
+
a genuinely novel or critical component. Don't freeze what the implementer's model already knows.
|
|
16
|
+
- **Text-first.** Screens travel as a text inventory + a nav/flow map + per-screen structural intent.
|
|
17
|
+
The implementer generates the pixels from that + the tokens + the anti-slop know-how. A visual
|
|
18
|
+
tool, if the designer used one, is a private DEFINE aid — not a consumed contract.
|
|
19
|
+
|
|
20
|
+
Every section is **N/A-able** per task: mark a section N/A rather than padding it.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Template
|
|
25
|
+
|
|
26
|
+
```markdown
|
|
27
|
+
# UI handoff — #<id> <topic>
|
|
28
|
+
|
|
29
|
+
**Status**: in_progress | completed
|
|
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.
|
|
34
|
+
|
|
35
|
+
## 1. Personas / users served
|
|
36
|
+
|
|
37
|
+
<!-- Who this serves and the context that shapes design. Consume docs/personas.md if present;
|
|
38
|
+
never restate it wholesale — capture only what drives a design decision here. -->
|
|
39
|
+
|
|
40
|
+
## 2. Aesthetic direction
|
|
41
|
+
|
|
42
|
+
**Tone preset**: controlled | impact | innovative | (none)
|
|
43
|
+
**Dials**: variance = low|medium|high · motion = low|medium|high · density = low|medium|high
|
|
44
|
+
**Brand references**: <sites/products admired, and what to take from each>
|
|
45
|
+
**Voice / feel**: <a few words — e.g. "calm, precise, trustworthy">
|
|
46
|
+
|
|
47
|
+
<!-- See "Direction language" below for what the presets and dials mean. The dials are the
|
|
48
|
+
verifiable contract; the review checks the built UI against them. -->
|
|
49
|
+
|
|
50
|
+
## 3. Screen inventory + nav / flow
|
|
51
|
+
|
|
52
|
+
<!-- The screens/surfaces this task adds or changes, and how the user moves between them.
|
|
53
|
+
Text or a mermaid flow diagram. No pixels. -->
|
|
54
|
+
|
|
55
|
+
## 4. Per-screen layout
|
|
56
|
+
|
|
57
|
+
<!-- For each screen: regions, hierarchy, what draws the eye first. Words, not mockups. -->
|
|
58
|
+
|
|
59
|
+
## 5. Components
|
|
60
|
+
|
|
61
|
+
<!-- Decisions-altitude by default: name the component, the variant, and the states that matter.
|
|
62
|
+
Use the full anatomy (below) ONLY for a novel or critical component. -->
|
|
63
|
+
|
|
64
|
+
## 6. States
|
|
65
|
+
|
|
66
|
+
<!-- Empty / loading / error / success / edge content for the task's surfaces. -->
|
|
67
|
+
|
|
68
|
+
## 7. Responsive / breakpoints
|
|
69
|
+
|
|
70
|
+
<!-- The behavior that actually changes across breakpoints for this task. -->
|
|
71
|
+
|
|
72
|
+
## 8. Motion / interaction
|
|
73
|
+
|
|
74
|
+
<!-- Motion appetite (from the dial) + the few interactions that carry meaning. -->
|
|
75
|
+
|
|
76
|
+
## 9. Accessibility
|
|
77
|
+
|
|
78
|
+
<!-- Target level (default WCAG 2.1 AA) + task-specific a11y decisions. The audit and the
|
|
79
|
+
how-to are skills; capture only decisions here. -->
|
|
80
|
+
|
|
81
|
+
## 10. Microcopy
|
|
82
|
+
|
|
83
|
+
<!-- The actual words for the task's key labels and messages, inline. Voice follows §2. -->
|
|
84
|
+
|
|
85
|
+
## 11. Token reference
|
|
86
|
+
|
|
87
|
+
Reference `docs/design-tokens.json` — the single, client-owned source of truth, a 3-tier
|
|
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.
|
|
92
|
+
|
|
93
|
+
## Open questions
|
|
94
|
+
|
|
95
|
+
<!-- Anything the interview left unresolved. If a fork has more than one valid answer and the user
|
|
96
|
+
can't resolve it, raise a discovery rather than guess. -->
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Direction language (for §2)
|
|
102
|
+
|
|
103
|
+
The aesthetic direction is expressed as three explicit **dials**, optionally seeded by a **tone
|
|
104
|
+
preset**. Dials are reproducible and review-verifiable; they exist to fight the generic defaults a
|
|
105
|
+
model reaches for unprompted.
|
|
106
|
+
|
|
107
|
+
### Dials
|
|
108
|
+
|
|
109
|
+
- **Variance** — _conventional ↔ expressive._ How far the design departs from safe, system-default
|
|
110
|
+
patterns.
|
|
111
|
+
- **low** — predictable, system-like, fast to build; risks looking generic.
|
|
112
|
+
- **medium** — distinctive but restrained; a clear point of view without flamboyance.
|
|
113
|
+
- **high** — bold, characterful, memorable; more build cost and more ways to get it wrong.
|
|
114
|
+
- **Motion** — _still ↔ animated._ Appetite for transition and animation.
|
|
115
|
+
- **low** — minimal, functional transitions only.
|
|
116
|
+
- **medium** — purposeful motion on key interactions.
|
|
117
|
+
- **high** — rich, choreographed motion as part of the identity.
|
|
118
|
+
- **Density** — _airy ↔ compact._ Information density and use of whitespace.
|
|
119
|
+
- **low** — spacious, generous whitespace, few elements per view.
|
|
120
|
+
- **medium** — balanced.
|
|
121
|
+
- **high** — dense, data-rich, efficient for expert/repeat use.
|
|
122
|
+
|
|
123
|
+
### Tone presets (optional shorthand)
|
|
124
|
+
|
|
125
|
+
A preset seeds default dial values as a starting point; the user can override any dial after.
|
|
126
|
+
|
|
127
|
+
| Preset | variance | motion | density | Feel |
|
|
128
|
+
| -------------- | -------- | ------ | ------- | -------------------------------------------------- |
|
|
129
|
+
| **controlled** | low | low | medium | Calm, trustworthy, enterprise; clarity over flair. |
|
|
130
|
+
| **impact** | high | medium | low | Bold, memorable, marketing-forward; few big moves. |
|
|
131
|
+
| **innovative** | high | high | medium | Novel, dynamic, cutting-edge; motion as identity. |
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Component anatomy (for §5, novel/critical components only)
|
|
136
|
+
|
|
137
|
+
Drop to this fuller shape ONLY when a component is genuinely new to the project or critical enough
|
|
138
|
+
that the review needs a fixed reference. For everything else, decisions-altitude (name + variant +
|
|
139
|
+
states-that-matter) is enough.
|
|
140
|
+
|
|
141
|
+
1. **Description / when to use** — what it is and when to reach for it.
|
|
142
|
+
2. **Variants** — the variants and when each applies.
|
|
143
|
+
3. **Props / properties** — the inputs that change its appearance or behavior.
|
|
144
|
+
4. **States** — default / hover / active / focus / disabled / loading / error, as applicable.
|
|
145
|
+
5. **Anatomy / layout** — the internal regions and their arrangement (text).
|
|
146
|
+
6. **Behavior / interaction** — what it does on interaction, including motion.
|
|
147
|
+
7. **Accessibility** — role, keyboard interaction, focus handling, screen-reader announcement.
|
|
148
|
+
8. **Do's and Don'ts** — the traps specific to this component.
|
|
@@ -4,6 +4,13 @@ description: Relentlessly interview the user about a plan or design until shared
|
|
|
4
4
|
origin: vendor
|
|
5
5
|
vendor_version: '{{vendor_version}}'
|
|
6
6
|
invoked-by: [orchestrator, architect]
|
|
7
|
+
attribution:
|
|
8
|
+
- source: mattpocock/skills
|
|
9
|
+
author: Matt Pocock
|
|
10
|
+
url: https://github.com/mattpocock/skills
|
|
11
|
+
license: MIT
|
|
12
|
+
relationship: derived-from
|
|
13
|
+
note: grill workflow and decision-by-decision interview structure
|
|
7
14
|
---
|
|
8
15
|
|
|
9
16
|
# Grill With Docs
|
|
@@ -41,7 +48,7 @@ If ambiguous, ask whether the user wants the plan challenged or built together.
|
|
|
41
48
|
the grill against it so proposals don't contradict existing boundaries/seams. Trust it
|
|
42
49
|
for the big picture; verify against code where a decision actually turns on it. It is
|
|
43
50
|
**absent by default and that is fine** — grill as today, and never push the user to
|
|
44
|
-
create it (
|
|
51
|
+
create it (it is **not** one of the files this skill creates lazily below).
|
|
45
52
|
- `docs/adr/` if present
|
|
46
53
|
- The project's playbooks — `docs/playbooks/<topic>.md` (then the global layer),
|
|
47
54
|
discovered by topic filename
|
|
@@ -117,7 +124,7 @@ If a `CONTEXT-MAP.md` exists at the root, the repo has multiple contexts. The ma
|
|
|
117
124
|
│ └── docs/adr/
|
|
118
125
|
```
|
|
119
126
|
|
|
120
|
-
Create files and directories lazily — only when there's something to write. If no `CONTEXT.md` exists, create one when the first term is resolved. If no `docs/adr/` exists, create it when the first ADR is needed. Same for `docs/prds/` when the first PRD lands. **`docs/architecture.md` is the exception — never create it here.** It is client-owned
|
|
127
|
+
Create files and directories lazily — only when there's something to write. If no `CONTEXT.md` exists, create one when the first term is resolved. If no `docs/adr/` exists, create it when the first ADR is needed. Same for `docs/prds/` when the first PRD lands. **`docs/architecture.md` is the exception — never create it here.** It is client-owned; only the Architect's `update-architecture` skill ever edits it (and only when the file already exists).
|
|
121
128
|
|
|
122
129
|
#### Challenge against the glossary
|
|
123
130
|
|
|
@@ -26,7 +26,7 @@ slow.
|
|
|
26
26
|
## Precondition (capability-gated)
|
|
27
27
|
|
|
28
28
|
This skill is only installed when the project declares a **`test:mutation`** script in
|
|
29
|
-
`package.json` (the `has-mutation-testing` capability
|
|
29
|
+
`package.json` (the `has-mutation-testing` capability). If you are reading it, the
|
|
30
30
|
script exists — run it. The harness stays tool-agnostic: the script may drive Stryker or
|
|
31
31
|
any mutation tool. Delegate to it exactly as `verify` delegates to the project's
|
|
32
32
|
declared scripts; never assume a specific tool's CLI.
|
|
@@ -39,7 +39,7 @@ discovery (pause and stop). When genuinely unsure whether it blocks you, prefer
|
|
|
39
39
|
`raise-discovery` — a wrong pause is cheaper than coding past a real contradiction.
|
|
40
40
|
|
|
41
41
|
The same channel covers **architecturally-significant drift in `docs/architecture.md`**
|
|
42
|
-
|
|
42
|
+
— when you read the map to orient and find it states a boundary/seam the code no
|
|
43
43
|
longer matches, in an area your task doesn't touch. That is a defect of the _map_, not the
|
|
44
44
|
code: non-blocking and out of your scope, so it rides here. Tag such a bullet `kind: drift`
|
|
45
45
|
(see the contract below) so the Orchestrator routes it to the Architect's
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: playbook-iterate
|
|
3
|
-
description: Propose changes to a client playbook — or extract a new one from the codebase — when the spec collides with a documented pattern (a T6 PLAYBOOK_CONFLICT) or the client asks. Playbooks are client-owned
|
|
3
|
+
description: Propose changes to a client playbook — or extract a new one from the codebase — when the spec collides with a documented pattern (a T6 PLAYBOOK_CONFLICT) or the client asks. Playbooks are client-owned; the Architect proposes and the human decides. Use when the Orchestrator routes a T6 discovery resolution to the Architect, or on an explicit "capture how we do X" request.
|
|
4
4
|
origin: vendor
|
|
5
5
|
vendor_version: '{{vendor_version}}'
|
|
6
6
|
invoked-by: [architect]
|
|
@@ -13,7 +13,7 @@ trigger-condition: a T6 PLAYBOOK_CONFLICT needs the playbook changed, or the cli
|
|
|
13
13
|
|
|
14
14
|
A **playbook** describes _how to build_ a category of software (a backend service, an
|
|
15
15
|
SPA, a testing strategy) in **project-agnostic** terms — placeholder names, never a real
|
|
16
|
-
codebase's symbols. Playbooks are **client-owned
|
|
16
|
+
codebase's symbols. Playbooks are **client-owned**: the vendor ships the
|
|
17
17
|
_format_ and the _lookup convention_, never the content. So this skill **proposes**; the
|
|
18
18
|
human **decides**. The Architect never rewrites a client playbook unilaterally.
|
|
19
19
|
|
|
@@ -20,8 +20,8 @@ heavier tool, deliberately not this one.
|
|
|
20
20
|
|
|
21
21
|
### 0. Resolve the PR
|
|
22
22
|
|
|
23
|
-
- **URL** (`https://github.com/<org>/<repo>/pull
|
|
24
|
-
- **Number** (
|
|
23
|
+
- **URL** (`https://github.com/<org>/<repo>/pull/<n>`): extract `<org>/<repo>` + number.
|
|
24
|
+
- **Number** (`#<n>`, `<n>`): resolve the repo with `gh repo view --json nameWithOwner`.
|
|
25
25
|
- **No argument**: detect the open PR on the current branch with `gh pr view`.
|
|
26
26
|
|
|
27
27
|
Run in parallel:
|
|
@@ -37,7 +37,7 @@ Read the repo's `CLAUDE.md` (and `CONTEXT.md` if present). Summarize in ≤ 50 l
|
|
|
37
37
|
code-style rules, comment conventions, naming, architecture constraints. This is what
|
|
38
38
|
the analysis judges "against project convention" by.
|
|
39
39
|
|
|
40
|
-
### 2. Analyze (single sub-agent, the
|
|
40
|
+
### 2. Analyze (single sub-agent, the review lenses as a checklist)
|
|
41
41
|
|
|
42
42
|
Spawn **one** `Explore` sub-agent with the full diff, the changed-files list, and the
|
|
43
43
|
project context. Its prompt walks the five review lenses as a checklist — **not** five
|
|
@@ -10,7 +10,7 @@ invoked-by: [orchestrator]
|
|
|
10
10
|
|
|
11
11
|
## Core Principle
|
|
12
12
|
|
|
13
|
-
Closeout is **archive-on-done through a dedicated PR
|
|
13
|
+
Closeout is **archive-on-done through a dedicated PR**. The durable memory of
|
|
14
14
|
a finished task — its spec and its resolved discoveries — is **archived live**, not
|
|
15
15
|
deleted, so a future agent reads the decisions instead of doing git archaeology. The
|
|
16
16
|
genuinely architectural decisions rise further, to ADRs. And the closeout record reaches
|
|
@@ -19,7 +19,7 @@ every other change obeys.
|
|
|
19
19
|
|
|
20
20
|
Three moves, in this order:
|
|
21
21
|
|
|
22
|
-
1. **Activate the Architect** — closeout is its reliable end-of-task checkpoint
|
|
22
|
+
1. **Activate the Architect** — closeout is its reliable end-of-task checkpoint.
|
|
23
23
|
In cold blood, no resume pressure, it drives durable capture: `write-adr` (HITL offer
|
|
24
24
|
per resolved discovery), `update-architecture` (automatic, when the map exists), and
|
|
25
25
|
`playbook-iterate` (HITL offer, once per task). The canon outlives any task folder.
|
|
@@ -56,7 +56,7 @@ merge, then records it.
|
|
|
56
56
|
|
|
57
57
|
Archival is **destructive** and must wait until the task PR is merged. Until that merge,
|
|
58
58
|
the task can re-enter iteration — a Reviewer rejection, or human review comments at the
|
|
59
|
-
gate
|
|
59
|
+
gate — and that re-work needs the spec **live** in `tasks/<id>/spec/`. Archiving
|
|
60
60
|
pre-merge would pull the spec out from under an in-flight fix. So every step below runs
|
|
61
61
|
**after** the merge is confirmed.
|
|
62
62
|
|
|
@@ -68,12 +68,12 @@ merged base: `git checkout <default> && git pull`.
|
|
|
68
68
|
|
|
69
69
|
### 1. Activate the Architect for durable capture
|
|
70
70
|
|
|
71
|
-
Closeout is the Architect's **reliable activation point
|
|
71
|
+
Closeout is the Architect's **reliable activation point**: in cold blood, after
|
|
72
72
|
the merge, with no paused sub-agent pulling toward "just unblock me", it drives the three
|
|
73
73
|
durable-capture skills the on-demand triggers otherwise lose. Each one **no-ops cleanly
|
|
74
74
|
when its skill isn't installed**, so this step is safe everywhere.
|
|
75
75
|
|
|
76
|
-
The three differ in **who decides** — and the asymmetry is deliberate
|
|
76
|
+
The three differ in **who decides** — and the asymmetry is deliberate:
|
|
77
77
|
|
|
78
78
|
- **`write-adr` — HITL offer, per resolved discovery.** Walk the **resolved** entries in
|
|
79
79
|
`discoveries.md` and **offer** the ones that settled a real decision (not a trivial
|
|
@@ -153,7 +153,9 @@ git rm -r .claude/state/tasks/<id>/
|
|
|
153
153
|
|
|
154
154
|
`spec/` and `discoveries.md` survive **live** under `_archive/<id>/` (grep-able), plus in
|
|
155
155
|
git history and the GitHub issue. `progress.md` (the pause-point bitácora) and any other
|
|
156
|
-
working scratch are gone.
|
|
156
|
+
working scratch are gone. A UI task's **`ui-handoff.md`** is a sibling **inside**
|
|
157
|
+
`spec/`, so the single `git mv` of `spec/` archives it with the rest — no special
|
|
158
|
+
handling.
|
|
157
159
|
|
|
158
160
|
### 5. Open the closeout PR and auto-merge
|
|
159
161
|
|
|
@@ -204,8 +206,7 @@ Then flip the issue to `harness:status:done` and **emit `task_done`** — both h
|
|
|
204
206
|
in finalize, exactly once (the parked → `/resume` path also lands here, so it is the
|
|
205
207
|
single emit point for either path). You compute the envelope (cycle time, review
|
|
206
208
|
rejections, level) as the Orchestrator running this skill; the fields and the `emit`
|
|
207
|
-
command line are in `orchestrator.md` §Closeout. `events.jsonl` is local-only/gitignored
|
|
208
|
-
(ADR 0008), so the emit never dirties the base.
|
|
209
|
+
command line are in `orchestrator.md` §Closeout. `events.jsonl` is local-only/gitignored, so the emit never dirties the base.
|
|
209
210
|
|
|
210
211
|
### 7. Report
|
|
211
212
|
|
|
@@ -18,13 +18,13 @@ updated. This skill keeps it true to reality after an architecturally significan
|
|
|
18
18
|
|
|
19
19
|
The trigger is usually a change in hand, but the job is the same when **drift is surfaced
|
|
20
20
|
without a change** — an orientation or review finds the map already diverged from the code
|
|
21
|
-
(a `code-explorer` Notes flag, a Reviewer side-finding
|
|
21
|
+
(a `code-explorer` Notes flag, a Reviewer side-finding). Reconcile it the same
|
|
22
22
|
way, applying the same significance bar below: only shape-level divergence is worth an edit.
|
|
23
23
|
|
|
24
24
|
It is gated on `applies-when: has-architecture-doc`: it only installs when the project
|
|
25
25
|
already keeps `docs/architecture.md`. The harness **never creates** an architecture doc
|
|
26
|
-
where the client chose not to have one
|
|
27
|
-
not the architecture
|
|
26
|
+
where the client chose not to have one — the vendor gives the framework,
|
|
27
|
+
not the architecture. If a project has no such doc and one is wanted, that's a client
|
|
28
28
|
decision, not an automatic harness action.
|
|
29
29
|
|
|
30
30
|
## What counts as architecturally significant
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
|
|
6
6
|
This file is the **dispatcher** the Orchestrator follows on every session. The
|
|
7
7
|
Orchestrator is the single human-facing hat; it invokes sub-agents (Spec Author,
|
|
8
|
-
Implementer, Reviewer
|
|
9
|
-
in `.claude/agents/<role>.md`; skills in
|
|
10
|
-
`.claude/state/`.
|
|
8
|
+
Implementer, Reviewer, and the on-demand Architect / UI Designer) with fresh context
|
|
9
|
+
via the Task tool. Full role rules live in `.claude/agents/<role>.md`; skills in
|
|
10
|
+
`.claude/skills/`; task state in `.claude/state/`.
|
|
11
11
|
|
|
12
12
|
## Mode dispatcher
|
|
13
13
|
|
|
@@ -40,7 +40,7 @@ surface the menu.
|
|
|
40
40
|
|
|
41
41
|
## Task-fit dial
|
|
42
42
|
|
|
43
|
-
The harness is a dial, not on/off
|
|
43
|
+
The harness is a dial, not on/off:
|
|
44
44
|
|
|
45
45
|
- **L1 — full SDD**: real features. Grill → spec → human gate → implement → review.
|
|
46
46
|
- **L2 — lightweight**: small bugs. Issue + state + implement (TDD) + light review.
|
|
@@ -60,10 +60,14 @@ A task deserves the harness if it is **specifiable**, **verifiable**, or
|
|
|
60
60
|
3. **Spec** — Spec Author sub-agent (given the `<id>` + branch): `prd-to-spec` (→
|
|
61
61
|
`requirements.md` EARS + `design.md` + `tasks.md` under `tasks/<id>/spec/`) then
|
|
62
62
|
`spec-to-issue` (fills the issue body — it creates nothing and moves no labels).
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
|
67
|
+
complete (a spec-ready task never carries it), flip to `harness:status:spec-ready`,
|
|
68
|
+
commit and push the task state to the branch. DEFINE can stop here: the spec-ready
|
|
69
|
+
queue (`gh issue list -l harness:status:spec-ready`) is the handoff. Ask: implement
|
|
70
|
+
now or hand off?
|
|
67
71
|
5. **Approval gate** — run by whoever implements (a RESUME of a spec-ready issue runs
|
|
68
72
|
it). Present the spec; the human approves (or asks for changes → Spec Author
|
|
69
73
|
revises). On approval, flip to `harness:status:in-progress`. The spec, not the code,
|
|
@@ -71,7 +75,9 @@ A task deserves the harness if it is **specifiable**, **verifiable**, or
|
|
|
71
75
|
6. **Implement** — Implementer sub-agent, `tdd` skill, on the branch, keeping
|
|
72
76
|
`.claude/state/tasks/<id>/progress.md` live.
|
|
73
77
|
7. **Review** — flip to `harness:status:in-review`, open the PR (`gh pr create`,
|
|
74
|
-
branch → default), Reviewer sub-agent reviews it (`senior-review`, fresh context).
|
|
78
|
+
branch → default), Reviewer sub-agent reviews it (`senior-review`, fresh context). If
|
|
79
|
+
the task touched UI, the **UI Designer** reviews as a distinct design + a11y lens too
|
|
80
|
+
— either lens rejecting routes back to the Implementer.
|
|
75
81
|
8. **Merge gate** — never auto-merge. Surface the approved PR; the human merges (or
|
|
76
82
|
authorizes you to). The task stays at `in-review` until merged.
|
|
77
83
|
9. **Closeout** — `task-closeout`: confirm the merge via `gh`, offer durable discoveries
|
|
@@ -97,7 +103,7 @@ A task deserves the harness if it is **specifiable**, **verifiable**, or
|
|
|
97
103
|
`harness/closeout-<id>` PR (`gh pr merge --auto`); park at `closeout-pending` if it
|
|
98
104
|
needs approval. Then close the issue and delete the branch. Same as L1.
|
|
99
105
|
|
|
100
|
-
## Discovery interrupts
|
|
106
|
+
## Discovery interrupts
|
|
101
107
|
|
|
102
108
|
At any step, a sub-agent that hits a T1–T6 case (contradiction, unspecified decision,
|
|
103
109
|
scope drift, existing solution, infeasibility, playbook conflict) **pauses instead of
|
|
@@ -75,9 +75,7 @@ status: active
|
|
|
75
75
|
- `keywords` (optional) — case-insensitive regexes (Oniguruma). **Prompts matching any regex suggest this playbook.**
|
|
76
76
|
|
|
77
77
|
`applies_to` and `keywords` are independently optional: a playbook can be require-only,
|
|
78
|
-
suggest-only, both, or neither.
|
|
79
|
-
[`catalog/playbook-format.md`](https://github.com/{{task_storage_repo}}/blob/main/catalog/playbook-format.md)
|
|
80
|
-
(packaged with the vendor — referenced here for convenience).
|
|
78
|
+
suggest-only, both, or neither.
|
|
81
79
|
|
|
82
80
|
## What belongs here (and what doesn't)
|
|
83
81
|
|
|
@@ -24,7 +24,7 @@ agents:
|
|
|
24
24
|
- implementer
|
|
25
25
|
- reviewer
|
|
26
26
|
- architect # always installed; invoked on-demand, outside the linear flow
|
|
27
|
-
# - ui-designer # catalog slot, inactive by default
|
|
27
|
+
# - ui-designer # catalog slot, inactive by default
|
|
28
28
|
|
|
29
29
|
# Paths (relative; defaults shown — declare only overrides).
|
|
30
30
|
paths:
|
|
@@ -57,3 +57,11 @@ rollback:
|
|
|
57
57
|
# Uncomment to opt the team out:
|
|
58
58
|
# telemetry:
|
|
59
59
|
# enabled: false
|
|
60
|
+
|
|
61
|
+
# Design tokens (`design-tokens validate`). The anti-hardcode scan inspects a built-in
|
|
62
|
+
# set of UI/style extensions (.css/.scss/.ts/.tsx/.vue/.svelte/.astro/.js/.mdx/.html/…).
|
|
63
|
+
# Add extra suffixes here for a stack the built-ins don't cover — additive, never a
|
|
64
|
+
# replacement. Default none.
|
|
65
|
+
# design_tokens:
|
|
66
|
+
# scan_extensions:
|
|
67
|
+
# - .foo
|