@monoes/monomindcli 1.10.7 → 1.10.9
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 +264 -59
- package/.claude/helpers/statusline.cjs +27 -1
- package/dist/src/init/settings-generator.d.ts.map +1 -1
- package/dist/src/init/settings-generator.js +33 -0
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.d.ts.map +1 -1
- package/dist/src/init/statusline-generator.js +23 -1
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -25,6 +25,103 @@ function _requireMonograph() {
|
|
|
25
25
|
return null;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
+
// ── Monograph LLM-context helpers ──────────────────────────────────────────────
|
|
29
|
+
// Used by route (pre-resolve), pre-search (Grep/Glob redirect), and post-read
|
|
30
|
+
// (neighbor footer). All calls are best-effort; failures are silent.
|
|
31
|
+
|
|
32
|
+
function _openMonographDb() {
|
|
33
|
+
try {
|
|
34
|
+
var dbPath = path.join(CWD, '.monomind', 'monograph.db');
|
|
35
|
+
if (!fs.existsSync(dbPath)) return null;
|
|
36
|
+
var mod = _requireMonograph();
|
|
37
|
+
if (!mod || !mod.openDb) return null;
|
|
38
|
+
return mod.openDb(dbPath);
|
|
39
|
+
} catch (e) { return null; }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function getMonographSuggestions(taskText, limit) {
|
|
43
|
+
if (!taskText || typeof taskText !== "string") return [];
|
|
44
|
+
var db = _openMonographDb();
|
|
45
|
+
if (!db) return [];
|
|
46
|
+
try {
|
|
47
|
+
var words = String(taskText).toLowerCase().match(/[a-z][a-z0-9_-]{3,}/g) || [];
|
|
48
|
+
var stop = { "this":1,"that":1,"with":1,"from":1,"have":1,"into":1,"their":1,"what":1,"when":1,"where":1,"which":1,"should":1,"would":1,"could":1,"make":1,"just":1,"also":1,"them":1,"they":1,"will":1,"been":1,"were":1,"because":1,"about":1,"does":1,"work":1 };
|
|
49
|
+
var uniq = {};
|
|
50
|
+
for (var i = 0; i < words.length; i++) if (!stop[words[i]]) uniq[words[i]] = 1;
|
|
51
|
+
var keys = Object.keys(uniq).slice(0, 8);
|
|
52
|
+
if (keys.length === 0) return [];
|
|
53
|
+
|
|
54
|
+
var ftsQuery = keys.map(function(k){ return '"' + k.replace(/"/g, "") + '"'; }).join(" OR ");
|
|
55
|
+
var lim = Math.max(1, limit || 5);
|
|
56
|
+
var rows = [];
|
|
57
|
+
try {
|
|
58
|
+
rows = db.prepare(
|
|
59
|
+
"SELECT n.id, n.name, n.label, n.file_path AS file, " +
|
|
60
|
+
"(SELECT COUNT(*) FROM edges WHERE source_id=n.id OR target_id=n.id) AS deg " +
|
|
61
|
+
"FROM nodes_fts f JOIN nodes n ON f.rowid = n.rowid " +
|
|
62
|
+
"WHERE nodes_fts MATCH ? AND n.file_path IS NOT NULL AND n.file_path != '' " +
|
|
63
|
+
"AND n.label NOT IN ('Concept') " +
|
|
64
|
+
"ORDER BY deg DESC LIMIT ?"
|
|
65
|
+
).all(ftsQuery, lim);
|
|
66
|
+
} catch (e) {
|
|
67
|
+
var likeFrag = keys.map(function(){ return "lower(n.name) LIKE ?"; }).join(" OR ");
|
|
68
|
+
var likeArgs = keys.map(function(k){ return "%" + k + "%"; });
|
|
69
|
+
var stmt = db.prepare(
|
|
70
|
+
"SELECT n.id, n.name, n.label, n.file_path AS file, " +
|
|
71
|
+
"(SELECT COUNT(*) FROM edges WHERE source_id=n.id OR target_id=n.id) AS deg " +
|
|
72
|
+
"FROM nodes n WHERE (" + likeFrag + ") AND n.file_path IS NOT NULL AND n.file_path != '' " +
|
|
73
|
+
"AND n.label NOT IN ('Concept') " +
|
|
74
|
+
"ORDER BY deg DESC LIMIT ?"
|
|
75
|
+
);
|
|
76
|
+
rows = stmt.all.apply(stmt, likeArgs.concat([lim]));
|
|
77
|
+
}
|
|
78
|
+
return rows || [];
|
|
79
|
+
} catch (e) { return []; }
|
|
80
|
+
finally { try { db.close(); } catch (_) {} }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function getMonographNeighbors(filePath) {
|
|
84
|
+
if (!filePath) return null;
|
|
85
|
+
var db = _openMonographDb();
|
|
86
|
+
if (!db) return null;
|
|
87
|
+
try {
|
|
88
|
+
var rel = filePath;
|
|
89
|
+
if (filePath.indexOf(CWD) === 0) rel = filePath.slice(CWD.length + 1);
|
|
90
|
+
var node = db.prepare(
|
|
91
|
+
"SELECT id, name FROM nodes WHERE label='File' AND (file_path=? OR file_path=? OR name=? OR name=?) LIMIT 1"
|
|
92
|
+
).get(filePath, rel, filePath, rel);
|
|
93
|
+
if (!node) return null;
|
|
94
|
+
|
|
95
|
+
var imports = db.prepare(
|
|
96
|
+
"SELECT DISTINCT n.name FROM edges e JOIN nodes n ON e.target_id = n.id " +
|
|
97
|
+
"WHERE e.source_id=? AND e.relation IN ('IMPORTS','CALLS','DEPENDS_ON','CONTAINS','DEFINES') " +
|
|
98
|
+
"AND n.file_path IS NOT NULL AND n.file_path != '' LIMIT 6"
|
|
99
|
+
).all(node.id).map(function(r){ return r.name; });
|
|
100
|
+
var importedBy = db.prepare(
|
|
101
|
+
"SELECT DISTINCT n.name FROM edges e JOIN nodes n ON e.source_id = n.id " +
|
|
102
|
+
"WHERE e.target_id=? AND e.relation IN ('IMPORTS','CALLS','DEPENDS_ON','CONTAINS','DEFINES') " +
|
|
103
|
+
"AND n.file_path IS NOT NULL AND n.file_path != '' LIMIT 6"
|
|
104
|
+
).all(node.id).map(function(r){ return r.name; });
|
|
105
|
+
|
|
106
|
+
return { imports: imports, importedBy: importedBy };
|
|
107
|
+
} catch (e) { return null; }
|
|
108
|
+
finally { try { db.close(); } catch (_) {} }
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function _recordGraphTelemetry(event) {
|
|
112
|
+
try {
|
|
113
|
+
var metricsDir = path.join(CWD, ".monomind", "metrics");
|
|
114
|
+
var f = path.join(metricsDir, "graph-usage.json");
|
|
115
|
+
fs.mkdirSync(metricsDir, { recursive: true });
|
|
116
|
+
var d = {};
|
|
117
|
+
try { d = JSON.parse(fs.readFileSync(f, "utf-8")); } catch (e) {}
|
|
118
|
+
if (typeof d !== "object" || d === null) d = {};
|
|
119
|
+
d[event] = (d[event] || 0) + 1;
|
|
120
|
+
d.lastUpdated = Date.now();
|
|
121
|
+
fs.writeFileSync(f, JSON.stringify(d));
|
|
122
|
+
} catch (e) { /* non-fatal */ }
|
|
123
|
+
}
|
|
124
|
+
|
|
28
125
|
function safeRequire(modulePath) {
|
|
29
126
|
try {
|
|
30
127
|
if (fs.existsSync(modulePath)) {
|
|
@@ -296,57 +393,82 @@ function _autoIndexKnowledge(knowledgeDir) {
|
|
|
296
393
|
} catch (e) {}
|
|
297
394
|
}
|
|
298
395
|
|
|
299
|
-
// Inject monograph graph summary as a knowledge chunk
|
|
396
|
+
// Inject monograph graph summary as a knowledge chunk.
|
|
397
|
+
// Reads from .monomind/monograph.db (SQLite, source of truth) and falls
|
|
398
|
+
// back to the legacy .monomind/graph/{stats,graph}.json pair only when
|
|
399
|
+
// present (older installs).
|
|
300
400
|
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
|
-
|
|
401
|
+
var mgDbPath2 = path.join(CWD, '.monomind', 'monograph.db');
|
|
402
|
+
var legacyStats2 = path.join(CWD, '.monomind', 'graph', 'stats.json');
|
|
403
|
+
var legacyGraph2 = path.join(CWD, '.monomind', 'graph', 'graph.json');
|
|
404
|
+
|
|
405
|
+
var summaryText = null;
|
|
406
|
+
var summaryMeta = {};
|
|
407
|
+
|
|
408
|
+
if (fs.existsSync(mgDbPath2)) {
|
|
409
|
+
try {
|
|
410
|
+
var mgMod2 = _requireMonograph();
|
|
411
|
+
if (mgMod2 && mgMod2.openDb) {
|
|
412
|
+
var sumDb = mgMod2.openDb(mgDbPath2);
|
|
413
|
+
try {
|
|
414
|
+
var nodeC = sumDb.prepare('SELECT COUNT(*) AS c FROM nodes').get().c;
|
|
415
|
+
var edgeC = sumDb.prepare('SELECT COUNT(*) AS c FROM edges').get().c;
|
|
416
|
+
var topNodes2 = sumDb.prepare(
|
|
417
|
+
'SELECT n.name, n.label, n.file_path, ' +
|
|
418
|
+
'(SELECT COUNT(*) FROM edges WHERE source_id=n.id OR target_id=n.id) AS deg ' +
|
|
419
|
+
'FROM nodes n WHERE n.file_path IS NOT NULL AND n.file_path != "" ORDER BY deg DESC LIMIT 15'
|
|
420
|
+
).all();
|
|
421
|
+
var typeRows = sumDb.prepare(
|
|
422
|
+
'SELECT label, COUNT(*) AS c FROM nodes GROUP BY label ORDER BY c DESC LIMIT 8'
|
|
423
|
+
).all();
|
|
424
|
+
var typeStr = typeRows.map(function(r) { return r.label + ':' + r.c; }).join(', ');
|
|
425
|
+
summaryText = [
|
|
426
|
+
'MONOGRAPH KNOWLEDGE GRAPH SUMMARY',
|
|
427
|
+
'Source: monograph.db | Nodes: ' + nodeC + ' | Edges: ' + edgeC,
|
|
428
|
+
'',
|
|
429
|
+
'TOP GOD NODES (highest connectivity — start exploration here):',
|
|
430
|
+
topNodes2.map(function(n) {
|
|
431
|
+
return ' ' + n.name + ' [' + n.label + '] — ' + (n.file_path || '') + ' (degree: ' + n.deg + ')';
|
|
432
|
+
}).join('\n'),
|
|
433
|
+
'',
|
|
434
|
+
'NODE TYPE DISTRIBUTION: ' + typeStr,
|
|
435
|
+
'',
|
|
436
|
+
'Before grepping or globbing, prefer:',
|
|
437
|
+
' mcp__monomind__monograph_suggest({ task: "<your task>" }) — ranked relevant files',
|
|
438
|
+
' mcp__monomind__monograph_query({ q: "<symbol|keyword>" }) — BM25 search with file:line',
|
|
439
|
+
' mcp__monomind__monograph_impact({ name: "<file>" }) — upstream + downstream blast radius',
|
|
440
|
+
].join('\n');
|
|
441
|
+
summaryMeta = { label: 'monograph-graph-summary', source: 'monograph.db', nodes: nodeC, edges: edgeC };
|
|
442
|
+
} finally {
|
|
443
|
+
try { sumDb.close(); } catch (_) {}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
} catch (e) { /* fall through to legacy */ }
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
if (!summaryText && fs.existsSync(legacyStats2) && fs.existsSync(legacyGraph2)) {
|
|
450
|
+
try {
|
|
451
|
+
var lStats = JSON.parse(fs.readFileSync(legacyStats2, 'utf-8'));
|
|
452
|
+
var lGraphStat = fs.statSync(legacyGraph2);
|
|
453
|
+
if (lGraphStat.size < 10 * 1024 * 1024) {
|
|
454
|
+
var lGraph = JSON.parse(fs.readFileSync(legacyGraph2, 'utf-8'));
|
|
455
|
+
var lNodes = Array.isArray(lGraph.nodes) ? lGraph.nodes : [];
|
|
456
|
+
summaryText = 'MONOGRAPH KNOWLEDGE GRAPH SUMMARY (legacy JSON)\n' +
|
|
457
|
+
'Nodes: ' + (lStats.nodes || lNodes.length) + ' | Edges: ' + (lStats.edges || 0) + '\n' +
|
|
458
|
+
'Use mcp__monomind__monograph_suggest to find files relevant to your task.';
|
|
459
|
+
summaryMeta = { label: 'monograph-graph-summary', source: 'legacy-json', builtAt: lStats.builtAt };
|
|
460
|
+
}
|
|
461
|
+
} catch (e) { /* ignore */ }
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
if (summaryText) {
|
|
465
|
+
var chunkId = crypto.createHash('md5').update('monograph-graph-summary').digest('hex').slice(0, 16);
|
|
466
|
+
newLines.push(JSON.stringify({
|
|
467
|
+
chunkId: chunkId,
|
|
468
|
+
namespace: 'knowledge:shared',
|
|
469
|
+
text: summaryText,
|
|
470
|
+
metadata: summaryMeta
|
|
471
|
+
}));
|
|
350
472
|
}
|
|
351
473
|
} catch (e) { /* graph not available yet, skip */ }
|
|
352
474
|
|
|
@@ -639,13 +761,47 @@ const handlers = {
|
|
|
639
761
|
|
|
640
762
|
console.log(output.join('\n'));
|
|
641
763
|
|
|
642
|
-
// Inject monograph hint for complex tasks
|
|
764
|
+
// Inject monograph hint for complex tasks.
|
|
765
|
+
// Source of truth is .monomind/monograph.db (SQLite). Legacy stats.json
|
|
766
|
+
// is no longer written by the build, so it is checked only as a fallback.
|
|
643
767
|
try {
|
|
644
|
-
var
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
768
|
+
var monographDb = path.join(CWD, '.monomind', 'monograph.db');
|
|
769
|
+
var legacyStats = path.join(CWD, '.monomind', 'graph', 'stats.json');
|
|
770
|
+
var nodeCount = 0;
|
|
771
|
+
if (fs.existsSync(monographDb)) {
|
|
772
|
+
try {
|
|
773
|
+
var mgMod = _requireMonograph();
|
|
774
|
+
if (mgMod && mgMod.openDb) {
|
|
775
|
+
var hintDb = mgMod.openDb(monographDb);
|
|
776
|
+
try {
|
|
777
|
+
nodeCount = hintDb.prepare('SELECT COUNT(*) AS c FROM nodes').get().c;
|
|
778
|
+
} finally {
|
|
779
|
+
try { hintDb.close(); } catch (_) {}
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
} catch (e) { /* ignore — fall back to legacy */ }
|
|
783
|
+
}
|
|
784
|
+
if (nodeCount === 0 && fs.existsSync(legacyStats)) {
|
|
785
|
+
try {
|
|
786
|
+
var gStats = JSON.parse(fs.readFileSync(legacyStats, 'utf-8'));
|
|
787
|
+
nodeCount = gStats.nodes || 0;
|
|
788
|
+
} catch (e) { /* ignore */ }
|
|
789
|
+
}
|
|
790
|
+
if (nodeCount > 100) {
|
|
791
|
+
// Pre-resolve top-5 relevant files for the user's prompt — the LLM
|
|
792
|
+
// sees the answer inline instead of being told to call a tool.
|
|
793
|
+
var suggestions = getMonographSuggestions(prompt, 5);
|
|
794
|
+
if (suggestions.length > 0) {
|
|
795
|
+
console.log('\n[MONOGRAPH] ' + nodeCount + ' nodes indexed. Top files for this task (pre-resolved from graph):');
|
|
796
|
+
for (var si = 0; si < suggestions.length; si++) {
|
|
797
|
+
var s = suggestions[si];
|
|
798
|
+
console.log(' · ' + s.name + ' [' + s.label + '] — ' + (s.file || '') + ' (deg ' + s.deg + ')');
|
|
799
|
+
}
|
|
800
|
+
console.log(' Use mcp__monomind__monograph_query / monograph_impact for deeper drill-down.');
|
|
801
|
+
_recordGraphTelemetry('preresolve_hit');
|
|
802
|
+
} else {
|
|
803
|
+
console.log('\n[MONOGRAPH] ' + nodeCount + ' nodes indexed. Call mcp__monomind__monograph_suggest first to find relevant files without grepping.');
|
|
804
|
+
_recordGraphTelemetry('preresolve_miss');
|
|
649
805
|
}
|
|
650
806
|
}
|
|
651
807
|
} catch(e) {}
|
|
@@ -743,6 +899,52 @@ const handlers = {
|
|
|
743
899
|
console.log('[OK] Command validated');
|
|
744
900
|
},
|
|
745
901
|
|
|
902
|
+
// Intercept Grep/Glob: run monograph_query on the same pattern first and
|
|
903
|
+
// surface graph hits so the LLM can read file:line directly without paying
|
|
904
|
+
// for a full Grep scan when the graph already knows the answer.
|
|
905
|
+
'pre-search': () => {
|
|
906
|
+
try {
|
|
907
|
+
_recordGraphTelemetry(toolName === 'Grep' ? 'grep_call' : 'glob_call');
|
|
908
|
+
var pattern = toolInput.pattern || toolInput.path || '';
|
|
909
|
+
if (typeof pattern !== 'string' || pattern.length < 3) return;
|
|
910
|
+
var clean = pattern.replace(/[\\^$.*+?()\[\]{}|]/g, ' ').trim();
|
|
911
|
+
if (clean.length < 3) return;
|
|
912
|
+
var suggestions = getMonographSuggestions(clean, 5);
|
|
913
|
+
if (suggestions.length === 0) return;
|
|
914
|
+
console.log('[MONOGRAPH_HIT] Graph already knows ' + suggestions.length + ' file(s) matching "' + clean.slice(0, 40) + '":');
|
|
915
|
+
for (var i = 0; i < suggestions.length; i++) {
|
|
916
|
+
var s = suggestions[i];
|
|
917
|
+
console.log(' · ' + s.name + ' [' + s.label + '] — ' + (s.file || '') + ' (deg ' + s.deg + ')');
|
|
918
|
+
}
|
|
919
|
+
console.log(' Prefer mcp__monomind__monograph_query for symbol lookup (file:line, no scan).');
|
|
920
|
+
} catch (e) { /* non-fatal */ }
|
|
921
|
+
},
|
|
922
|
+
|
|
923
|
+
// After Read: append a graph neighbor footer so the LLM gets free
|
|
924
|
+
// architectural context — what imports this file and what it imports.
|
|
925
|
+
'post-read': () => {
|
|
926
|
+
try {
|
|
927
|
+
var filePath = toolInput.file_path || toolInput.path || '';
|
|
928
|
+
if (!filePath || typeof filePath !== 'string') return;
|
|
929
|
+
var n = getMonographNeighbors(filePath);
|
|
930
|
+
if (!n) return;
|
|
931
|
+
var parts = [];
|
|
932
|
+
if (n.importedBy.length > 0) parts.push('imported-by: ' + n.importedBy.slice(0, 4).join(', '));
|
|
933
|
+
if (n.imports.length > 0) parts.push('imports: ' + n.imports.slice(0, 4).join(', '));
|
|
934
|
+
if (parts.length === 0) return;
|
|
935
|
+
console.log('[MONOGRAPH_NEIGHBORS] ' + parts.join(' · '));
|
|
936
|
+
} catch (e) { /* non-fatal */ }
|
|
937
|
+
},
|
|
938
|
+
|
|
939
|
+
// PostToolUse for monograph_* — increment graph usage counter for telemetry.
|
|
940
|
+
'post-graph-tool': () => {
|
|
941
|
+
try {
|
|
942
|
+
if (toolName && toolName.indexOf('monograph_') !== -1) {
|
|
943
|
+
_recordGraphTelemetry('monograph_call');
|
|
944
|
+
}
|
|
945
|
+
} catch (e) {}
|
|
946
|
+
},
|
|
947
|
+
|
|
746
948
|
'post-edit': async () => {
|
|
747
949
|
if (session && session.metric) {
|
|
748
950
|
try { session.metric('edits'); } catch (e) { /* no active session */ }
|
|
@@ -953,9 +1155,12 @@ const handlers = {
|
|
|
953
1155
|
var mgNodeCount = mgDb.prepare('SELECT COUNT(*) AS c FROM nodes').get().c;
|
|
954
1156
|
var mgEdgeCount = mgDb.prepare('SELECT COUNT(*) AS c FROM edges').get().c;
|
|
955
1157
|
var mgGodNodes = mgDb.prepare(
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
1158
|
+
"SELECT n.name, n.label, n.file_path, " +
|
|
1159
|
+
"(SELECT COUNT(*) FROM edges WHERE source_id=n.id OR target_id=n.id) AS deg " +
|
|
1160
|
+
"FROM nodes n " +
|
|
1161
|
+
"WHERE n.label NOT IN ('Concept') " +
|
|
1162
|
+
"AND n.file_path IS NOT NULL AND n.file_path != '' " +
|
|
1163
|
+
"ORDER BY deg DESC LIMIT 12"
|
|
959
1164
|
).all();
|
|
960
1165
|
if (mgGodNodes.length > 0) {
|
|
961
1166
|
var mgGodStr = mgGodNodes.slice(0, 8).map(function(n) {
|
|
@@ -696,6 +696,24 @@ function getGraphifyStats() {
|
|
|
696
696
|
return { nodes: 0, edges: 0, exists: false };
|
|
697
697
|
}
|
|
698
698
|
|
|
699
|
+
// Graph usage telemetry — ratio of monograph_* tool calls vs Grep/Glob
|
|
700
|
+
function getGraphUsage() {
|
|
701
|
+
const usagePath = path.join(CWD, '.monomind', 'metrics', 'graph-usage.json');
|
|
702
|
+
try {
|
|
703
|
+
if (!fs.existsSync(usagePath)) return null;
|
|
704
|
+
const d = JSON.parse(fs.readFileSync(usagePath, 'utf-8'));
|
|
705
|
+
const monograph = d.monograph_call || 0;
|
|
706
|
+
const search = (d.grep_call || 0) + (d.glob_call || 0);
|
|
707
|
+
const total = monograph + search;
|
|
708
|
+
if (total === 0) return null;
|
|
709
|
+
return {
|
|
710
|
+
monograph,
|
|
711
|
+
search,
|
|
712
|
+
pct: Math.round((monograph / total) * 100),
|
|
713
|
+
};
|
|
714
|
+
} catch { return null; }
|
|
715
|
+
}
|
|
716
|
+
|
|
699
717
|
// Graph freshness — compare graph build time against most recent commit
|
|
700
718
|
// Returns: { commitsBehind, stale } where stale = >5 commits or never built
|
|
701
719
|
function getGraphFreshness() {
|
|
@@ -1239,7 +1257,15 @@ function generateDashboard() {
|
|
|
1239
1257
|
loopStr = `${x.slate}🔄 no active loops${x.reset}`;
|
|
1240
1258
|
}
|
|
1241
1259
|
|
|
1242
|
-
|
|
1260
|
+
// Graph usage ratio — show only when there's data
|
|
1261
|
+
const usage = getGraphUsage();
|
|
1262
|
+
let usageStr = '';
|
|
1263
|
+
if (usage) {
|
|
1264
|
+
const col = usage.pct >= 40 ? x.green : usage.pct >= 15 ? x.gold : x.coral;
|
|
1265
|
+
usageStr = ` ${DIV} ${col}📊 graph ${usage.pct}%${x.reset}${x.slate} · grep ${100 - usage.pct}%${x.reset}`;
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
lines.push(`${x.purple}🤖 AGENT${x.reset} ${agentStr} ${DIV} ${loopStr}${usageStr}`);
|
|
1243
1269
|
lines.push(SEP);
|
|
1244
1270
|
|
|
1245
1271
|
// ── Row 2: Graph freshness + Pending HIL ─────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-generator.d.ts","sourceRoot":"","sources":["../../../src/init/settings-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAA6B,MAAM,YAAY,CAAC;AAGzE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAmJ7D;
|
|
1
|
+
{"version":3,"file":"settings-generator.d.ts","sourceRoot":"","sources":["../../../src/init/settings-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAA6B,MAAM,YAAY,CAAC;AAGzE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAmJ7D;AAgUD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAGjE"}
|
|
@@ -233,6 +233,17 @@ function generateHooksConfig(config, graphify = true) {
|
|
|
233
233
|
},
|
|
234
234
|
],
|
|
235
235
|
},
|
|
236
|
+
// Grep/Glob → monograph_query intercept (saves tokens vs full scan)
|
|
237
|
+
{
|
|
238
|
+
matcher: 'Grep|Glob',
|
|
239
|
+
hooks: [
|
|
240
|
+
{
|
|
241
|
+
type: 'command',
|
|
242
|
+
command: hookHandlerCmd('pre-search'),
|
|
243
|
+
timeout: 4000,
|
|
244
|
+
},
|
|
245
|
+
],
|
|
246
|
+
},
|
|
236
247
|
];
|
|
237
248
|
}
|
|
238
249
|
// PostToolUse — record edits and commands for session metrics / learning
|
|
@@ -258,6 +269,28 @@ function generateHooksConfig(config, graphify = true) {
|
|
|
258
269
|
},
|
|
259
270
|
],
|
|
260
271
|
},
|
|
272
|
+
// Read → graph neighbor footer
|
|
273
|
+
{
|
|
274
|
+
matcher: 'Read',
|
|
275
|
+
hooks: [
|
|
276
|
+
{
|
|
277
|
+
type: 'command',
|
|
278
|
+
command: hookHandlerCmd('post-read'),
|
|
279
|
+
timeout: 4000,
|
|
280
|
+
},
|
|
281
|
+
],
|
|
282
|
+
},
|
|
283
|
+
// monograph_* tool calls → telemetry counter
|
|
284
|
+
{
|
|
285
|
+
matcher: 'mcp__monomind__monograph_.*',
|
|
286
|
+
hooks: [
|
|
287
|
+
{
|
|
288
|
+
type: 'command',
|
|
289
|
+
command: hookHandlerCmd('post-graph-tool'),
|
|
290
|
+
timeout: 2000,
|
|
291
|
+
},
|
|
292
|
+
],
|
|
293
|
+
},
|
|
261
294
|
];
|
|
262
295
|
}
|
|
263
296
|
// UserPromptSubmit — intelligent task routing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-generator.js","sourceRoot":"","sources":["../../../src/init/settings-generator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"settings-generator.js","sourceRoot":"","sources":["../../../src/init/settings-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statusline-generator.d.ts","sourceRoot":"","sources":["../../../src/init/statusline-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"statusline-generator.d.ts","sourceRoot":"","sources":["../../../src/init/statusline-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CA0oCrE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CA8BnE"}
|
|
@@ -828,6 +828,20 @@ function getTriggerStats() {
|
|
|
828
828
|
} catch { return { triggers: 0, agents: 0 }; }
|
|
829
829
|
}
|
|
830
830
|
|
|
831
|
+
// Graph usage telemetry — ratio of monograph_* tool calls vs Grep/Glob
|
|
832
|
+
function getGraphUsage() {
|
|
833
|
+
const usagePath = path.join(CWD, '.monomind', 'metrics', 'graph-usage.json');
|
|
834
|
+
try {
|
|
835
|
+
if (!fs.existsSync(usagePath)) return null;
|
|
836
|
+
const d = JSON.parse(fs.readFileSync(usagePath, 'utf-8'));
|
|
837
|
+
const monograph = d.monograph_call || 0;
|
|
838
|
+
const search = (d.grep_call || 0) + (d.glob_call || 0);
|
|
839
|
+
const total = monograph + search;
|
|
840
|
+
if (total === 0) return null;
|
|
841
|
+
return { monograph: monograph, search: search, pct: Math.round((monograph / total) * 100) };
|
|
842
|
+
} catch { return null; }
|
|
843
|
+
}
|
|
844
|
+
|
|
831
845
|
// Graph freshness — compare last build time vs commits since
|
|
832
846
|
function getGraphFreshness() {
|
|
833
847
|
const lockPath = path.join(CWD, '.monomind', 'graph', '.rebuild-lock');
|
|
@@ -1070,7 +1084,15 @@ function generateDashboard() {
|
|
|
1070
1084
|
loopStr = \`\${x.slate}🔄 no active loops\${x.reset}\`;
|
|
1071
1085
|
}
|
|
1072
1086
|
|
|
1073
|
-
|
|
1087
|
+
// Graph usage ratio — show only when there's data
|
|
1088
|
+
const usage = getGraphUsage();
|
|
1089
|
+
let usageStr = '';
|
|
1090
|
+
if (usage) {
|
|
1091
|
+
const col = usage.pct >= 40 ? x.green : usage.pct >= 15 ? x.gold : x.coral;
|
|
1092
|
+
usageStr = \` \${DIV} \${col}📊 graph \${usage.pct}%\${x.reset}\${x.slate} · grep \${100 - usage.pct}%\${x.reset}\`;
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
lines.push(\`\${x.purple}🤖 AGENT\${x.reset} \${agentStr} \${DIV} \${loopStr}\${usageStr}\`);
|
|
1074
1096
|
lines.push(SEP);
|
|
1075
1097
|
|
|
1076
1098
|
// ── Row 2: Graph freshness + Pending HIL ─────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statusline-generator.js","sourceRoot":"","sources":["../../../src/init/statusline-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAoB;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5C,OAAO;;;;;;;;;;;;;;;;;;;;;;;eAuBM,SAAS
|
|
1
|
+
{"version":3,"file":"statusline-generator.js","sourceRoot":"","sources":["../../../src/init/statusline-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAoB;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5C,OAAO;;;;;;;;;;;;;;;;;;;;;;;eAuBM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgnCvB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAoB;IACzD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAChC,OAAO,sCAAsC,CAAC;IAChD,CAAC;IAED,OAAO;;;;;;;;;;;;;;;;;;;;;;;;CAwBR,CAAC;AACF,CAAC"}
|