@lemoncode/lemony 0.1.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.
Files changed (49) hide show
  1. package/NOTICE +39 -0
  2. package/README.md +0 -1
  3. package/catalog/VERSION +1 -1
  4. package/catalog/agents/architect.md +4 -4
  5. package/catalog/agents/fit-assessment.md +1 -1
  6. package/catalog/agents/implementer.md +15 -8
  7. package/catalog/agents/orchestrator.md +204 -36
  8. package/catalog/agents/reviewer.md +7 -7
  9. package/catalog/agents/spec-author.md +7 -4
  10. package/catalog/agents/ui-designer.md +121 -15
  11. package/catalog/commands/add-capability.md +3 -3
  12. package/catalog/commands/resume.md +10 -4
  13. package/catalog/commands/spinoff.md +2 -2
  14. package/catalog/commands/sync-design-tokens.md +29 -0
  15. package/catalog/harness.config.schema.json +15 -16
  16. package/catalog/hooks/init.sh +11 -11
  17. package/catalog/hooks/lib/lemony.sh +3 -3
  18. package/catalog/hooks/lib/playbook-scan.sh +10 -11
  19. package/catalog/hooks/session-close.sh +7 -7
  20. package/catalog/schemas/tier2-events-history.md +11 -11
  21. package/catalog/schemas/tier2-events.md +46 -47
  22. package/catalog/skills/a11y-audit/SKILL.md +121 -0
  23. package/catalog/skills/bootstrap-architecture/SKILL.md +3 -3
  24. package/catalog/skills/build-ui/SKILL.md +147 -0
  25. package/catalog/skills/build-ui/accessibility.md +101 -0
  26. package/catalog/skills/build-ui/anti-slop.md +107 -0
  27. package/catalog/skills/code-explorer/SKILL.md +1 -1
  28. package/catalog/skills/design-critique/SKILL.md +110 -0
  29. package/catalog/skills/design-tool-sync/SKILL.md +120 -0
  30. package/catalog/skills/grill-ui/SKILL.md +248 -0
  31. package/catalog/skills/grill-ui/ui-handoff-format.md +149 -0
  32. package/catalog/skills/grill-with-docs/SKILL.md +9 -2
  33. package/catalog/skills/mutation-testing/SKILL.md +1 -1
  34. package/catalog/skills/note-side-finding/SKILL.md +1 -1
  35. package/catalog/skills/playbook-iterate/SKILL.md +2 -2
  36. package/catalog/skills/review-pr/SKILL.md +3 -3
  37. package/catalog/skills/task-closeout/SKILL.md +9 -8
  38. package/catalog/skills/update-architecture/SKILL.md +3 -3
  39. package/catalog/templates/claude-code/agents.md.tpl +27 -18
  40. package/catalog/templates/claude-code/docs/playbooks/README.md.tpl +1 -3
  41. package/catalog/templates/claude-code/harness.config.yml.tpl +8 -9
  42. package/dist/cli.mjs +1287 -1676
  43. package/package.json +13 -4
  44. package/catalog/agents/README.md +0 -29
  45. package/catalog/hooks/README.md +0 -56
  46. package/catalog/playbook-format.md +0 -198
  47. package/catalog/schemas/README.md +0 -13
  48. package/catalog/skills/README.md +0 -62
  49. package/catalog/templates/README.md +0 -32
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lemoncode/lemony",
3
- "version": "0.1.0",
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,
@@ -16,8 +16,15 @@
16
16
  "files": [
17
17
  "dist",
18
18
  "catalog",
19
+ "!catalog/agents/README.md",
20
+ "!catalog/hooks/README.md",
21
+ "!catalog/playbook-format.md",
22
+ "!catalog/schemas/README.md",
23
+ "!catalog/skills/README.md",
24
+ "!catalog/templates/README.md",
19
25
  "README.md",
20
- "PRIVACY.md"
26
+ "PRIVACY.md",
27
+ "NOTICE"
21
28
  ],
22
29
  "engines": {
23
30
  "node": ">=24",
@@ -49,6 +56,8 @@
49
56
  "format:check": "prettier --check .",
50
57
  "schema:generate": "tsx scripts/generate-config-schema.ts",
51
58
  "schema:check": "tsx scripts/generate-config-schema.ts --check",
59
+ "notice:generate": "tsx scripts/generate-notice.ts",
60
+ "notice:check": "tsx scripts/generate-notice.ts --check",
52
61
  "telemetry:aggregate": "tsx scripts/aggregate-telemetry.ts",
53
62
  "changeset": "changeset",
54
63
  "changeset:version": "changeset version && tsx scripts/sync-catalog-version.ts",
@@ -59,8 +68,8 @@
59
68
  "@stryker-mutator/core": "9.6.1",
60
69
  "@stryker-mutator/vitest-runner": "9.6.1",
61
70
  "@types/node": "24.13.2",
62
- "oxlint": "1.70.0",
63
- "prettier": "3.8.4",
71
+ "oxlint": "1.71.0",
72
+ "prettier": "3.9.1",
64
73
  "tsdown": "0.22.3",
65
74
  "tsx": "4.22.4",
66
75
  "typescript": "6.0.3",
@@ -1,29 +0,0 @@
1
- # agents/ — role catalog templates
2
-
3
- > **Status: 1 hat + 5 sub-agents, all skill-gated (P4 slice 2).** `orchestrator` (hat)
4
- > weaves its skills into its prose. The sub-agents `spec-author`, `implementer`,
5
- > `reviewer`, and the on-demand `architect` each carry a single `{{SKILLS}}` marker the
6
- > installer fills with the skills they invoke, gated by `applies-when` capabilities
7
- > (decision #31; the profile tier #39 is retired — ADR 0015). The `architect` is always
8
- > installed but invoked **on-demand** —
9
- > outside the linear flow (P4 slice 2 authored it + its skills). `ui-designer` stays
10
- > inactive (#11).
11
-
12
- These are the **vendor role catalog templates**, not client instances. The
13
- installer renders them into a client's `.claude/agents/<role>.md` with the repo's
14
- resolved skills (decision #31, #32).
15
-
16
- The harness runs as **1 hat + 4 sub-agents** plus one inactive slot (decisions #10,
17
- #29):
18
-
19
- | Role | Reification | When invoked |
20
- | --------------------------------- | ------------------------------------ | -------------------------------------------------- |
21
- | [orchestrator](./orchestrator.md) | hat (continuous, human-facing) | entry point, RESUME, closeout, discovery mediation |
22
- | [spec-author](./spec-author.md) | sub-agent (fresh context) | PRD → spec, create GitHub issue |
23
- | [implementer](./implementer.md) | sub-agent (fresh context) | implement spec via TDD |
24
- | [reviewer](./reviewer.md) | sub-agent (fresh context) | validate against spec, tests, security |
25
- | [architect](./architect.md) | sub-agent, on-demand | ADRs, architecture docs, playbook iteration |
26
- | [ui-designer](./ui-designer.md) | slot — **inactive by default** (#11) | — |
27
-
28
- **Fresh context** is the distinctive value of a sub-agent over the hat: it prevents
29
- confirmation bias and forces self-sufficient artifacts.
@@ -1,56 +0,0 @@
1
- # hooks/ — lifecycle & enforcement hooks
2
-
3
- Shell hooks the installer wires into the client's `.claude/settings.json` and
4
- copies executable under `.claude/hooks/`. Helpers shared between hooks live in
5
- `catalog/hooks/lib/` and are copied alongside.
6
-
7
- ## Hooks
8
-
9
- | Hook | Trigger | Purpose |
10
- | --------------------- | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
11
- | `init.sh` | `SessionStart` | Orient the session (read-only state summary). Blocks on hard errors (config invalid, state corruption, no git user, no `gh` auth), warns otherwise (version drift, peer hook missing, branch behind, residual markers). <1s p99. Decision #54. |
12
- | `session-close.sh` | `SessionEnd` + `/pause` | Emit `session_closed` event with duration math, write `current-<user>.md` / `sessions/<user>/{ts}.md`. No auto-commit (prints `git status --porcelain`). Decision #52. |
13
- | `require-playbook.sh` | `PreToolUse` (Write\|Edit) | Block writes that match a playbook's `applies_to` glob list until that playbook has been read in this conversation. Decision #11. See `catalog/playbook-format.md`. |
14
- | `suggest-playbook.sh` | `UserPromptSubmit` | Non-blocking nudge — emit a `<system-reminder>` when a prompt matches a playbook's `keywords` regex list and that playbook hasn't been read yet. Decision #11. |
15
-
16
- ## Shared lib
17
-
18
- `lib/transcript-grep.sh` — find evidence in the JSONL transcript (parent +
19
- `<transcript>/subagents/agent-*.jsonl`) that Claude actually called the `Read`
20
- tool with a given path. Required on day 1 by both `require-playbook.sh` and
21
- `suggest-playbook.sh` to avoid a misfire whereby sub-agent reads (Implementer,
22
- Reviewer always run as sub-agents) would not satisfy the parent's gate.
23
-
24
- `lib/playbook-scan.sh` — discover playbooks across the two layers
25
- (`docs/playbooks/<topic>.md` local; `~/.claude/playbooks/<topic>.md` global; local
26
- shadows global) and expose `playbook_scan_for_path` + `playbook_scan_for_prompt`.
27
- Reads frontmatter via a single `awk` pass (no `yq` — decision #29) that
28
- supports the documented format subset — see `catalog/playbook-format.md`.
29
-
30
- ## Fail-open philosophy
31
-
32
- The three enforcement hooks (`session-close.sh`, `require-playbook.sh`,
33
- `suggest-playbook.sh`) fail **open**: when their dependencies (`jq`, the
34
- transcript file) are missing or malformed, they exit 0 — possibly with a
35
- stderr warning — rather than blocking the agent. They are an enforcement
36
- layer, not the gate of last resort.
37
-
38
- `init.sh` is the only hook that **blocks** (exit 2) — and only on hard errors
39
- the session cannot proceed past (missing/invalid config, state corruption,
40
- missing git user, missing `gh` auth). That's by design (decision #54): the
41
- session-start orient is the right place to fail loud, because everything
42
- downstream depends on those preconditions.
43
-
44
- ## Bash 3.2 compatibility
45
-
46
- macOS still ships `/bin/bash` 3.2 by default. The hooks avoid `declare -A`,
47
- `globstar` (`**`), and other bash 4-only features so they run end-to-end on a
48
- stock macOS install. `init.sh`'s doctor still recommends `brew install bash` —
49
- the suggestion is forward-looking, not a hard dependency for these hooks.
50
-
51
- ## Local testing
52
-
53
- Each hook is exercised by a Vitest spec that spawns `bash <hook>` against a
54
- tmpdir fixture: `src/install/init-hook.spec.ts`,
55
- `src/install/session-close-hook.spec.ts`, `src/install/require-playbook-hook.spec.ts`,
56
- `src/install/suggest-playbook-hook.spec.ts`. Run with `node --run test`.
@@ -1,198 +0,0 @@
1
- # Playbook format — specification
2
-
3
- The canonical structure for a **playbook** (the renamed _blueprint_): a project-agnostic
4
- document describing **how to build** a category of software (a backend service, an SPA, a
5
- testing strategy, a release flow). Playbooks live in the **client's** repo (and an optional
6
- global layer); the vendor ships **no concrete playbooks** (decision #8 — client-owned).
7
-
8
- The two enforcement hooks shipped in P5 slice 2 (`require-playbook.sh`,
9
- `suggest-playbook.sh`) read this format. Skills that consult playbooks read it too.
10
-
11
- ---
12
-
13
- ## File layout
14
-
15
- A playbook is a markdown file with leading YAML frontmatter, located by **topic
16
- filename** across two layers:
17
-
18
- | Layer | Path | Notes |
19
- | --------------- | -------------------------------- | ------------------------ |
20
- | Project (local) | `docs/playbooks/<topic>.md` | Committed with the repo. |
21
- | Global | `~/.claude/playbooks/<topic>.md` | Personal, generic. |
22
-
23
- The **filename stem is the topic** — there is no index. Lookup is **local → global**: if
24
- both layers define `<topic>.md`, the **local one wins** and the global one is ignored for
25
- that topic. A missing playbook is **not an error** — agents that consult one degrade
26
- gracefully when it is absent.
27
-
28
- > Both layers are **configurable** via `harness.config.yml`: set `paths.playbooks`
29
- > (repo-relative) to relocate the local layer, and `paths.playbooks_global`
30
- > (absolute or `~`-based) to relocate the global one. The hooks read those keys
31
- > directly on each fire; editing them takes effect on the next fire (no install
32
- > or restart). Omit a key to keep the default shown above.
33
-
34
- ---
35
-
36
- ## Frontmatter
37
-
38
- ```yaml
39
- ---
40
- name: testing
41
- applies_to:
42
- - '**/*.spec.ts'
43
- - '**/*.spec.tsx'
44
- - '**/*.bench.ts'
45
- keywords:
46
- - 'vitest'
47
- - 'test runner'
48
- - 'AAA pattern'
49
- status: active
50
- ---
51
- ```
52
-
53
- ### Fields
54
-
55
- | Field | Required | Type | Purpose |
56
- | ------------ | -------- | ------------------------------- | ---------------------------------------------------------------------------------------------------------- |
57
- | `name` | yes | kebab-case string | Identifier. Must equal the filename stem (`testing.md` → `name: testing`). |
58
- | `applies_to` | no | list of bash globs | Files whose `Write`/`Edit` should be **blocked** until this playbook is read. Empty/absent → never blocks. |
59
- | `keywords` | no | list of regex strings | Prompt patterns that **suggest** reading this playbook (non-blocking). Empty/absent → never suggests. |
60
- | `status` | no | `draft \| active \| deprecated` | Author intent. Hooks ignore status today; reserved for skills/tooling. |
61
-
62
- `applies_to` and `keywords` are **independently optional**: a playbook can be require-only
63
- (globs but no keywords), suggest-only (keywords but no globs), both, or neither (a doc
64
- agents read on demand but is not enforced).
65
-
66
- > **Frontmatter subset (awk-parsed).** The hooks read frontmatter with a single
67
- > `awk` pass over every discovered playbook — no `yq` (decision #29: one `yq`
68
- > fork per playbook blew the <50ms p99 budget, and its only edge here — YAML
69
- > escape-sequence fidelity — is unused because keywords are constrained to the
70
- > awk subset anyway). Supported: block lists (`field:\n - item`) and simple
71
- > inline lists (`field: [a, b]`) of scalar strings, optionally single- or
72
- > double-quoted (quotes are stripped). The reader does **not** unescape YAML double-quote
73
- > sequences (`"\b"` stays the two characters `\b`, not a backspace) and does
74
- > **not** respect quotes when splitting an inline list on commas — a
75
- > `keywords: ["foo, bar"]` splits into `"foo` and `bar"`. Author keywords
76
- > within this subset: no `\b` word boundaries, no comma-bearing strings.
77
- > (`yq` has since left the harness entirely — decision #41 moved `init.sh` config
78
- > validation and `session-close.sh` state to pure bash, so `jq` is the only hard
79
- > dependency.)
80
-
81
- ### `applies_to` semantics
82
-
83
- Each pattern is a glob-style string, transliterated to a POSIX-ERE regex and
84
- matched against the **full file path passed to Write/Edit** with bash
85
- `[[ =~ ]]`. The regex path (rather than `shopt -s globstar`) keeps the hooks
86
- runnable on stock macOS `/bin/bash` 3.2. Supported subset:
87
-
88
- | Glob | Means |
89
- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
90
- | `*` | any sequence within a single path component (no `/`) |
91
- | `**/` | zero or more leading path components (so `**/x` matches `x` at root too) |
92
- | `**` | any sequence including `/` |
93
- | `?` | any single non-separator character |
94
- | `[abc]` | character class (passthrough) |
95
- | `[!abc]` | negated class (translated to ERE `[^abc]`) |
96
- | `{a,b,c}` | alternation, becomes `(a\|b\|c)`. Nested braces and **empty alternatives** (`{,X}`, `{X,}`, `{,}`) are not supported — BSD ERE rejects empty branches; the playbook silently fails to match. |
97
- | `\X` | literal `X` (escape) |
98
-
99
- Examples (with the absolute path Claude Code passes in mind):
100
-
101
- | Pattern | Matches |
102
- | ----------------------------------- | --------------------------------------------------------------- |
103
- | `**/*.spec.ts` | any `*.spec.ts` at any depth, including root |
104
- | `**/apps/web/**/*.tsx` | TSX files under any `apps/web/` |
105
- | `**/Dockerfile` | a Dockerfile at any depth, including root |
106
- | `**/Dockerfile*` | `Dockerfile` plus variants (`Dockerfile.web`, `Dockerfile.dev`) |
107
- | `**/.github/workflows/*.{yml,yaml}` | CI workflow files |
108
-
109
- Tip: prefix patterns with `**/` rather than relying on a bare filename — Claude
110
- Code passes **absolute** file paths to `Write`/`Edit`, so a literal `Dockerfile`
111
- (without `**/`) only matches a target whose path is exactly that string.
112
-
113
- Order **within a playbook** does not matter — any pattern matching the file path triggers
114
- the require. Order **across playbooks** does not matter either — if two playbooks both
115
- match the same path, the agent must read **both** before the write passes.
116
-
117
- **Chicken-and-egg:** a playbook whose `applies_to` matches its own location —
118
- e.g. `**/*.md` — will block the very file you're trying to author. Prefer
119
- narrow globs (file-type-specific), and if you ever need a generic-Markdown
120
- playbook, carve out `docs/playbooks/**` from the pattern.
121
-
122
- ### `keywords` semantics
123
-
124
- Each entry is a **case-insensitive regex** evaluated against the raw user prompt
125
- (multi-line aware — the matcher slurps the prompt into a single string before
126
- testing) with `jq`'s Oniguruma engine (PCRE-like). Use `\b` for word
127
- boundaries, `|` for alternation inside a single pattern, etc.
128
-
129
- Examples:
130
-
131
- | Pattern | Fires on |
132
- | -------------------------- | -------------------------------------- |
133
- | `\bvitest\b` | "let's add vitest", "Vitest config" |
134
- | `\b(new pod\|nuevo pod)\b` | English or Spanish |
135
- | `\bMongo(DB)? aggregate\b` | "MongoDB aggregate", "Mongo aggregate" |
136
-
137
- Multiple playbooks may match the same prompt — all matching playbooks are suggested in
138
- a single `<system-reminder>` block.
139
-
140
- ---
141
-
142
- ## How the hooks interpret it
143
-
144
- ### `require-playbook.sh` (PreToolUse on `Write`/`Edit`)
145
-
146
- 1. Scan all playbooks: `docs/playbooks/*.md` (local) + `~/.claude/playbooks/*.md` (global,
147
- only for topics not shadowed by a local file).
148
- 2. For each playbook with non-empty `applies_to`, test every glob against the target
149
- `file_path`. If any matches, the playbook is **required**.
150
- 3. For each required playbook, grep the conversation transcript (and any sub-agent
151
- transcripts under `<transcript>/subagents/*.jsonl`) for evidence that **Claude actually
152
- read it** via the `Read` tool with the playbook's absolute path.
153
- 4. If at least one required playbook is unread, exit 2 with a message naming the missing
154
- playbook(s) and the exact `Read(...)` call the agent must make. Otherwise exit 0.
155
-
156
- ### `suggest-playbook.sh` (UserPromptSubmit, non-blocking)
157
-
158
- 1. Scan all playbooks (same precedence as above).
159
- 2. For each playbook with non-empty `keywords`, test every regex against the prompt. If
160
- any matches, the playbook is **suggested**.
161
- 3. Drop playbooks already read in this conversation (transcript grep, same as above).
162
- 4. If any remain, emit a `<system-reminder>` listing them. Always exit 0.
163
-
164
- ### Fail-open philosophy
165
-
166
- Both **playbook** hooks (`require-playbook.sh`, `suggest-playbook.sh`) fail
167
- **open** — when `yq` is missing, the transcript is unreadable, or a playbook
168
- frontmatter cannot be parsed, they exit 0 (suggest) or 0 with a warning
169
- (require) rather than blocking the agent.
170
-
171
- The lifecycle hook `init.sh` (`SessionStart`) is the one exception: it
172
- **blocks** by design (decision #54) on hard errors that the session cannot
173
- proceed past — missing/invalid config, state corruption, missing git user,
174
- missing `gh` auth. See `catalog/hooks/README.md` for the full fail-open vs
175
- blocking matrix.
176
-
177
- ### No cache
178
-
179
- Each hook fire scans the catalog fresh. Playbooks are read sparingly (PreToolUse fires
180
- only on Write/Edit; UserPromptSubmit fires once per turn) and the catalog is small. A
181
- cache would add a staleness failure mode without measurably improving latency.
182
-
183
- ---
184
-
185
- ## Authoring conventions
186
-
187
- - One topic per file. Split when a topic grows beyond a single screen of frontmatter.
188
- - Project-**specific** rules — a business rule, a quirk of one app — do **not** belong
189
- here. Put them in `CLAUDE.md`, a project-local ADR (`docs/adr/`), or `CONTEXT.md`.
190
- - Reference other playbooks with `[topic](./topic.md)` — relative links so they resolve
191
- in any Markdown viewer.
192
-
193
- ### Iteration
194
-
195
- Playbooks evolve with the codebase. The **Architect**'s `playbook-iterate` skill proposes
196
- edits when a spec collides with an existing playbook (a `T6 PLAYBOOK_CONFLICT` review
197
- finding) or when a recurring pattern in the code is not yet captured. The Architect
198
- proposes; the client decides.
@@ -1,13 +0,0 @@
1
- # schemas/ — telemetry & config schemas
2
-
3
- Schema definitions the harness writes/validates against. Tier 1 (client-local)
4
- writes events in these formats from day one so the data is forward-compatible with
5
- the Tier 2 central backend designed in Fase 1+.
6
-
7
- ## Documents
8
-
9
- | File | Decision | Status | Purpose |
10
- | ---------------------------------------------------- | -------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
11
- | [`tier2-events.md`](tier2-events.md) | #27, #61 | **Authority — P5.** | Event schema for `events.jsonl`: 9 event types (`session_closed`, `spec_created`, `spec_approved`, `task_done`, `review_rejected`, `bug_post_merge`, `l3_bypass`, `followup_captured`, `step_completed`), the common envelope (`type`, `ts`, `user`, `project`, `task_id`, `harness_version`), and per-field tags (`sensitive`/`internal`/`metric`) for forward-sanitization. |
12
- | [`tier2-events-history.md`](tier2-events-history.md) | #51 | Seeded at `0.1.0-alpha.0`. | Forward-only per-release deltas (ADDED/REMOVED/DEPRECATED/RENAMED fields, new event types) — supports forward-only, dispatch-on-read. ~30 min/release. |
13
- | `harness.config.schema.json` | #53(e) | Pending (S3). | JSON Schema generated from the Zod config schema via `zod-to-json-schema`, distributed for IDE autocomplete. |
@@ -1,62 +0,0 @@
1
- # skills/ — vendor skill catalog
2
-
3
- > **Status: 18 skills (P1–P3 + P4).** P1 migrated `triage-issue`, `tdd`,
4
- > `senior-review`. P2 migrated `grill-with-docs` and authored `prd-to-spec`,
5
- > `spec-to-issue`, `task-closeout`. P3 authored the discovery loop (`raise-discovery`,
6
- > `resolve-discovery`). **P4 slice 1** added the Reviewer set — `verify`,
7
- > `silent-failure-hunter`, `security-review`, `spec-compliance-check`,
8
- > `test-gap-report` — rewrote `senior-review` to v2, and rolled out the gating
9
- > frontmatter (`min-profile`/`phase`/`invoked-by`) across the catalog. **P4 slice 2**
10
- > added the Architect set — `write-adr`, `update-architecture`, `code-explorer`,
11
- > `playbook-iterate`. All `origin: vendor`.
12
-
13
- Generic, **project-agnostic** skills only (decision #28). Project-specific skills
14
- (e2e, changeset, docs) live in the **client's** `.claude/skills/`, not here. Each
15
- skill is a folder `skills/<name>/SKILL.md`.
16
-
17
- ## Gating frontmatter (decision #31; ADR 0015)
18
-
19
- The installer scans this catalog, parses each skill's frontmatter, and lands a skill
20
- when every **`applies-when`** capability key holds for the repo (install-time,
21
- deterministic). A skill with no `applies-when` is always installed — there is no
22
- profile tier (the coarse `min-profile` filter #39 was retired in ADR 0015, when
23
- profiles collapsed to a single capability-gated skill set). Each sub-agent's
24
- `{{SKILLS}}` marker is filled with the skills it `invoked-by`, grouped by **`phase`**.
25
- A skill with no `phase` is universal (e.g. `raise-discovery`).
26
-
27
- | Field | Meaning | Default |
28
- | ------------------- | ---------------------------------------------------------------------- | ---------------- |
29
- | `phase` | `pre-implementation` / `during-implementation` / `post-implementation` | none ⇒ universal |
30
- | `invoked-by` | roles whose marker lists it | `[]` |
31
- | `applies-when` | capability keys (AND) the repo must satisfy at install | `[]` (always) |
32
- | `trigger-condition` | per-change runtime guard rendered with the skill | — |
33
-
34
- ## Planned MVP catalog (Fase 0)
35
-
36
- | Skill | Role | Status |
37
- | ----------------------- | ---------------------------------- | ------------------ |
38
- | `grill-with-docs` | Orchestrator (shared w/ Architect) | migrated ✓ (P2) |
39
- | `triage-issue` | Orchestrator | migrated ✓ (P1) |
40
- | `task-closeout` | Orchestrator | authored ✓ (P2) |
41
- | `prd-to-spec` | Spec Author | authored ✓ (P2) |
42
- | `spec-to-issue` | Spec Author | authored ✓ (P2) |
43
- | `tdd` | Implementer | migrated ✓ (P1) |
44
- | `senior-review` | Reviewer | v2 ✓ (P4 s1) |
45
- | `verify` | Implementer, Reviewer | authored ✓ (P4 s1) |
46
- | `security-review` | Reviewer | authored ✓ (P4 s1) |
47
- | `silent-failure-hunter` | Reviewer | authored ✓ (P4 s1) |
48
- | `spec-compliance-check` | Reviewer | authored ✓ (P4 s1) |
49
- | `test-gap-report` | Reviewer | authored ✓ (P4 s1) |
50
- | `write-adr` | Architect | authored ✓ (P4 s2) |
51
- | `update-architecture` | Architect | authored ✓ (P4 s2) |
52
- | `code-explorer` | Architect | authored ✓ (P4 s2) |
53
- | `playbook-iterate` | Architect | authored ✓ (P4 s2) |
54
- | `raise-discovery` | all sub-agents (universal) | authored ✓ (P3) |
55
- | `resolve-discovery` | Orchestrator | authored ✓ (P3) |
56
-
57
- **Parked from the vendor MVP:** `feature-flow`, `prd-to-plan`, `prd-to-issues`,
58
- `pr-review`, `ui-design`, `project-setup`, `write-a-skill`, `grill-me` (deprecated).
59
-
60
- **ECC as marketplace (decision #42):** [`affaan-m/ECC`](https://github.com/affaan-m/ECC)
61
- is MIT; when a client needs a specific skill ECC already has, copy-and-adapt it into
62
- the client's `.claude/skills/` rather than bloating this catalog.
@@ -1,32 +0,0 @@
1
- # templates/ — installer render sources
2
-
3
- > **Status: claude-code templates (P1–P4 s2).** `agents.md.tpl`,
4
- > `harness.config.yml.tpl`, `state/history.md.tpl`, and `docs/playbooks/README.md.tpl`
5
- > (the playbooks-home convention doc, P4 s2) exist and are rendered by the installer.
6
- > `.claude/commands/`, `.claude/settings.json`, and the rest of `docs/` land in later
7
- > phases.
8
-
9
- Files the installer **renders into a client repo** during `install`. Templates use
10
- placeholders (e.g. `{{vendor_version}}`, `{{target}}`, and the per-agent `{{SKILLS}}`
11
- marker) resolved from the repo capability scan. They are organized by `target`
12
- (decision #38), so additional targets plug in without a refactor.
13
-
14
- ## Planned layout
15
-
16
- ```
17
- templates/
18
- └── claude-code/ # only operative target in Sprint 0
19
- ├── agents.md.tpl # entry protocol / dispatcher
20
- ├── harness.config.yml.tpl # config with {{capabilities}} placeholders
21
- ├── .claude/
22
- │ ├── agents/<role>.md.tpl # role instances (PRE/DURING/POST filled)
23
- │ ├── commands/*.md.tpl # /resume, /define, /triage, /pause, /bypass, /hotfix
24
- │ └── settings.json.tpl # hooks, permissions
25
- ├── state/
26
- │ ├── current.md.tpl
27
- │ └── history.md.tpl
28
- └── docs/
29
- ├── playbooks/README.md.tpl # playbooks-home convention (P4 s2)
30
- ├── CONTEXT.md.tpl
31
- └── adr/.tpl
32
- ```