@yemi33/minions 0.1.434 → 0.1.436

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,6 +1,6 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.434 (2026-04-06)
3
+ ## 0.1.436 (2026-04-06)
4
4
 
5
5
  ### Features
6
6
  - version check interval on settings page
@@ -11,6 +11,9 @@
11
11
  - Convert remaining lifecycle.js safeWrite calls to mutateJsonFileLocked
12
12
 
13
13
  ### Fixes
14
+ - New Session fully resets command center state
15
+ - show processing dots on note card during active doc-chat
16
+ - prevent triple dispatch on same PR — 3 root causes
14
17
  - don't show 'update available' when running from git repo
15
18
  - CC network error shows helpful message + New Session button
16
19
  - clicking outside command center dismisses it
@@ -35,6 +35,11 @@ function toggleCommandCenter() {
35
35
 
36
36
  function ccNewSession() {
37
37
  fetch('/api/command-center/new-session', { method: 'POST' }).catch(() => {});
38
+ // Abort any in-flight request
39
+ ccAbort();
40
+ _ccSending = false;
41
+ _ccQueue = [];
42
+ try { localStorage.removeItem('cc-sending'); } catch {}
38
43
  _ccSessionId = null;
39
44
  _ccMessages = [];
40
45
  localStorage.removeItem('cc-session-id');
@@ -171,6 +171,10 @@ async function _processQaMessage(message, selection) {
171
171
  const capturedFilePath = _modalFilePath;
172
172
  const capturedDocContext = { ..._modalDocContext };
173
173
 
174
+ // Show processing badge on the source card
175
+ const sourceCard = findCardForFile(capturedFilePath);
176
+ if (sourceCard) showNotifBadge(sourceCard, 'processing');
177
+
174
178
  const loadingId = 'chat-loading-' + Date.now();
175
179
  const qaQueueBadge = _qaQueue.length > 0 ? ' <span style="font-size:9px;color:var(--muted);background:var(--surface);padding:1px 5px;border-radius:8px;border:1px solid var(--border)">+' + _qaQueue.length + ' queued</span>' : '';
176
180
  _qaAbortController = new AbortController();
@@ -280,6 +284,12 @@ async function _processQaMessage(message, selection) {
280
284
  _qaAbortController = null;
281
285
  thread.scrollTop = thread.scrollHeight;
282
286
 
287
+ // Clear processing badge on source card (unless more messages queued)
288
+ if (_qaQueue.length === 0) {
289
+ const doneCard = findCardForFile(capturedFilePath);
290
+ if (doneCard) clearNotifBadge(doneCard);
291
+ }
292
+
283
293
  // Save session (persists even if modal was closed during processing)
284
294
  const modalIsOpen = document.getElementById('modal').classList.contains('open');
285
295
  if (_qaSessionKey) {
@@ -296,7 +306,7 @@ async function _processQaMessage(message, selection) {
296
306
  // Show notification badge on source card when modal was closed during processing
297
307
  if (!modalIsOpen) {
298
308
  const card = findCardForFile(sessionFilePath);
299
- if (card) showNotifBadge(card);
309
+ if (card) showNotifBadge(card, _qaQueue.length > 0 ? 'processing' : 'done');
300
310
  _qaSessionKey = '';
301
311
  }
302
312
  }
package/engine/ado.js CHANGED
@@ -170,7 +170,15 @@ async function pollPrStatus(config) {
170
170
  const votes = reviewers.map(r => r.vote).filter(v => v !== undefined);
171
171
  let newReviewStatus = pr.reviewStatus || 'pending';
172
172
  if (votes.length > 0) {
173
- if (votes.some(v => v === -10)) newReviewStatus = 'changes-requested';
173
+ if (votes.some(v => v === -10)) {
174
+ // Don't re-trigger 'changes-requested' if fix agent already responded (waiting state).
175
+ // Only re-trigger if there's been a new push since the fix (reviewer re-reviewed).
176
+ if (pr.reviewStatus === 'waiting' && pr.minionsReview?.fixedAt && (!pr.lastPushedAt || pr.lastPushedAt <= pr.minionsReview.fixedAt)) {
177
+ newReviewStatus = 'waiting'; // fix was submitted, same vote still present — wait for re-review
178
+ } else {
179
+ newReviewStatus = 'changes-requested';
180
+ }
181
+ }
174
182
  else if (votes.some(v => v >= 5)) newReviewStatus = 'approved';
175
183
  else if (votes.some(v => v === -5)) newReviewStatus = 'waiting';
176
184
  else newReviewStatus = 'pending';
package/engine/github.js CHANGED
@@ -204,7 +204,14 @@ async function pollPrStatus(config) {
204
204
  }
205
205
 
206
206
  let newReviewStatus = pr.reviewStatus || 'pending';
207
- if (states.some(s => s === 'CHANGES_REQUESTED')) newReviewStatus = 'changes-requested';
207
+ if (states.some(s => s === 'CHANGES_REQUESTED')) {
208
+ // Don't re-trigger if fix agent already responded — wait for re-review
209
+ if (pr.reviewStatus === 'waiting' && pr.minionsReview?.fixedAt && (!pr.lastPushedAt || pr.lastPushedAt <= pr.minionsReview.fixedAt)) {
210
+ newReviewStatus = 'waiting';
211
+ } else {
212
+ newReviewStatus = 'changes-requested';
213
+ }
214
+ }
208
215
  else if (states.some(s => s === 'APPROVED')) newReviewStatus = 'approved';
209
216
  else if (states.length > 0) newReviewStatus = 'pending';
210
217
  // If all reviews were COMMENTED (filtered out), states is empty but reviews exist.
@@ -762,8 +762,9 @@ function updatePrAfterFix(pr, project, source) {
762
762
  const target = prs.find(p => p.id === pr.id);
763
763
  if (!target) return prs;
764
764
  target.reviewStatus = 'waiting';
765
+ // Always clear pendingFix — a fix dispatch (regardless of source) addresses all pending feedback
766
+ if (target.humanFeedback) target.humanFeedback.pendingFix = false;
765
767
  if (source === 'pr-human-feedback') {
766
- if (target.humanFeedback) target.humanFeedback.pendingFix = false;
767
768
  target.minionsReview = { ...target.minionsReview, note: 'Fixed human feedback, awaiting re-review', fixedAt: ts() };
768
769
  log('info', `Updated ${pr.id} → cleared humanFeedback.pendingFix, reset to waiting for re-review`);
769
770
  } else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.434",
3
+ "version": "0.1.436",
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"