@nurix/etna 0.19.73 → 0.19.74
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 +1 -1
- package/data/harnesses/code/agents/brainstorm.md +4 -0
- package/data/harnesses/code/harness.json +2 -2
- package/data/harnesses/code/skills/brainstorm/references/session-schema.md +3 -1
- package/data/harnesses/code/skills/brainstorm/scripts/detector.mjs +4 -2
- package/data/harnesses/code/skills/design/scripts/select-chart.mjs +3 -1
- package/data/harnesses/code/skills/design/scripts/validate-design-md.mjs +5 -3
- package/data/harnesses/delivery/agents/brainstorm.md +4 -0
- package/data/harnesses/delivery/harness.json +2 -2
- package/data/harnesses/delivery/skills/brainstorm/references/session-schema.md +3 -1
- package/data/harnesses/delivery/skills/brainstorm/scripts/detector.mjs +4 -2
- package/data/harnesses/etna/agents/brainstorm.md +4 -0
- package/data/harnesses/etna/harness.json +2 -2
- package/data/harnesses/etna/skills/brainstorm/references/session-schema.md +3 -1
- package/data/harnesses/etna/skills/brainstorm/scripts/detector.mjs +4 -2
- package/package.json +2 -2
package/data/harness-index.json
CHANGED
|
@@ -21,6 +21,10 @@ run at the start of every dispatch and again before you return:
|
|
|
21
21
|
node <skill>/scripts/detector.mjs <session-folder> [--gate=manifest|move] [--json]
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
+
A real run always prints per-rule lines and a `clean`/`failing` summary (or a usage/error
|
|
25
|
+
message). **Empty output is not a clean run — it means the detector never executed**; treat it
|
|
26
|
+
as a failed gate and report it, never as a pass.
|
|
27
|
+
|
|
24
28
|
## The write protocol you enforce
|
|
25
29
|
|
|
26
30
|
One writer per file. You write `state.md`, `thesis.md`, `forks.md`, `ledger.md`, `fragments/`,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"harness": "code",
|
|
3
3
|
"name": "code",
|
|
4
|
-
"version": "3.9.
|
|
4
|
+
"version": "3.9.5",
|
|
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": "
|
|
18
|
+
"digest": "5b6ab91da961"
|
|
19
19
|
}
|
|
@@ -181,6 +181,8 @@ the move to history requires a recorded passing uselessness test [BS-USELESS-01]
|
|
|
181
181
|
- `move` — adds the post-apply gates (manifest applied, uselessness pass recorded, no links into
|
|
182
182
|
scaffolding); the folder may not move while any fail.
|
|
183
183
|
|
|
184
|
-
Exit code 0 = clean, 1 = violations (listed with rule IDs), 2 = unusable input.
|
|
184
|
+
Exit code 0 = clean, 1 = violations (listed with rule IDs), 2 = unusable input. A run always
|
|
185
|
+
prints output — per-rule lines plus a `clean`/`failing` summary (or a usage/error message);
|
|
186
|
+
**exit 0 with empty output means the detector never executed** and is a failure, never a pass. Rules degrade
|
|
185
187
|
gracefully: no git context ⇒ BS-OPS-02 reports `skipped`, never blocks. Rule IDs are stable —
|
|
186
188
|
consumers (the twin, the evals, the maintenance census) key on them.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Contract: references/session-schema.md. Rule IDs are stable; consumers key on them.
|
|
4
4
|
// Usage: node detector.mjs <session-folder> [--gate=session|manifest|move] [--json]
|
|
5
5
|
|
|
6
|
-
import { readFileSync, existsSync, readdirSync, statSync } from 'node:fs';
|
|
6
|
+
import { readFileSync, existsSync, readdirSync, statSync, realpathSync } from 'node:fs';
|
|
7
7
|
import { join, basename, resolve } from 'node:path';
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
9
|
import { execFileSync } from 'node:child_process';
|
|
@@ -455,6 +455,8 @@ function main() {
|
|
|
455
455
|
process.exit(failed.length === 0 ? 0 : 1);
|
|
456
456
|
}
|
|
457
457
|
|
|
458
|
-
|
|
458
|
+
// realpath both sides: argv[1] keeps the invoking symlink (e.g. a ~/.claude/skills link),
|
|
459
|
+
// while import.meta.url is the resolved file — a plain path compare silently skips main().
|
|
460
|
+
if (process.argv[1] && realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url))) {
|
|
459
461
|
main();
|
|
460
462
|
}
|
|
@@ -617,6 +617,8 @@ function main() {
|
|
|
617
617
|
process.stdout.write(`${JSON.stringify(output, null, 2)}\n`);
|
|
618
618
|
}
|
|
619
619
|
|
|
620
|
-
|
|
620
|
+
// realpath both sides: argv[1] keeps the invoking symlink (e.g. a ~/.claude/skills link),
|
|
621
|
+
// while import.meta.url is the resolved file — a plain path compare silently skips main().
|
|
622
|
+
if (process.argv[1] && fs.realpathSync(process.argv[1]) === fs.realpathSync(fileURLToPath(import.meta.url))) {
|
|
621
623
|
main();
|
|
622
624
|
}
|
|
@@ -86,9 +86,9 @@
|
|
|
86
86
|
// (--space-base, --sidebar-width[-collapsed], --topbar-height, --side-panel-width[-wide],
|
|
87
87
|
// --content-max-width; unmapped keys emit as --layout-<key>). The dark block carries the 36 dark roles.
|
|
88
88
|
|
|
89
|
-
import { readFileSync, existsSync, statSync, readdirSync } from "node:fs";
|
|
89
|
+
import { readFileSync, existsSync, statSync, readdirSync, realpathSync } from "node:fs";
|
|
90
90
|
import { join, resolve, basename, dirname, relative, sep } from "node:path";
|
|
91
|
-
import {
|
|
91
|
+
import { fileURLToPath } from "node:url";
|
|
92
92
|
import process from "node:process";
|
|
93
93
|
|
|
94
94
|
// ---------------------------------------------------------------------------
|
|
@@ -1195,4 +1195,6 @@ function main() {
|
|
|
1195
1195
|
process.exit(anyFail ? 1 : 0);
|
|
1196
1196
|
}
|
|
1197
1197
|
|
|
1198
|
-
|
|
1198
|
+
// realpath both sides: argv[1] keeps the invoking symlink (e.g. a ~/.claude/skills link),
|
|
1199
|
+
// while import.meta.url is the resolved file — a plain path compare silently skips main().
|
|
1200
|
+
if (process.argv[1] && realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url))) main();
|
|
@@ -21,6 +21,10 @@ run at the start of every dispatch and again before you return:
|
|
|
21
21
|
node <skill>/scripts/detector.mjs <session-folder> [--gate=manifest|move] [--json]
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
+
A real run always prints per-rule lines and a `clean`/`failing` summary (or a usage/error
|
|
25
|
+
message). **Empty output is not a clean run — it means the detector never executed**; treat it
|
|
26
|
+
as a failed gate and report it, never as a pass.
|
|
27
|
+
|
|
24
28
|
## The write protocol you enforce
|
|
25
29
|
|
|
26
30
|
One writer per file. You write `state.md`, `thesis.md`, `forks.md`, `ledger.md`, `fragments/`,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"harness": "delivery",
|
|
3
3
|
"name": "delivery",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.12",
|
|
5
5
|
"files": [
|
|
6
6
|
".prettierignore",
|
|
7
7
|
".prettierrc.json",
|
|
8
8
|
".vscode/settings.json"
|
|
9
9
|
],
|
|
10
10
|
"seeds": [],
|
|
11
|
-
"digest": "
|
|
11
|
+
"digest": "599762913a4e"
|
|
12
12
|
}
|
|
@@ -181,6 +181,8 @@ the move to history requires a recorded passing uselessness test [BS-USELESS-01]
|
|
|
181
181
|
- `move` — adds the post-apply gates (manifest applied, uselessness pass recorded, no links into
|
|
182
182
|
scaffolding); the folder may not move while any fail.
|
|
183
183
|
|
|
184
|
-
Exit code 0 = clean, 1 = violations (listed with rule IDs), 2 = unusable input.
|
|
184
|
+
Exit code 0 = clean, 1 = violations (listed with rule IDs), 2 = unusable input. A run always
|
|
185
|
+
prints output — per-rule lines plus a `clean`/`failing` summary (or a usage/error message);
|
|
186
|
+
**exit 0 with empty output means the detector never executed** and is a failure, never a pass. Rules degrade
|
|
185
187
|
gracefully: no git context ⇒ BS-OPS-02 reports `skipped`, never blocks. Rule IDs are stable —
|
|
186
188
|
consumers (the twin, the evals, the maintenance census) key on them.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Contract: references/session-schema.md. Rule IDs are stable; consumers key on them.
|
|
4
4
|
// Usage: node detector.mjs <session-folder> [--gate=session|manifest|move] [--json]
|
|
5
5
|
|
|
6
|
-
import { readFileSync, existsSync, readdirSync, statSync } from 'node:fs';
|
|
6
|
+
import { readFileSync, existsSync, readdirSync, statSync, realpathSync } from 'node:fs';
|
|
7
7
|
import { join, basename, resolve } from 'node:path';
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
9
|
import { execFileSync } from 'node:child_process';
|
|
@@ -455,6 +455,8 @@ function main() {
|
|
|
455
455
|
process.exit(failed.length === 0 ? 0 : 1);
|
|
456
456
|
}
|
|
457
457
|
|
|
458
|
-
|
|
458
|
+
// realpath both sides: argv[1] keeps the invoking symlink (e.g. a ~/.claude/skills link),
|
|
459
|
+
// while import.meta.url is the resolved file — a plain path compare silently skips main().
|
|
460
|
+
if (process.argv[1] && realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url))) {
|
|
459
461
|
main();
|
|
460
462
|
}
|
|
@@ -21,6 +21,10 @@ run at the start of every dispatch and again before you return:
|
|
|
21
21
|
node <skill>/scripts/detector.mjs <session-folder> [--gate=manifest|move] [--json]
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
+
A real run always prints per-rule lines and a `clean`/`failing` summary (or a usage/error
|
|
25
|
+
message). **Empty output is not a clean run — it means the detector never executed**; treat it
|
|
26
|
+
as a failed gate and report it, never as a pass.
|
|
27
|
+
|
|
24
28
|
## The write protocol you enforce
|
|
25
29
|
|
|
26
30
|
One writer per file. You write `state.md`, `thesis.md`, `forks.md`, `ledger.md`, `fragments/`,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"harness": "etna",
|
|
3
3
|
"name": "etna",
|
|
4
|
-
"version": "1.4.
|
|
4
|
+
"version": "1.4.11",
|
|
5
5
|
"files": [
|
|
6
6
|
".prettierignore",
|
|
7
7
|
".prettierrc.json",
|
|
8
8
|
".vscode/settings.json"
|
|
9
9
|
],
|
|
10
10
|
"seeds": [],
|
|
11
|
-
"digest": "
|
|
11
|
+
"digest": "84ce5acb1a74"
|
|
12
12
|
}
|
|
@@ -181,6 +181,8 @@ the move to history requires a recorded passing uselessness test [BS-USELESS-01]
|
|
|
181
181
|
- `move` — adds the post-apply gates (manifest applied, uselessness pass recorded, no links into
|
|
182
182
|
scaffolding); the folder may not move while any fail.
|
|
183
183
|
|
|
184
|
-
Exit code 0 = clean, 1 = violations (listed with rule IDs), 2 = unusable input.
|
|
184
|
+
Exit code 0 = clean, 1 = violations (listed with rule IDs), 2 = unusable input. A run always
|
|
185
|
+
prints output — per-rule lines plus a `clean`/`failing` summary (or a usage/error message);
|
|
186
|
+
**exit 0 with empty output means the detector never executed** and is a failure, never a pass. Rules degrade
|
|
185
187
|
gracefully: no git context ⇒ BS-OPS-02 reports `skipped`, never blocks. Rule IDs are stable —
|
|
186
188
|
consumers (the twin, the evals, the maintenance census) key on them.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Contract: references/session-schema.md. Rule IDs are stable; consumers key on them.
|
|
4
4
|
// Usage: node detector.mjs <session-folder> [--gate=session|manifest|move] [--json]
|
|
5
5
|
|
|
6
|
-
import { readFileSync, existsSync, readdirSync, statSync } from 'node:fs';
|
|
6
|
+
import { readFileSync, existsSync, readdirSync, statSync, realpathSync } from 'node:fs';
|
|
7
7
|
import { join, basename, resolve } from 'node:path';
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
9
|
import { execFileSync } from 'node:child_process';
|
|
@@ -455,6 +455,8 @@ function main() {
|
|
|
455
455
|
process.exit(failed.length === 0 ? 0 : 1);
|
|
456
456
|
}
|
|
457
457
|
|
|
458
|
-
|
|
458
|
+
// realpath both sides: argv[1] keeps the invoking symlink (e.g. a ~/.claude/skills link),
|
|
459
|
+
// while import.meta.url is the resolved file — a plain path compare silently skips main().
|
|
460
|
+
if (process.argv[1] && realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url))) {
|
|
459
461
|
main();
|
|
460
462
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nurix/etna",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.74",
|
|
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": "34b5c15e4b63"
|
|
46
46
|
}
|