@xhulz/nina 0.52.0 → 0.53.1
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/README.md +4 -0
- package/bin/nina.mjs +29 -5
- package/package.json +1 -1
- package/releases/0.53.0/core/GAPS.md +125 -0
- package/releases/0.53.0/core/answered.json +68 -0
- package/releases/0.53.0/core/defaults/tree/.claude/agents/architect.md +1 -0
- package/releases/0.53.0/core/defaults/tree/.claude/agents/dba.md +3 -0
- package/releases/0.53.0/core/defaults/tree/.claude/agents/devops.md +1 -0
- package/releases/0.53.0/core/defaults/tree/.claude/agents/implementer.md +1 -0
- package/releases/0.53.0/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.53.0/core/defaults/tree/.claude/agents/qa.md +7 -0
- package/releases/0.53.0/core/defaults/tree/.claude/agents/reviewer.md +3 -0
- package/releases/0.53.0/core/defaults/tree/.claude/agents/secops.md +3 -0
- package/releases/0.53.0/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
- package/releases/0.53.0/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
- package/releases/0.53.0/core/tree/.claude/agents/architect.md +129 -0
- package/releases/0.53.0/core/tree/.claude/agents/dba.md +117 -0
- package/releases/0.53.0/core/tree/.claude/agents/devops.md +118 -0
- package/releases/0.53.0/core/tree/.claude/agents/implementer.md +163 -0
- package/releases/0.53.0/core/tree/.claude/agents/integration-tester.md +168 -0
- package/releases/0.53.0/core/tree/.claude/agents/planner.md +132 -0
- package/releases/0.53.0/core/tree/.claude/agents/qa.md +150 -0
- package/releases/0.53.0/core/tree/.claude/agents/reviewer.md +184 -0
- package/releases/0.53.0/core/tree/.claude/agents/secops.md +120 -0
- package/releases/0.53.0/core/tree/.claude/agents/solidity-auditor.md +126 -0
- package/releases/0.53.0/core/tree/.claude/agents/solidity-dev.md +123 -0
- package/releases/0.53.0/core/tree/.claude/agents-overview.md +64 -0
- package/releases/0.53.0/core/tree/.claude/frontend.md +10 -0
- package/releases/0.53.0/core/tree/.claude/graph.md +75 -0
- package/releases/0.53.0/core/tree/.claude/patterns.md +251 -0
- package/releases/0.53.0/core/tree/.claude/pills/README.md +150 -0
- package/releases/0.53.0/core/tree/.claude/pipeline.md +101 -0
- package/releases/0.53.0/core/tree/.claude/retrieval.md +103 -0
- package/releases/0.53.0/core/tree/.claude/router.md +202 -0
- package/releases/0.53.0/core/tree/.claude/templates/integration.md +46 -0
- package/releases/0.53.0/core/tree/CLAUDE.md +164 -0
- package/releases/0.53.0/core/tree/scripts/cost-watch.mjs +25 -0
- package/releases/0.53.0/core/tree/scripts/edit-guard.mjs +24 -0
- package/releases/0.53.0/core/tree/scripts/harness-check.mjs +71 -0
- package/releases/0.53.0/core/tree/scripts/loop-gate.mjs +19 -0
- package/releases/0.53.0/core/vocabulary.json +13 -0
- package/releases/0.53.0/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
- package/releases/0.53.0/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
- package/releases/0.53.0/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
- package/releases/0.53.0/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
- package/releases/0.53.0/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
- package/releases/0.53.0/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
- package/releases/0.53.0/surfaces/blockchain/tree/.claude/graph.md +11 -0
- package/releases/0.53.0/surfaces/blockchain/tree/.claude/router.md +6 -0
- package/releases/0.53.0/surfaces/blockchain/tree/CLAUDE.md +12 -0
- package/releases/0.53.0/surfaces/d1/tree/.claude/agents/dba.md +15 -0
- package/releases/0.53.0/surfaces/d1/tree/.claude/agents/devops.md +2 -0
- package/releases/0.53.0/surfaces/d1/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.53.0/surfaces/d1/tree/.claude/patterns.md +8 -0
- package/releases/0.53.0/surfaces/d1/tree/CLAUDE.md +2 -0
- package/releases/0.53.0/surfaces/db/tree/.claude/agents/architect.md +5 -0
- package/releases/0.53.0/surfaces/db/tree/.claude/agents/dba.md +54 -0
- package/releases/0.53.0/surfaces/db/tree/.claude/agents/devops.md +5 -0
- package/releases/0.53.0/surfaces/db/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.53.0/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
- package/releases/0.53.0/surfaces/db/tree/.claude/agents/planner.md +2 -0
- package/releases/0.53.0/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
- package/releases/0.53.0/surfaces/db/tree/.claude/agents/secops.md +2 -0
- package/releases/0.53.0/surfaces/db/tree/.claude/agents-overview.md +5 -0
- package/releases/0.53.0/surfaces/db/tree/.claude/graph.md +8 -0
- package/releases/0.53.0/surfaces/db/tree/.claude/patterns.md +22 -0
- package/releases/0.53.0/surfaces/db/tree/.claude/pipeline.md +13 -0
- package/releases/0.53.0/surfaces/db/tree/.claude/retrieval.md +5 -0
- package/releases/0.53.0/surfaces/db/tree/.claude/router.md +4 -0
- package/releases/0.53.0/surfaces/db/tree/CLAUDE.md +17 -0
- package/releases/0.53.0/surfaces/drizzle/tree/.claude/agents/dba.md +9 -0
- package/releases/0.53.0/surfaces/drizzle/tree/.claude/agents/devops.md +5 -0
- package/releases/0.53.0/surfaces/drizzle/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.53.0/surfaces/drizzle/tree/.claude/patterns.md +7 -0
- package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
- package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
- package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/devops.md +29 -0
- package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
- package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
- package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
- package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
- package/releases/0.53.0/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
- package/releases/0.53.0/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
- package/releases/0.53.0/surfaces/edge-cf/tree/CLAUDE.md +27 -0
- package/releases/0.53.0/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
- package/releases/0.53.0/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
- package/releases/0.53.0/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
- package/releases/0.53.0/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
- package/releases/0.53.0/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
- package/releases/0.53.0/surfaces/frontend/tree/.claude/patterns.md +8 -0
- package/releases/0.53.0/surfaces/frontend/tree/.claude/retrieval.md +2 -0
- package/releases/0.53.0/surfaces/frontend/tree/.claude/router.md +14 -0
- package/releases/0.53.0/surfaces/frontend/tree/CLAUDE.md +5 -0
- package/releases/0.53.0/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
- package/releases/0.53.0/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
- package/releases/0.53.0/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
- package/releases/0.53.0/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
- package/releases/0.53.0/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
- package/releases/0.53.0/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
- package/releases/0.53.0/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
- package/releases/0.53.0/surfaces/integrations/tree/.claude/graph.md +10 -0
- package/releases/0.53.0/surfaces/integrations/tree/.claude/patterns.md +38 -0
- package/releases/0.53.0/surfaces/integrations/tree/.claude/pipeline.md +16 -0
- package/releases/0.53.0/surfaces/integrations/tree/.claude/retrieval.md +16 -0
- package/releases/0.53.0/surfaces/integrations/tree/.claude/router.md +6 -0
- package/releases/0.53.0/surfaces/integrations/tree/CLAUDE.md +17 -0
- package/releases/0.53.0/surfaces/money/tree/.claude/agents/architect.md +12 -0
- package/releases/0.53.0/surfaces/money/tree/.claude/agents/dba.md +14 -0
- package/releases/0.53.0/surfaces/money/tree/.claude/agents/implementer.md +11 -0
- package/releases/0.53.0/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.53.0/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
- package/releases/0.53.0/surfaces/money/tree/.claude/agents/secops.md +5 -0
- package/releases/0.53.0/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
- package/releases/0.53.0/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
- package/releases/0.53.0/surfaces/money/tree/.claude/graph.md +2 -0
- package/releases/0.53.0/surfaces/money/tree/.claude/patterns.md +49 -0
- package/releases/0.53.0/surfaces/money/tree/.claude/pipeline.md +2 -0
- package/releases/0.53.0/surfaces/money/tree/.claude/retrieval.md +2 -0
- package/releases/0.53.0/surfaces/money/tree/CLAUDE.md +11 -0
- package/releases/0.53.0/surfaces/pii/tree/.claude/agents/dba.md +2 -0
- package/releases/0.53.0/surfaces/pii/tree/.claude/agents/devops.md +8 -0
- package/releases/0.53.0/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.53.0/surfaces/pii/tree/.claude/agents/secops.md +2 -0
- package/releases/0.53.0/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
- package/releases/0.53.0/surfaces/pii/tree/CLAUDE.md +5 -0
- package/releases/0.53.0/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
- package/releases/0.53.0/surfaces/prisma/tree/.claude/agents/dba.md +42 -0
- package/releases/0.53.0/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
- package/releases/0.53.0/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.53.0/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
- package/releases/0.53.0/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
- package/releases/0.53.0/surfaces/prisma/tree/.claude/patterns.md +15 -0
- package/releases/0.53.0/surfaces/prisma/tree/CLAUDE.md +5 -0
- package/releases/0.53.1/core/GAPS.md +125 -0
- package/releases/0.53.1/core/answered.json +68 -0
- package/releases/0.53.1/core/defaults/tree/.claude/agents/architect.md +1 -0
- package/releases/0.53.1/core/defaults/tree/.claude/agents/dba.md +3 -0
- package/releases/0.53.1/core/defaults/tree/.claude/agents/devops.md +1 -0
- package/releases/0.53.1/core/defaults/tree/.claude/agents/implementer.md +1 -0
- package/releases/0.53.1/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.53.1/core/defaults/tree/.claude/agents/qa.md +7 -0
- package/releases/0.53.1/core/defaults/tree/.claude/agents/reviewer.md +3 -0
- package/releases/0.53.1/core/defaults/tree/.claude/agents/secops.md +3 -0
- package/releases/0.53.1/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
- package/releases/0.53.1/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
- package/releases/0.53.1/core/tree/.claude/agents/architect.md +129 -0
- package/releases/0.53.1/core/tree/.claude/agents/dba.md +117 -0
- package/releases/0.53.1/core/tree/.claude/agents/devops.md +118 -0
- package/releases/0.53.1/core/tree/.claude/agents/implementer.md +163 -0
- package/releases/0.53.1/core/tree/.claude/agents/integration-tester.md +168 -0
- package/releases/0.53.1/core/tree/.claude/agents/planner.md +132 -0
- package/releases/0.53.1/core/tree/.claude/agents/qa.md +150 -0
- package/releases/0.53.1/core/tree/.claude/agents/reviewer.md +184 -0
- package/releases/0.53.1/core/tree/.claude/agents/secops.md +120 -0
- package/releases/0.53.1/core/tree/.claude/agents/solidity-auditor.md +126 -0
- package/releases/0.53.1/core/tree/.claude/agents/solidity-dev.md +123 -0
- package/releases/0.53.1/core/tree/.claude/agents-overview.md +64 -0
- package/releases/0.53.1/core/tree/.claude/frontend.md +10 -0
- package/releases/0.53.1/core/tree/.claude/graph.md +75 -0
- package/releases/0.53.1/core/tree/.claude/patterns.md +251 -0
- package/releases/0.53.1/core/tree/.claude/pills/README.md +150 -0
- package/releases/0.53.1/core/tree/.claude/pipeline.md +101 -0
- package/releases/0.53.1/core/tree/.claude/retrieval.md +103 -0
- package/releases/0.53.1/core/tree/.claude/router.md +202 -0
- package/releases/0.53.1/core/tree/.claude/templates/integration.md +46 -0
- package/releases/0.53.1/core/tree/CLAUDE.md +164 -0
- package/releases/0.53.1/core/tree/scripts/cost-watch.mjs +25 -0
- package/releases/0.53.1/core/tree/scripts/edit-guard.mjs +24 -0
- package/releases/0.53.1/core/tree/scripts/harness-check.mjs +71 -0
- package/releases/0.53.1/core/tree/scripts/loop-gate.mjs +19 -0
- package/releases/0.53.1/core/vocabulary.json +13 -0
- package/releases/0.53.1/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
- package/releases/0.53.1/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
- package/releases/0.53.1/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
- package/releases/0.53.1/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
- package/releases/0.53.1/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
- package/releases/0.53.1/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
- package/releases/0.53.1/surfaces/blockchain/tree/.claude/graph.md +11 -0
- package/releases/0.53.1/surfaces/blockchain/tree/.claude/router.md +6 -0
- package/releases/0.53.1/surfaces/blockchain/tree/CLAUDE.md +12 -0
- package/releases/0.53.1/surfaces/d1/tree/.claude/agents/dba.md +15 -0
- package/releases/0.53.1/surfaces/d1/tree/.claude/agents/devops.md +2 -0
- package/releases/0.53.1/surfaces/d1/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.53.1/surfaces/d1/tree/.claude/patterns.md +8 -0
- package/releases/0.53.1/surfaces/d1/tree/CLAUDE.md +2 -0
- package/releases/0.53.1/surfaces/db/tree/.claude/agents/architect.md +5 -0
- package/releases/0.53.1/surfaces/db/tree/.claude/agents/dba.md +54 -0
- package/releases/0.53.1/surfaces/db/tree/.claude/agents/devops.md +5 -0
- package/releases/0.53.1/surfaces/db/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.53.1/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
- package/releases/0.53.1/surfaces/db/tree/.claude/agents/planner.md +2 -0
- package/releases/0.53.1/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
- package/releases/0.53.1/surfaces/db/tree/.claude/agents/secops.md +2 -0
- package/releases/0.53.1/surfaces/db/tree/.claude/agents-overview.md +5 -0
- package/releases/0.53.1/surfaces/db/tree/.claude/graph.md +8 -0
- package/releases/0.53.1/surfaces/db/tree/.claude/patterns.md +22 -0
- package/releases/0.53.1/surfaces/db/tree/.claude/pipeline.md +13 -0
- package/releases/0.53.1/surfaces/db/tree/.claude/retrieval.md +5 -0
- package/releases/0.53.1/surfaces/db/tree/.claude/router.md +4 -0
- package/releases/0.53.1/surfaces/db/tree/CLAUDE.md +17 -0
- package/releases/0.53.1/surfaces/drizzle/tree/.claude/agents/dba.md +9 -0
- package/releases/0.53.1/surfaces/drizzle/tree/.claude/agents/devops.md +5 -0
- package/releases/0.53.1/surfaces/drizzle/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.53.1/surfaces/drizzle/tree/.claude/patterns.md +7 -0
- package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
- package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
- package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/devops.md +29 -0
- package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
- package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
- package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
- package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
- package/releases/0.53.1/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
- package/releases/0.53.1/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
- package/releases/0.53.1/surfaces/edge-cf/tree/CLAUDE.md +27 -0
- package/releases/0.53.1/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
- package/releases/0.53.1/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
- package/releases/0.53.1/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
- package/releases/0.53.1/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
- package/releases/0.53.1/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
- package/releases/0.53.1/surfaces/frontend/tree/.claude/patterns.md +8 -0
- package/releases/0.53.1/surfaces/frontend/tree/.claude/retrieval.md +2 -0
- package/releases/0.53.1/surfaces/frontend/tree/.claude/router.md +14 -0
- package/releases/0.53.1/surfaces/frontend/tree/CLAUDE.md +5 -0
- package/releases/0.53.1/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
- package/releases/0.53.1/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
- package/releases/0.53.1/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
- package/releases/0.53.1/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
- package/releases/0.53.1/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
- package/releases/0.53.1/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
- package/releases/0.53.1/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
- package/releases/0.53.1/surfaces/integrations/tree/.claude/graph.md +10 -0
- package/releases/0.53.1/surfaces/integrations/tree/.claude/patterns.md +38 -0
- package/releases/0.53.1/surfaces/integrations/tree/.claude/pipeline.md +16 -0
- package/releases/0.53.1/surfaces/integrations/tree/.claude/retrieval.md +16 -0
- package/releases/0.53.1/surfaces/integrations/tree/.claude/router.md +6 -0
- package/releases/0.53.1/surfaces/integrations/tree/CLAUDE.md +17 -0
- package/releases/0.53.1/surfaces/money/tree/.claude/agents/architect.md +12 -0
- package/releases/0.53.1/surfaces/money/tree/.claude/agents/dba.md +14 -0
- package/releases/0.53.1/surfaces/money/tree/.claude/agents/implementer.md +11 -0
- package/releases/0.53.1/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.53.1/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
- package/releases/0.53.1/surfaces/money/tree/.claude/agents/secops.md +5 -0
- package/releases/0.53.1/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
- package/releases/0.53.1/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
- package/releases/0.53.1/surfaces/money/tree/.claude/graph.md +2 -0
- package/releases/0.53.1/surfaces/money/tree/.claude/patterns.md +49 -0
- package/releases/0.53.1/surfaces/money/tree/.claude/pipeline.md +2 -0
- package/releases/0.53.1/surfaces/money/tree/.claude/retrieval.md +2 -0
- package/releases/0.53.1/surfaces/money/tree/CLAUDE.md +11 -0
- package/releases/0.53.1/surfaces/pii/tree/.claude/agents/dba.md +2 -0
- package/releases/0.53.1/surfaces/pii/tree/.claude/agents/devops.md +8 -0
- package/releases/0.53.1/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.53.1/surfaces/pii/tree/.claude/agents/secops.md +2 -0
- package/releases/0.53.1/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
- package/releases/0.53.1/surfaces/pii/tree/CLAUDE.md +5 -0
- package/releases/0.53.1/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
- package/releases/0.53.1/surfaces/prisma/tree/.claude/agents/dba.md +42 -0
- package/releases/0.53.1/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
- package/releases/0.53.1/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.53.1/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
- package/releases/0.53.1/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
- package/releases/0.53.1/surfaces/prisma/tree/.claude/patterns.md +15 -0
- package/releases/0.53.1/surfaces/prisma/tree/CLAUDE.md +5 -0
- package/src/commands/dashboard.mjs +33 -0
- package/src/commands/learn.mjs +51 -19
- package/src/commands/pills.mjs +55 -28
- package/src/commands/pipeline.mjs +62 -33
- package/src/commands/runs.mjs +14 -3
- package/src/commands/stats.mjs +199 -107
- package/src/dashboard.html +331 -0
- package/src/dashboard.mjs +191 -0
- package/src/office.mjs +48 -83
- package/src/serve.mjs +108 -0
package/src/office.mjs
CHANGED
|
@@ -22,7 +22,6 @@
|
|
|
22
22
|
* a click on a link, beside the conversation once `workbench.browser.openLocalhostLinks` is on (1.140).
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
-
import { spawn } from 'node:child_process';
|
|
26
25
|
import { readFileSync, statSync } from 'node:fs';
|
|
27
26
|
import { createServer } from 'node:http';
|
|
28
27
|
import { basename, dirname, join } from 'node:path';
|
|
@@ -34,6 +33,7 @@ import { projectStoreFile, readStoreFile } from './store.mjs';
|
|
|
34
33
|
import { IN_FLIGHT, cyclesOf } from './commands/stats.mjs';
|
|
35
34
|
import { isLoopBack } from './transcripts.mjs';
|
|
36
35
|
import { shapeOf } from './commands/pipeline.mjs';
|
|
36
|
+
import { listenHere, openInBrowser, refuseElsewhere, untilStopped } from './serve.mjs';
|
|
37
37
|
|
|
38
38
|
/** The page, one self-contained file: the room, the sprites and the animation, with nothing fetched from anywhere. */
|
|
39
39
|
const PAGE = join(dirname(fileURLToPath(import.meta.url)), 'office.html');
|
|
@@ -307,14 +307,14 @@ export function officeRoom(target) {
|
|
|
307
307
|
const send = (res, event, data) => res.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
|
|
308
308
|
|
|
309
309
|
/**
|
|
310
|
-
*
|
|
311
|
-
*
|
|
312
|
-
*
|
|
310
|
+
* The office's paths, for a server to mount: the page and its stream of beats and timeline, polling the ledger while
|
|
311
|
+
* anyone watches live. `serveOffice` mounts them at the root; the dashboard (`nina dashboard`) at `/office/`, where the
|
|
312
|
+
* page's relative `events` reaches `/office/events`.
|
|
313
313
|
*
|
|
314
|
-
* @param {{target: string, wanted?: string, replay?: boolean
|
|
315
|
-
* @returns {
|
|
314
|
+
* @param {{target: string, wanted?: string, replay?: boolean}} options
|
|
315
|
+
* @returns {{handle: (req: import('node:http').IncomingMessage, res: import('node:http').ServerResponse, path: string) => boolean, close: () => void}}
|
|
316
316
|
*/
|
|
317
|
-
export
|
|
317
|
+
export function officeRoutes({ target, wanted, replay = false }) {
|
|
318
318
|
const room = officeRoom(target);
|
|
319
319
|
const graph = parseGraph(readFileSync(join(target, '.claude', 'graph.md'), 'utf8'));
|
|
320
320
|
// A function, so a `$&` or `$'` in a project's name or its owner's is text and not a replacement pattern.
|
|
@@ -418,20 +418,16 @@ export async function serveOffice({ target, wanted, replay = false, port = OFFIC
|
|
|
418
418
|
next();
|
|
419
419
|
};
|
|
420
420
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
res.end('not from here\n');
|
|
428
|
-
return;
|
|
429
|
-
}
|
|
430
|
-
const path = new URL(req.url ?? '/', 'http://localhost').pathname;
|
|
421
|
+
/**
|
|
422
|
+
* Serves the office's own paths — `/` and `/events`, relative to where it is mounted — and says whether it did.
|
|
423
|
+
*
|
|
424
|
+
* @returns {boolean}
|
|
425
|
+
*/
|
|
426
|
+
const handle = (req, res, path) => {
|
|
431
427
|
if (path === '/') {
|
|
432
428
|
res.writeHead(200, { 'content-type': 'text/html; charset=utf-8', 'cache-control': 'no-store' });
|
|
433
429
|
res.end(page);
|
|
434
|
-
return;
|
|
430
|
+
return true;
|
|
435
431
|
}
|
|
436
432
|
if (path === '/events') {
|
|
437
433
|
res.writeHead(200, { 'content-type': 'text/event-stream', 'cache-control': 'no-store', connection: 'keep-alive' });
|
|
@@ -441,79 +437,53 @@ export async function serveOffice({ target, wanted, replay = false, port = OFFIC
|
|
|
441
437
|
req.on('close', () => clients.delete(client));
|
|
442
438
|
if (replay) play(client);
|
|
443
439
|
else tick();
|
|
444
|
-
return;
|
|
440
|
+
return true;
|
|
445
441
|
}
|
|
442
|
+
return false;
|
|
443
|
+
};
|
|
444
|
+
|
|
445
|
+
const poll = setInterval(tick, POLL_MS);
|
|
446
|
+
const close = () => {
|
|
447
|
+
clearInterval(poll);
|
|
448
|
+
for (const timer of timers) clearTimeout(timer);
|
|
449
|
+
for (const client of clients) client.res.end();
|
|
450
|
+
clients.clear();
|
|
451
|
+
};
|
|
452
|
+
return { handle, close };
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Serves the office on its own: the page at `/`, its beats at `/events` as server-sent events (`officeRoutes`). Live,
|
|
457
|
+
* each client is handed the session's beats so far to set the room by, at once, and then each new one as the gate
|
|
458
|
+
* writes it, following the newest session unless one was named; a replay plays one session from its start, its gaps
|
|
459
|
+
* shortened.
|
|
460
|
+
*
|
|
461
|
+
* @param {{target: string, wanted?: string, replay?: boolean, port?: number}} options
|
|
462
|
+
* @returns {Promise<{url: string, close: () => Promise<void>}>}
|
|
463
|
+
*/
|
|
464
|
+
export async function serveOffice({ target, wanted, replay = false, port = OFFICE_PORT }) {
|
|
465
|
+
const routes = officeRoutes({ target, wanted, replay });
|
|
466
|
+
const server = createServer((req, res) => {
|
|
467
|
+
if (refuseElsewhere(req, res)) return;
|
|
468
|
+
if (routes.handle(req, res, new URL(req.url ?? '/', 'http://localhost').pathname)) return;
|
|
446
469
|
res.writeHead(404, { 'content-type': 'text/plain' });
|
|
447
470
|
res.end('not here\n');
|
|
448
471
|
});
|
|
449
|
-
|
|
450
|
-
const poll = setInterval(tick, POLL_MS);
|
|
451
|
-
const listen = (p) =>
|
|
452
|
-
new Promise((resolveListen, reject) => {
|
|
453
|
-
const onError = (error) => {
|
|
454
|
-
server.off('listening', onListening);
|
|
455
|
-
reject(error);
|
|
456
|
-
};
|
|
457
|
-
const onListening = () => {
|
|
458
|
-
server.off('error', onError);
|
|
459
|
-
resolveListen();
|
|
460
|
-
};
|
|
461
|
-
server.once('error', onError);
|
|
462
|
-
server.once('listening', onListening);
|
|
463
|
-
server.listen(p, '127.0.0.1');
|
|
464
|
-
});
|
|
472
|
+
let url;
|
|
465
473
|
try {
|
|
466
|
-
await
|
|
474
|
+
url = await listenHere(server, port);
|
|
467
475
|
} catch (error) {
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
throw error;
|
|
471
|
-
}
|
|
472
|
-
await listen(0);
|
|
476
|
+
routes.close();
|
|
477
|
+
throw error;
|
|
473
478
|
}
|
|
474
|
-
const url = `http://127.0.0.1:${server.address().port}`;
|
|
475
479
|
const close = () =>
|
|
476
480
|
new Promise((resolveClose) => {
|
|
477
|
-
|
|
478
|
-
for (const timer of timers) clearTimeout(timer);
|
|
479
|
-
for (const client of clients) client.res.end();
|
|
480
|
-
clients.clear();
|
|
481
|
+
routes.close();
|
|
481
482
|
server.close(() => resolveClose());
|
|
482
483
|
});
|
|
483
484
|
return { url, close };
|
|
484
485
|
}
|
|
485
486
|
|
|
486
|
-
/**
|
|
487
|
-
* Hands an address to the system's opener. One that is not there fails at once, and one with no display to open on
|
|
488
|
-
* exits with an error soon after; one still running after two seconds is taken to have opened it. Windows' explorer
|
|
489
|
-
* answers 1 even when it opened the page.
|
|
490
|
-
*
|
|
491
|
-
* @param {string} url
|
|
492
|
-
* @returns {Promise<boolean>} Whether the browser was opened.
|
|
493
|
-
*/
|
|
494
|
-
function openInBrowser(url) {
|
|
495
|
-
const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'explorer' : 'xdg-open';
|
|
496
|
-
return new Promise((resolveOpen) => {
|
|
497
|
-
let child;
|
|
498
|
-
try {
|
|
499
|
-
child = spawn(opener, [url], { stdio: 'ignore', detached: true });
|
|
500
|
-
} catch {
|
|
501
|
-
resolveOpen(false);
|
|
502
|
-
return;
|
|
503
|
-
}
|
|
504
|
-
const timer = setTimeout(() => resolveOpen(true), 2000);
|
|
505
|
-
child.once('error', () => {
|
|
506
|
-
clearTimeout(timer);
|
|
507
|
-
resolveOpen(false);
|
|
508
|
-
});
|
|
509
|
-
child.once('exit', (code) => {
|
|
510
|
-
clearTimeout(timer);
|
|
511
|
-
resolveOpen(code === 0 || process.platform === 'win32');
|
|
512
|
-
});
|
|
513
|
-
child.unref();
|
|
514
|
-
});
|
|
515
|
-
}
|
|
516
|
-
|
|
517
487
|
/**
|
|
518
488
|
* Runs the office until Ctrl+C: serves it, says where for a click, and opens it in the system's browser when asked.
|
|
519
489
|
*
|
|
@@ -538,12 +508,7 @@ export async function viewOffice({ target, wanted, replay = false, port = OFFICE
|
|
|
538
508
|
console.error(` the office could not open a port — ${error?.message ?? error}\n`);
|
|
539
509
|
return 1;
|
|
540
510
|
}
|
|
541
|
-
|
|
542
|
-
// the process outright instead.
|
|
543
|
-
const stopped = new Promise((resolveStop) => {
|
|
544
|
-
process.once('SIGINT', resolveStop);
|
|
545
|
-
process.once('SIGTERM', resolveStop);
|
|
546
|
-
});
|
|
511
|
+
const stopped = untilStopped();
|
|
547
512
|
const what = replay ? `replaying session ${sessionLedgers(target, wanted).picked.session.slice(0, 8)}` : wanted ? `live, session ${wanted}` : 'live, following the newest session';
|
|
548
513
|
const opened = open ? await openInBrowser(office.url) : false;
|
|
549
514
|
// The address ends its line, with nothing after it, so a terminal makes it a link.
|
package/src/serve.mjs
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What every page NINA serves on this machine shares: the loopback address, the check that refuses a request named
|
|
3
|
+
* for another host, a port asked for and any free one when it is taken, and the system's opener for `--open`.
|
|
4
|
+
*
|
|
5
|
+
* The office (`nina pipeline --view`) came first and held all of it; the dashboard (`nina dashboard`) serves the
|
|
6
|
+
* office too, and a second copy of the host check is the kind of fact this repository has shipped drifting before.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { spawn } from 'node:child_process';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Whether a request names this machine for itself: a page elsewhere that rebinds its domain to the loopback address
|
|
13
|
+
* reaches the port, and is refused. Any port, since a forwarded one — an editor's port forwarding, a container's —
|
|
14
|
+
* reaches this one under another number.
|
|
15
|
+
*
|
|
16
|
+
* @param {import('node:http').IncomingMessage} req
|
|
17
|
+
* @returns {boolean}
|
|
18
|
+
*/
|
|
19
|
+
export const fromHere = (req) => /^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(String(req.headers.host ?? ''));
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Answers a request for another host with 403, and says whether it did.
|
|
23
|
+
*
|
|
24
|
+
* @param {import('node:http').IncomingMessage} req
|
|
25
|
+
* @param {import('node:http').ServerResponse} res
|
|
26
|
+
* @returns {boolean} True when the request was refused.
|
|
27
|
+
*/
|
|
28
|
+
export function refuseElsewhere(req, res) {
|
|
29
|
+
if (fromHere(req)) return false;
|
|
30
|
+
res.writeHead(403, { 'content-type': 'text/plain' });
|
|
31
|
+
res.end('not from here\n');
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Listens on the loopback address: on `port`, or on any free one when it is taken. Port 0 asks for any from the start.
|
|
37
|
+
*
|
|
38
|
+
* @param {import('node:http').Server} server
|
|
39
|
+
* @param {number} port
|
|
40
|
+
* @returns {Promise<string>} The address served.
|
|
41
|
+
*/
|
|
42
|
+
export async function listenHere(server, port) {
|
|
43
|
+
const listen = (p) =>
|
|
44
|
+
new Promise((resolveListen, reject) => {
|
|
45
|
+
const onError = (error) => {
|
|
46
|
+
server.off('listening', onListening);
|
|
47
|
+
reject(error);
|
|
48
|
+
};
|
|
49
|
+
const onListening = () => {
|
|
50
|
+
server.off('error', onError);
|
|
51
|
+
resolveListen();
|
|
52
|
+
};
|
|
53
|
+
server.once('error', onError);
|
|
54
|
+
server.once('listening', onListening);
|
|
55
|
+
server.listen(p, '127.0.0.1');
|
|
56
|
+
});
|
|
57
|
+
try {
|
|
58
|
+
await listen(port);
|
|
59
|
+
} catch (error) {
|
|
60
|
+
if (error?.code !== 'EADDRINUSE' || port === 0) throw error;
|
|
61
|
+
await listen(0);
|
|
62
|
+
}
|
|
63
|
+
return `http://127.0.0.1:${server.address().port}`;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Hands an address to the system's opener. One that is not there fails at once, and one with no display to open on
|
|
68
|
+
* exits with an error soon after; one still running after two seconds is taken to have opened it. Windows' explorer
|
|
69
|
+
* answers 1 even when it opened the page.
|
|
70
|
+
*
|
|
71
|
+
* @param {string} url
|
|
72
|
+
* @returns {Promise<boolean>} Whether the browser was opened.
|
|
73
|
+
*/
|
|
74
|
+
export function openInBrowser(url) {
|
|
75
|
+
const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'explorer' : 'xdg-open';
|
|
76
|
+
return new Promise((resolveOpen) => {
|
|
77
|
+
let child;
|
|
78
|
+
try {
|
|
79
|
+
child = spawn(opener, [url], { stdio: 'ignore', detached: true });
|
|
80
|
+
} catch {
|
|
81
|
+
resolveOpen(false);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const timer = setTimeout(() => resolveOpen(true), 2000);
|
|
85
|
+
child.once('error', () => {
|
|
86
|
+
clearTimeout(timer);
|
|
87
|
+
resolveOpen(false);
|
|
88
|
+
});
|
|
89
|
+
child.once('exit', (code) => {
|
|
90
|
+
clearTimeout(timer);
|
|
91
|
+
resolveOpen(code === 0 || process.platform === 'win32');
|
|
92
|
+
});
|
|
93
|
+
child.unref();
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* A promise kept at Ctrl+C or a termination signal. Listening before the address is printed matters: pressed in
|
|
99
|
+
* between, with no listener yet, Ctrl+C would kill the process outright instead of closing what it serves.
|
|
100
|
+
*
|
|
101
|
+
* @returns {Promise<void>}
|
|
102
|
+
*/
|
|
103
|
+
export function untilStopped() {
|
|
104
|
+
return new Promise((resolveStop) => {
|
|
105
|
+
process.once('SIGINT', resolveStop);
|
|
106
|
+
process.once('SIGTERM', resolveStop);
|
|
107
|
+
});
|
|
108
|
+
}
|