@yemi33/minions 0.1.974 → 0.1.976
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 +6 -6
- package/dashboard.js +1 -1
- package/engine/lifecycle.js +36 -31
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.976 (2026-04-14)
|
|
4
4
|
|
|
5
5
|
### Features
|
|
6
6
|
- flush queued CC messages as single combined request
|
|
7
7
|
- add quality standard reminder to all agent and CC prompts
|
|
8
8
|
- surface in-flight tool calls in lastAction (#1064)
|
|
9
|
+
- reassign tasks when preferred agent is busy too long
|
|
9
10
|
- wire agentBusyReassignMs into settings UI and persist
|
|
10
11
|
- ADO throttle detection, poll guards, and dashboard banner (#1051)
|
|
11
12
|
- gate auto-fix conflict dispatch behind autoFixConflicts flag
|
|
@@ -22,12 +23,13 @@
|
|
|
22
23
|
- CC tab unread dot + reopened badge on work items
|
|
23
24
|
- fix dep re-merge failure on retry with existing commits (#977)
|
|
24
25
|
- audit and harden log buffering implementation (#971)
|
|
25
|
-
- replace magic string 'active' with PR_STATUS.ACTIVE in lifecycle.js (#969)
|
|
26
26
|
|
|
27
27
|
### Fixes
|
|
28
|
+
- move review verdict check before updateWorkItemStatus(DONE)
|
|
28
29
|
- skip isAlreadyDispatched in needsReReview to allow re-review within 1hr
|
|
29
30
|
- loop queue flush so messages queued during combined send aren't orphaned
|
|
30
31
|
- set lastPushedAt on fix completion to unblock re-review without poller
|
|
32
|
+
- restore ADO throttle test functions deleted during merge conflict resolution
|
|
31
33
|
- trigger second-pass re-review after fix agent completes
|
|
32
34
|
- update ccInFlightAborts when retry LLM replaces original
|
|
33
35
|
- skip orphaned LLM retry when client disconnected during CC stream
|
|
@@ -40,11 +42,9 @@
|
|
|
40
42
|
- enforce --timeout 1 on all azureauth calls to prevent agent orphans (#1063)
|
|
41
43
|
- cancel steering kill watcher on resume spawn (#1052) (#1062)
|
|
42
44
|
- suppress warn for optional template variables (#1061)
|
|
45
|
+
- skip SessionStart hook settings test on CI
|
|
46
|
+
- fix boolean settings test and add agentBusyReassignMs to dashboard
|
|
43
47
|
- fix ENGINE_DEFAULTS ref and derive boolean settings from defaults
|
|
44
|
-
- add autoFixConflicts to boolean settings persist list
|
|
45
|
-
- tighten build query guard to require mergeCommitId
|
|
46
|
-
- restore sourceVersion filter after refs/pull merge ref switch
|
|
47
|
-
- use refs/pull/{id}/merge for build status scoping
|
|
48
48
|
|
|
49
49
|
### Other
|
|
50
50
|
- refactor(dashboard): extract _releaseCCTab helper and CC_LOCK_WAIT_MS constant
|
package/dashboard.js
CHANGED
|
@@ -3789,7 +3789,7 @@ What would you like to discuss or change? When you're happy, say "approve" and I
|
|
|
3789
3789
|
versionCheckInterval: [60000],
|
|
3790
3790
|
maxBuildFixAttempts: [1, 10],
|
|
3791
3791
|
adoPollStatusEvery: [1], adoPollCommentsEvery: [1],
|
|
3792
|
-
agentBusyReassignMs: [
|
|
3792
|
+
agentBusyReassignMs: [0],
|
|
3793
3793
|
};
|
|
3794
3794
|
for (const [key, [min, max]] of Object.entries(numericFields)) {
|
|
3795
3795
|
if (e[key] !== undefined) {
|
package/engine/lifecycle.js
CHANGED
|
@@ -940,8 +940,6 @@ 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();
|
|
945
943
|
// Always clear pendingFix — a fix dispatch (regardless of source) addresses all pending feedback
|
|
946
944
|
if (target.humanFeedback) target.humanFeedback.pendingFix = false;
|
|
947
945
|
if (source === 'pr-human-feedback') {
|
|
@@ -1599,6 +1597,41 @@ async function runPostCompletionHooks(dispatchItem, agentId, code, stdout, confi
|
|
|
1599
1597
|
// If decomposition produced nothing, fall through to mark parent as done
|
|
1600
1598
|
}
|
|
1601
1599
|
|
|
1600
|
+
// Verify review work items include a verdict — must run BEFORE updateWorkItemStatus(DONE),
|
|
1601
|
+
// same pattern as plan-to-prd (#893): updateWorkItemStatus deletes _retryCount, so the check
|
|
1602
|
+
// must read/increment it before that happens. Also sets skipDoneStatus so completedAt isn't
|
|
1603
|
+
// written and then left dangling when status is reset to pending for retry.
|
|
1604
|
+
if (effectiveSuccess && type === WORK_TYPE.REVIEW && meta?.item?.id) {
|
|
1605
|
+
const verdict = parseReviewVerdict(resultSummary);
|
|
1606
|
+
if (!verdict) {
|
|
1607
|
+
skipDoneStatus = true;
|
|
1608
|
+
const wiPath = resolveWorkItemPath(meta);
|
|
1609
|
+
if (wiPath) {
|
|
1610
|
+
try {
|
|
1611
|
+
mutateJsonFileLocked(wiPath, data => {
|
|
1612
|
+
if (!Array.isArray(data)) return data;
|
|
1613
|
+
const w = data.find(i => i.id === meta.item.id);
|
|
1614
|
+
if (!w) return data;
|
|
1615
|
+
const retries = w._retryCount || 0;
|
|
1616
|
+
if (retries < ENGINE_DEFAULTS.maxRetries) {
|
|
1617
|
+
w.status = WI_STATUS.PENDING;
|
|
1618
|
+
w._retryCount = retries + 1;
|
|
1619
|
+
delete w.dispatched_at;
|
|
1620
|
+
delete w.completedAt;
|
|
1621
|
+
log('warn', `Review ${meta.item.id} completed without verdict — auto-retry ${retries + 1}/${ENGINE_DEFAULTS.maxRetries}`);
|
|
1622
|
+
} else {
|
|
1623
|
+
w.status = WI_STATUS.FAILED;
|
|
1624
|
+
w.failReason = 'No review verdict after ' + ENGINE_DEFAULTS.maxRetries + ' attempts';
|
|
1625
|
+
w.failedAt = ts();
|
|
1626
|
+
log('warn', `Review ${meta.item.id} failed — no verdict after ${ENGINE_DEFAULTS.maxRetries} retries`);
|
|
1627
|
+
}
|
|
1628
|
+
return data;
|
|
1629
|
+
});
|
|
1630
|
+
} catch (err) { log('warn', `review verdict check: ${err.message}`); }
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
}
|
|
1634
|
+
|
|
1602
1635
|
// Verify plan-to-prd actually created the PRD file before marking done (#893)
|
|
1603
1636
|
// Must run BEFORE updateWorkItemStatus(DONE) — otherwise _retryCount is deleted and retries never advance
|
|
1604
1637
|
if (effectiveSuccess && type === WORK_TYPE.PLAN_TO_PRD && meta?.item?.id) {
|
|
@@ -1772,35 +1805,7 @@ async function runPostCompletionHooks(dispatchItem, agentId, code, stdout, confi
|
|
|
1772
1805
|
|
|
1773
1806
|
// Old plan-to-prd PRD check removed — moved before updateWorkItemStatus(DONE) to fix #893
|
|
1774
1807
|
// (retryCount was being deleted by done-marking before the check could read it)
|
|
1775
|
-
|
|
1776
|
-
// Verify review work items include a verdict — mirrors the PRD file existence check pattern.
|
|
1777
|
-
// If agent completed (exit 0) but output has no VERDICT: APPROVE/REQUEST_CHANGES, the review
|
|
1778
|
-
// is incomplete. Auto-retry up to maxRetries, then fail.
|
|
1779
|
-
if (effectiveSuccess && type === WORK_TYPE.REVIEW && meta?.item?.id) {
|
|
1780
|
-
const verdict = parseReviewVerdict(resultSummary);
|
|
1781
|
-
if (!verdict) {
|
|
1782
|
-
const wiPath = resolveWorkItemPath(meta);
|
|
1783
|
-
if (wiPath) {
|
|
1784
|
-
mutateJsonFileLocked(wiPath, data => {
|
|
1785
|
-
if (!Array.isArray(data)) return data;
|
|
1786
|
-
const w = data.find(i => i.id === meta.item.id);
|
|
1787
|
-
if (!w) return data;
|
|
1788
|
-
const retries = w._retryCount || 0;
|
|
1789
|
-
if (retries < ENGINE_DEFAULTS.maxRetries) {
|
|
1790
|
-
w.status = WI_STATUS.PENDING;
|
|
1791
|
-
w._retryCount = retries + 1;
|
|
1792
|
-
delete w.dispatched_at;
|
|
1793
|
-
log('warn', `Review ${meta.item.id} completed without verdict — auto-retry ${retries + 1}/${ENGINE_DEFAULTS.maxRetries}`);
|
|
1794
|
-
} else {
|
|
1795
|
-
w.status = WI_STATUS.FAILED;
|
|
1796
|
-
w.failReason = 'No review verdict after ' + ENGINE_DEFAULTS.maxRetries + ' attempts';
|
|
1797
|
-
log('warn', `Review ${meta.item.id} failed — no verdict after ${ENGINE_DEFAULTS.maxRetries} retries`);
|
|
1798
|
-
}
|
|
1799
|
-
return data;
|
|
1800
|
-
});
|
|
1801
|
-
}
|
|
1802
|
-
}
|
|
1803
|
-
}
|
|
1808
|
+
// Review verdict check similarly moved before updateWorkItemStatus(DONE) — same root cause.
|
|
1804
1809
|
|
|
1805
1810
|
if (type === WORK_TYPE.REVIEW) await updatePrAfterReview(agentId, meta?.pr, meta?.project, config, resultSummary);
|
|
1806
1811
|
if (type === WORK_TYPE.FIX) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.976",
|
|
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"
|