monomind 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.
- package/.claude/agents/github/code-review-swarm.md +19 -19
- package/.claude/agents/github/github-modes.md +4 -4
- package/.claude/agents/github/multi-repo-swarm.md +24 -24
- package/.claude/agents/github/project-board-sync.md +28 -28
- package/.claude/agents/github/swarm-issue.md +26 -26
- package/.claude/agents/github/swarm-pr.md +18 -18
- package/.claude/agents/github/workflow-automation.md +27 -27
- package/.claude/agents/reengineer-squad/git-manager.md +2 -2
- package/.claude/commands/mastermind/master.md +9 -3
- package/.claude/commands/mastermind/references/antigravity-tools.md +60 -0
- package/.claude/commands/mastermind/references/claude-code-tools.md +50 -0
- package/.claude/commands/mastermind/references/codex-tools.md +64 -0
- package/.claude/commands/mastermind/references/copilot-tools.md +49 -0
- package/.claude/commands/mastermind/references/gemini-tools.md +63 -0
- package/.claude/commands/mastermind/references/pi-tools.md +28 -0
- package/.claude/helpers/mastermind-activate.cjs +53 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/mastermind/runorg.md +14 -0
- package/.claude/skills/mastermind/techport.md +5 -5
- package/README.md +1 -1
- package/package.json +6 -5
- package/packages/@monomind/cli/.claude/agents/github/code-review-swarm.md +19 -19
- package/packages/@monomind/cli/.claude/agents/github/github-modes.md +4 -4
- package/packages/@monomind/cli/.claude/agents/github/multi-repo-swarm.md +24 -24
- package/packages/@monomind/cli/.claude/agents/github/project-board-sync.md +28 -28
- package/packages/@monomind/cli/.claude/agents/github/swarm-issue.md +26 -26
- package/packages/@monomind/cli/.claude/agents/github/swarm-pr.md +18 -18
- package/packages/@monomind/cli/.claude/agents/github/workflow-automation.md +27 -27
- package/packages/@monomind/cli/.claude/agents/reengineer-squad/git-manager.md +2 -2
- package/packages/@monomind/cli/.claude/commands/mastermind/master.md +9 -3
- package/packages/@monomind/cli/.claude/commands/mastermind/references/antigravity-tools.md +60 -0
- package/packages/@monomind/cli/.claude/commands/mastermind/references/claude-code-tools.md +50 -0
- package/packages/@monomind/cli/.claude/commands/mastermind/references/codex-tools.md +64 -0
- package/packages/@monomind/cli/.claude/commands/mastermind/references/copilot-tools.md +49 -0
- package/packages/@monomind/cli/.claude/commands/mastermind/references/gemini-tools.md +63 -0
- package/packages/@monomind/cli/.claude/commands/mastermind/references/pi-tools.md +28 -0
- package/packages/@monomind/cli/.claude/helpers/mastermind-activate.cjs +53 -0
- package/packages/@monomind/cli/.claude/skills/mastermind/runorg.md +14 -0
- package/packages/@monomind/cli/.claude/skills/mastermind/techport.md +5 -5
- package/packages/@monomind/cli/README.md +1 -1
- package/packages/@monomind/cli/dist/src/browser/dashboard/ui.html +125 -37
- package/packages/@monomind/cli/dist/src/commands/index.js +0 -2
- package/packages/@monomind/cli/dist/src/init/executor.js +0 -24
- package/packages/@monomind/cli/dist/src/init/statusline-generator.js +0 -45
- package/packages/@monomind/cli/dist/src/init/types.d.ts +0 -2
- package/packages/@monomind/cli/dist/src/init/types.js +0 -2
- package/packages/@monomind/cli/dist/src/ui/dashboard.html +82 -75
- package/packages/@monomind/cli/dist/src/ui/server.mjs +41 -4
- package/packages/@monomind/cli/package.json +2 -2
- package/packages/@monomind/guidance/README.md +0 -1
- package/packages/@monomind/guidance/package.json +2 -14
- package/scripts/verify-appliance.sh +16 -20
- package/.claude-plugin/README.md +0 -704
- package/.claude-plugin/docs/INSTALLATION.md +0 -258
- package/.claude-plugin/docs/PLUGIN_SUMMARY.md +0 -358
- package/.claude-plugin/docs/QUICKSTART.md +0 -357
- package/.claude-plugin/docs/STRUCTURE.md +0 -122
- package/.claude-plugin/hooks/hooks.json +0 -74
- package/.claude-plugin/marketplace.json +0 -98
- package/.claude-plugin/plugin.json +0 -70
- package/.claude-plugin/scripts/install.sh +0 -234
- package/.claude-plugin/scripts/uninstall.sh +0 -36
- package/.claude-plugin/scripts/verify.sh +0 -102
|
@@ -420,9 +420,8 @@ body { background: #0b0b14; color: #ccc; font-family: system-ui,-apple-system,sa
|
|
|
420
420
|
<!-- ── top bar ─────────────────────────────────────── -->
|
|
421
421
|
<div id="topbar">
|
|
422
422
|
<span class="logo">monomind <span>dashboard</span></span>
|
|
423
|
-
<span class="pill pill-run" id="p-
|
|
424
|
-
<span class="pill pill-done" id="p-
|
|
425
|
-
<span class="pill pill-fail" id="p-fail">✗ 0</span>
|
|
423
|
+
<span class="pill pill-run" id="p-workflows" title="Total workflows">⚡ workflows</span>
|
|
424
|
+
<span class="pill pill-done" id="p-actions" title="Total actions">✓ actions</span>
|
|
426
425
|
<span id="conn">
|
|
427
426
|
<span id="conn-dot"></span>
|
|
428
427
|
<span id="conn-label">connecting…</span>
|
|
@@ -435,12 +434,9 @@ body { background: #0b0b14; color: #ccc; font-family: system-ui,-apple-system,sa
|
|
|
435
434
|
<!-- sidebar -->
|
|
436
435
|
<nav id="sidebar">
|
|
437
436
|
<div class="nav-section-label">Project</div>
|
|
438
|
-
<div class="nav-item active" data-panel="
|
|
439
|
-
<span class="nav-icon"
|
|
440
|
-
<span class="nav-badge" id="nb-
|
|
441
|
-
</div>
|
|
442
|
-
<div class="nav-item" data-panel="builder">
|
|
443
|
-
<span class="nav-icon">🔧</span> Builder
|
|
437
|
+
<div class="nav-item active" data-panel="monoagent">
|
|
438
|
+
<span class="nav-icon">🤖</span> MonoAgent
|
|
439
|
+
<span class="nav-badge green" id="nb-ma">0</span>
|
|
444
440
|
</div>
|
|
445
441
|
|
|
446
442
|
<div class="nav-section-label" style="margin-top:8px">System</div>
|
|
@@ -458,21 +454,38 @@ body { background: #0b0b14; color: #ccc; font-family: system-ui,-apple-system,sa
|
|
|
458
454
|
<!-- main -->
|
|
459
455
|
<div id="main">
|
|
460
456
|
|
|
461
|
-
<!--
|
|
462
|
-
<div class="panel active" id="
|
|
457
|
+
<!-- MonoAgent panel -->
|
|
458
|
+
<div class="panel active" id="monoagent-panel">
|
|
463
459
|
<div class="panel-header">
|
|
464
|
-
<span class="panel-title">
|
|
465
|
-
<span class="panel-subtitle" id="
|
|
460
|
+
<span class="panel-title">MonoAgent Workflows</span>
|
|
461
|
+
<span class="panel-subtitle" id="ma-subtitle">loading…</span>
|
|
462
|
+
<button onclick="loadMonoagentData()" style="margin-left:auto;background:#1a1a2e;border:1px solid #2a2a4a;color:#a78bfa;padding:3px 10px;border-radius:6px;cursor:pointer;font-size:11px">↻ Refresh</button>
|
|
466
463
|
</div>
|
|
467
|
-
<div
|
|
468
|
-
|
|
469
|
-
<
|
|
470
|
-
|
|
471
|
-
|
|
464
|
+
<div style="flex:1;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:16px">
|
|
465
|
+
<!-- Workflow list -->
|
|
466
|
+
<div>
|
|
467
|
+
<div style="font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:1px;color:#3a3a5a;margin-bottom:8px">Workflows</div>
|
|
468
|
+
<div id="ma-workflows" style="display:grid;gap:8px;align-content:start"></div>
|
|
469
|
+
<div class="empty" id="ma-wf-empty" style="display:none">
|
|
470
|
+
<span class="empty-icon">🤖</span>
|
|
471
|
+
<span class="empty-title">No workflows found</span>
|
|
472
|
+
<span class="empty-sub">Create one with: <code style="color:#7c3aed">monoagent workflow create</code></span>
|
|
473
|
+
</div>
|
|
474
|
+
</div>
|
|
475
|
+
<!-- Action run history -->
|
|
476
|
+
<div>
|
|
477
|
+
<div style="font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:1px;color:#3a3a5a;margin-bottom:8px">Action History</div>
|
|
478
|
+
<div id="ma-history" style="display:grid;gap:6px;align-content:start"></div>
|
|
479
|
+
<div class="empty" id="ma-hist-empty" style="display:none">
|
|
480
|
+
<span class="empty-icon">📋</span>
|
|
481
|
+
<span class="empty-title">No action history</span>
|
|
482
|
+
<span class="empty-sub">Run an action with: <code style="color:#7c3aed">monoagent run <ACTION_ID></code></span>
|
|
483
|
+
</div>
|
|
484
|
+
</div>
|
|
472
485
|
</div>
|
|
473
486
|
</div>
|
|
474
487
|
|
|
475
|
-
<!-- Builder panel -->
|
|
488
|
+
<!-- Builder panel (kept for internal use, hidden from nav) -->
|
|
476
489
|
<div class="panel" id="builder-panel">
|
|
477
490
|
<!-- Toolbar -->
|
|
478
491
|
<div id="builder-toolbar">
|
|
@@ -573,12 +586,11 @@ function navigateToPanel(target) {
|
|
|
573
586
|
var navItem = document.querySelector('[data-panel="' + target + '"]');
|
|
574
587
|
if (navItem) navItem.classList.add('active');
|
|
575
588
|
document.querySelectorAll('.panel').forEach(function(p) { p.classList.remove('active'); });
|
|
576
|
-
var panelId = target
|
|
577
|
-
: target === 'builder' ? 'builder-panel'
|
|
578
|
-
: target + '-panel';
|
|
589
|
+
var panelId = target + '-panel';
|
|
579
590
|
var panel = document.getElementById(panelId);
|
|
580
591
|
if (panel) panel.classList.add('active');
|
|
581
592
|
if (target === 'builder') renderEdges();
|
|
593
|
+
if (target === 'monoagent') loadMonoagentData();
|
|
582
594
|
location.hash = target;
|
|
583
595
|
}
|
|
584
596
|
|
|
@@ -592,7 +604,7 @@ document.querySelectorAll('.nav-item').forEach(function(item) {
|
|
|
592
604
|
// Hash-based routing on load
|
|
593
605
|
(function() {
|
|
594
606
|
var hash = location.hash.replace('#', '');
|
|
595
|
-
var validPanels = ['
|
|
607
|
+
var validPanels = ['monoagent', 'agents', 'memory', 'sessions'];
|
|
596
608
|
if (hash && validPanels.indexOf(hash) !== -1) {
|
|
597
609
|
// defer until after renderEdges is defined
|
|
598
610
|
window.addEventListener('load', function() { navigateToPanel(hash); });
|
|
@@ -613,20 +625,7 @@ function esc(s) {
|
|
|
613
625
|
}
|
|
614
626
|
|
|
615
627
|
function updateHeader() {
|
|
616
|
-
|
|
617
|
-
for (var id in runs) {
|
|
618
|
-
var s = runs[id].status;
|
|
619
|
-
if (s === 'running') running++;
|
|
620
|
-
else if (s === 'completed') done++;
|
|
621
|
-
else if (s === 'failed') fail++;
|
|
622
|
-
}
|
|
623
|
-
document.getElementById('p-run').textContent = '● ' + running;
|
|
624
|
-
document.getElementById('p-done').textContent = '✓ ' + done;
|
|
625
|
-
document.getElementById('p-fail').textContent = '✗ ' + fail;
|
|
626
|
-
document.getElementById('nb-run').textContent = String(running || Object.keys(runs).length);
|
|
627
|
-
document.getElementById('nb-run').className = 'nav-badge' + (running ? '' : ' green');
|
|
628
|
-
var total = Object.keys(runs).length;
|
|
629
|
-
document.getElementById('pb-subtitle').textContent = total + (total === 1 ? ' run' : ' runs');
|
|
628
|
+
// no-op: topbar pills are updated by loadMonoagentData
|
|
630
629
|
}
|
|
631
630
|
|
|
632
631
|
function progressPct(r) {
|
|
@@ -648,6 +647,7 @@ function elapsed(r) {
|
|
|
648
647
|
function renderCards() {
|
|
649
648
|
var cards = document.getElementById('pb-cards');
|
|
650
649
|
var empty = document.getElementById('pb-empty');
|
|
650
|
+
if (!cards) return; // panel removed from DOM
|
|
651
651
|
var sorted = Object.values(runs).sort(function(a, b) { return b.startedAt - a.startedAt; });
|
|
652
652
|
if (!sorted.length) { cards.innerHTML = ''; empty.style.display = 'flex'; return; }
|
|
653
653
|
empty.style.display = 'none';
|
|
@@ -1737,6 +1737,94 @@ function handleEvent(evt) {
|
|
|
1737
1737
|
renderCards();
|
|
1738
1738
|
}
|
|
1739
1739
|
|
|
1740
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
1741
|
+
// MONOAGENT DATA
|
|
1742
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
1743
|
+
var MA_STATE_COLORS = { COMPLETED: '#22c55e', FAILED: '#ef4444', PENDING: '#f59e0b', RUNNING: '#a78bfa' };
|
|
1744
|
+
|
|
1745
|
+
function maStateLabel(state) {
|
|
1746
|
+
var s = (state || '').toUpperCase();
|
|
1747
|
+
return { color: MA_STATE_COLORS[s] || '#555', text: s || 'UNKNOWN' };
|
|
1748
|
+
}
|
|
1749
|
+
|
|
1750
|
+
function renderWorkflows(workflows) {
|
|
1751
|
+
var el = document.getElementById('ma-workflows');
|
|
1752
|
+
var empty = document.getElementById('ma-wf-empty');
|
|
1753
|
+
if (!workflows || !workflows.length) {
|
|
1754
|
+
el.innerHTML = '';
|
|
1755
|
+
empty.style.display = 'flex';
|
|
1756
|
+
return;
|
|
1757
|
+
}
|
|
1758
|
+
empty.style.display = 'none';
|
|
1759
|
+
el.innerHTML = workflows.map(function(wf) {
|
|
1760
|
+
var active = wf.is_active;
|
|
1761
|
+
var updated = wf.updated_at && wf.updated_at !== '0001-01-01T00:00:00Z'
|
|
1762
|
+
? new Date(wf.updated_at).toLocaleDateString()
|
|
1763
|
+
: '—';
|
|
1764
|
+
return '<div style="background:#0f0f1e;border:1px solid #1a1a2e;border-radius:8px;padding:10px 14px;display:flex;align-items:center;gap:10px">' +
|
|
1765
|
+
'<span style="font-size:16px">' + (active ? '▶' : '⏸') + '</span>' +
|
|
1766
|
+
'<div style="flex:1;min-width:0">' +
|
|
1767
|
+
'<div style="font-weight:600;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis">' + esc(wf.name || wf.id) + '</div>' +
|
|
1768
|
+
'<div style="font-size:10px;color:#3a3a5a;margin-top:2px">' + esc(wf.id) + ' · v' + (wf.version || 1) + ' · updated ' + esc(updated) + '</div>' +
|
|
1769
|
+
(wf.description ? '<div style="font-size:10px;color:#555;margin-top:2px">' + esc(wf.description) + '</div>' : '') +
|
|
1770
|
+
'</div>' +
|
|
1771
|
+
'<span style="font-size:10px;padding:2px 7px;border-radius:10px;border:1px solid;' +
|
|
1772
|
+
(active ? 'background:#22c55e15;border-color:#22c55e44;color:#22c55e' : 'background:#33333315;border-color:#33333344;color:#555') + '">' +
|
|
1773
|
+
(active ? 'active' : 'inactive') +
|
|
1774
|
+
'</span>' +
|
|
1775
|
+
'</div>';
|
|
1776
|
+
}).join('');
|
|
1777
|
+
document.getElementById('nb-ma').textContent = String(workflows.length);
|
|
1778
|
+
}
|
|
1779
|
+
|
|
1780
|
+
function renderHistory(actions) {
|
|
1781
|
+
var el = document.getElementById('ma-history');
|
|
1782
|
+
var empty = document.getElementById('ma-hist-empty');
|
|
1783
|
+
if (!actions || !actions.length) {
|
|
1784
|
+
el.innerHTML = '';
|
|
1785
|
+
empty.style.display = 'flex';
|
|
1786
|
+
return;
|
|
1787
|
+
}
|
|
1788
|
+
empty.style.display = 'none';
|
|
1789
|
+
el.innerHTML = actions.map(function(a) {
|
|
1790
|
+
var sl = maStateLabel(a.state);
|
|
1791
|
+
var dt = a.created_at
|
|
1792
|
+
? new Date(typeof a.created_at === 'number' ? a.created_at * 1000 : a.created_at).toLocaleString()
|
|
1793
|
+
: '—';
|
|
1794
|
+
return '<div style="background:#0f0f1e;border:1px solid #1a1a2e;border-radius:6px;padding:8px 12px;display:flex;align-items:center;gap:10px">' +
|
|
1795
|
+
'<div style="flex:1;min-width:0">' +
|
|
1796
|
+
'<div style="font-weight:600;font-size:11px">' + esc(a.type || '(unnamed)') + '</div>' +
|
|
1797
|
+
'<div style="font-size:10px;color:#3a3a5a;margin-top:2px">' +
|
|
1798
|
+
esc(a.id.slice(0, 8)) + '… · ' + esc(a.platform || '') + ' · ' + esc(dt) +
|
|
1799
|
+
'</div>' +
|
|
1800
|
+
'</div>' +
|
|
1801
|
+
'<span style="font-size:10px;font-weight:600;color:' + sl.color + '">' + sl.text + '</span>' +
|
|
1802
|
+
'</div>';
|
|
1803
|
+
}).join('');
|
|
1804
|
+
}
|
|
1805
|
+
|
|
1806
|
+
function loadMonoagentData() {
|
|
1807
|
+
document.getElementById('ma-subtitle').textContent = 'loading…';
|
|
1808
|
+
fetch('/monoagent/data')
|
|
1809
|
+
.then(function(r) { return r.json(); })
|
|
1810
|
+
.then(function(d) {
|
|
1811
|
+
renderWorkflows(d.workflows || []);
|
|
1812
|
+
renderHistory(d.actions || []);
|
|
1813
|
+
var wc = (d.workflows || []).length;
|
|
1814
|
+
var ac = (d.actions || []).length;
|
|
1815
|
+
document.getElementById('ma-subtitle').textContent = wc + ' workflow' + (wc !== 1 ? 's' : '') + ' · ' + ac + ' action' + (ac !== 1 ? 's' : '');
|
|
1816
|
+
document.getElementById('p-workflows').textContent = '⚡ ' + wc;
|
|
1817
|
+
document.getElementById('p-actions').textContent = '✓ ' + ac;
|
|
1818
|
+
})
|
|
1819
|
+
.catch(function(e) {
|
|
1820
|
+
document.getElementById('ma-subtitle').textContent = 'error loading data';
|
|
1821
|
+
console.error('monoagent data fetch failed', e);
|
|
1822
|
+
});
|
|
1823
|
+
}
|
|
1824
|
+
|
|
1825
|
+
// Load monoagent data on startup (it's the default panel)
|
|
1826
|
+
loadMonoagentData();
|
|
1827
|
+
|
|
1740
1828
|
// ═══════════════════════════════════════════════════════════════════
|
|
1741
1829
|
// CONNECTION
|
|
1742
1830
|
// ═══════════════════════════════════════════════════════════════════
|
|
@@ -51,8 +51,6 @@ const commandLoaders = {
|
|
|
51
51
|
issues: () => import('./issues.js'),
|
|
52
52
|
// Auto-update System (ADR-025)
|
|
53
53
|
update: () => import('./update.js'),
|
|
54
|
-
// Local ↔ global skill sync
|
|
55
|
-
sync: () => import('./sync.js'),
|
|
56
54
|
// MonoVector PostgreSQL Bridge
|
|
57
55
|
monovector: () => import('./monovector/index.js'),
|
|
58
56
|
// Benchmark Suite (Pre-training, Neural, Memory)
|
|
@@ -1479,30 +1479,6 @@ mcp:
|
|
|
1479
1479
|
`;
|
|
1480
1480
|
atomicWriteFile(configPath, config);
|
|
1481
1481
|
result.created.files.push('.monomind/config.yaml');
|
|
1482
|
-
// Stamp the CLI version that initialized this project — used by `monomind sync check`
|
|
1483
|
-
// to detect when the global install has been upgraded but local skills/config have not.
|
|
1484
|
-
const versionPath = path.join(targetDir, '.monomind', 'version');
|
|
1485
|
-
try {
|
|
1486
|
-
const pkgCandidates = [
|
|
1487
|
-
path.join(__dirname, '..', '..', 'package.json'), // src/init/ in dev
|
|
1488
|
-
path.join(__dirname, '..', '..', '..', 'package.json'), // dist/src/init/ in prod
|
|
1489
|
-
];
|
|
1490
|
-
let cliVersion = null;
|
|
1491
|
-
for (const p of pkgCandidates) {
|
|
1492
|
-
if (fs.existsSync(p)) {
|
|
1493
|
-
const pkg = JSON.parse(fs.readFileSync(p, 'utf-8'));
|
|
1494
|
-
if (typeof pkg.version === 'string' && pkg.version) {
|
|
1495
|
-
cliVersion = pkg.version;
|
|
1496
|
-
break;
|
|
1497
|
-
}
|
|
1498
|
-
}
|
|
1499
|
-
}
|
|
1500
|
-
if (cliVersion) {
|
|
1501
|
-
atomicWriteFile(versionPath, cliVersion);
|
|
1502
|
-
result.created.files.push('.monomind/version');
|
|
1503
|
-
}
|
|
1504
|
-
}
|
|
1505
|
-
catch { /* non-fatal — sync check will degrade gracefully */ }
|
|
1506
1482
|
// Write .monomind/.gitignore — commit config/knowledge/metrics, exclude sensitive data
|
|
1507
1483
|
const gitignorePath = path.join(targetDir, '.monomind', '.gitignore');
|
|
1508
1484
|
const gitignore = `# Monomind — exclude files that may contain secrets or sensitive prompt data
|
|
@@ -1062,40 +1062,6 @@ function generateStatusline() {
|
|
|
1062
1062
|
return parts.join(\` \${DIV} \`);
|
|
1063
1063
|
}
|
|
1064
1064
|
|
|
1065
|
-
// ── Sync / update status ────────────────────────────────────────
|
|
1066
|
-
// Returns {local, global} if local .monomind/version differs from the running CLI,
|
|
1067
|
-
// or null when in sync or no version file exists.
|
|
1068
|
-
function getSyncStatus() {
|
|
1069
|
-
try {
|
|
1070
|
-
const vf = path.join(CWD, '.monomind', 'version');
|
|
1071
|
-
if (!fs.existsSync(vf)) return null;
|
|
1072
|
-
const local = fs.readFileSync(vf, 'utf-8').trim();
|
|
1073
|
-
const global = getVersion().replace(/^v/, '');
|
|
1074
|
-
if (!local || !global || local === global) return null;
|
|
1075
|
-
return { local, global };
|
|
1076
|
-
} catch { return null; }
|
|
1077
|
-
}
|
|
1078
|
-
|
|
1079
|
-
// Returns the latest available version string if the cache shows a newer release,
|
|
1080
|
-
// null otherwise. Reads from the rate-limiter cache — no network call.
|
|
1081
|
-
function getUpdateStatus() {
|
|
1082
|
-
try {
|
|
1083
|
-
const stateFile = path.join(os.homedir(), '.monomind', 'update-state.json');
|
|
1084
|
-
if (!fs.existsSync(stateFile)) return null;
|
|
1085
|
-
const stat = safeStat(stateFile);
|
|
1086
|
-
if (!stat || stat.size > 1024 * 1024) return null;
|
|
1087
|
-
const state = JSON.parse(fs.readFileSync(stateFile, 'utf-8'));
|
|
1088
|
-
const pkgVersions = (state && typeof state.packageVersions === 'object') ? state.packageVersions : {};
|
|
1089
|
-
const latest = pkgVersions['monomind'] || pkgVersions['@monoes/monomindcli'];
|
|
1090
|
-
const current = getVersion().replace(/^v/, '');
|
|
1091
|
-
if (!latest || !current) return null;
|
|
1092
|
-
const [lMaj, lMin, lPat] = latest.split('.').map(Number);
|
|
1093
|
-
const [cMaj, cMin, cPat] = current.split('.').map(Number);
|
|
1094
|
-
const isNewer = lMaj > cMaj || (lMaj === cMaj && lMin > cMin) || (lMaj === cMaj && lMin === cMin && lPat > cPat);
|
|
1095
|
-
return isNewer ? latest : null;
|
|
1096
|
-
} catch { return null; }
|
|
1097
|
-
}
|
|
1098
|
-
|
|
1099
1065
|
// ── Multi-line dashboard (full mode) ─────────────────────────────
|
|
1100
1066
|
function generateDashboard() {
|
|
1101
1067
|
const git = getGitInfo();
|
|
@@ -1213,17 +1179,6 @@ function generateDashboard() {
|
|
|
1213
1179
|
|
|
1214
1180
|
lines.push(\`\${x.teal}🧠 CONTEXT\${x.reset} \${graphStr}\${hilStr}\`);
|
|
1215
1181
|
|
|
1216
|
-
// ── Row 3: Sync / update warnings (only when action needed) ──
|
|
1217
|
-
const sync = getSyncStatus();
|
|
1218
|
-
const upd = getUpdateStatus();
|
|
1219
|
-
if (sync || upd) {
|
|
1220
|
-
const parts = [];
|
|
1221
|
-
if (sync) parts.push(\`\${x.coral}⚠ sync: local v\${sync.local} → global v\${sync.global} (monomind sync run)\${x.reset}\`);
|
|
1222
|
-
if (upd) parts.push(\`\${x.gold}↑ v\${upd} available (npm i -g monomind)\${x.reset}\`);
|
|
1223
|
-
lines.push(SEP);
|
|
1224
|
-
lines.push(parts.join(\` \${DIV} \`));
|
|
1225
|
-
}
|
|
1226
|
-
|
|
1227
1182
|
return lines.join('\\n');
|
|
1228
1183
|
}
|
|
1229
1184
|
|
|
@@ -176,8 +176,6 @@ export interface StatuslineConfig {
|
|
|
176
176
|
export interface MCPConfig {
|
|
177
177
|
/** Include monomind MCP server */
|
|
178
178
|
monomind: boolean;
|
|
179
|
-
/** Include ruv-swarm MCP server */
|
|
180
|
-
ruvSwarm: boolean;
|
|
181
179
|
/** Include monograph knowledge graph MCP server */
|
|
182
180
|
graphify: boolean;
|
|
183
181
|
/** Auto-start MCP server */
|
|
@@ -112,7 +112,6 @@ export const DEFAULT_INIT_OPTIONS = {
|
|
|
112
112
|
},
|
|
113
113
|
mcp: {
|
|
114
114
|
monomind: true,
|
|
115
|
-
ruvSwarm: false,
|
|
116
115
|
graphify: false,
|
|
117
116
|
autoStart: false,
|
|
118
117
|
port: 3000,
|
|
@@ -236,7 +235,6 @@ export const FULL_INIT_OPTIONS = {
|
|
|
236
235
|
},
|
|
237
236
|
mcp: {
|
|
238
237
|
monomind: true,
|
|
239
|
-
ruvSwarm: true,
|
|
240
238
|
graphify: false,
|
|
241
239
|
autoStart: false,
|
|
242
240
|
port: 3000,
|
|
@@ -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
|
-
<!--
|
|
2254
|
-
<div class="view" id="view-
|
|
2253
|
+
<!-- MONOAGENT -->
|
|
2254
|
+
<div class="view" id="view-monoagent">
|
|
2255
2255
|
<div class="vscroll">
|
|
2256
|
-
<div class="pg-title">
|
|
2257
|
-
<div class="pg-sub">
|
|
2258
|
-
<!-- Tab bar -->
|
|
2256
|
+
<div class="pg-title">MonoAgent</div>
|
|
2257
|
+
<div class="pg-sub">Social media automation workflows & run history</div>
|
|
2259
2258
|
<div class="mg-tab-bar" style="margin-top:14px">
|
|
2260
|
-
<button class="odt-btn active" data-
|
|
2261
|
-
<button class="odt-btn" data-
|
|
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="
|
|
2264
|
+
<button class="btn" onclick="loadMonoagentData()">↺ Refresh</button>
|
|
2270
2265
|
</div>
|
|
2271
|
-
<div id="
|
|
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="
|
|
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',
|
|
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 === '
|
|
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')
|
|
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
|
|
10888
|
-
if (
|
|
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>
|