@yemi33/minions 0.1.434 → 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.434 (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,7 @@
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
14
15
  - don't show 'update available' when running from git repo
15
16
  - CC network error shows helpful message + New Session button
16
17
  - clicking outside command center dismisses it
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.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"