@nurix/etna 0.19.66 → 0.19.67
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/bin/etna.js +10 -1
- package/data/harness-index.json +1 -5
- package/data/harnesses/code/CLAUDE.md +2 -0
- package/data/harnesses/code/agents/maintenance.md +3 -1
- package/data/harnesses/code/harness.json +7 -2
- package/data/harnesses/code/hooks/compliance.mjs +1 -0
- package/data/harnesses/code/hooks/lib/frozen.mjs +3 -0
- package/data/harnesses/code/hooks/lib/ownership.mjs +3 -1
- package/data/harnesses/code/skills/documentation/scripts/doc-lint.mjs +1 -1
- package/data/harnesses/delivery/agents/maintenance.md +3 -1
- package/data/harnesses/delivery/harness.json +2 -2
- package/data/harnesses/delivery/skills/documentation/scripts/doc-lint.mjs +1 -1
- package/data/harnesses/etna/agents/maintenance.md +3 -1
- package/data/harnesses/etna/harness.json +2 -2
- package/data/harnesses/etna/skills/documentation/scripts/doc-lint.mjs +1 -1
- package/lib/install/materialize.mjs +51 -57
- package/package.json +2 -2
- package/data/harnesses/apollo/.mcp.json +0 -8
- package/data/harnesses/apollo/.prettierignore +0 -29
- package/data/harnesses/apollo/.prettierrc.json +0 -3
- package/data/harnesses/apollo/.vscode/settings.json +0 -19
- package/data/harnesses/apollo/CLAUDE.md +0 -162
- package/data/harnesses/apollo/agents/bookkeeper.md +0 -28
- package/data/harnesses/apollo/agents/brainstorm.md +0 -144
- package/data/harnesses/apollo/agents/change-review.md +0 -251
- package/data/harnesses/apollo/agents/lld-mode.md +0 -58
- package/data/harnesses/apollo/agents/maintenance.md +0 -234
- package/data/harnesses/apollo/agents/performance-review.md +0 -223
- package/data/harnesses/apollo/agents/retro.md +0 -46
- package/data/harnesses/apollo/codex/agents/bookkeeper.toml +0 -26
- package/data/harnesses/apollo/codex/agents/brainstorm.toml +0 -142
- package/data/harnesses/apollo/codex/agents/change-review.toml +0 -249
- package/data/harnesses/apollo/codex/agents/lld-mode.toml +0 -52
- package/data/harnesses/apollo/codex/agents/maintenance.toml +0 -228
- package/data/harnesses/apollo/codex/agents/performance-review.toml +0 -222
- package/data/harnesses/apollo/codex/agents/retro.toml +0 -45
- package/data/harnesses/apollo/harness.json +0 -19
- package/data/harnesses/apollo/hooks/approved-packages.md +0 -44
- package/data/harnesses/apollo/hooks/awareness.mjs +0 -405
- package/data/harnesses/apollo/hooks/check-bookkeeping-clean.mjs +0 -19
- package/data/harnesses/apollo/hooks/check-changelog-presence.mjs +0 -57
- package/data/harnesses/apollo/hooks/check-completion-integrity.mjs +0 -71
- package/data/harnesses/apollo/hooks/check-ownership.mjs +0 -22
- package/data/harnesses/apollo/hooks/compliance.mjs +0 -457
- package/data/harnesses/apollo/hooks/hooks.json +0 -23
- package/data/harnesses/apollo/hooks/lib/frozen.mjs +0 -58
- package/data/harnesses/apollo/hooks/lib/ownership.mjs +0 -242
- package/data/harnesses/apollo/hooks/lib/state.mjs +0 -170
- package/data/harnesses/apollo/rules/changelog.md +0 -27
- package/data/harnesses/apollo/rules/database.md +0 -34
- package/data/harnesses/apollo/rules/frontend.md +0 -30
- package/data/harnesses/apollo/rules/general.md +0 -40
- package/data/harnesses/apollo/rules/nomenclature.md +0 -30
- package/data/harnesses/apollo/rules/pnpm.md +0 -57
- package/data/harnesses/apollo/rules/testing.md +0 -64
- package/data/harnesses/apollo/skills/boundary/SKILL.md +0 -75
- package/data/harnesses/apollo/skills/boundary/references/index.md +0 -16
- package/data/harnesses/apollo/skills/boundary/references/mechanisms.md +0 -99
- package/data/harnesses/apollo/skills/boundary/references/packs/async-messaging.md +0 -81
- package/data/harnesses/apollo/skills/boundary/references/packs/auth.md +0 -93
- package/data/harnesses/apollo/skills/boundary/references/packs/build-config-runtime.md +0 -93
- package/data/harnesses/apollo/skills/boundary/references/packs/cloudflare.md +0 -93
- package/data/harnesses/apollo/skills/boundary/references/packs/frontend.md +0 -93
- package/data/harnesses/apollo/skills/boundary/references/packs/generic-tail.md +0 -55
- package/data/harnesses/apollo/skills/boundary/references/packs/persistence.md +0 -93
- package/data/harnesses/apollo/skills/boundary/references/packs/wire-api.md +0 -87
- package/data/harnesses/apollo/skills/brainstorm/README.md +0 -56
- package/data/harnesses/apollo/skills/brainstorm/SKILL.md +0 -173
- package/data/harnesses/apollo/skills/brainstorm/references/doctrine.md +0 -98
- package/data/harnesses/apollo/skills/brainstorm/references/harvest.md +0 -86
- package/data/harnesses/apollo/skills/brainstorm/references/session-schema.md +0 -186
- package/data/harnesses/apollo/skills/brainstorm/scripts/detector.mjs +0 -460
- package/data/harnesses/apollo/skills/design/SKILL.md +0 -121
- package/data/harnesses/apollo/skills/design/components/charts.md +0 -76
- package/data/harnesses/apollo/skills/design/components/collections.md +0 -132
- package/data/harnesses/apollo/skills/design/components/feedback.md +0 -47
- package/data/harnesses/apollo/skills/design/components/hooks.md +0 -35
- package/data/harnesses/apollo/skills/design/components/index.md +0 -143
- package/data/harnesses/apollo/skills/design/components/inputs.md +0 -327
- package/data/harnesses/apollo/skills/design/components/layout.md +0 -52
- package/data/harnesses/apollo/skills/design/components/media.md +0 -66
- package/data/harnesses/apollo/skills/design/components/motion.md +0 -82
- package/data/harnesses/apollo/skills/design/components/navigation.md +0 -29
- package/data/harnesses/apollo/skills/design/components/overlays.md +0 -72
- package/data/harnesses/apollo/skills/design/components/setup.md +0 -40
- package/data/harnesses/apollo/skills/design/components/typography.md +0 -46
- package/data/harnesses/apollo/skills/design/components/utils.md +0 -37
- package/data/harnesses/apollo/skills/design/data/blueprints/browse.md +0 -38
- package/data/harnesses/apollo/skills/design/data/blueprints/creation-flow.md +0 -38
- package/data/harnesses/apollo/skills/design/data/blueprints/dashboard.md +0 -38
- package/data/harnesses/apollo/skills/design/data/blueprints/grid.md +0 -38
- package/data/harnesses/apollo/skills/design/data/blueprints/queue.md +0 -38
- package/data/harnesses/apollo/skills/design/data/blueprints/record-detail.md +0 -38
- package/data/harnesses/apollo/skills/design/data/blueprints/settings.md +0 -38
- package/data/harnesses/apollo/skills/design/data/charts/census.csv +0 -58
- package/data/harnesses/apollo/skills/design/data/checklists/browse.md +0 -21
- package/data/harnesses/apollo/skills/design/data/checklists/creation-flow.md +0 -20
- package/data/harnesses/apollo/skills/design/data/checklists/dashboard.md +0 -21
- package/data/harnesses/apollo/skills/design/data/checklists/grid.md +0 -21
- package/data/harnesses/apollo/skills/design/data/checklists/queue.md +0 -21
- package/data/harnesses/apollo/skills/design/data/checklists/record-detail.md +0 -21
- package/data/harnesses/apollo/skills/design/data/checklists/settings.md +0 -21
- package/data/harnesses/apollo/skills/design/data/chrome/board-column.md +0 -68
- package/data/harnesses/apollo/skills/design/data/chrome/data-table.md +0 -63
- package/data/harnesses/apollo/skills/design/data/chrome/side-panel.md +0 -60
- package/data/harnesses/apollo/skills/design/data/chrome/sidebar.md +0 -78
- package/data/harnesses/apollo/skills/design/data/chrome/stat-cards.md +0 -62
- package/data/harnesses/apollo/skills/design/data/chrome/topbar.md +0 -65
- package/data/harnesses/apollo/skills/design/data/elevation/ant-design-directional-shadow.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/apple-liquid-glass-material.md +0 -18
- package/data/harnesses/apollo/skills/design/data/elevation/atlassian-surface-shadow-pairing.md +0 -20
- package/data/harnesses/apollo/skills/design/data/elevation/fluent-2-key-ambient-ramp.md +0 -20
- package/data/harnesses/apollo/skills/design/data/elevation/github-primer-sparing-shadow.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/ibm-carbon-layer-and-border.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/linear-dark-surface-ladder.md +0 -17
- package/data/harnesses/apollo/skills/design/data/elevation/material-2-key-ambient-dp-ramp.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/material-3-tonal-elevation.md +0 -21
- package/data/harnesses/apollo/skills/design/data/elevation/neobrutalist-hard-offset.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/neumorphic-soft-dual-shadow.md +0 -18
- package/data/harnesses/apollo/skills/design/data/elevation/notion-warm-minimal-hairline.md +0 -17
- package/data/harnesses/apollo/skills/design/data/elevation/polaris-elevation-inset-bevel.md +0 -21
- package/data/harnesses/apollo/skills/design/data/elevation/radix-themes-alpha-ring-scale.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/shadcn-neutral-derived-radius.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/stripe-brand-tinted-dual-shadow.md +0 -18
- package/data/harnesses/apollo/skills/design/data/elevation/tailwind-default-utility-scale.md +0 -19
- package/data/harnesses/apollo/skills/design/data/elevation/vercel-geist-shadow-as-border.md +0 -20
- package/data/harnesses/apollo/skills/design/data/iconography.md +0 -199
- package/data/harnesses/apollo/skills/design/data/motion/accordion-expand.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/destructive-hold-confirm.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/drag-dismiss-momentum.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/empty-state-arrive.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/hover-lift.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/modal-center-arrive.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/number-ticker-roll.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/onboarding-bounce.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/panel-slide.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/press-feedback.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/progress-linear-loop.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/route-crossfade.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/rubber-band-overscroll.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/skeleton-shimmer.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/stagger-arrive.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/toast-enter-stack.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/tooltip-chain-instant.md +0 -18
- package/data/harnesses/apollo/skills/design/data/motion/trigger-anchored-reveal.md +0 -18
- package/data/harnesses/apollo/skills/design/data/tells.csv +0 -34
- package/data/harnesses/apollo/skills/design/data/voices/bright-collaborator.md +0 -29
- package/data/harnesses/apollo/skills/design/data/voices/direct-operator.md +0 -29
- package/data/harnesses/apollo/skills/design/data/voices/earnest-helper.md +0 -29
- package/data/harnesses/apollo/skills/design/data/voices/editorial-composed.md +0 -29
- package/data/harnesses/apollo/skills/design/data/voices/quiet-concierge.md +0 -29
- package/data/harnesses/apollo/skills/design/data/voices/warm-guide.md +0 -29
- package/data/harnesses/apollo/skills/design/references/compose.md +0 -23
- package/data/harnesses/apollo/skills/design/references/content.md +0 -28
- package/data/harnesses/apollo/skills/design/references/emission.md +0 -21
- package/data/harnesses/apollo/skills/design/references/existing-apps.md +0 -27
- package/data/harnesses/apollo/skills/design/references/foundations.md +0 -57
- package/data/harnesses/apollo/skills/design/references/intake.md +0 -40
- package/data/harnesses/apollo/skills/design/references/object-pass.md +0 -24
- package/data/harnesses/apollo/skills/design/references/ship-gate.md +0 -29
- package/data/harnesses/apollo/skills/design/references/ux-patterns/Readme.md +0 -195
- package/data/harnesses/apollo/skills/design/references/ux-patterns/ai-layer.md +0 -49
- package/data/harnesses/apollo/skills/design/references/ux-patterns/attributes-lifecycle.md +0 -43
- package/data/harnesses/apollo/skills/design/references/ux-patterns/container-choice.md +0 -44
- package/data/harnesses/apollo/skills/design/references/ux-patterns/creation-paths.md +0 -46
- package/data/harnesses/apollo/skills/design/references/ux-patterns/dashboards.md +0 -42
- package/data/harnesses/apollo/skills/design/references/ux-patterns/modes.md +0 -42
- package/data/harnesses/apollo/skills/design/references/ux-patterns/object-model.md +0 -46
- package/data/harnesses/apollo/skills/design/references/ux-patterns/page-archetype.md +0 -48
- package/data/harnesses/apollo/skills/design/references/ux-patterns/promotion-demotion.md +0 -37
- package/data/harnesses/apollo/skills/design/references/ux-patterns/settings.md +0 -42
- package/data/harnesses/apollo/skills/design/references/ux-patterns/standard-pages.md +0 -46
- package/data/harnesses/apollo/skills/design/references/ux-patterns/state-matrix.md +0 -41
- package/data/harnesses/apollo/skills/design/references/ux-patterns/table-mechanics.md +0 -48
- package/data/harnesses/apollo/skills/design/references/ux-patterns/verbs.md +0 -45
- package/data/harnesses/apollo/skills/design/references/ux-patterns/viewer-context.md +0 -40
- package/data/harnesses/apollo/skills/design/scripts/README-validator.md +0 -27
- package/data/harnesses/apollo/skills/design/scripts/select-chart.mjs +0 -622
- package/data/harnesses/apollo/skills/design/scripts/validate-design-md.mjs +0 -1198
- package/data/harnesses/apollo/skills/documentation/SKILL.md +0 -135
- package/data/harnesses/apollo/skills/documentation/references/examples.md +0 -279
- package/data/harnesses/apollo/skills/documentation/references/frontmatter.md +0 -44
- package/data/harnesses/apollo/skills/documentation/references/instruction-style.md +0 -50
- package/data/harnesses/apollo/skills/documentation/references/style-guide.md +0 -384
- package/data/harnesses/apollo/skills/documentation/references/untemplated.md +0 -38
- package/data/harnesses/apollo/skills/documentation/scripts/doc-lint.mjs +0 -140
- package/data/harnesses/apollo/skills/documentation/templates/Readme.md +0 -35
- package/data/harnesses/apollo/skills/documentation/templates/api-reference.md +0 -20
- package/data/harnesses/apollo/skills/documentation/templates/architecture-decision.md +0 -121
- package/data/harnesses/apollo/skills/documentation/templates/backlog.md +0 -33
- package/data/harnesses/apollo/skills/documentation/templates/behavioral-checklist.md +0 -81
- package/data/harnesses/apollo/skills/documentation/templates/bookkeeping.md +0 -18
- package/data/harnesses/apollo/skills/documentation/templates/changelog-entry.md +0 -57
- package/data/harnesses/apollo/skills/documentation/templates/changelog-index.md +0 -41
- package/data/harnesses/apollo/skills/documentation/templates/docs-readme.md +0 -72
- package/data/harnesses/apollo/skills/documentation/templates/domain-model.md +0 -30
- package/data/harnesses/apollo/skills/documentation/templates/environment-registry.md +0 -15
- package/data/harnesses/apollo/skills/documentation/templates/feature.md +0 -150
- package/data/harnesses/apollo/skills/documentation/templates/glossary.md +0 -11
- package/data/harnesses/apollo/skills/documentation/templates/implementation-map.md +0 -42
- package/data/harnesses/apollo/skills/documentation/templates/journal.md +0 -13
- package/data/harnesses/apollo/skills/documentation/templates/memory-main.md +0 -25
- package/data/harnesses/apollo/skills/documentation/templates/migration-runbook.md +0 -34
- package/data/harnesses/apollo/skills/documentation/templates/non-goals.md +0 -11
- package/data/harnesses/apollo/skills/documentation/templates/operations-procedure.md +0 -36
- package/data/harnesses/apollo/skills/documentation/templates/plan.md +0 -88
- package/data/harnesses/apollo/skills/documentation/templates/protected-files.md +0 -37
- package/data/harnesses/apollo/skills/documentation/templates/root-readme.md +0 -104
- package/data/harnesses/apollo/skills/documentation/templates/security-overview.md +0 -27
- package/data/harnesses/apollo/skills/documentation/templates/structure.md +0 -65
- package/data/harnesses/apollo/skills/documentation/templates/system-overview.md +0 -32
- package/data/harnesses/apollo/skills/documentation/templates/testing-strategy.md +0 -29
- package/data/harnesses/apollo/skills/schema-design/SKILL.md +0 -141
- package/data/harnesses/apollo/skills/test/SKILL.md +0 -104
- package/data/harnesses/apollo/skills/testing/SKILL.md +0 -166
- package/data/harnesses/apollo/skills/workflow-mapper/SKILL.md +0 -451
- package/data/harnesses/apollo/skills/workflow-mapper/references/patterns.md +0 -214
- /package/data/harnesses/{apollo → code}/docs/README.md +0 -0
- /package/data/harnesses/{apollo → code}/docs/history/CHANGELOG.md +0 -0
- /package/data/harnesses/{apollo → code}/docs/history/backlog.md +0 -0
- /package/data/harnesses/{apollo → code}/docs/memory/main.md +0 -0
- /package/data/harnesses/{apollo → code}/docs/structure.md +0 -0
- /package/data/harnesses/{apollo → code}/rules/cloudflare.md +0 -0
package/bin/etna.js
CHANGED
|
@@ -232,7 +232,16 @@ async function main(args) {
|
|
|
232
232
|
await sleep(2000);
|
|
233
233
|
boot.stop('Ready');
|
|
234
234
|
|
|
235
|
-
|
|
235
|
+
// Transition alias: the `apollo` harness merged into `code` (the code harness is pre-baked —
|
|
236
|
+
// it ships the docs scaffold as seeds and auto-baselines on first contact). Scripts and docs
|
|
237
|
+
// that pin the old name keep working through the alias; it retires after one window.
|
|
238
|
+
let requested = name;
|
|
239
|
+
if (requested === 'apollo' && !harnesses.apollo) {
|
|
240
|
+
p.log.info('`apollo` merged into `code` — installing `code` (the pre-baked harness).');
|
|
241
|
+
requested = 'code';
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const harnessName = await resolveHarnessName(requested, harnesses);
|
|
236
245
|
if (!harnessName) return; // user cancelled the interactive pick
|
|
237
246
|
|
|
238
247
|
await installHarness(harnessName, harnesses);
|
package/data/harness-index.json
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"fingerprint": "
|
|
2
|
+
"fingerprint": "546f4bccb873",
|
|
3
3
|
"harnesses": {
|
|
4
|
-
"apollo": {
|
|
5
|
-
"plugin": "apollo",
|
|
6
|
-
"description": "the pre-baked `code` harness, built for Apollo Studio exports"
|
|
7
|
-
},
|
|
8
4
|
"code": {
|
|
9
5
|
"plugin": "code",
|
|
10
6
|
"description": "the foundation every Nurix project starts with"
|
|
@@ -6,6 +6,8 @@ How AI coding agents — any vendor, any runtime — work on this project. Rules
|
|
|
6
6
|
|
|
7
7
|
## Maintenance
|
|
8
8
|
|
|
9
|
+
**Baseline first**: if `docs/structure.md` lacks a `harness-version` frontmatter marker, or it is behind the `version` in `.claude/harness.json`, dispatch the `maintenance` agent **as a sub-agent** before taking up the user's first ask — baseline is bulky mechanical work, and dispatching it keeps this context clean for the ask. Tell the user what it will do; on a repo with existing docs or `.bkp` files, name what the fold will touch. No dispatch mechanism ⇒ run it inline.
|
|
10
|
+
|
|
9
11
|
Invoke the `maintenance` agent when a mechanical condition holds: `docs/structure.md` is missing (the repo isn't reconciled — baseline first), the `harness-version` marker is behind the installed version, a doc contradicts code being touched, or source paths are unowned — not on prose that merely looks stale. Structural reconciliation is never done by hand — the agent auto-selects its mode (baseline when the marker is missing or behind, coherence audit otherwise) and hands back; if it returns a follow-up (typically the module proposal), re-invoke it to finish. Single-glob or single-line doc corrections are done inline, per § Documentation. Each component's internals live in the component, not here.
|
|
10
12
|
|
|
11
13
|
---
|
|
@@ -51,7 +51,7 @@ The ownership source of truth is the **union of every feature doc's `owns:` fron
|
|
|
51
51
|
### Step 1: Build the ownership map
|
|
52
52
|
|
|
53
53
|
1. Read `docs/structure.md` for the authority map.
|
|
54
|
-
2. Glob `docs/features/**/*.md
|
|
54
|
+
2. Glob `docs/features/**/*.md`, ignoring `*.bkp.*` files (installer backups awaiting the fold); for each, parse the frontmatter `owns:` globs and `module:` label.
|
|
55
55
|
3. Build a map: glob → owning doc + module. Narrower glob wins on overlap. **This IS the source of truth.**
|
|
56
56
|
|
|
57
57
|
**Architecture-first fallback.** If no feature 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.
|
|
@@ -186,6 +186,8 @@ This is what makes baseline more than a fresh scaffold. Detect old-shape artifac
|
|
|
186
186
|
| `docs/architecture/overview.md` | split into `domain-model.md` / `glossary.md` / `non-goals.md` / `references.md` / `open-questions.md` |
|
|
187
187
|
| `docs/architecture/adr/` (legacy folder name), or `ADR-NNN-*.md` records anywhere under `docs/architecture/` | **rename to the AD genre.** The folder becomes `docs/architecture/decisions/`; each record file `ADR-NNN-{slug}.md` becomes `AD-NNN-{slug}.md`, keeping its number and slug. Inside each record, update the retired vocabulary — "ADR", "Architecture Decision Record", and any supersession framing ("once accepted, an ADR is never edited; a later ADR supersedes it") — to the AD model: one AD per subject, **updated in place**, its journey confined to a `Decision Changelog` tail. A record's **reasoning is never rewritten** by a reconcile; only its genre vocabulary, its own title/id, and paths it cites. The folder's `Readme.md` is an **index, not a record** — reframe its genre description while preserving authored content such as a candidate-decision list verbatim. Repoint live references **inside `docs/`**, including one AD citing another; leave frozen records' links as point-in-time. A live reference **outside** your write scope — most often the root `README.md`, which you never overwrite — cannot be repointed: record it as a backlog item naming the file and line rather than leaving the residue silent |
|
|
188
188
|
| a legacy `docs/brainstorm/{topic}/`, a singular `docs/history/brainstorm/`, or a root `brainstorm/`/`brainstorming/` folder | move each **active** record to `docs/research/{topic}-brainstorm/` and each **harvested** one to `docs/history/brainstorms/{topic}/` (dropping the suffix); create/refresh both `Readme.md` indexes; delete the emptied folder |
|
|
189
|
+
| `*.bkp.*` files under `docs/` (the installer's first-contact backups of the project's pre-existing files) | **fold the content, then delete the backup.** Classify each backup's content by nature and land it in the current shape — a backed-up changelog's rows into `docs/history/CHANGELOG.md` and per-entry files, a backed-up structure/readme's real claims into the scaffolded truth doc, a backed-up feature doc's content merged into its sibling (or adopted whole if the sibling is a pristine seed). Content is folded, never discarded silently; what cannot be classified goes to the backlog with the backup kept. When the fold lands, delete the `.bkp` file |
|
|
190
|
+
| `*.bkp.*` files at the repo root or in config (`CLAUDE.bkp.md`, `.prettierrc.bkp.json`, …) | **never merge these.** Top-level config is harness-owned by design; list each one to the user as their call, and leave the file in place |
|
|
189
191
|
| no `harness-version` in `structure.md` | stamp it (Step B4) |
|
|
190
192
|
|
|
191
193
|
### Step B3 — Present the reconcile plan, then execute
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"harness": "code",
|
|
3
3
|
"name": "code",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.8.1",
|
|
5
5
|
"files": [
|
|
6
6
|
".prettierignore",
|
|
7
7
|
".prettierrc.json",
|
|
8
8
|
".vscode/settings.json"
|
|
9
9
|
],
|
|
10
10
|
"seeds": [
|
|
11
|
+
"docs/README.md",
|
|
12
|
+
"docs/structure.md",
|
|
13
|
+
"docs/history/CHANGELOG.md",
|
|
14
|
+
"docs/history/backlog.md",
|
|
15
|
+
"docs/memory/main.md",
|
|
11
16
|
".mcp.json"
|
|
12
17
|
],
|
|
13
|
-
"digest": "
|
|
18
|
+
"digest": "f120a269e99c"
|
|
14
19
|
}
|
|
@@ -29,6 +29,9 @@ function readSafe(projectDir, filePath) {
|
|
|
29
29
|
|
|
30
30
|
// The predicate. Returns { frozen: boolean, reason?: string }.
|
|
31
31
|
export function frozenStatus(projectDir, filePath) {
|
|
32
|
+
// *.bkp.* siblings are install-time backups, not records — the maintenance fold edits and
|
|
33
|
+
// deletes them, which a frozen verdict would forbid.
|
|
34
|
+
if (relPosix(projectDir, filePath).includes(".bkp.")) return { frozen: false };
|
|
32
35
|
const rel = relPosix(projectDir, filePath);
|
|
33
36
|
if (rel.startsWith("docs/history/changelog/") && rel.endsWith(".md")) {
|
|
34
37
|
if (isCommitted(projectDir, rel)) {
|
|
@@ -117,7 +117,9 @@ export function asList(v) {
|
|
|
117
117
|
// Shape: { doc (repo-relative, /-separated), owns[], module, keywords[], status }.
|
|
118
118
|
export function scanFeatureDocs(projectDir) {
|
|
119
119
|
const featuresDir = path.join(projectDir, "docs", "features");
|
|
120
|
-
|
|
120
|
+
// *.bkp.* files are install-time backups awaiting the maintenance fold — a backed-up feature
|
|
121
|
+
// doc still carries owns: frontmatter, and scanning it would double-own every path it names.
|
|
122
|
+
const files = listMarkdown(featuresDir).filter((f) => !f.includes(".bkp."));
|
|
121
123
|
const docs = [];
|
|
122
124
|
for (const file of files) {
|
|
123
125
|
let text;
|
|
@@ -23,7 +23,7 @@ const RULES = [
|
|
|
23
23
|
// Sections inside a truth doc where dated history is sanctioned (the two bridges).
|
|
24
24
|
const BRIDGE_HEADINGS = /^#{1,4}\s+(decision changelog|health log)\b/i;
|
|
25
25
|
// Instruction files and generated trees are a different genre — out of this linter's scope.
|
|
26
|
-
const SKIP = /(^|\/)(\.claude|node_modules|skills|rules|agents|harness|packages\/[^/]+\/data)\/|(^|\/)(CLAUDE|AGENTS)\.md
|
|
26
|
+
const SKIP = /(^|\/)(\.claude|node_modules|skills|rules|agents|harness|packages\/[^/]+\/data)\/|(^|\/)(CLAUDE|AGENTS)\.md$|\.bkp\./;
|
|
27
27
|
const RECORD = /(^|\/)docs\/(history|research|memory)\//;
|
|
28
28
|
|
|
29
29
|
// Classify a path: skipped genre, record, or truth.
|
|
@@ -51,7 +51,7 @@ The ownership source of truth is the **union of every feature doc's `owns:` fron
|
|
|
51
51
|
### Step 1: Build the ownership map
|
|
52
52
|
|
|
53
53
|
1. Read `docs/structure.md` for the authority map.
|
|
54
|
-
2. Glob `docs/features/**/*.md
|
|
54
|
+
2. Glob `docs/features/**/*.md`, ignoring `*.bkp.*` files (installer backups awaiting the fold); for each, parse the frontmatter `owns:` globs and `module:` label.
|
|
55
55
|
3. Build a map: glob → owning doc + module. Narrower glob wins on overlap. **This IS the source of truth.**
|
|
56
56
|
|
|
57
57
|
**Architecture-first fallback.** If no feature 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.
|
|
@@ -186,6 +186,8 @@ This is what makes baseline more than a fresh scaffold. Detect old-shape artifac
|
|
|
186
186
|
| `docs/architecture/overview.md` | split into `domain-model.md` / `glossary.md` / `non-goals.md` / `references.md` / `open-questions.md` |
|
|
187
187
|
| `docs/architecture/adr/` (legacy folder name), or `ADR-NNN-*.md` records anywhere under `docs/architecture/` | **rename to the AD genre.** The folder becomes `docs/architecture/decisions/`; each record file `ADR-NNN-{slug}.md` becomes `AD-NNN-{slug}.md`, keeping its number and slug. Inside each record, update the retired vocabulary — "ADR", "Architecture Decision Record", and any supersession framing ("once accepted, an ADR is never edited; a later ADR supersedes it") — to the AD model: one AD per subject, **updated in place**, its journey confined to a `Decision Changelog` tail. A record's **reasoning is never rewritten** by a reconcile; only its genre vocabulary, its own title/id, and paths it cites. The folder's `Readme.md` is an **index, not a record** — reframe its genre description while preserving authored content such as a candidate-decision list verbatim. Repoint live references **inside `docs/`**, including one AD citing another; leave frozen records' links as point-in-time. A live reference **outside** your write scope — most often the root `README.md`, which you never overwrite — cannot be repointed: record it as a backlog item naming the file and line rather than leaving the residue silent |
|
|
188
188
|
| a legacy `docs/brainstorm/{topic}/`, a singular `docs/history/brainstorm/`, or a root `brainstorm/`/`brainstorming/` folder | move each **active** record to `docs/research/{topic}-brainstorm/` and each **harvested** one to `docs/history/brainstorms/{topic}/` (dropping the suffix); create/refresh both `Readme.md` indexes; delete the emptied folder |
|
|
189
|
+
| `*.bkp.*` files under `docs/` (the installer's first-contact backups of the project's pre-existing files) | **fold the content, then delete the backup.** Classify each backup's content by nature and land it in the current shape — a backed-up changelog's rows into `docs/history/CHANGELOG.md` and per-entry files, a backed-up structure/readme's real claims into the scaffolded truth doc, a backed-up feature doc's content merged into its sibling (or adopted whole if the sibling is a pristine seed). Content is folded, never discarded silently; what cannot be classified goes to the backlog with the backup kept. When the fold lands, delete the `.bkp` file |
|
|
190
|
+
| `*.bkp.*` files at the repo root or in config (`CLAUDE.bkp.md`, `.prettierrc.bkp.json`, …) | **never merge these.** Top-level config is harness-owned by design; list each one to the user as their call, and leave the file in place |
|
|
189
191
|
| no `harness-version` in `structure.md` | stamp it (Step B4) |
|
|
190
192
|
|
|
191
193
|
### Step B3 — Present the reconcile plan, then execute
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"harness": "delivery",
|
|
3
3
|
"name": "delivery",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.5",
|
|
5
5
|
"files": [
|
|
6
6
|
".prettierignore",
|
|
7
7
|
".prettierrc.json",
|
|
8
8
|
".vscode/settings.json"
|
|
9
9
|
],
|
|
10
10
|
"seeds": [],
|
|
11
|
-
"digest": "
|
|
11
|
+
"digest": "99afecb2c42f"
|
|
12
12
|
}
|
|
@@ -23,7 +23,7 @@ const RULES = [
|
|
|
23
23
|
// Sections inside a truth doc where dated history is sanctioned (the two bridges).
|
|
24
24
|
const BRIDGE_HEADINGS = /^#{1,4}\s+(decision changelog|health log)\b/i;
|
|
25
25
|
// Instruction files and generated trees are a different genre — out of this linter's scope.
|
|
26
|
-
const SKIP = /(^|\/)(\.claude|node_modules|skills|rules|agents|harness|packages\/[^/]+\/data)\/|(^|\/)(CLAUDE|AGENTS)\.md
|
|
26
|
+
const SKIP = /(^|\/)(\.claude|node_modules|skills|rules|agents|harness|packages\/[^/]+\/data)\/|(^|\/)(CLAUDE|AGENTS)\.md$|\.bkp\./;
|
|
27
27
|
const RECORD = /(^|\/)docs\/(history|research|memory)\//;
|
|
28
28
|
|
|
29
29
|
// Classify a path: skipped genre, record, or truth.
|
|
@@ -51,7 +51,7 @@ The ownership source of truth is the **union of every feature doc's `owns:` fron
|
|
|
51
51
|
### Step 1: Build the ownership map
|
|
52
52
|
|
|
53
53
|
1. Read `docs/structure.md` for the authority map.
|
|
54
|
-
2. Glob `docs/features/**/*.md
|
|
54
|
+
2. Glob `docs/features/**/*.md`, ignoring `*.bkp.*` files (installer backups awaiting the fold); for each, parse the frontmatter `owns:` globs and `module:` label.
|
|
55
55
|
3. Build a map: glob → owning doc + module. Narrower glob wins on overlap. **This IS the source of truth.**
|
|
56
56
|
|
|
57
57
|
**Architecture-first fallback.** If no feature 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.
|
|
@@ -186,6 +186,8 @@ This is what makes baseline more than a fresh scaffold. Detect old-shape artifac
|
|
|
186
186
|
| `docs/architecture/overview.md` | split into `domain-model.md` / `glossary.md` / `non-goals.md` / `references.md` / `open-questions.md` |
|
|
187
187
|
| `docs/architecture/adr/` (legacy folder name), or `ADR-NNN-*.md` records anywhere under `docs/architecture/` | **rename to the AD genre.** The folder becomes `docs/architecture/decisions/`; each record file `ADR-NNN-{slug}.md` becomes `AD-NNN-{slug}.md`, keeping its number and slug. Inside each record, update the retired vocabulary — "ADR", "Architecture Decision Record", and any supersession framing ("once accepted, an ADR is never edited; a later ADR supersedes it") — to the AD model: one AD per subject, **updated in place**, its journey confined to a `Decision Changelog` tail. A record's **reasoning is never rewritten** by a reconcile; only its genre vocabulary, its own title/id, and paths it cites. The folder's `Readme.md` is an **index, not a record** — reframe its genre description while preserving authored content such as a candidate-decision list verbatim. Repoint live references **inside `docs/`**, including one AD citing another; leave frozen records' links as point-in-time. A live reference **outside** your write scope — most often the root `README.md`, which you never overwrite — cannot be repointed: record it as a backlog item naming the file and line rather than leaving the residue silent |
|
|
188
188
|
| a legacy `docs/brainstorm/{topic}/`, a singular `docs/history/brainstorm/`, or a root `brainstorm/`/`brainstorming/` folder | move each **active** record to `docs/research/{topic}-brainstorm/` and each **harvested** one to `docs/history/brainstorms/{topic}/` (dropping the suffix); create/refresh both `Readme.md` indexes; delete the emptied folder |
|
|
189
|
+
| `*.bkp.*` files under `docs/` (the installer's first-contact backups of the project's pre-existing files) | **fold the content, then delete the backup.** Classify each backup's content by nature and land it in the current shape — a backed-up changelog's rows into `docs/history/CHANGELOG.md` and per-entry files, a backed-up structure/readme's real claims into the scaffolded truth doc, a backed-up feature doc's content merged into its sibling (or adopted whole if the sibling is a pristine seed). Content is folded, never discarded silently; what cannot be classified goes to the backlog with the backup kept. When the fold lands, delete the `.bkp` file |
|
|
190
|
+
| `*.bkp.*` files at the repo root or in config (`CLAUDE.bkp.md`, `.prettierrc.bkp.json`, …) | **never merge these.** Top-level config is harness-owned by design; list each one to the user as their call, and leave the file in place |
|
|
189
191
|
| no `harness-version` in `structure.md` | stamp it (Step B4) |
|
|
190
192
|
|
|
191
193
|
### Step B3 — Present the reconcile plan, then execute
|
|
@@ -23,7 +23,7 @@ const RULES = [
|
|
|
23
23
|
// Sections inside a truth doc where dated history is sanctioned (the two bridges).
|
|
24
24
|
const BRIDGE_HEADINGS = /^#{1,4}\s+(decision changelog|health log)\b/i;
|
|
25
25
|
// Instruction files and generated trees are a different genre — out of this linter's scope.
|
|
26
|
-
const SKIP = /(^|\/)(\.claude|node_modules|skills|rules|agents|harness|packages\/[^/]+\/data)\/|(^|\/)(CLAUDE|AGENTS)\.md
|
|
26
|
+
const SKIP = /(^|\/)(\.claude|node_modules|skills|rules|agents|harness|packages\/[^/]+\/data)\/|(^|\/)(CLAUDE|AGENTS)\.md$|\.bkp\./;
|
|
27
27
|
const RECORD = /(^|\/)docs\/(history|research|memory)\//;
|
|
28
28
|
|
|
29
29
|
// Classify a path: skipped genre, record, or truth.
|
|
@@ -24,7 +24,6 @@ import {
|
|
|
24
24
|
readFileSync,
|
|
25
25
|
writeFileSync,
|
|
26
26
|
renameSync,
|
|
27
|
-
cpSync,
|
|
28
27
|
readdirSync,
|
|
29
28
|
lstatSync,
|
|
30
29
|
rmSync,
|
|
@@ -50,23 +49,25 @@ export function isSymlink(path) {
|
|
|
50
49
|
}
|
|
51
50
|
}
|
|
52
51
|
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
52
|
+
// The .bkp path for a colliding file: the marker goes BEFORE the final extension
|
|
53
|
+
// (CHANGELOG.md → CHANGELOG.bkp.md, .prettierrc.json → .prettierrc.bkp.json), so one glob —
|
|
54
|
+
// `*.bkp.*` — matches every backup, and every harness scanner ignores exactly that glob. A file
|
|
55
|
+
// with no extension appends `.bkp`.
|
|
56
|
+
export function bkpPathFor(path) {
|
|
57
|
+
const slash = Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\'));
|
|
58
|
+
const dot = path.lastIndexOf('.');
|
|
59
|
+
if (dot <= slash + 1) return `${path}.bkp`; // no extension, or a leading-dot name like `.env`
|
|
60
|
+
return `${path.slice(0, dot)}.bkp${path.slice(dot)}`;
|
|
60
61
|
}
|
|
61
62
|
|
|
62
|
-
//
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
function
|
|
66
|
-
if (!existsSync(path)) return null;
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
63
|
+
// Move a colliding FOREIGN file aside as its .bkp sibling. First backup wins: if the .bkp
|
|
64
|
+
// already exists (a re-run before any baseline folded it), the older backup is the more
|
|
65
|
+
// original and is kept; the collision file is simply overwritten by the install.
|
|
66
|
+
function bkpRename(path) {
|
|
67
|
+
if (!existsSync(path) && !isSymlink(path)) return null;
|
|
68
|
+
const backup = bkpPathFor(path);
|
|
69
|
+
if (existsSync(backup) || isSymlink(backup)) return null;
|
|
70
|
+
renameSync(path, backup);
|
|
70
71
|
return backup;
|
|
71
72
|
}
|
|
72
73
|
|
|
@@ -300,43 +301,17 @@ export function materializeHarness({ bundledHarnessDir, targetDir, pluginName, p
|
|
|
300
301
|
// the marker that holds it is one of the files about to be overwritten.
|
|
301
302
|
const priorOwned = readInstalledOwned(targetDir);
|
|
302
303
|
|
|
303
|
-
//
|
|
304
|
-
//
|
|
305
|
-
//
|
|
306
|
-
//
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
notices.push(
|
|
315
|
-
`Overwrote existing ${rel} (tracked by git — \`git checkout ${rel}\` to restore).`,
|
|
316
|
-
);
|
|
317
|
-
} else {
|
|
318
|
-
warnings.push(
|
|
319
|
-
`No .git here, so no version-control safety net — backed up existing ${rel} → ${backupIfExists(dest)}`,
|
|
320
|
-
);
|
|
321
|
-
}
|
|
322
|
-
void kind;
|
|
323
|
-
}
|
|
324
|
-
for (const rel of ['.claude', ...CODEX_REBUILT_DIRS]) {
|
|
325
|
-
const dest = join(targetDir, rel);
|
|
326
|
-
if (!existsSync(dest)) continue;
|
|
327
|
-
if (projectHasGit) {
|
|
328
|
-
notices.push(
|
|
329
|
-
`Refreshed existing ${rel}/ in place (tracked by git — \`git checkout ${rel}\` to restore).`,
|
|
330
|
-
);
|
|
331
|
-
} else {
|
|
332
|
-
const backup = snapshotDirIfExists(dest);
|
|
333
|
-
if (backup) {
|
|
334
|
-
warnings.push(
|
|
335
|
-
`No .git here, so no version-control safety net — snapshotted existing ${rel}/ → ${backup}`,
|
|
336
|
-
);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
}
|
|
304
|
+
// FIRST CONTACT vs REFRESH is the entire backup question, and the marker decides it. On a
|
|
305
|
+
// refresh, every colliding file at a harness path is the harness's own previous version —
|
|
306
|
+
// overwritten in place, git or no git; backing up our own stale copies would bury every upgrade
|
|
307
|
+
// in .bkp noise. On first contact, a colliding file is the USER'S — it is moved aside as its
|
|
308
|
+
// .bkp sibling, ours installs, and the maintenance baseline folds docs-side .bkp content into
|
|
309
|
+
// the reconciled tree (top-level config .bkp files are never merged — they are listed and left
|
|
310
|
+
// to the human). Git is not the distinction: history protects bytes, but the .bkp file is what
|
|
311
|
+
// makes the fold duty visible to the next session. The harness is deliberately unapologetic
|
|
312
|
+
// about its own process; the backup is how it stays honest about yours.
|
|
313
|
+
const firstContact = !existsSync(join(targetDir, '.claude', 'harness.json'));
|
|
314
|
+
void projectHasGit; // kept for caller compatibility; the .bkp rule does not branch on it
|
|
340
315
|
|
|
341
316
|
// The Codex mirrors are rebuilt wholesale, not merged: they are byte projections of the Claude
|
|
342
317
|
// tree, so a file left behind from a prior version is a skill Codex still sees after the harness
|
|
@@ -346,13 +321,18 @@ export function materializeHarness({ bundledHarnessDir, targetDir, pluginName, p
|
|
|
346
321
|
|
|
347
322
|
let written = 0;
|
|
348
323
|
let seeded = 0;
|
|
324
|
+
const backedUp = [];
|
|
349
325
|
for (const file of files) {
|
|
350
326
|
const dest = join(targetDir, file.path);
|
|
351
|
-
// A seed is one-time scaffolding: once the path
|
|
352
|
-
// refresh
|
|
353
|
-
//
|
|
327
|
+
// A seed is one-time scaffolding: once installed, the path is the project's living copy and a
|
|
328
|
+
// refresh never touches it. On FIRST contact a pre-existing file at a seed path is the user's
|
|
329
|
+
// — it moves aside as .bkp and the pristine seed installs, so the baseline has both to fold.
|
|
354
330
|
if (file.policy === 'seed') {
|
|
355
|
-
if (existsSync(dest))
|
|
331
|
+
if (existsSync(dest)) {
|
|
332
|
+
if (!firstContact) continue;
|
|
333
|
+
const backup = bkpRename(dest);
|
|
334
|
+
if (backup) backedUp.push(file.path);
|
|
335
|
+
}
|
|
356
336
|
mkdirSync(dirname(dest), { recursive: true });
|
|
357
337
|
writeFileSync(dest, file.content);
|
|
358
338
|
seeded += 1;
|
|
@@ -362,12 +342,26 @@ export function materializeHarness({ bundledHarnessDir, targetDir, pluginName, p
|
|
|
362
342
|
// permissions. The plan's copy is what a FRESH install would hold; against an existing file the
|
|
363
343
|
// authority is mergeHooks below, which is additive and idempotent.
|
|
364
344
|
if (file.policy === 'merge') continue;
|
|
345
|
+
if (firstContact && (existsSync(dest) || isSymlink(dest))) {
|
|
346
|
+
const backup = bkpRename(dest);
|
|
347
|
+
if (backup) backedUp.push(file.path);
|
|
348
|
+
}
|
|
365
349
|
mkdirSync(dirname(dest), { recursive: true });
|
|
366
350
|
writeFileSync(dest, file.content);
|
|
367
351
|
written += 1;
|
|
368
352
|
}
|
|
369
353
|
installed.push(`${written} harness file(s) → ./ and .claude/`);
|
|
370
354
|
if (seeded > 0) installed.push(`${seeded} seed file(s) → ./ (only where absent)`);
|
|
355
|
+
if (backedUp.length > 0) {
|
|
356
|
+
warnings.push(
|
|
357
|
+
`${backedUp.length} pre-existing file(s) moved aside as .bkp siblings (${backedUp.join(', ')}). ` +
|
|
358
|
+
'The maintenance baseline folds docs-side .bkp content into the reconciled tree and deletes the .bkp; ' +
|
|
359
|
+
'top-level config .bkp files are never merged — review those yourself.',
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
if (!firstContact) {
|
|
363
|
+
notices.push('Refresh: harness-owned files updated in place; seeds and .bkp files untouched.');
|
|
364
|
+
}
|
|
371
365
|
|
|
372
366
|
// Prune components a prior harness version owned but this bundle no longer ships (e.g. a retired
|
|
373
367
|
// agent). Only prior-owned names are eligible, so the project's own files survive.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nurix/etna",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.67",
|
|
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": "546f4bccb873"
|
|
46
46
|
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# Dependencies & build output
|
|
2
|
-
node_modules
|
|
3
|
-
dist
|
|
4
|
-
build
|
|
5
|
-
|
|
6
|
-
# Lockfiles
|
|
7
|
-
pnpm-lock.yaml
|
|
8
|
-
package-lock.json
|
|
9
|
-
yarn.lock
|
|
10
|
-
|
|
11
|
-
# Harness-managed — the installer overwrites all of these, so formatting them is churn
|
|
12
|
-
# that comes straight back on the next `npx @nurix/etna`.
|
|
13
|
-
.claude
|
|
14
|
-
.codex
|
|
15
|
-
.agents
|
|
16
|
-
CLAUDE.md
|
|
17
|
-
AGENTS.md
|
|
18
|
-
|
|
19
|
-
# Frozen records — a plan, changelog entry, or migration runbook is a point-in-time
|
|
20
|
-
# artifact that is never edited after it freezes. Reformatting one is an edit, and the
|
|
21
|
-
# `maintenance` agent is forbidden from making it — so a format gate over this tree is
|
|
22
|
-
# a demand nothing in the repo is allowed to satisfy.
|
|
23
|
-
docs/history
|
|
24
|
-
|
|
25
|
-
# Source catalogs — authored markdown; prettier collapses template/example blocks
|
|
26
|
-
skills
|
|
27
|
-
rules
|
|
28
|
-
agents
|
|
29
|
-
harness
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// Markdown: Prettier unwraps prose to one logical line per paragraph
|
|
3
|
-
// (see .prettierrc → proseWrap:never) on save; the editor soft-wraps for
|
|
4
|
-
// reading, so no hard line breaks get baked into the source.
|
|
5
|
-
"[markdown]": {
|
|
6
|
-
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
|
7
|
-
"editor.formatOnSave": true,
|
|
8
|
-
"editor.wordWrap": "on"
|
|
9
|
-
},
|
|
10
|
-
// Hide harness-authoring scaffolding from the file explorer
|
|
11
|
-
"files.exclude": {
|
|
12
|
-
".claude": true,
|
|
13
|
-
".vscode": true,
|
|
14
|
-
".agents": true,
|
|
15
|
-
".codex": true,
|
|
16
|
-
"**/node_modules": true,
|
|
17
|
-
"**/apollo.service.json": true
|
|
18
|
-
}
|
|
19
|
-
}
|