@yemi33/minions 0.1.769 → 0.1.771

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,11 +1,17 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.769 (2026-04-10)
3
+ ## 0.1.771 (2026-04-10)
4
+
5
+ ### Fixes
6
+ - clarify timeout.js error reason — "Exited with error" vs "Completed"
7
+
8
+ ## 0.1.770 (2026-04-10)
4
9
 
5
10
  ### Features
6
11
  - id/kill endpoint
7
12
 
8
13
  ### Fixes
14
+ - increase ADO pipeline/task caps from 3 to 10, update docs
9
15
  - ADO build detection uses builds API, not unreliable status checks
10
16
  - handle work type names as action aliases for dispatch
11
17
  - align Agent Usage and Engine Usage table columns
@@ -41,7 +41,7 @@ How the engine manages the lifecycle of a PR from creation through review, fix,
41
41
 
42
42
  - Gate: `buildFixAttempts < maxBuildFixAttempts` (default 3) + grace period expired
43
43
  - **Grace period** (`_buildFixPushedAt`): after fix dispatches, waits `buildFixGracePeriod` (default 10min, configurable in `ENGINE_DEFAULTS`) for CI to run before re-dispatching. Cleared when poller detects build status transition (CI actually ran).
44
- - **Error logs**: GitHub fetches annotations (failures only, not warnings) + Actions job log (always). ADO fetches build timeline + failed task logs. Both fetch up to 3 failing pipelines.
44
+ - **Error logs**: GitHub fetches annotations (failures only, not warnings) + Actions job log (always). ADO queries builds API directly (not status checks), fetches build timeline failed task logs (up to 10 per build, up to 10 failing pipelines).
45
45
  - **Escalation**: after 3 failed attempts, writes inbox alert, sets `buildFixEscalated = true`, stops auto-dispatch. Counter resets when build recovers.
46
46
 
47
47
  ## 5. Fix completes
@@ -108,3 +108,20 @@ How the engine manages the lifecycle of a PR from creation through review, fix,
108
108
  | `lastReviewedAt` | `updatePrAfterReview()` | Prevents re-dispatch if reviewed |
109
109
  | `minionsReview` | Post-completion hooks | `{ reviewer, reviewedAt, note, fixedAt }` |
110
110
  | `humanFeedback` | `pollPrHumanComments()` | `{ pendingFix, feedbackContent, lastProcessedCommentDate }` |
111
+
112
+ ## Platform differences
113
+
114
+ | | GitHub | ADO |
115
+ |---|---|---|
116
+ | **Build status API** | `/commits/{sha}/check-runs` | `_apis/build/builds` (not status checks — those show stale codecoverage postbacks) |
117
+ | **Commit tracking** | `head.sha` (source branch tip) | `lastMergeCommit.commitId` (merge commit that builds use as sourceVersion) |
118
+ | **Passing** | success, skipped, neutral | succeeded, partiallySucceeded (warnings, not failures) |
119
+ | **Error logs** | Annotations (failures only) + Actions job log (always) | Build timeline → failed task logs (up to 10 tasks, up to 10 pipelines) |
120
+ | **Push detection** | `head.sha` change | `lastMergeCommit.commitId` change |
121
+
122
+ ### ADO lessons learned
123
+
124
+ - Don't trust `/pullRequests/{id}/statuses` — shows stale codecoverage postbacks, not actual build results
125
+ - Builds use the merge commit hash as `sourceVersion`, not the source branch commit — compare against `lastMergeCommit.commitId`
126
+ - `partiallySucceeded` counts as passing (warnings, not failures)
127
+ - A stale but passing build is still valid — don't re-trigger builds that already passed
package/engine/ado.js CHANGED
@@ -141,9 +141,9 @@ async function fetchAdoBuildErrorLog(orgBase, project, failedStatus, token, pr,
141
141
  );
142
142
  if (failedRecords.length === 0) return null;
143
143
 
144
- // Fetch logs for failed tasks (cap at 3 to limit API calls)
144
+ // Fetch logs for failed tasks (cap at 10 to cover multi-stage pipelines)
145
145
  const logParts = [];
146
- for (const record of failedRecords.slice(0, 3)) {
146
+ for (const record of failedRecords.slice(0, 10)) {
147
147
  try {
148
148
  const logUrl = `${orgBase}/${project.adoProject}/_apis/build/builds/${buildId}/logs/${record.log.id}?api-version=7.1`;
149
149
  const text = await adoFetchText(logUrl, token);
@@ -404,7 +404,7 @@ async function pollPrStatus(config) {
404
404
 
405
405
  // Fetch actual compiler/build error logs when transitioning to failing
406
406
  if (buildStatus === 'failing') {
407
- const failedStatusObjs = buildStatuses.filter(s => s.state === 'failed' || s.state === 'error').slice(0, 3);
407
+ const failedStatusObjs = buildStatuses.filter(s => s.state === 'failed' || s.state === 'error').slice(0, 10);
408
408
  const logParts = [];
409
409
  const seenBuildIds = new Set();
410
410
  for (const failedStatusObj of failedStatusObjs) {
package/engine/timeout.js CHANGED
@@ -206,7 +206,7 @@ function checkTimeouts(config) {
206
206
  safeWrite(outputLogPath, `# Output for dispatch ${item.id}\n# Exit code: ${isSuccess ? 0 : 1}\n# Completed: ${ts()}\n# Detected via output scan\n\n## Result\n${text || '(no text)'}\n`);
207
207
  } catch (e) { log('warn', 'parse output result: ' + e.message); }
208
208
 
209
- completeDispatch(item.id, isSuccess ? DISPATCH_RESULT.SUCCESS : DISPATCH_RESULT.ERROR, 'Completed (detected from output)');
209
+ completeDispatch(item.id, isSuccess ? DISPATCH_RESULT.SUCCESS : DISPATCH_RESULT.ERROR, isSuccess ? 'Completed (detected from output)' : 'Exited with error (detected from output)');
210
210
 
211
211
  // Run post-completion hooks via shared helper (async — fire and forget in timeout context)
212
212
  const fullLogForHooks = safeRead(liveLogPath) || liveLog;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.769",
3
+ "version": "0.1.771",
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"