@yemi33/minions 0.1.359 → 0.1.361

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,12 +1,14 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.359 (2026-04-06)
3
+ ## 0.1.361 (2026-04-06)
4
4
 
5
5
  ### Features
6
6
  - pipeline plan stage uses LLM to generate structured plan from meeting
7
7
  - show 'Converting to PRD' status instead of 'In Progress' during plan conversion
8
8
 
9
9
  ### Fixes
10
+ - archived PRD picker uses file key instead of positional index
11
+ - check pull-requests.json for existing PRs before no-PR retry
10
12
  - smart no-PR handling — distinguish MCP stall from intentional no-PR
11
13
 
12
14
  ## 0.1.356 (2026-04-06)
@@ -148,8 +148,11 @@ function renderPrdProgress(prog) {
148
148
 
149
149
  // Linked work item info
150
150
  const wi = wiById[i.id];
151
+ const wiAgent = wi?.dispatched_to ? (agentData.find(a => a.id === wi.dispatched_to) || {}) : null;
151
152
  const wiLabel = wi ? '<span style="font-size:9px;color:var(--muted);background:var(--surface);padding:1px 5px;border-radius:3px;border:1px solid var(--border)" title="Work item: ' + escHtml(wi.id) + '">' +
152
- escHtml(wi.id) + (wi.dispatched_to ? ' → ' + escHtml(wi.dispatched_to) : '') + '</span>' : '';
153
+ escHtml(wi.id) + '</span>' : '';
154
+ const agentLabel = wiAgent ? '<span style="font-size:9px;color:var(--muted)" title="' + escHtml(wiAgent.name || wi.dispatched_to) + '">' +
155
+ (wiAgent.emoji || '') + ' ' + escHtml(wiAgent.name || wi.dispatched_to) + '</span>' : '';
153
156
 
154
157
  // Requeue button for failed items
155
158
  const canRequeue = wi && (wi.status === 'failed' || i.status === 'failed');
@@ -170,6 +173,7 @@ function renderPrdProgress(prog) {
170
173
  '<span class="prd-item-id">' + escHtml(i.id) + '</span>' +
171
174
  '<span class="prd-item-name" title="' + escHtml(i.name) + '">' + escHtml(i.name) + '</span>' +
172
175
  wiLabel +
176
+ agentLabel +
173
177
  requeueBtn +
174
178
  (projBadges ? '<span>' + projBadges + '</span>' : '') +
175
179
  (prLinks ? '<span>' + prLinks + '</span>' : '') +
@@ -320,7 +324,9 @@ function renderPrdProgress(prog) {
320
324
  const borderColor = statusColor(i.status);
321
325
  const src = escHtml(i.source || '');
322
326
  const iid = escHtml(i.id || '');
323
- const agent = wi[i.id]?.dispatched_to || '';
327
+ const agentId = wi[i.id]?.dispatched_to || '';
328
+ const agentInfo = agentId ? (agentData.find(a => a.id === agentId) || {}) : null;
329
+ const agentDisplay = agentInfo ? (agentInfo.emoji || '') + ' ' + escHtml(agentInfo.name || agentId) : (agentId ? escHtml(agentId) : '');
324
330
  const deps = (i.depends_on || []).join(', ');
325
331
  const wipAnim = i.status === 'dispatched' ? 'animation:prdWipPulse 2s infinite;' : '';
326
332
  html += '<div onclick="prdItemEdit(\'' + src + '\',\'' + iid + '\')" ' +
@@ -333,7 +339,7 @@ function renderPrdProgress(prog) {
333
339
  '<div style="color:var(--text);font-size:11px;line-height:1.3;margin-bottom:3px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical">' + escHtml(i.name) + '</div>' +
334
340
  '<div style="display:flex;gap:4px;flex-wrap:wrap;align-items:center">' +
335
341
  '<span class="prd-item-priority ' + (i.priority || '') + '" style="font-size:8px;padding:1px 4px">' + escHtml(i.priority || '') + '</span>' +
336
- (agent ? '<span style="font-size:8px;color:var(--muted)">' + escHtml(agent) + '</span>' : '') +
342
+ (agentDisplay ? '<span style="font-size:8px;color:var(--muted)">' + agentDisplay + '</span>' : '') +
337
343
  (function() {
338
344
  const w = wi[i.id];
339
345
  if (!w) return '';
@@ -484,7 +490,7 @@ function openArchivedPrdModal() {
484
490
  const done = g.items.filter(it => it.status === 'done').length;
485
491
  const failed = g.items.filter(it => it.status === 'failed').length;
486
492
  const completed = g.completedAt ? new Date(g.completedAt).toLocaleDateString() : '';
487
- return '<div class="plan-card" style="cursor:pointer;margin-bottom:8px" onclick="showArchivedPrdDetail(' + i + ')">' +
493
+ return '<div class="plan-card" style="cursor:pointer;margin-bottom:8px" onclick="showArchivedPrdDetail(\'' + escHtml(g.file) + '\')">' +
488
494
  '<div class="plan-card-title" style="font-size:13px">' + escHtml(g.summary || g.file) + '</div>' +
489
495
  '<div class="plan-card-meta">' +
490
496
  (g.project ? '<span>' + escHtml(g.project) + '</span>' : '') +
@@ -504,16 +510,17 @@ function openArchivedPrdModal() {
504
510
  document.getElementById('modal').classList.add('open');
505
511
  }
506
512
 
507
- function showArchivedPrdDetail(idx) {
513
+ function showArchivedPrdDetail(idxOrFile) {
508
514
  const groups = window._archivedPrdGroups || [];
515
+ const idx = typeof idxOrFile === 'string' ? groups.findIndex(g => g.file === idxOrFile) : idxOrFile;
509
516
  const g = groups[idx];
510
517
  if (!g) return;
511
518
 
512
519
  // View mode toggle for archived
513
520
  const isGraph = window._archivedPrdViewMode !== 'list';
514
521
  const toggleHtml = '<div style="display:flex;gap:4px;margin-bottom:8px">' +
515
- '<button class="pr-pager-btn" style="font-size:9px;padding:2px 8px;' + (isGraph ? 'background:var(--blue);color:#fff;border-color:var(--blue)' : '') + '" onclick="window._archivedPrdViewMode=\'graph\';showArchivedPrdDetail(' + idx + ')">Graph</button>' +
516
- '<button class="pr-pager-btn" style="font-size:9px;padding:2px 8px;' + (!isGraph ? 'background:var(--blue);color:#fff;border-color:var(--blue)' : '') + '" onclick="window._archivedPrdViewMode=\'list\';showArchivedPrdDetail(' + idx + ')">List</button>' +
522
+ '<button class="pr-pager-btn" style="font-size:9px;padding:2px 8px;' + (isGraph ? 'background:var(--blue);color:#fff;border-color:var(--blue)' : '') + '" onclick="window._archivedPrdViewMode=\'graph\';showArchivedPrdDetail(\'' + escHtml(g.file) + '\')">Graph</button>' +
523
+ '<button class="pr-pager-btn" style="font-size:9px;padding:2px 8px;' + (!isGraph ? 'background:var(--blue);color:#fff;border-color:var(--blue)' : '') + '" onclick="window._archivedPrdViewMode=\'list\';showArchivedPrdDetail(\'' + escHtml(g.file) + '\')">List</button>' +
517
524
  '<button class="pr-pager-btn" style="font-size:9px;padding:2px 8px;color:var(--green);margin-left:auto" onclick="triggerVerify(\'' + escHtml(g.file) + '\')">Trigger Verify</button>' +
518
525
  '<button class="pr-pager-btn" style="font-size:9px;padding:2px 8px" onclick="planUnarchive(\'' + escHtml(g.file) + '\',this)">Unarchive</button>' +
519
526
  '<button class="pr-pager-btn" style="font-size:9px;padding:2px 8px" onclick="openArchivedPrdModal()">Back</button>' +
@@ -1279,7 +1279,18 @@ function runPostCompletionHooks(dispatchItem, agentId, code, stdout, config) {
1279
1279
  // Detect implement tasks that completed without creating a PR
1280
1280
  if (isSuccess && (type === WORK_TYPE.IMPLEMENT || type === WORK_TYPE.IMPLEMENT_LARGE || type === WORK_TYPE.FIX) && prsCreatedCount === 0 && meta?.item?.id && !meta?.item?.skipPr && meta?.project?.localPath) {
1281
1281
  // Check if a PR already exists linked to this work item (from a previous attempt)
1282
- const existingPrFound = Object.values(getPrLinks()).includes(meta.item.id);
1282
+ let existingPrFound = Object.values(getPrLinks()).includes(meta.item.id);
1283
+ // Also check pull-requests.json for PRs with matching prdItems or branch
1284
+ if (!existingPrFound) {
1285
+ const allProjects = shared.getProjects(config);
1286
+ for (const p of allProjects) {
1287
+ const prs = safeJson(shared.projectPrPath(p)) || [];
1288
+ if (prs.some(pr => (pr.prdItems || []).includes(meta.item.id) || (pr.branch && pr.branch.includes(meta.item.id)))) {
1289
+ existingPrFound = true;
1290
+ break;
1291
+ }
1292
+ }
1293
+ }
1283
1294
  if (!existingPrFound) {
1284
1295
  let wiPath;
1285
1296
  if (meta.source === 'central-work-item' || meta.source === 'central-work-item-fanout') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.359",
3
+ "version": "0.1.361",
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"