@yemi33/minions 0.1.433 → 0.1.435

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.433 (2026-04-06)
3
+ ## 0.1.435 (2026-04-06)
4
4
 
5
5
  ### Features
6
6
  - version check interval on settings page
@@ -11,6 +11,8 @@
11
11
  - Convert remaining lifecycle.js safeWrite calls to mutateJsonFileLocked
12
12
 
13
13
  ### Fixes
14
+ - prevent triple dispatch on same PR — 3 root causes
15
+ - don't show 'update available' when running from git repo
14
16
  - CC network error shows helpful message + New Session button
15
17
  - clicking outside command center dismisses it
16
18
  - PR dedup prefers merged/abandoned over active regardless of order
package/dashboard.js CHANGED
@@ -343,7 +343,8 @@ function getStatus() {
343
343
  dashboardStale,
344
344
  stale: engineStale || dashboardStale,
345
345
  latest: _npmVersionCache?.latest || null,
346
- updateAvailable: !!(diskVersion && _npmVersionCache?.latest && _npmVersionCache.latest !== diskVersion && _compareVersions(_npmVersionCache.latest, diskVersion) > 0),
346
+ // Only show "update available" for npm installs (no git repo) repo users manage their own updates
347
+ updateAvailable: !diskCommit && !!(diskVersion && _npmVersionCache?.latest && _npmVersionCache.latest !== diskVersion && _compareVersions(_npmVersionCache.latest, diskVersion) > 0),
347
348
  _npmCheckError: _npmVersionCache?.error || null,
348
349
  };
349
350
  })(),
@@ -3488,7 +3489,7 @@ What would you like to discuss or change? When you're happy, say "approve" and I
3488
3489
  dashboardRunning: _dashboardVersion.codeVersion,
3489
3490
  dashboardRunningCommit: _dashboardVersion.codeCommit,
3490
3491
  latest: npm.latest,
3491
- updateAvailable: !!(diskVersion && npm.latest && _compareVersions(npm.latest, diskVersion) > 0),
3492
+ updateAvailable: !diskCommit && !!(diskVersion && npm.latest && _compareVersions(npm.latest, diskVersion) > 0),
3492
3493
  engineStale,
3493
3494
  dashboardStale,
3494
3495
  stale: engineStale || dashboardStale,
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.433",
3
+ "version": "0.1.435",
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"