@yemi33/minions 0.1.312 → 0.1.314

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,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.314 (2026-04-03)
4
+
5
+ ### Fixes
6
+ - show reviewer names in dashboard Signed Off By column
7
+
8
+ ### Other
9
+ - perf: CC message handling — debounce localStorage, cap array, batch scroll
10
+
3
11
  ## 0.1.312 (2026-04-03)
4
12
 
5
13
  ### Fixes
@@ -72,13 +72,20 @@ function ccRestoreMessages() {
72
72
  } catch {}
73
73
  }
74
74
 
75
+ let _ccSaveDebounce = null;
75
76
  function ccSaveState() {
76
- try {
77
- if (_ccSessionId) localStorage.setItem('cc-session-id', _ccSessionId);
78
- // Keep last 30 messages for display
79
- const toSave = _ccMessages.slice(-30);
80
- localStorage.setItem('cc-messages', JSON.stringify(toSave));
81
- } catch { /* localStorage might be full */ }
77
+ // Trim in-memory array to prevent unbounded growth
78
+ if (_ccMessages.length > 100) _ccMessages = _ccMessages.slice(-100);
79
+ // Debounce localStorage writes no need to serialize on every message during streaming
80
+ if (_ccSaveDebounce) return;
81
+ _ccSaveDebounce = setTimeout(() => {
82
+ _ccSaveDebounce = null;
83
+ try {
84
+ if (_ccSessionId) localStorage.setItem('cc-session-id', _ccSessionId);
85
+ const toSave = _ccMessages.slice(-30);
86
+ localStorage.setItem('cc-messages', JSON.stringify(toSave));
87
+ } catch { /* localStorage might be full */ }
88
+ }, 500);
82
89
  }
83
90
 
84
91
  function ccUpdateSessionIndicator() {
@@ -104,7 +111,7 @@ function ccAddMessage(role, html, skipSave) {
104
111
  (isUser ? 'background:var(--blue);color:#fff;align-self:flex-end' : 'background:var(--surface2);color:var(--text);align-self:flex-start;border:1px solid var(--border);position:relative');
105
112
  div.innerHTML = (isAssistant && !html.includes('color:var(--red)') && !html.includes('cc-queued-pill') ? llmCopyBtn() : '') + html;
106
113
  el.appendChild(div);
107
- el.scrollTop = el.scrollHeight;
114
+ requestAnimationFrame(() => { el.scrollTop = el.scrollHeight; });
108
115
  if (!skipSave) {
109
116
  _ccMessages.push({ role, html });
110
117
  ccSaveState();
@@ -24,7 +24,7 @@ function prRow(pr) {
24
24
  '<td><span class="pr-agent">' + escHtml(pr.agent || '—') + '</span></td>' +
25
25
  '<td><span class="pr-branch">' + escHtml(pr.branch || '—') + '</span></td>' +
26
26
  '<td><span class="pr-badge ' + reviewClass + '">' + escHtml(reviewLabel) + '</span></td>' +
27
- '<td>' + (sq.reviewer && sq.status !== 'waiting' ? '<span class="pr-agent" title="' + escHtml(sq.note || '') + '">' + escHtml(sq.reviewer) + '</span>' : sq.reviewer && sq.status === 'waiting' ? '<span class="pr-agent" style="color:var(--muted)" title="Vote pending confirmation">' + escHtml(sq.reviewer) + '…</span>' : '<span style="color:var(--muted);font-size:11px">—</span>') + '</td>' +
27
+ '<td>' + (sq.reviewer && sq.status !== 'waiting' ? '<span class="pr-agent" title="' + escHtml(sq.note || '') + '">' + escHtml(sq.reviewer) + '</span>' : sq.reviewer && sq.status === 'waiting' ? '<span class="pr-agent" style="color:var(--muted)" title="Vote pending confirmation">' + escHtml(sq.reviewer) + '…</span>' : pr.reviewedBy && pr.reviewedBy.length ? '<span class="pr-agent">' + escHtml(pr.reviewedBy.join(', ')) + '</span>' : '<span style="color:var(--muted);font-size:11px">—</span>') + '</td>' +
28
28
  '<td><span class="pr-badge ' + buildClass + '">' + escHtml(buildLabel) + '</span></td>' +
29
29
  '<td><span class="pr-badge ' + statusClass + '">' + escHtml(statusLabel) + '</span></td>' +
30
30
  '<td><span class="pr-date">' + escHtml(pr.created || '—') + '</span></td>' +
package/engine/ado.js CHANGED
@@ -151,6 +151,19 @@ async function pollPrStatus(config) {
151
151
  else newReviewStatus = 'pending';
152
152
  }
153
153
 
154
+ // Store human reviewer names who approved or requested changes
155
+ const reviewedBy = reviewers
156
+ .filter(r => r.vote >= 5 || r.vote === -10)
157
+ .map(r => r.displayName)
158
+ .filter(Boolean);
159
+ // Fallback: if PR was merged and no decisive votes, use completedBy
160
+ if (!reviewedBy.length && newStatus === 'merged' && prData.closedBy?.displayName) {
161
+ reviewedBy.push(prData.closedBy.displayName);
162
+ }
163
+ if (JSON.stringify(pr.reviewedBy || []) !== JSON.stringify(reviewedBy)) {
164
+ pr.reviewedBy = reviewedBy; updated = true;
165
+ }
166
+
154
167
  if (pr.reviewStatus !== newReviewStatus) {
155
168
  log('info', `PR ${pr.id} reviewStatus: ${pr.reviewStatus} → ${newReviewStatus}`);
156
169
  pr.reviewStatus = newReviewStatus;
package/engine/github.js CHANGED
@@ -154,6 +154,19 @@ async function pollPrStatus(config) {
154
154
  }
155
155
  const states = [...latestByUser.values()];
156
156
 
157
+ // Store human reviewer names who approved or requested changes
158
+ const reviewedBy = [...latestByUser.entries()]
159
+ .filter(([, state]) => state === 'APPROVED' || state === 'CHANGES_REQUESTED')
160
+ .map(([user]) => user)
161
+ .filter(Boolean);
162
+ // Fallback: if PR was merged and no decisive reviews, use merged_by
163
+ if (!reviewedBy.length && prData.merged && prData.merged_by?.login) {
164
+ reviewedBy.push(prData.merged_by.login);
165
+ }
166
+ if (JSON.stringify(pr.reviewedBy || []) !== JSON.stringify(reviewedBy)) {
167
+ pr.reviewedBy = reviewedBy; updated = true;
168
+ }
169
+
157
170
  let newReviewStatus = pr.reviewStatus || 'pending';
158
171
  if (states.some(s => s === 'CHANGES_REQUESTED')) newReviewStatus = 'changes-requested';
159
172
  else if (states.some(s => s === 'APPROVED')) newReviewStatus = 'approved';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.312",
3
+ "version": "0.1.314",
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"