monomind 1.18.15 → 1.19.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.
Files changed (183) hide show
  1. package/.claude/agents/core/researcher.md +29 -24
  2. package/.claude/agents/github/code-review-swarm.md +1 -1
  3. package/.claude/agents/github/github-modes.md +1 -1
  4. package/.claude/agents/github/issue-tracker.md +1 -1
  5. package/.claude/agents/github/multi-repo-swarm.md +1 -1
  6. package/.claude/agents/github/pr-manager.md +1 -1
  7. package/.claude/agents/github/project-board-sync.md +1 -1
  8. package/.claude/agents/github/release-manager.md +1 -1
  9. package/.claude/agents/github/repo-architect.md +1 -1
  10. package/.claude/agents/github/swarm-issue.md +1 -1
  11. package/.claude/agents/github/swarm-pr.md +1 -1
  12. package/.claude/agents/github/sync-coordinator.md +1 -1
  13. package/.claude/agents/github/workflow-automation.md +1 -1
  14. package/.claude/agents/goal/goal-planner.md +1 -1
  15. package/.claude/agents/specialized/specialized-workflow-architect.md +11 -14
  16. package/.claude/agents/testing/production-validator.md +8 -7
  17. package/.claude/agents/testing/testing-evidence-collector.md +3 -1
  18. package/.claude/commands/mastermind/code-review.md +4 -4
  19. package/.claude/commands/mastermind/help.md +2 -2
  20. package/.claude/commands/mastermind/okf-export.md +14 -0
  21. package/.claude/commands/mastermind/okf-import.md +15 -0
  22. package/.claude/helpers/handlers/agent-start-handler.cjs +11 -36
  23. package/.claude/helpers/handlers/capture-handler.cjs +110 -0
  24. package/.claude/helpers/handlers/route-handler.cjs +174 -247
  25. package/.claude/helpers/handlers/session-handler.cjs +139 -142
  26. package/.claude/helpers/handlers/session-restore-handler.cjs +15 -10
  27. package/.claude/helpers/handlers/task-handler.cjs +8 -155
  28. package/.claude/helpers/hook-handler.cjs +89 -5
  29. package/.claude/helpers/intelligence.cjs +164 -15
  30. package/.claude/helpers/learning-service.mjs +1 -0
  31. package/.claude/helpers/mastermind-activate.cjs +33 -51
  32. package/.claude/helpers/monolean-activate.cjs +13 -3
  33. package/.claude/helpers/monolean-propagate.cjs +7 -3
  34. package/.claude/helpers/router.cjs +47 -9
  35. package/.claude/settings.json +0 -20
  36. package/.claude/skills/mastermind-skills/architect.md +5 -6
  37. package/.claude/skills/mastermind-skills/autodev.md +8 -5
  38. package/.claude/skills/mastermind-skills/review.md +8 -5
  39. package/.claude/skills/mastermind-skills/techport.md +37 -3
  40. package/.claude/skills/monodesign/document.md +9 -6
  41. package/.claude/skills/monodesign/extract.md +1 -1
  42. package/.claude/skills/monodesign/reference/document.md +1 -1
  43. package/.claude/skills/monodesign/reference/live.md +1 -1
  44. package/.claude/skills/monolean/SKILL.md +1 -1
  45. package/package.json +1 -1
  46. package/packages/@monomind/cli/.claude/agents/core/researcher.md +29 -24
  47. package/packages/@monomind/cli/.claude/agents/github/code-review-swarm.md +1 -1
  48. package/packages/@monomind/cli/.claude/agents/github/github-modes.md +1 -1
  49. package/packages/@monomind/cli/.claude/agents/github/issue-tracker.md +1 -1
  50. package/packages/@monomind/cli/.claude/agents/github/multi-repo-swarm.md +1 -1
  51. package/packages/@monomind/cli/.claude/agents/github/pr-manager.md +1 -1
  52. package/packages/@monomind/cli/.claude/agents/github/project-board-sync.md +1 -1
  53. package/packages/@monomind/cli/.claude/agents/github/release-manager.md +1 -1
  54. package/packages/@monomind/cli/.claude/agents/github/repo-architect.md +1 -1
  55. package/packages/@monomind/cli/.claude/agents/github/swarm-issue.md +1 -1
  56. package/packages/@monomind/cli/.claude/agents/github/swarm-pr.md +1 -1
  57. package/packages/@monomind/cli/.claude/agents/github/sync-coordinator.md +1 -1
  58. package/packages/@monomind/cli/.claude/agents/github/workflow-automation.md +1 -1
  59. package/packages/@monomind/cli/.claude/agents/goal/goal-planner.md +1 -1
  60. package/packages/@monomind/cli/.claude/agents/specialized/specialized-workflow-architect.md +11 -14
  61. package/packages/@monomind/cli/.claude/agents/testing/production-validator.md +8 -7
  62. package/packages/@monomind/cli/.claude/agents/testing/testing-evidence-collector.md +3 -1
  63. package/packages/@monomind/cli/.claude/commands/mastermind/code-review.md +4 -4
  64. package/packages/@monomind/cli/.claude/commands/mastermind/help.md +2 -2
  65. package/packages/@monomind/cli/.claude/commands/mastermind/okf-export.md +14 -0
  66. package/packages/@monomind/cli/.claude/commands/mastermind/okf-import.md +15 -0
  67. package/packages/@monomind/cli/.claude/helpers/handlers/agent-start-handler.cjs +11 -36
  68. package/packages/@monomind/cli/.claude/helpers/handlers/capture-handler.cjs +110 -0
  69. package/packages/@monomind/cli/.claude/helpers/handlers/route-handler.cjs +174 -247
  70. package/packages/@monomind/cli/.claude/helpers/handlers/session-handler.cjs +139 -142
  71. package/packages/@monomind/cli/.claude/helpers/handlers/session-restore-handler.cjs +15 -10
  72. package/packages/@monomind/cli/.claude/helpers/handlers/task-handler.cjs +8 -155
  73. package/packages/@monomind/cli/.claude/helpers/hook-handler.cjs +89 -5
  74. package/packages/@monomind/cli/.claude/helpers/intelligence.cjs +164 -15
  75. package/packages/@monomind/cli/.claude/helpers/learning-service.mjs +1 -0
  76. package/packages/@monomind/cli/.claude/helpers/mastermind-activate.cjs +33 -51
  77. package/packages/@monomind/cli/.claude/helpers/monolean-activate.cjs +13 -3
  78. package/packages/@monomind/cli/.claude/helpers/monolean-propagate.cjs +7 -3
  79. package/packages/@monomind/cli/.claude/helpers/router.cjs +47 -9
  80. package/packages/@monomind/cli/.claude/skills/mastermind-skills/architect.md +5 -6
  81. package/packages/@monomind/cli/.claude/skills/mastermind-skills/autodev.md +8 -5
  82. package/packages/@monomind/cli/.claude/skills/mastermind-skills/review.md +8 -5
  83. package/packages/@monomind/cli/.claude/skills/mastermind-skills/techport.md +37 -3
  84. package/packages/@monomind/cli/.claude/skills/monodesign/document.md +9 -6
  85. package/packages/@monomind/cli/.claude/skills/monodesign/extract.md +1 -1
  86. package/packages/@monomind/cli/.claude/skills/monodesign/reference/document.md +1 -1
  87. package/packages/@monomind/cli/.claude/skills/monodesign/reference/live.md +1 -1
  88. package/packages/@monomind/cli/.claude/skills/monolean/SKILL.md +1 -1
  89. package/packages/@monomind/cli/bin/mcp-server.js +11 -1
  90. package/packages/@monomind/cli/dist/src/commands/agent-ops.d.ts +1 -2
  91. package/packages/@monomind/cli/dist/src/commands/agent-ops.js +1 -59
  92. package/packages/@monomind/cli/dist/src/commands/agent.js +2 -3
  93. package/packages/@monomind/cli/dist/src/commands/analyze-diff.js +1 -1
  94. package/packages/@monomind/cli/dist/src/commands/browse-action.js +94 -2
  95. package/packages/@monomind/cli/dist/src/commands/completions.js +11 -56
  96. package/packages/@monomind/cli/dist/src/commands/doctor-project-checks.d.ts +1 -1
  97. package/packages/@monomind/cli/dist/src/commands/doctor-project-checks.js +1 -1
  98. package/packages/@monomind/cli/dist/src/commands/hive-mind-helpers.js +2 -2
  99. package/packages/@monomind/cli/dist/src/commands/hive-mind-ops.d.ts +1 -3
  100. package/packages/@monomind/cli/dist/src/commands/hive-mind-ops.js +2 -116
  101. package/packages/@monomind/cli/dist/src/commands/hive-mind.js +2 -5
  102. package/packages/@monomind/cli/dist/src/commands/hooks-coverage-commands.js +8 -7
  103. package/packages/@monomind/cli/dist/src/commands/hooks-coverage-gaps.js +1 -1
  104. package/packages/@monomind/cli/dist/src/commands/hooks-coverage-routing.js +2 -2
  105. package/packages/@monomind/cli/dist/src/commands/hooks-extended-commands.d.ts +0 -3
  106. package/packages/@monomind/cli/dist/src/commands/hooks-extended-commands.js +0 -307
  107. package/packages/@monomind/cli/dist/src/commands/hooks.js +1 -12
  108. package/packages/@monomind/cli/dist/src/commands/index.d.ts +3 -51
  109. package/packages/@monomind/cli/dist/src/commands/index.js +36 -184
  110. package/packages/@monomind/cli/dist/src/commands/init-wizard.js +2 -4
  111. package/packages/@monomind/cli/dist/src/commands/mcp.js +32 -4
  112. package/packages/@monomind/cli/dist/src/commands/memory-admin.d.ts +1 -2
  113. package/packages/@monomind/cli/dist/src/commands/memory-admin.js +1 -118
  114. package/packages/@monomind/cli/dist/src/commands/memory-transfer.d.ts +1 -2
  115. package/packages/@monomind/cli/dist/src/commands/memory-transfer.js +5 -171
  116. package/packages/@monomind/cli/dist/src/commands/memory.js +3 -6
  117. package/packages/@monomind/cli/dist/src/commands/neural-core.d.ts +3 -1
  118. package/packages/@monomind/cli/dist/src/commands/neural-core.js +145 -6
  119. package/packages/@monomind/cli/dist/src/commands/neural-optimize.js +4 -4
  120. package/packages/@monomind/cli/dist/src/commands/neural-registry.d.ts +1 -1
  121. package/packages/@monomind/cli/dist/src/commands/neural-registry.js +4 -4
  122. package/packages/@monomind/cli/dist/src/commands/neural.d.ts +1 -1
  123. package/packages/@monomind/cli/dist/src/commands/neural.js +6 -6
  124. package/packages/@monomind/cli/dist/src/commands/performance.js +68 -58
  125. package/packages/@monomind/cli/dist/src/commands/providers.js +2 -131
  126. package/packages/@monomind/cli/dist/src/commands/security-misc.d.ts +0 -1
  127. package/packages/@monomind/cli/dist/src/commands/security-misc.js +69 -45
  128. package/packages/@monomind/cli/dist/src/commands/security.js +2 -4
  129. package/packages/@monomind/cli/dist/src/commands/session.js +1 -285
  130. package/packages/@monomind/cli/dist/src/commands/start.js +2 -41
  131. package/packages/@monomind/cli/dist/src/commands/status.js +18 -29
  132. package/packages/@monomind/cli/dist/src/commands/swarm.js +1 -1
  133. package/packages/@monomind/cli/dist/src/commands/task.js +2 -49
  134. package/packages/@monomind/cli/dist/src/commands/workflow.js +2 -104
  135. package/packages/@monomind/cli/dist/src/index.js +7 -0
  136. package/packages/@monomind/cli/dist/src/init/executor.js +3 -14
  137. package/packages/@monomind/cli/dist/src/init/helpers-generator.js +2 -22
  138. package/packages/@monomind/cli/dist/src/init/settings-generator.js +0 -1
  139. package/packages/@monomind/cli/dist/src/init/types.d.ts +1 -3
  140. package/packages/@monomind/cli/dist/src/init/types.js +0 -2
  141. package/packages/@monomind/cli/dist/src/mcp-client.js +0 -6
  142. package/packages/@monomind/cli/dist/src/mcp-server.js +16 -0
  143. package/packages/@monomind/cli/dist/src/mcp-tools/agent-tools.js +0 -17
  144. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/causal-infer.d.ts +5 -5
  145. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/causal-infer.js +32 -46
  146. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/consensus-verify.d.ts +2 -3
  147. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/consensus-verify.js +22 -20
  148. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/memory-gate.d.ts +3 -2
  149. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/memory-gate.js +32 -19
  150. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/quantum-topology.d.ts +4 -4
  151. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/quantum-topology.js +11 -17
  152. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/spectral-analyze.d.ts +2 -3
  153. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/spectral-analyze.js +51 -32
  154. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/types.d.ts +5 -9
  155. package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.js +2 -2
  156. package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.js +25 -3
  157. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-routing.d.ts +0 -3
  158. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-routing.js +45 -159
  159. package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.js +1 -4
  160. package/packages/@monomind/cli/dist/src/mcp-tools/index.d.ts +0 -2
  161. package/packages/@monomind/cli/dist/src/mcp-tools/index.js +0 -3
  162. package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.js +24 -0
  163. package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.js +428 -11
  164. package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.d.ts +4 -10
  165. package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.js +28 -54
  166. package/packages/@monomind/cli/dist/src/mcp-tools/performance-tools.js +5 -17
  167. package/packages/@monomind/cli/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.js +2 -2
  168. package/packages/@monomind/cli/dist/src/mcp-tools/quality/security-compliance/detect-secrets.d.ts +4 -4
  169. package/packages/@monomind/cli/dist/src/mcp-tools/quality-tools.d.ts +7 -2
  170. package/packages/@monomind/cli/dist/src/mcp-tools/quality-tools.js +7 -257
  171. package/packages/@monomind/cli/dist/src/memory/intelligence.d.ts +7 -8
  172. package/packages/@monomind/cli/dist/src/memory/intelligence.js +15 -16
  173. package/packages/@monomind/cli/dist/src/memory/memory-bridge.d.ts +1 -0
  174. package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +37 -0
  175. package/packages/@monomind/cli/dist/src/services/worker-daemon.d.ts +3 -21
  176. package/packages/@monomind/cli/dist/src/services/worker-daemon.js +13 -80
  177. package/packages/@monomind/cli/dist/src/suggest.js +0 -5
  178. package/packages/@monomind/cli/package.json +1 -1
  179. package/packages/@monomind/guidance/package.json +1 -74
  180. package/.claude/helpers/auto-memory-hook.mjs +0 -503
  181. package/packages/@monomind/cli/.claude/helpers/auto-memory-hook.mjs +0 -503
  182. package/packages/@monomind/cli/dist/src/commands/deployment.d.ts +0 -10
  183. package/packages/@monomind/cli/dist/src/commands/deployment.js +0 -706
@@ -52,6 +52,16 @@ module.exports = {
52
52
 
53
53
  if (intelligence && intelligence.getContext) {
54
54
  try {
55
+ // Bootstrap intelligence from monograph on first prompt if store is sparse
56
+ if (intelligence.bootstrapFromDb) {
57
+ try {
58
+ var bDb = hCtx._openMonographDb();
59
+ if (bDb) {
60
+ var bootstrapped = intelligence.bootstrapFromDb(bDb);
61
+ if (bootstrapped > 0) console.log('[INTELLIGENCE] Bootstrapped ' + bootstrapped + ' hub nodes from knowledge graph');
62
+ }
63
+ } catch (e) { /* non-fatal */ }
64
+ }
55
65
  const ctx = intelligence.getContext(prompt);
56
66
  if (ctx) console.log(ctx);
57
67
  } catch (e) { /* non-fatal */ }
@@ -60,284 +70,116 @@ module.exports = {
60
70
  const routeFn = router.routeTaskSemantic || router.routeTask;
61
71
  var result = await Promise.resolve(routeFn(prompt));
62
72
 
63
- // Graph-fallback override: when the router picked a low-confidence
64
- // non-dev specialist (marketing slugs etc) but monograph has a strong
65
- // graph match for the prompt, derive the agent from the top file's
66
- // label instead. Stops "improve the system" → China E-Commerce.
73
+ // ── Agent success pattern lookup ──────────────────────────
67
74
  try {
68
- // Don't override when the prompt has obvious non-dev keywords —
69
- // marketing/sales/finance asks SHOULD route to those specialists.
70
- var nonDevPrompt = /\b(marketing|advertis|seo|tiktok|instagram|linkedin|sales|customer|brand|blog post|content strategy|copy(?:writ|writing)|pitch|investor|hr|recruit|legal|compliance|tax|invoice|accounting|onboarding|design syst|figma|user research|persona)\b/i.test(prompt);
71
-
72
- var devAgents = /^(coder|tester|reviewer|planner|researcher|system-architect|backend-dev|backend-architect|mobile-dev|ml-developer|cicd-engineer|api-docs|code-analyzer|production-validator|Technical Writer)$/i;
73
- var pickedDev = devAgents.test(String(result.agent || '').trim()) ||
74
- devAgents.test(String(result.agentSlug || '').trim());
75
-
76
- var resConf = (result.confidence != null ? result.confidence : 0);
77
- var resReason = String(result.reason || '');
78
- var fromKeywordStage = resReason.indexOf('Keyword 2-stage') !== -1;
79
- var promptIsDevish = /\b(develop(?:ment|er)?|routing|improve|refactor|fix|bug|optimi[sz]e|implement|build|debug|deploy|test|feature|system|performance|architecture|memory|hook|graph|statusline|monograph|api|cli|skill|hooks|agent|workflow|init|module|package|registry|server|client|route|handler|localhost|dashboard|sidebar|layout|component|function|class|config|port|script|parse|compile|lint|build)\b/i.test(prompt);
75
+ var patternDb = hCtx._openMonographDb();
76
+ if (patternDb) {
77
+ var cutoff = Date.now() - 30 * 86400000;
78
+ var patterns = patternDb.prepare(
79
+ 'SELECT agent_type, COUNT(*) as total, SUM(CASE WHEN success=1 THEN 1 ELSE 0 END) as wins FROM agent_interactions WHERE timestamp > @cutoff GROUP BY agent_type HAVING total >= 3'
80
+ ).all({ cutoff: cutoff });
81
+ if (patterns.length > 0) {
82
+ var patternMap = {};
83
+ for (var pi = 0; pi < patterns.length; pi++) {
84
+ patternMap[patterns[pi].agent_type] = {
85
+ total: patterns[pi].total,
86
+ successRate: Math.round(patterns[pi].wins / patterns[pi].total * 100)
87
+ };
88
+ }
89
+ var routedAgent = result.agent || 'coder';
90
+ var routedPattern = patternMap[routedAgent];
91
+ // Find if there's a clearly better agent
92
+ if (routedPattern && routedPattern.successRate < 50) {
93
+ var best = patterns.reduce(function(a, b) { return (b.wins/b.total) > (a.wins/a.total) ? b : a; });
94
+ if (best.wins / best.total > 0.8 && best.agent_type !== routedAgent) {
95
+ console.log('[AGENT_PATTERN] Historical: ' + best.agent_type + ' (' + Math.round(best.wins/best.total*100) + '% success, n=' + best.total + ') outperforms ' + routedAgent + ' (' + routedPattern.successRate + '%)');
96
+ }
97
+ }
98
+ result.historicalPattern = patternMap;
99
+ }
100
+ }
101
+ } catch (e) { /* non-fatal — agent_interactions table may not exist */ }
80
102
 
81
- // Align with the 90% primary-panel threshold: any non-dev pick below
82
- // 90% confidence gets overridden via the graph, unless the prompt
83
- // explicitly uses non-dev domain language (nonDevPrompt guard).
84
- var shouldOverride = !nonDevPrompt && (
85
- (!pickedDev && resConf < 0.90) ||
86
- (fromKeywordStage && promptIsDevish)
87
- );
88
- if (shouldOverride) {
89
- var topGraph = hCtx.getMonographSuggestions(prompt, 1)[0];
90
- if (topGraph) {
91
- var agent = 'coder';
92
- var file = (topGraph.file || '').toLowerCase();
93
- // Test files
94
- if (/\.(test|spec)\./.test(file) || file.includes('__tests__')) agent = 'tester';
95
- // Architecture/system docs → architect
96
- else if (/(architect|adr-|design-doc|rfc-)/.test(file)) agent = 'system-architect';
97
- // Pure docs → tech writer
98
- else if (file.endsWith('readme.md') || file.startsWith('docs/') || /\/docs\//.test(file)) agent = 'Technical Writer';
99
- // Other .md (skills, agents, configs) → coder (they're code-adjacent)
100
- else if (file.endsWith('.md')) agent = 'coder';
101
- // Class/Interface architect
102
- else if (topGraph.label === 'Class' || topGraph.label === 'Interface') agent = 'system-architect';
103
- // Functions, files, methods coder
104
- else agent = 'coder';
105
- // Scale confidence by graph degree: well-connected nodes are stronger anchors.
106
- var topDeg = topGraph.deg || 0;
107
- var graphConf = topDeg > 30 ? 0.80 : (topDeg > 10 ? 0.75 : 0.70);
108
- result = Object.assign({}, result, {
109
- agent: agent,
110
- agentSlug: agent,
111
- confidence: graphConf,
112
- reason: 'Graph fallback: top file ' + (topGraph.name || '').substring(0, 30) + ' [' + topGraph.label + '] deg=' + topDeg,
113
- specificAgents: [],
114
- extrasMatches: [],
115
- });
103
+ // ── Routing feedback accuracy check ──────────────────────
104
+ try {
105
+ var rfPath = path.join(CWD, '.monomind', 'routing-feedback.jsonl');
106
+ var MAX_RF = 256 * 1024;
107
+ if (fs.existsSync(rfPath) && fs.statSync(rfPath).size <= MAX_RF) {
108
+ var rfLines = fs.readFileSync(rfPath, 'utf-8').trim().split('\n').filter(Boolean);
109
+ // Check last 50 entries for this agent's feedback
110
+ var routedAgent = result.agent || 'coder';
111
+ var recentRf = rfLines.slice(-50);
112
+ var agentFeedback = [];
113
+ for (var ri = 0; ri < recentRf.length; ri++) {
114
+ try {
115
+ var rfEntry = JSON.parse(recentRf[ri]);
116
+ if (rfEntry.suggestedAgent === routedAgent) {
117
+ agentFeedback.push(rfEntry.intelligenceFeedback);
118
+ }
119
+ } catch (e) {}
120
+ }
121
+ if (agentFeedback.length >= 3) {
122
+ var successes = agentFeedback.filter(function(f) { return f === true; }).length;
123
+ var accuracy = Math.round(successes / agentFeedback.length * 100);
124
+ if (accuracy < 60) {
125
+ console.log('[ROUTING] Warning: ' + routedAgent + ' routing accuracy ' + accuracy + '% over last ' + agentFeedback.length + ' sessions');
126
+ }
127
+ result.routingAccuracy = accuracy;
116
128
  }
117
129
  }
118
- } catch (e) {}
130
+ } catch (e) { /* non-fatal */ }
131
+
132
+ // monolean: graph-fallback override removed — it compensated for bad agent
133
+ // recommendations that are no longer injected into context. The statusline
134
+ // just shows the keyword router's pick; no need for 50 lines of overrides.
119
135
 
120
136
  var output = [];
121
- // Skip the noisy "[INFO] Routing task: ..." prefix — it repeats the user's
122
- // own words back and adds token overhead without helping Claude.
123
- // Routing panel strategy:
124
- // conf >= 0.90 → show primary recommendation (router is confident, trust it)
125
- // conf < 0.90 → show category picker so Claude uses its own context to
126
- // pick the right agent category + agent from a menu.
127
- // Specific-agent panel is suppressed (category menu replaces it).
128
137
  var conf = result.confidence != null ? result.confidence : 0;
129
- var promptShort = (prompt || '').trim().length < 60;
130
- var lowConf = conf < 0.70;
131
- var suppressPanel = lowConf && promptShort;
132
-
133
- // Agent category menu — shown when conf < 0.90 so Claude picks with context.
134
- var AGENT_CATEGORIES = [
135
- { label: 'CORE', agents: 'coder · reviewer · tester · planner · researcher' },
136
- { label: 'BACKEND', agents: 'backend-dev · Backend Architect · DB Optimizer' },
137
- { label: 'FRONTEND', agents: 'Frontend Developer · mobile-dev' },
138
- { label: 'ARCH', agents: 'Software Architect · system-architect' },
139
- { label: 'SECURITY', agents: 'Security Engineer · security-architect' },
140
- { label: 'AI/ML', agents: 'AI Engineer · ml-developer · Data Engineer' },
141
- { label: 'DEVOPS', agents: 'DevOps Automator · SRE · cicd-engineer' },
142
- { label: 'DOCS', agents: 'Technical Writer · api-docs' },
143
- { divider: 'Non-Coding Agents' },
144
- { label: 'PRODUCT', agents: 'Product Manager · Launch Strategist · CRO Spec.' },
145
- { label: 'MARKETING', agents: 'Content Creator · SEO Specialist · Growth Hacker' },
146
- { label: 'SOCIAL', agents: 'TikTok · LinkedIn · Twitter · Instagram Strat.' },
147
- { label: 'SALES', agents: 'Deal Strategist · Sales Coach · Outbound Strat.' },
148
- { label: 'BUSINESS', agents: 'Finance Tracker · Legal Compliance · Analytics' },
149
- { label: 'DESIGN', agents: 'Monodesign (UI/UX · brand · CSS · animation)' },
150
- ];
151
-
152
- if (conf >= 0.90) {
153
- output.push('+------------- monomind | Primary Recommendation --------------+');
154
- output.push('| Agent: ' + (result.agent || 'unknown').substring(0, 54).padEnd(54) + '|');
155
- output.push('| Confidence: ' + ((result.confidence != null ? (result.confidence * 100).toFixed(1) : '?') + '%').padEnd(49) + '|');
156
- output.push('| Reason: ' + (result.reason || '').substring(0, 53).padEnd(53) + '|');
157
- output.push('+--------------------------------------------------------------+');
158
- } else if (!suppressPanel) {
159
- output.push('+------- monomind | Agent Category Picker ---------------------+');
160
- output.push('| ' + ('Conf: ' + (conf * 100).toFixed(0) + '% — router uncertain. YOU choose using context.').padEnd(60) + ' |');
161
- output.push('+--------------------------------------------------------------+');
162
- AGENT_CATEGORIES.forEach(function(cat) {
163
- if (cat.divider) {
164
- var d = '- ' + cat.divider + ' ';
165
- output.push('|' + d.padEnd(31, '-') + ''.padEnd(31, '-') + '|');
166
- } else {
167
- output.push('| ' + cat.label.padEnd(10) + cat.agents.substring(0, 50).padEnd(50) + ' |');
168
- }
169
- });
170
- output.push('+--------------------------------------------------------------+');
171
- output.push('| INSTRUCTION: Read your conversation context. Identify the |');
172
- output.push('| best-fit category above, then pick one agent from it and |');
173
- output.push('| spawn it via Task({ subagent_type: "name" }). If no agent |');
174
- output.push('| fits the task, skip and proceed directly. Do this now. |');
175
- output.push('+--------------------------------------------------------------+');
176
- }
177
138
 
178
139
  // ── Persist routing result for statusline display ─────────────
179
140
  try {
180
141
  var routeDir = path.join(CWD, '.monomind');
181
142
  fs.mkdirSync(routeDir, { recursive: true });
182
- // When confidence < 90% and the router picked a non-dev agent without
183
- // a graph override, don't persist the wrong specialist — show "AI" instead.
184
- var confForPersist = result.confidence != null ? result.confidence : 0;
185
- var devAgentsForPersist = /^(coder|tester|reviewer|planner|researcher|system-architect|backend-dev|backend-architect|mobile-dev|ml-developer|cicd-engineer|api-docs|code-analyzer|production-validator|Technical Writer|Software Architect|Frontend Developer|AI Engineer|Data Engineer|Security Engineer|DevOps Automator|SRE)$/i;
186
- var persistedIsNonDev = !devAgentsForPersist.test(String(result.agent || '').trim());
187
- var resolvedAgent = result.agent;
188
- var resolvedFromExtras = false;
189
- if (!resolvedAgent || resolvedAgent === 'extras') {
190
- var topExtra = result.extrasMatches && result.extrasMatches[0];
191
- resolvedAgent = topExtra ? topExtra.name : 'Specialist Agent';
192
- resolvedFromExtras = true;
193
- }
194
- // If router was uncertain (< 90%) and picked a non-dev specialist,
195
- // show "AI selecting" in statusline rather than the wrong agent.
196
- // Exception: when agent was explicitly 'extras' and we resolved from extrasMatches,
197
- // trust that resolution — the domain specialist was explicitly matched.
198
- if (!resolvedFromExtras && confForPersist < 0.90 && persistedIsNonDev && !String(result.reason || '').startsWith('Graph fallback')) {
199
- resolvedAgent = 'AI selecting';
200
- }
201
- var routePayload = {
202
- agent: resolvedAgent,
203
- agentSlug: result.agentSlug || null,
204
- confidence: result.confidence,
205
- reason: result.reason,
206
- semanticRouting: result.semanticRouting || false,
207
- llmRouting: result.llmRouting || false,
208
- updatedAt: new Date().toISOString(),
209
- };
210
- if (result.extrasMatches && result.extrasMatches.length > 0) {
211
- routePayload.extrasMatches = result.extrasMatches.map(function(e) {
212
- return { name: e.name, slug: e.slug, category: e.category };
213
- });
214
- }
215
143
  fs.writeFileSync(
216
144
  path.join(routeDir, 'last-route.json'),
217
- JSON.stringify(routePayload),
145
+ JSON.stringify({
146
+ agent: result.agent || 'coder',
147
+ agentSlug: result.agentSlug || null,
148
+ confidence: result.confidence,
149
+ reason: result.reason,
150
+ prompt: (prompt || '').slice(0, 500),
151
+ historicalPattern: result.historicalPattern || null,
152
+ updatedAt: new Date().toISOString(),
153
+ }),
218
154
  'utf-8'
219
155
  );
220
156
  } catch (e) { /* non-fatal */ }
221
157
 
222
- // ── Dev skill suggestions ──────────────────────────────────────
158
+ // ── Skill auto-activation (the one thing the hook does better than Claude) ──
223
159
  var matches = result.skillMatches || [];
224
160
  if (matches.length > 0) {
225
- // Check for high-confidence auto-invoke: if top skill scored >= 3 keyword
226
- // hits and is the dominant match, auto-invoke instead of just suggesting
227
161
  var topMatch = matches[0];
228
- var autoInvoke = false;
229
- if (topMatch && topMatch.score >= 3 && matches.length <= 2) {
230
- autoInvoke = true;
231
- } else if (topMatch && topMatch.score >= 2 && matches.length === 1 && (result.confidence ?? 0) < 0.7) {
232
- // Single strong skill match with weak agent routing = skill should take over
233
- autoInvoke = true;
234
- }
162
+ // Auto-activate when one skill clearly dominates:
163
+ // - score >= 2 with at most 2 matches (strong multi-keyword signal), or
164
+ // - single match with score >= 2 and low agent confidence (skill is better fit)
165
+ var autoInvoke = (topMatch && topMatch.score >= 2 && matches.length <= 2) ||
166
+ (topMatch && topMatch.score >= 2 && matches.length === 1 && conf < 0.7);
235
167
 
236
168
  if (autoInvoke) {
237
- output.push('');
238
- output.push('+======== SKILL AUTO-ACTIVATED (high confidence match) ========+');
239
- output.push('| ' + topMatch.invoke.substring(0, 61).padEnd(61) + '|');
240
- output.push('| INSTRUCTION: Invoke ' + topMatch.invoke.substring(0, 41).padEnd(41) + '|');
241
- output.push('| BEFORE responding. This skill matched with very high |');
242
- output.push('| confidence — do not skip it. |');
243
- output.push('+==============================================================+');
169
+ output.push('+======== SKILL AUTO-ACTIVATED ========+');
170
+ output.push('| ' + topMatch.invoke.padEnd(36) + ' |');
171
+ output.push('+======================================+');
244
172
  } else {
245
- output.push('');
246
- if ((result.confidence ?? 0) < 0.8) {
247
- output.push('+----------- Skill Suggestions (pick one if relevant) ---------+');
248
- output.push('| No strong primary match — here are the best skill candidates |');
249
- } else {
250
- output.push('+----------- Matching Skills (invoke via Skill tool) ----------+');
251
- }
173
+ output.push('+----------- Matching Skills (invoke via Skill tool) ----------+');
252
174
  matches.forEach(function(m, i) {
253
- var label = (i + 1) + '. ' + m.skill;
254
- var desc = (m.description || '').substring(0, 30);
255
- var line = '| ' + label.substring(0, 30).padEnd(30) + desc.padEnd(30) + ' |';
256
- output.push(line);
175
+ output.push('| ' + (i + 1) + '. ' + m.skill.padEnd(28) + (m.description || '').substring(0, 30).padEnd(30) + ' |');
257
176
  output.push('| invoke: ' + m.invoke.substring(0, 51).padEnd(51) + '|');
258
177
  });
259
178
  output.push('+--------------------------------------------------------------+');
260
- if ((result.confidence ?? 0) < 0.8) {
261
- output.push('| To use a skill: call Skill("skill-name") before responding. |');
262
- output.push('+--------------------------------------------------------------+');
263
- }
264
179
  }
265
180
  }
266
181
 
267
- // ── Specific agent panel ──────────────────────────────────────────────────
268
- // Skip entirely on suppressed (low-confidence + short) prompts.
269
- var specificAgents = result.specificAgents || [];
270
- if (specificAgents.length > 0 && !suppressPanel && conf >= 0.90) {
271
- output.push('');
272
- var saHdr = '------- Specific Agents (' + specificAgents.length + ' available) ';
273
- output.push('+' + saHdr + '-'.repeat(Math.max(1, 62 - saHdr.length)) + '+');
274
- specificAgents.forEach(function(a, i) {
275
- var label = (i + 1) + '. ' + a.label;
276
- var note = (a.note || '').substring(0, 26);
277
- output.push('| ' + label.substring(0, 33).padEnd(33) + note.padEnd(27) + ' |');
278
- if (a.slug) {
279
- output.push('| slug: ' + a.slug.substring(0, 52).padEnd(52) + ' |');
280
- }
281
- });
282
- output.push('+--------------------------------------------------------------+');
283
- output.push('| Use: Task({ subagent_type: "<slug>" }) or /specialagent |');
284
- output.push('+--------------------------------------------------------------+');
285
- }
286
-
287
- // ── Specialist agents (non-dev domain) — only shown when specificAgents panel wasn't shown ──
288
- var extras = result.extrasMatches || [];
289
- var specificAgentsShown = (result.specificAgents || []).length > 0 && conf >= 0.90;
290
- if (extras.length > 0 && !specificAgentsShown && !suppressPanel) {
291
- output.push('');
292
- var spHdr = '------- Specialist Agents (' + extras.length + ' matched) ';
293
- output.push('+' + spHdr + '-'.repeat(Math.max(1, 62 - spHdr.length)) + '+');
294
- extras.slice(0, 5).forEach(function(e, i) {
295
- var label = (i + 1) + '. ' + e.name;
296
- var cat = '[' + e.category + ']';
297
- output.push('| ' + label.substring(0, 44).padEnd(44) + cat.substring(0, 16).padEnd(16) + ' |');
298
- output.push('| slug: ' + e.slug.substring(0, 52).padEnd(52) + ' |');
299
- });
300
- output.push('+--------------------------------------------------------------+');
301
- output.push('| Use: Task({ subagent_type: "<slug>" }) or /specialagent |');
302
- output.push('+--------------------------------------------------------------+');
303
- }
304
-
305
- // ── MicroAgent Trigger Scan (Task 32) ──────────────────────────────
306
- try {
307
- var triggerResult = hCtx.scanMicroAgentTriggers(typeof prompt === 'string' ? prompt : '');
308
- if (triggerResult.matches.length > 0) {
309
- output.push('');
310
- if (triggerResult.takeoverAgent) {
311
- var tAgent = triggerResult.takeoverAgent;
312
- var tKw = triggerResult.matches[0].matchedText;
313
- output.push('+============= MicroAgent TAKEOVER Detected ===================+');
314
- output.push('| Specialist: ' + tAgent.substring(0, 49).padEnd(49) + '|');
315
- output.push('| Keyword: ' + ('"' + tKw + '"').substring(0, 49).padEnd(49) + '|');
316
- output.push('| Recommended: use this specialist instead of primary agent. |');
317
- output.push('+==============================================================+');
318
- } else {
319
- output.push('+------- MicroAgent Specialists Triggered ---------------------+');
320
- triggerResult.matches.forEach(function(m) {
321
- var slug = m.agentSlug.substring(0, 37).padEnd(37);
322
- var kw = ('(match: "' + m.matchedText + '")').substring(0, 21).padEnd(21);
323
- output.push('| + ' + slug + kw + ' |');
324
- });
325
- output.push('+--------------------------------------------------------------+');
326
- }
327
- // Persist trigger matches alongside route result
328
- try {
329
- var routeFile = path.join(CWD, '.monomind', 'last-route.json');
330
- var routeSt = fs.statSync(routeFile);
331
- if (routeSt.size <= 1024 * 1024) {
332
- var existing = JSON.parse(fs.readFileSync(routeFile, 'utf-8'));
333
- existing.microAgents = { injectAgents: triggerResult.injectAgents || [], takeoverAgent: triggerResult.takeoverAgent || null };
334
- fs.writeFileSync(routeFile, JSON.stringify(existing), 'utf-8');
335
- }
336
- } catch (e) {}
337
- }
338
- } catch (e) { /* non-fatal */ }
339
-
340
- console.log(output.join('\n'));
182
+ if (output.length > 0) console.log(output.join('\n'));
341
183
 
342
184
  // Record any decision markers in this prompt (auto-ADR pipeline).
343
185
  try { hCtx._recordDecisionMarkers(prompt); } catch (e) {}
@@ -357,6 +199,91 @@ module.exports = {
357
199
  }
358
200
  } catch (e) {}
359
201
 
202
+ // ── Surface daemon metrics warnings (hook latency, token spikes) ──
203
+ try {
204
+ var metricsDir = path.join(CWD, '.monomind', 'metrics');
205
+ // Hook latency warnings
206
+ var latencyFile = path.join(metricsDir, 'hook-latency.json');
207
+ if (fs.existsSync(latencyFile) && fs.statSync(latencyFile).size < 32768) {
208
+ var latencyData = JSON.parse(fs.readFileSync(latencyFile, 'utf-8'));
209
+ if (latencyData && latencyData.avgMs > 500) {
210
+ console.log('[PERF] Hook latency avg ' + Math.round(latencyData.avgMs) + 'ms (target <500ms). Slowest: ' + (latencyData.slowest || 'unknown'));
211
+ }
212
+ }
213
+ // Token usage check — surface only when spend is high
214
+ var tokenFile = path.join(metricsDir, 'token-summary.json');
215
+ if (fs.existsSync(tokenFile) && fs.statSync(tokenFile).size < 32768) {
216
+ var tokenData = JSON.parse(fs.readFileSync(tokenFile, 'utf-8'));
217
+ if (tokenData && tokenData.todayCost > 50) {
218
+ console.log('[COST] Today: $' + (tokenData.todayCost || 0).toFixed(2) + ' (' + (tokenData.todayCalls || 0) + ' calls)');
219
+ }
220
+ }
221
+ // Security audit findings
222
+ var secAuditFile = path.join(metricsDir, 'security-audit.json');
223
+ if (fs.existsSync(secAuditFile) && fs.statSync(secAuditFile).size < 32768) {
224
+ var secData = JSON.parse(fs.readFileSync(secAuditFile, 'utf-8'));
225
+ if (secData && secData.findings && secData.findings.length > 0) {
226
+ console.log('[SECURITY] ' + secData.findings.length + ' findings from background scan. Review .monomind/metrics/security-audit.json');
227
+ }
228
+ }
229
+ // Codebase map hotspots
230
+ var mapFile = path.join(metricsDir, 'codebase-map.json');
231
+ if (fs.existsSync(mapFile) && fs.statSync(mapFile).size < 32768) {
232
+ var mapData = JSON.parse(fs.readFileSync(mapFile, 'utf-8'));
233
+ if (mapData && mapData.hotspots && mapData.hotspots.length > 0) {
234
+ console.log('[CODEBASE] ' + mapData.hotspots.length + ' hotspots detected. Top: ' + (mapData.hotspots[0].file || mapData.hotspots[0].name || 'unknown'));
235
+ }
236
+ }
237
+ } catch (e) { /* non-fatal */ }
238
+
239
+ // ── Memory: surface relevant past session context ──────────
240
+ try {
241
+ var epFile = path.join(CWD, '.monomind', 'episodic', 'episodes.jsonl');
242
+ var MAX_EP = 256 * 1024;
243
+ if (fs.existsSync(epFile) && fs.statSync(epFile).size <= MAX_EP) {
244
+ var epRaw = fs.readFileSync(epFile, 'utf-8').trim().split('\n').filter(Boolean);
245
+ if (epRaw.length > 0) {
246
+ // Simple keyword matching against episode summaries
247
+ var promptLower = (prompt || '').toLowerCase();
248
+ var promptTokens = promptLower.match(/[a-z][a-z0-9_-]{2,}/g) || [];
249
+ if (promptTokens.length > 0) {
250
+ var matches = [];
251
+ // Only search last 200 episodes
252
+ var searchEps = epRaw.slice(-200);
253
+ for (var ei = 0; ei < searchEps.length; ei++) {
254
+ try {
255
+ var ep = JSON.parse(searchEps[ei]);
256
+ var sumLower = (ep.summary || '').toLowerCase();
257
+ // Skip if from current session
258
+ var currentSessId = process.env.CLAUDE_SESSION_ID || '';
259
+ if (ep.sessionId === currentSessId) continue;
260
+ // Count keyword overlap
261
+ var hits = 0;
262
+ for (var ti = 0; ti < promptTokens.length; ti++) {
263
+ if (sumLower.includes(promptTokens[ti])) hits++;
264
+ }
265
+ var relevance = promptTokens.length > 0 ? hits / promptTokens.length : 0;
266
+ if (relevance >= 0.3 && hits >= 2) {
267
+ matches.push({ summary: (ep.summary || '').slice(0, 120), relevance: relevance, ts: ep.endedAt || 0 });
268
+ }
269
+ } catch (e) {}
270
+ }
271
+ // Show top 2 most relevant matches
272
+ if (matches.length > 0) {
273
+ matches.sort(function(a, b) { return b.relevance - a.relevance; });
274
+ var topMatches = matches.slice(0, 2);
275
+ var memLines = ['[MEMORY] Relevant past sessions:'];
276
+ for (var mi = 0; mi < topMatches.length; mi++) {
277
+ var ago = topMatches[mi].ts ? Math.round((Date.now() - topMatches[mi].ts) / 3600000) + 'h ago' : '';
278
+ memLines.push(' ' + topMatches[mi].summary.replace(/\n/g, ' ').trim() + (ago ? ' (' + ago + ')' : ''));
279
+ }
280
+ console.log(memLines.join('\n'));
281
+ }
282
+ }
283
+ }
284
+ }
285
+ } catch (e) { /* non-fatal */ }
286
+
360
287
  // Inject monograph hint for complex tasks.
361
288
  // Source of truth is .monomind/monograph.db (SQLite). Legacy stats.json
362
289
  // is no longer written by the build, so it is checked only as a fallback.