@yemi33/minions 0.1.776 → 0.1.778
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 +10 -0
- package/dashboard/layout.html +2 -8
- package/engine/ado.js +13 -11
- package/engine/github.js +29 -23
- package/engine/lifecycle.js +3 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.778 (2026-04-10)
|
|
4
|
+
|
|
5
|
+
### Fixes
|
|
6
|
+
- agent comments included in context but don't trigger fix dispatch
|
|
7
|
+
|
|
8
|
+
## 0.1.777 (2026-04-10)
|
|
9
|
+
|
|
10
|
+
### Fixes
|
|
11
|
+
- pass reviewer's actual output to fix agent, not just task label
|
|
12
|
+
|
|
3
13
|
## 0.1.776 (2026-04-10)
|
|
4
14
|
|
|
5
15
|
### Features
|
package/dashboard/layout.html
CHANGED
|
@@ -32,11 +32,10 @@
|
|
|
32
32
|
<span id="cc-session-info" style="font-size:10px;color:var(--muted)">New session</span>
|
|
33
33
|
</div>
|
|
34
34
|
<div style="display:flex;align-items:center;gap:8px">
|
|
35
|
-
<button onclick="
|
|
35
|
+
<button onclick="ccNewSession()" style="background:none;border:1px solid var(--border);color:var(--muted);font-size:10px;padding:2px 8px;border-radius:3px;cursor:pointer">Clear Chat</button>
|
|
36
36
|
<button onclick="toggleCommandCenter()" style="background:none;border:none;color:var(--muted);font-size:16px;cursor:pointer;padding:2px 6px">✕</button>
|
|
37
37
|
</div>
|
|
38
38
|
</div>
|
|
39
|
-
<div id="cc-tab-bar" style="display:flex;gap:4px;padding:4px 12px;border-bottom:1px solid var(--border);overflow-x:auto;align-items:center;flex-shrink:0"></div>
|
|
40
39
|
<div id="cc-messages" style="flex:1;overflow-y:auto;padding:12px 16px;display:flex;flex-direction:column;gap:10px"></div>
|
|
41
40
|
<div style="padding:12px 16px;border-top:1px solid var(--border)">
|
|
42
41
|
<div style="display:flex;gap:8px">
|
|
@@ -99,7 +98,6 @@
|
|
|
99
98
|
<div class="modal-header">
|
|
100
99
|
<h3 id="modal-title">—</h3>
|
|
101
100
|
<div class="modal-header-actions">
|
|
102
|
-
<button class="modal-copy" id="modal-back-btn" onclick="modalGoBack()" title="Back" style="display:none">← Back</button>
|
|
103
101
|
<button class="modal-copy" id="modal-edit-btn" onclick="modalToggleEdit()" title="Edit" style="display:none"><svg width="12" height="12" viewBox="0 0 16 16" fill="currentColor"><path d="M11.013 1.427a1.75 1.75 0 012.474 0l1.086 1.086a1.75 1.75 0 010 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 01-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61zM12.9 2.97L4.288 11.58l-.537 1.878 1.878-.537L14.242 4.31 12.9 2.97z"/></svg> Edit</button>
|
|
104
102
|
<button class="modal-copy" id="modal-save-btn" onclick="modalSaveEdit()" title="Save" style="display:none;color:var(--green);border-color:var(--green)"><svg width="12" height="12" viewBox="0 0 16 16" fill="currentColor"><path d="M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z"/></svg> Save</button>
|
|
105
103
|
<button class="modal-copy" id="modal-cancel-edit-btn" onclick="modalCancelEdit()" title="Cancel edit" style="display:none">Cancel</button>
|
|
@@ -113,14 +111,10 @@
|
|
|
113
111
|
<div id="modal-qa-thread-wrap" style="display:none">
|
|
114
112
|
<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:4px">
|
|
115
113
|
<button id="qa-clear-btn" style="background:none;border:none;color:var(--muted);font-size:10px;cursor:pointer;padding:2px 6px" onclick="clearQaConversation()" title="Clear conversation">Clear</button>
|
|
116
|
-
<button
|
|
114
|
+
<button style="background:none;border:none;color:var(--muted);font-size:10px;cursor:pointer;padding:2px 6px" onclick="toggleDocChat()" id="qa-toggle-btn" title="Collapse thread">▼ Collapse</button>
|
|
117
115
|
</div>
|
|
118
116
|
<div class="modal-qa-thread" id="modal-qa-thread"></div>
|
|
119
117
|
</div>
|
|
120
|
-
<div id="qa-expand-bar" style="display:none;margin-bottom:4px">
|
|
121
|
-
<button style="background:none;border:none;color:var(--muted);font-size:10px;cursor:pointer;padding:2px 6px" onclick="toggleDocChat()">▲ Show thread</button>
|
|
122
|
-
</div>
|
|
123
|
-
<div id="qa-action-slot"></div>
|
|
124
118
|
<div class="modal-qa-selection-pill" id="modal-qa-pill" style="display:none">
|
|
125
119
|
<span class="pill-label">Selection:</span>
|
|
126
120
|
<span class="pill-text" id="modal-qa-pill-text"></span>
|
package/engine/ado.js
CHANGED
|
@@ -459,35 +459,37 @@ async function pollPrHumanComments(config) {
|
|
|
459
459
|
for (const comment of (thread.comments || [])) {
|
|
460
460
|
if (!comment.content || comment.commentType === 'system') continue;
|
|
461
461
|
const content = comment.content;
|
|
462
|
-
//
|
|
463
|
-
if (/\bMinions\s*\(/i.test(content)) continue;
|
|
464
|
-
if (/\b(Review|Fixed|Explored|Verified|Tested)\s+by\s+Minions\b/i.test(content)) continue;
|
|
465
|
-
if (/\[minions\]/i.test(content)) continue;
|
|
466
|
-
// Skip bot/service account comments
|
|
462
|
+
// Skip bots and CI noise
|
|
467
463
|
const authorName = (comment.author?.displayName || '').toLowerCase();
|
|
468
464
|
if (/\b(bot|service|build|pipeline|codecov|sonar)\b/i.test(authorName)) continue;
|
|
469
|
-
// Short comments from same author that look agent-generated
|
|
470
|
-
if (content.length < 500 && /\b(fixed|addressed|resolved|pushed|updated|rebased)\b/i.test(content) && /\b(review|feedback|comment|finding)\b/i.test(content)) continue;
|
|
471
|
-
// Automated status comments (coverage, build reports)
|
|
472
465
|
if (/^#{1,3}\s*(Coverage|Build|Test|Deploy|Pipeline)\s*(Report|Status|Result|Summary)/i.test(content)) continue;
|
|
466
|
+
// Detect agent comments (included in context, but don't trigger fix)
|
|
467
|
+
const isAgent = /\bMinions\s*\(/i.test(content) || /\bby\s+Minions\b/i.test(content) || /\[minions\]/i.test(content);
|
|
473
468
|
|
|
474
469
|
const entry = {
|
|
475
470
|
threadId: thread.id,
|
|
476
471
|
commentId: comment.id,
|
|
477
472
|
author: comment.author?.displayName || 'Human',
|
|
478
473
|
content: comment.content,
|
|
479
|
-
date: comment.publishedDate
|
|
474
|
+
date: comment.publishedDate,
|
|
475
|
+
_isAgent: isAgent
|
|
480
476
|
};
|
|
481
477
|
allHumanComments.push(entry);
|
|
482
478
|
|
|
483
|
-
//
|
|
479
|
+
// Only non-agent new comments trigger a fix (agent reviews trigger via vote)
|
|
484
480
|
const commentMs = comment.publishedDate ? new Date(comment.publishedDate).getTime() : 0;
|
|
485
|
-
if (commentMs && commentMs > cutoffMs) {
|
|
481
|
+
if (commentMs && commentMs > cutoffMs && !isAgent) {
|
|
486
482
|
newHumanComments.push(entry);
|
|
487
483
|
}
|
|
488
484
|
}
|
|
489
485
|
}
|
|
490
486
|
|
|
487
|
+
// Update cutoff even if only agent comments are new
|
|
488
|
+
const allNewDates = allHumanComments.filter(c => (new Date(c.date).getTime() || 0) > cutoffMs).map(c => c.date);
|
|
489
|
+
if (allNewDates.length > 0 && newHumanComments.length === 0) {
|
|
490
|
+
pr.humanFeedback = { ...(pr.humanFeedback || {}), lastProcessedCommentDate: allNewDates.sort().pop() };
|
|
491
|
+
return false;
|
|
492
|
+
}
|
|
491
493
|
if (newHumanComments.length === 0) return false;
|
|
492
494
|
|
|
493
495
|
// Sort all comments chronologically and build full context for the fix agent
|
package/engine/github.js
CHANGED
|
@@ -441,27 +441,25 @@ async function pollPrHumanComments(config) {
|
|
|
441
441
|
...(Array.isArray(reviewComments) ? reviewComments : []).map(c => ({ ...c, _type: 'review' }))
|
|
442
442
|
];
|
|
443
443
|
|
|
444
|
-
//
|
|
445
|
-
//
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
if (c.user?.type === 'Bot') return false;
|
|
449
|
-
const body = c.body || '';
|
|
450
|
-
// Minions agent signatures (review, fix, explore, etc.)
|
|
451
|
-
if (/\bMinions\s*\(/i.test(body)) return false;
|
|
452
|
-
if (/\b(Review|Fixed|Explored|Verified|Tested)\s+by\s+Minions\b/i.test(body)) return false;
|
|
453
|
-
if (/\[minions\]/i.test(body)) return false;
|
|
454
|
-
// Comments from the PR author account are likely agent-generated (agents use same PAT)
|
|
455
|
-
// Only skip if the comment looks automated (short, or has agent patterns)
|
|
444
|
+
// Separate: agent comments (included in context, don't trigger fix) vs human comments (trigger fix)
|
|
445
|
+
// All non-bot, non-CI comments go into context. Only non-agent comments trigger pendingFix.
|
|
446
|
+
function _isBot(c) {
|
|
447
|
+
if (c.user?.type === 'Bot') return true;
|
|
456
448
|
const login = (c.user?.login || '').toLowerCase();
|
|
457
|
-
if (
|
|
458
|
-
|
|
459
|
-
if (
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
449
|
+
if (/\b(bot|codecov|sonar|dependabot|renovate|github-actions|azure-pipelines)\b/i.test(login)) return true;
|
|
450
|
+
const body = c.body || '';
|
|
451
|
+
if (/^#{1,3}\s*(Coverage|Build|Test|Deploy|Pipeline)\s*(Report|Status|Result|Summary)/i.test(body)) return true;
|
|
452
|
+
if (/!\[.*\]\(https?:\/\/.*badge/i.test(body)) return true;
|
|
453
|
+
return false;
|
|
454
|
+
}
|
|
455
|
+
function _isAgentComment(c) {
|
|
456
|
+
const body = c.body || '';
|
|
457
|
+
if (/\bMinions\s*\(/i.test(body)) return true;
|
|
458
|
+
if (/\bby\s+Minions\b/i.test(body)) return true;
|
|
459
|
+
if (/\[minions\]/i.test(body)) return true;
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
const humanComments = allComments.filter(c => !_isBot(c));
|
|
465
463
|
|
|
466
464
|
const cutoffStr = pr.humanFeedback?.lastProcessedCommentDate || pr.created || '1970-01-01';
|
|
467
465
|
const cutoffMs = new Date(cutoffStr).getTime() || 0;
|
|
@@ -472,21 +470,29 @@ async function pollPrHumanComments(config) {
|
|
|
472
470
|
|
|
473
471
|
for (const c of humanComments) {
|
|
474
472
|
const date = c.created_at || c.updated_at || '';
|
|
473
|
+
const isAgent = _isAgentComment(c);
|
|
475
474
|
const entry = {
|
|
476
475
|
commentId: c.id,
|
|
477
476
|
author: c.user?.login || 'Human',
|
|
478
477
|
content: c.body || '',
|
|
479
|
-
date
|
|
478
|
+
date,
|
|
479
|
+
_isAgent: isAgent
|
|
480
480
|
};
|
|
481
481
|
allCommentEntries.push(entry);
|
|
482
482
|
|
|
483
|
-
//
|
|
483
|
+
// Only non-agent new comments trigger a fix (agent reviews trigger via vote, not comment)
|
|
484
484
|
const dateMs = date ? new Date(date).getTime() : 0;
|
|
485
|
-
if (dateMs && dateMs > cutoffMs) {
|
|
485
|
+
if (dateMs && dateMs > cutoffMs && !isAgent) {
|
|
486
486
|
newComments.push(entry);
|
|
487
487
|
}
|
|
488
488
|
}
|
|
489
489
|
|
|
490
|
+
// Update cutoff even if only agent comments are new (so we don't re-scan them)
|
|
491
|
+
const allNewDates = allCommentEntries.filter(c => (new Date(c.date).getTime() || 0) > cutoffMs).map(c => c.date);
|
|
492
|
+
if (allNewDates.length > 0 && newComments.length === 0) {
|
|
493
|
+
pr.humanFeedback = { ...(pr.humanFeedback || {}), lastProcessedCommentDate: allNewDates.sort().pop() };
|
|
494
|
+
return false; // agent comments only — don't trigger fix
|
|
495
|
+
}
|
|
490
496
|
if (newComments.length === 0) return false;
|
|
491
497
|
|
|
492
498
|
// Sort all comments chronologically and build full context for the fix agent
|
package/engine/lifecycle.js
CHANGED
|
@@ -720,7 +720,7 @@ function syncPrsFromOutput(output, agentId, meta, config) {
|
|
|
720
720
|
|
|
721
721
|
// ─── Post-Completion Hooks ──────────────────────────────────────────────────
|
|
722
722
|
|
|
723
|
-
async function updatePrAfterReview(agentId, pr, project, config) {
|
|
723
|
+
async function updatePrAfterReview(agentId, pr, project, config, resultSummary) {
|
|
724
724
|
|
|
725
725
|
if (!pr?.id) return;
|
|
726
726
|
|
|
@@ -755,7 +755,7 @@ async function updatePrAfterReview(agentId, pr, project, config) {
|
|
|
755
755
|
target.minionsReview = {
|
|
756
756
|
reviewer: reviewerName,
|
|
757
757
|
reviewedAt: ts(),
|
|
758
|
-
note: completedEntry?.task || ''
|
|
758
|
+
note: resultSummary || completedEntry?.task || ''
|
|
759
759
|
};
|
|
760
760
|
updatedTarget = { ...pr, ...target };
|
|
761
761
|
return prs;
|
|
@@ -1592,7 +1592,7 @@ async function runPostCompletionHooks(dispatchItem, agentId, code, stdout, confi
|
|
|
1592
1592
|
}
|
|
1593
1593
|
}
|
|
1594
1594
|
|
|
1595
|
-
if (type === WORK_TYPE.REVIEW) await updatePrAfterReview(agentId, meta?.pr, meta?.project, config);
|
|
1595
|
+
if (type === WORK_TYPE.REVIEW) await updatePrAfterReview(agentId, meta?.pr, meta?.project, config, resultSummary);
|
|
1596
1596
|
if (type === WORK_TYPE.FIX) updatePrAfterFix(meta?.pr, meta?.project, meta?.source);
|
|
1597
1597
|
checkForLearnings(agentId, config.agents[agentId], dispatchItem.task);
|
|
1598
1598
|
if (effectiveSuccess) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.778",
|
|
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"
|