@monoes/monomindcli 1.10.31 → 1.10.33
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/budget-status-handler.cjs +14 -0
- package/.claude/helpers/handlers/compact-handler.cjs +33 -0
- package/.claude/helpers/handlers/loops-status-handler.cjs +45 -0
- package/.claude/helpers/handlers/session-restore-handler.cjs +21 -15
- package/.claude/helpers/handlers/stats-handler.cjs +14 -0
- package/.claude/helpers/hook-handler.cjs +10 -70
- package/.claude/helpers/statusline.cjs +16 -5
- 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/ui/.monomind/sessions/current.json +1 -1
- package/dist/src/ui/dashboard-v2.html +770 -15
- package/dist/src/ui/server.mjs +34 -0
- package/package.json +1 -1
|
@@ -1,32 +1,21 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: browse
|
|
3
|
-
description: Launch
|
|
3
|
+
description: Launch monomind browse for web UI testing and automation — native TypeScript CDP client, no external binary needed
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Invoke the agent-browser-testing skill to test or automate a web UI.
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
```bash
|
|
11
|
-
if ! command -v agent-browser &>/dev/null; then
|
|
12
|
-
echo "Installing agent-browser..."
|
|
13
|
-
npm install -g agent-browser
|
|
14
|
-
else
|
|
15
|
-
echo "agent-browser $(agent-browser --version) ready"
|
|
16
|
-
fi
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
After confirming agent-browser is available, invoke the skill:
|
|
8
|
+
`monomind browse` is built-in — no install needed. Invoke the skill:
|
|
20
9
|
|
|
21
10
|
Skill("agent-browser-testing")
|
|
22
11
|
|
|
23
12
|
Pass the user's argument (if any) as the URL or task description: $1
|
|
24
13
|
|
|
25
|
-
Use the full
|
|
26
|
-
1. `
|
|
27
|
-
2. `
|
|
14
|
+
Use the full monomind browse workflow:
|
|
15
|
+
1. `npx monomind browse open <url>`
|
|
16
|
+
2. `npx monomind browse snapshot -i`
|
|
28
17
|
3. Act using element refs (@e1, @e2, ...)
|
|
29
18
|
4. Re-snapshot to verify
|
|
30
|
-
5. Report results (
|
|
19
|
+
5. Report results (PASS / FAIL / WARN)
|
|
31
20
|
|
|
32
21
|
Examples: `/browse`, `/browse https://example.com`, `/browse test the login flow`
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
// Extracted from hook-handler.cjs — handles 'budget-status' command.
|
|
3
|
+
|
|
4
|
+
module.exports = {
|
|
5
|
+
handle: function(hCtx) {
|
|
6
|
+
var _getBudgetStatus = hCtx._getBudgetStatus;
|
|
7
|
+
var b = _getBudgetStatus();
|
|
8
|
+
if (!b) { console.log('No budget data yet — token tracking not initialized.'); return; }
|
|
9
|
+
console.log('Today: $' + b.todayCost.toFixed(2) + ' / $' + b.dailyLimit + ' (' + b.dailyPct + '%)' + (b.autoTuned ? ' [auto-tuned]' : ''));
|
|
10
|
+
console.log('Month: $' + b.monthCost.toFixed(2) + ' / $' + b.monthlyLimit + ' (' + b.monthlyPct + '%)');
|
|
11
|
+
console.log('Status: ' + (b.breached ? 'BREACHED' : b.spike ? 'SPIKE' : b.alert ? 'ALERT' : 'OK'));
|
|
12
|
+
console.log('Edit .monomind/budget.json to adjust. Delete to re-tune.');
|
|
13
|
+
},
|
|
14
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
// Extracted from hook-handler.cjs — handles 'compact-manual' and 'compact-auto' events.
|
|
3
|
+
// Receives hCtx and mode ('manual'|'auto') from dispatcher.
|
|
4
|
+
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
|
|
8
|
+
module.exports = {
|
|
9
|
+
handle: async function(hCtx, mode) {
|
|
10
|
+
var intelligence = hCtx.intelligence;
|
|
11
|
+
var runWithTimeout = hCtx.runWithTimeout;
|
|
12
|
+
var _injectCompactGraphMap = hCtx._injectCompactGraphMap;
|
|
13
|
+
var CWD = hCtx.CWD;
|
|
14
|
+
|
|
15
|
+
if (intelligence && intelligence.consolidate) {
|
|
16
|
+
try { await runWithTimeout(function() { return intelligence.consolidate(); }, 'intelligence.consolidate()'); } catch (e) { /* non-fatal */ }
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
var lastRoute = path.join(CWD, '.monomind', 'last-route.json');
|
|
20
|
+
if (fs.existsSync(lastRoute)) {
|
|
21
|
+
var route = JSON.parse(fs.readFileSync(lastRoute, 'utf-8'));
|
|
22
|
+
console.log('[COMPACT_CONTEXT] Last route: ' + route.agent + ' (' + (route.confidence != null ? (route.confidence * 100).toFixed(0) : '?') + '%)');
|
|
23
|
+
}
|
|
24
|
+
} catch (e) { /* non-fatal */ }
|
|
25
|
+
_injectCompactGraphMap();
|
|
26
|
+
if (mode === 'auto') {
|
|
27
|
+
console.log('[COMPACT] Auto compaction — intelligence consolidated, context preserved');
|
|
28
|
+
console.log('GOLDEN RULE: 1 message = all parallel operations');
|
|
29
|
+
} else {
|
|
30
|
+
console.log('[COMPACT] Manual compaction — intelligence consolidated, context preserved');
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
// Extracted from hook-handler.cjs — handles 'loops-status' command.
|
|
3
|
+
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const fs = require('fs');
|
|
6
|
+
|
|
7
|
+
module.exports = {
|
|
8
|
+
handle: function(hCtx) {
|
|
9
|
+
var CWD = hCtx.CWD;
|
|
10
|
+
var loopsDir = path.join(CWD, '.monomind', 'loops');
|
|
11
|
+
if (!fs.existsSync(loopsDir)) { console.log('No loops directory.'); return; }
|
|
12
|
+
var files = fs.readdirSync(loopsDir).filter(function(f) {
|
|
13
|
+
return f.endsWith('.json') && !f.includes('-hil') && !f.endsWith('.stop');
|
|
14
|
+
});
|
|
15
|
+
var STALE_MS = 6 * 60 * 60 * 1000;
|
|
16
|
+
var now = Date.now();
|
|
17
|
+
var active = [], stale = [];
|
|
18
|
+
files.forEach(function(f) {
|
|
19
|
+
try {
|
|
20
|
+
var d = JSON.parse(fs.readFileSync(path.join(loopsDir, f), 'utf-8'));
|
|
21
|
+
var last = d.lastRunAt || d.startedAt || 0;
|
|
22
|
+
var ageMs = last ? (now - last) : Infinity;
|
|
23
|
+
if (ageMs > STALE_MS) stale.push({ d: d, ageH: Math.round(ageMs / 3600000) });
|
|
24
|
+
else active.push(d);
|
|
25
|
+
} catch (_) {}
|
|
26
|
+
});
|
|
27
|
+
if (active.length === 0 && stale.length === 0) {
|
|
28
|
+
console.log('No loops.'); return;
|
|
29
|
+
}
|
|
30
|
+
if (active.length > 0) {
|
|
31
|
+
console.log('Active (' + active.length + '):');
|
|
32
|
+
active.forEach(function(d) {
|
|
33
|
+
console.log(' · ' + (d.command || '?') + ' [' + (d.type || '?') + '] run ' + (d.currentRep || 0) +
|
|
34
|
+
(d.maxReps ? '/' + d.maxReps : '') + ' · ' + (d.status || '?'));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
if (stale.length > 0) {
|
|
38
|
+
console.log('Stale (' + stale.length + ' >6h):');
|
|
39
|
+
stale.forEach(function(s) {
|
|
40
|
+
console.log(' · ' + (s.d.command || '?') + ' run ' + (s.d.currentRep || 0) +
|
|
41
|
+
' · ' + s.ageH + 'h ago · ' + (s.d.status || '?'));
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
};
|
|
@@ -318,21 +318,27 @@ module.exports = {
|
|
|
318
318
|
}
|
|
319
319
|
} catch (e) { /* non-fatal */ }
|
|
320
320
|
|
|
321
|
-
// Monomind Control UI Status
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
321
|
+
// Monomind Control UI Status — only probe when a daemon has previously run
|
|
322
|
+
// (indicated by daemon.pid or monomind.config.json). Skips silently in fresh
|
|
323
|
+
// environments and test fixtures that have no daemon history.
|
|
324
|
+
var _controlUiShouldProbe = fs.existsSync(path.join(CWD, '.monomind', 'daemon.pid'))
|
|
325
|
+
|| fs.existsSync(path.join(CWD, 'monomind.config.json'));
|
|
326
|
+
if (_controlUiShouldProbe) {
|
|
327
|
+
try {
|
|
328
|
+
var http = require('http');
|
|
329
|
+
var controlPort = 4242;
|
|
330
|
+
var req = http.get('http://localhost:' + controlPort + '/', function(res) {
|
|
331
|
+
if (res.statusCode === 200) {
|
|
332
|
+
console.log('[CONTROL_UI] UP — http://localhost:' + controlPort);
|
|
333
|
+
}
|
|
334
|
+
res.resume();
|
|
335
|
+
});
|
|
336
|
+
req.on('error', function() {
|
|
337
|
+
console.log('[CONTROL_UI] offline — run: npx monomind mcp start');
|
|
338
|
+
});
|
|
339
|
+
req.setTimeout(800, function() { req.destroy(); });
|
|
340
|
+
} catch (e) { /* non-fatal */ }
|
|
341
|
+
}
|
|
336
342
|
|
|
337
343
|
// Worker Queue Resume (SR-003).
|
|
338
344
|
try {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
// Extracted from hook-handler.cjs — handles 'stats' command.
|
|
3
|
+
|
|
4
|
+
module.exports = {
|
|
5
|
+
handle: async function(hCtx) {
|
|
6
|
+
var intelligence = hCtx.intelligence;
|
|
7
|
+
var args = hCtx.args;
|
|
8
|
+
if (intelligence && intelligence.stats) {
|
|
9
|
+
try { await Promise.resolve(intelligence.stats(args.includes('--json'))); } catch (e) { /* non-fatal */ }
|
|
10
|
+
} else {
|
|
11
|
+
console.log('[WARN] Intelligence module not available. Run session-restore first.');
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
};
|
|
@@ -248,34 +248,13 @@ 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': () => {
|
|
@@ -294,49 +273,13 @@ const handlers = {
|
|
|
294
273
|
},
|
|
295
274
|
|
|
296
275
|
'budget-status': () => {
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
console.log('Today: $' + b.todayCost.toFixed(2) + ' / $' + b.dailyLimit + ' (' + b.dailyPct + '%)' + (b.autoTuned ? ' [auto-tuned]' : ''));
|
|
300
|
-
console.log('Month: $' + b.monthCost.toFixed(2) + ' / $' + b.monthlyLimit + ' (' + b.monthlyPct + '%)');
|
|
301
|
-
console.log('Status: ' + (b.breached ? 'BREACHED' : b.spike ? 'SPIKE' : b.alert ? 'ALERT' : 'OK'));
|
|
302
|
-
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);
|
|
303
278
|
},
|
|
304
279
|
|
|
305
280
|
'loops-status': () => {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
var files = fs.readdirSync(loopsDir).filter(function(f) {
|
|
309
|
-
return f.endsWith('.json') && !f.includes('-hil') && !f.endsWith('.stop');
|
|
310
|
-
});
|
|
311
|
-
var STALE_MS = 6 * 60 * 60 * 1000;
|
|
312
|
-
var now = Date.now();
|
|
313
|
-
var active = [], stale = [];
|
|
314
|
-
files.forEach(function(f) {
|
|
315
|
-
try {
|
|
316
|
-
var d = JSON.parse(fs.readFileSync(path.join(loopsDir, f), 'utf-8'));
|
|
317
|
-
var last = d.lastRunAt || d.startedAt || 0;
|
|
318
|
-
var ageMs = last ? (now - last) : Infinity;
|
|
319
|
-
if (ageMs > STALE_MS) stale.push({ d: d, ageH: Math.round(ageMs / 3600000) });
|
|
320
|
-
else active.push(d);
|
|
321
|
-
} catch (_) {}
|
|
322
|
-
});
|
|
323
|
-
if (active.length === 0 && stale.length === 0) {
|
|
324
|
-
console.log('No loops.'); return;
|
|
325
|
-
}
|
|
326
|
-
if (active.length > 0) {
|
|
327
|
-
console.log('Active (' + active.length + '):');
|
|
328
|
-
active.forEach(function(d) {
|
|
329
|
-
console.log(' · ' + (d.command || '?') + ' [' + (d.type || '?') + '] run ' + (d.currentRep || 0) +
|
|
330
|
-
(d.maxReps ? '/' + d.maxReps : '') + ' · ' + (d.status || '?'));
|
|
331
|
-
});
|
|
332
|
-
}
|
|
333
|
-
if (stale.length > 0) {
|
|
334
|
-
console.log('Stale (' + stale.length + ' >6h):');
|
|
335
|
-
stale.forEach(function(s) {
|
|
336
|
-
console.log(' · ' + (s.d.command || '?') + ' run ' + (s.d.currentRep || 0) +
|
|
337
|
-
' · ' + s.ageH + 'h ago · ' + (s.d.status || '?'));
|
|
338
|
-
});
|
|
339
|
-
}
|
|
281
|
+
const h = require('./handlers/loops-status-handler.cjs');
|
|
282
|
+
h.handle(hCtx);
|
|
340
283
|
},
|
|
341
284
|
|
|
342
285
|
'status': () => {
|
|
@@ -344,11 +287,8 @@ const handlers = {
|
|
|
344
287
|
},
|
|
345
288
|
|
|
346
289
|
'stats': async () => {
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
} else {
|
|
350
|
-
console.log('[WARN] Intelligence module not available. Run session-restore first.');
|
|
351
|
-
}
|
|
290
|
+
const h = require('./handlers/stats-handler.cjs');
|
|
291
|
+
await h.handle(hCtx);
|
|
352
292
|
},
|
|
353
293
|
};
|
|
354
294
|
|
|
@@ -1164,14 +1164,25 @@ function readMode() {
|
|
|
1164
1164
|
return 'full'; // default
|
|
1165
1165
|
}
|
|
1166
1166
|
|
|
1167
|
+
// ─── Testability export (when required as a module, not run as CLI) ──────────
|
|
1168
|
+
if (require.main !== module) {
|
|
1169
|
+
module.exports = {
|
|
1170
|
+
readJSON, safeStat, modelLabel,
|
|
1171
|
+
getSecurityStatus, getSwarmStatus, getADRStatus,
|
|
1172
|
+
getHooksStatus, getActiveAgent, getAgentDBStats,
|
|
1173
|
+
getLearningStats, getTestStats, getIntegrationStatus,
|
|
1174
|
+
generateJSON,
|
|
1175
|
+
};
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1167
1178
|
// ─── Main ───────────────────────────────────────────────────────
|
|
1168
|
-
if (process.argv.includes('--json')) {
|
|
1179
|
+
if (require.main === module && process.argv.includes('--json')) {
|
|
1169
1180
|
console.log(JSON.stringify(generateJSON(), null, 2));
|
|
1170
|
-
} else if (process.argv.includes('--compact')) {
|
|
1181
|
+
} else if (require.main === module && process.argv.includes('--compact')) {
|
|
1171
1182
|
console.log(JSON.stringify(generateJSON()));
|
|
1172
|
-
} else if (process.argv.includes('--single-line')) {
|
|
1183
|
+
} else if (require.main === module && process.argv.includes('--single-line')) {
|
|
1173
1184
|
console.log(generateStatusline());
|
|
1174
|
-
} else if (process.argv.includes('--toggle')) {
|
|
1185
|
+
} else if (require.main === module && process.argv.includes('--toggle')) {
|
|
1175
1186
|
// Toggle mode and print the new view
|
|
1176
1187
|
const current = readMode();
|
|
1177
1188
|
const next = current === 'compact' ? 'full' : 'compact';
|
|
@@ -1184,7 +1195,7 @@ if (process.argv.includes('--json')) {
|
|
|
1184
1195
|
} else {
|
|
1185
1196
|
console.log(generateDashboard());
|
|
1186
1197
|
}
|
|
1187
|
-
} else {
|
|
1198
|
+
} else if (require.main === module) {
|
|
1188
1199
|
// Default: respect mode state file
|
|
1189
1200
|
const mode = readMode();
|
|
1190
1201
|
if (mode === 'compact') {
|