@yemi33/minions 0.1.690 → 0.1.692

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,6 +1,11 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.690 (2026-04-09)
3
+ ## 0.1.692 (2026-04-09)
4
+
5
+ ### Fixes
6
+ - fetch actual build error logs instead of just annotations
7
+
8
+ ## 0.1.691 (2026-04-09)
4
9
 
5
10
  ### Features
6
11
  - Re-execute button for plans with existing awaiting-approval PRD
@@ -9,6 +14,7 @@
9
14
  - collapsible doc-chat thread in modal
10
15
 
11
16
  ### Fixes
17
+ - show E2E PR + testing guide in verify badge, improve PR matching
12
18
  - add archive fallback for artifact notes when KB entry was swept
13
19
  - link work item artifacts to KB entries, not raw archive copies
14
20
 
@@ -710,12 +710,18 @@ async function planRegeneratePRD(source) {
710
710
  function _renderVerifyBadge(verifyWi) {
711
711
  const statusColors = { pending: 'var(--muted)', dispatched: 'var(--blue)', done: 'var(--green)', failed: 'var(--red)' };
712
712
  const color = statusColors[verifyWi.status] || 'var(--muted)';
713
- const label = verifyWi.status === 'dispatched' ? 'Verifying...' : verifyWi.status === 'done' ? 'Verified' : verifyWi.status === 'failed' ? 'Verify failed' : 'Verify pending';
713
+ const label = verifyWi.status === 'dispatched' ? 'Verifying...' : verifyWi.status === 'done' ? '\u2714 Verified' : verifyWi.status === 'failed' ? 'Verify failed' : 'Verify pending';
714
+ // E2E PR — check by prdItems, branch, or title
714
715
  const allPrs = (window._lastStatus?.pullRequests) || [];
715
- const verifyPr = allPrs.find(pr => (pr.prdItems || []).includes(verifyWi.id));
716
- const prLink = verifyPr?.url ? ' <a href="' + escHtml(verifyPr.url) + '" target="_blank" onclick="event.stopPropagation()" style="color:var(--blue);text-decoration:none;font-size:9px">E2E PR</a>' : '';
717
- const branchInfo = verifyPr?.branch ? ' <span style="font-size:8px;color:var(--muted)" title="' + escHtml(verifyPr.branch) + '">(' + escHtml(verifyPr.branch.slice(0, 25)) + ')</span>' : '';
718
- return '<span style="font-size:9px;font-weight:600;color:' + color + ';padding:0 4px">' + label + '</span>' + prLink + branchInfo;
716
+ const planFile = verifyWi.sourcePlan || '';
717
+ const planSlug = planFile.replace('.json', '');
718
+ const verifyPr = allPrs.find(pr => (pr.prdItems || []).includes(verifyWi.id) || (pr.branch && pr.branch.includes(planSlug) && (pr.title || '').includes('[E2E]')));
719
+ const prLink = verifyPr?.url ? ' <a href="' + escHtml(verifyPr.url) + '" target="_blank" onclick="event.stopPropagation()" style="color:var(--blue);text-decoration:underline;font-size:9px">' + escHtml(verifyPr.id || 'E2E PR') + '</a>' : '';
720
+ // Testing guide
721
+ const guides = window._lastStatus?.verifyGuides || [];
722
+ const guide = guides.find(g => g.planFile === planFile);
723
+ const guideLink = guide ? ' <span onclick="event.stopPropagation();openVerifyGuide(\'' + escHtml(guide.file) + '\')" style="color:var(--green);cursor:pointer;text-decoration:underline;font-size:9px">Testing Guide</span>' : '';
724
+ return '<span style="font-size:9px;font-weight:600;color:' + color + ';padding:0 4px">' + label + '</span>' + prLink + guideLink;
719
725
  }
720
726
 
721
727
  async function openVerifyGuide(file) {
@@ -419,6 +419,7 @@ async function _submitCreateWorkItem(e) {
419
419
  }
420
420
 
421
421
  function openWorkItemDetail(id) {
422
+ if (window.getSelection && window.getSelection().toString().length > 0) return;
422
423
  const item = allWorkItems.find(i => i.id === id);
423
424
  if (!item) return;
424
425
 
package/engine/github.js CHANGED
@@ -108,27 +108,28 @@ async function fetchGhBuildErrorLog(slug, failedRuns) {
108
108
  for (const run of (failedRuns || []).slice(0, 3)) {
109
109
  if (!run?.id) continue;
110
110
 
111
- // Try annotations first — these contain structured compiler/lint errors
111
+ // Try annotations for structured compiler/lint errors
112
+ let hasUsefulAnnotations = false;
112
113
  try {
113
114
  const annotations = await ghApi(`/check-runs/${run.id}/annotations`, slug);
114
115
  if (Array.isArray(annotations) && annotations.length > 0) {
115
- const formatted = annotations
116
- .filter(a => a.annotation_level === 'failure' || a.annotation_level === 'warning')
117
- .map(a => `${a.path || ''}:${a.start_line || ''} [${a.annotation_level}] ${a.message || ''}`)
118
- .join('\n');
119
- if (formatted) {
116
+ const failures = annotations.filter(a => a.annotation_level === 'failure');
117
+ if (failures.length > 0) {
118
+ const formatted = failures
119
+ .map(a => `${a.path || ''}:${a.start_line || ''} [${a.annotation_level}] ${a.message || ''}`)
120
+ .join('\n');
120
121
  logParts.push(`--- ${run.name || 'Check'} (annotations) ---\n${formatted}`);
121
- continue; // annotations are sufficient for this run
122
+ hasUsefulAnnotations = true;
122
123
  }
123
124
  }
124
125
  } catch { /* fall through to job log */ }
125
126
 
126
- // Fallback: fetch the full Actions job log
127
+ // Always fetch job log annotations alone often lack test failure details
127
128
  try {
128
129
  const cmd = `gh api "repos/${slug}/actions/jobs/${run.id}/logs" 2>&1`;
129
130
  const result = await execAsync(cmd, { timeout: 15000, encoding: 'utf-8' });
130
131
  if (result && !result.includes('Not Found')) {
131
- logParts.push(`--- ${run.name || 'Check'} ---\n${result}`);
132
+ logParts.push(`--- ${run.name || 'Check'} (log) ---\n${result}`);
132
133
  }
133
134
  } catch { /* skip individual log fetch failures */ }
134
135
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.690",
3
+ "version": "0.1.692",
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"