@yemi33/minions 0.1.681 → 0.1.683

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,10 +1,14 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.681 (2026-04-09)
3
+ ## 0.1.683 (2026-04-09)
4
4
 
5
5
  ### Features
6
6
  - horizontal node chain pipeline visualization (TDD)
7
7
 
8
+ ### Fixes
9
+ - search notes/archive for consolidated learnings in artifacts
10
+ - pipeline node chain overlap — truncate labels, remove old stageFlow
11
+
8
12
  ## 0.1.678 (2026-04-09)
9
13
 
10
14
  ### Fixes
@@ -196,8 +196,9 @@ function _buildNodeChain(stages, run, options) {
196
196
  if (i > 0) html += '<div class="pl-node-arrow">\u2192</div>';
197
197
 
198
198
  html += '<div class="pl-node">';
199
- html += '<div class="pl-node-box ' + cls + (isCondition ? ' condition' : '') + '" title="' + escHtml(s.id) + ': ' + st + '">';
200
- html += icon + ' ' + escHtml(s.title || s.id);
199
+ var label = compact ? (s.id || '').slice(0, 16) : (s.title || s.id || '').slice(0, 24);
200
+ html += '<div class="pl-node-box ' + cls + (isCondition ? ' condition' : '') + '" title="' + escHtml((s.title || s.id) + ': ' + st) + '">';
201
+ html += icon + ' ' + escHtml(label);
201
202
  if (isWait && s.duration) html += ' ' + escHtml(s.duration);
202
203
  html += '</div>';
203
204
 
@@ -299,7 +300,6 @@ function renderPipelines(pipelines) {
299
300
  (p.enabled === false ? '<span style="font-size:9px;color:var(--red)"' + (p._stopReason ? ' title="' + escHtml(p._stopReason) + '"' : '') + '>' + (p._stoppedBy ? 'AUTO-STOPPED' : 'DISABLED') + '</span>' : '') +
300
301
  '</div>' +
301
302
  '</div>' +
302
- '<div style="margin-top:6px;display:flex;gap:4px;align-items:center;flex-wrap:wrap">' + stageFlow + '</div>' +
303
303
  resourcesHtml +
304
304
  progressHtml +
305
305
  '</div>';
@@ -503,15 +503,17 @@ function viewAgentOutput(logPath) {
503
503
  }
504
504
 
505
505
  function openInboxNote(filename) {
506
- // Find in inboxData by filename, or open directly via fetch
507
- var idx = (inboxData || []).findIndex(function(item) { return item.name === filename; });
508
- if (idx >= 0) {
509
- openModal(idx);
510
- } else {
511
- // Fallback: switch to inbox page
512
- closeModal();
513
- switchPage('inbox');
514
- }
506
+ var isArchive = filename.startsWith('archive/');
507
+ var baseName = isArchive ? filename.replace('archive/', '') : filename;
508
+ // Try inbox first
509
+ var idx = (inboxData || []).findIndex(function(item) { return item.name === baseName; });
510
+ if (idx >= 0) { openModal(idx); return; }
511
+ // Archived or not found in inbox — show label indicating it was consolidated
512
+ document.getElementById('modal-title').textContent = baseName.replace(/\.md$/, '');
513
+ document.getElementById('modal-body').innerHTML = '<p style="color:var(--muted)">This note was consolidated into the Knowledge Base.' +
514
+ (isArchive ? ' <span style="font-size:10px">(archived: ' + escHtml(baseName) + ')</span>' : '') +
515
+ '</p><div style="margin-top:8px"><button class="pr-pager-btn" onclick="closeModal();switchPage(\'inbox\')">Go to Notes & KB</button></div>';
516
+ document.getElementById('modal').classList.add('open');
515
517
  }
516
518
 
517
519
  window.MinionsWork = { wiRow, renderWorkItems, editWorkItem, submitWorkItemEdit, deleteWorkItem, archiveWorkItem, toggleWorkItemArchive, retryWorkItem, wiPrev, wiNext, feedbackWorkItem, submitFeedback, openCreateWorkItemModal, openWorkItemDetail, openAllWorkItems, viewAgentOutput, openInboxNote };
@@ -192,9 +192,9 @@
192
192
  .pl-prog-seg.pending { background: transparent; }
193
193
  @keyframes plSegPulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
194
194
  .pl-progress-label { display: flex; gap: 8px; align-items: center; margin-top: 4px; font-size: 10px; }
195
- .pl-node-chain { display: flex; align-items: flex-start; gap: 0; overflow-x: auto; padding: 8px 0; }
196
- .pl-node { display: flex; flex-direction: column; align-items: center; min-width: 80px; max-width: 130px; }
197
- .pl-node-box { padding: 5px 10px; border-radius: 8px; border: 2px solid var(--border); background: var(--surface2); text-align: center; font-size: 11px; transition: border-color 0.2s; white-space: nowrap; }
195
+ .pl-node-chain { display: flex; align-items: flex-start; gap: 2px; overflow-x: auto; padding: 8px 0; }
196
+ .pl-node { display: flex; flex-direction: column; align-items: center; flex-shrink: 0; }
197
+ .pl-node-box { padding: 4px 8px; border-radius: 6px; border: 2px solid var(--border); background: var(--surface2); text-align: center; font-size: 10px; transition: border-color 0.2s; white-space: nowrap; }
198
198
  .pl-node-box.complete { border-color: var(--green); background: rgba(63,185,80,0.08); }
199
199
  .pl-node-box.running { border-color: var(--blue); animation: plSegPulse 1.5s ease-in-out infinite; }
200
200
  .pl-node-box.failed { border-color: var(--red); background: rgba(248,81,73,0.08); }
package/engine/queries.js CHANGED
@@ -719,6 +719,7 @@ function getWorkItems(config) {
719
719
  }
720
720
  const _agentDirCache = {};
721
721
  const _inboxFiles = safeReadDir(INBOX_DIR);
722
+ const _archiveFiles = safeReadDir(ARCHIVE_DIR);
722
723
  for (const item of allItems) {
723
724
  const arts = {};
724
725
  const agentId = item.dispatched_to || item.agent;
@@ -732,9 +733,12 @@ function getWorkItems(config) {
732
733
  const matchLog = _agentDirCache[agentId].find(f => f.includes(dispatchId));
733
734
  if (matchLog) arts.outputLog = agentId + '/' + matchLog;
734
735
  }
735
- // Inbox notes — match by agent ID + work item ID in filename
736
- const matchNotes = _inboxFiles.filter(f => f.includes(agentId) && f.includes(item.id || '___'));
737
- if (matchNotes.length > 0) arts.notes = matchNotes;
736
+ // Inbox + archive notes — match by agent ID + work item ID in filename
737
+ const itemId = item.id || '___';
738
+ const matchNotes = _inboxFiles.filter(f => f.includes(agentId) && f.includes(itemId));
739
+ const matchArchive = _archiveFiles.filter(f => f.includes(agentId) && f.includes(itemId));
740
+ const allNotes = [...matchNotes, ...matchArchive.map(f => 'archive/' + f)];
741
+ if (allNotes.length > 0) arts.notes = allNotes;
738
742
  }
739
743
  if (item.branch || item.featureBranch) arts.branch = item.branch || item.featureBranch;
740
744
  if (item.sourcePlan) arts.sourcePlan = item.sourcePlan;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.681",
3
+ "version": "0.1.683",
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"