@nurix/etna 0.19.77 → 0.19.78

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.
@@ -1,5 +1,5 @@
1
1
  {
2
- "fingerprint": "f747b8cde1b8",
2
+ "fingerprint": "728af89f1e8e",
3
3
  "harnesses": {
4
4
  "code": {
5
5
  "plugin": "code",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "harness": "code",
3
3
  "name": "code",
4
- "version": "3.10.3",
4
+ "version": "3.10.4",
5
5
  "files": [
6
6
  ".prettierignore",
7
7
  ".prettierrc.json",
@@ -15,5 +15,5 @@
15
15
  "docs/memory/main.md",
16
16
  ".mcp.json"
17
17
  ],
18
- "digest": "950e458df1d7"
18
+ "digest": "4b1ec8d430ab"
19
19
  }
@@ -7,6 +7,8 @@ Read by the PreToolUse install gate (`compliance.mjs`) — an off-table install
7
7
  | `react` | ^19.2.3 | UI components | — |
8
8
  | `vite` | ^8.0.0 | Build tool, dev server | `webpack`, CRA |
9
9
  | `tailwindcss` | ^4.1.18 | Styling | `styled-components` |
10
+ | `@nurix/components` | ^0.15.12 | The UI component library — import by subpath | `npx shadcn add`, a `components.json` scaffold |
11
+ | `@tailwindcss/vite` | ^4.1.18 | Tailwind v4 Vite plugin | `postcss`, `tailwind.config.js` |
10
12
  | `@vitejs/plugin-react-swc` | ^4.2.2 | JSX compilation | `@vitejs/plugin-react` |
11
13
  | `react-router-dom` | ^7.11.0 | Routing | — |
12
14
  | `@reduxjs/toolkit` | ^2.11.2 | State management | `zustand`, `jotai` |
@@ -277,11 +277,21 @@ function packageGate(projectDir, command, sessionId) {
277
277
  if (!m) return null;
278
278
  const approved = approvedPackages(projectDir);
279
279
  if (approved.size === 0) return null; // no rules file installed — nothing to enforce
280
- const args = (m[1] || "")
281
- .split(/\s+/)
282
- .filter((a) => a && !a.startsWith("-") && PKG_SPEC.test(a));
280
+ const raw = m[1] || "";
281
+ // Test packages install at `latest`, outside the table's pin set (.claude/rules/testing.md).
282
+ // Two dev-only installs are a decision already taken rather than a new one: a companion in an
283
+ // approved scope (`@testing-library/react` is approved, so `-D @testing-library/user-event` is
284
+ // not a fresh choice), and `@types/*`, which is the typing of a package already decided. Scoped
285
+ // and dev only — an unscoped or runtime install is still judged against the table.
286
+ const isDev = /(?:^|\s)(?:-D|--save-dev|--dev)(?:\s|$)/.test(raw);
287
+ const approvedScopes = new Set(
288
+ [...approved].filter((n) => n.startsWith("@")).map((n) => n.split("/")[0])
289
+ );
290
+ approvedScopes.add("@types");
291
+ const args = raw.split(/\s+/).filter((a) => a && !a.startsWith("-") && PKG_SPEC.test(a));
283
292
  for (const arg of args) {
284
293
  const pkg = arg.startsWith("@") ? arg.split("@").slice(0, 2).join("@") : arg.split("@")[0];
294
+ if (isDev && pkg.startsWith("@") && approvedScopes.has(pkg.split("/")[0])) continue;
285
295
  if (!approved.has(pkg)) {
286
296
  return deny(
287
297
  projectDir,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nurix/etna",
3
- "version": "0.19.77",
3
+ "version": "0.19.78",
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": "f747b8cde1b8"
45
+ "etnaFingerprint": "728af89f1e8e"
46
46
  }