@yemi33/minions 0.1.777 → 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 CHANGED
@@ -1,5 +1,10 @@
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
+
3
8
  ## 0.1.777 (2026-04-10)
4
9
 
5
10
  ### Fixes
@@ -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="ccNewTab()" style="background:none;border:1px solid var(--border);color:var(--muted);font-size:10px;padding:2px 8px;border-radius:3px;cursor:pointer">New Chat</button>
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">&#10005;</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">&larr; 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 id="qa-toggle-btn" style="background:none;border:none;color:var(--muted);font-size:10px;cursor:pointer;padding:2px 6px" onclick="toggleDocChat()" title="Collapse thread">&#x25BC; Collapse</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">&#x25BC; 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()">&#x25B2; 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
- // Minions agent signatures
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
- // Track which comments are new (for triggering any new comment triggers a fix)
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
- // Filter out bot comments, minions agent comments, and CI noise
445
- // Agents post as the PAT owner detect by signature patterns, not account type
446
- const prAuthorLogin = (prData?.user?.login || '').toLowerCase();
447
- const humanComments = allComments.filter(c => {
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 (login === prAuthorLogin && body.length < 500 && /\b(fixed|addressed|resolved|pushed|updated|rebased)\b/i.test(body)) return false;
458
- // Common CI bot usernames
459
- if (/\b(bot|codecov|sonar|dependabot|renovate|github-actions|azure-pipelines)\b/i.test(login)) return false;
460
- // Automated status comments (coverage reports, build badges, etc.)
461
- if (/^#{1,3}\s*(Coverage|Build|Test|Deploy|Pipeline)\s*(Report|Status|Result|Summary)/i.test(body)) return false;
462
- if (/!\[.*\]\(https?:\/\/.*badge/i.test(body)) return false;
463
- return true;
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
- // Any new comment triggers a fix no @minions filter needed
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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.777",
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"