@nurix/etna 0.18.2 → 0.18.4
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/data/harness-index.json +2 -2
- package/data/harnesses/code/harness.json +3 -3
- package/data/harnesses/code/rules/general.md +38 -36
- package/data/harnesses/code/rules/nomenclature.md +11 -0
- package/data/harnesses/code/skills/documentation/SKILL.md +2 -0
- package/data/harnesses/code/skills/documentation/references/style-guide.md +23 -0
- package/data/harnesses/discover/harness.json +1 -1
- package/data/harnesses/hr/harness.json +1 -1
- package/data/harnesses/kb-agi/harness.json +1 -1
- package/package.json +1 -1
package/data/harness-index.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"harness": "code",
|
|
3
|
-
"name": "code
|
|
4
|
-
"version": "0.17.
|
|
3
|
+
"name": "code",
|
|
4
|
+
"version": "0.17.3",
|
|
5
5
|
"epoch": 14,
|
|
6
6
|
"files": [
|
|
7
7
|
".prettierrc.json",
|
|
8
8
|
".prettierignore",
|
|
9
9
|
".vscode/settings.json"
|
|
10
10
|
],
|
|
11
|
-
"digest": "
|
|
11
|
+
"digest": "e0a34e10d625"
|
|
12
12
|
}
|
|
@@ -10,51 +10,53 @@
|
|
|
10
10
|
|
|
11
11
|
No alternatives. Just use these.
|
|
12
12
|
|
|
13
|
-
| Package
|
|
14
|
-
|
|
|
15
|
-
| react
|
|
16
|
-
| vite
|
|
17
|
-
| tailwindcss
|
|
18
|
-
| @vitejs/plugin-react-swc | ^4.2.2
|
|
19
|
-
| react-router-dom
|
|
20
|
-
| @reduxjs/toolkit
|
|
21
|
-
| react-redux
|
|
22
|
-
| axios
|
|
23
|
-
| date-fns
|
|
24
|
-
| @dnd-kit/core
|
|
25
|
-
| motion
|
|
26
|
-
| sonner
|
|
27
|
-
| react-window
|
|
28
|
-
| nanoid
|
|
29
|
-
| express
|
|
30
|
-
| drizzle-orm
|
|
31
|
-
| drizzle-kit
|
|
32
|
-
| zod
|
|
33
|
-
| jose
|
|
34
|
-
| microdiff
|
|
35
|
-
| react18-json-view
|
|
36
|
-
| @tiptap/react
|
|
37
|
-
| shiki
|
|
38
|
-
| lucide-react
|
|
39
|
-
| @pdfme/generator
|
|
40
|
-
| cmdk
|
|
41
|
-
| @monaco-editor/react
|
|
42
|
-
| localforage
|
|
43
|
-
| react-markdown
|
|
44
|
-
| fast-deep-equal
|
|
45
|
-
| @ngneat/falso
|
|
46
|
-
| pino
|
|
13
|
+
| Package | Version | Use | Don't use |
|
|
14
|
+
| ------------------------ | --------- | ---------------------- | -------------------------- |
|
|
15
|
+
| react | ^19.2.3 | UI components | - |
|
|
16
|
+
| vite | ^8.0.0 | Build tool, dev server | webpack, CRA |
|
|
17
|
+
| tailwindcss | ^4.1.18 | Styling | styled-components |
|
|
18
|
+
| @vitejs/plugin-react-swc | ^4.2.2 | JSX compilation | @vitejs/plugin-react |
|
|
19
|
+
| react-router-dom | ^7.11.0 | Routing | - |
|
|
20
|
+
| @reduxjs/toolkit | ^2.11.2 | State management | zustand, jotai |
|
|
21
|
+
| react-redux | ^9.2.0 | Redux React bindings | - |
|
|
22
|
+
| axios | ^1.13.2 | HTTP requests | fetch |
|
|
23
|
+
| date-fns | ^4.1.0 | Date formatting | moment, dayjs |
|
|
24
|
+
| @dnd-kit/core | ^6.3.1 | Drag and drop | react-beautiful-dnd |
|
|
25
|
+
| motion | ^12.23.26 | Animations | react-spring |
|
|
26
|
+
| sonner | ^2.0.7 | Toast notifications | react-toastify |
|
|
27
|
+
| react-window | ^2.2.3 | List virtualization | react-virtualized |
|
|
28
|
+
| nanoid | ^5.1.6 | ID generation | uuid |
|
|
29
|
+
| express | ^5.2.1 | HTTP server | fastify, koa |
|
|
30
|
+
| drizzle-orm | latest | Database ORM | prisma, sequelize, typeorm |
|
|
31
|
+
| drizzle-kit | latest | Schema tooling | - |
|
|
32
|
+
| zod | ^4.2.1 | Schema validation | yup, joi |
|
|
33
|
+
| jose | ^6.1.3 | JWT handling | jsonwebtoken |
|
|
34
|
+
| microdiff | ^1.5.0 | JSON object diffing | deep-diff, just-diff |
|
|
35
|
+
| react18-json-view | ^0.2.9 | JSON tree view | react-json-view |
|
|
36
|
+
| @tiptap/react | ^3.11.1 | Rich text editor | slate, quill, draft-js |
|
|
37
|
+
| shiki | ^3.22.0 | Syntax highlighting | prism, highlight.js |
|
|
38
|
+
| lucide-react | ^0.562.0 | Icons | react-icons, heroicons |
|
|
39
|
+
| @pdfme/generator | ^5.5.8 | PDF generation | jspdf, pdfkit |
|
|
40
|
+
| cmdk | ^1.1.1 | Command palette | kbar, ninja-keys |
|
|
41
|
+
| @monaco-editor/react | ^4.7.0 | Code editor | codemirror, ace |
|
|
42
|
+
| localforage | ^1.10.0 | Client-side storage | idb, dexie |
|
|
43
|
+
| react-markdown | ^10.1.0 | Markdown rendering | marked, markdown-it |
|
|
44
|
+
| fast-deep-equal | ^3.1.3 | Deep equality checks | lodash.isEqual |
|
|
45
|
+
| @ngneat/falso | latest | Fake data generation | @faker-js/faker, chance |
|
|
46
|
+
| pino | ^10.1.0 | Logging | winston |
|
|
47
47
|
|
|
48
48
|
## Frontend
|
|
49
49
|
|
|
50
50
|
Tailwind v4 + shadcn-based UI; conventions below.
|
|
51
51
|
|
|
52
|
+
- **Build every UI through the `frontend-design` skill** — route the brief through it instead of hand-rolling layouts; it owns the archetype, personality tokens, and `@nurix/components` wiring.
|
|
53
|
+
- **Light mode is the default** — design for the light theme as the default; dark mode is opt-in, never the default.
|
|
52
54
|
- **@nurix/components** — the UI component library (linked, pre-built); import by subpath, e.g. `@nurix/components/button`.
|
|
53
55
|
- No components.json / shadcn CLI scaffold (.tsx, not .jsx) — consume the prebuilt library; never `npx shadcn add`.
|
|
54
56
|
- Vite: `@tailwindcss/vite` + `@vitejs/plugin-react-swc`. Pin react / react-dom / react/jsx-runtime / react/jsx-dev-runtime to the app's single copy via `resolve.alias` (linked @nurix/\* ship nested react — keep one hook dispatcher).
|
|
55
57
|
- Tailwind v4, CSS-only (no tailwind.config.js, no PostCSS): styling runs through the `@tailwindcss/vite` plugin.
|
|
56
58
|
- CSS entry `globals.css`, imports in order — `@import "./personality.css"` (token source) → `@import "tailwindcss"` → the library's `styles.css` — then `@theme inline {…}` mapping vars to tokens.
|
|
57
|
-
- Tokens: CSS vars in `:root, :root[data-theme="light"]` + the archetype selector `[data-style="…"]` (personality.css), consumed as semantic Tailwind tokens (bg-card, text-foreground). Honor the archetype's radius/theme decisions (e.g. re-assert `--radius-*` to 0 for a flat archetype; add `@custom-variant dark` only if the project
|
|
59
|
+
- Tokens: CSS vars in `:root, :root[data-theme="light"]` + the archetype selector `[data-style="…"]` (personality.css), consumed as semantic Tailwind tokens (bg-card, text-foreground). Honor the archetype's radius/theme decisions (e.g. re-assert `--radius-*` to 0 for a flat archetype; add `@custom-variant dark` only if the project opts into dark mode, and keep light as the default). The library bundles class-variance-authority, clsx, tailwind-merge.
|
|
58
60
|
- Plus general styling rules (spacing in 2/4/6/8, object-cover, truncate, motion, color tokens — never hardcoded hex in components).
|
|
59
61
|
|
|
60
62
|
## Express 5.x
|
|
@@ -62,7 +64,7 @@ Tailwind v4 + shadcn-based UI; conventions below.
|
|
|
62
64
|
```javascript
|
|
63
65
|
app.use(cors({ origin: process.env.FRONTEND_URL }));
|
|
64
66
|
app.use(compression());
|
|
65
|
-
app.use(express.json({ limit:
|
|
67
|
+
app.use(express.json({ limit: '10mb' }));
|
|
66
68
|
app.use(rateLimit({ windowMs: 15 * 60 * 1000, max: 100 }));
|
|
67
69
|
```
|
|
68
70
|
|
|
@@ -28,3 +28,14 @@
|
|
|
28
28
|
- snake_case : Used in File names, folder names. Examples: `user_service`, `api_utils`, `auth_middleware`, `data_models`
|
|
29
29
|
- UPPER_SNAKE_CASE : Used in Constants, environment variables. Examples: `MAX_RETRY_COUNT`, `API_KEY`, `DEFAULT_TIMEOUT`, `COLOR_PRIMARY`
|
|
30
30
|
- kebab-case : Used in URLs, CSS class names, HTML IDs. Examples: `nav-container`, `user-profile`, `button-primary`, `form-wrapper`
|
|
31
|
+
|
|
32
|
+
## Database
|
|
33
|
+
|
|
34
|
+
Naming for D1 tables, columns, indexes, and their Drizzle mirrors. (For column **types** — PK shape, timestamp columns — see the Cloudflare D1 Schema rule, not here; this section governs names only.)
|
|
35
|
+
|
|
36
|
+
- **Tables** : snake_case. Entity / hub tables use the plural noun for the thing they hold. Examples: `users`, `apps`, `devices`, `services`.
|
|
37
|
+
- **Junction (M:N) tables** : name a many-to-many join `<entityA>_<entityB>_map` — **always**, even when the join carries its own columns (a `role`, a secret, a status). The `_map` suffix is the signal that a row is a relationship, not an entity; extra attributes on the join do **not** earn it a standalone noun. Use the **singular** stem of each side, owning/anchor entity first (mirror the existing tables — `app_*`). Examples: `app_user_map` (apps ⨯ users), `app_device_map` (apps ⨯ devices), `app_service_map` (apps ⨯ services).
|
|
38
|
+
- ❌ Don't invent a "nice" noun for a junction — no `members`, `installs`, `memberships`, `enrolments`. A reviewer should read the table name and know both sides and that it's a join.
|
|
39
|
+
- **Columns** : snake_case. Foreign keys are `<entity>_id` (`user_id`, `app_id`, `device_id`, `service_id`). Booleans follow the boolean rule (`is_*`/`has_*`); timestamps are `created_at` / `updated_at`.
|
|
40
|
+
- **Indexes** : `<table>_<col(s)>_idx`; unique indexes `<table>_<col(s)>_unique`. The composite unique on a junction reads `<table>_<colA>_<colB>_unique` — e.g. `app_user_map_app_user_unique`, `app_device_map_device_app_unique`.
|
|
41
|
+
- **Drizzle mirror** : the exported table object is the camelCase of the snake_case table name (`app_user_map` → `appUserMap`); column TS properties are the camelCase of the column (`created_at` → `createdAt`, `service_key` → `serviceKey`). The snake_case string passed to `sqliteTable("…")` and every index name must match `seed/init.sql` exactly (the G1 schema-parity boundary).
|
|
@@ -11,6 +11,8 @@ Document contracts and architecture, not implementation details. Show function s
|
|
|
11
11
|
|
|
12
12
|
**No redirect docs.** When moving a doc to a new location, delete the old file entirely. Update all references (routing, memory files, frontmatter `depends_on`, cross-doc links) to point to the new path. Never leave a stub file that says "Moved to X" — redirect docs rot, clutter the repo, and create false search hits.
|
|
13
13
|
|
|
14
|
+
**Present tense, current state only.** Active docs (everything outside `docs/history/`) describe the system _as it is now_ — what exists and how it works today. They never narrate how it got there: no migration/fold history, no dated "shipped/verified/built on YYYY-MM-DD" markers, no "ex-`@nurix/X`, folded 2026-06-12" provenance, no "was X → now Y" change journeys, no "removed/deleted in the <date> fold". The historical record — when and how things changed — lives **only** in `docs/history/` (changelog, plans, ADRs); `docs/memory/` is the agent's dated log and is likewise exempt. A doc may cite an ADR for the _why_ (the decision rationale), but must not narrate the _when/how it changed_. Routing/index docs point only to current authority docs — never to a historical plan or changelog as the "read first" source. When you find historical narration in an active doc, rewrite it to the present-tense fact and let `docs/history/` carry the story.
|
|
15
|
+
|
|
14
16
|
---
|
|
15
17
|
|
|
16
18
|
## Decision Tree
|
|
@@ -220,6 +220,29 @@ Use for structured info:
|
|
|
220
220
|
|
|
221
221
|
---
|
|
222
222
|
|
|
223
|
+
## Tense & History
|
|
224
|
+
|
|
225
|
+
**Active docs describe the present, not the past.** Everything outside `docs/history/` states what the system _is_ and how it works _today_. It must not narrate how it got there. The historical record — the journey, the dates, the migrations — lives **only** in `docs/history/` (changelog, plans, ADRs). (`docs/memory/` is the agent's own dated log and is likewise exempt from this rule.)
|
|
226
|
+
|
|
227
|
+
Strip this language from active docs:
|
|
228
|
+
|
|
229
|
+
| ❌ Historical narration (belongs in `docs/history/`) | ✅ Present-tense fact (belongs in the active doc) |
|
|
230
|
+
| --- | --- |
|
|
231
|
+
| "Folded in from the `NuStack-X` repo (2026-06-12)." | "Vendor-connector catalogue; one subpath per vendor." |
|
|
232
|
+
| "Built 2026-06-14; shipped + verified 2026-06-13." | "`agentSessionWorkflow` runs an outer turn loop over `runAgentLoop`." |
|
|
233
|
+
| "The legacy worker was deleted in the 2026-06-14 fold." | "One worker interprets `WorkflowDefinition`." |
|
|
234
|
+
| "ex-`@nurix/mcp-runtime`, M9 Phase C; was X, now Y." | "MCP client runtime, wired into `agentTriggerWorkflow`." |
|
|
235
|
+
| "Read first: `docs/history/plans/2026-…-fold.md`" (routing) | "Read first: `docs/architecture/<current-SOT>.md`" |
|
|
236
|
+
|
|
237
|
+
Rules:
|
|
238
|
+
|
|
239
|
+
- **No dates in active docs** for when something shipped, was verified, folded, or was removed. A bare status marker (`✅ shipped`, `⏳ pending`) is fine; the _date_ it shipped is not.
|
|
240
|
+
- **Cite the ADR for the _why_, never the _when_.** `Provenance: ADR-002` is good (it points to the decision rationale). "Decided in ADR-002 and shipped 2026-06-13" is not.
|
|
241
|
+
- **Routing/index docs point only to current authority docs.** A row whose only "read first" target is a historical plan or changelog is a redirect-for-history — repoint it to the current SOT doc, or drop the row.
|
|
242
|
+
- **When a doc changes because the system changed, the change-story goes in `docs/history/` (a changelog entry), and the active doc simply becomes correct in present tense.** Never leave the diff narrated in place.
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
223
246
|
## Structure
|
|
224
247
|
|
|
225
248
|
### Headers
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nurix/etna",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.4",
|
|
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": {
|