@xhulz/nina 0.68.1 → 0.69.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/package.json +1 -1
- package/releases/0.68.2/core/GAPS.md +125 -0
- package/releases/0.68.2/core/answered.json +80 -0
- package/releases/0.68.2/core/defaults/tree/.claude/agents/architect.md +1 -0
- package/releases/0.68.2/core/defaults/tree/.claude/agents/dba.md +3 -0
- package/releases/0.68.2/core/defaults/tree/.claude/agents/devops.md +1 -0
- package/releases/0.68.2/core/defaults/tree/.claude/agents/implementer.md +1 -0
- package/releases/0.68.2/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.68.2/core/defaults/tree/.claude/agents/qa.md +7 -0
- package/releases/0.68.2/core/defaults/tree/.claude/agents/reviewer.md +3 -0
- package/releases/0.68.2/core/defaults/tree/.claude/agents/secops.md +3 -0
- package/releases/0.68.2/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
- package/releases/0.68.2/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
- package/releases/0.68.2/core/tree/.claude/agents/architect.md +134 -0
- package/releases/0.68.2/core/tree/.claude/agents/dba.md +119 -0
- package/releases/0.68.2/core/tree/.claude/agents/design-reviewer.md +76 -0
- package/releases/0.68.2/core/tree/.claude/agents/devops.md +118 -0
- package/releases/0.68.2/core/tree/.claude/agents/implementer.md +178 -0
- package/releases/0.68.2/core/tree/.claude/agents/integration-tester.md +170 -0
- package/releases/0.68.2/core/tree/.claude/agents/planner.md +132 -0
- package/releases/0.68.2/core/tree/.claude/agents/qa.md +150 -0
- package/releases/0.68.2/core/tree/.claude/agents/reviewer.md +187 -0
- package/releases/0.68.2/core/tree/.claude/agents/secops.md +120 -0
- package/releases/0.68.2/core/tree/.claude/agents/solidity-auditor.md +126 -0
- package/releases/0.68.2/core/tree/.claude/agents/solidity-dev.md +123 -0
- package/releases/0.68.2/core/tree/.claude/agents-overview.md +65 -0
- package/releases/0.68.2/core/tree/.claude/frontend.md +10 -0
- package/releases/0.68.2/core/tree/.claude/graph.md +79 -0
- package/releases/0.68.2/core/tree/.claude/patterns.md +252 -0
- package/releases/0.68.2/core/tree/.claude/pills/README.md +150 -0
- package/releases/0.68.2/core/tree/.claude/pipeline.md +101 -0
- package/releases/0.68.2/core/tree/.claude/retrieval.md +103 -0
- package/releases/0.68.2/core/tree/.claude/router.md +218 -0
- package/releases/0.68.2/core/tree/.claude/templates/integration.md +48 -0
- package/releases/0.68.2/core/tree/CLAUDE.md +166 -0
- package/releases/0.68.2/core/tree/scripts/cost-watch.mjs +25 -0
- package/releases/0.68.2/core/tree/scripts/edit-guard.mjs +24 -0
- package/releases/0.68.2/core/tree/scripts/harness-check.mjs +81 -0
- package/releases/0.68.2/core/tree/scripts/loop-gate.mjs +19 -0
- package/releases/0.68.2/core/vocabulary.json +14 -0
- package/releases/0.68.2/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
- package/releases/0.68.2/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
- package/releases/0.68.2/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
- package/releases/0.68.2/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
- package/releases/0.68.2/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
- package/releases/0.68.2/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
- package/releases/0.68.2/surfaces/blockchain/tree/.claude/graph.md +11 -0
- package/releases/0.68.2/surfaces/blockchain/tree/.claude/router.md +6 -0
- package/releases/0.68.2/surfaces/blockchain/tree/CLAUDE.md +12 -0
- package/releases/0.68.2/surfaces/d1/tree/.claude/agents/dba.md +15 -0
- package/releases/0.68.2/surfaces/d1/tree/.claude/agents/devops.md +2 -0
- package/releases/0.68.2/surfaces/d1/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.68.2/surfaces/d1/tree/.claude/patterns.md +8 -0
- package/releases/0.68.2/surfaces/d1/tree/CLAUDE.md +2 -0
- package/releases/0.68.2/surfaces/db/tree/.claude/agents/architect.md +5 -0
- package/releases/0.68.2/surfaces/db/tree/.claude/agents/dba.md +54 -0
- package/releases/0.68.2/surfaces/db/tree/.claude/agents/devops.md +5 -0
- package/releases/0.68.2/surfaces/db/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.68.2/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
- package/releases/0.68.2/surfaces/db/tree/.claude/agents/planner.md +2 -0
- package/releases/0.68.2/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
- package/releases/0.68.2/surfaces/db/tree/.claude/agents/secops.md +2 -0
- package/releases/0.68.2/surfaces/db/tree/.claude/agents-overview.md +5 -0
- package/releases/0.68.2/surfaces/db/tree/.claude/graph.md +8 -0
- package/releases/0.68.2/surfaces/db/tree/.claude/patterns.md +22 -0
- package/releases/0.68.2/surfaces/db/tree/.claude/pipeline.md +13 -0
- package/releases/0.68.2/surfaces/db/tree/.claude/retrieval.md +5 -0
- package/releases/0.68.2/surfaces/db/tree/.claude/router.md +4 -0
- package/releases/0.68.2/surfaces/db/tree/CLAUDE.md +17 -0
- package/releases/0.68.2/surfaces/drizzle/tree/.claude/agents/dba.md +9 -0
- package/releases/0.68.2/surfaces/drizzle/tree/.claude/agents/devops.md +5 -0
- package/releases/0.68.2/surfaces/drizzle/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.68.2/surfaces/drizzle/tree/.claude/patterns.md +7 -0
- package/releases/0.68.2/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
- package/releases/0.68.2/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
- package/releases/0.68.2/surfaces/edge-cf/tree/.claude/agents/devops.md +29 -0
- package/releases/0.68.2/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
- package/releases/0.68.2/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
- package/releases/0.68.2/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
- package/releases/0.68.2/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.68.2/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
- package/releases/0.68.2/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
- package/releases/0.68.2/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
- package/releases/0.68.2/surfaces/edge-cf/tree/CLAUDE.md +27 -0
- package/releases/0.68.2/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
- package/releases/0.68.2/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
- package/releases/0.68.2/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
- package/releases/0.68.2/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
- package/releases/0.68.2/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
- package/releases/0.68.2/surfaces/frontend/tree/.claude/patterns.md +8 -0
- package/releases/0.68.2/surfaces/frontend/tree/.claude/retrieval.md +2 -0
- package/releases/0.68.2/surfaces/frontend/tree/.claude/router.md +14 -0
- package/releases/0.68.2/surfaces/frontend/tree/CLAUDE.md +5 -0
- package/releases/0.68.2/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
- package/releases/0.68.2/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
- package/releases/0.68.2/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
- package/releases/0.68.2/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
- package/releases/0.68.2/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
- package/releases/0.68.2/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
- package/releases/0.68.2/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
- package/releases/0.68.2/surfaces/integrations/tree/.claude/graph.md +10 -0
- package/releases/0.68.2/surfaces/integrations/tree/.claude/patterns.md +38 -0
- package/releases/0.68.2/surfaces/integrations/tree/.claude/pipeline.md +16 -0
- package/releases/0.68.2/surfaces/integrations/tree/.claude/retrieval.md +16 -0
- package/releases/0.68.2/surfaces/integrations/tree/.claude/router.md +6 -0
- package/releases/0.68.2/surfaces/integrations/tree/CLAUDE.md +17 -0
- package/releases/0.68.2/surfaces/money/tree/.claude/agents/architect.md +12 -0
- package/releases/0.68.2/surfaces/money/tree/.claude/agents/dba.md +14 -0
- package/releases/0.68.2/surfaces/money/tree/.claude/agents/implementer.md +11 -0
- package/releases/0.68.2/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.68.2/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
- package/releases/0.68.2/surfaces/money/tree/.claude/agents/secops.md +5 -0
- package/releases/0.68.2/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
- package/releases/0.68.2/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
- package/releases/0.68.2/surfaces/money/tree/.claude/graph.md +2 -0
- package/releases/0.68.2/surfaces/money/tree/.claude/patterns.md +49 -0
- package/releases/0.68.2/surfaces/money/tree/.claude/pipeline.md +2 -0
- package/releases/0.68.2/surfaces/money/tree/.claude/retrieval.md +2 -0
- package/releases/0.68.2/surfaces/money/tree/CLAUDE.md +11 -0
- package/releases/0.68.2/surfaces/pii/tree/.claude/agents/dba.md +2 -0
- package/releases/0.68.2/surfaces/pii/tree/.claude/agents/devops.md +8 -0
- package/releases/0.68.2/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.68.2/surfaces/pii/tree/.claude/agents/secops.md +2 -0
- package/releases/0.68.2/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
- package/releases/0.68.2/surfaces/pii/tree/CLAUDE.md +5 -0
- package/releases/0.68.2/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
- package/releases/0.68.2/surfaces/prisma/tree/.claude/agents/dba.md +42 -0
- package/releases/0.68.2/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
- package/releases/0.68.2/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.68.2/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
- package/releases/0.68.2/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
- package/releases/0.68.2/surfaces/prisma/tree/.claude/patterns.md +15 -0
- package/releases/0.68.2/surfaces/prisma/tree/CLAUDE.md +5 -0
- package/releases/0.69.0/core/GAPS.md +125 -0
- package/releases/0.69.0/core/answered.json +83 -0
- package/releases/0.69.0/core/defaults/tree/.claude/agents/architect.md +1 -0
- package/releases/0.69.0/core/defaults/tree/.claude/agents/dba.md +3 -0
- package/releases/0.69.0/core/defaults/tree/.claude/agents/devops.md +1 -0
- package/releases/0.69.0/core/defaults/tree/.claude/agents/implementer.md +1 -0
- package/releases/0.69.0/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.69.0/core/defaults/tree/.claude/agents/qa.md +7 -0
- package/releases/0.69.0/core/defaults/tree/.claude/agents/reviewer.md +3 -0
- package/releases/0.69.0/core/defaults/tree/.claude/agents/secops.md +3 -0
- package/releases/0.69.0/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
- package/releases/0.69.0/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
- package/releases/0.69.0/core/tree/.claude/agents/architect.md +135 -0
- package/releases/0.69.0/core/tree/.claude/agents/dba.md +119 -0
- package/releases/0.69.0/core/tree/.claude/agents/design-reviewer.md +78 -0
- package/releases/0.69.0/core/tree/.claude/agents/devops.md +118 -0
- package/releases/0.69.0/core/tree/.claude/agents/implementer.md +178 -0
- package/releases/0.69.0/core/tree/.claude/agents/integration-tester.md +170 -0
- package/releases/0.69.0/core/tree/.claude/agents/planner.md +132 -0
- package/releases/0.69.0/core/tree/.claude/agents/qa.md +150 -0
- package/releases/0.69.0/core/tree/.claude/agents/reviewer.md +187 -0
- package/releases/0.69.0/core/tree/.claude/agents/secops.md +120 -0
- package/releases/0.69.0/core/tree/.claude/agents/solidity-auditor.md +126 -0
- package/releases/0.69.0/core/tree/.claude/agents/solidity-dev.md +123 -0
- package/releases/0.69.0/core/tree/.claude/agents-overview.md +65 -0
- package/releases/0.69.0/core/tree/.claude/frontend.md +10 -0
- package/releases/0.69.0/core/tree/.claude/graph.md +79 -0
- package/releases/0.69.0/core/tree/.claude/patterns.md +252 -0
- package/releases/0.69.0/core/tree/.claude/pills/README.md +150 -0
- package/releases/0.69.0/core/tree/.claude/pipeline.md +101 -0
- package/releases/0.69.0/core/tree/.claude/retrieval.md +103 -0
- package/releases/0.69.0/core/tree/.claude/router.md +219 -0
- package/releases/0.69.0/core/tree/.claude/templates/integration.md +48 -0
- package/releases/0.69.0/core/tree/CLAUDE.md +166 -0
- package/releases/0.69.0/core/tree/scripts/cost-watch.mjs +25 -0
- package/releases/0.69.0/core/tree/scripts/edit-guard.mjs +24 -0
- package/releases/0.69.0/core/tree/scripts/harness-check.mjs +81 -0
- package/releases/0.69.0/core/tree/scripts/loop-gate.mjs +19 -0
- package/releases/0.69.0/core/vocabulary.json +14 -0
- package/releases/0.69.0/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
- package/releases/0.69.0/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
- package/releases/0.69.0/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
- package/releases/0.69.0/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
- package/releases/0.69.0/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
- package/releases/0.69.0/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
- package/releases/0.69.0/surfaces/blockchain/tree/.claude/graph.md +11 -0
- package/releases/0.69.0/surfaces/blockchain/tree/.claude/router.md +6 -0
- package/releases/0.69.0/surfaces/blockchain/tree/CLAUDE.md +12 -0
- package/releases/0.69.0/surfaces/d1/tree/.claude/agents/dba.md +15 -0
- package/releases/0.69.0/surfaces/d1/tree/.claude/agents/devops.md +2 -0
- package/releases/0.69.0/surfaces/d1/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.69.0/surfaces/d1/tree/.claude/patterns.md +8 -0
- package/releases/0.69.0/surfaces/d1/tree/CLAUDE.md +2 -0
- package/releases/0.69.0/surfaces/db/tree/.claude/agents/architect.md +5 -0
- package/releases/0.69.0/surfaces/db/tree/.claude/agents/dba.md +54 -0
- package/releases/0.69.0/surfaces/db/tree/.claude/agents/devops.md +5 -0
- package/releases/0.69.0/surfaces/db/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.69.0/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
- package/releases/0.69.0/surfaces/db/tree/.claude/agents/planner.md +2 -0
- package/releases/0.69.0/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
- package/releases/0.69.0/surfaces/db/tree/.claude/agents/secops.md +2 -0
- package/releases/0.69.0/surfaces/db/tree/.claude/agents-overview.md +5 -0
- package/releases/0.69.0/surfaces/db/tree/.claude/graph.md +8 -0
- package/releases/0.69.0/surfaces/db/tree/.claude/patterns.md +22 -0
- package/releases/0.69.0/surfaces/db/tree/.claude/pipeline.md +13 -0
- package/releases/0.69.0/surfaces/db/tree/.claude/retrieval.md +5 -0
- package/releases/0.69.0/surfaces/db/tree/.claude/router.md +4 -0
- package/releases/0.69.0/surfaces/db/tree/CLAUDE.md +17 -0
- package/releases/0.69.0/surfaces/drizzle/tree/.claude/agents/dba.md +9 -0
- package/releases/0.69.0/surfaces/drizzle/tree/.claude/agents/devops.md +5 -0
- package/releases/0.69.0/surfaces/drizzle/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.69.0/surfaces/drizzle/tree/.claude/patterns.md +7 -0
- package/releases/0.69.0/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
- package/releases/0.69.0/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
- package/releases/0.69.0/surfaces/edge-cf/tree/.claude/agents/devops.md +29 -0
- package/releases/0.69.0/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
- package/releases/0.69.0/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
- package/releases/0.69.0/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
- package/releases/0.69.0/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.69.0/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
- package/releases/0.69.0/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
- package/releases/0.69.0/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
- package/releases/0.69.0/surfaces/edge-cf/tree/CLAUDE.md +27 -0
- package/releases/0.69.0/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
- package/releases/0.69.0/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
- package/releases/0.69.0/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
- package/releases/0.69.0/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
- package/releases/0.69.0/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
- package/releases/0.69.0/surfaces/frontend/tree/.claude/patterns.md +8 -0
- package/releases/0.69.0/surfaces/frontend/tree/.claude/retrieval.md +2 -0
- package/releases/0.69.0/surfaces/frontend/tree/.claude/router.md +14 -0
- package/releases/0.69.0/surfaces/frontend/tree/CLAUDE.md +5 -0
- package/releases/0.69.0/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
- package/releases/0.69.0/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
- package/releases/0.69.0/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
- package/releases/0.69.0/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
- package/releases/0.69.0/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
- package/releases/0.69.0/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
- package/releases/0.69.0/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
- package/releases/0.69.0/surfaces/integrations/tree/.claude/graph.md +10 -0
- package/releases/0.69.0/surfaces/integrations/tree/.claude/patterns.md +38 -0
- package/releases/0.69.0/surfaces/integrations/tree/.claude/pipeline.md +16 -0
- package/releases/0.69.0/surfaces/integrations/tree/.claude/retrieval.md +16 -0
- package/releases/0.69.0/surfaces/integrations/tree/.claude/router.md +6 -0
- package/releases/0.69.0/surfaces/integrations/tree/CLAUDE.md +17 -0
- package/releases/0.69.0/surfaces/money/tree/.claude/agents/architect.md +12 -0
- package/releases/0.69.0/surfaces/money/tree/.claude/agents/dba.md +14 -0
- package/releases/0.69.0/surfaces/money/tree/.claude/agents/implementer.md +11 -0
- package/releases/0.69.0/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.69.0/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
- package/releases/0.69.0/surfaces/money/tree/.claude/agents/secops.md +5 -0
- package/releases/0.69.0/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
- package/releases/0.69.0/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
- package/releases/0.69.0/surfaces/money/tree/.claude/graph.md +2 -0
- package/releases/0.69.0/surfaces/money/tree/.claude/patterns.md +49 -0
- package/releases/0.69.0/surfaces/money/tree/.claude/pipeline.md +2 -0
- package/releases/0.69.0/surfaces/money/tree/.claude/retrieval.md +2 -0
- package/releases/0.69.0/surfaces/money/tree/CLAUDE.md +11 -0
- package/releases/0.69.0/surfaces/pii/tree/.claude/agents/dba.md +2 -0
- package/releases/0.69.0/surfaces/pii/tree/.claude/agents/devops.md +8 -0
- package/releases/0.69.0/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.69.0/surfaces/pii/tree/.claude/agents/secops.md +2 -0
- package/releases/0.69.0/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
- package/releases/0.69.0/surfaces/pii/tree/CLAUDE.md +5 -0
- package/releases/0.69.0/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
- package/releases/0.69.0/surfaces/prisma/tree/.claude/agents/dba.md +42 -0
- package/releases/0.69.0/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
- package/releases/0.69.0/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.69.0/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
- package/releases/0.69.0/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
- package/releases/0.69.0/surfaces/prisma/tree/.claude/patterns.md +15 -0
- package/releases/0.69.0/surfaces/prisma/tree/CLAUDE.md +5 -0
- package/src/office.mjs +139 -20
package/src/office.mjs
CHANGED
|
@@ -22,16 +22,16 @@
|
|
|
22
22
|
* a click on a link, beside the conversation once `workbench.browser.openLocalhostLinks` is on (1.140).
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
-
import { readFileSync, statSync } from 'node:fs';
|
|
25
|
+
import { readFileSync, readdirSync, realpathSync, statSync } from 'node:fs';
|
|
26
26
|
import { createServer } from 'node:http';
|
|
27
27
|
import { basename, dirname, join } from 'node:path';
|
|
28
28
|
import { fileURLToPath } from 'node:url';
|
|
29
29
|
import { TERMINALS, parseGraph } from './graph.mjs';
|
|
30
30
|
import { readLedger, sessionLedgers } from './gate.mjs';
|
|
31
|
-
import { readProfile } from './paths.mjs';
|
|
31
|
+
import { readProfile, slugFor } from './paths.mjs';
|
|
32
32
|
import { projectStoreFile, readStoreFile } from './store.mjs';
|
|
33
33
|
import { CYCLE_ENDS, IN_FLIGHT, cyclesOf } from './commands/stats.mjs';
|
|
34
|
-
import { isLoopBack } from './transcripts.mjs';
|
|
34
|
+
import { isLoopBack, transcriptsOf } from './transcripts.mjs';
|
|
35
35
|
import { shapeOf } from './commands/pipeline.mjs';
|
|
36
36
|
import { listenHere, openInBrowser, refuseElsewhere, untilStopped } from './serve.mjs';
|
|
37
37
|
|
|
@@ -52,12 +52,113 @@ export const PARTY_QUIET_MS = 20_000;
|
|
|
52
52
|
const SWITCH_GRACE_MS = 10_000;
|
|
53
53
|
|
|
54
54
|
/**
|
|
55
|
-
* How long a run may go without reporting before the office stops counting it as
|
|
56
|
-
* measured across three projects took 108 minutes, and the 99th percentile 73. A run
|
|
57
|
-
* kept every later party away for the rest of its session.
|
|
55
|
+
* How long a run whose own transcript cannot be read may go without reporting before the office stops counting it as
|
|
56
|
+
* at work: the longest of 227 runs measured across three projects took 108 minutes, and the 99th percentile 73. A run
|
|
57
|
+
* that stopped without a verdict kept every later party away for the rest of its session.
|
|
58
58
|
*/
|
|
59
59
|
export const STALE_MS = 3 * 60 * 60 * 1000;
|
|
60
60
|
|
|
61
|
+
/**
|
|
62
|
+
* How long a run whose transcript can be read may go without writing to it before the office stops counting it as at
|
|
63
|
+
* work. Runs grew past `STALE_MS`: an implementer three hours into a step, still writing, got up from its desk and
|
|
64
|
+
* left the office, and sat down again only when the orchestrator sent it a message. The longest silence inside a run,
|
|
65
|
+
* in 299,030 measured across three projects, was 20 minutes — a battery waited on, a long thought.
|
|
66
|
+
*/
|
|
67
|
+
export const SILENT_MS = 45 * 60 * 1000;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* When a run with no verdict stops counting as at work: once its transcript has been quiet `SILENT_MS`, or `STALE_MS`
|
|
71
|
+
* after it started when there is none to read.
|
|
72
|
+
*
|
|
73
|
+
* @param {{at: number}} start - The run.
|
|
74
|
+
* @param {number|null} heard - When its transcript was last written, or null.
|
|
75
|
+
* @returns {number}
|
|
76
|
+
*/
|
|
77
|
+
const staleAt = (start, heard) => (heard === null ? start.at + STALE_MS : Math.max(start.at, heard) + SILENT_MS);
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* When each run of a session last wrote its own transcript, so that a run still writing is at work however long it
|
|
81
|
+
* takes. A run is found by its agent's id once the gate knows it, and before that — a foreground run still going — by
|
|
82
|
+
* the tool_use id that launched it, which its transcript's `.meta.json` keeps.
|
|
83
|
+
*
|
|
84
|
+
* @param {string} target - The project directory.
|
|
85
|
+
* @returns {(session: string|null) => (start: {agent: string|null, id: string|null}) => number|null}
|
|
86
|
+
*/
|
|
87
|
+
export function runClock(target) {
|
|
88
|
+
// Named as the gate names the project's ledgers, by where it really is: reached through a link, it is the same one.
|
|
89
|
+
let real = target;
|
|
90
|
+
try {
|
|
91
|
+
real = realpathSync(target);
|
|
92
|
+
} catch {
|
|
93
|
+
// A project that does not exist has no transcripts either way.
|
|
94
|
+
}
|
|
95
|
+
/** The tool_use id each `.meta.json` names, read once: it never changes. */
|
|
96
|
+
const launchedBy = new Map();
|
|
97
|
+
return (session) => {
|
|
98
|
+
if (!session) return () => null;
|
|
99
|
+
const dir = join(transcriptsOf(slugFor(real)), session, 'subagents');
|
|
100
|
+
let names;
|
|
101
|
+
try {
|
|
102
|
+
names = readdirSync(dir);
|
|
103
|
+
} catch {
|
|
104
|
+
return () => null;
|
|
105
|
+
}
|
|
106
|
+
const byAgent = new Map();
|
|
107
|
+
const byLaunch = new Map();
|
|
108
|
+
for (const name of names) {
|
|
109
|
+
if (!name.startsWith('agent-')) continue;
|
|
110
|
+
if (name.endsWith('.jsonl')) byAgent.set(name.slice('agent-'.length, -'.jsonl'.length), join(dir, name));
|
|
111
|
+
if (!name.endsWith('.meta.json')) continue;
|
|
112
|
+
const file = join(dir, `${name.slice(0, -'.meta.json'.length)}.jsonl`);
|
|
113
|
+
const meta = join(dir, name);
|
|
114
|
+
if (!launchedBy.has(meta)) {
|
|
115
|
+
try {
|
|
116
|
+
const id = JSON.parse(readFileSync(meta, 'utf8')).toolUseId;
|
|
117
|
+
if (typeof id === 'string') launchedBy.set(meta, id);
|
|
118
|
+
} catch {
|
|
119
|
+
// Half written: read again at the next look.
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (launchedBy.has(meta)) byLaunch.set(launchedBy.get(meta), file);
|
|
123
|
+
}
|
|
124
|
+
const written = new Map();
|
|
125
|
+
return (start) => {
|
|
126
|
+
const file = (start.agent && byAgent.get(start.agent)) || (start.id && byLaunch.get(start.id)) || null;
|
|
127
|
+
if (!file) return null;
|
|
128
|
+
if (!written.has(file)) {
|
|
129
|
+
try {
|
|
130
|
+
written.set(file, statSync(file).mtimeMs);
|
|
131
|
+
} catch {
|
|
132
|
+
written.set(file, null);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return written.get(file);
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** A wait between two of the office's looks this much longer than it asks for is the machine having slept. */
|
|
141
|
+
const SLEPT_MS = 60_000;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* When the machine last woke, told by the office's own looks at the ledger: one that comes long after the last, the
|
|
145
|
+
* process was not running between them, and neither was any run, so a transcript's silence across it is not a run's.
|
|
146
|
+
* A laptop closed for an hour with an implementer at work woke to an office that sent the implementer home before it
|
|
147
|
+
* had written again.
|
|
148
|
+
*
|
|
149
|
+
* @param {number} [first] - The first look.
|
|
150
|
+
* @returns {(now: number) => number} Given each look, the moment the machine last woke, or `-Infinity`.
|
|
151
|
+
*/
|
|
152
|
+
export function wakeClock(first = Date.now()) {
|
|
153
|
+
let last = first;
|
|
154
|
+
let woke = Number.NEGATIVE_INFINITY;
|
|
155
|
+
return (now) => {
|
|
156
|
+
if (now - last > SLEPT_MS) woke = now;
|
|
157
|
+
last = now;
|
|
158
|
+
return woke;
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
61
162
|
/**
|
|
62
163
|
* A dispatch the gate asked about that wrote no `dispatch` entry is taken as refused once the orchestrator launched
|
|
63
164
|
* something else this long after it. A foreground run still going holds the orchestrator, so nothing else goes out;
|
|
@@ -117,7 +218,7 @@ function readStarts(ledger) {
|
|
|
117
218
|
|
|
118
219
|
// Each start, and how it ends: by a verdict from its agent, or from its stage while its agent is not known yet —
|
|
119
220
|
// the page binds them the same way; refused, when the gate asked, no dispatch was written, and the orchestrator
|
|
120
|
-
// went on to something else; or stale, a run that never reported
|
|
221
|
+
// went on to something else; or stale, a run that never reported and has gone quiet (`staleAt`).
|
|
121
222
|
const starts = [];
|
|
122
223
|
entries.forEach((e, i) => {
|
|
123
224
|
if (!startsWork(e)) return;
|
|
@@ -132,7 +233,7 @@ function readStarts(ledger) {
|
|
|
132
233
|
// whether the agent it names had reported since it last started.
|
|
133
234
|
const message = launched?.via === 'SendMessage' && (launched.resumed === undefined ? Boolean(launched.agent) && Boolean(ranBefore(launched.agent)) : !launched.resumed);
|
|
134
235
|
const after = e.k === 'pre' && e.id && asked.has(e.id) && !dispatches.has(e.id) ? entries.slice(i + 1).find((x) => x.k === 'pre' && time(x) > at + REFUSED_AFTER_MS) : null;
|
|
135
|
-
starts.push({ i, at, role: e.role, agent: launched?.agent ?? null, message, refusedAt: after ? time(after) : null });
|
|
236
|
+
starts.push({ i, at, id: e.id ?? null, role: e.role, agent: launched?.agent ?? null, message, refusedAt: after ? time(after) : null });
|
|
136
237
|
});
|
|
137
238
|
const verdictOf = (s) => verdicts.find((x) => time(x) >= s.at && (s.agent ? x.agent === s.agent : x.role === s.role)) ?? null;
|
|
138
239
|
for (const s of starts) {
|
|
@@ -160,12 +261,19 @@ function readStarts(ledger) {
|
|
|
160
261
|
* @param {object[]} entries - The ledger, oldest first.
|
|
161
262
|
* @param {{edges: {from: string, to: string, token: string}[]}} graph - The project's parsed graph.
|
|
162
263
|
* @param {number} [now] - The time a waiting party is judged against; `Infinity` for a session that has ended.
|
|
264
|
+
* @param {(start: object) => number|null} [heard] - When a run last wrote its transcript (`runClock`), or null.
|
|
163
265
|
* @returns {object[]} Beats, each `{id, at, type, ...}`; the id is stable as the ledger grows.
|
|
164
266
|
*/
|
|
165
|
-
export function officeBeats(ledger, graph, now = Date.now()) {
|
|
267
|
+
export function officeBeats(ledger, graph, now = Date.now(), heard = () => null) {
|
|
166
268
|
const { entries, time, startsWork, launchOf, starts } = readStarts(ledger);
|
|
269
|
+
// A run's transcript is looked at only for a run that may still be at work.
|
|
270
|
+
const quietMoments = new Map();
|
|
271
|
+
const quietAt = (s) => {
|
|
272
|
+
if (!quietMoments.has(s)) quietMoments.set(s, staleAt(s, heard(s)));
|
|
273
|
+
return quietMoments.get(s);
|
|
274
|
+
};
|
|
167
275
|
const busyAt = (moment) =>
|
|
168
|
-
starts.some((s) => !s.message && s.at <= moment &&
|
|
276
|
+
starts.some((s) => !s.message && s.at <= moment && !(s.refusedAt !== null && s.refusedAt <= moment) && !(s.end !== null && s.end <= moment) && moment < quietAt(s));
|
|
169
277
|
|
|
170
278
|
const beats = [];
|
|
171
279
|
const seen = new Map();
|
|
@@ -197,8 +305,8 @@ export function officeBeats(ledger, graph, now = Date.now()) {
|
|
|
197
305
|
beats.push({ id: work, at, type: 'work', role: e.role, agent: start.agent, resumed: launched?.via === 'SendMessage' && !start.message, message: start.message, from: handed ? reported : null });
|
|
198
306
|
if (start.refusedAt !== null) beats.push({ id: `refused:${id}`, at: start.refusedAt, type: 'refused', role: e.role, work });
|
|
199
307
|
else if (start.stopped !== null) beats.push({ id: `stale:${id}`, at: start.stopped, type: 'stale', role: e.role, agent: start.agent, work: id });
|
|
200
|
-
else if (!start.message && (start.end === null || start.end - start.at >=
|
|
201
|
-
beats.push({ id: `stale:${id}`, at: start
|
|
308
|
+
else if (!start.message && (start.end === null || (start.end - start.at >= SILENT_MS && start.end >= quietAt(start))) && now >= quietAt(start)) {
|
|
309
|
+
beats.push({ id: `stale:${id}`, at: quietAt(start), type: 'stale', role: e.role, agent: start.agent, work: id });
|
|
202
310
|
}
|
|
203
311
|
return;
|
|
204
312
|
}
|
|
@@ -252,11 +360,12 @@ export function officeBeats(ledger, graph, now = Date.now()) {
|
|
|
252
360
|
* — and sent piece by piece, a task that a later fact merged away stayed on the page for good.
|
|
253
361
|
*
|
|
254
362
|
* @param {object[]} ledger - The ledger, oldest first.
|
|
255
|
-
* @param {number} [now] - The moment it is read at: a run
|
|
363
|
+
* @param {number} [now] - The moment it is read at: a run with no verdict that has not gone quiet is still at work.
|
|
256
364
|
* @param {Map<string, string>} [names] - Descriptions by dispatch id, for entries that carry none.
|
|
365
|
+
* @param {(start: object) => number|null} [heard] - When a run last wrote its transcript (`runClock`), or null.
|
|
257
366
|
* @returns {{key: string, name: string|null, start: number, end: number|null, how: string|null, busy: number|null, who: [string, number][]}[]}
|
|
258
367
|
*/
|
|
259
|
-
export function officeTimeline(ledger, now = Date.now(), names = new Map()) {
|
|
368
|
+
export function officeTimeline(ledger, now = Date.now(), names = new Map(), heard = () => null) {
|
|
260
369
|
const { entries, starts, verdictOf } = readStarts(ledger);
|
|
261
370
|
// A run a message started — an agent resumed after it had reported — is named by the message's summary, or, in a
|
|
262
371
|
// ledger from before the gate kept one, by the words the agent was launched with: it goes on with that work.
|
|
@@ -267,7 +376,7 @@ export function officeTimeline(ledger, now = Date.now(), names = new Map()) {
|
|
|
267
376
|
.map((s) => {
|
|
268
377
|
const e = entries[s.i];
|
|
269
378
|
const v = verdictOf(s);
|
|
270
|
-
return { ts: e.at, role: s.role, verdict: v ? v.verdict : now < s
|
|
379
|
+
return { ts: e.at, role: s.role, verdict: v ? v.verdict : now < staleAt(s, heard(s)) ? IN_FLIGHT : null, desc: e.desc ?? names.get(e.id) ?? (s.agent ? launched.get(s.agent) : undefined) ?? null, start: s, key: e.id ?? `at${s.i}` };
|
|
271
380
|
});
|
|
272
381
|
return cyclesOf(runs).map((cycle) => {
|
|
273
382
|
const first = cycle.runs[0];
|
|
@@ -396,6 +505,8 @@ export function officeRoutes({ target, wanted, replay = false }) {
|
|
|
396
505
|
const timers = new Set();
|
|
397
506
|
|
|
398
507
|
const names = storeNames(target);
|
|
508
|
+
const clock = runClock(target);
|
|
509
|
+
const wake = wakeClock();
|
|
399
510
|
|
|
400
511
|
/** The session to show, and its entries; read again only when its ledger changed. */
|
|
401
512
|
let cached = { path: null, size: -1, mtime: 0, entries: [] };
|
|
@@ -436,12 +547,19 @@ export function officeRoutes({ target, wanted, replay = false }) {
|
|
|
436
547
|
};
|
|
437
548
|
|
|
438
549
|
const tick = () => {
|
|
550
|
+
const now = Date.now();
|
|
551
|
+
// Looked at whether anyone watches, so a look long after the last is the machine having slept, not nobody watching.
|
|
552
|
+
const woke = wake(now);
|
|
439
553
|
// Nobody watching live: nothing to cut or send.
|
|
440
554
|
if (![...clients].some((client) => !client.replay)) return;
|
|
441
555
|
const state = current();
|
|
442
|
-
const
|
|
443
|
-
const
|
|
444
|
-
|
|
556
|
+
const written = clock(state.session);
|
|
557
|
+
const heard = (start) => {
|
|
558
|
+
const at = written(start);
|
|
559
|
+
return at === null ? null : Math.max(at, woke);
|
|
560
|
+
};
|
|
561
|
+
const beats = officeBeats(state.entries, graph, now, heard);
|
|
562
|
+
const tasks = officeTimeline(state.entries, now, names(state.entries), heard);
|
|
445
563
|
for (const client of clients) {
|
|
446
564
|
if (client.replay) continue;
|
|
447
565
|
if (client.session !== state.session) greet(client, state);
|
|
@@ -458,10 +576,11 @@ export function officeRoutes({ target, wanted, replay = false }) {
|
|
|
458
576
|
const play = (client) => {
|
|
459
577
|
const state = current();
|
|
460
578
|
greet(client, state);
|
|
461
|
-
const
|
|
579
|
+
const heard = clock(state.session);
|
|
580
|
+
const beats = officeBeats(state.entries, graph, Number.POSITIVE_INFINITY, heard);
|
|
462
581
|
// The timeline as it stood at each beat: cut from the ledger up to that moment, so a replay tells nothing early.
|
|
463
582
|
const known = names(state.entries);
|
|
464
|
-
const tasksAt = (moment) => officeTimeline(state.entries.filter((e) => Date.parse(e?.at) <= moment), moment, known);
|
|
583
|
+
const tasksAt = (moment) => officeTimeline(state.entries.filter((e) => Date.parse(e?.at) <= moment), moment, known, heard);
|
|
465
584
|
// What came before the first dispatch sets the room, at once: a session often opens on many of the owner's
|
|
466
585
|
// messages, and played out they kept the office empty for a minute.
|
|
467
586
|
let i = Math.max(0, beats.findIndex((b) => b.type === 'work'));
|