@monoes/monomindcli 1.10.7 → 1.10.8
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/helpers/hook-handler.cjs +102 -57
- package/package.json +1 -1
|
@@ -296,57 +296,82 @@ function _autoIndexKnowledge(knowledgeDir) {
|
|
|
296
296
|
} catch (e) {}
|
|
297
297
|
}
|
|
298
298
|
|
|
299
|
-
// Inject monograph graph summary as a knowledge chunk
|
|
299
|
+
// Inject monograph graph summary as a knowledge chunk.
|
|
300
|
+
// Reads from .monomind/monograph.db (SQLite, source of truth) and falls
|
|
301
|
+
// back to the legacy .monomind/graph/{stats,graph}.json pair only when
|
|
302
|
+
// present (older installs).
|
|
300
303
|
try {
|
|
301
|
-
var
|
|
302
|
-
var
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
var
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
304
|
+
var mgDbPath2 = path.join(CWD, '.monomind', 'monograph.db');
|
|
305
|
+
var legacyStats2 = path.join(CWD, '.monomind', 'graph', 'stats.json');
|
|
306
|
+
var legacyGraph2 = path.join(CWD, '.monomind', 'graph', 'graph.json');
|
|
307
|
+
|
|
308
|
+
var summaryText = null;
|
|
309
|
+
var summaryMeta = {};
|
|
310
|
+
|
|
311
|
+
if (fs.existsSync(mgDbPath2)) {
|
|
312
|
+
try {
|
|
313
|
+
var mgMod2 = _requireMonograph();
|
|
314
|
+
if (mgMod2 && mgMod2.openDb) {
|
|
315
|
+
var sumDb = mgMod2.openDb(mgDbPath2);
|
|
316
|
+
try {
|
|
317
|
+
var nodeC = sumDb.prepare('SELECT COUNT(*) AS c FROM nodes').get().c;
|
|
318
|
+
var edgeC = sumDb.prepare('SELECT COUNT(*) AS c FROM edges').get().c;
|
|
319
|
+
var topNodes2 = sumDb.prepare(
|
|
320
|
+
'SELECT n.name, n.label, n.file_path, ' +
|
|
321
|
+
'(SELECT COUNT(*) FROM edges WHERE source_id=n.id OR target_id=n.id) AS deg ' +
|
|
322
|
+
'FROM nodes n WHERE n.file_path IS NOT NULL AND n.file_path != "" ORDER BY deg DESC LIMIT 15'
|
|
323
|
+
).all();
|
|
324
|
+
var typeRows = sumDb.prepare(
|
|
325
|
+
'SELECT label, COUNT(*) AS c FROM nodes GROUP BY label ORDER BY c DESC LIMIT 8'
|
|
326
|
+
).all();
|
|
327
|
+
var typeStr = typeRows.map(function(r) { return r.label + ':' + r.c; }).join(', ');
|
|
328
|
+
summaryText = [
|
|
329
|
+
'MONOGRAPH KNOWLEDGE GRAPH SUMMARY',
|
|
330
|
+
'Source: monograph.db | Nodes: ' + nodeC + ' | Edges: ' + edgeC,
|
|
331
|
+
'',
|
|
332
|
+
'TOP GOD NODES (highest connectivity — start exploration here):',
|
|
333
|
+
topNodes2.map(function(n) {
|
|
334
|
+
return ' ' + n.name + ' [' + n.label + '] — ' + (n.file_path || '') + ' (degree: ' + n.deg + ')';
|
|
335
|
+
}).join('\n'),
|
|
336
|
+
'',
|
|
337
|
+
'NODE TYPE DISTRIBUTION: ' + typeStr,
|
|
338
|
+
'',
|
|
339
|
+
'Before grepping or globbing, prefer:',
|
|
340
|
+
' mcp__monomind__monograph_suggest({ task: "<your task>" }) — ranked relevant files',
|
|
341
|
+
' mcp__monomind__monograph_query({ q: "<symbol|keyword>" }) — BM25 search with file:line',
|
|
342
|
+
' mcp__monomind__monograph_impact({ name: "<file>" }) — upstream + downstream blast radius',
|
|
343
|
+
].join('\n');
|
|
344
|
+
summaryMeta = { label: 'monograph-graph-summary', source: 'monograph.db', nodes: nodeC, edges: edgeC };
|
|
345
|
+
} finally {
|
|
346
|
+
try { sumDb.close(); } catch (_) {}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
} catch (e) { /* fall through to legacy */ }
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
if (!summaryText && fs.existsSync(legacyStats2) && fs.existsSync(legacyGraph2)) {
|
|
353
|
+
try {
|
|
354
|
+
var lStats = JSON.parse(fs.readFileSync(legacyStats2, 'utf-8'));
|
|
355
|
+
var lGraphStat = fs.statSync(legacyGraph2);
|
|
356
|
+
if (lGraphStat.size < 10 * 1024 * 1024) {
|
|
357
|
+
var lGraph = JSON.parse(fs.readFileSync(legacyGraph2, 'utf-8'));
|
|
358
|
+
var lNodes = Array.isArray(lGraph.nodes) ? lGraph.nodes : [];
|
|
359
|
+
summaryText = 'MONOGRAPH KNOWLEDGE GRAPH SUMMARY (legacy JSON)\n' +
|
|
360
|
+
'Nodes: ' + (lStats.nodes || lNodes.length) + ' | Edges: ' + (lStats.edges || 0) + '\n' +
|
|
361
|
+
'Use mcp__monomind__monograph_suggest to find files relevant to your task.';
|
|
362
|
+
summaryMeta = { label: 'monograph-graph-summary', source: 'legacy-json', builtAt: lStats.builtAt };
|
|
363
|
+
}
|
|
364
|
+
} catch (e) { /* ignore */ }
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
if (summaryText) {
|
|
368
|
+
var chunkId = crypto.createHash('md5').update('monograph-graph-summary').digest('hex').slice(0, 16);
|
|
369
|
+
newLines.push(JSON.stringify({
|
|
370
|
+
chunkId: chunkId,
|
|
371
|
+
namespace: 'knowledge:shared',
|
|
372
|
+
text: summaryText,
|
|
373
|
+
metadata: summaryMeta
|
|
374
|
+
}));
|
|
350
375
|
}
|
|
351
376
|
} catch (e) { /* graph not available yet, skip */ }
|
|
352
377
|
|
|
@@ -639,14 +664,34 @@ const handlers = {
|
|
|
639
664
|
|
|
640
665
|
console.log(output.join('\n'));
|
|
641
666
|
|
|
642
|
-
// Inject monograph hint for complex tasks
|
|
667
|
+
// Inject monograph hint for complex tasks.
|
|
668
|
+
// Source of truth is .monomind/monograph.db (SQLite). Legacy stats.json
|
|
669
|
+
// is no longer written by the build, so it is checked only as a fallback.
|
|
643
670
|
try {
|
|
644
|
-
var
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
671
|
+
var monographDb = path.join(CWD, '.monomind', 'monograph.db');
|
|
672
|
+
var legacyStats = path.join(CWD, '.monomind', 'graph', 'stats.json');
|
|
673
|
+
var nodeCount = 0;
|
|
674
|
+
if (fs.existsSync(monographDb)) {
|
|
675
|
+
try {
|
|
676
|
+
var mgMod = _requireMonograph();
|
|
677
|
+
if (mgMod && mgMod.openDb) {
|
|
678
|
+
var hintDb = mgMod.openDb(monographDb);
|
|
679
|
+
try {
|
|
680
|
+
nodeCount = hintDb.prepare('SELECT COUNT(*) AS c FROM nodes').get().c;
|
|
681
|
+
} finally {
|
|
682
|
+
try { hintDb.close(); } catch (_) {}
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
} catch (e) { /* ignore — fall back to legacy */ }
|
|
686
|
+
}
|
|
687
|
+
if (nodeCount === 0 && fs.existsSync(legacyStats)) {
|
|
688
|
+
try {
|
|
689
|
+
var gStats = JSON.parse(fs.readFileSync(legacyStats, 'utf-8'));
|
|
690
|
+
nodeCount = gStats.nodes || 0;
|
|
691
|
+
} catch (e) { /* ignore */ }
|
|
692
|
+
}
|
|
693
|
+
if (nodeCount > 100) {
|
|
694
|
+
console.log('\n[MONOGRAPH] ' + nodeCount + ' nodes indexed. For this task, call mcp__monomind__monograph_suggest first to find the right files without grepping.');
|
|
650
695
|
}
|
|
651
696
|
} catch(e) {}
|
|
652
697
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@monoes/monomindcli",
|
|
3
|
-
"version": "1.10.
|
|
3
|
+
"version": "1.10.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Monomind CLI - Enterprise AI agent orchestration with 60+ specialized agents, swarm coordination, MCP server, self-learning hooks, and vector memory for Claude Code",
|
|
6
6
|
"main": "dist/src/index.js",
|