@yemi33/minions 0.1.695 → 0.1.697
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 +5 -1
- package/dashboard/js/render-plans.js +7 -7
- package/engine/ado.js +17 -9
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.697 (2026-04-09)
|
|
4
4
|
|
|
5
5
|
### Fixes
|
|
6
|
+
- ADO build error log fetches all failing pipelines, not just first
|
|
6
7
|
- verify/implement playbooks must include PR URL in final message
|
|
7
8
|
- ADO build error log fallback when targetUrl lacks buildId
|
|
8
9
|
- syncPrsFromOutput missed PRs mentioned in assistant text blocks
|
|
9
10
|
|
|
11
|
+
### Other
|
|
12
|
+
- refactor: reorder card buttons (Approve first), split modal approve/reject
|
|
13
|
+
|
|
10
14
|
## 0.1.692 (2026-04-09)
|
|
11
15
|
|
|
12
16
|
### Fixes
|
|
@@ -211,8 +211,8 @@ function renderPlans(plans) {
|
|
|
211
211
|
// For awaiting-approval: show Execute (re-generate PRD from updated plan) + Approve (use current PRD as-is)
|
|
212
212
|
if (effectiveStatus === 'awaiting-approval' && isDraft && prdFile) {
|
|
213
213
|
actions = '<div class="plan-card-actions" onclick="event.stopPropagation()">' +
|
|
214
|
-
'<button class="plan-btn approve" onclick="
|
|
215
|
-
'<button class="plan-btn approve" style="opacity:0.7" onclick="
|
|
214
|
+
'<button class="plan-btn approve" onclick="planApprove(\'' + escHtml(actionTarget) + '\')">Approve</button>' +
|
|
215
|
+
'<button class="plan-btn approve" style="opacity:0.7" onclick="planExecute(\'' + escHtml(p.file) + '\',\'' + escHtml(p.project || '') + '\',this)">Re-execute</button>' +
|
|
216
216
|
'<button class="plan-btn reject" onclick="planReject(\'' + escHtml(actionTarget) + '\')">Reject</button>' +
|
|
217
217
|
'</div>';
|
|
218
218
|
} else {
|
|
@@ -465,10 +465,10 @@ function _renderPlanModal(normalizedFile, raw, lastMod) {
|
|
|
465
465
|
const isActuallyPaused = planStatus === 'paused' || linkedPrd?.status === 'paused';
|
|
466
466
|
const modalApproveLabel = isActuallyPaused ? 'Resume' : 'Approve';
|
|
467
467
|
const showRejectInModal = linkedPrdAwaiting || planStatus === 'awaiting-approval';
|
|
468
|
-
const
|
|
469
|
-
'onclick="planApprove(\'' + escHtml(modalApproveTarget) + '\',this)">' + modalApproveLabel + '</button>'
|
|
470
|
-
|
|
471
|
-
'onclick="planReject(\'' + escHtml(modalApproveTarget) + '\')">Reject</button>' : ''
|
|
468
|
+
const modalApproveBtn = modalShowResume ? '<button class="pr-pager-btn" style="font-size:10px;padding:2px 10px;color:var(--green)" ' +
|
|
469
|
+
'onclick="planApprove(\'' + escHtml(modalApproveTarget) + '\',this)">' + modalApproveLabel + '</button>' : '';
|
|
470
|
+
const modalRejectBtn = showRejectInModal ? '<button class="pr-pager-btn" style="font-size:10px;padding:2px 10px;color:var(--red)" ' +
|
|
471
|
+
'onclick="planReject(\'' + escHtml(modalApproveTarget) + '\')">Reject</button>' : '';
|
|
472
472
|
const modalVerifyWi = (window._lastWorkItems || []).find(w => w.itemType === 'verify' && w.sourcePlan === normalizedFile);
|
|
473
473
|
const modalVerifyBtn = isModalCompleted && !modalVerifyWi ? '<button class="pr-pager-btn" style="font-size:10px;padding:2px 10px;color:var(--green)" ' +
|
|
474
474
|
'onclick="triggerVerify(\'' + escHtml(normalizedFile) + '\',this)">Verify</button>' : '';
|
|
@@ -477,7 +477,7 @@ function _renderPlanModal(normalizedFile, raw, lastMod) {
|
|
|
477
477
|
'onclick="planArchive(\'' + escHtml(normalizedFile) + '\')">Archive</button>';
|
|
478
478
|
const lastModLabel = lastMod ? '<div style="font-size:10px;color:var(--muted);font-weight:400;margin-top:2px">Last updated: ' + new Date(lastMod).toLocaleString() + '</div>' : '';
|
|
479
479
|
const actionBtns = '<div style="display:flex;gap:4px;flex-wrap:wrap;margin-top:4px">' +
|
|
480
|
-
(modalCompletedLabel || '') + (modalAwaitingLabel || '') + (modalInProgressLabel || '') + (modalReExecuteBtn || '') + (modalExecuteBtn || '') + (modalPauseBtn || '') + (
|
|
480
|
+
(modalCompletedLabel || '') + (modalAwaitingLabel || '') + (modalInProgressLabel || '') + (modalApproveBtn || '') + (modalReExecuteBtn || '') + (modalExecuteBtn || '') + (modalPauseBtn || '') + (modalRejectBtn || '') + (modalVerifyBtn || '') + (modalVerifyInfo || '') +
|
|
481
481
|
' ' + modalArchiveBtn +
|
|
482
482
|
' <button class="pr-pager-btn" style="font-size:10px;padding:2px 10px;color:var(--red)" ' +
|
|
483
483
|
'onclick="planDelete(\'' + escHtml(normalizedFile) + '\')">Delete</button>' +
|
package/engine/ado.js
CHANGED
|
@@ -99,7 +99,7 @@ const BUILD_ERROR_LOG_MAX_LINES = 150;
|
|
|
99
99
|
* for failed tasks, and fetches their logs.
|
|
100
100
|
* Returns truncated log text or null if unavailable.
|
|
101
101
|
*/
|
|
102
|
-
async function fetchAdoBuildErrorLog(orgBase, project, failedStatus, token, pr) {
|
|
102
|
+
async function fetchAdoBuildErrorLog(orgBase, project, failedStatus, token, pr, seenBuildIds) {
|
|
103
103
|
try {
|
|
104
104
|
// Try extracting buildId from targetUrl (e.g. .../_build/results?buildId=12345)
|
|
105
105
|
const targetUrl = failedStatus?.targetUrl || '';
|
|
@@ -112,10 +112,11 @@ async function fetchAdoBuildErrorLog(orgBase, project, failedStatus, token, pr)
|
|
|
112
112
|
try {
|
|
113
113
|
const branch = pr?.branch || pr?.sourceRefName?.replace('refs/heads/', '');
|
|
114
114
|
if (branch) {
|
|
115
|
-
const buildsUrl = `${orgBase}/${project.adoProject}/_apis/build/builds?branchName=refs/heads/${encodeURIComponent(branch)}&statusFilter=completed&resultFilter=failed&$top=
|
|
115
|
+
const buildsUrl = `${orgBase}/${project.adoProject}/_apis/build/builds?branchName=refs/heads/${encodeURIComponent(branch)}&statusFilter=completed&resultFilter=failed&$top=3&api-version=7.1`;
|
|
116
116
|
const builds = await adoFetch(buildsUrl, token);
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
const fresh = (builds?.value || []).find(b => !seenBuildIds?.has(String(b.id)));
|
|
118
|
+
if (fresh?.id) {
|
|
119
|
+
buildId = String(fresh.id);
|
|
119
120
|
log('debug', `Found buildId ${buildId} via branch query for ${branch}`);
|
|
120
121
|
}
|
|
121
122
|
}
|
|
@@ -125,6 +126,8 @@ async function fetchAdoBuildErrorLog(orgBase, project, failedStatus, token, pr)
|
|
|
125
126
|
log('debug', `No buildId from targetUrl or branch query: ${targetUrl.slice(0, 120)}`);
|
|
126
127
|
return null;
|
|
127
128
|
}
|
|
129
|
+
if (seenBuildIds?.has(buildId)) return null; // already fetched this build
|
|
130
|
+
if (seenBuildIds) seenBuildIds.add(buildId);
|
|
128
131
|
|
|
129
132
|
// Fetch build timeline to find failed tasks
|
|
130
133
|
const timelineUrl = `${orgBase}/${project.adoProject}/_apis/build/builds/${buildId}/timeline?api-version=7.1`;
|
|
@@ -390,11 +393,16 @@ async function pollPrStatus(config) {
|
|
|
390
393
|
|
|
391
394
|
// Fetch actual compiler/build error logs when transitioning to failing
|
|
392
395
|
if (buildStatus === 'failing') {
|
|
393
|
-
const
|
|
394
|
-
const
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
396
|
+
const failedStatusObjs = buildStatuses.filter(s => s.state === 'failed' || s.state === 'error').slice(0, 3);
|
|
397
|
+
const logParts = [];
|
|
398
|
+
const seenBuildIds = new Set();
|
|
399
|
+
for (const failedStatusObj of failedStatusObjs) {
|
|
400
|
+
const errorLog = await fetchAdoBuildErrorLog(orgBase, project, failedStatusObj, token, pr, seenBuildIds);
|
|
401
|
+
if (errorLog) logParts.push(errorLog);
|
|
402
|
+
}
|
|
403
|
+
if (logParts.length > 0) {
|
|
404
|
+
pr.buildErrorLog = logParts.join('\n\n');
|
|
405
|
+
log('info', `PR ${pr.id}: fetched error logs from ${logParts.length} failing pipeline(s)`);
|
|
398
406
|
}
|
|
399
407
|
}
|
|
400
408
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.697",
|
|
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"
|