monomind 2.7.4 → 2.7.5

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 (45) hide show
  1. package/package.json +1 -1
  2. package/packages/@monomind/cli/bin/cli.js +17 -1
  3. package/packages/@monomind/cli/dist/src/commands/doctor-project-checks.d.ts +3 -0
  4. package/packages/@monomind/cli/dist/src/commands/doctor-project-checks.js +81 -8
  5. package/packages/@monomind/cli/dist/src/commands/doctor.js +16 -2
  6. package/packages/@monomind/cli/dist/src/commands/memory-crud.js +15 -5
  7. package/packages/@monomind/cli/dist/src/commands/security-misc.js +7 -2
  8. package/packages/@monomind/cli/dist/src/init/helpers-generator.js +5 -0
  9. package/packages/@monomind/cli/dist/src/mcp-client.js +0 -2
  10. package/packages/@monomind/cli/dist/src/mcp-tools/agent-tools.js +1 -1
  11. package/packages/@monomind/cli/dist/src/mcp-tools/embeddings-tools.d.ts +2 -0
  12. package/packages/@monomind/cli/dist/src/mcp-tools/embeddings-tools.js +11 -1
  13. package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.js +17 -17
  14. package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.d.ts +2 -0
  15. package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.js +14 -2
  16. package/packages/@monomind/cli/dist/src/mcp-tools/index.d.ts +0 -1
  17. package/packages/@monomind/cli/dist/src/mcp-tools/index.js +0 -1
  18. package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.js +1 -2
  19. package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.js +1 -1
  20. package/packages/@monomind/cli/dist/src/mcp-tools/swarm-tools.js +2 -2
  21. package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.d.ts +2 -0
  22. package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.js +11 -1
  23. package/packages/@monomind/cli/dist/src/ui/dashboard.html +44 -618
  24. package/packages/@monomind/cli/dist/src/ui/server.mjs +0 -275
  25. package/packages/@monomind/cli/dist/src/utils/cosine-similarity.d.ts +2 -2
  26. package/packages/@monomind/cli/dist/src/utils/cosine-similarity.js +2 -2
  27. package/packages/@monomind/cli/package.json +1 -1
  28. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/causal-infer.d.ts +0 -15
  29. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/causal-infer.js +0 -333
  30. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/coherence-check.d.ts +0 -15
  31. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/coherence-check.js +0 -188
  32. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/consensus-verify.d.ts +0 -14
  33. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/consensus-verify.js +0 -305
  34. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/memory-gate.d.ts +0 -16
  35. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/memory-gate.js +0 -279
  36. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/quantum-topology.d.ts +0 -15
  37. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/quantum-topology.js +0 -400
  38. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/spectral-analyze.d.ts +0 -14
  39. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/spectral-analyze.js +0 -312
  40. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/types.d.ts +0 -430
  41. package/packages/@monomind/cli/dist/src/mcp-tools/coherence/types.js +0 -144
  42. package/packages/@monomind/cli/dist/src/mcp-tools/coherence-tools.d.ts +0 -9
  43. package/packages/@monomind/cli/dist/src/mcp-tools/coherence-tools.js +0 -25
  44. package/packages/@monomind/cli/dist/src/mcp-tools/daa-tools.d.ts +0 -13
  45. package/packages/@monomind/cli/dist/src/mcp-tools/daa-tools.js +0 -553
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monomind",
3
- "version": "2.7.4",
3
+ "version": "2.7.5",
4
4
  "description": "Open-source CLI extension for Claude Code. Adds an MCP server with a codebase knowledge graph, persistent memory, multi-agent coordination, and reusable slash commands. MIT licensed, runs locally, no data leaves your machine.",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -287,7 +287,23 @@ if (isMCPMode) {
287
287
  const isDaemonChild = cliArgs.includes('--foreground-worker-internal');
288
288
  cli.run().then(() => {
289
289
  if (!isDaemonChild) {
290
- process.exit(process.exitCode ?? 0);
290
+ // Prefer a natural exit over process.exit(). Any command that touched
291
+ // embeddings has onnxruntime-node's thread pool loaded in-process (via
292
+ // memory-bridge -> @huggingface/transformers), and forcing exit out from
293
+ // under it aborts the process:
294
+ // libc++abi: terminating due to uncaught exception of type
295
+ // std::__1::system_error: mutex lock failed: Invalid argument
296
+ // — an exit code of 134 on `doctor`, `memory store`, `memory search`,
297
+ // etc., despite the command itself having succeeded. Disposing the
298
+ // pipeline first does NOT help; only letting the loop drain does.
299
+ //
300
+ // So: publish the exit code and let node exit on its own once the loop
301
+ // empties. The unref'd timer below still fires if something lingers
302
+ // (it does not itself hold the process open), preserving the original
303
+ // guarantee that the CLI never hangs forever on a stray handle.
304
+ process.exitCode = process.exitCode ?? 0;
305
+ const FORCE_EXIT_MS = 5000;
306
+ setTimeout(() => process.exit(process.exitCode ?? 0), FORCE_EXIT_MS).unref();
291
307
  }
292
308
  // Daemon child: let the event loop stay alive on its own ref'd interval.
293
309
  }).catch((error) => {
@@ -23,6 +23,9 @@ export declare function fixStaleHelpers(): Promise<boolean>;
23
23
  export declare function checkHelpersFresh(): Promise<HealthCheck>;
24
24
  export declare function checkMonoesIntegration(): Promise<HealthCheck>;
25
25
  export declare function checkGitignoreCoverage(): Promise<HealthCheck>;
26
+ /** Creates or appends the missing gitignore entries. Returns true if it wrote.
27
+ * Append-only and idempotent: never rewrites lines the user already has. */
28
+ export declare function fixGitignoreCoverage(): Promise<boolean>;
26
29
  export declare function checkAgentRegistry(): Promise<HealthCheck>;
27
30
  export declare function checkGuidanceGates(): Promise<HealthCheck>;
28
31
  /**
@@ -2,7 +2,7 @@
2
2
  * Doctor — project/monomind health checks
3
3
  * Config, memory, API keys, MCP, monograph, helpers, routing, gates, gitignore, worker metrics
4
4
  */
5
- import { existsSync, readFileSync, readdirSync, statSync, mkdirSync, copyFileSync } from 'fs';
5
+ import { existsSync, readFileSync, readdirSync, statSync, mkdirSync, copyFileSync, writeFileSync, appendFileSync } from 'fs';
6
6
  import { join, dirname } from 'path';
7
7
  import { fileURLToPath } from 'url';
8
8
  import { execSync } from 'child_process';
@@ -476,24 +476,97 @@ const REQUIRED_GITIGNORE_PATTERNS = [
476
476
  { pattern: '.hive-mind/', reason: 'hive-mind state with session info' },
477
477
  { pattern: '.swarm/', reason: 'swarm state files' },
478
478
  ];
479
+ /** Strip the parts that don't change what a pattern matches, so `**​/.monomind/`,
480
+ * `.monomind/` and `.monomind` all compare equal. A gitignore pattern with no
481
+ * leading slash already matches at every depth, so `**​/` is redundant. */
482
+ function normalizeGitignorePattern(p) {
483
+ return p.replace(/^\/+/, '').replace(/^\*\*\//, '').replace(/\/+$/, '');
484
+ }
485
+ /** True when ignoring `line` already protects everything `required` covers.
486
+ * Beyond exact matches this understands directory containment: a repo with a
487
+ * blanket `.monomind/` is fully covered for `.monomind/sessions/`,
488
+ * `.monomind/*.json` and friends, and should not be nagged to add each one. */
489
+ function gitignoreLineCovers(line, required) {
490
+ const l = normalizeGitignorePattern(line);
491
+ const r = normalizeGitignorePattern(required);
492
+ if (!l)
493
+ return false;
494
+ if (l === r)
495
+ return true;
496
+ // A bare directory entry covers every path beneath it, but only when the
497
+ // entry itself is literal — `.monomind/*.json` must not be treated as an
498
+ // ancestor of `.monomind/sessions`.
499
+ return !l.includes('*') && r.startsWith(`${l}/`);
500
+ }
479
501
  export async function checkGitignoreCoverage() {
480
502
  const gitignorePath = join(process.cwd(), '.gitignore');
481
503
  if (!existsSync(gitignorePath)) {
482
- return { name: 'Gitignore Coverage', status: 'warn', message: 'No .gitignore found — all monomind runtime paths are unprotected', fix: 'echo ".monomind/\\n**/.monomind/" >> .gitignore' };
504
+ // The old hint was `echo ".monomind/\n**/.monomind/" >> .gitignore`, which
505
+ // writes a literal backslash-n (sh/bash echo does not interpret escapes
506
+ // without -e) — one junk line matching nothing. `--fix` now writes the file
507
+ // directly, so point at that rather than at a command to copy-paste.
508
+ return { name: 'Gitignore Coverage', status: 'warn', message: 'No .gitignore found — all monomind runtime paths are unprotected', fix: 'monomind doctor --fix (creates .gitignore covering .monomind/ and secrets)' };
483
509
  }
484
510
  if (statSync(gitignorePath).size > MAX_DOCTOR_GITIGNORE_BYTES) {
485
511
  return { name: 'Gitignore Coverage', status: 'warn', message: '.gitignore too large to parse' };
486
512
  }
487
513
  const lines = readFileSync(gitignorePath, 'utf-8').split('\n').map(l => l.trim()).filter(l => l && !l.startsWith('#'));
488
- const missing = REQUIRED_GITIGNORE_PATTERNS.filter(({ pattern }) => {
489
- const base = pattern.replace(/\*\*\//g, '').replace(/\*/g, '');
490
- return !lines.some(l => l === pattern || l === pattern.replace(/\/$/, '') ||
491
- (l.includes('**') && base && l.replace(/\*\*\//g, '').replace(/\*/g, '') === base));
492
- });
514
+ const missing = REQUIRED_GITIGNORE_PATTERNS.filter(({ pattern }) => !lines.some(l => gitignoreLineCovers(l, pattern)));
493
515
  if (missing.length === 0)
494
516
  return { name: 'Gitignore Coverage', status: 'pass', message: 'All monomind runtime paths are gitignored' };
495
517
  const missingList = missing.map(m => m.pattern).join(', ');
496
- return { name: 'Gitignore Coverage', status: 'warn', message: `${missing.length} runtime path(s) not in .gitignore: ${missingList}`, fix: `printf "${missing.map(m => m.pattern).join('\\n')}\\n" >> .gitignore` };
518
+ return { name: 'Gitignore Coverage', status: 'warn', message: `${missing.length} runtime path(s) not in .gitignore: ${missingList}`, fix: 'monomind doctor --fix (appends the missing entries)' };
519
+ }
520
+ /** Patterns written by `doctor --fix` when there is no .gitignore at all.
521
+ * Covers monomind runtime state plus the standard secrets files, since a repo
522
+ * with no .gitignore has nothing protecting those either. */
523
+ const GITIGNORE_FIX_PATTERNS = [
524
+ '# monomind runtime state',
525
+ '.monomind/',
526
+ '**/.monomind/',
527
+ '.hive-mind/',
528
+ '.swarm/',
529
+ '**/.claude-flow/',
530
+ 'data/sessions/',
531
+ 'data/mastermind-*.json',
532
+ 'data/mastermind-*.jsonl',
533
+ '',
534
+ '# secrets / local env',
535
+ '.env',
536
+ '.env.*',
537
+ '!.env.example',
538
+ '*.pem',
539
+ '*.key',
540
+ '',
541
+ '# dependencies / build output',
542
+ 'node_modules/',
543
+ 'dist/',
544
+ ];
545
+ /** Creates or appends the missing gitignore entries. Returns true if it wrote.
546
+ * Append-only and idempotent: never rewrites lines the user already has. */
547
+ export async function fixGitignoreCoverage() {
548
+ const gitignorePath = join(process.cwd(), '.gitignore');
549
+ try {
550
+ if (!existsSync(gitignorePath)) {
551
+ writeFileSync(gitignorePath, GITIGNORE_FIX_PATTERNS.join('\n') + '\n', 'utf-8');
552
+ return true;
553
+ }
554
+ if (statSync(gitignorePath).size > MAX_DOCTOR_GITIGNORE_BYTES)
555
+ return false;
556
+ const existing = readFileSync(gitignorePath, 'utf-8');
557
+ const lines = existing.split('\n').map(l => l.trim()).filter(l => l && !l.startsWith('#'));
558
+ const missing = REQUIRED_GITIGNORE_PATTERNS
559
+ .map(m => m.pattern)
560
+ .filter(pattern => !lines.some(l => gitignoreLineCovers(l, pattern)));
561
+ if (missing.length === 0)
562
+ return false;
563
+ const prefix = existing.endsWith('\n') || existing === '' ? '' : '\n';
564
+ appendFileSync(gitignorePath, `${prefix}\n# monomind runtime state\n${missing.join('\n')}\n`, 'utf-8');
565
+ return true;
566
+ }
567
+ catch {
568
+ return false;
569
+ }
497
570
  }
498
571
  export async function checkAgentRegistry() {
499
572
  try {
@@ -7,7 +7,7 @@
7
7
  import * as path from 'path';
8
8
  import { output } from '../output.js';
9
9
  import { checkNodeVersion, checkNpmVersion, checkGit, checkGitRepo, checkDiskSpace, checkBuildTools, checkVersionFreshness, checkClaudeCode, installClaudeCode, } from './doctor-env-checks.js';
10
- import { checkConfigFile, checkMemoryDatabase, checkApiKeys, checkMcpServers, checkMonograph, checkMonographFreshness, checkMonoesMemory, checkHelpersFresh, fixStaleHelpers, checkMonoesIntegration, checkGuidanceGates, checkGitignoreCoverage, checkAgentRegistry, checkMemoryProficiency, checkMetricsFreshness, checkSecurityAuditFindings, checkSecondBrainModel, checkMemoryKnowledgeGraph, } from './doctor-project-checks.js';
10
+ import { checkConfigFile, checkMemoryDatabase, checkApiKeys, checkMcpServers, checkMonograph, checkMonographFreshness, checkMonoesMemory, checkHelpersFresh, fixStaleHelpers, checkMonoesIntegration, checkGuidanceGates, checkGitignoreCoverage, fixGitignoreCoverage, checkAgentRegistry, checkMemoryProficiency, checkMetricsFreshness, checkSecurityAuditFindings, checkSecondBrainModel, checkMemoryKnowledgeGraph, } from './doctor-project-checks.js';
11
11
  import { checkMonoesTools, fixMonoesTools } from './doctor-monoes-checks.js';
12
12
  function formatCheck(check) {
13
13
  const icon = check.status === 'pass' ? output.success('✓') :
@@ -19,7 +19,7 @@ export const doctorCommand = {
19
19
  name: 'doctor',
20
20
  description: 'System diagnostics and health checks',
21
21
  options: [
22
- { name: 'fix', short: 'f', description: 'Apply local fixes (helper files, monoes tool shims) and show fix commands for the rest', type: 'boolean', default: false },
22
+ { name: 'fix', short: 'f', description: 'Apply local fixes (helper files, monoes tool shims, .gitignore entries) and show fix commands for the rest', type: 'boolean', default: false },
23
23
  { name: 'install', short: 'i', description: 'Auto-install missing dependencies (Claude Code CLI)', type: 'boolean', default: false },
24
24
  {
25
25
  name: 'component', short: 'c',
@@ -160,6 +160,20 @@ export const doctorCommand = {
160
160
  output.writeln(formatCheck(newCheck));
161
161
  }
162
162
  }
163
+ const gitignoreResult = results.find(r => r.name === 'Gitignore Coverage');
164
+ if (gitignoreResult && gitignoreResult.status !== 'pass') {
165
+ if (await fixGitignoreCoverage()) {
166
+ const newCheck = await checkGitignoreCoverage();
167
+ const idx = results.findIndex(r => r.name === 'Gitignore Coverage');
168
+ if (idx !== -1) {
169
+ results[idx] = newCheck;
170
+ const fixIdx = fixes.findIndex(f => f.startsWith('Gitignore Coverage:'));
171
+ if (fixIdx !== -1 && newCheck.status === 'pass')
172
+ fixes.splice(fixIdx, 1);
173
+ }
174
+ output.writeln(formatCheck(newCheck));
175
+ }
176
+ }
163
177
  const helpersResult = results.find(r => r.name === 'Helper Files');
164
178
  if (helpersResult && helpersResult.status !== 'pass') {
165
179
  if (await fixStaleHelpers()) {
@@ -241,7 +241,7 @@ export const searchCommand = {
241
241
  },
242
242
  {
243
243
  name: 'build-hnsw',
244
- description: 'Build/rebuild pure-JS HNSW index before searching',
244
+ description: 'Build/rebuild the pure-JS HNSW fallback index. Only used when the SQLite bridge is unavailable (e.g. better-sqlite3 native binary failed to load) — has no effect on the search that follows when the bridge is active, which is the common case',
245
245
  type: 'boolean',
246
246
  default: false
247
247
  }
@@ -249,7 +249,7 @@ export const searchCommand = {
249
249
  examples: [
250
250
  { command: 'monomind memory search -q "authentication patterns"', description: 'Semantic search' },
251
251
  { command: 'monomind memory search -q "JWT" -t keyword', description: 'Keyword search' },
252
- { command: 'monomind memory search -q "test" --build-hnsw', description: 'Build HNSW index and search' }
252
+ { command: 'monomind memory search -q "test" --build-hnsw', description: 'Build the sql.js-fallback HNSW index (no-op unless the SQLite bridge is down)' }
253
253
  ],
254
254
  action: async (ctx) => {
255
255
  const query = ctx.flags.query || ctx.args[0];
@@ -262,9 +262,14 @@ export const searchCommand = {
262
262
  output.printError('Query is required. Use --query or -q');
263
263
  return { success: false, exitCode: 1 };
264
264
  }
265
- // Build/rebuild HNSW index if requested
265
+ // Build/rebuild the sql.js-fallback HNSW index if requested. This index is only
266
+ // consulted when the SQLite bridge is unavailable — check that first so the
267
+ // message reflects what will actually happen in the search below, not what
268
+ // would happen if this were the only backend.
266
269
  if (buildHnsw) {
267
- output.printInfo('Building HNSW index...');
270
+ const { isBridgeAvailable } = await import('../memory/memory-bridge.js');
271
+ const bridgeUp = await isBridgeAvailable().catch(() => false);
272
+ output.printInfo('Building HNSW fallback index...');
268
273
  try {
269
274
  const { getHNSWIndex, getHNSWStatus } = await import('../memory/memory-initializer.js');
270
275
  const startTime = Date.now();
@@ -274,7 +279,12 @@ export const searchCommand = {
274
279
  const status = getHNSWStatus();
275
280
  output.printSuccess(`HNSW index built (${status.entryCount} vectors, ${buildTime}ms)`);
276
281
  output.writeln(output.dim(` Dimensions: ${status.dimensions}, Metric: cosine`));
277
- output.writeln(output.dim(` Complexity: O(log n) vs O(n) linear scan`));
282
+ if (bridgeUp) {
283
+ output.writeln(output.dim(' Note: the SQLite bridge is active, so the search below uses its brute-force cosine search, not this index. This index only kicks in if the bridge becomes unavailable.'));
284
+ }
285
+ else {
286
+ output.writeln(output.dim(' SQLite bridge is unavailable — the search below will use this index (O(log n) vs O(n) linear scan).'));
287
+ }
278
288
  }
279
289
  else {
280
290
  output.printWarning('HNSW index not available');
@@ -9,15 +9,20 @@ export const auditCommand = {
9
9
  name: 'audit',
10
10
  description: 'Security audit logging and compliance',
11
11
  options: [
12
- { name: 'action', short: 'a', type: 'string', description: 'Action: log, list, export, clear', default: 'list' },
12
+ { name: 'action', short: 'a', type: 'string', description: 'Action: list (only supported value — log/export/clear are not implemented)', default: 'list' },
13
13
  { name: 'limit', short: 'l', type: 'number', description: 'Number of entries to show', default: '20' },
14
14
  { name: 'filter', short: 'f', type: 'string', description: 'Filter by event type' },
15
15
  ],
16
16
  examples: [
17
17
  { command: 'monomind security audit --action list', description: 'List audit logs' },
18
- { command: 'monomind security audit -a export', description: 'Export audit trail' },
19
18
  ],
20
19
  action: async (ctx) => {
20
+ const requestedAction = ctx.flags.action || 'list';
21
+ if (requestedAction !== 'list') {
22
+ output.writeln();
23
+ output.writeln(output.error(`security audit --action ${requestedAction} is not implemented — only "list" is supported.`));
24
+ return { success: false, message: `Unsupported action: ${requestedAction}`, exitCode: 1 };
25
+ }
21
26
  output.writeln();
22
27
  output.writeln(output.bold('Security Audit Log'));
23
28
  output.writeln(output.dim('─'.repeat(60)));
@@ -1283,6 +1283,11 @@ export const HELPER_FILES = {
1283
1283
  'statusline.cjs': { forceSync: true, doctorTracked: true },
1284
1284
  'graphify-freshen.cjs': { forceSync: true, doctorTracked: true },
1285
1285
  'router.cjs': { forceSync: true, doctorTracked: true, generate: generateAgentRouter },
1286
+ // Regenerates skill-registry.json (which router.cjs's matchSkills reads) from
1287
+ // the live .claude/commands + .claude/skills trees. No fallback generator:
1288
+ // if it can't be copied there is nothing to regenerate the registry with, and
1289
+ // router.cjs degrades to its built-in FALLBACK_SKILLS rather than breaking.
1290
+ 'build-skill-registry.cjs': { forceSync: true, doctorTracked: true },
1286
1291
  'memory.cjs': { generate: generateMemoryHelper },
1287
1292
  'session.cjs': { generate: generateSessionManager },
1288
1293
  'pre-commit': { generate: generatePreCommitHook },
@@ -41,7 +41,6 @@ const CATEGORY_LOADERS = {
41
41
  neural: async () => (await import('./mcp-tools/neural-tools.js')).neuralTools,
42
42
  performance: async () => (await import('./mcp-tools/performance-tools.js')).performanceTools,
43
43
  github: async () => (await import('./mcp-tools/github-tools.js')).githubTools,
44
- daa: async () => (await import('./mcp-tools/daa-tools.js')).daaTools,
45
44
  browser: async () => (await import('./mcp-tools/browser-tools.js')).browserTools,
46
45
  guidance: async () => (await import('./mcp-tools/guidance-tools.js')).guidanceTools,
47
46
  autopilot: async () => (await import('./mcp-tools/autopilot-tools.js')).autopilotTools,
@@ -49,7 +48,6 @@ const CATEGORY_LOADERS = {
49
48
  graphify: async () => (await import('./mcp-tools/graphify-tools.js')).graphifyTools,
50
49
  coverage: async () => (await import('./monovector/coverage-tools.js')).coverageRouterTools,
51
50
  quality: async () => (await import('./mcp-tools/quality-tools.js')).qualityTools,
52
- coherence: async () => (await import('./mcp-tools/coherence-tools.js')).coherenceTools,
53
51
  knowledge: async () => (await import('./mcp-tools/knowledge-tools.js')).knowledgeTools,
54
52
  // system-tools.ts also exports tools with mcp_ and config_ prefixes
55
53
  mcp: async () => (await import('./mcp-tools/system-tools.js')).systemTools,
@@ -121,7 +121,7 @@ async function determineAgentModel(agentType, config, task) {
121
121
  export const agentTools = [
122
122
  {
123
123
  name: 'agent_spawn',
124
- description: 'Spawn a new agent with intelligent model selection',
124
+ description: 'Register a new agent record (type, model preference, status) in the persistent agent store. This creates a database entry, not a running agent — use Claude Code\'s Task tool to actually execute work.',
125
125
  category: 'agent',
126
126
  inputSchema: {
127
127
  type: 'object',
@@ -5,5 +5,7 @@
5
5
  * Implements ADR-024: Embeddings MCP Tools
6
6
  */
7
7
  import type { MCPTool } from './types.js';
8
+ /** Ungated — internal/test use only. MCP clients get `embeddingsTools` below. */
9
+ export declare const allEmbeddingsTools: MCPTool[];
8
10
  export declare const embeddingsTools: MCPTool[];
9
11
  //# sourceMappingURL=embeddings-tools.d.ts.map
@@ -128,7 +128,8 @@ function poincareDistance(a, b, curvature) {
128
128
  const delta = 2 * diffSq / (denom + 1e-15);
129
129
  return (1 / Math.sqrt(c)) * Math.acosh(1 + delta);
130
130
  }
131
- export const embeddingsTools = [
131
+ /** Ungated — internal/test use only. MCP clients get `embeddingsTools` below. */
132
+ export const allEmbeddingsTools = [
132
133
  {
133
134
  name: 'embeddings_init',
134
135
  description: 'Initialize the ONNX embedding subsystem with hyperbolic support',
@@ -845,4 +846,13 @@ export const embeddingsTools = [
845
846
  },
846
847
  },
847
848
  ];
849
+ // embeddings_neural's `init` action persists a config blob (sona/flashAttention/
850
+ // ewcPlusPlus/etc.) with no implementing code anywhere for those flags — gated
851
+ // behind MONOMIND_MCP_SPECULATIVE=1. The other 6 tools in this file
852
+ // (embeddings_init/generate/compare/search/hyperbolic/status) do real work
853
+ // and stay visible by default.
854
+ const SPECULATIVE = process.env['MONOMIND_MCP_SPECULATIVE'] === '1';
855
+ export const embeddingsTools = SPECULATIVE
856
+ ? allEmbeddingsTools
857
+ : allEmbeddingsTools.filter(t => t.name !== 'embeddings_neural');
848
858
  //# sourceMappingURL=embeddings-tools.js.map
@@ -70,7 +70,7 @@ const CAPABILITY_CATALOG = {
70
70
  description: 'Multi-agent coordination with topology-aware communication and consensus.',
71
71
  tools: ['swarm_init', 'swarm_status', 'swarm_spawn', 'swarm_terminate', 'swarm_topology', 'swarm_metrics'],
72
72
  commands: ['swarm init', 'swarm status', 'swarm spawn', 'swarm terminate'],
73
- agents: ['hierarchical-coordinator', 'mesh-coordinator', 'adaptive-coordinator', 'queen-coordinator', 'collective-intelligence-coordinator'],
73
+ agents: ['mesh-coordinator', 'queen-coordinator', 'collective-intelligence-coordinator'],
74
74
  skills: ['swarm-orchestration', 'swarm-advanced', 'monomind-swarm'],
75
75
  whenToUse: 'When a task requires multiple agents working together (3+ files, features, refactoring).',
76
76
  },
@@ -79,8 +79,8 @@ const CAPABILITY_CATALOG = {
79
79
  description: 'Persistent memory with ANN vector search, SQLite storage, and embeddings.',
80
80
  tools: ['memory_store', 'memory_retrieve', 'memory_search', 'memory_list', 'memory_delete', 'memory_init', 'memory_export', 'memory_import', 'memory_stats', 'memory_compact', 'memory_namespace'],
81
81
  commands: ['memory store', 'memory retrieve', 'memory search', 'memory list', 'memory delete', 'memory init'],
82
- agents: ['swarm-memory-manager', 'v1-memory-specialist'],
83
- skills: ['v1-memory-unification', 'memory-advanced', 'memory-vector-search', 'memory-patterns', 'memory-learning'],
82
+ agents: ['swarm-memory-manager'],
83
+ skills: ['memory-advanced', 'memory-vector-search', 'memory-patterns', 'memory-learning'],
84
84
  whenToUse: 'When you need to persist, search, or retrieve knowledge across sessions.',
85
85
  },
86
86
  'intelligence-learning': {
@@ -88,7 +88,7 @@ const CAPABILITY_CATALOG = {
88
88
  description: 'Pattern storage and cosine-similarity search (SONA/ReasoningBank) backed by real embeddings.',
89
89
  tools: ['neural_train', 'neural_predict', 'neural_status', 'neural_patterns', 'neural_optimize'],
90
90
  commands: [],
91
- agents: ['sona-learning-optimizer', 'safla-neural'],
91
+ agents: [],
92
92
  skills: ['reasoningbank-intelligence', 'memory-reasoningbank'],
93
93
  whenToUse: 'When optimizing agent routing, training patterns from outcomes, or adaptive learning.',
94
94
  },
@@ -112,7 +112,7 @@ const CAPABILITY_CATALOG = {
112
112
  description: 'Queen-led Byzantine fault-tolerant distributed consensus with multiple strategies.',
113
113
  tools: ['hive_mind_init', 'hive_mind_status', 'hive_mind_propose', 'hive_mind_vote', 'hive_mind_consensus', 'hive_mind_metrics'],
114
114
  commands: ['hive-mind init', 'hive-mind status', 'hive-mind consensus', 'hive-mind sessions', 'hive-mind spawn', 'hive-mind stop'],
115
- agents: ['byzantine-coordinator', 'raft-manager', 'gossip-coordinator', 'crdt-synchronizer', 'quorum-manager'],
115
+ agents: ['crdt-synchronizer', 'quorum-manager'],
116
116
  skills: ['hive-mind-advanced'],
117
117
  whenToUse: 'When multiple agents need to reach agreement on decisions using BFT, Raft, or CRDT.',
118
118
  },
@@ -121,8 +121,8 @@ const CAPABILITY_CATALOG = {
121
121
  description: 'Security scanning, CVE remediation, input validation, claims-based authorization.',
122
122
  tools: ['security_scan', 'security_audit', 'security_cve', 'security_threats', 'security_validate', 'security_report', 'claims_check', 'claims_grant', 'claims_revoke', 'claims_list'],
123
123
  commands: ['security scan', 'security audit', 'security cve', 'security threats', 'claims check', 'claims grant'],
124
- agents: ['v1-security-architect'],
125
- skills: ['v1-security-overhaul'],
124
+ agents: ['security-manager'],
125
+ skills: [],
126
126
  whenToUse: 'When auditing code for vulnerabilities, managing permissions, or security reviews.',
127
127
  },
128
128
  'performance': {
@@ -130,8 +130,8 @@ const CAPABILITY_CATALOG = {
130
130
  description: 'Benchmarking, profiling, metrics collection, and optimization recommendations.',
131
131
  tools: ['performance_benchmark', 'performance_profile', 'performance_metrics', 'performance_optimize', 'performance_report'],
132
132
  commands: ['performance benchmark', 'performance profile', 'performance metrics', 'performance optimize', 'performance report'],
133
- agents: ['v1-performance-engineer'],
134
- skills: ['v1-performance-optimization', 'performance-analysis'],
133
+ agents: [],
134
+ skills: ['performance-analysis'],
135
135
  whenToUse: 'When measuring, profiling, or optimizing system performance.',
136
136
  },
137
137
  'github-integration': {
@@ -139,7 +139,7 @@ const CAPABILITY_CATALOG = {
139
139
  description: 'PR management, code review, issue tracking, release automation, multi-repo coordination.',
140
140
  tools: ['github_pr_manage', 'github_code_review', 'github_issue_track', 'github_repo_analyze', 'github_sync_coord', 'github_metrics'],
141
141
  commands: [],
142
- agents: ['pr-manager', 'code-review-swarm', 'issue-tracker', 'release-manager', 'repo-architect', 'workflow-automation', 'multi-repo-swarm', 'project-board-sync', 'swarm-pr', 'swarm-issue', 'sync-coordinator', 'github-modes', 'release-swarm'],
142
+ agents: ['pr-manager', 'code-review-swarm', 'issue-tracker', 'release-manager', 'repo-architect', 'workflow-automation', 'multi-repo-swarm', 'project-board-sync', 'swarm-pr', 'swarm-issue', 'sync-coordinator', 'github-modes'],
143
143
  skills: ['github-release-management', 'github-workflow-automation', 'github-code-review', 'github-project-management', 'github-multi-repo'],
144
144
  whenToUse: 'When working with GitHub repos, PRs, issues, releases, or CI/CD pipelines.',
145
145
  },
@@ -166,7 +166,7 @@ const CAPABILITY_CATALOG = {
166
166
  description: 'AST analysis, diff classification, coverage routing, dependency graph analysis.',
167
167
  tools: ['analyze_diff', 'analyze_coverage', 'analyze_graph'],
168
168
  commands: [],
169
- agents: ['code-analyzer'],
169
+ agents: [],
170
170
  skills: ['verification-quality'],
171
171
  whenToUse: 'When analyzing code quality, diffs, coverage gaps, or dependency graphs.',
172
172
  },
@@ -208,7 +208,7 @@ const WORKFLOW_TEMPLATES = {
208
208
  },
209
209
  refactor: {
210
210
  steps: ['Analyze code structure', 'Plan refactor approach', 'Implement changes', 'Verify no regressions'],
211
- agents: ['code-analyzer', 'coder', 'reviewer'],
211
+ agents: ['coder', 'reviewer'],
212
212
  topology: 'hierarchical',
213
213
  },
214
214
  testing: {
@@ -218,17 +218,17 @@ const WORKFLOW_TEMPLATES = {
218
218
  },
219
219
  security: {
220
220
  steps: ['Run security scan', 'Triage findings', 'Fix vulnerabilities', 'Verify remediations'],
221
- agents: ['v1-security-architect', 'coder', 'reviewer'],
221
+ agents: ['security-manager', 'coder', 'reviewer'],
222
222
  topology: 'hierarchical',
223
223
  },
224
224
  performance: {
225
225
  steps: ['Run benchmarks', 'Profile bottlenecks', 'Implement optimizations', 'Re-benchmark'],
226
- agents: ['v1-performance-engineer', 'coder'],
226
+ agents: ['coder'],
227
227
  topology: 'hierarchical',
228
228
  },
229
229
  memory: {
230
230
  steps: ['Initialize memory store', 'Store/retrieve patterns', 'Search with HNSW', 'Compact and optimize'],
231
- agents: ['v1-memory-specialist'],
231
+ agents: ['swarm-memory-manager'],
232
232
  topology: 'hierarchical',
233
233
  },
234
234
  'github-pr': {
@@ -243,12 +243,12 @@ const WORKFLOW_TEMPLATES = {
243
243
  },
244
244
  swarm: {
245
245
  steps: ['Initialize swarm topology', 'Spawn specialized agents', 'Coordinate via memory', 'Collect and synthesize results'],
246
- agents: ['hierarchical-coordinator', 'coder', 'tester', 'reviewer'],
246
+ agents: ['mesh-coordinator', 'coder', 'tester', 'reviewer'],
247
247
  topology: 'hierarchical',
248
248
  },
249
249
  learning: {
250
250
  steps: ['Pretrain on codebase', 'Record trajectories', 'Compute rewards', 'Distill learning', 'Consolidate (EWC++)'],
251
- agents: ['sona-learning-optimizer'],
251
+ agents: [],
252
252
  topology: 'hierarchical',
253
253
  },
254
254
  automation: {
@@ -11,5 +11,7 @@
11
11
  * The names are kept for CLI/API compatibility.
12
12
  */
13
13
  import { type MCPTool } from './types.js';
14
+ /** Ungated — internal/test use only. MCP clients get `hiveMindTools` below. */
15
+ export declare const allHiveMindTools: MCPTool[];
14
16
  export declare const hiveMindTools: MCPTool[];
15
17
  //# sourceMappingURL=hive-mind-tools.d.ts.map
@@ -194,7 +194,14 @@ function saveAgentStore(store) {
194
194
  writeAgentStore(tmp, JSON.stringify(store, null, 2), 'utf-8');
195
195
  renameSync(tmp, dest);
196
196
  }
197
- export const hiveMindTools = [
197
+ // Every hive-mind_* tool operates on a single JSON state file in one process —
198
+ // "consensus"/"spawn"/"broadcast" etc. are vote-threshold bookkeeping and
199
+ // record-keeping, not real distributed coordination (see CLAUDE.md's Hive-Mind
200
+ // Consensus section and hive-mind_consensus's own description). Only status/join
201
+ // are legitimate no-drama primitives (read state / register into it) and stay
202
+ // visible by default; everything else is gated behind MONOMIND_MCP_SPECULATIVE=1.
203
+ /** Ungated — internal/test use only. MCP clients get `hiveMindTools` below. */
204
+ export const allHiveMindTools = [
198
205
  {
199
206
  name: 'hive-mind_spawn',
200
207
  description: 'Spawn workers and automatically join them to the hive-mind (combines agent/spawn + hive-mind/join)',
@@ -536,7 +543,7 @@ export const hiveMindTools = [
536
543
  },
537
544
  {
538
545
  name: 'hive-mind_consensus',
539
- description: 'Propose or vote on consensus with BFT, Raft, or Quorum strategies',
546
+ description: 'Propose or vote on a threshold-based decision, single-process only. "bft"/"raft"/"quorum" are vote-count thresholds (2f+1 / majority / configurable preset) over one JSON state file — NOT real distributed consensus protocols (no leader election, log replication, or network model). Names kept for CLI/API compatibility.',
540
547
  category: 'hive-mind',
541
548
  inputSchema: {
542
549
  type: 'object',
@@ -1222,4 +1229,9 @@ export const hiveMindTools = [
1222
1229
  },
1223
1230
  },
1224
1231
  ];
1232
+ const SPECULATIVE = process.env['MONOMIND_MCP_SPECULATIVE'] === '1';
1233
+ const CORE_HIVE_MIND_NAMES = new Set(['hive-mind_status', 'hive-mind_join']);
1234
+ export const hiveMindTools = SPECULATIVE
1235
+ ? allHiveMindTools
1236
+ : allHiveMindTools.filter(t => CORE_HIVE_MIND_NAMES.has(t.name));
1225
1237
  //# sourceMappingURL=hive-mind-tools.js.map
@@ -26,7 +26,6 @@ export { autopilotTools } from './autopilot-tools.js';
26
26
  export { graphifyTools } from './graphify-tools.js';
27
27
  export { monographTools } from './monograph-tools.js';
28
28
  export { terminalTools } from './terminal-tools.js';
29
- export { daaTools } from './daa-tools.js';
30
29
  export { browserTools } from './browser-tools.js';
31
30
  export { knowledgeTools } from './knowledge-tools.js';
32
31
  //# sourceMappingURL=index.d.ts.map
@@ -26,7 +26,6 @@ export { autopilotTools } from './autopilot-tools.js';
26
26
  export { graphifyTools } from './graphify-tools.js';
27
27
  export { monographTools } from './monograph-tools.js';
28
28
  export { terminalTools } from './terminal-tools.js';
29
- export { daaTools } from './daa-tools.js';
30
29
  export { browserTools } from './browser-tools.js';
31
30
  export { knowledgeTools } from './knowledge-tools.js';
32
31
  //# sourceMappingURL=index.js.map
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import { join, resolve, sep } from 'path';
8
8
  import { execSync } from 'child_process';
9
- import { statSync } from 'fs';
9
+ import { statSync, readdirSync, existsSync } from 'fs';
10
10
  import { randomUUID } from 'crypto';
11
11
  import { getProjectCwd } from './types.js';
12
12
  let _cachedDbPath;
@@ -2108,7 +2108,6 @@ const monographDeadCodeTool = {
2108
2108
  },
2109
2109
  };
2110
2110
  function findStaleDist(repoPath) {
2111
- const { readdirSync, existsSync } = require('fs');
2112
2111
  const distSrc = join(repoPath, 'dist', 'src');
2113
2112
  const src = join(repoPath, 'src');
2114
2113
  // Scan a single package for stale dist artifacts
@@ -201,7 +201,7 @@ export const neuralTools = [
201
201
  },
202
202
  {
203
203
  name: 'neural_patterns',
204
- description: 'Get or manage neural patterns',
204
+ description: 'List, inspect, or delete entries in the stored pattern set (CRUD over the embedding-backed pattern store — no model or network involved)',
205
205
  category: 'neural',
206
206
  inputSchema: {
207
207
  type: 'object',
@@ -56,7 +56,7 @@ const VALID_TOPOLOGIES = new Set([
56
56
  export const swarmTools = [
57
57
  {
58
58
  name: 'swarm_init',
59
- description: 'Initialize a swarm with persistent state tracking',
59
+ description: 'Record a swarm topology/strategy in persistent state. This writes a JSON state file — it does not start any process, thread, or agent. Actual concurrent work only happens when the caller separately dispatches subagents with Claude Code\'s Task tool.',
60
60
  category: 'swarm',
61
61
  inputSchema: {
62
62
  type: 'object',
@@ -193,7 +193,7 @@ export const swarmTools = [
193
193
  },
194
194
  {
195
195
  name: 'swarm_scale',
196
- description: 'Scale a swarm to a target agent count by spawning or terminating agents',
196
+ description: 'Adjust the number of agent records in a swarm\'s persistent state to a target count. Adds or removes bookkeeping entries only — no process is started or stopped.',
197
197
  category: 'swarm',
198
198
  inputSchema: {
199
199
  type: 'object',
@@ -9,6 +9,8 @@ import type { MCPTool } from './types.js';
9
9
  /**
10
10
  * Transfer MCP tools for pattern export, import, anonymization, and sharing
11
11
  */
12
+ /** Ungated — internal/test use only. MCP clients get `transferTools` below. */
13
+ export declare const allTransferTools: MCPTool[];
12
14
  export declare const transferTools: MCPTool[];
13
15
  export default transferTools;
14
16
  //# sourceMappingURL=transfer-tools.d.ts.map
@@ -37,7 +37,8 @@ async function getPatternStore() {
37
37
  /**
38
38
  * Transfer MCP tools for pattern export, import, anonymization, and sharing
39
39
  */
40
- export const transferTools = [
40
+ /** Ungated — internal/test use only. MCP clients get `transferTools` below. */
41
+ export const allTransferTools = [
41
42
  // ═══════════════════════════════════════════════════════════════
42
43
  // ANONYMIZATION TOOLS
43
44
  // ═══════════════════════════════════════════════════════════════
@@ -275,5 +276,14 @@ export const transferTools = [
275
276
  },
276
277
  },
277
278
  ];
279
+ // The IPFS pattern-registry tools (ipfs-resolve, store-*) have zero test
280
+ // coverage and no evidence of production use — gated behind
281
+ // MONOMIND_MCP_SPECULATIVE=1. transfer_detect-pii is an unrelated, real PII
282
+ // scanner bundled in this file and stays visible by default.
283
+ const SPECULATIVE = process.env['MONOMIND_MCP_SPECULATIVE'] === '1';
284
+ const CORE_TRANSFER_NAMES = new Set(['transfer_detect-pii']);
285
+ export const transferTools = SPECULATIVE
286
+ ? allTransferTools
287
+ : allTransferTools.filter(t => CORE_TRANSFER_NAMES.has(t.name));
278
288
  export default transferTools;
279
289
  //# sourceMappingURL=transfer-tools.js.map