@yemi33/minions 0.1.689 → 0.1.691

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,13 +1,15 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.689 (2026-04-09)
3
+ ## 0.1.691 (2026-04-09)
4
4
 
5
5
  ### Features
6
+ - Re-execute button for plans with existing awaiting-approval PRD
6
7
  - PR review/fix cycle pipeline, fix node rendering for never-run pipelines
7
8
  - modal back button for artifact navigation
8
9
  - collapsible doc-chat thread in modal
9
10
 
10
11
  ### Fixes
12
+ - show E2E PR + testing guide in verify badge, improve PR matching
11
13
  - add archive fallback for artifact notes when KB entry was swept
12
14
  - link work item artifacts to KB entries, not raw archive copies
13
15
 
@@ -208,11 +208,20 @@ function renderPlans(plans) {
208
208
  let actions = '';
209
209
  if (needsAction) {
210
210
  const actionTarget = prdFile || p.file;
211
- const actionLabel = effectiveStatus === 'paused' ? 'Resume' : 'Approve';
212
- actions = '<div class="plan-card-actions" onclick="event.stopPropagation()">' +
213
- '<button class="plan-btn approve" onclick="planApprove(\'' + escHtml(actionTarget) + '\')">' + actionLabel + '</button>' +
214
- '<button class="plan-btn reject" onclick="planReject(\'' + escHtml(actionTarget) + '\')">Reject</button>' +
215
- '</div>';
211
+ // For awaiting-approval: show Execute (re-generate PRD from updated plan) + Approve (use current PRD as-is)
212
+ if (effectiveStatus === 'awaiting-approval' && isDraft && prdFile) {
213
+ actions = '<div class="plan-card-actions" onclick="event.stopPropagation()">' +
214
+ '<button class="plan-btn approve" onclick="planExecute(\'' + escHtml(p.file) + '\',\'' + escHtml(p.project || '') + '\',this)">Re-execute</button>' +
215
+ '<button class="plan-btn approve" style="opacity:0.7" onclick="planApprove(\'' + escHtml(actionTarget) + '\')">Approve as-is</button>' +
216
+ '<button class="plan-btn reject" onclick="planReject(\'' + escHtml(actionTarget) + '\')">Reject</button>' +
217
+ '</div>';
218
+ } else {
219
+ const actionLabel = effectiveStatus === 'paused' ? 'Resume' : 'Approve';
220
+ actions = '<div class="plan-card-actions" onclick="event.stopPropagation()">' +
221
+ '<button class="plan-btn approve" onclick="planApprove(\'' + escHtml(actionTarget) + '\')">' + actionLabel + '</button>' +
222
+ '<button class="plan-btn reject" onclick="planReject(\'' + escHtml(actionTarget) + '\')">Reject</button>' +
223
+ '</div>';
224
+ }
216
225
  } else if (isRevision) {
217
226
  actions = '<div class="plan-card-meta" style="margin-top:6px;color:var(--purple,#a855f7)">Revision in progress: ' + escHtml((p.revisionFeedback || '').slice(0, 100)) + '</div>';
218
227
  }
@@ -441,8 +450,11 @@ function _renderPlanModal(normalizedFile, raw, lastMod) {
441
450
  const prdCompleted = prdConversion && linkedPrd && linkedPrd.status === 'completed';
442
451
  const linkedPrdAwaiting = linkedPrd && (linkedPrd.status === 'awaiting-approval' || linkedPrd.status === 'paused');
443
452
  const modalShowResume = isPaused || linkedPrdAwaiting;
444
- const modalExecuteBtn = isMdPlan && !modalShowResume && !hasActiveWork && !prdCompleted && !hasPrd ? '<button class="pr-pager-btn" style="font-size:10px;padding:2px 10px;color:var(--green);font-weight:600" ' +
453
+ const canExecute = isMdPlan && !hasActiveWork && !prdCompleted;
454
+ const modalExecuteBtn = canExecute && !hasPrd ? '<button class="pr-pager-btn" style="font-size:10px;padding:2px 10px;color:var(--green);font-weight:600" ' +
445
455
  'onclick="planExecute(\'' + escHtml(normalizedFile) + '\',\'\',this)">Execute</button>' : '';
456
+ const modalReExecuteBtn = canExecute && linkedPrdAwaiting ? '<button class="pr-pager-btn" style="font-size:10px;padding:2px 10px;color:var(--green);font-weight:600" ' +
457
+ 'onclick="planExecute(\'' + escHtml(normalizedFile) + '\',\'\',this)">Re-execute</button>' : '';
446
458
  const modalCompletedLabel = prdCompleted && !hasActiveWork ? '<span style="font-size:10px;color:var(--green);font-weight:600">Completed</span>' : '';
447
459
  const modalAwaitingLabel = linkedPrdAwaiting && !hasActiveWork && !prdCompleted ? '<span style="font-size:10px;color:var(--yellow);font-weight:600">Awaiting Approval</span>' : '';
448
460
  const modalInProgressLabel = hasActiveWork ? '<span style="font-size:10px;color:var(--blue)">In Progress</span>' : '';
@@ -465,7 +477,7 @@ function _renderPlanModal(normalizedFile, raw, lastMod) {
465
477
  'onclick="planArchive(\'' + escHtml(normalizedFile) + '\')">Archive</button>';
466
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>' : '';
467
479
  const actionBtns = '<div style="display:flex;gap:4px;flex-wrap:wrap;margin-top:4px">' +
468
- (modalCompletedLabel || '') + (modalAwaitingLabel || '') + (modalInProgressLabel || '') + (modalExecuteBtn || '') + (modalPauseBtn || '') + (modalResumeBtn || '') + (modalVerifyBtn || '') + (modalVerifyInfo || '') +
480
+ (modalCompletedLabel || '') + (modalAwaitingLabel || '') + (modalInProgressLabel || '') + (modalReExecuteBtn || '') + (modalExecuteBtn || '') + (modalPauseBtn || '') + (modalResumeBtn || '') + (modalVerifyBtn || '') + (modalVerifyInfo || '') +
469
481
  ' ' + modalArchiveBtn +
470
482
  ' <button class="pr-pager-btn" style="font-size:10px;padding:2px 10px;color:var(--red)" ' +
471
483
  'onclick="planDelete(\'' + escHtml(normalizedFile) + '\')">Delete</button>' +
@@ -698,12 +710,18 @@ async function planRegeneratePRD(source) {
698
710
  function _renderVerifyBadge(verifyWi) {
699
711
  const statusColors = { pending: 'var(--muted)', dispatched: 'var(--blue)', done: 'var(--green)', failed: 'var(--red)' };
700
712
  const color = statusColors[verifyWi.status] || 'var(--muted)';
701
- 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
702
715
  const allPrs = (window._lastStatus?.pullRequests) || [];
703
- const verifyPr = allPrs.find(pr => (pr.prdItems || []).includes(verifyWi.id));
704
- 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>' : '';
705
- const branchInfo = verifyPr?.branch ? ' <span style="font-size:8px;color:var(--muted)" title="' + escHtml(verifyPr.branch) + '">(' + escHtml(verifyPr.branch.slice(0, 25)) + ')</span>' : '';
706
- 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;
707
725
  }
708
726
 
709
727
  async function openVerifyGuide(file) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.689",
3
+ "version": "0.1.691",
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"