@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.
- package/NOTICE +39 -0
- package/README.md +0 -1
- 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 +204 -36
- package/catalog/agents/reviewer.md +7 -7
- package/catalog/agents/spec-author.md +7 -4
- package/catalog/agents/ui-designer.md +121 -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 +15 -16
- 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 +248 -0
- package/catalog/skills/grill-ui/ui-handoff-format.md +149 -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 +27 -18
- package/catalog/templates/claude-code/docs/playbooks/README.md.tpl +1 -3
- package/catalog/templates/claude-code/harness.config.yml.tpl +8 -9
- package/dist/cli.mjs +1287 -1676
- 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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lemoncode/lemony",
|
|
3
|
-
"version": "0.1.
|
|
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.
|
|
63
|
-
"prettier": "3.
|
|
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",
|
package/catalog/agents/README.md
DELETED
|
@@ -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.
|
package/catalog/hooks/README.md
DELETED
|
@@ -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. |
|
package/catalog/skills/README.md
DELETED
|
@@ -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
|
-
```
|