@yemi33/minions 0.1.967 → 0.1.969

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.967 (2026-04-14)
3
+ ## 0.1.969 (2026-04-14)
4
4
 
5
5
  ### Features
6
6
  - add quality standard reminder to all agent and CC prompts
@@ -25,6 +25,8 @@
25
25
  - fix dashboard plan-pause nested lock violation (#968)
26
26
 
27
27
  ### Fixes
28
+ - set lastPushedAt on fix completion to unblock re-review without poller
29
+ - trigger second-pass re-review after fix agent completes
28
30
  - update ccInFlightAborts when retry LLM replaces original
29
31
  - skip orphaned LLM retry when client disconnected during CC stream
30
32
  - restore queue flush after abort — queued messages are user intent
@@ -43,8 +45,6 @@
43
45
  - use repositoryId+reasonFilter for ADO build query
44
46
  - deduplicate work item creation by title
45
47
  - ADO build query uses repositoryId+pullRequest instead of branchName
46
- - persist adoPollEnabled/ghPollEnabled in settings save
47
- - prevent _consolidationInFlight race from stale force-reset timeout (#1023)
48
48
 
49
49
  ### Other
50
50
  - refactor(dashboard): extract _releaseCCTab helper and CC_LOCK_WAIT_MS constant
@@ -940,6 +940,8 @@ function updatePrAfterFix(pr, project, source) {
940
940
  if (!target) return prs;
941
941
  // Never downgrade from approved — fix was dispatched but PR is already approved
942
942
  if (target.reviewStatus !== 'approved') target.reviewStatus = 'waiting';
943
+ // Advance lastPushedAt so alreadyReviewed resets immediately, without waiting for the poller
944
+ target.lastPushedAt = ts();
943
945
  // Always clear pendingFix — a fix dispatch (regardless of source) addresses all pending feedback
944
946
  if (target.humanFeedback) target.humanFeedback.pendingFix = false;
945
947
  if (source === 'pr-human-feedback') {
package/engine.js CHANGED
@@ -1984,6 +1984,43 @@ async function discoverFromPrs(config, project) {
1984
1984
  if (item) { newWork.push(item); setCooldown(key); }
1985
1985
  }
1986
1986
 
1987
+ // Re-review after fix: fall back to fixedAt > lastReviewedAt when lastPushedAt lags poller
1988
+ const fixedAfterReview = !!(pr.minionsReview?.fixedAt &&
1989
+ pr.lastReviewedAt && pr.minionsReview.fixedAt > pr.lastReviewedAt);
1990
+ const needsReReview = autoReview && reviewStatus === 'waiting' &&
1991
+ (fixedAfterReview || (!alreadyReviewed && !!pr.minionsReview?.fixedAt)) && !evalEscalated;
1992
+ if (needsReReview) {
1993
+ const key = `review-${project?.name || 'default'}-${pr.id}`;
1994
+ if (isAlreadyDispatched(key) || isOnCooldown(key, cooldownMs)) continue;
1995
+
1996
+ // Pre-dispatch live vote check — cached 'waiting' may be stale if reviewer already acted
1997
+ try {
1998
+ const checkFn = project.repoHost === 'github' ? ghCheckLiveReview : adoCheckLiveReview;
1999
+ const liveStatus = await checkFn(pr, project);
2000
+ if (liveStatus && liveStatus !== 'waiting') {
2001
+ log('info', `Pre-dispatch vote check: ${pr.id} is ${liveStatus} (cached was waiting) — skipping re-review`);
2002
+ if (pr.reviewStatus !== 'approved') pr.reviewStatus = liveStatus;
2003
+ try {
2004
+ mutateJsonFileLocked(projectPrPath(project), data => {
2005
+ if (!Array.isArray(data)) return data;
2006
+ const target = data.find(p => p.id === pr.id);
2007
+ if (target && target.reviewStatus !== 'approved') target.reviewStatus = liveStatus;
2008
+ return data;
2009
+ });
2010
+ } catch {}
2011
+ continue;
2012
+ }
2013
+ } catch (e) { log('warn', `Pre-dispatch vote check for ${pr.id}: ${e.message}`); }
2014
+
2015
+ const agentId = resolveAgent('review', config);
2016
+ if (!agentId) continue;
2017
+ const item = buildPrDispatch(agentId, config, project, pr, 'review', {
2018
+ pr_id: pr.id, pr_number: prNumber, pr_title: pr.title || '', pr_branch: pr.branch || '',
2019
+ pr_author: pr.agent || '', pr_url: pr.url || '',
2020
+ }, `Review ${pr.id}: ${pr.title}`, { dispatchKey: key, source: 'pr', pr, branch: pr.branch, project: projMeta });
2021
+ if (item) { newWork.push(item); setCooldown(key); }
2022
+ }
2023
+
1987
2024
  // PRs with changes requested → route back to author for fix
1988
2025
  let fixDispatched = false;
1989
2026
  if (reviewStatus === 'changes-requested' && !awaitingReReview && !evalEscalated) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.967",
3
+ "version": "0.1.969",
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"