@yemi33/minions 0.1.72 → 0.1.73

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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.73 (2026-03-31)
4
+
5
+ ### Dashboard
6
+ - dashboard/js/refresh.js
7
+ - dashboard/js/state.js
8
+ - dashboard/styles.css
9
+
3
10
  ## 0.1.72 (2026-03-31)
4
11
 
5
12
  ### Dashboard
@@ -1,5 +1,30 @@
1
1
  // refresh.js — Main refresh loop and initialization extracted from dashboard.html
2
2
 
3
+ // Sidebar activity indicators — detect changes between refreshes
4
+ let _prevCounts = {};
5
+ function _detectPageChanges(data) {
6
+ const counts = {
7
+ completions: (data.dispatch?.completed || []).length,
8
+ workDone: (data.workItems || []).filter(w => w.status === 'done' || w.status === 'failed').length,
9
+ workTotal: (data.workItems || []).length,
10
+ prdComplete: data.prdProgress?.complete || 0,
11
+ prsMerged: (data.pullRequests || []).filter(p => p.status === 'merged').length,
12
+ inbox: (data.inbox?.items || []).length,
13
+ meetingRounds: (data.meetings || []).reduce((s, m) => s + (m.round || 0), 0),
14
+ };
15
+ const changes = {};
16
+ if (_prevCounts.completions !== undefined) {
17
+ if (counts.completions > _prevCounts.completions) changes.home = true;
18
+ if (counts.workDone > _prevCounts.workDone || counts.workTotal > _prevCounts.workTotal) changes.work = true;
19
+ if (counts.prdComplete > _prevCounts.prdComplete) changes.plans = true;
20
+ if (counts.prsMerged > _prevCounts.prsMerged) changes.prs = true;
21
+ if (counts.inbox > _prevCounts.inbox) changes.inbox = true;
22
+ if (counts.meetingRounds > _prevCounts.meetingRounds) changes.meetings = true;
23
+ }
24
+ _prevCounts = counts;
25
+ return changes;
26
+ }
27
+
3
28
  function _processStatusUpdate(data) {
4
29
  // Detect fresh install — clear stale browser state if install ID changed
5
30
  if (data.installId) {
@@ -46,6 +71,16 @@ function _processStatusUpdate(data) {
46
71
  // Refresh KB and plans less frequently (every 3rd cycle = ~12s)
47
72
  if (!window._kbRefreshCount) window._kbRefreshCount = 0;
48
73
  if (window._kbRefreshCount++ % 3 === 0) { refreshKnowledgeBase(); refreshPlans(); }
74
+
75
+ // Sidebar activity indicators — show red dot on pages with new activity
76
+ try {
77
+ const changes = _detectPageChanges(data);
78
+ for (const page of Object.keys(changes)) {
79
+ if (currentPage === page) continue; // don't badge the active page
80
+ const link = document.querySelector('.sidebar-link[data-page="' + page + '"]');
81
+ if (link && !link.querySelector('.notif-badge')) showNotifBadge(link, 'done');
82
+ }
83
+ } catch { /* expected on first load */ }
49
84
  }
50
85
 
51
86
  async function refresh() {
@@ -21,7 +21,11 @@ function switchPage(page, pushState) {
21
21
  if (target) target.classList.add('active');
22
22
  document.querySelectorAll('.sidebar-link').forEach(l => l.classList.remove('active'));
23
23
  const link = document.querySelector('.sidebar-link[data-page="' + page + '"]');
24
- if (link) link.classList.add('active');
24
+ if (link) {
25
+ link.classList.add('active');
26
+ // Clear notification badge when visiting a page
27
+ try { clearNotifBadge(link); } catch { /* clearNotifBadge may not be loaded yet */ }
28
+ }
25
29
  if (pushState !== false) {
26
30
  const url = page === 'home' ? '/' : '/' + page;
27
31
  history.pushState({ page }, '', url);
@@ -43,7 +43,8 @@
43
43
  /* Sidebar navigation */
44
44
  .page-layout { display: flex; height: calc(100vh - 44px); overflow: hidden; }
45
45
  .sidebar { width: 150px; min-width: 150px; background: var(--surface); border-right: 1px solid var(--border); padding: var(--space-4) 0; overflow-y: auto; position: sticky; top: 0; }
46
- .sidebar-link { display: flex; align-items: center; justify-content: space-between; padding: 8px 14px; color: var(--muted); text-decoration: none; font-size: var(--text-sm); border-left: 3px solid transparent; transition: all var(--transition-fast); cursor: pointer; }
46
+ .sidebar-link { display: flex; align-items: center; justify-content: space-between; padding: 8px 14px; color: var(--muted); text-decoration: none; font-size: var(--text-sm); border-left: 3px solid transparent; transition: all var(--transition-fast); cursor: pointer; position: relative; }
47
+ .sidebar-link .notif-badge.done { top: 50%; right: 6px; transform: translateY(-50%); width: 6px; height: 6px; }
47
48
  .sidebar-link:hover { color: var(--text); background: var(--surface2); }
48
49
  .sidebar-link.active { color: var(--blue); border-left-color: var(--blue); background: var(--surface2); font-weight: 600; }
49
50
  .sidebar-count { font-size: 9px; color: var(--muted); background: var(--surface2); padding: 1px 5px; border-radius: 8px; min-width: 16px; text-align: center; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.72",
3
+ "version": "0.1.73",
4
4
  "description": "Multi-agent AI dev team that runs from ~/.minions/ — five autonomous agents share a single engine, dashboard, and knowledge base",
5
5
  "bin": {
6
6
  "minions": "bin/minions.js"