@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.
Files changed (223) hide show
  1. package/bin/etna.js +10 -1
  2. package/data/harness-index.json +1 -5
  3. package/data/harnesses/code/CLAUDE.md +2 -0
  4. package/data/harnesses/code/agents/maintenance.md +3 -1
  5. package/data/harnesses/code/harness.json +7 -2
  6. package/data/harnesses/code/hooks/compliance.mjs +1 -0
  7. package/data/harnesses/code/hooks/lib/frozen.mjs +3 -0
  8. package/data/harnesses/code/hooks/lib/ownership.mjs +3 -1
  9. package/data/harnesses/code/skills/documentation/scripts/doc-lint.mjs +1 -1
  10. package/data/harnesses/delivery/agents/maintenance.md +3 -1
  11. package/data/harnesses/delivery/harness.json +2 -2
  12. package/data/harnesses/delivery/skills/documentation/scripts/doc-lint.mjs +1 -1
  13. package/data/harnesses/etna/agents/maintenance.md +3 -1
  14. package/data/harnesses/etna/harness.json +2 -2
  15. package/data/harnesses/etna/skills/documentation/scripts/doc-lint.mjs +1 -1
  16. package/lib/install/materialize.mjs +51 -57
  17. package/package.json +2 -2
  18. package/data/harnesses/apollo/.mcp.json +0 -8
  19. package/data/harnesses/apollo/.prettierignore +0 -29
  20. package/data/harnesses/apollo/.prettierrc.json +0 -3
  21. package/data/harnesses/apollo/.vscode/settings.json +0 -19
  22. package/data/harnesses/apollo/CLAUDE.md +0 -162
  23. package/data/harnesses/apollo/agents/bookkeeper.md +0 -28
  24. package/data/harnesses/apollo/agents/brainstorm.md +0 -144
  25. package/data/harnesses/apollo/agents/change-review.md +0 -251
  26. package/data/harnesses/apollo/agents/lld-mode.md +0 -58
  27. package/data/harnesses/apollo/agents/maintenance.md +0 -234
  28. package/data/harnesses/apollo/agents/performance-review.md +0 -223
  29. package/data/harnesses/apollo/agents/retro.md +0 -46
  30. package/data/harnesses/apollo/codex/agents/bookkeeper.toml +0 -26
  31. package/data/harnesses/apollo/codex/agents/brainstorm.toml +0 -142
  32. package/data/harnesses/apollo/codex/agents/change-review.toml +0 -249
  33. package/data/harnesses/apollo/codex/agents/lld-mode.toml +0 -52
  34. package/data/harnesses/apollo/codex/agents/maintenance.toml +0 -228
  35. package/data/harnesses/apollo/codex/agents/performance-review.toml +0 -222
  36. package/data/harnesses/apollo/codex/agents/retro.toml +0 -45
  37. package/data/harnesses/apollo/harness.json +0 -19
  38. package/data/harnesses/apollo/hooks/approved-packages.md +0 -44
  39. package/data/harnesses/apollo/hooks/awareness.mjs +0 -405
  40. package/data/harnesses/apollo/hooks/check-bookkeeping-clean.mjs +0 -19
  41. package/data/harnesses/apollo/hooks/check-changelog-presence.mjs +0 -57
  42. package/data/harnesses/apollo/hooks/check-completion-integrity.mjs +0 -71
  43. package/data/harnesses/apollo/hooks/check-ownership.mjs +0 -22
  44. package/data/harnesses/apollo/hooks/compliance.mjs +0 -457
  45. package/data/harnesses/apollo/hooks/hooks.json +0 -23
  46. package/data/harnesses/apollo/hooks/lib/frozen.mjs +0 -58
  47. package/data/harnesses/apollo/hooks/lib/ownership.mjs +0 -242
  48. package/data/harnesses/apollo/hooks/lib/state.mjs +0 -170
  49. package/data/harnesses/apollo/rules/changelog.md +0 -27
  50. package/data/harnesses/apollo/rules/database.md +0 -34
  51. package/data/harnesses/apollo/rules/frontend.md +0 -30
  52. package/data/harnesses/apollo/rules/general.md +0 -40
  53. package/data/harnesses/apollo/rules/nomenclature.md +0 -30
  54. package/data/harnesses/apollo/rules/pnpm.md +0 -57
  55. package/data/harnesses/apollo/rules/testing.md +0 -64
  56. package/data/harnesses/apollo/skills/boundary/SKILL.md +0 -75
  57. package/data/harnesses/apollo/skills/boundary/references/index.md +0 -16
  58. package/data/harnesses/apollo/skills/boundary/references/mechanisms.md +0 -99
  59. package/data/harnesses/apollo/skills/boundary/references/packs/async-messaging.md +0 -81
  60. package/data/harnesses/apollo/skills/boundary/references/packs/auth.md +0 -93
  61. package/data/harnesses/apollo/skills/boundary/references/packs/build-config-runtime.md +0 -93
  62. package/data/harnesses/apollo/skills/boundary/references/packs/cloudflare.md +0 -93
  63. package/data/harnesses/apollo/skills/boundary/references/packs/frontend.md +0 -93
  64. package/data/harnesses/apollo/skills/boundary/references/packs/generic-tail.md +0 -55
  65. package/data/harnesses/apollo/skills/boundary/references/packs/persistence.md +0 -93
  66. package/data/harnesses/apollo/skills/boundary/references/packs/wire-api.md +0 -87
  67. package/data/harnesses/apollo/skills/brainstorm/README.md +0 -56
  68. package/data/harnesses/apollo/skills/brainstorm/SKILL.md +0 -173
  69. package/data/harnesses/apollo/skills/brainstorm/references/doctrine.md +0 -98
  70. package/data/harnesses/apollo/skills/brainstorm/references/harvest.md +0 -86
  71. package/data/harnesses/apollo/skills/brainstorm/references/session-schema.md +0 -186
  72. package/data/harnesses/apollo/skills/brainstorm/scripts/detector.mjs +0 -460
  73. package/data/harnesses/apollo/skills/design/SKILL.md +0 -121
  74. package/data/harnesses/apollo/skills/design/components/charts.md +0 -76
  75. package/data/harnesses/apollo/skills/design/components/collections.md +0 -132
  76. package/data/harnesses/apollo/skills/design/components/feedback.md +0 -47
  77. package/data/harnesses/apollo/skills/design/components/hooks.md +0 -35
  78. package/data/harnesses/apollo/skills/design/components/index.md +0 -143
  79. package/data/harnesses/apollo/skills/design/components/inputs.md +0 -327
  80. package/data/harnesses/apollo/skills/design/components/layout.md +0 -52
  81. package/data/harnesses/apollo/skills/design/components/media.md +0 -66
  82. package/data/harnesses/apollo/skills/design/components/motion.md +0 -82
  83. package/data/harnesses/apollo/skills/design/components/navigation.md +0 -29
  84. package/data/harnesses/apollo/skills/design/components/overlays.md +0 -72
  85. package/data/harnesses/apollo/skills/design/components/setup.md +0 -40
  86. package/data/harnesses/apollo/skills/design/components/typography.md +0 -46
  87. package/data/harnesses/apollo/skills/design/components/utils.md +0 -37
  88. package/data/harnesses/apollo/skills/design/data/blueprints/browse.md +0 -38
  89. package/data/harnesses/apollo/skills/design/data/blueprints/creation-flow.md +0 -38
  90. package/data/harnesses/apollo/skills/design/data/blueprints/dashboard.md +0 -38
  91. package/data/harnesses/apollo/skills/design/data/blueprints/grid.md +0 -38
  92. package/data/harnesses/apollo/skills/design/data/blueprints/queue.md +0 -38
  93. package/data/harnesses/apollo/skills/design/data/blueprints/record-detail.md +0 -38
  94. package/data/harnesses/apollo/skills/design/data/blueprints/settings.md +0 -38
  95. package/data/harnesses/apollo/skills/design/data/charts/census.csv +0 -58
  96. package/data/harnesses/apollo/skills/design/data/checklists/browse.md +0 -21
  97. package/data/harnesses/apollo/skills/design/data/checklists/creation-flow.md +0 -20
  98. package/data/harnesses/apollo/skills/design/data/checklists/dashboard.md +0 -21
  99. package/data/harnesses/apollo/skills/design/data/checklists/grid.md +0 -21
  100. package/data/harnesses/apollo/skills/design/data/checklists/queue.md +0 -21
  101. package/data/harnesses/apollo/skills/design/data/checklists/record-detail.md +0 -21
  102. package/data/harnesses/apollo/skills/design/data/checklists/settings.md +0 -21
  103. package/data/harnesses/apollo/skills/design/data/chrome/board-column.md +0 -68
  104. package/data/harnesses/apollo/skills/design/data/chrome/data-table.md +0 -63
  105. package/data/harnesses/apollo/skills/design/data/chrome/side-panel.md +0 -60
  106. package/data/harnesses/apollo/skills/design/data/chrome/sidebar.md +0 -78
  107. package/data/harnesses/apollo/skills/design/data/chrome/stat-cards.md +0 -62
  108. package/data/harnesses/apollo/skills/design/data/chrome/topbar.md +0 -65
  109. package/data/harnesses/apollo/skills/design/data/elevation/ant-design-directional-shadow.md +0 -19
  110. package/data/harnesses/apollo/skills/design/data/elevation/apple-liquid-glass-material.md +0 -18
  111. package/data/harnesses/apollo/skills/design/data/elevation/atlassian-surface-shadow-pairing.md +0 -20
  112. package/data/harnesses/apollo/skills/design/data/elevation/fluent-2-key-ambient-ramp.md +0 -20
  113. package/data/harnesses/apollo/skills/design/data/elevation/github-primer-sparing-shadow.md +0 -19
  114. package/data/harnesses/apollo/skills/design/data/elevation/ibm-carbon-layer-and-border.md +0 -19
  115. package/data/harnesses/apollo/skills/design/data/elevation/linear-dark-surface-ladder.md +0 -17
  116. package/data/harnesses/apollo/skills/design/data/elevation/material-2-key-ambient-dp-ramp.md +0 -19
  117. package/data/harnesses/apollo/skills/design/data/elevation/material-3-tonal-elevation.md +0 -21
  118. package/data/harnesses/apollo/skills/design/data/elevation/neobrutalist-hard-offset.md +0 -19
  119. package/data/harnesses/apollo/skills/design/data/elevation/neumorphic-soft-dual-shadow.md +0 -18
  120. package/data/harnesses/apollo/skills/design/data/elevation/notion-warm-minimal-hairline.md +0 -17
  121. package/data/harnesses/apollo/skills/design/data/elevation/polaris-elevation-inset-bevel.md +0 -21
  122. package/data/harnesses/apollo/skills/design/data/elevation/radix-themes-alpha-ring-scale.md +0 -19
  123. package/data/harnesses/apollo/skills/design/data/elevation/shadcn-neutral-derived-radius.md +0 -19
  124. package/data/harnesses/apollo/skills/design/data/elevation/stripe-brand-tinted-dual-shadow.md +0 -18
  125. package/data/harnesses/apollo/skills/design/data/elevation/tailwind-default-utility-scale.md +0 -19
  126. package/data/harnesses/apollo/skills/design/data/elevation/vercel-geist-shadow-as-border.md +0 -20
  127. package/data/harnesses/apollo/skills/design/data/iconography.md +0 -199
  128. package/data/harnesses/apollo/skills/design/data/motion/accordion-expand.md +0 -18
  129. package/data/harnesses/apollo/skills/design/data/motion/destructive-hold-confirm.md +0 -18
  130. package/data/harnesses/apollo/skills/design/data/motion/drag-dismiss-momentum.md +0 -18
  131. package/data/harnesses/apollo/skills/design/data/motion/empty-state-arrive.md +0 -18
  132. package/data/harnesses/apollo/skills/design/data/motion/hover-lift.md +0 -18
  133. package/data/harnesses/apollo/skills/design/data/motion/modal-center-arrive.md +0 -18
  134. package/data/harnesses/apollo/skills/design/data/motion/number-ticker-roll.md +0 -18
  135. package/data/harnesses/apollo/skills/design/data/motion/onboarding-bounce.md +0 -18
  136. package/data/harnesses/apollo/skills/design/data/motion/panel-slide.md +0 -18
  137. package/data/harnesses/apollo/skills/design/data/motion/press-feedback.md +0 -18
  138. package/data/harnesses/apollo/skills/design/data/motion/progress-linear-loop.md +0 -18
  139. package/data/harnesses/apollo/skills/design/data/motion/route-crossfade.md +0 -18
  140. package/data/harnesses/apollo/skills/design/data/motion/rubber-band-overscroll.md +0 -18
  141. package/data/harnesses/apollo/skills/design/data/motion/skeleton-shimmer.md +0 -18
  142. package/data/harnesses/apollo/skills/design/data/motion/stagger-arrive.md +0 -18
  143. package/data/harnesses/apollo/skills/design/data/motion/toast-enter-stack.md +0 -18
  144. package/data/harnesses/apollo/skills/design/data/motion/tooltip-chain-instant.md +0 -18
  145. package/data/harnesses/apollo/skills/design/data/motion/trigger-anchored-reveal.md +0 -18
  146. package/data/harnesses/apollo/skills/design/data/tells.csv +0 -34
  147. package/data/harnesses/apollo/skills/design/data/voices/bright-collaborator.md +0 -29
  148. package/data/harnesses/apollo/skills/design/data/voices/direct-operator.md +0 -29
  149. package/data/harnesses/apollo/skills/design/data/voices/earnest-helper.md +0 -29
  150. package/data/harnesses/apollo/skills/design/data/voices/editorial-composed.md +0 -29
  151. package/data/harnesses/apollo/skills/design/data/voices/quiet-concierge.md +0 -29
  152. package/data/harnesses/apollo/skills/design/data/voices/warm-guide.md +0 -29
  153. package/data/harnesses/apollo/skills/design/references/compose.md +0 -23
  154. package/data/harnesses/apollo/skills/design/references/content.md +0 -28
  155. package/data/harnesses/apollo/skills/design/references/emission.md +0 -21
  156. package/data/harnesses/apollo/skills/design/references/existing-apps.md +0 -27
  157. package/data/harnesses/apollo/skills/design/references/foundations.md +0 -57
  158. package/data/harnesses/apollo/skills/design/references/intake.md +0 -40
  159. package/data/harnesses/apollo/skills/design/references/object-pass.md +0 -24
  160. package/data/harnesses/apollo/skills/design/references/ship-gate.md +0 -29
  161. package/data/harnesses/apollo/skills/design/references/ux-patterns/Readme.md +0 -195
  162. package/data/harnesses/apollo/skills/design/references/ux-patterns/ai-layer.md +0 -49
  163. package/data/harnesses/apollo/skills/design/references/ux-patterns/attributes-lifecycle.md +0 -43
  164. package/data/harnesses/apollo/skills/design/references/ux-patterns/container-choice.md +0 -44
  165. package/data/harnesses/apollo/skills/design/references/ux-patterns/creation-paths.md +0 -46
  166. package/data/harnesses/apollo/skills/design/references/ux-patterns/dashboards.md +0 -42
  167. package/data/harnesses/apollo/skills/design/references/ux-patterns/modes.md +0 -42
  168. package/data/harnesses/apollo/skills/design/references/ux-patterns/object-model.md +0 -46
  169. package/data/harnesses/apollo/skills/design/references/ux-patterns/page-archetype.md +0 -48
  170. package/data/harnesses/apollo/skills/design/references/ux-patterns/promotion-demotion.md +0 -37
  171. package/data/harnesses/apollo/skills/design/references/ux-patterns/settings.md +0 -42
  172. package/data/harnesses/apollo/skills/design/references/ux-patterns/standard-pages.md +0 -46
  173. package/data/harnesses/apollo/skills/design/references/ux-patterns/state-matrix.md +0 -41
  174. package/data/harnesses/apollo/skills/design/references/ux-patterns/table-mechanics.md +0 -48
  175. package/data/harnesses/apollo/skills/design/references/ux-patterns/verbs.md +0 -45
  176. package/data/harnesses/apollo/skills/design/references/ux-patterns/viewer-context.md +0 -40
  177. package/data/harnesses/apollo/skills/design/scripts/README-validator.md +0 -27
  178. package/data/harnesses/apollo/skills/design/scripts/select-chart.mjs +0 -622
  179. package/data/harnesses/apollo/skills/design/scripts/validate-design-md.mjs +0 -1198
  180. package/data/harnesses/apollo/skills/documentation/SKILL.md +0 -135
  181. package/data/harnesses/apollo/skills/documentation/references/examples.md +0 -279
  182. package/data/harnesses/apollo/skills/documentation/references/frontmatter.md +0 -44
  183. package/data/harnesses/apollo/skills/documentation/references/instruction-style.md +0 -50
  184. package/data/harnesses/apollo/skills/documentation/references/style-guide.md +0 -384
  185. package/data/harnesses/apollo/skills/documentation/references/untemplated.md +0 -38
  186. package/data/harnesses/apollo/skills/documentation/scripts/doc-lint.mjs +0 -140
  187. package/data/harnesses/apollo/skills/documentation/templates/Readme.md +0 -35
  188. package/data/harnesses/apollo/skills/documentation/templates/api-reference.md +0 -20
  189. package/data/harnesses/apollo/skills/documentation/templates/architecture-decision.md +0 -121
  190. package/data/harnesses/apollo/skills/documentation/templates/backlog.md +0 -33
  191. package/data/harnesses/apollo/skills/documentation/templates/behavioral-checklist.md +0 -81
  192. package/data/harnesses/apollo/skills/documentation/templates/bookkeeping.md +0 -18
  193. package/data/harnesses/apollo/skills/documentation/templates/changelog-entry.md +0 -57
  194. package/data/harnesses/apollo/skills/documentation/templates/changelog-index.md +0 -41
  195. package/data/harnesses/apollo/skills/documentation/templates/docs-readme.md +0 -72
  196. package/data/harnesses/apollo/skills/documentation/templates/domain-model.md +0 -30
  197. package/data/harnesses/apollo/skills/documentation/templates/environment-registry.md +0 -15
  198. package/data/harnesses/apollo/skills/documentation/templates/feature.md +0 -150
  199. package/data/harnesses/apollo/skills/documentation/templates/glossary.md +0 -11
  200. package/data/harnesses/apollo/skills/documentation/templates/implementation-map.md +0 -42
  201. package/data/harnesses/apollo/skills/documentation/templates/journal.md +0 -13
  202. package/data/harnesses/apollo/skills/documentation/templates/memory-main.md +0 -25
  203. package/data/harnesses/apollo/skills/documentation/templates/migration-runbook.md +0 -34
  204. package/data/harnesses/apollo/skills/documentation/templates/non-goals.md +0 -11
  205. package/data/harnesses/apollo/skills/documentation/templates/operations-procedure.md +0 -36
  206. package/data/harnesses/apollo/skills/documentation/templates/plan.md +0 -88
  207. package/data/harnesses/apollo/skills/documentation/templates/protected-files.md +0 -37
  208. package/data/harnesses/apollo/skills/documentation/templates/root-readme.md +0 -104
  209. package/data/harnesses/apollo/skills/documentation/templates/security-overview.md +0 -27
  210. package/data/harnesses/apollo/skills/documentation/templates/structure.md +0 -65
  211. package/data/harnesses/apollo/skills/documentation/templates/system-overview.md +0 -32
  212. package/data/harnesses/apollo/skills/documentation/templates/testing-strategy.md +0 -29
  213. package/data/harnesses/apollo/skills/schema-design/SKILL.md +0 -141
  214. package/data/harnesses/apollo/skills/test/SKILL.md +0 -104
  215. package/data/harnesses/apollo/skills/testing/SKILL.md +0 -166
  216. package/data/harnesses/apollo/skills/workflow-mapper/SKILL.md +0 -451
  217. package/data/harnesses/apollo/skills/workflow-mapper/references/patterns.md +0 -214
  218. /package/data/harnesses/{apollo → code}/docs/README.md +0 -0
  219. /package/data/harnesses/{apollo → code}/docs/history/CHANGELOG.md +0 -0
  220. /package/data/harnesses/{apollo → code}/docs/history/backlog.md +0 -0
  221. /package/data/harnesses/{apollo → code}/docs/memory/main.md +0 -0
  222. /package/data/harnesses/{apollo → code}/docs/structure.md +0 -0
  223. /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
- const harnessName = await resolveHarnessName(name, harnesses);
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);
@@ -1,10 +1,6 @@
1
1
  {
2
- "fingerprint": "774efa3ae2da",
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`; for each, parse the frontmatter `owns:` globs and `module:` label.
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.7.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": "5e3c8dcf55ff"
18
+ "digest": "f120a269e99c"
14
19
  }
@@ -192,6 +192,7 @@ function stagedExempt(files) {
192
192
  HARNESS_FILES.includes(f) ||
193
193
  f.startsWith("docs/history/changelog/") ||
194
194
  f.startsWith("docs/history/sessions/") ||
195
+ f.includes(".bkp.") ||
195
196
  f === "docs/history/CHANGELOG.md"
196
197
  );
197
198
  }
@@ -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
- const files = listMarkdown(featuresDir);
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`; for each, parse the frontmatter `owns:` globs and `module:` label.
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",
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": "5384fce602a8"
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`; for each, parse the frontmatter `owns:` globs and `module:` label.
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": "etna",
3
3
  "name": "etna",
4
- "version": "1.4.3",
4
+ "version": "1.4.4",
5
5
  "files": [
6
6
  ".prettierignore",
7
7
  ".prettierrc.json",
8
8
  ".vscode/settings.json"
9
9
  ],
10
10
  "seeds": [],
11
- "digest": "1c440d72ea9f"
11
+ "digest": "dca4815bd3d5"
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.
@@ -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
- // Move <path> to <path>.bak.<timestamp> if it exists. Returns the backup path, or null.
54
- function backupIfExists(path) {
55
- if (!existsSync(path) && !isSymlink(path)) return null;
56
- const ts = new Date().toISOString().replace(/[:.]/g, '-');
57
- const backup = `${path}.bak.${ts}`;
58
- renameSync(path, backup);
59
- return backup;
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
- // Copy a directory to <path>.bak.<timestamp>, leaving the original in place. Returns the
63
- // backup path, or null. Used for .claude/, which is refreshed in place (not overwritten
64
- // wholesale), so the live tree must survive for the in-place update — snapshot, don't move.
65
- function snapshotDirIfExists(path) {
66
- if (!existsSync(path)) return null;
67
- const ts = new Date().toISOString().replace(/[:.]/g, '-');
68
- const backup = `${path}.bak.${ts}`;
69
- cpSync(path, backup, { recursive: true });
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
- // The safety net, for the two artifacts a refresh overwrites outright. A git repo recovers them
304
- // from history, so we only say so; without git there is no net, so we take a copy and warn. The
305
- // .claude/ tree is SNAPSHOTTED rather than moved — it is refreshed in place, so the live tree has
306
- // to survive for the writes below.
307
- for (const [rel, kind] of [
308
- ['CLAUDE.md', 'file'],
309
- ['AGENTS.md', 'file'],
310
- ]) {
311
- const dest = join(targetDir, rel);
312
- if (!existsSync(dest) && !isSymlink(dest)) continue;
313
- if (projectHasGit) {
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 exists it is the project's living copy, and a
352
- // refresh must not touch it. This is also the rule that lets an Apollo export carry an App's
353
- // own `docs/history/backlog.md` instead of the harness's.
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)) continue;
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.66",
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": "774efa3ae2da"
45
+ "etnaFingerprint": "546f4bccb873"
46
46
  }
@@ -1,8 +0,0 @@
1
- {
2
- "mcpServers": {
3
- "design": {
4
- "type": "http",
5
- "url": "https://apollo.nustack.tech/design/mcp"
6
- }
7
- }
8
- }
@@ -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,3 +0,0 @@
1
- {
2
- "proseWrap": "never"
3
- }
@@ -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
- }