@monoes/monomindcli 1.10.47 → 1.10.55
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/.claude/agents/optimization/benchmark-suite.md +2 -0
- package/.claude/agents/optimization/load-balancer.md +2 -0
- package/.claude/agents/optimization/performance-monitor.md +2 -0
- package/.claude/agents/optimization/resource-allocator.md +3 -1
- package/.claude/agents/optimization/topology-optimizer.md +2 -0
- package/.claude/commands/mastermind/_repeat.md +21 -0
- package/.claude/commands/mastermind/_taskfile.md +235 -0
- package/.claude/commands/mastermind/adr.md +11 -0
- package/.claude/commands/mastermind/approve.md +94 -0
- package/.claude/commands/mastermind/autodev.md +32 -0
- package/.claude/commands/mastermind/budget.md +7 -0
- package/.claude/commands/mastermind/code-review.md +317 -0
- package/.claude/commands/mastermind/createorg.md +40 -1
- package/.claude/commands/mastermind/createtask.md +383 -0
- package/.claude/commands/mastermind/debug.md +22 -0
- package/.claude/commands/mastermind/design.md +20 -0
- package/.claude/commands/mastermind/do.md +526 -0
- package/.claude/commands/mastermind/execute.md +20 -0
- package/.claude/commands/mastermind/finish.md +20 -0
- package/.claude/commands/mastermind/graph-status.md +7 -0
- package/.claude/commands/mastermind/help.md +118 -0
- package/.claude/commands/mastermind/ideate.md +261 -0
- package/.claude/commands/mastermind/improve.md +345 -0
- package/.claude/commands/mastermind/loops.md +7 -0
- package/.claude/commands/mastermind/master.md +186 -6
- package/.claude/commands/mastermind/memory.md +230 -0
- package/.claude/commands/mastermind/plan.md +26 -0
- package/.claude/commands/mastermind/receive-review.md +20 -0
- package/.claude/commands/mastermind/repeat.md +257 -0
- package/.claude/commands/mastermind/runorg.md +3 -0
- package/.claude/commands/mastermind/skill-builder.md +20 -0
- package/.claude/commands/mastermind/specialagents.md +125 -0
- package/.claude/commands/mastermind/swarm.md +161 -0
- package/.claude/commands/mastermind/taskdev.md +26 -0
- package/.claude/commands/mastermind/tdd.md +22 -0
- package/.claude/commands/mastermind/techport.md +4 -0
- package/.claude/commands/mastermind/understand.md +139 -0
- package/.claude/commands/mastermind/verify.md +22 -0
- package/.claude/commands/mastermind/worktree.md +20 -0
- package/.claude/commands/monomind/do.md +52 -0
- package/.claude/commands/monomind/improve.md +2 -0
- package/.claude/helpers/handlers/graph-status-handler.cjs +2 -1
- package/.claude/helpers/handlers/route-handler.cjs +61 -11
- package/.claude/helpers/hook-handler.cjs +19 -0
- package/.claude/helpers/skill-registry.json +122 -51
- package/.claude/helpers/statusline.cjs +1 -1
- package/.claude/skills/agent-browser-testing/SKILL.md +522 -152
- package/.claude/skills/github-issue-triage/SKILL.md +354 -0
- package/.claude/skills/github-repo-recap/SKILL.md +207 -0
- package/.claude/skills/mastermind/_delegation.md +83 -0
- package/.claude/skills/mastermind/_protocol.md +14 -0
- package/.claude/skills/mastermind/approve.md +15 -7
- package/.claude/skills/mastermind/autodev.md +534 -0
- package/.claude/skills/mastermind/createorg.md +21 -5
- package/.claude/skills/mastermind/debug.md +232 -0
- package/.claude/skills/mastermind/design.md +187 -0
- package/.claude/skills/mastermind/execute.md +104 -0
- package/.claude/skills/mastermind/finish.md +251 -0
- package/.claude/skills/mastermind/plan.md +180 -0
- package/.claude/skills/mastermind/receive-review.md +213 -0
- package/.claude/skills/mastermind/runorg.md +23 -8
- package/.claude/skills/mastermind/skill-builder.md +274 -0
- package/.claude/skills/mastermind/taskdev.md +307 -0
- package/.claude/skills/mastermind/tdd.md +394 -0
- package/.claude/skills/mastermind/verify.md +196 -0
- package/.claude/skills/mastermind/worktree.md +160 -132
- package/README.md +320 -253
- package/dist/src/commands/analyze.d.ts.map +1 -1
- package/dist/src/commands/analyze.js +9 -2
- package/dist/src/commands/analyze.js.map +1 -1
- package/dist/src/commands/benchmark.js.map +1 -1
- package/dist/src/commands/completions.js +1 -1
- package/dist/src/commands/guidance.js +7 -7
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +16 -3
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts +3 -2
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +7 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +47 -13
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/neural.d.ts.map +1 -1
- package/dist/src/commands/neural.js +100 -14
- package/dist/src/commands/neural.js.map +1 -1
- package/dist/src/commands/platforms.d.ts +11 -0
- package/dist/src/commands/platforms.d.ts.map +1 -0
- package/dist/src/commands/platforms.js +195 -0
- package/dist/src/commands/platforms.js.map +1 -0
- package/dist/src/commands/ruvector/backup.js.map +1 -1
- package/dist/src/commands/ruvector/benchmark.js.map +1 -1
- package/dist/src/commands/ruvector/init.js.map +1 -1
- package/dist/src/commands/ruvector/migrate.js.map +1 -1
- package/dist/src/commands/ruvector/optimize.js.map +1 -1
- package/dist/src/commands/ruvector/status.js.map +1 -1
- package/dist/src/commands/update.js +6 -6
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +28 -0
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/statusline-generator.js +1 -1
- package/dist/src/init/types.d.ts +1 -0
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/mcp-server.d.ts.map +1 -1
- package/dist/src/mcp-server.js +92 -0
- package/dist/src/mcp-server.js.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.js +52 -0
- package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +106 -5
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/index.d.ts +0 -5
- package/dist/src/mcp-tools/index.d.ts.map +1 -1
- package/dist/src/mcp-tools/index.js +0 -5
- package/dist/src/mcp-tools/index.js.map +1 -1
- package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/monograph-tools.js +507 -5587
- package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
- package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/neural-tools.js +64 -4
- package/dist/src/mcp-tools/neural-tools.js.map +1 -1
- package/dist/src/mcp-tools/security-tools.js +4 -4
- package/dist/src/memory/intelligence.d.ts +2 -2
- package/dist/src/memory/intelligence.d.ts.map +1 -1
- package/dist/src/memory/intelligence.js +108 -3
- package/dist/src/memory/intelligence.js.map +1 -1
- package/dist/src/memory/memory-bridge.js +1 -1
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/src/memory/sona-optimizer.d.ts +1 -10
- package/dist/src/memory/sona-optimizer.d.ts.map +1 -1
- package/dist/src/memory/sona-optimizer.js +0 -46
- package/dist/src/memory/sona-optimizer.js.map +1 -1
- package/dist/src/runtime/headless.js +3 -3
- package/dist/src/ruvector/diff-classifier.d.ts +0 -2
- package/dist/src/ruvector/diff-classifier.d.ts.map +1 -1
- package/dist/src/ruvector/diff-classifier.js +2 -14
- package/dist/src/ruvector/diff-classifier.js.map +1 -1
- package/dist/src/ruvector/index.d.ts +26 -9
- package/dist/src/ruvector/index.d.ts.map +1 -1
- package/dist/src/ruvector/index.js +3 -21
- package/dist/src/ruvector/index.js.map +1 -1
- package/dist/src/ruvector/ruvllm-wasm.js +2 -2
- package/dist/src/ruvector/ruvllm-wasm.js.map +1 -1
- package/dist/src/types.d.ts +0 -15
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +0 -18
- package/dist/src/types.js.map +1 -1
- package/dist/src/ui/dashboard.html +8763 -9765
- package/dist/src/ui/data/agent-avatars.html +763 -0
- package/dist/src/ui/data/agent-avatars.json +966 -0
- package/dist/src/ui/data/avatars/account-strategist.svg +58 -0
- package/dist/src/ui/data/avatars/accounts-payable.svg +54 -0
- package/dist/src/ui/data/avatars/adaptive-coordinator.svg +55 -0
- package/dist/src/ui/data/avatars/adaptive-coordinator2.svg +54 -0
- package/dist/src/ui/data/avatars/ai-citation.svg +57 -0
- package/dist/src/ui/data/avatars/ai-engineer.svg +61 -0
- package/dist/src/ui/data/avatars/analytics-reporter.svg +53 -0
- package/dist/src/ui/data/avatars/api-tester.svg +53 -0
- package/dist/src/ui/data/avatars/architecture.svg +54 -0
- package/dist/src/ui/data/avatars/automation-governance.svg +55 -0
- package/dist/src/ui/data/avatars/backend-dev.svg +53 -0
- package/dist/src/ui/data/avatars/benchmarker.svg +54 -0
- package/dist/src/ui/data/avatars/blockchain-auditor.svg +53 -0
- package/dist/src/ui/data/avatars/byzantine-coord.svg +57 -0
- package/dist/src/ui/data/avatars/case-analyst.svg +57 -0
- package/dist/src/ui/data/avatars/cicd-engineer.svg +55 -0
- package/dist/src/ui/data/avatars/cloud-architect.svg +54 -0
- package/dist/src/ui/data/avatars/code-review-swarm.svg +57 -0
- package/dist/src/ui/data/avatars/coder-v119.svg +57 -0
- package/dist/src/ui/data/avatars/coder.svg +58 -0
- package/dist/src/ui/data/avatars/collective-coord.svg +54 -0
- package/dist/src/ui/data/avatars/compliance-auditor.svg +58 -0
- package/dist/src/ui/data/avatars/consensus-coordinator.svg +54 -0
- package/dist/src/ui/data/avatars/content-creator.svg +54 -0
- package/dist/src/ui/data/avatars/crdt-synchronizer.svg +53 -0
- package/dist/src/ui/data/avatars/cro-specialist.svg +58 -0
- package/dist/src/ui/data/avatars/data-consolidator.svg +54 -0
- package/dist/src/ui/data/avatars/data-engineer.svg +53 -0
- package/dist/src/ui/data/avatars/database-optimizer.svg +61 -0
- package/dist/src/ui/data/avatars/deal-strategist.svg +54 -0
- package/dist/src/ui/data/avatars/defender.svg +53 -0
- package/dist/src/ui/data/avatars/devops-automator.svg +56 -0
- package/dist/src/ui/data/avatars/discovery-coach.svg +54 -0
- package/dist/src/ui/data/avatars/email-marketing.svg +57 -0
- package/dist/src/ui/data/avatars/embedded-firmware.svg +61 -0
- package/dist/src/ui/data/avatars/evidence-collector.svg +57 -0
- package/dist/src/ui/data/avatars/experiment-tracker.svg +53 -0
- package/dist/src/ui/data/avatars/feedback-synthesizer.svg +54 -0
- package/dist/src/ui/data/avatars/finance-tracker.svg +54 -0
- package/dist/src/ui/data/avatars/frontend-developer.svg +54 -0
- package/dist/src/ui/data/avatars/game-audio-engineer.svg +59 -0
- package/dist/src/ui/data/avatars/game-designer.svg +54 -0
- package/dist/src/ui/data/avatars/gossip-coordinator.svg +54 -0
- package/dist/src/ui/data/avatars/hierarchical-coord.svg +54 -0
- package/dist/src/ui/data/avatars/incident-commander.svg +57 -0
- package/dist/src/ui/data/avatars/infrastructure.svg +54 -0
- package/dist/src/ui/data/avatars/input-validator.svg +53 -0
- package/dist/src/ui/data/avatars/ios-developer.svg +54 -0
- package/dist/src/ui/data/avatars/issue-tracker.svg +53 -0
- package/dist/src/ui/data/avatars/judge.svg +55 -0
- package/dist/src/ui/data/avatars/launch-strategist.svg +54 -0
- package/dist/src/ui/data/avatars/legal-compliance.svg +53 -0
- package/dist/src/ui/data/avatars/level-designer.svg +53 -0
- package/dist/src/ui/data/avatars/load-balancer.svg +57 -0
- package/dist/src/ui/data/avatars/mcp-builder.svg +53 -0
- package/dist/src/ui/data/avatars/memory-coordinator.svg +55 -0
- package/dist/src/ui/data/avatars/mesh-coordinator.svg +55 -0
- package/dist/src/ui/data/avatars/ml-developer.svg +58 -0
- package/dist/src/ui/data/avatars/mobile-app-builder.svg +53 -0
- package/dist/src/ui/data/avatars/mobile-dev.svg +54 -0
- package/dist/src/ui/data/avatars/model-qa.svg +58 -0
- package/dist/src/ui/data/avatars/narrative-designer.svg +58 -0
- package/dist/src/ui/data/avatars/outbound-strategist.svg +55 -0
- package/dist/src/ui/data/avatars/path-validator.svg +54 -0
- package/dist/src/ui/data/avatars/payment-agent.svg +53 -0
- package/dist/src/ui/data/avatars/perf-analyzer.svg +58 -0
- package/dist/src/ui/data/avatars/pipeline-analyst.svg +54 -0
- package/dist/src/ui/data/avatars/planner.svg +55 -0
- package/dist/src/ui/data/avatars/pr-manager.svg +54 -0
- package/dist/src/ui/data/avatars/pricing-strategist.svg +54 -0
- package/dist/src/ui/data/avatars/product-manager.svg +54 -0
- package/dist/src/ui/data/avatars/production-validator.svg +54 -0
- package/dist/src/ui/data/avatars/project-shepherd.svg +54 -0
- package/dist/src/ui/data/avatars/proposal-strategist.svg +54 -0
- package/dist/src/ui/data/avatars/prosecutor.svg +57 -0
- package/dist/src/ui/data/avatars/pseudocode.svg +53 -0
- package/dist/src/ui/data/avatars/queen-coordinator.svg +55 -0
- package/dist/src/ui/data/avatars/quorum-manager.svg +53 -0
- package/dist/src/ui/data/avatars/raft-manager.svg +53 -0
- package/dist/src/ui/data/avatars/reality-checker.svg +58 -0
- package/dist/src/ui/data/avatars/recruitment.svg +58 -0
- package/dist/src/ui/data/avatars/refinement.svg +53 -0
- package/dist/src/ui/data/avatars/release-manager.svg +54 -0
- package/dist/src/ui/data/avatars/repo-architect.svg +54 -0
- package/dist/src/ui/data/avatars/researcher.svg +58 -0
- package/dist/src/ui/data/avatars/resource-allocator.svg +53 -0
- package/dist/src/ui/data/avatars/reviewer.svg +53 -0
- package/dist/src/ui/data/avatars/safe-executor.svg +53 -0
- package/dist/src/ui/data/avatars/sales-coach.svg +53 -0
- package/dist/src/ui/data/avatars/sales-engineer.svg +58 -0
- package/dist/src/ui/data/avatars/scout-explorer.svg +58 -0
- package/dist/src/ui/data/avatars/security-architect.svg +54 -0
- package/dist/src/ui/data/avatars/security-auditor.svg +55 -0
- package/dist/src/ui/data/avatars/senior-developer.svg +58 -0
- package/dist/src/ui/data/avatars/senior-pm.svg +58 -0
- package/dist/src/ui/data/avatars/seo-specialist.svg +57 -0
- package/dist/src/ui/data/avatars/social-media.svg +54 -0
- package/dist/src/ui/data/avatars/solidity-engineer.svg +58 -0
- package/dist/src/ui/data/avatars/sparc-coder.svg +58 -0
- package/dist/src/ui/data/avatars/sparc-coord.svg +56 -0
- package/dist/src/ui/data/avatars/specification.svg +57 -0
- package/dist/src/ui/data/avatars/sprint-prioritizer.svg +53 -0
- package/dist/src/ui/data/avatars/sre.svg +54 -0
- package/dist/src/ui/data/avatars/studio-operations.svg +53 -0
- package/dist/src/ui/data/avatars/studio-producer.svg +55 -0
- package/dist/src/ui/data/avatars/support-responder.svg +56 -0
- package/dist/src/ui/data/avatars/system-architect.svg +54 -0
- package/dist/src/ui/data/avatars/task-orchestrator.svg +56 -0
- package/dist/src/ui/data/avatars/technical-artist.svg +53 -0
- package/dist/src/ui/data/avatars/technical-writer.svg +59 -0
- package/dist/src/ui/data/avatars/tester.svg +53 -0
- package/dist/src/ui/data/avatars/threat-detection.svg +61 -0
- package/dist/src/ui/data/avatars/trend-researcher.svg +54 -0
- package/dist/src/ui/data/avatars/trial-director.svg +55 -0
- package/dist/src/ui/data/avatars/unity-architect.svg +54 -0
- package/dist/src/ui/data/avatars/visionos-engineer.svg +57 -0
- package/dist/src/ui/data/avatars/worker-specialist.svg +55 -0
- package/dist/src/ui/data/avatars/workflow-architect.svg +57 -0
- package/dist/src/ui/data/avatars/workflow-automation.svg +54 -0
- package/dist/src/ui/data/avatars/zk-steward.svg +54 -0
- package/dist/src/ui/data/known-projects.json +1 -1
- package/dist/src/ui/data/mastermind-events.jsonl +28 -0
- package/dist/src/ui/orgs.html +1171 -0
- package/dist/src/ui/server.mjs +529 -43
- package/dist/src/update/index.js +1 -1
- package/dist/src/update/validator.js +8 -8
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/.claude/agents/academic/academic-anthropologist.md +0 -126
- package/.claude/agents/academic/academic-geographer.md +0 -128
- package/.claude/agents/academic/academic-historian.md +0 -124
- package/.claude/agents/academic/academic-narratologist.md +0 -119
- package/.claude/agents/academic/academic-psychologist.md +0 -119
- package/.claude/agents/analysis/analyze-code-quality.md +0 -58
- package/.claude/agents/analysis/code-analyzer.md +0 -189
- package/.claude/agents/analysis/code-review/analyze-code-quality.md +0 -58
- package/.claude/agents/consensus/performance-benchmarker.md +0 -831
- package/.claude/agents/data/ml/data-ml-model.md +0 -76
- package/.claude/agents/development/dev-backend-api.md +0 -178
- package/.claude/agents/devops/ci-cd/ops-cicd-github.md +0 -52
- package/.claude/agents/documentation/api-docs/docs-api-openapi.md +0 -63
- package/.claude/agents/game-development/blender/blender-addon-engineer.md +0 -235
- package/.claude/agents/game-development/game-audio-engineer.md +0 -265
- package/.claude/agents/game-development/game-designer.md +0 -168
- package/.claude/agents/game-development/godot/godot-gameplay-scripter.md +0 -335
- package/.claude/agents/game-development/godot/godot-multiplayer-engineer.md +0 -298
- package/.claude/agents/game-development/godot/godot-shader-developer.md +0 -267
- package/.claude/agents/game-development/level-designer.md +0 -209
- package/.claude/agents/game-development/narrative-designer.md +0 -244
- package/.claude/agents/game-development/roblox-studio/roblox-avatar-creator.md +0 -298
- package/.claude/agents/game-development/roblox-studio/roblox-experience-designer.md +0 -306
- package/.claude/agents/game-development/roblox-studio/roblox-systems-scripter.md +0 -326
- package/.claude/agents/game-development/technical-artist.md +0 -230
- package/.claude/agents/game-development/unity/unity-architect.md +0 -272
- package/.claude/agents/game-development/unity/unity-editor-tool-developer.md +0 -311
- package/.claude/agents/game-development/unity/unity-multiplayer-engineer.md +0 -322
- package/.claude/agents/game-development/unity/unity-shader-graph-artist.md +0 -270
- package/.claude/agents/game-development/unreal-engine/unreal-multiplayer-architect.md +0 -314
- package/.claude/agents/game-development/unreal-engine/unreal-systems-engineer.md +0 -311
- package/.claude/agents/game-development/unreal-engine/unreal-technical-artist.md +0 -257
- package/.claude/agents/game-development/unreal-engine/unreal-world-builder.md +0 -274
- package/.claude/agents/github/release-swarm.md +0 -597
- package/.claude/agents/goal/agent.md +0 -804
- package/.claude/agents/goal/code-goal-planner.md +0 -445
- package/.claude/agents/marketing/marketing-ai-citation-strategist.md +0 -171
- package/.claude/agents/marketing/marketing-app-store-optimizer.md +0 -322
- package/.claude/agents/marketing/marketing-baidu-seo-specialist.md +0 -227
- package/.claude/agents/marketing/marketing-bilibili-content-strategist.md +0 -200
- package/.claude/agents/marketing/marketing-book-co-author.md +0 -111
- package/.claude/agents/marketing/marketing-carousel-growth-engine.md +0 -200
- package/.claude/agents/marketing/marketing-china-ecommerce-operator.md +0 -284
- package/.claude/agents/marketing/marketing-content-creator.md +0 -67
- package/.claude/agents/marketing/marketing-cross-border-ecommerce.md +0 -260
- package/.claude/agents/marketing/marketing-douyin-strategist.md +0 -150
- package/.claude/agents/marketing/marketing-growth-hacker.md +0 -54
- package/.claude/agents/marketing/marketing-instagram-curator.md +0 -114
- package/.claude/agents/marketing/marketing-kuaishou-strategist.md +0 -224
- package/.claude/agents/marketing/marketing-linkedin-content-creator.md +0 -215
- package/.claude/agents/marketing/marketing-livestream-commerce-coach.md +0 -306
- package/.claude/agents/marketing/marketing-podcast-strategist.md +0 -278
- package/.claude/agents/marketing/marketing-private-domain-operator.md +0 -309
- package/.claude/agents/marketing/marketing-reddit-community-builder.md +0 -124
- package/.claude/agents/marketing/marketing-seo-specialist.md +0 -279
- package/.claude/agents/marketing/marketing-short-video-editing-coach.md +0 -413
- package/.claude/agents/marketing/marketing-social-media-strategist.md +0 -125
- package/.claude/agents/marketing/marketing-tiktok-strategist.md +0 -126
- package/.claude/agents/marketing/marketing-twitter-engager.md +0 -127
- package/.claude/agents/marketing/marketing-wechat-official-account.md +0 -146
- package/.claude/agents/marketing/marketing-weibo-strategist.md +0 -241
- package/.claude/agents/marketing/marketing-xiaohongshu-specialist.md +0 -139
- package/.claude/agents/marketing/marketing-zhihu-strategist.md +0 -163
- package/.claude/agents/neural/safla-neural.md +0 -74
- package/.claude/agents/paid-media/paid-media-auditor.md +0 -71
- package/.claude/agents/paid-media/paid-media-creative-strategist.md +0 -71
- package/.claude/agents/paid-media/paid-media-paid-social-strategist.md +0 -71
- package/.claude/agents/paid-media/paid-media-ppc-strategist.md +0 -71
- package/.claude/agents/paid-media/paid-media-programmatic-buyer.md +0 -71
- package/.claude/agents/paid-media/paid-media-search-query-analyst.md +0 -71
- package/.claude/agents/paid-media/paid-media-tracking-specialist.md +0 -71
- package/.claude/agents/payments/agentic-payments.md +0 -126
- package/.claude/agents/product/product-behavioral-nudge-engine.md +0 -81
- package/.claude/agents/product/product-feedback-synthesizer.md +0 -119
- package/.claude/agents/product/product-manager.md +0 -469
- package/.claude/agents/product/product-sprint-prioritizer.md +0 -154
- package/.claude/agents/product/product-trend-researcher.md +0 -159
- package/.claude/agents/project-management/project-management-experiment-tracker.md +0 -199
- package/.claude/agents/project-management/project-management-jira-workflow-steward.md +0 -231
- package/.claude/agents/project-management/project-management-project-shepherd.md +0 -195
- package/.claude/agents/project-management/project-management-studio-operations.md +0 -201
- package/.claude/agents/project-management/project-management-studio-producer.md +0 -204
- package/.claude/agents/project-management/project-manager-senior.md +0 -136
- package/.claude/agents/reasoning/agent.md +0 -804
- package/.claude/agents/reasoning/goal-planner.md +0 -73
- package/.claude/agents/sales/sales-account-strategist.md +0 -228
- package/.claude/agents/sales/sales-coach.md +0 -272
- package/.claude/agents/sales/sales-deal-strategist.md +0 -181
- package/.claude/agents/sales/sales-discovery-coach.md +0 -226
- package/.claude/agents/sales/sales-engineer.md +0 -183
- package/.claude/agents/sales/sales-outbound-strategist.md +0 -202
- package/.claude/agents/sales/sales-pipeline-analyst.md +0 -268
- package/.claude/agents/sales/sales-proposal-strategist.md +0 -218
- package/.claude/agents/sona/sona-learning-optimizer.md +0 -65
- package/.claude/agents/spatial-computing/macos-spatial-metal-engineer.md +0 -338
- package/.claude/agents/spatial-computing/terminal-integration-specialist.md +0 -71
- package/.claude/agents/spatial-computing/visionos-spatial-engineer.md +0 -55
- package/.claude/agents/specialists/memory-specialist.md +0 -298
- package/.claude/agents/specialists/performance-engineer.md +0 -387
- package/.claude/agents/specialists/queen-coordinator.md +0 -67
- package/.claude/agents/specialists/security-architect.md +0 -154
- package/.claude/agents/specialized/accounts-payable-agent.md +0 -186
- package/.claude/agents/specialized/corporate-training-designer.md +0 -193
- package/.claude/agents/specialized/data-consolidation-agent.md +0 -61
- package/.claude/agents/specialized/government-digital-presales-consultant.md +0 -364
- package/.claude/agents/specialized/healthcare-marketing-compliance.md +0 -396
- package/.claude/agents/specialized/recruitment-specialist.md +0 -510
- package/.claude/agents/specialized/report-distribution-agent.md +0 -66
- package/.claude/agents/specialized/sales-data-extraction-agent.md +0 -68
- package/.claude/agents/specialized/specialized-french-consulting-market.md +0 -193
- package/.claude/agents/specialized/specialized-korean-business-navigator.md +0 -217
- package/.claude/agents/specialized/specialized-salesforce-architect.md +0 -181
- package/.claude/agents/specialized/study-abroad-advisor.md +0 -283
- package/.claude/agents/specialized/supply-chain-strategist.md +0 -583
- package/.claude/agents/sublinear/consensus-coordinator.md +0 -333
- package/.claude/agents/sublinear/matrix-optimizer.md +0 -180
- package/.claude/agents/sublinear/pagerank-analyzer.md +0 -295
- package/.claude/agents/sublinear/performance-optimizer.md +0 -363
- package/.claude/agents/sublinear/trading-predictor.md +0 -242
- package/.claude/agents/support/support-analytics-reporter.md +0 -366
- package/.claude/agents/support/support-executive-summary-generator.md +0 -213
- package/.claude/agents/support/support-finance-tracker.md +0 -443
- package/.claude/agents/support/support-infrastructure-maintainer.md +0 -619
- package/.claude/agents/support/support-legal-compliance-checker.md +0 -589
- package/.claude/agents/support/support-support-responder.md +0 -586
- package/.claude/agents/swarm/adaptive-coordinator.md +0 -364
- package/.claude/agents/swarm/hierarchical-coordinator.md +0 -318
- package/.claude/agents/templates/github-pr-manager.md +0 -155
- package/.claude/agents/templates/memory-coordinator.md +0 -163
- package/.claude/agents/templates/migration-plan.md +0 -724
- package/.claude/agents/templates/orchestrator-task.md +0 -120
- package/.claude/agents/templates/performance-analyzer.md +0 -179
- package/.claude/agents/templates/sparc-coordinator.md +0 -163
- package/.claude/agents/testing/testing-reality-checker.md +0 -237
- package/.claude/commands/analysis/token-efficiency.md +0 -42
- package/.claude/commands/optimization/README.md +0 -73
- package/.claude/commands/optimization/parallel-execution.md +0 -76
- package/.claude/commands/swarm/swarm-analysis.md +0 -62
- package/.claude/commands/swarm/swarm-background.md +0 -65
- package/.claude/commands/swarm/swarm-modes.md +0 -67
- package/.claude/commands/swarm/swarm-monitor.md +0 -54
- package/.claude/commands/swarm/swarm-status.md +0 -44
- package/.claude/commands/swarm/swarm-strategies.md +0 -76
- package/.claude/commands/training/model-update.md +0 -78
- package/.claude/commands/training/pattern-learn.md +0 -69
- package/.claude/commands/training/specialization.md +0 -92
- package/.claude/commands/verify/check.md +0 -106
- package/.claude/commands/verify/start.md +0 -105
- package/.claude/helpers/README.md +0 -105
- package/.claude/helpers/context-persistence-hook.mjs +0 -1988
- package/.claude/helpers/intelligence.cjs +0 -247
- package/.claude/helpers/learning-service.mjs +0 -1302
- package/.claude/helpers/memory-palace.cjs +0 -461
- package/.claude/helpers/memory.cjs +0 -84
- package/.claude/helpers/metrics-db.mjs +0 -488
- package/.claude/helpers/router.cjs +0 -559
- package/.claude/helpers/session.cjs +0 -126
- package/.claude/helpers/swarm-hooks.sh +0 -761
- package/.claude/helpers/toggle-statusline.cjs +0 -58
- package/.claude/helpers/token-tracker.cjs +0 -934
- package/.claude/skills/agentdb-advanced/SKILL.md +0 -549
- package/.claude/skills/agentdb-learning/SKILL.md +0 -544
- package/.claude/skills/agentdb-memory-patterns/SKILL.md +0 -337
- package/.claude/skills/agentdb-optimization/SKILL.md +0 -508
- package/.claude/skills/agentdb-vector-search/SKILL.md +0 -335
- package/.claude/skills/agentic-integration/SKILL.md +0 -265
- package/.claude/skills/cli-modernization/SKILL.md +0 -950
- package/.claude/skills/core-implementation/SKILL.md +0 -892
- package/.claude/skills/ddd-architecture/SKILL.md +0 -444
- package/.claude/skills/github-code-review/SKILL.md +0 -1147
- package/.claude/skills/github-multi-repo/SKILL.md +0 -912
- package/.claude/skills/github-project-management/SKILL.md +0 -1245
- package/.claude/skills/github-release-management/SKILL.md +0 -1118
- package/.claude/skills/github-workflow-automation/SKILL.md +0 -1107
- package/.claude/skills/mcp-optimization/SKILL.md +0 -837
- package/.claude/skills/memory-unification/SKILL.md +0 -196
- package/.claude/skills/performance-optimization/SKILL.md +0 -416
- package/.claude/skills/reasoningbank-agentdb/SKILL.md +0 -444
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +0 -199
- package/.claude/skills/security-hardening/SKILL.md +0 -101
- package/.claude/skills/stream-chain/SKILL.md +0 -560
- package/.claude/skills/swarm-coordination/SKILL.md +0 -451
- package/bundled-graph/dist/src/analyze.d.ts +0 -32
- package/bundled-graph/dist/src/analyze.d.ts.map +0 -1
- package/bundled-graph/dist/src/analyze.js +0 -297
- package/bundled-graph/dist/src/analyze.js.map +0 -1
- package/bundled-graph/dist/src/build.d.ts +0 -8
- package/bundled-graph/dist/src/build.d.ts.map +0 -1
- package/bundled-graph/dist/src/build.js.map +0 -1
- package/bundled-graph/dist/src/cache.d.ts +0 -12
- package/bundled-graph/dist/src/cache.d.ts.map +0 -1
- package/bundled-graph/dist/src/cache.js +0 -43
- package/bundled-graph/dist/src/cache.js.map +0 -1
- package/bundled-graph/dist/src/cluster.d.ts +0 -5
- package/bundled-graph/dist/src/cluster.d.ts.map +0 -1
- package/bundled-graph/dist/src/cluster.js.map +0 -1
- package/bundled-graph/dist/src/detect.d.ts +0 -21
- package/bundled-graph/dist/src/detect.d.ts.map +0 -1
- package/bundled-graph/dist/src/detect.js +0 -195
- package/bundled-graph/dist/src/detect.js.map +0 -1
- package/bundled-graph/dist/src/export.d.ts +0 -21
- package/bundled-graph/dist/src/export.d.ts.map +0 -1
- package/bundled-graph/dist/src/export.js +0 -68
- package/bundled-graph/dist/src/export.js.map +0 -1
- package/bundled-graph/dist/src/extract/index.d.ts +0 -20
- package/bundled-graph/dist/src/extract/index.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/index.js +0 -158
- package/bundled-graph/dist/src/extract/index.js.map +0 -1
- package/bundled-graph/dist/src/extract/languages/c.d.ts +0 -3
- package/bundled-graph/dist/src/extract/languages/c.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/languages/c.js +0 -88
- package/bundled-graph/dist/src/extract/languages/c.js.map +0 -1
- package/bundled-graph/dist/src/extract/languages/cpp.d.ts +0 -3
- package/bundled-graph/dist/src/extract/languages/cpp.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/languages/cpp.js +0 -121
- package/bundled-graph/dist/src/extract/languages/cpp.js.map +0 -1
- package/bundled-graph/dist/src/extract/languages/csharp.d.ts +0 -3
- package/bundled-graph/dist/src/extract/languages/csharp.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/languages/csharp.js +0 -121
- package/bundled-graph/dist/src/extract/languages/csharp.js.map +0 -1
- package/bundled-graph/dist/src/extract/languages/go.d.ts +0 -3
- package/bundled-graph/dist/src/extract/languages/go.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/languages/go.js +0 -181
- package/bundled-graph/dist/src/extract/languages/go.js.map +0 -1
- package/bundled-graph/dist/src/extract/languages/java.d.ts +0 -3
- package/bundled-graph/dist/src/extract/languages/java.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/languages/java.js +0 -117
- package/bundled-graph/dist/src/extract/languages/java.js.map +0 -1
- package/bundled-graph/dist/src/extract/languages/kotlin.d.ts +0 -3
- package/bundled-graph/dist/src/extract/languages/kotlin.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/languages/kotlin.js +0 -112
- package/bundled-graph/dist/src/extract/languages/kotlin.js.map +0 -1
- package/bundled-graph/dist/src/extract/languages/php.d.ts +0 -3
- package/bundled-graph/dist/src/extract/languages/php.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/languages/php.js +0 -130
- package/bundled-graph/dist/src/extract/languages/php.js.map +0 -1
- package/bundled-graph/dist/src/extract/languages/python.d.ts +0 -3
- package/bundled-graph/dist/src/extract/languages/python.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/languages/python.js +0 -230
- package/bundled-graph/dist/src/extract/languages/python.js.map +0 -1
- package/bundled-graph/dist/src/extract/languages/ruby.d.ts +0 -3
- package/bundled-graph/dist/src/extract/languages/ruby.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/languages/ruby.js +0 -120
- package/bundled-graph/dist/src/extract/languages/ruby.js.map +0 -1
- package/bundled-graph/dist/src/extract/languages/rust.d.ts +0 -3
- package/bundled-graph/dist/src/extract/languages/rust.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/languages/rust.js +0 -195
- package/bundled-graph/dist/src/extract/languages/rust.js.map +0 -1
- package/bundled-graph/dist/src/extract/languages/scala.d.ts +0 -3
- package/bundled-graph/dist/src/extract/languages/scala.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/languages/scala.js +0 -110
- package/bundled-graph/dist/src/extract/languages/scala.js.map +0 -1
- package/bundled-graph/dist/src/extract/languages/swift.d.ts +0 -3
- package/bundled-graph/dist/src/extract/languages/swift.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/languages/swift.js +0 -122
- package/bundled-graph/dist/src/extract/languages/swift.js.map +0 -1
- package/bundled-graph/dist/src/extract/languages/typescript.d.ts +0 -3
- package/bundled-graph/dist/src/extract/languages/typescript.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/languages/typescript.js +0 -295
- package/bundled-graph/dist/src/extract/languages/typescript.js.map +0 -1
- package/bundled-graph/dist/src/extract/semantic.d.ts +0 -38
- package/bundled-graph/dist/src/extract/semantic.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/semantic.js +0 -242
- package/bundled-graph/dist/src/extract/semantic.js.map +0 -1
- package/bundled-graph/dist/src/extract/tree-sitter-runner.d.ts +0 -48
- package/bundled-graph/dist/src/extract/tree-sitter-runner.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/tree-sitter-runner.js +0 -137
- package/bundled-graph/dist/src/extract/tree-sitter-runner.js.map +0 -1
- package/bundled-graph/dist/src/extract/types.d.ts +0 -7
- package/bundled-graph/dist/src/extract/types.d.ts.map +0 -1
- package/bundled-graph/dist/src/extract/types.js +0 -2
- package/bundled-graph/dist/src/extract/types.js.map +0 -1
- package/bundled-graph/dist/src/index.d.ts +0 -28
- package/bundled-graph/dist/src/index.d.ts.map +0 -1
- package/bundled-graph/dist/src/index.js +0 -26
- package/bundled-graph/dist/src/index.js.map +0 -1
- package/bundled-graph/dist/src/pipeline.d.ts +0 -27
- package/bundled-graph/dist/src/pipeline.d.ts.map +0 -1
- package/bundled-graph/dist/src/pipeline.js +0 -269
- package/bundled-graph/dist/src/pipeline.js.map +0 -1
- package/bundled-graph/dist/src/report.d.ts +0 -26
- package/bundled-graph/dist/src/report.d.ts.map +0 -1
- package/bundled-graph/dist/src/report.js +0 -214
- package/bundled-graph/dist/src/report.js.map +0 -1
- package/bundled-graph/dist/src/types.d.ts +0 -124
- package/bundled-graph/dist/src/types.d.ts.map +0 -1
- package/bundled-graph/dist/src/types.js +0 -2
- package/bundled-graph/dist/src/types.js.map +0 -1
- package/bundled-graph/dist/src/visualize.d.ts +0 -4
- package/bundled-graph/dist/src/visualize.d.ts.map +0 -1
- package/bundled-graph/dist/src/visualize.js +0 -574
- package/bundled-graph/dist/src/visualize.js.map +0 -1
- package/bundled-graph/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/src/ui/dashboard-v2.html +0 -4576
|
@@ -1,559 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Monomind Agent Router
|
|
4
|
-
* Routes tasks to optimal agents based on learned patterns.
|
|
5
|
-
* Also does keyword-matching against skill-registry.json (dev skills)
|
|
6
|
-
* and extras-registry.json (non-dev specialist agents).
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
const path = require('path');
|
|
10
|
-
const fs = require('fs');
|
|
11
|
-
|
|
12
|
-
const AGENT_CAPABILITIES = {
|
|
13
|
-
coder: ['code-generation', 'refactoring', 'debugging', 'implementation'],
|
|
14
|
-
tester: ['unit-testing', 'integration-testing', 'coverage', 'test-generation'],
|
|
15
|
-
reviewer: ['code-review', 'security-audit', 'quality-check', 'best-practices'],
|
|
16
|
-
researcher: ['web-search', 'documentation', 'analysis', 'summarization'],
|
|
17
|
-
architect: ['system-design', 'architecture', 'patterns', 'scalability'],
|
|
18
|
-
'backend-dev': ['api', 'database', 'server', 'authentication'],
|
|
19
|
-
'frontend-dev': ['ui', 'react', 'css', 'components'],
|
|
20
|
-
devops: ['ci-cd', 'docker', 'deployment', 'infrastructure'],
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
// Maps generic role → specific specialized agents available in the system
|
|
24
|
-
const SPECIFIC_AGENTS_MAP = {
|
|
25
|
-
coder: [
|
|
26
|
-
{ slug: 'sparc-coder', label: 'sparc-coder', note: 'TDD + SPARC methodology' },
|
|
27
|
-
{ slug: 'backend-dev', label: 'backend-dev', note: 'API, DB, server-side' },
|
|
28
|
-
{ slug: 'frontend-dev', label: 'Frontend Developer', note: 'React/Vue/CSS' },
|
|
29
|
-
{ slug: 'mobile-dev', label: 'mobile-dev', note: 'React Native iOS/Android' },
|
|
30
|
-
{ slug: 'ml-developer', label: 'ml-developer', note: 'ML model dev & training' },
|
|
31
|
-
],
|
|
32
|
-
tester: [
|
|
33
|
-
{ slug: 'tdd-london-swarm', label: 'tdd-london-swarm', note: 'Mock-driven TDD' },
|
|
34
|
-
{ slug: 'API Tester', label: 'API Tester', note: 'API validation & performance' },
|
|
35
|
-
{ slug: 'production-validator', label: 'production-validator', note: 'Deployment readiness' },
|
|
36
|
-
{ slug: 'Evidence Collector', label: 'Evidence Collector', note: 'Screenshot-backed QA' },
|
|
37
|
-
{ slug: 'agent-browser-testing', label: 'agent-browser-testing', note: 'UI/browser automation testing' },
|
|
38
|
-
],
|
|
39
|
-
reviewer: [
|
|
40
|
-
{ slug: 'Code Reviewer', label: 'Code Reviewer', note: 'Correctness, security, perf' },
|
|
41
|
-
{ slug: 'code-analyzer', label: 'code-analyzer', note: 'Quality metrics & smells' },
|
|
42
|
-
{ slug: 'feature-dev:code-reviewer', label: 'feature-dev:code-reviewer',note: 'Bug & logic error detection' },
|
|
43
|
-
{ slug: 'Reality Checker', label: 'Reality Checker', note: 'Evidence-based certification' },
|
|
44
|
-
{ slug: 'Accessibility Auditor', label: 'Accessibility Auditor', note: 'WCAG & assistive tech' },
|
|
45
|
-
],
|
|
46
|
-
researcher: [
|
|
47
|
-
{ slug: 'sparc:researcher', label: 'sparc:researcher', note: 'Parallel web search + memory' },
|
|
48
|
-
{ slug: 'Explore', label: 'Explore', note: 'Fast codebase exploration' },
|
|
49
|
-
{ slug: 'Trend Researcher', label: 'Trend Researcher', note: 'Market intelligence' },
|
|
50
|
-
{ slug: 'UX Researcher', label: 'UX Researcher', note: 'User behaviour & usability' },
|
|
51
|
-
],
|
|
52
|
-
architect: [
|
|
53
|
-
{ slug: 'system-architect', label: 'system-architect', note: 'High-level system design' },
|
|
54
|
-
{ slug: 'Software Architect', label: 'Software Architect', note: 'DDD, patterns, decisions' },
|
|
55
|
-
{ slug: 'Backend Architect', label: 'Backend Architect', note: 'Scalable server-side design' },
|
|
56
|
-
{ slug: 'Plan', label: 'Plan', note: 'Implementation strategy' },
|
|
57
|
-
],
|
|
58
|
-
'backend-dev': [
|
|
59
|
-
{ slug: 'backend-dev', label: 'backend-dev', note: 'API & server patterns' },
|
|
60
|
-
{ slug: 'Database Optimizer', label: 'Database Optimizer', note: 'Schema, indexes, query tuning' },
|
|
61
|
-
{ slug: 'Data Engineer', label: 'Data Engineer', note: 'Pipelines, ETL, lakehouse' },
|
|
62
|
-
{ slug: 'Security Engineer', label: 'Security Engineer', note: 'Threat modelling, secure code' },
|
|
63
|
-
],
|
|
64
|
-
'frontend-dev': [
|
|
65
|
-
{ slug: 'Frontend Developer', label: 'Frontend Developer', note: 'React/Vue/Angular' },
|
|
66
|
-
{ slug: 'UI Designer', label: 'UI Designer', note: 'Design systems & components' },
|
|
67
|
-
{ slug: 'UX Architect', label: 'UX Architect', note: 'CSS systems & interaction' },
|
|
68
|
-
{ slug: 'mobile-dev', label: 'mobile-dev', note: 'Cross-platform mobile' },
|
|
69
|
-
],
|
|
70
|
-
devops: [
|
|
71
|
-
{ slug: 'DevOps Automator', label: 'DevOps Automator', note: 'CI/CD, infra automation' },
|
|
72
|
-
{ slug: 'SRE', label: 'SRE', note: 'SLOs, reliability, on-call' },
|
|
73
|
-
{ slug: 'cicd-engineer', label: 'cicd-engineer', note: 'GitHub Actions pipelines' },
|
|
74
|
-
{ slug: 'Incident Response Commander', label: 'Incident Response Commander', note: 'Prod incident mgmt' },
|
|
75
|
-
],
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
const TASK_PATTERNS = {
|
|
79
|
-
'\\bimplement\\b|\\bcreate\\b|\\bbuild\\b|\\badd\\b|\\bwrite\\s+code\\b': 'coder',
|
|
80
|
-
'\\btest\\b|\\bspec\\b|\\bcoverage\\b|unit test|\\bintegration\\b': 'tester',
|
|
81
|
-
'\\breview\\b|\\baudit\\b|\\bcheck\\b|\\bvalidate\\b|\\bsecurity\\b': 'reviewer',
|
|
82
|
-
'\\bresearch\\b|\\bfind\\b|\\bsearch\\b|\\bdocumentation\\b|\\bexplore\\b|\\bexplain\\b|\\bunderstand\\b|\\bhow does\\b|\\bhow do\\b|\\bwhat is\\b': 'researcher',
|
|
83
|
-
'\\bdesign\\b|\\barchitect\\b|\\bstructure\\b|\\bplan\\b': 'architect',
|
|
84
|
-
'\\bapi\\b|\\bendpoint\\b|\\bserver\\b|\\bbackend\\b|\\bdatabase\\b': 'backend-dev',
|
|
85
|
-
'\\bui\\b|\\bfrontend\\b|\\bcomponent\\b|\\breact\\b|\\bcss\\b|\\bstyle\\b': 'frontend-dev',
|
|
86
|
-
'\\bdeploy\\b|\\bdocker\\b|\\bci\\b|\\bcd\\b|\\bpipeline\\b|\\binfrastructure\\b': 'devops',
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
// Non-dev domain keywords — if matched, skip dev routing and go to extras
|
|
90
|
-
const NON_DEV_PATTERNS = [
|
|
91
|
-
'marketing', 'campaign', 'social media', 'tiktok', 'instagram', 'twitter', 'linkedin',
|
|
92
|
-
'seo', 'content creation', 'viral', 'growth hacking', 'brand', 'influencer', 'ecommerce',
|
|
93
|
-
'sales', 'crm', 'sales pipeline', 'leads', 'prospects', 'quota', 'outbound',
|
|
94
|
-
'paid media', 'ppc', 'google ads', 'facebook ads', 'programmatic', 'display ads',
|
|
95
|
-
'product management', 'product roadmap', 'sprint', 'backlog', 'user story', 'customer feedback',
|
|
96
|
-
'project management', 'milestone', 'stakeholder', 'jira', 'agile', 'scrum',
|
|
97
|
-
'ux research', 'user research', 'usability', 'wireframe', 'prototype', 'figma',
|
|
98
|
-
'ui design', 'visual design', 'illustration', 'branding',
|
|
99
|
-
'academic', 'anthropology', 'history', 'geography', 'psychology', 'narrative theory',
|
|
100
|
-
'blockchain', 'salesforce', 'healthcare', 'compliance', 'supply chain',
|
|
101
|
-
'recruitment', 'hiring', 'human resources', 'finance tracking', 'invoice', 'executive summary',
|
|
102
|
-
'customer support', 'helpdesk', 'podcast', 'video editing', 'short video',
|
|
103
|
-
];
|
|
104
|
-
|
|
105
|
-
// ─── Skill registry (dev skills) ────────────────────────────────────────────
|
|
106
|
-
let _skillRegistry = null;
|
|
107
|
-
function loadSkillRegistry() {
|
|
108
|
-
if (_skillRegistry) return _skillRegistry;
|
|
109
|
-
try {
|
|
110
|
-
_skillRegistry = JSON.parse(fs.readFileSync(path.join(__dirname, 'skill-registry.json'), 'utf8'));
|
|
111
|
-
} catch (e) { _skillRegistry = { skills: [] }; }
|
|
112
|
-
return _skillRegistry;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// ─── Extras registry (non-dev agents) ───────────────────────────────────────
|
|
116
|
-
let _extrasRegistry = null;
|
|
117
|
-
function loadExtrasRegistry() {
|
|
118
|
-
if (_extrasRegistry) return _extrasRegistry;
|
|
119
|
-
try {
|
|
120
|
-
_extrasRegistry = JSON.parse(fs.readFileSync(path.join(__dirname, 'extras-registry.json'), 'utf8'));
|
|
121
|
-
} catch (e) { _extrasRegistry = { extras: [] }; }
|
|
122
|
-
return _extrasRegistry;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// ─── Scoring helpers ─────────────────────────────────────────────────────────
|
|
126
|
-
function scoreEntry(keywords, taskLower) {
|
|
127
|
-
if (!Array.isArray(keywords)) return 0;
|
|
128
|
-
let score = 0;
|
|
129
|
-
for (const kw of keywords) {
|
|
130
|
-
if (typeof kw === 'string' && taskLower.includes(kw.toLowerCase())) score++;
|
|
131
|
-
}
|
|
132
|
-
return score;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
function matchSkills(task, topN = 5) {
|
|
136
|
-
if (typeof task !== 'string') return [];
|
|
137
|
-
const registry = loadSkillRegistry();
|
|
138
|
-
const taskLower = task.toLowerCase();
|
|
139
|
-
return registry.skills
|
|
140
|
-
.map(s => ({ skill: s.skill, invoke: s.invoke, description: s.description, category: s.category, score: scoreEntry(s.keywords, taskLower) }))
|
|
141
|
-
.filter(s => s.score > 0)
|
|
142
|
-
.sort((a, b) => b.score - a.score)
|
|
143
|
-
.slice(0, topN);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// Categories that are almost never relevant in a software project context.
|
|
147
|
-
// We exclude these from extras suggestions UNLESS the prompt has explicit
|
|
148
|
-
// keywords that opt them back in. Default-conservative: in a code repo,
|
|
149
|
-
// an "Anthropologist" for "community docs" or "Unity Architect" for a
|
|
150
|
-
// "community module" is noise, not signal.
|
|
151
|
-
const _NON_DEV_EXTRA_CATEGORIES = new Set([
|
|
152
|
-
'academic', // Anthropologist, Geographer, Historian, Narratologist, Psychologist
|
|
153
|
-
'game-development', // Unity/Unreal/Godot/Blender — irrelevant for non-game codebases
|
|
154
|
-
'marketing',
|
|
155
|
-
'sales',
|
|
156
|
-
'paid-media',
|
|
157
|
-
'design', // brand/UI/UX specialists — irrelevant for code reviews
|
|
158
|
-
]);
|
|
159
|
-
|
|
160
|
-
// Per-category opt-in keywords. If the prompt mentions one of these, that
|
|
161
|
-
// category is allowed back into extras.
|
|
162
|
-
const _CATEGORY_OPTIN_KEYWORDS = {
|
|
163
|
-
'academic': /\b(anthropolog|sociolog|cultural|ritual|kinship|ethnograph|histor(?:y|ical|ian)|geograph|narratolog|psycholog|belief\s*system)\b/i,
|
|
164
|
-
'game-development': /\b(unity|unreal|godot|blender|game\s*(?:design|dev|engine)|gameplay|shader\s*graph|level\s*design|ugc|roblox)\b/i,
|
|
165
|
-
'marketing': /\b(marketing|advertis|seo|tiktok|instagram|linkedin\s*content|brand|campaign|growth\s*hack|copywrit|blog\s*post|press\s*release|launch\s*strategy|pitch|investor)\b/i,
|
|
166
|
-
'sales': /\b(sales|prospect|outbound|pipeline|crm|cold\s*email|deal|account\s*strategy|quota|forecast|qbr)\b/i,
|
|
167
|
-
'paid-media': /\b(paid\s*media|ads?|google\s*ads|meta\s*ads|programmatic|ppc|cpa|conversion\s*tracking)\b/i,
|
|
168
|
-
'design': /\b(figma|brand\s*identity|design\s*system|ux\s*research|persona|usability|wireframe|prototype|color\s*palette|typography|moodboard)\b/i,
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
function _allowedExtraCategories(taskLower) {
|
|
172
|
-
const allowed = new Set();
|
|
173
|
-
for (const [cat, re] of Object.entries(_CATEGORY_OPTIN_KEYWORDS)) {
|
|
174
|
-
if (re.test(taskLower)) allowed.add(cat);
|
|
175
|
-
}
|
|
176
|
-
return allowed;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
function matchExtras(task, topN = 8) {
|
|
180
|
-
if (typeof task !== 'string') return [];
|
|
181
|
-
const registry = loadExtrasRegistry();
|
|
182
|
-
const taskLower = task.toLowerCase();
|
|
183
|
-
const optedIn = _allowedExtraCategories(taskLower);
|
|
184
|
-
return registry.extras
|
|
185
|
-
.filter(e => !_NON_DEV_EXTRA_CATEGORIES.has(e.category) || optedIn.has(e.category))
|
|
186
|
-
.map(e => ({ slug: e.slug, name: e.name, description: e.description, category: e.category, filePath: e.filePath, score: scoreEntry(e.keywords, taskLower) }))
|
|
187
|
-
.filter(e => e.score > 0)
|
|
188
|
-
.sort((a, b) => b.score - a.score)
|
|
189
|
-
.slice(0, topN);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// Pre-compiled word-boundary regexes for non-dev patterns (built once at load time)
|
|
193
|
-
const _nonDevRegexes = NON_DEV_PATTERNS.map(function(kw) {
|
|
194
|
-
const escaped = kw.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\s+/g, '\\s+');
|
|
195
|
-
return new RegExp('\\b' + escaped + '\\b', 'i');
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
function isNonDevTask(taskLower) {
|
|
199
|
-
for (const re of _nonDevRegexes) {
|
|
200
|
-
if (re.test(taskLower)) return true;
|
|
201
|
-
}
|
|
202
|
-
return false;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// ─── Two-Stage Keyword Router (for non-dev and ambiguous tasks) ──────────────
|
|
206
|
-
// Stage 1: pick best category by scoring task tokens against category keywords
|
|
207
|
-
// Stage 2: pick best agent within that category by keyword overlap
|
|
208
|
-
// Pure in-process — no external API calls, no API key required.
|
|
209
|
-
|
|
210
|
-
function buildCategoryList() {
|
|
211
|
-
const registry = loadExtrasRegistry();
|
|
212
|
-
const cats = {};
|
|
213
|
-
for (const e of registry.extras) {
|
|
214
|
-
if (!cats[e.category]) cats[e.category] = [];
|
|
215
|
-
cats[e.category].push(e.name);
|
|
216
|
-
}
|
|
217
|
-
return Object.entries(cats).map(([name, agents]) => ({
|
|
218
|
-
name,
|
|
219
|
-
count: agents.length,
|
|
220
|
-
examples: agents.slice(0, 4).join(', '),
|
|
221
|
-
}));
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
function getAgentsInCategory(category) {
|
|
225
|
-
const registry = loadExtrasRegistry();
|
|
226
|
-
return registry.extras
|
|
227
|
-
.filter(e => e.category === category)
|
|
228
|
-
.map(e => ({ slug: e.slug, name: e.name, description: (e.description || '').slice(0, 120) }));
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// Score a task string against an agent entry using keyword overlap
|
|
232
|
-
function scoreAgainstEntry(taskTokens, entry) {
|
|
233
|
-
let score = 0;
|
|
234
|
-
const nameTokens = (entry.name || '').toLowerCase().split(/\W+/).filter(Boolean);
|
|
235
|
-
const descTokens = (entry.description || '').toLowerCase().split(/\W+/).filter(Boolean);
|
|
236
|
-
const kwTokens = Array.isArray(entry.keywords) ? entry.keywords.map(k => k.toLowerCase()) : [];
|
|
237
|
-
const allTokens = new Set([...nameTokens, ...descTokens, ...kwTokens]);
|
|
238
|
-
for (const t of taskTokens) {
|
|
239
|
-
if (allTokens.has(t)) score += 2;
|
|
240
|
-
else for (const s of allTokens) { if (s.includes(t) || t.includes(s)) { score += 1; break; } }
|
|
241
|
-
}
|
|
242
|
-
return score;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// Category-level score: sum agent scores within the category
|
|
246
|
-
function scoreCategoryForTask(taskTokens, category, registry) {
|
|
247
|
-
const agents = registry.extras.filter(e => e.category === category);
|
|
248
|
-
return agents.reduce((sum, e) => sum + scoreAgainstEntry(taskTokens, e), 0);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
async function routeTaskLLM(task) {
|
|
252
|
-
const registry = loadExtrasRegistry();
|
|
253
|
-
if (!registry.extras.length) return null;
|
|
254
|
-
|
|
255
|
-
const taskLower = task.toLowerCase();
|
|
256
|
-
const STOP = new Set(['the','and','for','are','but','not','you','all','can','had','her','was','one','our','out','day','get','has','him','his','how','its','may','new','now','old','see','two','way','who','did','let','put','say','she','too','use','will','with','that','this','from','they','been','have','make','then','than','when','what','does','into','your']);
|
|
257
|
-
const taskTokens = taskLower.split(/\W+/).filter(w => w.length > 3 && !STOP.has(w));
|
|
258
|
-
|
|
259
|
-
// Stage 1: pick best category by aggregate keyword score
|
|
260
|
-
const categories = [...new Set(registry.extras.map(e => e.category))];
|
|
261
|
-
const catScores = categories.map(cat => ({
|
|
262
|
-
cat,
|
|
263
|
-
score: scoreCategoryForTask(taskTokens, cat, registry),
|
|
264
|
-
})).sort((a, b) => b.score - a.score);
|
|
265
|
-
|
|
266
|
-
const bestCat = catScores[0];
|
|
267
|
-
if (!bestCat || bestCat.score === 0) return null;
|
|
268
|
-
|
|
269
|
-
// Stage 2: pick best agent within the category
|
|
270
|
-
const candidates = registry.extras.filter(e => e.category === bestCat.cat);
|
|
271
|
-
const scored = candidates.map(e => ({ e, score: scoreAgainstEntry(taskTokens, e) }))
|
|
272
|
-
.sort((a, b) => b.score - a.score);
|
|
273
|
-
|
|
274
|
-
const top = scored[0];
|
|
275
|
-
if (!top || top.score === 0) return null;
|
|
276
|
-
|
|
277
|
-
const allInCat = candidates.map(e => ({ slug: e.slug, label: e.name, note: e.category }));
|
|
278
|
-
return {
|
|
279
|
-
agent: top.e.name,
|
|
280
|
-
agentSlug: top.e.slug,
|
|
281
|
-
confidence: Math.min(0.85, 0.5 + top.score * 0.05),
|
|
282
|
-
reason: `Keyword 2-stage: ${bestCat.cat} → ${top.e.name}`,
|
|
283
|
-
category: bestCat.cat,
|
|
284
|
-
allInCategory: allInCat,
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* Route multiple subtasks for swarm agent selection.
|
|
290
|
-
* Each subtask description gets its own 2-stage LLM routing.
|
|
291
|
-
* Returns array of { subtask, agent, agentSlug, confidence, reason }.
|
|
292
|
-
*/
|
|
293
|
-
async function routeSwarmAgents(subtasks) {
|
|
294
|
-
if (!Array.isArray(subtasks) || !subtasks.length) return [];
|
|
295
|
-
const results = await Promise.all(subtasks.map(async (sub) => {
|
|
296
|
-
const desc = typeof sub === 'string' ? sub : sub.description || sub.task || '';
|
|
297
|
-
if (!desc) return { subtask: desc, agent: 'coder', agentSlug: 'coder', confidence: 0.5, reason: 'empty subtask' };
|
|
298
|
-
const llm = await routeTaskLLM(desc);
|
|
299
|
-
if (llm) return { subtask: desc, agent: llm.agent, agentSlug: llm.agentSlug, confidence: llm.confidence, reason: llm.reason };
|
|
300
|
-
const kw = routeTask(desc);
|
|
301
|
-
return { subtask: desc, agent: kw.agent, agentSlug: kw.agentSlug, confidence: kw.confidence, reason: kw.reason };
|
|
302
|
-
}));
|
|
303
|
-
return results;
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
// ─── RouteLayer bridge (GAP-002) ─────────────────────────────────────────────
|
|
307
|
-
// Cache a Promise so concurrent callers all await the same load operation.
|
|
308
|
-
var _routeLayerPromise = null;
|
|
309
|
-
|
|
310
|
-
async function tryLoadRouteLayer() {
|
|
311
|
-
if (!_routeLayerPromise) {
|
|
312
|
-
_routeLayerPromise = (async function() {
|
|
313
|
-
try {
|
|
314
|
-
var routingModule = await import('@monomind/routing');
|
|
315
|
-
if (routingModule && routingModule.RouteLayer && routingModule.ALL_ROUTES) {
|
|
316
|
-
return new routingModule.RouteLayer({ routes: routingModule.ALL_ROUTES });
|
|
317
|
-
}
|
|
318
|
-
} catch (e) { /* @monomind/routing not compiled — keyword fallback will be used */ }
|
|
319
|
-
return null;
|
|
320
|
-
})();
|
|
321
|
-
}
|
|
322
|
-
return _routeLayerPromise;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Async variant — tries LLM 2-stage routing for non-dev tasks,
|
|
327
|
-
* RouteLayer semantic routing for dev tasks, falls back to keywords.
|
|
328
|
-
*/
|
|
329
|
-
async function routeTaskSemantic(task) {
|
|
330
|
-
if (typeof task !== 'string' || !task) return routeTask(task);
|
|
331
|
-
const taskLower = task.toLowerCase();
|
|
332
|
-
|
|
333
|
-
// For non-dev tasks or ambiguous defaults, try LLM 2-stage routing first
|
|
334
|
-
if (isNonDevTask(taskLower)) {
|
|
335
|
-
const llmResult = await routeTaskLLM(task);
|
|
336
|
-
if (llmResult) {
|
|
337
|
-
const extrasMatches = matchExtras(task);
|
|
338
|
-
return {
|
|
339
|
-
agent: llmResult.agent,
|
|
340
|
-
agentSlug: llmResult.agentSlug,
|
|
341
|
-
confidence: llmResult.confidence,
|
|
342
|
-
reason: llmResult.reason,
|
|
343
|
-
skillMatches: [],
|
|
344
|
-
extrasMatches,
|
|
345
|
-
specificAgents: llmResult.allInCategory.slice(0, 5),
|
|
346
|
-
llmRouting: true,
|
|
347
|
-
};
|
|
348
|
-
}
|
|
349
|
-
// LLM failed — fall through to keyword-based extras matching
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
// Dev tasks: try RouteLayer semantic routing
|
|
353
|
-
const rl = await tryLoadRouteLayer();
|
|
354
|
-
if (rl && rl.route) {
|
|
355
|
-
try {
|
|
356
|
-
const semantic = await rl.route(task);
|
|
357
|
-
if (semantic && semantic.agentSlug && semantic.confidence > 0.6) {
|
|
358
|
-
const mapEntry = SPECIFIC_AGENTS_MAP[semantic.agentSlug];
|
|
359
|
-
const isDevDomain = !!(mapEntry && mapEntry.length > 0);
|
|
360
|
-
const extrasForTask = isDevDomain ? [] : matchExtras(task);
|
|
361
|
-
const semanticSpecificAgents = (mapEntry && mapEntry.length > 0)
|
|
362
|
-
? mapEntry
|
|
363
|
-
: extrasForTask.slice(0, 5).map(e => ({ slug: e.slug, label: e.name, note: e.category }));
|
|
364
|
-
return {
|
|
365
|
-
agent: semantic.agentSlug,
|
|
366
|
-
agentSlug: semantic.agentSlug,
|
|
367
|
-
confidence: semantic.confidence,
|
|
368
|
-
reason: 'RouteLayer semantic (' + (semantic.method || 'semantic') + '): ' + semantic.routeName,
|
|
369
|
-
skillMatches: matchSkills(task),
|
|
370
|
-
extrasMatches: extrasForTask,
|
|
371
|
-
specificAgents: semanticSpecificAgents,
|
|
372
|
-
semanticRouting: true,
|
|
373
|
-
};
|
|
374
|
-
}
|
|
375
|
-
} catch (e) { /* fall through to keyword */ }
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
// Default keyword fallback — also try LLM if no dev pattern matched
|
|
379
|
-
const keywordResult = routeTask(task);
|
|
380
|
-
if (keywordResult.confidence <= 0.5) {
|
|
381
|
-
const llmResult = await routeTaskLLM(task);
|
|
382
|
-
if (llmResult) {
|
|
383
|
-
return {
|
|
384
|
-
agent: llmResult.agent,
|
|
385
|
-
agentSlug: llmResult.agentSlug,
|
|
386
|
-
confidence: llmResult.confidence,
|
|
387
|
-
reason: llmResult.reason,
|
|
388
|
-
skillMatches: keywordResult.skillMatches,
|
|
389
|
-
extrasMatches: matchExtras(task),
|
|
390
|
-
specificAgents: llmResult.allInCategory.slice(0, 5),
|
|
391
|
-
llmRouting: true,
|
|
392
|
-
};
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
return keywordResult;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
// ─── Feedback weight loader ───────────────────────────────────────────────────
|
|
399
|
-
// Reads .monomind/routing-feedback.jsonl to compute per-agent success-rate
|
|
400
|
-
// weights. Weights are memoized with a 60-second TTL.
|
|
401
|
-
//
|
|
402
|
-
// Signal source: routing-feedback.jsonl entries with a non-null intelligenceFeedback
|
|
403
|
-
// boolean. Derived at session-end from intelligence-outcomes.jsonl (30-minute window,
|
|
404
|
-
// majority-vote). Requires MIN_FEEDBACK_SAMPLES entries per agent to activate.
|
|
405
|
-
//
|
|
406
|
-
// To verify: copy .monomind/test-fixtures/routing-feedback-seeded.jsonl to
|
|
407
|
-
// .monomind/routing-feedback.jsonl, then call loadFeedbackWeights() in a REPL.
|
|
408
|
-
|
|
409
|
-
var _feedbackWeightsCache = null;
|
|
410
|
-
var _feedbackWeightsCacheTime = 0;
|
|
411
|
-
var FEEDBACK_CACHE_TTL_MS = 60000;
|
|
412
|
-
var MIN_FEEDBACK_SAMPLES = 10;
|
|
413
|
-
|
|
414
|
-
function loadFeedbackWeights() {
|
|
415
|
-
var now = Date.now();
|
|
416
|
-
if (_feedbackWeightsCache && now - _feedbackWeightsCacheTime < FEEDBACK_CACHE_TTL_MS) {
|
|
417
|
-
return _feedbackWeightsCache;
|
|
418
|
-
}
|
|
419
|
-
var feedbackPath = path.join(process.cwd(), '.monomind', 'routing-feedback.jsonl');
|
|
420
|
-
if (!fs.existsSync(feedbackPath)) {
|
|
421
|
-
_feedbackWeightsCache = new Map();
|
|
422
|
-
_feedbackWeightsCacheTime = now;
|
|
423
|
-
return _feedbackWeightsCache;
|
|
424
|
-
}
|
|
425
|
-
var lines;
|
|
426
|
-
try {
|
|
427
|
-
lines = fs.readFileSync(feedbackPath, 'utf8').trim().split('\n').filter(Boolean);
|
|
428
|
-
} catch {
|
|
429
|
-
_feedbackWeightsCache = new Map();
|
|
430
|
-
_feedbackWeightsCacheTime = now;
|
|
431
|
-
return _feedbackWeightsCache;
|
|
432
|
-
}
|
|
433
|
-
var agentStats = {};
|
|
434
|
-
for (var i = 0; i < lines.length; i++) {
|
|
435
|
-
try {
|
|
436
|
-
var entry = JSON.parse(lines[i]);
|
|
437
|
-
var agent = entry.suggestedAgent || entry.agent;
|
|
438
|
-
if (!agent) continue;
|
|
439
|
-
if (!agentStats[agent]) agentStats[agent] = { total: 0, successTotal: 0, withSignal: 0 };
|
|
440
|
-
agentStats[agent].total++;
|
|
441
|
-
// Only count entries where intelligenceFeedback is non-null as having signal
|
|
442
|
-
var fb = entry.intelligenceFeedback;
|
|
443
|
-
if (fb !== null && fb !== undefined) {
|
|
444
|
-
agentStats[agent].withSignal++;
|
|
445
|
-
var success = fb === true || (fb && fb.success === true);
|
|
446
|
-
if (success) agentStats[agent].successTotal++;
|
|
447
|
-
}
|
|
448
|
-
} catch { /* skip malformed lines */ }
|
|
449
|
-
}
|
|
450
|
-
var weights = new Map();
|
|
451
|
-
for (var agentName in agentStats) {
|
|
452
|
-
var stats = agentStats[agentName];
|
|
453
|
-
// Only activate weight when we have enough non-null signal entries
|
|
454
|
-
if (stats.withSignal >= MIN_FEEDBACK_SAMPLES) {
|
|
455
|
-
var rate = stats.successTotal / stats.withSignal;
|
|
456
|
-
// Clamp to [0.5, 1.5]: bad agents get penalized, good agents boosted slightly
|
|
457
|
-
weights.set(agentName, Math.max(0.5, Math.min(1.5, rate * 2)));
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
_feedbackWeightsCache = weights;
|
|
461
|
-
_feedbackWeightsCacheTime = now;
|
|
462
|
-
return weights;
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
// ─── Main routing ─────────────────────────────────────────────────────────────
|
|
466
|
-
function routeTask(task) {
|
|
467
|
-
if (typeof task !== 'string' || !task) {
|
|
468
|
-
return { agent: 'coder', agentSlug: 'coder', confidence: 0, reason: 'Empty task', skillMatches: [], extrasMatches: [], specificAgents: SPECIFIC_AGENTS_MAP['coder'] || [] };
|
|
469
|
-
}
|
|
470
|
-
const taskLower = task.toLowerCase();
|
|
471
|
-
|
|
472
|
-
// Check non-dev first — resolve to the top-matched specialist agent name (never "extras")
|
|
473
|
-
if (isNonDevTask(taskLower)) {
|
|
474
|
-
const extrasMatches = matchExtras(task);
|
|
475
|
-
const top = extrasMatches[0];
|
|
476
|
-
const agentName = top ? top.name : 'Specialist Agent';
|
|
477
|
-
const agentSlug = top ? top.slug : 'specialist-agent';
|
|
478
|
-
return {
|
|
479
|
-
agent: agentName,
|
|
480
|
-
agentSlug: agentSlug,
|
|
481
|
-
confidence: top ? 0.85 : 0.5,
|
|
482
|
-
reason: 'Domain: ' + (top ? top.category : 'non-dev') + ' | /specialagent',
|
|
483
|
-
skillMatches: [],
|
|
484
|
-
extrasMatches,
|
|
485
|
-
specificAgents: extrasMatches.slice(0, 5).map(e => ({ slug: e.slug, label: e.name, note: e.category })),
|
|
486
|
-
};
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
var feedbackWeights = loadFeedbackWeights();
|
|
490
|
-
|
|
491
|
-
// Dev task pattern matching
|
|
492
|
-
for (const [pattern, agent] of Object.entries(TASK_PATTERNS)) {
|
|
493
|
-
const regex = new RegExp(pattern, 'i');
|
|
494
|
-
if (regex.test(taskLower)) {
|
|
495
|
-
// Apply feedback weight to confidence (defaults to 1.0 = no change)
|
|
496
|
-
var baseConfidence = 0.8;
|
|
497
|
-
var weight = feedbackWeights.get(agent) || 1.0;
|
|
498
|
-
return {
|
|
499
|
-
agent,
|
|
500
|
-
agentSlug: agent,
|
|
501
|
-
confidence: Math.min(1.0, baseConfidence * weight),
|
|
502
|
-
reason: `Matched pattern: ${pattern}`,
|
|
503
|
-
skillMatches: matchSkills(task),
|
|
504
|
-
extrasMatches: [],
|
|
505
|
-
specificAgents: SPECIFIC_AGENTS_MAP[agent] || [],
|
|
506
|
-
};
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
// Default — low confidence, show both skill and extras suggestions
|
|
511
|
-
var defaultAgent = 'coder';
|
|
512
|
-
var defaultWeight = feedbackWeights.get(defaultAgent) || 1.0;
|
|
513
|
-
return {
|
|
514
|
-
agent: defaultAgent,
|
|
515
|
-
agentSlug: defaultAgent,
|
|
516
|
-
confidence: Math.min(1.0, 0.5 * defaultWeight),
|
|
517
|
-
reason: 'Default routing - no specific pattern matched',
|
|
518
|
-
skillMatches: matchSkills(task),
|
|
519
|
-
extrasMatches: matchExtras(task),
|
|
520
|
-
specificAgents: SPECIFIC_AGENTS_MAP[defaultAgent] || [],
|
|
521
|
-
};
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
/**
|
|
525
|
-
* Load the full text of an extras agent by slug.
|
|
526
|
-
* Used when Claude picks an agent to activate.
|
|
527
|
-
*/
|
|
528
|
-
function loadExtrasAgent(slug) {
|
|
529
|
-
if (typeof slug !== 'string' || !slug) return null;
|
|
530
|
-
const registry = loadExtrasRegistry();
|
|
531
|
-
const slugLower = slug.toLowerCase();
|
|
532
|
-
const entry = registry.extras.find(e =>
|
|
533
|
-
e.slug === slug || (typeof e.name === 'string' && e.name.toLowerCase() === slugLower)
|
|
534
|
-
);
|
|
535
|
-
if (!entry) return null;
|
|
536
|
-
try {
|
|
537
|
-
const resolvedPath = path.isAbsolute(entry.filePath)
|
|
538
|
-
? entry.filePath
|
|
539
|
-
: path.resolve(__dirname, entry.filePath);
|
|
540
|
-
return { ...entry, content: fs.readFileSync(resolvedPath, 'utf8') };
|
|
541
|
-
} catch (e) { return null; }
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
module.exports = { routeTask, routeTaskSemantic, routeTaskLLM, routeSwarmAgents, matchSkills, matchExtras, loadExtrasAgent, loadExtrasRegistry, loadSkillRegistry, buildCategoryList, getAgentsInCategory, AGENT_CAPABILITIES, TASK_PATTERNS };
|
|
545
|
-
|
|
546
|
-
// CLI
|
|
547
|
-
if (require.main === module) {
|
|
548
|
-
const args = process.argv.slice(2);
|
|
549
|
-
if (args[0] === '--load-agent') {
|
|
550
|
-
const agent = loadExtrasAgent(args.slice(1).join(' '));
|
|
551
|
-
if (agent) { console.log(agent.content); }
|
|
552
|
-
else { console.error('Agent not found'); process.exit(1); }
|
|
553
|
-
} else if (args.length) {
|
|
554
|
-
const result = routeTask(args.join(' '));
|
|
555
|
-
console.log(JSON.stringify(result, null, 2));
|
|
556
|
-
} else {
|
|
557
|
-
console.log('Usage: router.cjs <task> OR router.cjs --load-agent <slug>');
|
|
558
|
-
}
|
|
559
|
-
}
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Monomind Cross-Platform Session Manager
|
|
4
|
-
* Works on Windows, macOS, and Linux
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const fs = require('fs');
|
|
8
|
-
const path = require('path');
|
|
9
|
-
const os = require('os');
|
|
10
|
-
|
|
11
|
-
const platform = os.platform();
|
|
12
|
-
const homeDir = os.homedir();
|
|
13
|
-
|
|
14
|
-
function getDataDir() {
|
|
15
|
-
const baseDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
16
|
-
const localDir = path.join(baseDir, '.monomind', 'sessions');
|
|
17
|
-
if (fs.existsSync(path.dirname(localDir))) {
|
|
18
|
-
return localDir;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
switch (platform) {
|
|
22
|
-
case 'win32':
|
|
23
|
-
return path.join(process.env.APPDATA || homeDir, 'monomind', 'sessions');
|
|
24
|
-
case 'darwin':
|
|
25
|
-
return path.join(homeDir, 'Library', 'Application Support', 'monomind', 'sessions');
|
|
26
|
-
default:
|
|
27
|
-
return path.join(homeDir, '.monomind', 'sessions');
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const SESSION_DIR = getDataDir();
|
|
32
|
-
const SESSION_FILE = path.join(SESSION_DIR, 'current.json');
|
|
33
|
-
|
|
34
|
-
function ensureDir(dir) {
|
|
35
|
-
if (!fs.existsSync(dir)) {
|
|
36
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const commands = {
|
|
41
|
-
start: () => {
|
|
42
|
-
ensureDir(SESSION_DIR);
|
|
43
|
-
const sessionId = `session-${Date.now()}`;
|
|
44
|
-
const session = {
|
|
45
|
-
id: sessionId,
|
|
46
|
-
startedAt: new Date().toISOString(),
|
|
47
|
-
platform: platform,
|
|
48
|
-
cwd: process.cwd(),
|
|
49
|
-
context: {},
|
|
50
|
-
metrics: { edits: 0, commands: 0, tasks: 0, errors: 0 }
|
|
51
|
-
};
|
|
52
|
-
fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
|
|
53
|
-
console.log(`Session started: ${sessionId}`);
|
|
54
|
-
return session;
|
|
55
|
-
},
|
|
56
|
-
|
|
57
|
-
restore: () => {
|
|
58
|
-
if (!fs.existsSync(SESSION_FILE)) {
|
|
59
|
-
console.log('No session to restore');
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
|
|
63
|
-
session.restoredAt = new Date().toISOString();
|
|
64
|
-
fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
|
|
65
|
-
console.log(`Session restored: ${session.id}`);
|
|
66
|
-
return session;
|
|
67
|
-
},
|
|
68
|
-
|
|
69
|
-
end: () => {
|
|
70
|
-
if (!fs.existsSync(SESSION_FILE)) {
|
|
71
|
-
console.log('No active session');
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
|
|
75
|
-
session.endedAt = new Date().toISOString();
|
|
76
|
-
session.duration = Date.now() - new Date(session.startedAt).getTime();
|
|
77
|
-
|
|
78
|
-
const archivePath = path.join(SESSION_DIR, `${session.id}.json`);
|
|
79
|
-
fs.writeFileSync(archivePath, JSON.stringify(session, null, 2));
|
|
80
|
-
fs.unlinkSync(SESSION_FILE);
|
|
81
|
-
|
|
82
|
-
console.log(`Session ended: ${session.id}`);
|
|
83
|
-
console.log(`Duration: ${Math.round(session.duration / 1000 / 60)} minutes`);
|
|
84
|
-
return session;
|
|
85
|
-
},
|
|
86
|
-
|
|
87
|
-
status: () => {
|
|
88
|
-
if (!fs.existsSync(SESSION_FILE)) {
|
|
89
|
-
console.log('No active session');
|
|
90
|
-
return null;
|
|
91
|
-
}
|
|
92
|
-
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
|
|
93
|
-
const duration = Date.now() - new Date(session.startedAt).getTime();
|
|
94
|
-
console.log(`Session: ${session.id}`);
|
|
95
|
-
console.log(`Platform: ${session.platform}`);
|
|
96
|
-
console.log(`Started: ${session.startedAt}`);
|
|
97
|
-
console.log(`Duration: ${Math.round(duration / 1000 / 60)} minutes`);
|
|
98
|
-
return session;
|
|
99
|
-
},
|
|
100
|
-
|
|
101
|
-
metric: (name) => {
|
|
102
|
-
if (!fs.existsSync(SESSION_FILE)) {
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
const session = JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8'));
|
|
106
|
-
if (session.metrics[name] !== undefined) {
|
|
107
|
-
session.metrics[name]++;
|
|
108
|
-
fs.writeFileSync(SESSION_FILE, JSON.stringify(session, null, 2));
|
|
109
|
-
}
|
|
110
|
-
return session;
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
module.exports = commands;
|
|
115
|
-
|
|
116
|
-
// CLI - only run when executed directly
|
|
117
|
-
if (require.main === module) {
|
|
118
|
-
const [,, command, ...args] = process.argv;
|
|
119
|
-
if (command && commands[command]) {
|
|
120
|
-
commands[command](...args);
|
|
121
|
-
} else {
|
|
122
|
-
console.log('Usage: session.js <start|restore|end|status|metric>');
|
|
123
|
-
console.log(`Platform: ${platform}`);
|
|
124
|
-
console.log(`Data dir: ${SESSION_DIR}`);
|
|
125
|
-
}
|
|
126
|
-
}
|