@xhulz/nina 0.34.0 → 0.36.0
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/nina.mjs +222 -48
- package/package.json +1 -1
- package/releases/0.35.0/core/GAPS.md +125 -0
- package/releases/0.35.0/core/answered.json +29 -0
- package/releases/0.35.0/core/defaults/tree/.claude/agents/architect.md +1 -0
- package/releases/0.35.0/core/defaults/tree/.claude/agents/dba.md +3 -0
- package/releases/0.35.0/core/defaults/tree/.claude/agents/devops.md +1 -0
- package/releases/0.35.0/core/defaults/tree/.claude/agents/implementer.md +1 -0
- package/releases/0.35.0/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.35.0/core/defaults/tree/.claude/agents/qa.md +2 -0
- package/releases/0.35.0/core/defaults/tree/.claude/agents/reviewer.md +3 -0
- package/releases/0.35.0/core/defaults/tree/.claude/agents/secops.md +3 -0
- package/releases/0.35.0/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
- package/releases/0.35.0/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
- package/releases/0.35.0/core/tree/.claude/agents/architect.md +127 -0
- package/releases/0.35.0/core/tree/.claude/agents/dba.md +110 -0
- package/releases/0.35.0/core/tree/.claude/agents/devops.md +114 -0
- package/releases/0.35.0/core/tree/.claude/agents/implementer.md +156 -0
- package/releases/0.35.0/core/tree/.claude/agents/integration-tester.md +168 -0
- package/releases/0.35.0/core/tree/.claude/agents/planner.md +132 -0
- package/releases/0.35.0/core/tree/.claude/agents/qa.md +153 -0
- package/releases/0.35.0/core/tree/.claude/agents/reviewer.md +183 -0
- package/releases/0.35.0/core/tree/.claude/agents/secops.md +121 -0
- package/releases/0.35.0/core/tree/.claude/agents/solidity-auditor.md +126 -0
- package/releases/0.35.0/core/tree/.claude/agents/solidity-dev.md +123 -0
- package/releases/0.35.0/core/tree/.claude/agents-overview.md +64 -0
- package/releases/0.35.0/core/tree/.claude/frontend.md +10 -0
- package/releases/0.35.0/core/tree/.claude/graph.md +75 -0
- package/releases/0.35.0/core/tree/.claude/patterns.md +213 -0
- package/releases/0.35.0/core/tree/.claude/pills/README.md +146 -0
- package/releases/0.35.0/core/tree/.claude/pipeline.md +101 -0
- package/releases/0.35.0/core/tree/.claude/retrieval.md +103 -0
- package/releases/0.35.0/core/tree/.claude/router.md +198 -0
- package/releases/0.35.0/core/tree/.claude/templates/integration.md +45 -0
- package/releases/0.35.0/core/tree/CLAUDE.md +161 -0
- package/releases/0.35.0/core/tree/scripts/cost-watch.mjs +18 -0
- package/releases/0.35.0/core/tree/scripts/edit-guard.mjs +16 -0
- package/releases/0.35.0/core/tree/scripts/harness-check.mjs +71 -0
- package/releases/0.35.0/core/tree/scripts/loop-gate.mjs +19 -0
- package/releases/0.35.0/core/vocabulary.json +13 -0
- package/releases/0.35.0/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
- package/releases/0.35.0/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
- package/releases/0.35.0/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
- package/releases/0.35.0/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
- package/releases/0.35.0/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
- package/releases/0.35.0/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
- package/releases/0.35.0/surfaces/blockchain/tree/.claude/graph.md +11 -0
- package/releases/0.35.0/surfaces/blockchain/tree/.claude/router.md +6 -0
- package/releases/0.35.0/surfaces/blockchain/tree/CLAUDE.md +12 -0
- package/releases/0.35.0/surfaces/db/tree/.claude/agents/architect.md +5 -0
- package/releases/0.35.0/surfaces/db/tree/.claude/agents/dba.md +50 -0
- package/releases/0.35.0/surfaces/db/tree/.claude/agents/devops.md +5 -0
- package/releases/0.35.0/surfaces/db/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.35.0/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
- package/releases/0.35.0/surfaces/db/tree/.claude/agents/planner.md +2 -0
- package/releases/0.35.0/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
- package/releases/0.35.0/surfaces/db/tree/.claude/agents/secops.md +2 -0
- package/releases/0.35.0/surfaces/db/tree/.claude/agents-overview.md +5 -0
- package/releases/0.35.0/surfaces/db/tree/.claude/graph.md +8 -0
- package/releases/0.35.0/surfaces/db/tree/.claude/patterns.md +19 -0
- package/releases/0.35.0/surfaces/db/tree/.claude/pipeline.md +13 -0
- package/releases/0.35.0/surfaces/db/tree/.claude/retrieval.md +5 -0
- package/releases/0.35.0/surfaces/db/tree/.claude/router.md +4 -0
- package/releases/0.35.0/surfaces/db/tree/CLAUDE.md +17 -0
- package/releases/0.35.0/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
- package/releases/0.35.0/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
- package/releases/0.35.0/surfaces/edge-cf/tree/.claude/agents/devops.md +32 -0
- package/releases/0.35.0/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
- package/releases/0.35.0/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
- package/releases/0.35.0/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
- package/releases/0.35.0/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.35.0/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
- package/releases/0.35.0/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
- package/releases/0.35.0/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
- package/releases/0.35.0/surfaces/edge-cf/tree/CLAUDE.md +27 -0
- package/releases/0.35.0/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
- package/releases/0.35.0/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
- package/releases/0.35.0/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
- package/releases/0.35.0/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
- package/releases/0.35.0/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
- package/releases/0.35.0/surfaces/frontend/tree/.claude/patterns.md +8 -0
- package/releases/0.35.0/surfaces/frontend/tree/.claude/retrieval.md +2 -0
- package/releases/0.35.0/surfaces/frontend/tree/.claude/router.md +14 -0
- package/releases/0.35.0/surfaces/frontend/tree/CLAUDE.md +5 -0
- package/releases/0.35.0/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
- package/releases/0.35.0/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
- package/releases/0.35.0/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
- package/releases/0.35.0/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
- package/releases/0.35.0/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
- package/releases/0.35.0/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
- package/releases/0.35.0/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
- package/releases/0.35.0/surfaces/integrations/tree/.claude/graph.md +10 -0
- package/releases/0.35.0/surfaces/integrations/tree/.claude/patterns.md +38 -0
- package/releases/0.35.0/surfaces/integrations/tree/.claude/pipeline.md +16 -0
- package/releases/0.35.0/surfaces/integrations/tree/.claude/retrieval.md +16 -0
- package/releases/0.35.0/surfaces/integrations/tree/.claude/router.md +6 -0
- package/releases/0.35.0/surfaces/integrations/tree/CLAUDE.md +17 -0
- package/releases/0.35.0/surfaces/money/tree/.claude/agents/architect.md +12 -0
- package/releases/0.35.0/surfaces/money/tree/.claude/agents/dba.md +14 -0
- package/releases/0.35.0/surfaces/money/tree/.claude/agents/implementer.md +11 -0
- package/releases/0.35.0/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.35.0/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
- package/releases/0.35.0/surfaces/money/tree/.claude/agents/secops.md +5 -0
- package/releases/0.35.0/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
- package/releases/0.35.0/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
- package/releases/0.35.0/surfaces/money/tree/.claude/graph.md +2 -0
- package/releases/0.35.0/surfaces/money/tree/.claude/patterns.md +49 -0
- package/releases/0.35.0/surfaces/money/tree/.claude/pipeline.md +2 -0
- package/releases/0.35.0/surfaces/money/tree/.claude/retrieval.md +2 -0
- package/releases/0.35.0/surfaces/money/tree/CLAUDE.md +11 -0
- package/releases/0.35.0/surfaces/pii/tree/.claude/agents/dba.md +2 -0
- package/releases/0.35.0/surfaces/pii/tree/.claude/agents/devops.md +8 -0
- package/releases/0.35.0/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.35.0/surfaces/pii/tree/.claude/agents/secops.md +2 -0
- package/releases/0.35.0/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
- package/releases/0.35.0/surfaces/pii/tree/CLAUDE.md +5 -0
- package/releases/0.35.0/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
- package/releases/0.35.0/surfaces/prisma/tree/.claude/agents/dba.md +39 -0
- package/releases/0.35.0/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
- package/releases/0.35.0/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.35.0/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
- package/releases/0.35.0/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
- package/releases/0.35.0/surfaces/prisma/tree/.claude/patterns.md +15 -0
- package/releases/0.35.0/surfaces/prisma/tree/CLAUDE.md +5 -0
- package/releases/0.36.0/core/GAPS.md +125 -0
- package/releases/0.36.0/core/answered.json +29 -0
- package/releases/0.36.0/core/defaults/tree/.claude/agents/architect.md +1 -0
- package/releases/0.36.0/core/defaults/tree/.claude/agents/dba.md +3 -0
- package/releases/0.36.0/core/defaults/tree/.claude/agents/devops.md +1 -0
- package/releases/0.36.0/core/defaults/tree/.claude/agents/implementer.md +1 -0
- package/releases/0.36.0/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.36.0/core/defaults/tree/.claude/agents/qa.md +2 -0
- package/releases/0.36.0/core/defaults/tree/.claude/agents/reviewer.md +3 -0
- package/releases/0.36.0/core/defaults/tree/.claude/agents/secops.md +3 -0
- package/releases/0.36.0/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
- package/releases/0.36.0/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
- package/releases/0.36.0/core/tree/.claude/agents/architect.md +127 -0
- package/releases/0.36.0/core/tree/.claude/agents/dba.md +110 -0
- package/releases/0.36.0/core/tree/.claude/agents/devops.md +114 -0
- package/releases/0.36.0/core/tree/.claude/agents/implementer.md +156 -0
- package/releases/0.36.0/core/tree/.claude/agents/integration-tester.md +168 -0
- package/releases/0.36.0/core/tree/.claude/agents/planner.md +132 -0
- package/releases/0.36.0/core/tree/.claude/agents/qa.md +153 -0
- package/releases/0.36.0/core/tree/.claude/agents/reviewer.md +183 -0
- package/releases/0.36.0/core/tree/.claude/agents/secops.md +121 -0
- package/releases/0.36.0/core/tree/.claude/agents/solidity-auditor.md +126 -0
- package/releases/0.36.0/core/tree/.claude/agents/solidity-dev.md +123 -0
- package/releases/0.36.0/core/tree/.claude/agents-overview.md +64 -0
- package/releases/0.36.0/core/tree/.claude/frontend.md +10 -0
- package/releases/0.36.0/core/tree/.claude/graph.md +75 -0
- package/releases/0.36.0/core/tree/.claude/patterns.md +213 -0
- package/releases/0.36.0/core/tree/.claude/pills/README.md +146 -0
- package/releases/0.36.0/core/tree/.claude/pipeline.md +101 -0
- package/releases/0.36.0/core/tree/.claude/retrieval.md +103 -0
- package/releases/0.36.0/core/tree/.claude/router.md +198 -0
- package/releases/0.36.0/core/tree/.claude/templates/integration.md +45 -0
- package/releases/0.36.0/core/tree/CLAUDE.md +161 -0
- package/releases/0.36.0/core/tree/scripts/cost-watch.mjs +18 -0
- package/releases/0.36.0/core/tree/scripts/edit-guard.mjs +16 -0
- package/releases/0.36.0/core/tree/scripts/harness-check.mjs +71 -0
- package/releases/0.36.0/core/tree/scripts/loop-gate.mjs +19 -0
- package/releases/0.36.0/core/vocabulary.json +13 -0
- package/releases/0.36.0/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
- package/releases/0.36.0/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
- package/releases/0.36.0/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
- package/releases/0.36.0/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
- package/releases/0.36.0/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
- package/releases/0.36.0/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
- package/releases/0.36.0/surfaces/blockchain/tree/.claude/graph.md +11 -0
- package/releases/0.36.0/surfaces/blockchain/tree/.claude/router.md +6 -0
- package/releases/0.36.0/surfaces/blockchain/tree/CLAUDE.md +12 -0
- package/releases/0.36.0/surfaces/db/tree/.claude/agents/architect.md +5 -0
- package/releases/0.36.0/surfaces/db/tree/.claude/agents/dba.md +50 -0
- package/releases/0.36.0/surfaces/db/tree/.claude/agents/devops.md +5 -0
- package/releases/0.36.0/surfaces/db/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.36.0/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
- package/releases/0.36.0/surfaces/db/tree/.claude/agents/planner.md +2 -0
- package/releases/0.36.0/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
- package/releases/0.36.0/surfaces/db/tree/.claude/agents/secops.md +2 -0
- package/releases/0.36.0/surfaces/db/tree/.claude/agents-overview.md +5 -0
- package/releases/0.36.0/surfaces/db/tree/.claude/graph.md +8 -0
- package/releases/0.36.0/surfaces/db/tree/.claude/patterns.md +19 -0
- package/releases/0.36.0/surfaces/db/tree/.claude/pipeline.md +13 -0
- package/releases/0.36.0/surfaces/db/tree/.claude/retrieval.md +5 -0
- package/releases/0.36.0/surfaces/db/tree/.claude/router.md +4 -0
- package/releases/0.36.0/surfaces/db/tree/CLAUDE.md +17 -0
- package/releases/0.36.0/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
- package/releases/0.36.0/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
- package/releases/0.36.0/surfaces/edge-cf/tree/.claude/agents/devops.md +32 -0
- package/releases/0.36.0/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
- package/releases/0.36.0/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
- package/releases/0.36.0/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
- package/releases/0.36.0/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.36.0/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
- package/releases/0.36.0/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
- package/releases/0.36.0/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
- package/releases/0.36.0/surfaces/edge-cf/tree/CLAUDE.md +27 -0
- package/releases/0.36.0/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
- package/releases/0.36.0/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
- package/releases/0.36.0/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
- package/releases/0.36.0/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
- package/releases/0.36.0/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
- package/releases/0.36.0/surfaces/frontend/tree/.claude/patterns.md +8 -0
- package/releases/0.36.0/surfaces/frontend/tree/.claude/retrieval.md +2 -0
- package/releases/0.36.0/surfaces/frontend/tree/.claude/router.md +14 -0
- package/releases/0.36.0/surfaces/frontend/tree/CLAUDE.md +5 -0
- package/releases/0.36.0/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
- package/releases/0.36.0/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
- package/releases/0.36.0/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
- package/releases/0.36.0/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
- package/releases/0.36.0/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
- package/releases/0.36.0/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
- package/releases/0.36.0/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
- package/releases/0.36.0/surfaces/integrations/tree/.claude/graph.md +10 -0
- package/releases/0.36.0/surfaces/integrations/tree/.claude/patterns.md +38 -0
- package/releases/0.36.0/surfaces/integrations/tree/.claude/pipeline.md +16 -0
- package/releases/0.36.0/surfaces/integrations/tree/.claude/retrieval.md +16 -0
- package/releases/0.36.0/surfaces/integrations/tree/.claude/router.md +6 -0
- package/releases/0.36.0/surfaces/integrations/tree/CLAUDE.md +17 -0
- package/releases/0.36.0/surfaces/money/tree/.claude/agents/architect.md +12 -0
- package/releases/0.36.0/surfaces/money/tree/.claude/agents/dba.md +14 -0
- package/releases/0.36.0/surfaces/money/tree/.claude/agents/implementer.md +11 -0
- package/releases/0.36.0/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.36.0/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
- package/releases/0.36.0/surfaces/money/tree/.claude/agents/secops.md +5 -0
- package/releases/0.36.0/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
- package/releases/0.36.0/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
- package/releases/0.36.0/surfaces/money/tree/.claude/graph.md +2 -0
- package/releases/0.36.0/surfaces/money/tree/.claude/patterns.md +49 -0
- package/releases/0.36.0/surfaces/money/tree/.claude/pipeline.md +2 -0
- package/releases/0.36.0/surfaces/money/tree/.claude/retrieval.md +2 -0
- package/releases/0.36.0/surfaces/money/tree/CLAUDE.md +11 -0
- package/releases/0.36.0/surfaces/pii/tree/.claude/agents/dba.md +2 -0
- package/releases/0.36.0/surfaces/pii/tree/.claude/agents/devops.md +8 -0
- package/releases/0.36.0/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.36.0/surfaces/pii/tree/.claude/agents/secops.md +2 -0
- package/releases/0.36.0/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
- package/releases/0.36.0/surfaces/pii/tree/CLAUDE.md +5 -0
- package/releases/0.36.0/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
- package/releases/0.36.0/surfaces/prisma/tree/.claude/agents/dba.md +39 -0
- package/releases/0.36.0/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
- package/releases/0.36.0/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.36.0/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
- package/releases/0.36.0/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
- package/releases/0.36.0/surfaces/prisma/tree/.claude/patterns.md +15 -0
- package/releases/0.36.0/surfaces/prisma/tree/CLAUDE.md +5 -0
- package/src/agentrun.mjs +89 -9
- package/src/commands/check.mjs +12 -8
- package/src/commands/compose.mjs +85 -9
- package/src/commands/export.mjs +8 -16
- package/src/commands/gate.mjs +19 -13
- package/src/commands/init.mjs +13 -4
- package/src/commands/learn.mjs +17 -18
- package/src/commands/pipeline.mjs +4 -4
- package/src/commands/release.mjs +21 -3
- package/src/commands/runs.mjs +14 -8
- package/src/commands/snapshot.mjs +63 -64
- package/src/commands/stats.mjs +98 -30
- package/src/commands/status.mjs +2 -2
- package/src/commands/upgrade.mjs +131 -25
- package/src/guard.mjs +7 -37
- package/src/paths.mjs +50 -1
- package/src/prices.mjs +7 -7
- package/src/store.mjs +158 -0
- package/src/transcripts.mjs +15 -4
- package/src/vocabulary.mjs +12 -1
- package/src/wiring.mjs +106 -41
package/bin/nina.mjs
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* NINA — harness
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* commands (`init`, `compose`, `check`, `upgrade`) land once the core has been
|
|
7
|
-
* extracted from its first real project.
|
|
3
|
+
* NINA — composes an agent harness into a project, keeps it wired and current, and measures what the
|
|
4
|
+
* pipeline it composed does. Each command lives in `src/commands/`; this file is the table of them, and
|
|
5
|
+
* the one place an argument is checked before any command runs.
|
|
8
6
|
*/
|
|
9
7
|
|
|
10
8
|
import { readFile } from 'node:fs/promises';
|
|
@@ -34,55 +32,224 @@ import { status } from '../src/commands/status.mjs';
|
|
|
34
32
|
/** The NINA install directory (the parent of `bin/`). */
|
|
35
33
|
const ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
36
34
|
|
|
37
|
-
/**
|
|
35
|
+
/** Where a command acts, which most of them take. */
|
|
36
|
+
const PROJECT = { '--project <dir>': 'the project to act on (default: the working directory)' };
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Commands wired today, in the order `help` lists them, each with what it takes: `options`, keyed by the
|
|
40
|
+
* option and the name of its value when it takes one, and `args`, what it takes that is not an option.
|
|
41
|
+
* Checked before the command runs, and printed by `nina <command> --help`.
|
|
42
|
+
*/
|
|
38
43
|
const COMMANDS = {
|
|
39
|
-
init: {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
44
|
+
init: {
|
|
45
|
+
run: init,
|
|
46
|
+
help: 'start a harness for a project: profile, surfaces, and what to fill',
|
|
47
|
+
options: {
|
|
48
|
+
...PROJECT,
|
|
49
|
+
'--surfaces <list>': 'declare the surfaces, comma-separated, instead of detecting them',
|
|
50
|
+
'--core <version>': 'the release to pin (default: the newest this install carries)',
|
|
51
|
+
'--force': 'start over, keeping the pin, the vocabulary and the integrations the profile declares',
|
|
52
|
+
'--ask': 'ask about the surfaces even when not on a terminal',
|
|
53
|
+
'--no-ask': 'take the detected surfaces without asking',
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
status: {
|
|
57
|
+
run: status,
|
|
58
|
+
help: "one screen: the pin, the install and the newest release, the hooks, the gate, check, what the week cost, the learning",
|
|
59
|
+
options: { ...PROJECT, '--offline': 'do not ask the registry for the newest release' },
|
|
60
|
+
},
|
|
61
|
+
snapshot: {
|
|
62
|
+
run: snapshot,
|
|
63
|
+
help: 'capture pipeline history from the Claude Code transcripts',
|
|
64
|
+
options: {
|
|
65
|
+
'--project <name>': 'only the projects whose name contains this',
|
|
66
|
+
'--exact': 'only the project named exactly so',
|
|
67
|
+
'--out <dir>': 'where to write (default: ~/.nina/snapshots)',
|
|
68
|
+
'--rebuild': 'read every transcript again from the start, keeping a copy of what it replaces',
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
stats: {
|
|
72
|
+
run: stats,
|
|
73
|
+
help: 'report loop-back rate per stage from the snapshots',
|
|
74
|
+
options: {
|
|
75
|
+
'--project <name>': 'the project whose history to read (default: the one here)',
|
|
76
|
+
'--all': 'every project on this machine',
|
|
77
|
+
'--since <date>': 'from this day on, YYYY-MM-DD',
|
|
78
|
+
'--snapshots <dir>': 'read the history from somewhere else',
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
runs: {
|
|
82
|
+
run: runs,
|
|
83
|
+
help: 'what each piece of work cost: its cycles, their stages and rounds, what was sent back, time and cost',
|
|
84
|
+
options: { ...PROJECT, '--since <date>': 'from this day on, YYYY-MM-DD', '--last <n>': 'how many cycles (default: 10)' },
|
|
85
|
+
},
|
|
86
|
+
check: {
|
|
87
|
+
run: check,
|
|
88
|
+
help: "validate a project's profile, vocabulary and integrations",
|
|
89
|
+
options: {
|
|
90
|
+
...PROJECT,
|
|
91
|
+
'--detector': 'as the project\'s harness:check runs it',
|
|
92
|
+
'--expect-unfilled <slots>': 'slots, comma-separated, a move is known to leave unfilled',
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
compose: {
|
|
96
|
+
run: compose,
|
|
97
|
+
help: "rebuild a project's harness files from the core, its surfaces and its own layer",
|
|
98
|
+
options: {
|
|
99
|
+
...PROJECT,
|
|
100
|
+
'--check': 'report drift instead of writing',
|
|
101
|
+
'--drift': 'with --check: only whether the files on disk are what the layers compose',
|
|
102
|
+
'--expect-unfilled <slots>': 'slots, comma-separated, a move is known to leave unfilled',
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
where: { run: where, help: 'say which layer owns a path, and where a change to it goes', args: '<path>', options: PROJECT },
|
|
106
|
+
pipeline: {
|
|
107
|
+
run: pipeline,
|
|
108
|
+
help: "draw the project's agent chain: the line, its gates, what goes back, each stage's model and skills",
|
|
109
|
+
options: { ...PROJECT, '--for <shape>': 'the chain for one task shape, by number or words', '--since <date>': 'history from this day on, YYYY-MM-DD' },
|
|
110
|
+
},
|
|
111
|
+
pills: { run: pills, help: 'validate the corrections the pipeline wrote about itself', options: { ...PROJECT, '--tidy': 'move retired pills to .claude/pills/retired/' } },
|
|
112
|
+
learn: {
|
|
113
|
+
run: learn,
|
|
114
|
+
help: 'is the pipeline learning from its own runs? observe, capture, apply, graduate, verify; --deep reads why',
|
|
115
|
+
options: {
|
|
116
|
+
...PROJECT,
|
|
117
|
+
'--check': 'as a detector: say only what is owed',
|
|
118
|
+
'--days <n>': 'how far back to look',
|
|
119
|
+
'--graduate <pill>': 'send a lesson to the harness as a request',
|
|
120
|
+
'--close <request>': 'close a request whose rule reached this project some other way',
|
|
121
|
+
'--deep': 'have a model read why the pipeline sent work back',
|
|
122
|
+
'--dry-run': 'with --deep: say what would be read, and read nothing',
|
|
123
|
+
'--model <id>': 'with --deep: the model that reads',
|
|
124
|
+
'--api': 'with --deep: bill the API instead of the Claude Code login',
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
requests: {
|
|
128
|
+
run: requests,
|
|
129
|
+
help: "the lessons projects have graduated to the harness — this repo's inbox",
|
|
130
|
+
options: {
|
|
131
|
+
'--check': 'as a detector: say only what is waiting',
|
|
132
|
+
'--answer <id>': 'record the rule a request became',
|
|
133
|
+
'--in <file>': 'with --answer: the layer file that now carries it',
|
|
134
|
+
'--decline <id>': 'record that a request does not become a rule',
|
|
135
|
+
'--why <reason>': 'with --decline: why',
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
wire: {
|
|
139
|
+
run: wire,
|
|
140
|
+
help: "merge the hooks and npm scripts a project's harness needs to run",
|
|
141
|
+
options: { ...PROJECT, '--to <version>': 'wire for this release instead of the pinned one', '--apply': 'write them, instead of printing them' },
|
|
142
|
+
},
|
|
143
|
+
gate: {
|
|
144
|
+
run: gate,
|
|
145
|
+
help: 'the loop gate: is it wired, and would it still hold a loop past its cap?',
|
|
146
|
+
options: { ...PROJECT, '--selftest': 'hold a synthetic loop past its cap, and compare the ledger with the history', '--hook': 'answer one hook event on stdin' },
|
|
147
|
+
},
|
|
148
|
+
upgrade: {
|
|
149
|
+
run: upgrade,
|
|
150
|
+
help: 'move a project to a newer core, reporting what it costs',
|
|
151
|
+
options: {
|
|
152
|
+
...PROJECT,
|
|
153
|
+
'--to <version>': 'the core to move to',
|
|
154
|
+
'--apply': 'make the move, once it is safe, and verify it',
|
|
155
|
+
'--force': 'move although something would lose meaning',
|
|
156
|
+
'--abort': 'undo a move that was stopped before it finished',
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
eval: {
|
|
160
|
+
run: evalCommand,
|
|
161
|
+
help: "does a release's reviewer catch more planted defects than another's? runs on the login",
|
|
162
|
+
options: {
|
|
163
|
+
'--release <version>': 'a release to measure; give two to compare them',
|
|
164
|
+
'--repeat <n>': 'runs per release',
|
|
165
|
+
'--model <id>': 'the model the reviewer runs on',
|
|
166
|
+
'--judge': 'have a model grade each finding against the planted defects',
|
|
167
|
+
'--api': 'bill the API instead of the Claude Code login',
|
|
168
|
+
'--dry-run': 'say what would run, and run nothing',
|
|
169
|
+
'--keep': 'keep the scratch projects',
|
|
170
|
+
'--reports <dir>': 'keep each report here',
|
|
171
|
+
'--regrade <dir>': 'grade reports kept earlier instead of running',
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
export: {
|
|
175
|
+
run: exportCommand,
|
|
176
|
+
help: 'send the measured history to Langfuse by hand: each run once',
|
|
177
|
+
options: {
|
|
178
|
+
'--langfuse': 'the destination — the only one there is',
|
|
179
|
+
'--project <name>': 'one project, by its snapshot name',
|
|
180
|
+
'--dry-run': 'say what would be sent, and send nothing',
|
|
181
|
+
'--auto': 'as the hook runs it after a turn',
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
langfuse: {
|
|
185
|
+
run: langfuse,
|
|
186
|
+
help: 'keep the Langfuse keys, and turn on the projects that send their runs after every turn',
|
|
187
|
+
args: '<login|on|off|status>',
|
|
188
|
+
options: {
|
|
189
|
+
...PROJECT,
|
|
190
|
+
'--host <url>': 'with login: the Langfuse host',
|
|
191
|
+
'--content': 'with on: send what each stage read, wrote and called',
|
|
192
|
+
'--prompts': 'with on: send only what passed between the agents',
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
release: { run: release, help: 'freeze the working core + surfaces as a pinnable version', args: '<version>', options: {} },
|
|
58
196
|
};
|
|
59
197
|
|
|
60
|
-
/**
|
|
61
|
-
const
|
|
198
|
+
/** Options every command takes: the banner reads it, and the commands that print say less. */
|
|
199
|
+
const EVERYWHERE = { '--quiet': 'say nothing unless something is wrong, and print no banner' };
|
|
62
200
|
|
|
63
|
-
/** Prints
|
|
201
|
+
/** Prints the commands. */
|
|
64
202
|
function help() {
|
|
65
|
-
console.log(' usage: nina <command> [options]');
|
|
203
|
+
console.log(' usage: nina <command> [options] nina <command> --help for its options');
|
|
66
204
|
console.log(' nina on a terminal: the banner once, then type commands under it\n');
|
|
67
205
|
for (const [name, c] of Object.entries(COMMANDS)) {
|
|
68
206
|
console.log(` ${name.padEnd(12)} ${c.help}`);
|
|
69
207
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
208
|
+
console.log('');
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** Prints one command's usage and options. */
|
|
212
|
+
function commandHelp(name) {
|
|
213
|
+
const c = COMMANDS[name];
|
|
214
|
+
const options = { ...c.options, ...EVERYWHERE };
|
|
215
|
+
console.log(` usage: nina ${name}${c.args ? ` ${c.args}` : ''} [options]\n`);
|
|
216
|
+
console.log(` ${c.help}\n`);
|
|
217
|
+
const width = Math.max(...Object.keys(options).map((k) => k.length));
|
|
218
|
+
for (const [option, what] of Object.entries(options)) console.log(` ${option.padEnd(width)} ${what}`);
|
|
219
|
+
console.log('');
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* What is wrong with a command's arguments, or null. An option the command does not take was ignored, so
|
|
224
|
+
* `compose --chek` composed over the tree it was meant to check; an option's value was taken on trust, so
|
|
225
|
+
* `--project --quiet` named a directory called `--quiet`, and a `--project` with nothing after it crashed.
|
|
226
|
+
*
|
|
227
|
+
* @param {string} name - The command.
|
|
228
|
+
* @param {string[]} argv - Its arguments.
|
|
229
|
+
* @returns {string|null}
|
|
230
|
+
*/
|
|
231
|
+
function refusal(name, argv) {
|
|
232
|
+
const c = COMMANDS[name];
|
|
233
|
+
// Each option, and the name of the value it takes, if any: `--since <date>` takes a date.
|
|
234
|
+
const takes = new Map(Object.keys({ ...c.options, ...EVERYWHERE }).map((k) => [k.split(' ')[0], k.split(' ')[1] ?? null]));
|
|
235
|
+
const positional = [];
|
|
236
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
237
|
+
const a = argv[i];
|
|
238
|
+
if (!a.startsWith('-')) {
|
|
239
|
+
positional.push(a);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
if (!takes.has(a)) return `${name} takes no option ${a}`;
|
|
243
|
+
if (takes.get(a)) {
|
|
244
|
+
if (i + 1 >= argv.length || argv[i + 1].startsWith('--')) return `${a} needs a value`;
|
|
245
|
+
// Compared as text against the days of the store, anything else — `7d` — matched nothing, or everything.
|
|
246
|
+
if (takes.get(a) === '<date>' && !/^\d{4}-\d{2}-\d{2}$/.test(argv[i + 1])) return `${a} takes a day as YYYY-MM-DD, and was given ${argv[i + 1]}`;
|
|
247
|
+
i += 1;
|
|
74
248
|
}
|
|
75
249
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
console.log(' --to <version> upgrade: the core to move to');
|
|
80
|
-
console.log(' --check compose: report drift instead of writing');
|
|
81
|
-
console.log(' --quiet compose/pills: say nothing unless something is wrong');
|
|
82
|
-
console.log(' --apply upgrade: write the new version, once it is safe');
|
|
83
|
-
console.log(' --since <date> stats: YYYY-MM-DD');
|
|
84
|
-
console.log(' --snapshots <dir> stats: read the history from somewhere else');
|
|
85
|
-
console.log(' --out <dir> snapshot: where to write\n');
|
|
250
|
+
const allowed = c.args ? 1 : 0;
|
|
251
|
+
if (positional.length > allowed) return `${name} takes ${allowed === 0 ? 'no argument' : `one argument, ${c.args}`}, and was given ${positional.slice(allowed).join(' ')}`;
|
|
252
|
+
return null;
|
|
86
253
|
}
|
|
87
254
|
|
|
88
255
|
/** Entry point. */
|
|
@@ -100,18 +267,25 @@ async function main() {
|
|
|
100
267
|
if (!argv.includes('--quiet') && !argv.includes('--hook') && !process.env.NINA_SHELL) printBanner(pkg.version);
|
|
101
268
|
|
|
102
269
|
if (!name || name === 'help' || name === '--help' || name === '-h') {
|
|
103
|
-
help();
|
|
270
|
+
if (name === 'help' && COMMANDS[argv[0]]) commandHelp(argv[0]);
|
|
271
|
+
else help();
|
|
104
272
|
return 0;
|
|
105
273
|
}
|
|
106
274
|
const command = COMMANDS[name];
|
|
107
275
|
if (!command) {
|
|
108
|
-
if (PLANNED[name]) {
|
|
109
|
-
console.error(` "${name}" is planned, not built yet — see \`nina help\`.\n`);
|
|
110
|
-
return 2;
|
|
111
|
-
}
|
|
112
276
|
console.error(` unknown command "${name}" — see \`nina help\`.\n`);
|
|
113
277
|
return 2;
|
|
114
278
|
}
|
|
279
|
+
// Before anything runs: `nina init --help` used to initialise the working directory.
|
|
280
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
281
|
+
commandHelp(name);
|
|
282
|
+
return 0;
|
|
283
|
+
}
|
|
284
|
+
const wrong = refusal(name, argv);
|
|
285
|
+
if (wrong) {
|
|
286
|
+
console.error(` ${wrong} — \`nina ${name} --help\` lists what it takes. Nothing was run.\n`);
|
|
287
|
+
return 2;
|
|
288
|
+
}
|
|
115
289
|
return command.run(argv, { root: ROOT });
|
|
116
290
|
}
|
|
117
291
|
|
package/package.json
CHANGED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Known gaps
|
|
2
|
+
|
|
3
|
+
The harness was extracted by slicing one live project, and a slice cannot be cleaner than the
|
|
4
|
+
thing it was cut from. This file tracks what is still shaped by that origin.
|
|
5
|
+
|
|
6
|
+
## Closed
|
|
7
|
+
|
|
8
|
+
**Domain examples in the core.** The extraction had to leave money and PII nouns in otherwise
|
|
9
|
+
invariant rules, because byte-exact recomposition was the proof that nothing was lost and
|
|
10
|
+
rewriting a line broke it. Once projects started pinning a release, that constraint lifted:
|
|
11
|
+
the core no longer names payouts, escrow, KYC, PIX, CPF or a single provider, and the
|
|
12
|
+
`db` surface no longer assumes the write it protects is a money movement. `fixtures/acme`
|
|
13
|
+
holds the line — it declares no `money` and no `pii` surface, and the test fails on any of
|
|
14
|
+
those words reappearing.
|
|
15
|
+
|
|
16
|
+
**The single-provider assumption.** `external-api` became `integrations`, plural, cut by how
|
|
17
|
+
a premise is settled (`installed-library` / `live-api` / `platform-binding`) rather than by
|
|
18
|
+
one project's payment provider.
|
|
19
|
+
|
|
20
|
+
**The `money` surface was one project's money path.** It shipped that project's state machine
|
|
21
|
+
(`DETECTADA → CASADA | DIVERGENTE | SEM_REGRA`) as a harness rule, named its models, its
|
|
22
|
+
currency and its escrow vocabulary, and assumed one payment provider. It now states the
|
|
23
|
+
invariants and nothing else: conservation, idempotency of an irreversible send, one
|
|
24
|
+
serialization point per balance, integer minor units, and a state machine the **project**
|
|
25
|
+
declares in its own `.claude/architecture.md`. `fixtures/ledger` holds that line — a money
|
|
26
|
+
project whose minor unit is `cents`, whose engine is `packages/settlement`, and whose deny
|
|
27
|
+
list fails on `escrow`, `centavos`, `Payout`, `DETECTADA` or any of the rest reappearing.
|
|
28
|
+
|
|
29
|
+
**The `pii` surface was one country's regime.** It named CPF/CNPJ, PIX keys, KYC documents, LGPD,
|
|
30
|
+
R2 and Postgres as if they were universal categories. It now says that sensitive categories are
|
|
31
|
+
**declared by the project** in its own `.claude/architecture.md`, and states what is invariant:
|
|
32
|
+
classified, encrypted at rest, never in a log, an error, a URL, an analytics event or an agent
|
|
33
|
+
transcript, and document bytes only in the object store. `fixtures/ledger` declares `pii` with a
|
|
34
|
+
`GDPR` regime and fails on any of the old words returning.
|
|
35
|
+
|
|
36
|
+
**Incident dates that read as false history.** Five places told a rule through a date it happened
|
|
37
|
+
on — a wiped database on 2026-09-16, a blocked deploy on 2026-09-21, specs split across two
|
|
38
|
+
directories before 2026-09-04. In the project where it happened that is provenance; in a new one it
|
|
39
|
+
is a claim about a past it does not have, and an agent will go looking for it. The rules keep their
|
|
40
|
+
force without the date: *"the command completes with a reassuring 'empty migration' result and no
|
|
41
|
+
error, having already destroyed everything in the database it was pointed at."*
|
|
42
|
+
|
|
43
|
+
**A rule cross-reference that pointed at nothing.** The hard rules are one numbered list assembled
|
|
44
|
+
from several layers, so a project that declares no `integrations` surface has no rule 12 — while the
|
|
45
|
+
core still said "the premise rule (#12 below)". `compose-test` now checks every `Hard Rule #N`
|
|
46
|
+
against the rules the project actually composed, and `fixtures/plain` declares no surface at all, so
|
|
47
|
+
the most reduced case is exercised on every run.
|
|
48
|
+
|
|
49
|
+
**Invariant rules that landed in the project layer.** Four rules were generically valuable but were
|
|
50
|
+
stated through an incident or an inventory belonging to one project, so the project layer swallowed
|
|
51
|
+
them and a new project got nothing. Each was restated in the layer that actually owns it:
|
|
52
|
+
|
|
53
|
+
| Spec | What it got back |
|
|
54
|
+
|---|---|
|
|
55
|
+
| secops | the **AuthN / session** dimension is now core: credential issuance and consumption, cookie flags, fixation across a privilege change, origin allowlist, and any dev bypass that could reach production. The project slot survives for the auth library and the bypasses that project actually has. |
|
|
56
|
+
| qa | the *"pre-existing failure"* traps moved to `surfaces/frontend` — they are facts about a jsdom + vitest harness, not about one feature. The project slot held only the provenance, so it was dropped. |
|
|
57
|
+
| architect, implementer | both specs now state the Route → Service → Data rule themselves instead of only `patterns.md` stating it. The project slot survives for the package names. |
|
|
58
|
+
| patterns | *"when correcting a document, delete what you are correcting"* is now a core section. |
|
|
59
|
+
|
|
60
|
+
**The threat model was numbered, and the numbers came from slots.** Dimensions 1–8 lived in surface
|
|
61
|
+
fragments and 9–10 in the core, so a project declaring every surface got 1–10 and everyone else got
|
|
62
|
+
a list with holes: `acme` read `2, 3, 6, 8, 9, 10`, and a surfaceless project began at **9**. The
|
|
63
|
+
list is bullets now, valid under any combination. The core's rate-limiting dimension also named one
|
|
64
|
+
project's auth strategy (`magic-link request, dev routes`); it says `issues a credential` instead.
|
|
65
|
+
|
|
66
|
+
**A surface's technology was named in files nothing gated.** The item above used to bundle two
|
|
67
|
+
different things under "stack-specific", and only one of them was a choice. `Prisma` appeared in 7
|
|
68
|
+
ungated core files and Cloudflare's runtime in 10 — technologies that already *have* surfaces, named
|
|
69
|
+
in text every project composes. A frontend-only project read a `CLAUDE.md` that discussed Prisma, a
|
|
70
|
+
`patterns.md` headed *API (Cloudflare Worker / Hono) conventions*, and a qa spec telling it to kill
|
|
71
|
+
stray `workerd` processes that could not exist. The reviewer even pointed at `CLAUDE.md` §
|
|
72
|
+
*Cloudflare plugin skills*, a section that lives in the edge-cf surface — a dangling cross-reference
|
|
73
|
+
of exactly the kind already closed once here.
|
|
74
|
+
|
|
75
|
+
42 sites were fixed by saying what the rule means rather than which product implements it: "if the
|
|
76
|
+
database was touched" instead of "if Prisma touched", "deploy config" instead of "wrangler config",
|
|
77
|
+
"the local emulator" instead of "Miniflare". None of it lost precision, because the instruction was
|
|
78
|
+
never about the product. Where a genuine specific was worth keeping it moved into `surfaces/edge-cf`
|
|
79
|
+
behind a slot.
|
|
80
|
+
|
|
81
|
+
The deny lists never caught this, and could not: they guard one fixture's output against *domain*
|
|
82
|
+
leaks, and a substring match makes a word like `Hono` unusable because it fires on `Honor`. The
|
|
83
|
+
guard is now a layer audit in `compose:test` — for every core file, a surface's technology may be
|
|
84
|
+
named only if the file is gated on that surface. It asks the question once, of everything, instead
|
|
85
|
+
of only of what a fixture happens to compose.
|
|
86
|
+
|
|
87
|
+
**Money in the core, and the heavy-gate list that carried it.** The extraction closed money's nouns
|
|
88
|
+
(payout, escrow, the state machine) but not the word itself: ten places in the core listed "money, the
|
|
89
|
+
database, auth, an integration" as the changes that are always gated in full, so a project with no
|
|
90
|
+
money was told that under-gating a money movement was a protocol violation, and its devops that a
|
|
91
|
+
production deploy "moves real money". The audit now holds `money` like a technology, and found 19 of
|
|
92
|
+
them. The list is one definition of **critical paths** in `CLAUDE.md` — auth in the core, and the
|
|
93
|
+
database, an integration boundary, money movement, personal data and contract code each added by its
|
|
94
|
+
own surface — and the ten places say "a critical path". Two copies of money's own rules had also
|
|
95
|
+
landed in `surfaces/db` (`BigInt` columns, a money-integrity check in the dba's report), contradicting
|
|
96
|
+
the money surface's integer minor unit; they are gone, since the money surface already says it better.
|
|
97
|
+
The same pass found Cloudflare's `Pages`, `Worker` and a capitalised `Wrangler` in the core and in
|
|
98
|
+
two surfaces, and the leftovers no audit could name: a model called `DestinationAccount` and a spec
|
|
99
|
+
set called `retention-spec1..8` in the router's examples, "all nine stages" where a profile composes
|
|
100
|
+
seven to eleven, `userId` as the name of owner scoping, and "the harness's first three months" told
|
|
101
|
+
as the history of whichever project was reading it.
|
|
102
|
+
|
|
103
|
+
## Open
|
|
104
|
+
|
|
105
|
+
**The core is domain-agnostic, not stack-agnostic — deliberately.** The stack's own commands are
|
|
106
|
+
vocabulary now, with the release's defaults (`core/vocabulary.json`): the typecheck, lint and build
|
|
107
|
+
commands a spec tells a stage to run, and the test command every stage but qa is told not to run. qa's
|
|
108
|
+
own targeted `vitest run` stays literal. What remains is the stack's substance, not its commands:
|
|
109
|
+
`vitest` and its memory discipline, `TSDoc`, `TypeScript`, `turbo`, and `pnpm` wherever a sentence
|
|
110
|
+
describes the workspace rather than a command to run. That is the single track
|
|
111
|
+
this harness is for, and most of it is load-bearing: the qa spec's memory discipline is a fact about
|
|
112
|
+
vitest, not about testing. Unlike the surface leak above, this is not a defect — there is no
|
|
113
|
+
`pnpm` surface a project could decline. It becomes a gap only when a project on another stack
|
|
114
|
+
appears. The `.js`-extension and barrel-export rules are the sharpest case — they assume a
|
|
115
|
+
TypeScript monorepo that emits `dist/`, and `fixtures/plain` needs `PKG_SCOPE` and `EMITTING_PKGS`
|
|
116
|
+
in its vocabulary to compose at all. If a second stack ever arrives, those are a `ts-monorepo`
|
|
117
|
+
surface, not core.
|
|
118
|
+
|
|
119
|
+
**A composed project is not a finished project — by design.** With no project layer, `CLAUDE.md`
|
|
120
|
+
still opens with blank lines and no title, mission or stack. That is not a defect to fix in the
|
|
121
|
+
core: the missing text is the part only this project can say. `init` conducts the interview and
|
|
122
|
+
writes it to `.nina/TODO.md`, and it deliberately writes **no stub fragments**, because a stub is
|
|
123
|
+
a filled slot as far as every tool is concerned — a tree of TODOs would compose and check clean
|
|
124
|
+
while saying nothing. So `compose` keeps naming the unfilled slots until a person fills them, and
|
|
125
|
+
the blank opening is that list being honest rather than the core being incomplete.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"2026-09-22-integration-tester__regenerate-the-premise-index-after-editing-an-integration-doc": {
|
|
3
|
+
"in": "core/tree/.claude/agents/integration-tester.md"
|
|
4
|
+
},
|
|
5
|
+
"2026-09-22-qa__exit-code-is-the-verdict": {
|
|
6
|
+
"in": "core/tree/.claude/agents/qa.md"
|
|
7
|
+
},
|
|
8
|
+
"2026-09-22-shared__test-must-name-the-mutation-that-fails-it": {
|
|
9
|
+
"in": "core/tree/.claude/agents/reviewer.md"
|
|
10
|
+
},
|
|
11
|
+
"2026-09-25-shared__docs-match-final-code": {
|
|
12
|
+
"in": "core/tree/.claude/agents/implementer.md"
|
|
13
|
+
},
|
|
14
|
+
"2026-09-25-shared__fail-closed-on-every-branch": {
|
|
15
|
+
"in": "core/tree/.claude/agents/implementer.md"
|
|
16
|
+
},
|
|
17
|
+
"2026-09-25-shared__test-must-fail-under-its-mutation": {
|
|
18
|
+
"in": "core/tree/.claude/agents/implementer.md"
|
|
19
|
+
},
|
|
20
|
+
"2026-09-25-shared__tsdoc-covers-members": {
|
|
21
|
+
"in": "core/tree/CLAUDE.md"
|
|
22
|
+
},
|
|
23
|
+
"2026-09-26-architect__revision-sweeps-contradicted-text": {
|
|
24
|
+
"in": "core/tree/.claude/agents/architect.md"
|
|
25
|
+
},
|
|
26
|
+
"2026-09-26-shared__validate-patterns-against-real-samples": {
|
|
27
|
+
"in": "core/tree/.claude/agents/implementer.md"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!-- nina:slot project.7 -->
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<!-- nina:slot project.1 -->
|
|
2
|
+
description: Use when a diff touches the schema, a migration or a query, in the same message as the reviewer. Architect and implementer may also ask it while designing one. Checks migration safety, query cost and indexes, cache and freshness rules, and data integrity, and returns APPROVED or REJECTED. The reviewer does not approve without its sign-off. Never writes application code.
|
|
3
|
+
<!-- nina:slot project.4 -->
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!-- nina:slot project.4 -->
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!-- nina:slot project.4 -->
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<!-- nina:slot project.1 -->
|
|
2
|
+
description: Use when a diff touches an integration boundary, meaning a service, library or platform binding whose behavior this project does not define. Verifies each premise against the real dependency rather than the mock, and returns APPROVED or REJECTED. A wrong premise goes back to the architect, code that does not honor a premise to the implementer.
|
|
3
|
+
<!-- nina:slot project.5 -->
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<!-- nina:slot project.1 -->
|
|
2
|
+
description: Use after the reviewer approves. Runs the tests of the packages the diff touched, once and never beside another test run, and returns PASS or FAIL with the exit code as the verdict. A failure loops back to the implementer, or to the architect when the test is right and the spec was wrong. Never writes code.
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<!-- nina:slot project.1 -->
|
|
2
|
+
description: Use after the implementer produces a diff, in the same message as every gate the diff triggered. Audits the diff against the architect's spec, runs typecheck, lint and build (never the tests, which qa runs after approval), and names every gate the diff triggers, which run beside it; qa waits for all of them. Returns APPROVED or REJECTED. Read-only, never fixes.
|
|
3
|
+
<!-- nina:slot project.3 -->
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<!-- nina:slot project.1 -->
|
|
2
|
+
description: Use after the last step of a milestone passes qa, or when the owner asks for a security pass. Audits the assembled system as an attacker and as a privacy and compliance auditor, scoped to the milestone's diff, and returns SECURE or BLOCKED with each finding's severity. Not a substitute for the reviewer. Writes nothing to the repo.
|
|
3
|
+
<!-- nina:slot project.7 -->
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<!-- nina:slot project.1 -->
|
|
2
|
+
description: Use on any diff that touches a contract, a deploy script, or a library version the contracts import, wherever the pipeline is. Audits the diff as an attacker before anything deploys, and returns APPROVED or REJECTED with the path and call sequence of each finding. The reviewer does not approve, and devops does not deploy, without its sign-off.
|
|
3
|
+
<!-- nina:slot project.5 -->
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<!-- nina:slot project.1 -->
|
|
2
|
+
description: Use when the architect's spec changes contract code. Writes the contract change and its adversarial tests, treating deployed code as immutable, so work that cannot be made safe as specified is BLOCKED rather than merged with a follow-up. Hands its diff to the solidity-auditor.
|
|
3
|
+
<!-- nina:slot project.5 -->
|