@yemi33/minions 0.1.1675 → 0.1.1677

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,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.1677 (2026-05-02)
4
+
5
+ ### Fixes
6
+ - process bot PR comments as actionable
7
+
8
+ ## 0.1.1676 (2026-05-02)
9
+
10
+ ### Other
11
+ - Revert "fix: cap Signed Off By column width and wrap multi-reviewer overflow"
12
+ - Revert "fix: widen Signed Off By column from 140px to 220px"
13
+
3
14
  ## 0.1.1675 (2026-05-02)
4
15
 
5
16
  ### Fixes
@@ -34,7 +34,7 @@ function prRow(pr) {
34
34
  '<td><span class="pr-agent">' + escapeHtml(pr.agent || '—') + '</span></td>' +
35
35
  '<td><span class="' + branchClass + '"' + (branchError ? ' title="' + escapeHtml(branchError) + '"' : '') + '>' + escapeHtml(branchLabel) + '</span>' + pendingReasonHtml + '</td>' +
36
36
  '<td><span class="pr-badge ' + reviewClass + '"' + (reviewTitle ? ' title="' + escapeHtml(reviewTitle) + '"' : '') + '>' + escapeHtml(reviewLabel) + '</span></td>' +
37
- '<td class="pr-col-signoff">' + (sq.reviewer && sq.status !== 'waiting' ? '<span class="pr-agent" title="' + escapeHtml(sq.note || '') + '">' + escapeHtml(sq.reviewer) + '</span>' : sq.reviewer && sq.status === 'waiting' ? '<span class="pr-agent" style="color:var(--muted)" title="Vote pending confirmation">' + escapeHtml(sq.reviewer) + '…</span>' : pr.reviewedBy && pr.reviewedBy.length ? '<span class="pr-agent">' + escapeHtml(pr.reviewedBy.join(', ')) + '</span>' : '<span style="color:var(--muted);font-size:11px">—</span>') + '</td>' +
37
+ '<td>' + (sq.reviewer && sq.status !== 'waiting' ? '<span class="pr-agent" title="' + escapeHtml(sq.note || '') + '">' + escapeHtml(sq.reviewer) + '</span>' : sq.reviewer && sq.status === 'waiting' ? '<span class="pr-agent" style="color:var(--muted)" title="Vote pending confirmation">' + escapeHtml(sq.reviewer) + '…</span>' : pr.reviewedBy && pr.reviewedBy.length ? '<span class="pr-agent">' + escapeHtml(pr.reviewedBy.join(', ')) + '</span>' : '<span style="color:var(--muted);font-size:11px">—</span>') + '</td>' +
38
38
  '<td><span class="pr-badge ' + buildClass + '"' + (buildTitle ? ' title="' + escapeHtml(buildTitle) + '"' : '') + '>' + escapeHtml(buildLabel) + '</span></td>' +
39
39
  '<td><span class="pr-badge ' + statusClass + '">' + escapeHtml(statusLabel) + '</span></td>' +
40
40
  '<td><span class="pr-date">' + escapeHtml((pr.created || '—').slice(0, 16).replace('T', ' ')) + '</span></td>' +
@@ -44,7 +44,7 @@ function prRow(pr) {
44
44
 
45
45
  function prTableHtml(rows) {
46
46
  return '<div class="pr-table-wrap"><table class="pr-table"><thead><tr>' +
47
- '<th>PR</th><th>Title</th><th>Agent</th><th>Branch</th><th>Review</th><th class="pr-col-signoff">Signed Off By</th><th>Build</th><th>Status</th><th>Created</th><th></th>' +
47
+ '<th>PR</th><th>Title</th><th>Agent</th><th>Branch</th><th>Review</th><th>Signed Off By</th><th>Build</th><th>Status</th><th>Created</th><th></th>' +
48
48
  '</tr></thead><tbody>' + rows + '</tbody></table></div>';
49
49
  }
50
50
 
@@ -213,6 +213,7 @@
213
213
  .prd-item-row.st-in-progress { border-left-color: var(--yellow); animation: prdWipPulse 2s infinite; }
214
214
  @keyframes prdWipPulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(210,153,34,0); } 50% { box-shadow: 0 0 0 4px rgba(210,153,34,0.2); } }
215
215
  .prd-item-row.st-failed { border-left-color: var(--red); }
216
+ .prd-item-row.st-needs-human-review { border-left-color: var(--orange); }
216
217
  .prd-item-row.st-updated { border-left-color: var(--purple); }
217
218
  .prd-item-row.st-paused { border-left-color: var(--muted); opacity: 0.5; }
218
219
  .prd-item-id { font-family: Consolas, monospace; color: var(--muted); min-width: 36px; font-size: 0.9em; }
@@ -251,7 +252,6 @@
251
252
  .pr-table-wrap { overflow-x: auto; }
252
253
  .pr-table { width: 100%; border-collapse: collapse; font-size: var(--text-md); table-layout: auto; }
253
254
  .pr-table th:last-child, .pr-table td:last-child { width: 36px; min-width: 36px; text-align: center; }
254
- .pr-table th.pr-col-signoff, .pr-table td.pr-col-signoff { width: 220px; max-width: 220px; white-space: normal; word-break: break-word; }
255
255
  .pr-table th { text-align: left; color: var(--muted); font-weight: 500; font-size: var(--text-base); text-transform: uppercase; letter-spacing: 0.5px; padding: var(--space-4) var(--space-5); border-bottom: 1px solid var(--border); }
256
256
  .pr-table td { padding: var(--space-5); border-bottom: 1px solid var(--border); vertical-align: middle; white-space: nowrap; }
257
257
  .pr-table tr:last-child td { border-bottom: none; }
@@ -268,6 +268,7 @@
268
268
  .pr-badge.active { background: rgba(88,166,255,0.15); color: var(--blue); border: 1px solid var(--blue); }
269
269
  .pr-badge.approved { background: rgba(63,185,80,0.15); color: var(--green); border: 1px solid var(--green); }
270
270
  .pr-badge.rejected { background: rgba(248,81,73,0.15); color: var(--red); border: 1px solid var(--red); }
271
+ .pr-badge.needs-review { background: rgba(227,179,65,0.15); color: var(--orange); border: 1px solid var(--orange); }
271
272
  .pr-badge.review-escalated { background: rgba(227,179,65,0.22); color: var(--orange); border: 1px dashed var(--orange); font-weight: 700; }
272
273
  .pr-badge.merged { background: rgba(188,140,255,0.15); color: var(--purple); border: 1px solid var(--purple); }
273
274
  .pr-badge.building { background: rgba(210,153,34,0.15); color: var(--yellow); border: 1px solid var(--yellow); animation: pulse 1.5s infinite; }
package/engine/ado.js CHANGED
@@ -795,10 +795,9 @@ async function pollPrHumanComments(config) {
795
795
  for (const comment of (thread.comments || [])) {
796
796
  if (!comment.content || comment.commentType === 'system') continue;
797
797
  const content = comment.content;
798
- // Skip bots, CI noise, and ignored authors
798
+ // Skip explicitly ignored authors and CI-report bodies, but do not ignore bot authors by default.
799
799
  const authorName = (comment.author?.displayName || '').toLowerCase();
800
800
  if (ignoredAuthors.some(a => authorName.includes(a))) continue;
801
- if (/\b(bot|service|build|pipeline|codecov|sonar)\b/i.test(authorName)) continue;
802
801
  if (/^#{1,3}\s*(Coverage|Build|Test|Deploy|Pipeline)\s*(Report|Status|Result|Summary)/i.test(content)) continue;
803
802
  // Detect agent comments (included in context, but don't trigger fix)
804
803
  const isAgent = /\bMinions\s*\(/i.test(content) || /\bby\s+Minions\b/i.test(content) || /\[minions\]/i.test(content);
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "runtime": "copilot",
3
3
  "models": null,
4
- "cachedAt": "2026-05-02T04:32:33.166Z"
4
+ "cachedAt": "2026-05-02T05:19:51.665Z"
5
5
  }
package/engine/github.js CHANGED
@@ -561,14 +561,12 @@ async function pollPrHumanComments(config) {
561
561
  ...(Array.isArray(reviewComments) ? reviewComments : []).map(c => ({ ...c, _type: 'review' }))
562
562
  ];
563
563
 
564
- // Separate: agent comments (included in context, don't trigger fix) vs human comments (trigger fix)
565
- // All non-bot, non-CI comments go into context. Only non-agent comments trigger pendingFix.
564
+ // Separate: agent comments (included in context, don't trigger fix) vs actionable comments (trigger fix).
565
+ // Bot-authored comments are actionable unless explicitly ignored or clearly CI report noise.
566
566
  const ignoredAuthors = new Set((config.engine?.ignoredCommentAuthors || []).map(a => a.toLowerCase()));
567
- function _isBot(c) {
568
- if (c.user?.type === 'Bot') return true;
567
+ function _isIgnoredComment(c) {
569
568
  const login = (c.user?.login || '').toLowerCase();
570
569
  if (ignoredAuthors.has(login)) return true;
571
- if (/\b(bot|codecov|sonar|dependabot|renovate|github-actions|azure-pipelines)\b/i.test(login)) return true;
572
570
  const body = c.body || '';
573
571
  if (/^#{1,3}\s*(Coverage|Build|Test|Deploy|Pipeline)\s*(Report|Status|Result|Summary)/i.test(body)) return true;
574
572
  if (/!\[.*\]\(https?:\/\/.*badge/i.test(body)) return true;
@@ -581,16 +579,16 @@ async function pollPrHumanComments(config) {
581
579
  if (/\[minions\]/i.test(body)) return true;
582
580
  return false;
583
581
  }
584
- const humanComments = allComments.filter(c => !_isBot(c));
582
+ const actionableComments = allComments.filter(c => !_isIgnoredComment(c));
585
583
 
586
584
  const cutoffStr = pr.humanFeedback?.lastProcessedCommentDate || pr.created || '1970-01-01';
587
585
  const cutoffMs = new Date(cutoffStr).getTime() || 0;
588
586
 
589
- // Collect ALL human comments for full context, track new ones for triggering
587
+ // Collect ALL actionable comments for full context, track new ones for triggering
590
588
  const allCommentEntries = [];
591
589
  const newComments = [];
592
590
 
593
- for (const c of humanComments) {
591
+ for (const c of actionableComments) {
594
592
  const date = c.created_at || c.updated_at || '';
595
593
  const isAgent = _isAgentComment(c);
596
594
  const entry = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.1675",
3
+ "version": "0.1.1677",
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"