@monoes/monomindcli 1.10.30 → 1.10.32
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/commands/browse.md +6 -17
- package/.claude/helpers/handlers/adr-draft-handler.cjs +64 -0
- package/.claude/helpers/handlers/agent-start-handler.cjs +99 -0
- package/.claude/helpers/handlers/budget-status-handler.cjs +14 -0
- package/.claude/helpers/handlers/compact-handler.cjs +33 -0
- package/.claude/helpers/handlers/graph-status-handler.cjs +38 -0
- package/.claude/helpers/handlers/loops-status-handler.cjs +45 -0
- package/.claude/helpers/handlers/session-restore-handler.cjs +66 -55
- package/.claude/helpers/handlers/stats-handler.cjs +14 -0
- package/.claude/helpers/hook-handler.cjs +16 -228
- package/.claude/skills/agent-browser-testing/SKILL.md +149 -151
- package/.claude/skills/monomind/browse-agentcore.md +20 -21
- package/.claude/skills/monomind/browse-electron.md +45 -46
- package/.claude/skills/monomind/browse-qa.md +29 -30
- package/.claude/skills/monomind/browse-references/authentication.md +39 -40
- package/.claude/skills/monomind/browse-references/trust-boundaries.md +1 -2
- package/.claude/skills/monomind/browse-references/video-recording.md +23 -24
- package/.claude/skills/monomind/browse-slack.md +52 -53
- package/.claude/skills/monomind/browse-vercel.md +26 -27
- package/.claude/skills/monomind/browse.md +273 -273
- package/dist/src/browser/actions.d.ts +15 -0
- package/dist/src/browser/actions.d.ts.map +1 -1
- package/dist/src/browser/actions.js +91 -0
- package/dist/src/browser/actions.js.map +1 -1
- package/dist/src/browser/batch.d.ts +13 -0
- package/dist/src/browser/batch.d.ts.map +1 -0
- package/dist/src/browser/batch.js +11 -0
- package/dist/src/browser/batch.js.map +1 -0
- package/dist/src/browser/console-log.d.ts +22 -0
- package/dist/src/browser/console-log.d.ts.map +1 -0
- package/dist/src/browser/console-log.js +55 -0
- package/dist/src/browser/console-log.js.map +1 -0
- package/dist/src/browser/dialog.d.ts +11 -0
- package/dist/src/browser/dialog.d.ts.map +1 -0
- package/dist/src/browser/dialog.js +36 -0
- package/dist/src/browser/dialog.js.map +1 -0
- package/dist/src/browser/emulation.d.ts +15 -0
- package/dist/src/browser/emulation.d.ts.map +1 -0
- package/dist/src/browser/emulation.js +62 -0
- package/dist/src/browser/emulation.js.map +1 -0
- package/dist/src/browser/find.d.ts +21 -0
- package/dist/src/browser/find.d.ts.map +1 -0
- package/dist/src/browser/find.js +118 -0
- package/dist/src/browser/find.js.map +1 -0
- package/dist/src/browser/index.d.ts +7 -0
- package/dist/src/browser/index.d.ts.map +1 -1
- package/dist/src/browser/index.js +7 -0
- package/dist/src/browser/index.js.map +1 -1
- package/dist/src/browser/pdf.d.ts +15 -0
- package/dist/src/browser/pdf.d.ts.map +1 -0
- package/dist/src/browser/pdf.js +27 -0
- package/dist/src/browser/pdf.js.map +1 -0
- package/dist/src/browser/storage.d.ts +11 -0
- package/dist/src/browser/storage.d.ts.map +1 -0
- package/dist/src/browser/storage.js +43 -0
- package/dist/src/browser/storage.js.map +1 -0
- package/dist/src/commands/browse.d.ts.map +1 -1
- package/dist/src/commands/browse.js +939 -18
- package/dist/src/commands/browse.js.map +1 -1
- package/dist/src/ui/dashboard-v2.html +581 -19
- package/dist/src/ui/server.mjs +56 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -248,247 +248,38 @@ const handlers = {
|
|
|
248
248
|
|
|
249
249
|
|
|
250
250
|
'compact-manual': async () => {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
}
|
|
254
|
-
try {
|
|
255
|
-
var lastRoute = path.join(CWD, '.monomind', 'last-route.json');
|
|
256
|
-
if (fs.existsSync(lastRoute)) {
|
|
257
|
-
var route = JSON.parse(fs.readFileSync(lastRoute, 'utf-8'));
|
|
258
|
-
console.log('[COMPACT_CONTEXT] Last route: ' + route.agent + ' (' + (route.confidence != null ? (route.confidence * 100).toFixed(0) : '?') + '%)');
|
|
259
|
-
}
|
|
260
|
-
} catch (e) { /* non-fatal */ }
|
|
261
|
-
_injectCompactGraphMap();
|
|
262
|
-
console.log('[COMPACT] Manual compaction — intelligence consolidated, context preserved');
|
|
251
|
+
const h = require('./handlers/compact-handler.cjs');
|
|
252
|
+
await h.handle(hCtx, 'manual');
|
|
263
253
|
},
|
|
264
254
|
|
|
265
255
|
'compact-auto': async () => {
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
}
|
|
269
|
-
try {
|
|
270
|
-
var lastRoute = path.join(CWD, '.monomind', 'last-route.json');
|
|
271
|
-
if (fs.existsSync(lastRoute)) {
|
|
272
|
-
var route = JSON.parse(fs.readFileSync(lastRoute, 'utf-8'));
|
|
273
|
-
console.log('[COMPACT_CONTEXT] Last route: ' + route.agent + ' (' + (route.confidence != null ? (route.confidence * 100).toFixed(0) : '?') + '%)');
|
|
274
|
-
}
|
|
275
|
-
} catch (e) { /* non-fatal */ }
|
|
276
|
-
_injectCompactGraphMap();
|
|
277
|
-
console.log('[COMPACT] Auto compaction — intelligence consolidated, context preserved');
|
|
278
|
-
console.log('GOLDEN RULE: 1 message = all parallel operations');
|
|
256
|
+
const h = require('./handlers/compact-handler.cjs');
|
|
257
|
+
await h.handle(hCtx, 'auto');
|
|
279
258
|
},
|
|
280
259
|
|
|
281
260
|
'agent-start': () => {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
try {
|
|
285
|
-
fs.mkdirSync(regDir, { recursive: true });
|
|
286
|
-
const id = Date.now() + '-' + Math.random().toString(36).slice(2, 6);
|
|
287
|
-
const regFile = path.join(regDir, 'agent-' + id + '.json');
|
|
288
|
-
fs.writeFileSync(regFile, JSON.stringify({
|
|
289
|
-
agentId: id,
|
|
290
|
-
startedAt: new Date().toISOString(),
|
|
291
|
-
pid: process.pid,
|
|
292
|
-
}));
|
|
293
|
-
// Also refresh swarm-activity.json so it's within the 5-min staleness window
|
|
294
|
-
const activityDir = path.join(CWD, '.monomind', 'metrics');
|
|
295
|
-
fs.mkdirSync(activityDir, { recursive: true });
|
|
296
|
-
const activityPath = path.join(activityDir, 'swarm-activity.json');
|
|
297
|
-
const active = fs.readdirSync(regDir).filter(f => f.endsWith('.json')).length;
|
|
298
|
-
// Preserve lastActive (peak) across agent lifecycle so statusline shows non-zero after completion
|
|
299
|
-
let prevLastActive = 0;
|
|
300
|
-
try { prevLastActive = (JSON.parse(fs.readFileSync(activityPath, 'utf-8'))?.swarm?.lastActive) || 0; } catch { /* ignore */ }
|
|
301
|
-
fs.writeFileSync(activityPath, JSON.stringify({
|
|
302
|
-
timestamp: new Date().toISOString(),
|
|
303
|
-
swarm: {
|
|
304
|
-
active: active > 0,
|
|
305
|
-
agent_count: active,
|
|
306
|
-
coordination_active: active > 0,
|
|
307
|
-
lastActive: Math.max(active, prevLastActive),
|
|
308
|
-
},
|
|
309
|
-
}));
|
|
310
|
-
|
|
311
|
-
// Write last-dispatch.json so the route handler can suppress redundant suggestions
|
|
312
|
-
// on the next turn when the same type of agent is recommended.
|
|
313
|
-
const agentType = hookInput.subagent_type || hookInput.agentType || hookInput.agent_type || hookInput.agentSlug || 'unknown';
|
|
314
|
-
const agentDesc = hookInput.description || hookInput.prompt_description || '';
|
|
315
|
-
fs.writeFileSync(
|
|
316
|
-
path.join(CWD, '.monomind', 'last-dispatch.json'),
|
|
317
|
-
JSON.stringify({
|
|
318
|
-
agentType: agentType,
|
|
319
|
-
description: agentDesc.substring(0, 120),
|
|
320
|
-
dispatchedAt: new Date().toISOString(),
|
|
321
|
-
}),
|
|
322
|
-
'utf-8'
|
|
323
|
-
);
|
|
324
|
-
} catch (e) { /* non-fatal — never block a subagent from starting */ }
|
|
325
|
-
|
|
326
|
-
// Subagent context inheritance — inject graph god nodes + parent's last
|
|
327
|
-
// pre-resolved suggestions so the spawned agent inherits spatial map
|
|
328
|
-
// instead of starting blind.
|
|
329
|
-
try {
|
|
330
|
-
var subDb = _openMonographDb();
|
|
331
|
-
if (subDb) {
|
|
332
|
-
try {
|
|
333
|
-
var godRows = subDb.prepare(
|
|
334
|
-
"SELECT n.name, n.label, n.file_path AS file, " +
|
|
335
|
-
"(SELECT COUNT(*) FROM edges WHERE source_id=n.id OR target_id=n.id) AS deg " +
|
|
336
|
-
"FROM nodes n " +
|
|
337
|
-
"WHERE n.label NOT IN ('Concept') AND n.file_path IS NOT NULL AND n.file_path != '' " +
|
|
338
|
-
"ORDER BY deg DESC LIMIT 5"
|
|
339
|
-
).all();
|
|
340
|
-
if (godRows.length > 0) {
|
|
341
|
-
console.log('[MONOGRAPH_SUBAGENT_CTX] Graph map inherited from parent:');
|
|
342
|
-
for (var gi = 0; gi < godRows.length; gi++) {
|
|
343
|
-
var gr = godRows[gi];
|
|
344
|
-
console.log(' · ' + gr.name + ' [' + gr.label + '] — ' + (gr.file || '') + ' (deg ' + gr.deg + ')');
|
|
345
|
-
}
|
|
346
|
-
// Also forward parent's last routing suggestion text if any
|
|
347
|
-
try {
|
|
348
|
-
var subAgentDesc = hookInput.description || hookInput.prompt_description || '';
|
|
349
|
-
if (subAgentDesc && subAgentDesc.length > 8) {
|
|
350
|
-
var subHints = getMonographSuggestions(subAgentDesc, 3);
|
|
351
|
-
if (subHints.length > 0) {
|
|
352
|
-
console.log(' Top files for this subagent task:');
|
|
353
|
-
for (var si2 = 0; si2 < subHints.length; si2++) {
|
|
354
|
-
var sh = subHints[si2];
|
|
355
|
-
console.log(' · ' + sh.name + ' [' + sh.label + '] — ' + (sh.file || ''));
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
} catch (_) {}
|
|
360
|
-
console.log(' Use mcp__monomind__monograph_suggest / monograph_query in this subagent before grepping.');
|
|
361
|
-
}
|
|
362
|
-
} catch (e) { /* non-fatal */ }
|
|
363
|
-
}
|
|
364
|
-
} catch (e) { /* non-fatal */ }
|
|
365
|
-
|
|
366
|
-
console.log('[OK] Agent registered');
|
|
261
|
+
const h = require('./handlers/agent-start-handler.cjs');
|
|
262
|
+
h.handle(hCtx);
|
|
367
263
|
},
|
|
368
264
|
|
|
369
|
-
// Draft an ADR from accumulated decision markers in .monomind/decisions.jsonl.
|
|
370
|
-
// Usage: node hook-handler.cjs adr-draft (or via /adr slash command)
|
|
371
265
|
'adr-draft': () => {
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
console.log('[ADR] No decisions recorded yet. Type prompts containing markers like "let\'s go with X", "we chose Y", "decision: Z" to populate the log.');
|
|
375
|
-
return;
|
|
376
|
-
}
|
|
377
|
-
var lines = fs.readFileSync(jsonl, 'utf-8').trim().split('\n').filter(Boolean);
|
|
378
|
-
if (lines.length === 0) {
|
|
379
|
-
console.log('[ADR] decisions.jsonl is empty.');
|
|
380
|
-
return;
|
|
381
|
-
}
|
|
382
|
-
// Group decisions captured in the last 7 days
|
|
383
|
-
var cutoff = Date.now() - 7 * 24 * 60 * 60 * 1000;
|
|
384
|
-
var recent = lines.map(function(l) { try { return JSON.parse(l); } catch (_) { return null; } })
|
|
385
|
-
.filter(function(d) { return d && d.ts >= cutoff; });
|
|
386
|
-
if (recent.length === 0) {
|
|
387
|
-
console.log('[ADR] No decisions in the last 7 days. Older entries: ' + lines.length + '.');
|
|
388
|
-
return;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
var adrsDir = path.join(CWD, 'docs', 'adrs');
|
|
392
|
-
try { fs.mkdirSync(adrsDir, { recursive: true }); } catch (_) {}
|
|
393
|
-
// Pick next ADR number
|
|
394
|
-
var existing = [];
|
|
395
|
-
try { existing = fs.readdirSync(adrsDir).filter(function(f) { return /^ADR-\d{4}/.test(f); }); } catch (_) {}
|
|
396
|
-
var nextNum = existing.length + 1;
|
|
397
|
-
var num = String(nextNum).padStart(4, '0');
|
|
398
|
-
var stamp = new Date().toISOString().slice(0,10);
|
|
399
|
-
var slug = 'session-decisions';
|
|
400
|
-
var fname = 'ADR-' + num + '-' + stamp + '-' + slug + '.md';
|
|
401
|
-
var outPath = path.join(adrsDir, fname);
|
|
402
|
-
|
|
403
|
-
var body = '# ADR-' + num + ': Session decisions (' + stamp + ')\n\n' +
|
|
404
|
-
'**Status:** Proposed\n**Date:** ' + stamp + '\n\n' +
|
|
405
|
-
'## Context\n\n' +
|
|
406
|
-
'During recent sessions, the following decision markers were captured ' +
|
|
407
|
-
'from user prompts. Each excerpt is the surrounding sentence at the time.\n\n' +
|
|
408
|
-
'## Decisions\n\n';
|
|
409
|
-
for (var i = 0; i < recent.length; i++) {
|
|
410
|
-
var d = recent[i];
|
|
411
|
-
var date = new Date(d.ts).toISOString().slice(0,16).replace('T',' ');
|
|
412
|
-
body += '### ' + (i + 1) + '. ' + date + '\n\n';
|
|
413
|
-
for (var j = 0; j < d.excerpts.length; j++) {
|
|
414
|
-
body += '> ' + d.excerpts[j].trim() + '\n\n';
|
|
415
|
-
}
|
|
416
|
-
if (d.prompt) body += '_Prompt:_ ' + d.prompt.slice(0, 200) + (d.prompt.length > 200 ? '…' : '') + '\n\n';
|
|
417
|
-
}
|
|
418
|
-
body += '## Consequences\n\n_(fill in after review)_\n\n' +
|
|
419
|
-
'## Status\n\nProposed — awaiting human review and refinement.\n';
|
|
420
|
-
fs.writeFileSync(outPath, body);
|
|
421
|
-
console.log('[ADR_DRAFT] Wrote ' + recent.length + ' decision(s) to ' + outPath);
|
|
422
|
-
console.log(' Edit the file to fill in Context and Consequences, then change Status to Accepted/Rejected.');
|
|
266
|
+
const h = require('./handlers/adr-draft-handler.cjs');
|
|
267
|
+
h.handle(hCtx);
|
|
423
268
|
},
|
|
424
269
|
|
|
425
270
|
'graph-status': () => {
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
try {
|
|
429
|
-
var n = db.prepare("SELECT COUNT(*) AS c FROM nodes").get().c;
|
|
430
|
-
var e = db.prepare("SELECT COUNT(*) AS c FROM edges").get().c;
|
|
431
|
-
var usage = (function() {
|
|
432
|
-
try { return JSON.parse(fs.readFileSync(path.join(CWD, '.monomind', 'metrics', 'graph-usage.json'), 'utf-8')); }
|
|
433
|
-
catch (_) { return {}; }
|
|
434
|
-
})();
|
|
435
|
-
var wins = (usage.monograph_call || 0) + (usage.preresolve_hit || 0)
|
|
436
|
-
+ (usage.graph_assist_search || 0) + (usage.graph_assist_neighbors || 0);
|
|
437
|
-
var search = (usage.grep_call || 0) + (usage.glob_call || 0)
|
|
438
|
-
+ (usage.bash_grep_call || 0) + (usage.bash_find_call || 0);
|
|
439
|
-
var pct = (wins + search) > 0 ? Math.round((wins / (wins + search)) * 100) : 0;
|
|
440
|
-
var saved = usage.dollars_saved || 0;
|
|
441
|
-
console.log('Monograph: ' + n.toLocaleString() + ' nodes · ' + e.toLocaleString() + ' edges');
|
|
442
|
-
console.log('Usage: ' + pct + '% graph · ' + (100 - pct) + '% grep · ' +
|
|
443
|
-
'wins=' + wins + ' search=' + search +
|
|
444
|
-
(saved > 0 ? ' · saved $' + saved.toFixed(2) : ''));
|
|
445
|
-
} catch (err) { console.log('Error: ' + err.message); }
|
|
271
|
+
const h = require('./handlers/graph-status-handler.cjs');
|
|
272
|
+
h.handle(hCtx);
|
|
446
273
|
},
|
|
447
274
|
|
|
448
275
|
'budget-status': () => {
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
console.log('Today: $' + b.todayCost.toFixed(2) + ' / $' + b.dailyLimit + ' (' + b.dailyPct + '%)' + (b.autoTuned ? ' [auto-tuned]' : ''));
|
|
452
|
-
console.log('Month: $' + b.monthCost.toFixed(2) + ' / $' + b.monthlyLimit + ' (' + b.monthlyPct + '%)');
|
|
453
|
-
console.log('Status: ' + (b.breached ? 'BREACHED' : b.spike ? 'SPIKE' : b.alert ? 'ALERT' : 'OK'));
|
|
454
|
-
console.log('Edit .monomind/budget.json to adjust. Delete to re-tune.');
|
|
276
|
+
const h = require('./handlers/budget-status-handler.cjs');
|
|
277
|
+
h.handle(hCtx);
|
|
455
278
|
},
|
|
456
279
|
|
|
457
280
|
'loops-status': () => {
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
var files = fs.readdirSync(loopsDir).filter(function(f) {
|
|
461
|
-
return f.endsWith('.json') && !f.includes('-hil') && !f.endsWith('.stop');
|
|
462
|
-
});
|
|
463
|
-
var STALE_MS = 6 * 60 * 60 * 1000;
|
|
464
|
-
var now = Date.now();
|
|
465
|
-
var active = [], stale = [];
|
|
466
|
-
files.forEach(function(f) {
|
|
467
|
-
try {
|
|
468
|
-
var d = JSON.parse(fs.readFileSync(path.join(loopsDir, f), 'utf-8'));
|
|
469
|
-
var last = d.lastRunAt || d.startedAt || 0;
|
|
470
|
-
var ageMs = last ? (now - last) : Infinity;
|
|
471
|
-
if (ageMs > STALE_MS) stale.push({ d: d, ageH: Math.round(ageMs / 3600000) });
|
|
472
|
-
else active.push(d);
|
|
473
|
-
} catch (_) {}
|
|
474
|
-
});
|
|
475
|
-
if (active.length === 0 && stale.length === 0) {
|
|
476
|
-
console.log('No loops.'); return;
|
|
477
|
-
}
|
|
478
|
-
if (active.length > 0) {
|
|
479
|
-
console.log('Active (' + active.length + '):');
|
|
480
|
-
active.forEach(function(d) {
|
|
481
|
-
console.log(' · ' + (d.command || '?') + ' [' + (d.type || '?') + '] run ' + (d.currentRep || 0) +
|
|
482
|
-
(d.maxReps ? '/' + d.maxReps : '') + ' · ' + (d.status || '?'));
|
|
483
|
-
});
|
|
484
|
-
}
|
|
485
|
-
if (stale.length > 0) {
|
|
486
|
-
console.log('Stale (' + stale.length + ' >6h):');
|
|
487
|
-
stale.forEach(function(s) {
|
|
488
|
-
console.log(' · ' + (s.d.command || '?') + ' run ' + (s.d.currentRep || 0) +
|
|
489
|
-
' · ' + s.ageH + 'h ago · ' + (s.d.status || '?'));
|
|
490
|
-
});
|
|
491
|
-
}
|
|
281
|
+
const h = require('./handlers/loops-status-handler.cjs');
|
|
282
|
+
h.handle(hCtx);
|
|
492
283
|
},
|
|
493
284
|
|
|
494
285
|
'status': () => {
|
|
@@ -496,11 +287,8 @@ const handlers = {
|
|
|
496
287
|
},
|
|
497
288
|
|
|
498
289
|
'stats': async () => {
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
} else {
|
|
502
|
-
console.log('[WARN] Intelligence module not available. Run session-restore first.');
|
|
503
|
-
}
|
|
290
|
+
const h = require('./handlers/stats-handler.cjs');
|
|
291
|
+
await h.handle(hCtx);
|
|
504
292
|
},
|
|
505
293
|
};
|
|
506
294
|
|