@nurix/etna 0.20.7 → 0.20.8
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 +1 -1
- package/data/harness-index.json +1 -1
- package/data/harnesses/code/agents/lld-mode.md +3 -3
- package/data/harnesses/code/agents/maintenance.md +3 -3
- package/data/harnesses/code/codex/agents/lld-mode.toml +2 -2
- package/data/harnesses/code/codex/agents/maintenance.toml +3 -3
- package/data/harnesses/code/harness.json +2 -2
- package/data/harnesses/code/skills/brainstorm/README.md +1 -1
- package/data/harnesses/code/skills/design/SKILL.md +1 -1
- package/data/harnesses/code/skills/design/components/index.md +1 -1
- package/data/harnesses/code/skills/documentation/SKILL.md +1 -1
- package/data/harnesses/delivery/agents/lld-mode.md +3 -3
- package/data/harnesses/delivery/agents/maintenance.md +3 -3
- package/data/harnesses/delivery/codex/agents/lld-mode.toml +2 -2
- package/data/harnesses/delivery/codex/agents/maintenance.toml +3 -3
- package/data/harnesses/delivery/harness.json +2 -2
- package/data/harnesses/delivery/skills/brainstorm/README.md +1 -1
- package/data/harnesses/delivery/skills/documentation/SKILL.md +1 -1
- package/data/harnesses/discover/harness.json +1 -1
- package/data/harnesses/discussion/CLAUDE.md +1 -1
- package/data/harnesses/discussion/harness.json +2 -2
- package/data/harnesses/etna/CLAUDE.md +16 -16
- package/data/harnesses/etna/agents/lld-mode.md +3 -3
- package/data/harnesses/etna/agents/maintenance.md +3 -3
- package/data/harnesses/etna/codex/agents/lld-mode.toml +2 -2
- package/data/harnesses/etna/codex/agents/maintenance.toml +3 -3
- package/data/harnesses/etna/harness.json +2 -2
- package/data/harnesses/etna/hooks/generate-ownership-index.mjs +11 -5
- package/data/harnesses/etna/skills/brainstorm/README.md +1 -1
- package/data/harnesses/etna/skills/documentation/SKILL.md +1 -1
- package/data/harnesses/hr/harness.json +1 -1
- package/data/harnesses/kb-agi/harness.json +1 -1
- package/lib/codex/README.md +1 -1
- package/lib/codex/validate-codex-agents.mjs +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
CLI to bootstrap a project with a Nurix harness. Copies the harness's `CLAUDE.md`, skills, agents, rules, and hooks (plus scripts, if the harness ships any) into the project so they live with the code — version-controllable, editable per project, and visible without leaving the repo.
|
|
4
4
|
|
|
5
|
-
A second install path also exists and is fully supported: `/plugin install <plugin>@nurixlabs` from inside Claude Code, which installs the harness as a plugin from the `nurixlabs/skills` marketplace. The two paths are first-class equals — pick the one that matches how you want to manage the harness. See [`docs/
|
|
5
|
+
A second install path also exists and is fully supported: `/plugin install <plugin>@nurixlabs` from inside Claude Code, which installs the harness as a plugin from the `nurixlabs/skills` marketplace. The two paths are first-class equals — pick the one that matches how you want to manage the harness. See [`docs/playbooks/harness/Readme.md`](../../docs/playbooks/harness/Readme.md#the-install-model) for the comparison.
|
|
6
6
|
|
|
7
7
|
## Usage
|
|
8
8
|
|
package/data/harness-index.json
CHANGED
|
@@ -18,10 +18,10 @@ You do NOT write the LLD — you return structured research that the main agent
|
|
|
18
18
|
Map the documentation landscape — what exists, what is adjacent, how detailed the LLD should be, and what code paths are already owned:
|
|
19
19
|
|
|
20
20
|
1. Read `./docs/structure.md` to understand the documentation structure
|
|
21
|
-
2.
|
|
21
|
+
2. Locate the repo's feature-doc layer from `structure.md` — the standard shape is `./docs/features/`, but a repo may document components under their own subject folders. Read that layer's index if it has one; otherwise glob for docs carrying `owns:` frontmatter
|
|
22
22
|
3. If `./docs/memory/lld-mode.md` exists (or the legacy `./docs/memory/spec-mode.md`), read it for feature doc inventory, ownership conflict zones, and lessons from previous research
|
|
23
|
-
4. Read 1-2 existing feature LLDs
|
|
24
|
-
5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob `docs/
|
|
23
|
+
4. Read 1-2 existing feature LLDs from that layer to calibrate format and depth
|
|
24
|
+
5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob the docs tree (excluding `docs/history/`) and read the `owns:` frontmatter of every doc that declares it.
|
|
25
25
|
|
|
26
26
|
## What You Research
|
|
27
27
|
|
|
@@ -44,15 +44,15 @@ Decide the mode once, up front, from the version marker — then run.
|
|
|
44
44
|
|
|
45
45
|
## Part A — Coherence audit (always runs)
|
|
46
46
|
|
|
47
|
-
The ownership source of truth is the **union of every
|
|
47
|
+
The ownership source of truth is the **union of every doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing the docs tree for docs that declare `owns:`.
|
|
48
48
|
|
|
49
49
|
### Step 1: Build the ownership map
|
|
50
50
|
|
|
51
51
|
1. Read `docs/structure.md` for the authority map.
|
|
52
|
-
2. Glob
|
|
52
|
+
2. Glob the docs tree for markdown carrying `owns:` frontmatter, ignoring `*.bkp.*` files (installer backups awaiting the fold) and anything under `docs/history/` (frozen records quote retired globs as provenance). **Ownership is declared, not positional** — the standard shape files these docs under `docs/features/`, but a repo may declare ownership on any doc, and the index reads them all. For each, parse the `owns:` globs and `module:` label.
|
|
53
53
|
3. Build a map: glob → owning doc + module. Narrower glob wins on overlap. **This IS the source of truth.**
|
|
54
54
|
|
|
55
|
-
**Architecture-first fallback.** If no
|
|
55
|
+
**Architecture-first fallback.** If no doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
|
|
56
56
|
|
|
57
57
|
### Step 2: Validate ownership
|
|
58
58
|
|
|
@@ -14,9 +14,9 @@ You do NOT write the LLD — you return structured research that the main agent
|
|
|
14
14
|
Map the documentation landscape — what exists, what is adjacent, how detailed the LLD should be, and what code paths are already owned:
|
|
15
15
|
|
|
16
16
|
1. Read `./docs/structure.md` to understand the documentation structure
|
|
17
|
-
2.
|
|
17
|
+
2. Locate the repo's feature-doc layer from `structure.md` — the standard shape is `./docs/features/`, but a repo may document components under their own subject folders. Read that layer's index if it has one; otherwise glob for docs carrying `owns:` frontmatter
|
|
18
18
|
3. If `./docs/memory/lld-mode.md` exists (or the legacy `./docs/memory/spec-mode.md`), read it for feature doc inventory, ownership conflict zones, and lessons from previous research
|
|
19
|
-
4. Read 1-2 existing feature LLDs
|
|
19
|
+
4. Read 1-2 existing feature LLDs from that layer to calibrate format and depth
|
|
20
20
|
5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob `docs/features/**/*.md` and read each doc's `owns:` frontmatter directly.
|
|
21
21
|
|
|
22
22
|
## What You Research
|
|
@@ -42,15 +42,15 @@ Decide the mode once, up front, from the version marker — then run.
|
|
|
42
42
|
|
|
43
43
|
## Part A — Coherence audit (always runs)
|
|
44
44
|
|
|
45
|
-
The ownership source of truth is the **union of every
|
|
45
|
+
The ownership source of truth is the **union of every doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing `docs/features/`.
|
|
46
46
|
|
|
47
47
|
### Step 1: Build the ownership map
|
|
48
48
|
|
|
49
49
|
1. Read `docs/structure.md` for the authority map.
|
|
50
|
-
2. Glob
|
|
50
|
+
2. Glob the docs tree for markdown carrying `owns:` frontmatter, ignoring `*.bkp.*` files and anything under `docs/history/`. **Ownership is declared, not positional** — the standard shape files these under `docs/features/`, but a repo may declare ownership on any doc. For each, parse the `owns:` globs and `module:` label.
|
|
51
51
|
3. Build a map: glob → owning doc + module. Narrower glob wins on overlap. **This IS the source of truth.**
|
|
52
52
|
|
|
53
|
-
**Architecture-first fallback.** If no
|
|
53
|
+
**Architecture-first fallback.** If no doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
|
|
54
54
|
|
|
55
55
|
### Step 2: Validate ownership
|
|
56
56
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"harness": "code",
|
|
3
3
|
"name": "code",
|
|
4
|
-
"version": "3.14.
|
|
4
|
+
"version": "3.14.6",
|
|
5
5
|
"files": [
|
|
6
6
|
".prettierignore",
|
|
7
7
|
".prettierrc.json",
|
|
@@ -25,5 +25,5 @@
|
|
|
25
25
|
}
|
|
26
26
|
],
|
|
27
27
|
"docsRoot": "docs",
|
|
28
|
-
"digest": "
|
|
28
|
+
"digest": "ec29198342ff"
|
|
29
29
|
}
|
|
@@ -6,7 +6,7 @@ correctly, the record stays readable at any pause, and the session ends with a h
|
|
|
6
6
|
complete that the session folder is useless — it moves to history and the user deletes or
|
|
7
7
|
commits it.
|
|
8
8
|
|
|
9
|
-
> Spec (single source of truth): `docs/
|
|
9
|
+
> Spec (single source of truth): `docs/skills/brainstorm/` in the etna repo. The etna
|
|
10
10
|
> copy of this skill (`skills/brainstorm/`) is canonical; the user-level path
|
|
11
11
|
> `~/.claude/skills/brainstorm/` is a symlink to it.
|
|
12
12
|
|
|
@@ -118,4 +118,4 @@ skills/design/
|
|
|
118
118
|
# elevation/ motion/ iconography.md · tells.csv · charts/ (census)
|
|
119
119
|
```
|
|
120
120
|
|
|
121
|
-
This folder is the shipped skill, byte-for-byte. The six taste dictionaries are served by the design MCP; their authored source lives in the etna design record (`docs/
|
|
121
|
+
This folder is the shipped skill, byte-for-byte. The six taste dictionaries are served by the design MCP; their authored source lives in the etna design record (`docs/skills/design/`), which a run never reads.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Component catalog — the fused index
|
|
2
2
|
|
|
3
|
-
> **Generated folder — never hand-edit.** Everything under `skills/design/components/` is emitted by the components-repo regen instruction set (`docs/
|
|
3
|
+
> **Generated folder — never hand-edit.** Everything under `skills/design/components/` is emitted by the components-repo regen instruction set (`docs/playbooks/skills/case-studies/components-regen-spec.md`, run against the `@nurix/components` library checkout). Regeneration may reshape any file beneath this one; the design skill's only seam with this folder is this index.
|
|
4
4
|
|
|
5
5
|
**Load contract.** This index loads in **both** positions of the project's `primitives` switch (`design.md`, `primitives: nurix | native`) — it is how the skill knows what chrome *exists* to compose with. The per-category deep references beside it ([inputs](inputs.md), [overlays](overlays.md), [collections](collections.md), [navigation](navigation.md), [layout](layout.md), [feedback](feedback.md), [charts](charts.md), [typography](typography.md), [media](media.md), [motion](motion.md), [hooks](hooks.md), [utils](utils.md), plus [setup](setup.md) for install/Tailwind wiring) load **only under `primitives: nurix`**, and only when that category is touched.
|
|
6
6
|
|
|
@@ -85,7 +85,7 @@ The two guarantees are complementary and both break on mixing: a reader holding
|
|
|
85
85
|
| Derive/update a feature doc's `owns:` | [`references/frontmatter.md`](references/frontmatter.md) |
|
|
86
86
|
| Update existing doc | § Editing an existing doc (below) |
|
|
87
87
|
| Instruction file (`CLAUDE.md`, a rule, an agent, skill prose) | [`references/instruction-style.md`](references/instruction-style.md) — not these templates; every-load prose stays lean, and the present-tense rule still applies |
|
|
88
|
-
| Author or restructure a **skill** (fit, triggers, shape, anatomy, shipping) | The skill-authoring field guide — the `etna` repo (`nurixlabs/etna`), folder `docs/
|
|
88
|
+
| Author or restructure a **skill** (fit, triggers, shape, anatomy, shipping) | The skill-authoring field guide — the `etna` repo (`nurixlabs/etna`), folder `docs/playbooks/skills/`, chapters `00`–`10`. **No etna checkout available ⇒ ask the user for access to the etna repo, or proceed from first principles** with [`references/instruction-style.md`](references/instruction-style.md) governing the prose. This row is the only place the playbook is referenced |
|
|
89
89
|
| **No template matches** | [`references/untemplated.md`](references/untemplated.md) — shape decisions + the co-authoring workflow |
|
|
90
90
|
|
|
91
91
|
---
|
|
@@ -18,10 +18,10 @@ You do NOT write the LLD — you return structured research that the main agent
|
|
|
18
18
|
Map the documentation landscape — what exists, what is adjacent, how detailed the LLD should be, and what code paths are already owned:
|
|
19
19
|
|
|
20
20
|
1. Read `./docs/structure.md` to understand the documentation structure
|
|
21
|
-
2.
|
|
21
|
+
2. Locate the repo's feature-doc layer from `structure.md` — the standard shape is `./docs/features/`, but a repo may document components under their own subject folders. Read that layer's index if it has one; otherwise glob for docs carrying `owns:` frontmatter
|
|
22
22
|
3. If `./docs/memory/lld-mode.md` exists (or the legacy `./docs/memory/spec-mode.md`), read it for feature doc inventory, ownership conflict zones, and lessons from previous research
|
|
23
|
-
4. Read 1-2 existing feature LLDs
|
|
24
|
-
5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob `docs/
|
|
23
|
+
4. Read 1-2 existing feature LLDs from that layer to calibrate format and depth
|
|
24
|
+
5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob the docs tree (excluding `docs/history/`) and read the `owns:` frontmatter of every doc that declares it.
|
|
25
25
|
|
|
26
26
|
## What You Research
|
|
27
27
|
|
|
@@ -44,15 +44,15 @@ Decide the mode once, up front, from the version marker — then run.
|
|
|
44
44
|
|
|
45
45
|
## Part A — Coherence audit (always runs)
|
|
46
46
|
|
|
47
|
-
The ownership source of truth is the **union of every
|
|
47
|
+
The ownership source of truth is the **union of every doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing the docs tree for docs that declare `owns:`.
|
|
48
48
|
|
|
49
49
|
### Step 1: Build the ownership map
|
|
50
50
|
|
|
51
51
|
1. Read `docs/structure.md` for the authority map.
|
|
52
|
-
2. Glob
|
|
52
|
+
2. Glob the docs tree for markdown carrying `owns:` frontmatter, ignoring `*.bkp.*` files (installer backups awaiting the fold) and anything under `docs/history/` (frozen records quote retired globs as provenance). **Ownership is declared, not positional** — the standard shape files these docs under `docs/features/`, but a repo may declare ownership on any doc, and the index reads them all. For each, parse the `owns:` globs and `module:` label.
|
|
53
53
|
3. Build a map: glob → owning doc + module. Narrower glob wins on overlap. **This IS the source of truth.**
|
|
54
54
|
|
|
55
|
-
**Architecture-first fallback.** If no
|
|
55
|
+
**Architecture-first fallback.** If no doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
|
|
56
56
|
|
|
57
57
|
### Step 2: Validate ownership
|
|
58
58
|
|
|
@@ -14,9 +14,9 @@ You do NOT write the LLD — you return structured research that the main agent
|
|
|
14
14
|
Map the documentation landscape — what exists, what is adjacent, how detailed the LLD should be, and what code paths are already owned:
|
|
15
15
|
|
|
16
16
|
1. Read `./docs/structure.md` to understand the documentation structure
|
|
17
|
-
2.
|
|
17
|
+
2. Locate the repo's feature-doc layer from `structure.md` — the standard shape is `./docs/features/`, but a repo may document components under their own subject folders. Read that layer's index if it has one; otherwise glob for docs carrying `owns:` frontmatter
|
|
18
18
|
3. If `./docs/memory/lld-mode.md` exists (or the legacy `./docs/memory/spec-mode.md`), read it for feature doc inventory, ownership conflict zones, and lessons from previous research
|
|
19
|
-
4. Read 1-2 existing feature LLDs
|
|
19
|
+
4. Read 1-2 existing feature LLDs from that layer to calibrate format and depth
|
|
20
20
|
5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob `docs/features/**/*.md` and read each doc's `owns:` frontmatter directly.
|
|
21
21
|
|
|
22
22
|
## What You Research
|
|
@@ -42,15 +42,15 @@ Decide the mode once, up front, from the version marker — then run.
|
|
|
42
42
|
|
|
43
43
|
## Part A — Coherence audit (always runs)
|
|
44
44
|
|
|
45
|
-
The ownership source of truth is the **union of every
|
|
45
|
+
The ownership source of truth is the **union of every doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing `docs/features/`.
|
|
46
46
|
|
|
47
47
|
### Step 1: Build the ownership map
|
|
48
48
|
|
|
49
49
|
1. Read `docs/structure.md` for the authority map.
|
|
50
|
-
2. Glob
|
|
50
|
+
2. Glob the docs tree for markdown carrying `owns:` frontmatter, ignoring `*.bkp.*` files and anything under `docs/history/`. **Ownership is declared, not positional** — the standard shape files these under `docs/features/`, but a repo may declare ownership on any doc. For each, parse the `owns:` globs and `module:` label.
|
|
51
51
|
3. Build a map: glob → owning doc + module. Narrower glob wins on overlap. **This IS the source of truth.**
|
|
52
52
|
|
|
53
|
-
**Architecture-first fallback.** If no
|
|
53
|
+
**Architecture-first fallback.** If no doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
|
|
54
54
|
|
|
55
55
|
### Step 2: Validate ownership
|
|
56
56
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"harness": "delivery",
|
|
3
3
|
"name": "delivery",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.27",
|
|
5
5
|
"files": [
|
|
6
6
|
".prettierignore",
|
|
7
7
|
".prettierrc.json",
|
|
@@ -10,5 +10,5 @@
|
|
|
10
10
|
"seeds": [],
|
|
11
11
|
"tools": [],
|
|
12
12
|
"docsRoot": "docs",
|
|
13
|
-
"digest": "
|
|
13
|
+
"digest": "b36abb3f2f60"
|
|
14
14
|
}
|
|
@@ -6,7 +6,7 @@ correctly, the record stays readable at any pause, and the session ends with a h
|
|
|
6
6
|
complete that the session folder is useless — it moves to history and the user deletes or
|
|
7
7
|
commits it.
|
|
8
8
|
|
|
9
|
-
> Spec (single source of truth): `docs/
|
|
9
|
+
> Spec (single source of truth): `docs/skills/brainstorm/` in the etna repo. The etna
|
|
10
10
|
> copy of this skill (`skills/brainstorm/`) is canonical; the user-level path
|
|
11
11
|
> `~/.claude/skills/brainstorm/` is a symlink to it.
|
|
12
12
|
|
|
@@ -85,7 +85,7 @@ The two guarantees are complementary and both break on mixing: a reader holding
|
|
|
85
85
|
| Derive/update a feature doc's `owns:` | [`references/frontmatter.md`](references/frontmatter.md) |
|
|
86
86
|
| Update existing doc | § Editing an existing doc (below) |
|
|
87
87
|
| Instruction file (`CLAUDE.md`, a rule, an agent, skill prose) | [`references/instruction-style.md`](references/instruction-style.md) — not these templates; every-load prose stays lean, and the present-tense rule still applies |
|
|
88
|
-
| Author or restructure a **skill** (fit, triggers, shape, anatomy, shipping) | The skill-authoring field guide — the `etna` repo (`nurixlabs/etna`), folder `docs/
|
|
88
|
+
| Author or restructure a **skill** (fit, triggers, shape, anatomy, shipping) | The skill-authoring field guide — the `etna` repo (`nurixlabs/etna`), folder `docs/playbooks/skills/`, chapters `00`–`10`. **No etna checkout available ⇒ ask the user for access to the etna repo, or proceed from first principles** with [`references/instruction-style.md`](references/instruction-style.md) governing the prose. This row is the only place the playbook is referenced |
|
|
89
89
|
| **No template matches** | [`references/untemplated.md`](references/untemplated.md) — shape decisions + the co-authoring workflow |
|
|
90
90
|
|
|
91
91
|
---
|
|
@@ -18,7 +18,7 @@ Strictly separated — never mix them:
|
|
|
18
18
|
|
|
19
19
|
**The operator layer**: `metadata/lessons/` — read `DIGEST.md` at session start alongside the routing files; it is **prior, not canon** (its reading-protocol block governs). Everything else under `lessons/` (append-only `log/`, `forecasts.md`) loads on demand only. The `lessons-maintenance` agent (instruction set: `metadata/lessons/distillation.md`) runs **only during user sessions** — spawn it in the background when the `metadata/ops/` cursor falls a session behind.
|
|
20
20
|
|
|
21
|
-
The rules are the method — portable, abstract, generic examples; nothing depends on any local topic. Live exemplars are reached through `metadata/TOPICS.md`. Workspace-local method notes go to `metadata/method-changelog.md`; the harness itself is versioned by `.claude/harness.json` and documented in the etna forge (`docs/
|
|
21
|
+
The rules are the method — portable, abstract, generic examples; nothing depends on any local topic. Live exemplars are reached through `metadata/TOPICS.md`. Workspace-local method notes go to `metadata/method-changelog.md`; the harness itself is versioned by `.claude/harness.json` and documented in the etna forge (`docs/harness/discussion/`).
|
|
22
22
|
|
|
23
23
|
## Delegation
|
|
24
24
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"harness": "discussion",
|
|
3
3
|
"name": "discussion",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.1",
|
|
5
5
|
"files": [
|
|
6
6
|
".prettierignore",
|
|
7
7
|
".prettierrc.json",
|
|
@@ -10,5 +10,5 @@
|
|
|
10
10
|
"seeds": [],
|
|
11
11
|
"tools": [],
|
|
12
12
|
"docsRoot": "docs",
|
|
13
|
-
"digest": "
|
|
13
|
+
"digest": "a3de25b70367"
|
|
14
14
|
}
|
|
@@ -29,7 +29,8 @@ Invoke the `maintenance` agent whenever the docs look like they need it — not
|
|
|
29
29
|
|
|
30
30
|
## Getting Started
|
|
31
31
|
|
|
32
|
-
- Read **[`docs/structure.md`](docs/structure.md)** — the documentation authority map
|
|
32
|
+
- Read **[`docs/structure.md`](docs/structure.md)** — the documentation authority map. The top level mirrors the source roots the forge ships from (`skills/`, `harness/`, `rules/`, `packages/`), plus `playbooks/` for the craft guides and `architecture/` for truth spanning two or more subjects. Don't restate it here.
|
|
33
|
+
- Read **[`docs/writing-style.md`](docs/writing-style.md)** before writing anything — the single style authority for this repo.
|
|
33
34
|
- Read **[`docs/memory/`](docs/memory/)** for agent memory files (one per agent).
|
|
34
35
|
- Prefer `docs/` over `README.md` — `docs/` is canonical for agents.
|
|
35
36
|
- The CLI and hooks are the only real code — detect the package manager from the lockfile (see `.claude/rules/general.md`) for anything under `packages/`.
|
|
@@ -61,7 +62,7 @@ Three peer modes plus a Completion step — enter wherever the user's thinking a
|
|
|
61
62
|
| **LLD** (low-level design) | new component/feature work | `lld-mode` agent + `documentation` skill | Plan |
|
|
62
63
|
| **Plan** | an LLD is approved | `documentation` skill → `docs/history/plans/YYYY-MM-DD-{slug}.md` | Completion |
|
|
63
64
|
|
|
64
|
-
> Brainstorm entry needs a **basis** — a reference document or a one-shot brain dump; drip-sized asks (a one-line fix) are too small and get redirected. A **pillar** is a recorded strategic principle from a past brainstorm: in-progress sessions under `docs/research/`, harvested ones under `docs/history/brainstorms/`, harvested doctrine under `docs/architecture/`. The LLD is the
|
|
65
|
+
> Brainstorm entry needs a **basis** — a reference document or a one-shot brain dump; drip-sized asks (a one-line fix) are too small and get redirected. A **pillar** is a recorded strategic principle from a past brainstorm: in-progress sessions under `docs/research/`, harvested ones under `docs/history/brainstorms/`, harvested doctrine under `docs/architecture/`. The LLD is the component's own doc — `docs/skills/{name}/`, `docs/harness/{name}/`, or `docs/packages/{name}.md` — design intent first, extended in place at Completion.
|
|
65
66
|
|
|
66
67
|
**On Plan Completion:**
|
|
67
68
|
|
|
@@ -79,14 +80,14 @@ These three mechanisms keep the repo self-updating: **ownership** routes an edit
|
|
|
79
80
|
|
|
80
81
|
### Ownership — route before editing
|
|
81
82
|
|
|
82
|
-
|
|
83
|
+
**Ownership is declared, not positional.** Any document under `docs/` carrying `owns:` frontmatter claims those code paths — path globs pointing at `skills/**`, `harness/**`, `packages/**`, … — plus an optional `module:` label, `keywords:`, and `status:`. The SessionStart hook scans the whole tree and builds the injected index from the union, so a component's own record claims its path directly and a doc's location is a browsing decision, never an ownership one. Where two docs overlap, the **narrower glob wins**. A module is tied to its components by the `owns:` globs of the docs carrying its `module:` label — not a folder, not a separate map. Indexes, chapters, and explainers carry no `owns:`, so a subject claims its path exactly once.
|
|
83
84
|
|
|
84
85
|
Before modifying a component in an unfamiliar area:
|
|
85
86
|
|
|
86
|
-
1. Consult the **injected ownership index** — the `glob → doc · module · keywords · status` map. Match the path or topic to the owning
|
|
87
|
+
1. Consult the **injected ownership index** — the `glob → doc · module · keywords · status` map. Match the path or topic to the owning doc and read it first. (No index in context ⇒ the repo isn't reconciled — see Maintenance.)
|
|
87
88
|
2. If a `docs/memory/` file exists for the area, read it for domain knowledge and failure modes.
|
|
88
89
|
|
|
89
|
-
The `lld-mode` agent checks for ownership conflicts during LLD research —
|
|
90
|
+
The `lld-mode` agent checks for ownership conflicts during LLD research — docs whose `owns:` globs overlap at equal specificity. Resolve them in the LLD before proceeding.
|
|
90
91
|
|
|
91
92
|
### Boundaries — check while changing
|
|
92
93
|
|
|
@@ -101,10 +102,11 @@ Invoke the `boundary` skill after a plan is approved and before its first implem
|
|
|
101
102
|
|
|
102
103
|
### Documentation — close the loop
|
|
103
104
|
|
|
104
|
-
- **
|
|
105
|
+
- **Everything written in this repo follows [`docs/writing-style.md`](docs/writing-style.md) — no exceptions.** It is the single style authority for both genres: instruction files (`CLAUDE.md`, rules, agents, skill prose) and documents. Read it before writing prose here, not after. Its load-bearing rule is the Two Natures — truth documents state the present and narrate no history; records are dated and never edited to match the present.
|
|
106
|
+
- **Every markdown document also goes through the `documentation` skill** for its *genre* — invoke it before creating or substantively editing any `.md` file and apply the matching template. The skill supplies structure; `writing-style.md` supplies the prose.
|
|
105
107
|
- **[override]** Keep `docs/` updated when a change alters documented behaviour — creating and updating docs is part of the work.
|
|
106
108
|
- After plan completion **[override]**: write the `docs/history/changelog/` entry as a **draft** immediately, while the context is fresh — no confirmation needed — and append its `docs/history/CHANGELOG.md` row; the commit fills what the draft left open and freezes it. Non-plan work needs no separate prompt: every non-exempt commit carries its own entry (the `changelog` rule).
|
|
107
|
-
- When moving or renaming a component: update the `owns:` globs of the
|
|
109
|
+
- When moving or renaming a component: update the `owns:` globs of the doc that owns it so the ownership index stays accurate. A new doc that owns code declares its paths in its own `owns:` frontmatter.
|
|
108
110
|
- `docs/structure.md` is the authority on what belongs where — read it before adding or moving a doc; one canonical source per topic, link don't copy. Only `CLAUDE.md`, `AGENTS.md`, and `README.md` live at the repo root.
|
|
109
111
|
|
|
110
112
|
> Agents and skills live under `.claude/agents/` and `.claude/skills/`. Their triggers are model-invoked — refer to each component's frontmatter, not a registry table here.
|
|
@@ -120,7 +122,7 @@ A commit marks the user's behavioral verification of the work, and the working s
|
|
|
120
122
|
- **A commit is the smallest unit an entry may describe**; above that the mapping is judgment. Work exceeding a draft's scope gets a *second* entry rather than stretching the first.
|
|
121
123
|
- **Distillation is the `retro` agent** — run on demand (before a brainstorm or LLD, before a new project, after a refinement arc), it converts accumulated entries into a typed punch list (doc content, doc structure, skill evolution, pins, harness rules), appends actionable items to the backlog, and proposes only — application runs through the normal documentation loop.
|
|
122
124
|
|
|
123
|
-
**One-shot migrations are a different genre.** Work that runs **once** against a live system — a harness rollout across consumer repos, a catalog-wide cutover, a data backfill — is a **migration runbook** at `docs/history/migrations/YYYY-MM-DD-{slug}.md` (template: the `documentation` skill's `templates/migration-runbook.md`), authored **before** execution and outcome-stamped after. A changelog entry says what changed in this repo; a runbook says what was executed against the world and how to verify or undo it. A repeatable procedure is neither — that
|
|
125
|
+
**One-shot migrations are a different genre.** Work that runs **once** against a live system — a harness rollout across consumer repos, a catalog-wide cutover, a data backfill — is a **migration runbook** at `docs/history/migrations/YYYY-MM-DD-{slug}.md` (template: the `documentation` skill's `templates/migration-runbook.md`), authored **before** execution and outcome-stamped after. A changelog entry says what changed in this repo; a runbook says what was executed against the world and how to verify or undo it. A repeatable procedure is neither — that belongs with the component it operates. When a runbook defers targets, it records **why** and the **trigger to re-evaluate them**, so the next run re-checks rather than inheriting the skip.
|
|
124
126
|
|
|
125
127
|
---
|
|
126
128
|
|
|
@@ -164,12 +166,10 @@ The single policy for sub-agent dispatch — when to fan out, at what tier, and
|
|
|
164
166
|
|
|
165
167
|
❌ prohibitions hold unless the user explicitly asks otherwise; ✅ and ⚠️ items are standing policy:
|
|
166
168
|
|
|
167
|
-
- ❌ **Tests** — etna
|
|
169
|
+
- ❌ **Tests** — etna authors markdown; the only suite is the CLI's, under `packages/cli/`. Never generate, update, or modify test files unless the user explicitly asks. (The `code` harness ships a gated-verification posture for the projects it governs — that is a shipped rule, not etna's own.)
|
|
168
170
|
- ❌ **Dependencies** — never upgrade frameworks, libraries, or dependencies.
|
|
169
|
-
- ❌ **Compatibility** — never maintain backward compatibility unless specified.
|
|
170
171
|
- ❌ **Branches & Worktrees [override]** — never self-create git branches or worktrees; commit straight to the checked-out branch. This replaces any built-in "branch first on the default branch" default. Exception: when the user asks for a pull request, create the branch the PR requires before committing its changes.
|
|
171
|
-
- ❌ **Protected Files** —
|
|
172
|
-
- ✅ **Browser Automation** — Claude in Chrome / CDP browser tools: use freely when useful, no need to ask first.
|
|
172
|
+
- ❌ **Protected Files** — never modify `AGENTS.md`.
|
|
173
173
|
- ✅ **Delegation** — when to fan out, tiers, and trust are § Delegation.
|
|
174
174
|
- ⚠️ **Plans** — created directly in `docs/history/plans/` (see Workflows). Once `Status: Complete` or `Abandoned`, frozen — never edited. If scope changes after completion, write a new dated plan linking back.
|
|
175
175
|
- ⚠️ **Tool Issues** — if any CLI tool, shell alias, or MCP tool behaves unexpectedly (syntax errors, silent failures, wrong defaults), report the exact tool, command, and error to the user so they can fix the underlying library.
|
|
@@ -178,15 +178,15 @@ The single policy for sub-agent dispatch — when to fan out, at what tier, and
|
|
|
178
178
|
|
|
179
179
|
## Authoring Conventions
|
|
180
180
|
|
|
181
|
-
|
|
181
|
+
Almost everything here is markdown — skills, agents, rules, harness policies, docs. **The prose style for all of it is [`docs/writing-style.md`](docs/writing-style.md)**; the guides below add what is specific to each artifact class. Follow the `kb` / `nomenclature` rules; markdown has no file-path-comment rule. Keep the `.claude/rules/*` reference docs frontmatter-free.
|
|
182
182
|
|
|
183
183
|
**Each artifact class has an authoring guide — read the one you are editing, before you edit it.** The forge is the only repo that authors these, so the guides live here and ship nowhere:
|
|
184
184
|
|
|
185
185
|
| Editing | Guide |
|
|
186
186
|
| --- | --- |
|
|
187
|
-
| A **rule** (`rules/*.md`) | [`docs/
|
|
188
|
-
| A **skill** (`skills/*/`) | [`docs/
|
|
189
|
-
| An **agent** (`agents/*.md`) | [`docs/
|
|
187
|
+
| A **rule** (`rules/*.md`) | [`docs/rules/Readme.md`](docs/rules/Readme.md) — the catalog, the conventions, and the whole-file audit |
|
|
188
|
+
| A **skill** (`skills/*/`) | [`docs/playbooks/skills/`](docs/playbooks/skills/Readme.md) — fit and scope through shipping and maintenance |
|
|
189
|
+
| An **agent** (`agents/*.md`) | [`docs/playbooks/agents.md`](docs/playbooks/agents.md) |
|
|
190
190
|
|
|
191
191
|
Authoring or updating an **agent** keeps both runtimes in sync: the `.md` is the single source, and its Codex `.codex.toml` twin is derived from it by the guide above, then checked with `node packages/cli/lib/codex/validate-codex-agents.mjs`.
|
|
192
192
|
|
|
@@ -18,10 +18,10 @@ You do NOT write the LLD — you return structured research that the main agent
|
|
|
18
18
|
Map the documentation landscape — what exists, what is adjacent, how detailed the LLD should be, and what code paths are already owned:
|
|
19
19
|
|
|
20
20
|
1. Read `./docs/structure.md` to understand the documentation structure
|
|
21
|
-
2.
|
|
21
|
+
2. Locate the repo's feature-doc layer from `structure.md` — the standard shape is `./docs/features/`, but a repo may document components under their own subject folders. Read that layer's index if it has one; otherwise glob for docs carrying `owns:` frontmatter
|
|
22
22
|
3. If `./docs/memory/lld-mode.md` exists (or the legacy `./docs/memory/spec-mode.md`), read it for feature doc inventory, ownership conflict zones, and lessons from previous research
|
|
23
|
-
4. Read 1-2 existing feature LLDs
|
|
24
|
-
5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob `docs/
|
|
23
|
+
4. Read 1-2 existing feature LLDs from that layer to calibrate format and depth
|
|
24
|
+
5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob the docs tree (excluding `docs/history/`) and read the `owns:` frontmatter of every doc that declares it.
|
|
25
25
|
|
|
26
26
|
## What You Research
|
|
27
27
|
|
|
@@ -44,15 +44,15 @@ Decide the mode once, up front, from the version marker — then run.
|
|
|
44
44
|
|
|
45
45
|
## Part A — Coherence audit (always runs)
|
|
46
46
|
|
|
47
|
-
The ownership source of truth is the **union of every
|
|
47
|
+
The ownership source of truth is the **union of every doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing the docs tree for docs that declare `owns:`.
|
|
48
48
|
|
|
49
49
|
### Step 1: Build the ownership map
|
|
50
50
|
|
|
51
51
|
1. Read `docs/structure.md` for the authority map.
|
|
52
|
-
2. Glob
|
|
52
|
+
2. Glob the docs tree for markdown carrying `owns:` frontmatter, ignoring `*.bkp.*` files (installer backups awaiting the fold) and anything under `docs/history/` (frozen records quote retired globs as provenance). **Ownership is declared, not positional** — the standard shape files these docs under `docs/features/`, but a repo may declare ownership on any doc, and the index reads them all. For each, parse the `owns:` globs and `module:` label.
|
|
53
53
|
3. Build a map: glob → owning doc + module. Narrower glob wins on overlap. **This IS the source of truth.**
|
|
54
54
|
|
|
55
|
-
**Architecture-first fallback.** If no
|
|
55
|
+
**Architecture-first fallback.** If no doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
|
|
56
56
|
|
|
57
57
|
### Step 2: Validate ownership
|
|
58
58
|
|
|
@@ -14,9 +14,9 @@ You do NOT write the LLD — you return structured research that the main agent
|
|
|
14
14
|
Map the documentation landscape — what exists, what is adjacent, how detailed the LLD should be, and what code paths are already owned:
|
|
15
15
|
|
|
16
16
|
1. Read `./docs/structure.md` to understand the documentation structure
|
|
17
|
-
2.
|
|
17
|
+
2. Locate the repo's feature-doc layer from `structure.md` — the standard shape is `./docs/features/`, but a repo may document components under their own subject folders. Read that layer's index if it has one; otherwise glob for docs carrying `owns:` frontmatter
|
|
18
18
|
3. If `./docs/memory/lld-mode.md` exists (or the legacy `./docs/memory/spec-mode.md`), read it for feature doc inventory, ownership conflict zones, and lessons from previous research
|
|
19
|
-
4. Read 1-2 existing feature LLDs
|
|
19
|
+
4. Read 1-2 existing feature LLDs from that layer to calibrate format and depth
|
|
20
20
|
5. Consult the **injected ownership index** (the generated `glob → doc · module · keywords · status` map — the union of every feature doc's `owns:` frontmatter) to build the ownership map. It is the source of truth for what code paths are already owned. If the index isn't present in context, glob `docs/features/**/*.md` and read each doc's `owns:` frontmatter directly.
|
|
21
21
|
|
|
22
22
|
## What You Research
|
|
@@ -42,15 +42,15 @@ Decide the mode once, up front, from the version marker — then run.
|
|
|
42
42
|
|
|
43
43
|
## Part A — Coherence audit (always runs)
|
|
44
44
|
|
|
45
|
-
The ownership source of truth is the **union of every
|
|
45
|
+
The ownership source of truth is the **union of every doc's `owns:` frontmatter** — the same source the SessionStart ownership index derives from. There is no `docs/routing.md` and no precomputed file to regenerate; you rebuild the map by globbing `docs/features/`.
|
|
46
46
|
|
|
47
47
|
### Step 1: Build the ownership map
|
|
48
48
|
|
|
49
49
|
1. Read `docs/structure.md` for the authority map.
|
|
50
|
-
2. Glob
|
|
50
|
+
2. Glob the docs tree for markdown carrying `owns:` frontmatter, ignoring `*.bkp.*` files and anything under `docs/history/`. **Ownership is declared, not positional** — the standard shape files these under `docs/features/`, but a repo may declare ownership on any doc. For each, parse the `owns:` globs and `module:` label.
|
|
51
51
|
3. Build a map: glob → owning doc + module. Narrower glob wins on overlap. **This IS the source of truth.**
|
|
52
52
|
|
|
53
|
-
**Architecture-first fallback.** If no
|
|
53
|
+
**Architecture-first fallback.** If no doc carries `owns:` yet (a fresh-baseline repo can carry thousands of LOC and zero feature docs), drive this pass's ownership/drift surface off `docs/architecture/**` file-references instead — they become the **primary** ownership map for Steps 2–5. The `owns:` map becomes primary the moment any feature doc declares ownership — this is a fallback, not a replacement.
|
|
54
54
|
|
|
55
55
|
### Step 2: Validate ownership
|
|
56
56
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"harness": "etna",
|
|
3
3
|
"name": "etna",
|
|
4
|
-
"version": "1.5.
|
|
4
|
+
"version": "1.5.16",
|
|
5
5
|
"files": [
|
|
6
6
|
".prettierignore",
|
|
7
7
|
".prettierrc.json",
|
|
@@ -10,5 +10,5 @@
|
|
|
10
10
|
"seeds": [],
|
|
11
11
|
"tools": [],
|
|
12
12
|
"docsRoot": "docs",
|
|
13
|
-
"digest": "
|
|
13
|
+
"digest": "f836486a6ca4"
|
|
14
14
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// harness/etna/hooks/generate-ownership-index.mjs — SessionStart hook: scan docs
|
|
1
|
+
// harness/etna/hooks/generate-ownership-index.mjs — SessionStart hook: scan docs/**/*.md,
|
|
2
2
|
// extract the focal frontmatter (owns / module / keywords / status), and inject a compact
|
|
3
3
|
// code-path → owning-doc index via additionalContext. Fires on startup/resume/clear/compact so the
|
|
4
4
|
// map survives /clear and /compact and is regenerated fresh every time. Writes no file.
|
|
@@ -115,10 +115,16 @@ function asList(v) {
|
|
|
115
115
|
|
|
116
116
|
// Build the ownership index text from every feature doc's frontmatter.
|
|
117
117
|
function buildIndex(projectDir) {
|
|
118
|
-
|
|
119
|
-
//
|
|
118
|
+
// Ownership is DECLARED, not positional: any doc anywhere under docs/ that carries owns:
|
|
119
|
+
// claims those paths, so a component's record claims its own path instead of a stub doing it
|
|
120
|
+
// by proxy. docs/history/ is skipped — frozen plans and records quote old globs as provenance,
|
|
121
|
+
// and indexing them would resurrect retired ownership.
|
|
122
|
+
const docsDir = path.join(projectDir, "docs");
|
|
123
|
+
// *.bkp.* files are install-time backups awaiting the maintenance fold — a backed-up
|
|
120
124
|
// doc double-owning every path it names is the drift this filter prevents (parity: lib/ownership.mjs).
|
|
121
|
-
const files = listMarkdown(
|
|
125
|
+
const files = listMarkdown(docsDir)
|
|
126
|
+
.filter((f) => !f.includes(".bkp."))
|
|
127
|
+
.filter((f) => !f.split(path.sep).includes("history"));
|
|
122
128
|
const lines = [];
|
|
123
129
|
let deprecated = 0;
|
|
124
130
|
let indexed = 0;
|
|
@@ -162,7 +168,7 @@ function buildIndex(projectDir) {
|
|
|
162
168
|
if (deprecated > 0) notes.push(`${deprecated} deprecated`);
|
|
163
169
|
if (skipped > 0) notes.push(`${skipped} with no owns:`);
|
|
164
170
|
const footer = notes.length
|
|
165
|
-
? `\n# (${indexed}/${files.length}
|
|
171
|
+
? `\n# (${indexed}/${files.length} doc(s) claim ownership - ${notes.join(", ")})`
|
|
166
172
|
: "";
|
|
167
173
|
return header + lines.join("\n") + footer;
|
|
168
174
|
}
|
|
@@ -6,7 +6,7 @@ correctly, the record stays readable at any pause, and the session ends with a h
|
|
|
6
6
|
complete that the session folder is useless — it moves to history and the user deletes or
|
|
7
7
|
commits it.
|
|
8
8
|
|
|
9
|
-
> Spec (single source of truth): `docs/
|
|
9
|
+
> Spec (single source of truth): `docs/skills/brainstorm/` in the etna repo. The etna
|
|
10
10
|
> copy of this skill (`skills/brainstorm/`) is canonical; the user-level path
|
|
11
11
|
> `~/.claude/skills/brainstorm/` is a symlink to it.
|
|
12
12
|
|
|
@@ -85,7 +85,7 @@ The two guarantees are complementary and both break on mixing: a reader holding
|
|
|
85
85
|
| Derive/update a feature doc's `owns:` | [`references/frontmatter.md`](references/frontmatter.md) |
|
|
86
86
|
| Update existing doc | § Editing an existing doc (below) |
|
|
87
87
|
| Instruction file (`CLAUDE.md`, a rule, an agent, skill prose) | [`references/instruction-style.md`](references/instruction-style.md) — not these templates; every-load prose stays lean, and the present-tense rule still applies |
|
|
88
|
-
| Author or restructure a **skill** (fit, triggers, shape, anatomy, shipping) | The skill-authoring field guide — the `etna` repo (`nurixlabs/etna`), folder `docs/
|
|
88
|
+
| Author or restructure a **skill** (fit, triggers, shape, anatomy, shipping) | The skill-authoring field guide — the `etna` repo (`nurixlabs/etna`), folder `docs/playbooks/skills/`, chapters `00`–`10`. **No etna checkout available ⇒ ask the user for access to the etna repo, or proceed from first principles** with [`references/instruction-style.md`](references/instruction-style.md) governing the prose. This row is the only place the playbook is referenced |
|
|
89
89
|
| **No template matches** | [`references/untemplated.md`](references/untemplated.md) — shape decisions + the co-authoring workflow |
|
|
90
90
|
|
|
91
91
|
---
|
package/lib/codex/README.md
CHANGED
|
@@ -32,7 +32,7 @@ The two channels do not install the same set. The **CLI** writes the full Codex
|
|
|
32
32
|
|
|
33
33
|
## Subagents are authored, not derived at install
|
|
34
34
|
|
|
35
|
-
`.claude/agents/*.md → .codex/agents/*.toml` is a semantic conversion, so the twin is **authored from the `.md` by following** [`docs/
|
|
35
|
+
`.claude/agents/*.md → .codex/agents/*.toml` is a semantic conversion, so the twin is **authored from the `.md` by following** [`docs/playbooks/agents.md`](../../../../docs/playbooks/agents.md) — the model that writes or edits the agent produces the twin inline (frontmatter → `name`/`description`, body verbatim → `developer_instructions`, `tools:` dropped to a comment, Claude model aliases omitted), with **no external CLI**. The committed `agents/<name>.codex.toml` is checked by the validation gate:
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
38
|
node packages/cli/lib/codex/validate-codex-agents.mjs # or: npm run validate:codex-agents
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// packages/cli/lib/codex/validate-codex-agents.mjs
|
|
2
2
|
// The Codex-twin validation gate — decoupled from any generator. A `<name>.codex.toml`
|
|
3
|
-
// twin is now authored by the AI following docs/
|
|
3
|
+
// twin is now authored by the AI following docs/playbooks/agents.md,
|
|
4
4
|
// so this is the check that keeps a malformed or Claude-only twin from shipping: the twins
|
|
5
5
|
// are copied UNPARSED into the bundle (build-data.js) and a consumer's .codex/agents/, so
|
|
6
6
|
// nothing else catches a bad one before Codex fails to load it in that repo. Run it after
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nurix/etna",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.8",
|
|
4
4
|
"description": "Bootstrap a project with a Nurix harness — copies the harness's CLAUDE.md, skills, agents, rules, and hooks directly into the project from a bundled payload (no marketplace fetch, no network).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -42,5 +42,5 @@
|
|
|
42
42
|
"agent",
|
|
43
43
|
"plugin"
|
|
44
44
|
],
|
|
45
|
-
"etnaFingerprint": "
|
|
45
|
+
"etnaFingerprint": "bcf04d8d525c"
|
|
46
46
|
}
|