@yemi33/minions 0.1.1790 → 0.1.1792

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,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.1792 (2026-05-08)
4
+
5
+ ### Fixes
6
+ - hide redundant PRD work item IDs (#2206)
7
+
8
+ ## 0.1.1791 (2026-05-08)
9
+
10
+ ### Features
11
+ - isolate pipeline read-only worktrees (#2204)
12
+
3
13
  ## 0.1.1790 (2026-05-08)
4
14
 
5
15
  ### Fixes
@@ -84,6 +84,14 @@ function _renderPrLink(pr, opts) {
84
84
  return '<a href="' + escHtml(pr.url || '#') + '" target="_blank" rel="noopener" onclick="event.stopPropagation()" style="font-size:' + size + ';color:' + statusColor + ';text-decoration:underline;cursor:pointer;margin-left:4px" title="' + escHtml((pr.title || '') + ' (' + (pr.status || 'active') + ')') + '">' + statusIcon + ' ' + escHtml(pr.id) + '</a>';
85
85
  }
86
86
 
87
+ function _renderPrdWorkItemIdBadge(workItemId, prdItemId, size, padding) {
88
+ const id = workItemId === undefined || workItemId === null ? '' : String(workItemId).trim();
89
+ const itemId = prdItemId === undefined || prdItemId === null ? '' : String(prdItemId).trim();
90
+ const fontSize = size || '9px';
91
+ const badgePadding = padding || '1px 5px';
92
+ return (!id || id === itemId) ? '' : '<span style="font-size:' + fontSize + ';color:var(--muted);background:var(--surface);padding:' + badgePadding + ';border-radius:3px;border:1px solid var(--border)" title="Work item: ' + escHtml(id) + '">' + escHtml(id) + '</span>';
93
+ }
94
+
87
95
  function renderPrdProgress(prog) {
88
96
  const el = document.getElementById('prd-progress-content');
89
97
  const countEl = document.getElementById('prd-progress-count');
@@ -153,7 +161,7 @@ function renderPrdProgress(prog) {
153
161
  return '<span style="font-size:9px;font-weight:700;padding:2px 6px;border-radius:3px;letter-spacing:0.5px;white-space:nowrap;' + style + '">' + label + '</span>';
154
162
  };
155
163
 
156
- // Build work item lookup: PRD item ID → work item info
164
+ // Build work item lookup by actual work item ID.
157
165
  const wiById = {};
158
166
  for (const w of (window._lastWorkItems || [])) {
159
167
  if (w.id) wiById[w.id] = w;
@@ -180,10 +188,10 @@ function renderPrdProgress(prog) {
180
188
  const iid = escHtml(i.id || '');
181
189
 
182
190
  // Linked work item info
183
- const wi = wiById[i.id];
191
+ const workItemId = i.workItemId || i._workItemId || i.work_item_id || i.id;
192
+ const wi = wiById[workItemId] || wiById[i.id];
184
193
  const wiAgent = wi?.dispatched_to ? (agentData.find(a => a.id === wi.dispatched_to) || {}) : null;
185
- 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) + '">' +
186
- escHtml(wi.id) + '</span>' : '';
194
+ const wiLabel = _renderPrdWorkItemIdBadge(wi ? wi.id : workItemId, i.id);
187
195
  const agentLabel = wiAgent ? '<span style="font-size:9px;color:var(--muted)" title="' + escHtml(wiAgent.name || wi.dispatched_to) + '">' +
188
196
  (wiAgent.emoji || '') + ' ' + escHtml(wiAgent.name || wi.dispatched_to) + '</span>' : '';
189
197
 
@@ -401,13 +409,14 @@ function renderPrdProgress(prog) {
401
409
  const borderColor = statusColor(i.status, i.id);
402
410
  const src = escHtml(i.source || '');
403
411
  const iid = escHtml(i.id || '');
404
- const agentId = wi[i.id]?.dispatched_to || '';
412
+ const workItemId = i.workItemId || i._workItemId || i.work_item_id || i.id;
413
+ const wiForCard = wi[workItemId] || wi[i.id];
414
+ const agentId = wiForCard?.dispatched_to || '';
405
415
  const agentInfo = agentId ? (agentData.find(a => a.id === agentId) || {}) : null;
406
416
  const agentDisplay = agentInfo ? (agentInfo.emoji || '') + ' ' + escHtml(agentInfo.name || agentId) : (agentId ? escHtml(agentId) : '');
407
417
  const deps = (i.depends_on || []).join(', ');
408
418
  const wipAnim = i.status === 'in-progress' ? 'animation:prdWipPulse 2s infinite;' : '';
409
- const wiForCard = wi[i.id];
410
- const wiIdBadge = wiForCard ? '<span style="font-size:8px;color:var(--muted);background:var(--surface);padding:1px 4px;border-radius:3px;border:1px solid var(--border)" title="Work item: ' + escHtml(wiForCard.id) + '">' + escHtml(wiForCard.id) + '</span>' : '';
419
+ const wiIdBadge = _renderPrdWorkItemIdBadge(wiForCard ? wiForCard.id : workItemId, i.id, '8px', '1px 4px');
411
420
  const isDoneCard = i.status === 'done' || (wiForCard && wiForCard.status === 'done');
412
421
  const reopenBtnGraph = isDoneCard
413
422
  ? '<span onclick="event.stopPropagation();prdItemReopen(\'' + src + '\',\'' + iid + '\')" style="font-size:8px;color:var(--blue);cursor:pointer;padding:1px 4px;background:rgba(56,139,253,0.1);border:1px solid rgba(56,139,253,0.3);border-radius:3px" title="Re-open: set to updated so engine re-dispatches on existing branch">re-open</span>'
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "runtime": "copilot",
3
3
  "models": null,
4
- "cachedAt": "2026-05-08T07:51:34.436Z"
4
+ "cachedAt": "2026-05-08T15:02:31.584Z"
5
5
  }
package/engine.js CHANGED
@@ -102,6 +102,11 @@ const mutatePullRequests = shared.mutatePullRequests;
102
102
  const withFileLock = shared.withFileLock;
103
103
 
104
104
  const CHECKPOINT_CAP_FAIL_REASON = 'Exceeded 3 checkpoint-resumes; manual intervention required';
105
+ const READ_ONLY_ROOT_TASK_TYPES = new Set(['meeting', 'ask', 'explore', 'plan-to-prd', 'plan']);
106
+
107
+ function isPipelineBranchName(branchName) {
108
+ return typeof branchName === 'string' && branchName.startsWith('pipeline/');
109
+ }
105
110
 
106
111
  // ─── Dispatch Management (extracted to engine/dispatch.js) ───────────────────
107
112
 
@@ -631,7 +636,7 @@ async function spawnAgent(dispatchItem, config) {
631
636
  // (orphan/timeout retry before first push) would otherwise emit a
632
637
  // "couldn't find remote ref" warn pair on every reuse.
633
638
  await syncReusedWorktree(rootDir, existingWt, branchName, _gitOpts);
634
- } else if (['meeting', 'ask', 'explore', 'plan-to-prd', 'plan'].includes(type)) {
639
+ } else if (READ_ONLY_ROOT_TASK_TYPES.has(type) && !isPipelineBranchName(branchName)) {
635
640
  // Read-only tasks — no worktree needed, run in rootDir
636
641
  log('info', `${type}: read-only task, no worktree needed — running in rootDir`);
637
642
  branchName = null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.1790",
3
+ "version": "0.1.1792",
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"