@monoes/monomindcli 1.16.11 → 1.17.0

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 (37) hide show
  1. package/.claude/agents/github/code-review-swarm.md +19 -19
  2. package/.claude/agents/github/github-modes.md +4 -4
  3. package/.claude/agents/github/multi-repo-swarm.md +24 -24
  4. package/.claude/agents/github/project-board-sync.md +28 -28
  5. package/.claude/agents/github/swarm-issue.md +26 -26
  6. package/.claude/agents/github/swarm-pr.md +18 -18
  7. package/.claude/agents/github/workflow-automation.md +27 -27
  8. package/.claude/agents/reengineer-squad/git-manager.md +2 -2
  9. package/.claude/commands/mastermind/master.md +9 -3
  10. package/.claude/commands/mastermind/references/antigravity-tools.md +60 -0
  11. package/.claude/commands/mastermind/references/claude-code-tools.md +50 -0
  12. package/.claude/commands/mastermind/references/codex-tools.md +64 -0
  13. package/.claude/commands/mastermind/references/copilot-tools.md +49 -0
  14. package/.claude/commands/mastermind/references/gemini-tools.md +63 -0
  15. package/.claude/commands/mastermind/references/pi-tools.md +28 -0
  16. package/.claude/helpers/mastermind-activate.cjs +53 -0
  17. package/.claude/skills/mastermind/runorg.md +14 -0
  18. package/.claude/skills/mastermind/techport.md +5 -5
  19. package/README.md +1 -1
  20. package/dist/src/browser/dashboard/ui.html +125 -37
  21. package/dist/src/commands/index.d.ts.map +1 -1
  22. package/dist/src/commands/index.js +0 -2
  23. package/dist/src/commands/index.js.map +1 -1
  24. package/dist/src/init/executor.d.ts.map +1 -1
  25. package/dist/src/init/executor.js +0 -24
  26. package/dist/src/init/executor.js.map +1 -1
  27. package/dist/src/init/statusline-generator.d.ts.map +1 -1
  28. package/dist/src/init/statusline-generator.js +0 -45
  29. package/dist/src/init/statusline-generator.js.map +1 -1
  30. package/dist/src/init/types.d.ts +0 -2
  31. package/dist/src/init/types.d.ts.map +1 -1
  32. package/dist/src/init/types.js +0 -2
  33. package/dist/src/init/types.js.map +1 -1
  34. package/dist/src/ui/dashboard.html +82 -75
  35. package/dist/src/ui/server.mjs +41 -4
  36. package/dist/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +2 -2
@@ -1574,14 +1574,14 @@ select.pb-cfg-inp { padding: 4px 7px; cursor: pointer; }
1574
1574
  <div class="nav-item" data-view="monograph">
1575
1575
  <span class="ico">⬡</span><span class="lbl">Monograph</span>
1576
1576
  </div>
1577
- <div class="nav-item" data-view="playbooks">
1578
- <span class="ico">⚡</span><span class="lbl">Playbooks</span>
1579
- <span class="bdg" id="bdg-playbooks">—</span>
1580
- </div>
1581
1577
  </div>
1582
1578
  </div>
1583
1579
  <div class="nav-no-proj" id="nav-no-proj-hint">Select a project above</div>
1584
1580
  <div class="nav-sect" style="margin-top:auto;padding-top:8px;">
1581
+ <div class="nav-item" data-view="monoagent">
1582
+ <span class="ico">🤖</span><span class="lbl">MonoAgent</span>
1583
+ <span class="bdg" id="bdg-monoagent">—</span>
1584
+ </div>
1585
1585
  <div class="nav-item" data-view="global">
1586
1586
  <span class="ico">⊕</span><span class="lbl">Global Feed</span>
1587
1587
  </div>
@@ -2250,79 +2250,26 @@ select.pb-cfg-inp { padding: 4px 7px; cursor: pointer; }
2250
2250
  </div>
2251
2251
  </div>
2252
2252
 
2253
- <!-- PLAYBOOKS -->
2254
- <div class="view" id="view-playbooks">
2253
+ <!-- MONOAGENT -->
2254
+ <div class="view" id="view-monoagent">
2255
2255
  <div class="vscroll">
2256
- <div class="pg-title">Playbooks</div>
2257
- <div class="pg-sub">Browser automation connected systems &amp; run history</div>
2258
- <!-- Tab bar -->
2256
+ <div class="pg-title">MonoAgent</div>
2257
+ <div class="pg-sub">Social media automation workflows &amp; run history</div>
2259
2258
  <div class="mg-tab-bar" style="margin-top:14px">
2260
- <button class="odt-btn active" data-wftab="systems" onclick="wfSwitchTab('systems')">Systems</button>
2261
- <button class="odt-btn" data-wftab="library" onclick="wfSwitchTab('library')">Library</button>
2262
- <button class="odt-btn" data-wftab="builder" onclick="wfSwitchTab('builder')">Builder</button>
2263
- <button class="odt-btn" data-wftab="runs" onclick="wfSwitchTab('runs')">Runs</button>
2259
+ <button class="odt-btn active" data-matab="workflows" onclick="maSwitchTab('workflows')">Workflows</button>
2260
+ <button class="odt-btn" data-matab="history" onclick="maSwitchTab('history')">Action History</button>
2264
2261
  </div>
2265
-
2266
- <!-- TAB: SYSTEMS -->
2267
- <div class="wf-pane active" id="wf-tab-systems">
2262
+ <div class="wf-pane active" id="ma-tab-workflows">
2268
2263
  <div style="display:flex;align-items:center;gap:8px;margin-bottom:16px;margin-top:4px">
2269
- <button class="btn" onclick="loadPlatformSessions()">↺ Refresh</button>
2264
+ <button class="btn" onclick="loadMonoagentData()">↺ Refresh</button>
2270
2265
  </div>
2271
- <div id="wf-systems-grid"></div>
2266
+ <div id="ma-workflows-list"><div class="loading-txt">Loading…</div></div>
2272
2267
  </div>
2273
-
2274
- <!-- TAB: LIBRARY -->
2275
- <div class="wf-pane" id="wf-tab-library">
2268
+ <div class="wf-pane" id="ma-tab-history">
2276
2269
  <div style="display:flex;align-items:center;gap:8px;margin-bottom:16px;margin-top:4px">
2277
- <button class="btn" onclick="loadWorkflowDefs()">↺ Refresh</button>
2278
- <span style="font-size:11px;color:var(--text-lo)">Saved in .monomind/playbooks/</span>
2279
- </div>
2280
- <div id="wf-defs-list"><div class="loading-txt">Loading…</div></div>
2281
- </div>
2282
-
2283
- <!-- TAB: RUNS -->
2284
- <div class="wf-pane" id="wf-tab-runs">
2285
- <div style="display:flex;gap:8px;margin-bottom:16px;margin-top:4px;align-items:center">
2286
- <button class="btn" onclick="loadWorkflowRuns()">↺ Refresh</button>
2287
- <select id="wf-status-filter" onchange="renderWorkflowRuns()" style="background:var(--surface);color:var(--text-hi);border:1px solid var(--border);border-radius:4px;padding:4px 8px;font-size:12px">
2288
- <option value="">All statuses</option>
2289
- <option value="running">Running</option>
2290
- <option value="completed">Completed</option>
2291
- <option value="failed">Failed</option>
2292
- <option value="stopped">Stopped</option>
2293
- </select>
2294
- <span id="wf-count" style="color:var(--text-lo);font-size:12px"></span>
2295
- </div>
2296
- <div id="wf-runs-list"><div class="loading-txt">Loading…</div></div>
2297
- </div>
2298
-
2299
- <!-- TAB: BUILDER -->
2300
- <div id="wf-tab-builder">
2301
- <div id="pb-toolbar">
2302
- <button class="btn" onclick="pbNew()" title="New playbook">+ New</button>
2303
- <input id="pb-name-input" type="text" placeholder="Playbook name…" oninput="pbState.playbook.name=this.value">
2304
- <button class="btn" onclick="pbLoad()" title="Load a playbook from Library">⬆ Load</button>
2305
- <button class="btn" onclick="pbSave()" title="Save to .monomind/playbooks/">💾 Save</button>
2306
- <button class="btn" onclick="pbRun()" title="Run via monobrowse dashboard" style="color:var(--accent);border-color:var(--accent)">▶ Run</button>
2307
- <button class="btn" onclick="pbImportJSON()" title="Import from JSON">⬇ Import</button>
2308
- <button class="btn" onclick="pbExportJSON()" title="Export to JSON">⬆ Export</button>
2309
- <span id="pb-run-status"></span>
2310
- </div>
2311
- <div id="pb-editor">
2312
- <div id="pb-palette">
2313
- <!-- populated by pbRenderPalette() -->
2314
- </div>
2315
- <div id="pb-canvas-wrap">
2316
- <div id="pb-canvas">
2317
- <svg id="pb-svg" width="100%" height="100%"><defs><marker id="pb-arrow" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto"><polygon points="0 0,8 3,0 6" fill="var(--text-xs)"/></marker></defs></svg>
2318
- <div id="pb-empty"><div style="font-size:32px">⚡</div><div>Drag a node from the left panel onto the canvas</div><div style="font-size:11px">or click a node type to add it</div></div>
2319
- </div>
2320
- </div>
2321
- <div id="pb-config">
2322
- <div id="pb-config-title">Select a node</div>
2323
- <div id="pb-config-body"></div>
2324
- </div>
2270
+ <button class="btn" onclick="loadMonoagentData()">↺ Refresh</button>
2325
2271
  </div>
2272
+ <div id="ma-history-list"><div class="loading-txt">Loading…</div></div>
2326
2273
  </div>
2327
2274
  </div>
2328
2275
  </div>
@@ -2518,7 +2465,7 @@ function switchView(v, { updateHash = true } = {}) {
2518
2465
  el.classList.toggle('active', el.dataset.view === v));
2519
2466
  document.querySelectorAll('.view').forEach(el =>
2520
2467
  el.classList.toggle('active', el.id === 'view-' + v));
2521
- const titles = { now:'Now', projects:'Projects', sessions:'Sessions', loops:'Loops', tokens:'Tokens', memory:'Memory', orgs:'Orgs', monograph:'Monograph', playbooks:'Playbooks', global:'Global Feed', 'global-loops':'Global Loops', 'global-tokens':'Global Tokens', chat:'Global Agent Chat' };
2468
+ const titles = { now:'Now', projects:'Projects', sessions:'Sessions', loops:'Loops', tokens:'Tokens', memory:'Memory', orgs:'Orgs', monograph:'Monograph', monoagent:'MonoAgent', global:'Global Feed', 'global-loops':'Global Loops', 'global-tokens':'Global Tokens', chat:'Global Agent Chat' };
2522
2469
  document.getElementById('view-title').textContent = titles[v] || v;
2523
2470
  const PROJECT = DIR ? shortPath(DIR) : 'monomind';
2524
2471
  const VIEW_LABELS = { now: 'Now', sessions: 'Sessions', projects: 'Projects', loops: 'Loops', tokens: 'Tokens', memory: 'Memory', orgs: 'Orgs', monograph: 'Monograph', global: 'Global Feed', 'global-loops': 'Global Loops', 'global-tokens': 'Global Tokens' };
@@ -2581,7 +2528,7 @@ function renderView(v) {
2581
2528
  if (v === 'memory') renderMemory();
2582
2529
  if (v === 'orgs') renderOrgs();
2583
2530
  if (v === 'monograph') loadMonograph();
2584
- if (v === 'playbooks') { loadPlatformSessions(); loadWorkflowDefs(); loadWorkflowRuns(); }
2531
+ if (v === 'monoagent') { loadMonoagentData(); }
2585
2532
  if (v === 'global') renderGlobalFeed();
2586
2533
  if (v === 'global-loops') renderGlobalLoops();
2587
2534
  if (v === 'global-tokens') renderGlobalTokens();
@@ -10877,16 +10824,17 @@ async function maDisconnect(pid, connId, type) {
10877
10824
 
10878
10825
  let _wfRuns = [];
10879
10826
  async function loadWorkflowRuns() {
10880
- document.getElementById('wf-runs-list').innerHTML = '<div class="loading-txt">Loading…</div>';
10827
+ const runsListEl = document.getElementById('wf-runs-list');
10828
+ if (!runsListEl) return;
10829
+ runsListEl.innerHTML = '<div class="loading-txt">Loading…</div>';
10881
10830
  try {
10882
10831
  const runs = await apiFetch('/api/workflow-runs');
10883
10832
  _wfRuns = Array.isArray(runs) ? runs : [];
10884
10833
  } catch (e) {
10885
10834
  _wfRuns = [];
10886
10835
  }
10887
- const bdg = document.getElementById('bdg-playbooks');
10888
- if (bdg) bdg.textContent = _wfRuns.length || '';
10889
- document.getElementById('wf-count').textContent = _wfRuns.length + ' run' + (_wfRuns.length !== 1 ? 's' : '');
10836
+ const wfCount = document.getElementById('wf-count');
10837
+ if (wfCount) wfCount.textContent = _wfRuns.length + ' run' + (_wfRuns.length !== 1 ? 's' : '');
10890
10838
  renderWorkflowRuns();
10891
10839
  }
10892
10840
 
@@ -14017,6 +13965,65 @@ async function mmRenderGraph(body) {
14017
13965
  `;
14018
13966
  } catch (e) { body.innerHTML = '<div class="empty">Failed: ' + esc(e.message) + '</div>'; }
14019
13967
  }
13968
+
13969
+ /* ═══════════════════════════════════════════════════════════════
13970
+ MONOAGENT TAB
13971
+ ═══════════════════════════════════════════════════════════════ */
13972
+ const MA_STATE_COLOR = { completed:'#22c55e', failed:'#ef4444', running:'#3b82f6', pending:'#a3a3a3' };
13973
+ let _maWorkflows = [], _maActions = [];
13974
+
13975
+ function maSwitchTab(tab) {
13976
+ document.querySelectorAll('[data-matab]').forEach(b => b.classList.toggle('active', b.dataset.matab === tab));
13977
+ document.querySelectorAll('#view-monoagent .wf-pane').forEach(p => p.classList.toggle('active', p.id === 'ma-tab-' + tab));
13978
+ }
13979
+
13980
+ async function loadMonoagentData() {
13981
+ document.getElementById('ma-workflows-list').innerHTML = '<div class="loading-txt">Loading…</div>';
13982
+ document.getElementById('ma-history-list').innerHTML = '<div class="loading-txt">Loading…</div>';
13983
+ try {
13984
+ const data = await apiFetch('/api/monoagent/data');
13985
+ _maWorkflows = Array.isArray(data.workflows) ? data.workflows : [];
13986
+ _maActions = Array.isArray(data.actions) ? data.actions : [];
13987
+ } catch (e) {
13988
+ _maWorkflows = []; _maActions = [];
13989
+ }
13990
+ const bdg = document.getElementById('bdg-monoagent');
13991
+ if (bdg) bdg.textContent = _maWorkflows.length || '—';
13992
+ renderMonoagentWorkflows();
13993
+ renderMonoagentHistory();
13994
+ }
13995
+
13996
+ function renderMonoagentWorkflows() {
13997
+ const el = document.getElementById('ma-workflows-list');
13998
+ if (!el) return;
13999
+ if (!_maWorkflows.length) { el.innerHTML = '<div class="empty">No monoagent workflows found. Create one with: <code>monoagent workflow create</code></div>'; return; }
14000
+ el.innerHTML = _maWorkflows.map(w => `<div class="m-card" style="margin-bottom:10px;padding:12px 14px">
14001
+ <div style="display:flex;justify-content:space-between;align-items:center">
14002
+ <span style="font-weight:600;color:var(--text-hi);font-family:var(--mono);font-size:13px">${esc(w.name||w.id||'—')}</span>
14003
+ <span style="font-size:11px;color:var(--text-lo)">${esc(w.id||'')}</span>
14004
+ </div>
14005
+ ${w.description ? `<div style="font-size:12px;color:var(--text-lo);margin-top:4px">${esc(w.description)}</div>` : ''}
14006
+ <div style="font-size:11px;color:var(--text-xs);margin-top:6px">${(w.nodes||[]).length} nodes · trigger: ${esc(w.trigger||'manual')}</div>
14007
+ </div>`).join('');
14008
+ }
14009
+
14010
+ function renderMonoagentHistory() {
14011
+ const el = document.getElementById('ma-history-list');
14012
+ if (!el) return;
14013
+ if (!_maActions.length) { el.innerHTML = '<div class="empty">No action history yet.</div>'; return; }
14014
+ el.innerHTML = _maActions.map(a => {
14015
+ const color = MA_STATE_COLOR[a.status] || MA_STATE_COLOR.pending;
14016
+ const ts = a.createdAt ? new Date(a.createdAt).toLocaleString() : '—';
14017
+ return `<div class="m-card" style="margin-bottom:8px;padding:10px 14px;display:flex;justify-content:space-between;align-items:center">
14018
+ <div>
14019
+ <span style="font-weight:600;color:var(--text-hi);font-size:12px;font-family:var(--mono)">${esc(a.type||a.action||'—')}</span>
14020
+ <span style="font-size:11px;color:var(--text-lo);margin-left:8px">${esc(a.platform||'')}</span>
14021
+ <div style="font-size:11px;color:var(--text-xs);margin-top:2px">${ts}</div>
14022
+ </div>
14023
+ <span style="font-size:11px;font-weight:600;color:${color}">${esc(a.status||'—')}</span>
14024
+ </div>`;
14025
+ }).join('');
14026
+ }
14020
14027
  </script>
14021
14028
  </body>
14022
14029
  </html>
@@ -257,7 +257,11 @@ function _insertRunEvent(ev, source) {
257
257
  if (!org || !runId) return;
258
258
  _runDbInsertStmt.run([org, runId, String(ev.type || ''), JSON.stringify(ev), Number(ev.ts || Date.now()), source || 'http']);
259
259
  _persistRunDb();
260
- } catch (_) {}
260
+ } catch (_) {
261
+ // sql.js leaves the prepared statement in a dirty state after any error (step() throws but
262
+ // reset() is never called). Reset it so subsequent inserts aren't permanently broken.
263
+ try { _runDbInsertStmt.reset(); } catch (_2) {}
264
+ }
261
265
  }
262
266
  // ─────────────────────────────────────────────────────────────────────────────
263
267
 
@@ -5560,6 +5564,28 @@ export async function startServer({ port = 4242, projectDir, openBrowser = true
5560
5564
  return;
5561
5565
  }
5562
5566
 
5567
+ // ----------------------------------------------- GET /api/monoagent/data
5568
+ if (req.method === 'GET' && url === '/api/monoagent/data') {
5569
+ try {
5570
+ const { execFile } = await import('child_process');
5571
+ const run = (args) => new Promise(resolve => {
5572
+ execFile('monoagent', args, { timeout: 8000 }, (err, stdout) => resolve(err ? '[]' : stdout));
5573
+ });
5574
+ const [wfOut, actOut] = await Promise.all([
5575
+ run(['workflow', 'list', '--json']),
5576
+ run(['action', 'list', '--json']),
5577
+ ]);
5578
+ const workflows = JSON.parse(wfOut.trim() || '[]');
5579
+ const actions = JSON.parse(actOut.trim() || '[]');
5580
+ res.writeHead(200, { 'Content-Type': 'application/json' });
5581
+ res.end(JSON.stringify({ workflows, actions }));
5582
+ } catch (e) {
5583
+ res.writeHead(200, { 'Content-Type': 'application/json' });
5584
+ res.end(JSON.stringify({ workflows: [], actions: [], error: e.message }));
5585
+ }
5586
+ return;
5587
+ }
5588
+
5563
5589
  // ------------------------------------------------- POST /api/playbooks
5564
5590
  // Save a playbook definition to .monomind/playbooks/<id>.json
5565
5591
  if (req.method === 'POST' && url === '/api/playbooks') {
@@ -5706,6 +5732,7 @@ export async function startServer({ port = 4242, projectDir, openBrowser = true
5706
5732
  runStreamClients.get(_stOrgName).add(res);
5707
5733
  // Replay events since `since` (SQLite row id cursor; falls back to JSONL line offset)
5708
5734
  try {
5735
+ let _stReplayedViaSqlite = false;
5709
5736
  if (_runDb) {
5710
5737
  // SQLite path: cursor is last row id seen (client sends 0 on first connect)
5711
5738
  const _stStmt = _runDb.prepare(
@@ -5718,9 +5745,15 @@ export async function startServer({ port = 4242, projectDir, openBrowser = true
5718
5745
  try { res.write(`data: ${_stRow.raw}\n\n`); _stLastId = _stRow.id; } catch (_) { break; }
5719
5746
  }
5720
5747
  _stStmt.free();
5721
- res.write(`data: ${JSON.stringify({ type: 'stream:replay-done', count: _stLastId })}\n\n`);
5722
- } else {
5723
- // JSONL fallback: since = 0-based line offset
5748
+ if (_stLastId > _stSince) {
5749
+ // SQLite had rows — send cursor and skip JSONL fallback
5750
+ res.write(`data: ${JSON.stringify({ type: 'stream:replay-done', count: _stLastId })}\n\n`);
5751
+ _stReplayedViaSqlite = true;
5752
+ }
5753
+ }
5754
+ if (!_stReplayedViaSqlite) {
5755
+ // JSONL fallback: SQLite absent or returned 0 rows — read directly from run file.
5756
+ // `since` is a 0-based line offset in this path.
5724
5757
  const _stRoot = projectDir || process.cwd();
5725
5758
  const _stRunId = activeOrgRuns.get(_stOrgName) || _getActiveRunId(_stOrgName, _stRoot);
5726
5759
  if (_stRunId) {
@@ -5732,7 +5765,11 @@ export async function startServer({ port = 4242, projectDir, openBrowser = true
5732
5765
  try { res.write(`data: ${_stLines[_i]}\n\n`); } catch (_) { break; }
5733
5766
  }
5734
5767
  res.write(`data: ${JSON.stringify({ type: 'stream:replay-done', count: _stLines.length })}\n\n`);
5768
+ } else {
5769
+ res.write(`data: ${JSON.stringify({ type: 'stream:replay-done', count: 0 })}\n\n`);
5735
5770
  }
5771
+ } else {
5772
+ res.write(`data: ${JSON.stringify({ type: 'stream:replay-done', count: 0 })}\n\n`);
5736
5773
  }
5737
5774
  }
5738
5775
  } catch (_) {}