@yemi33/minions 0.1.111 → 0.1.112

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,9 +1,17 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.111 (2026-04-01)
3
+ ## 0.1.112 (2026-04-01)
4
+
5
+ ### Engine
6
+ - engine/ado.js
7
+ - engine/github.js
8
+ - engine/lifecycle.js
4
9
 
5
10
  ### Dashboard
6
11
  - dashboard.js
12
+ - dashboard/js/live-stream.js
13
+ - dashboard/js/modal-qa.js
14
+ - dashboard/js/utils.js
7
15
 
8
16
  ## 0.1.110 (2026-04-01)
9
17
 
@@ -19,7 +19,7 @@ function renderLiveChatMessage(raw) {
19
19
  if (block.type === 'tool_use') {
20
20
  el.innerHTML += '<div style="background:var(--surface);border:1px solid var(--border);padding:4px 8px;border-radius:4px;margin:2px 0;font-size:10px;color:var(--muted);cursor:pointer" onclick="this.nextElementSibling.style.display=this.nextElementSibling.style.display===\'none\'?\'block\':\'none\'">' +
21
21
  '\u{1F527} ' + escHtml(block.name || 'tool') + '</div>' +
22
- '<div style="display:none;background:var(--bg);padding:4px 8px;border-radius:4px;margin:0 0 4px;font-size:10px;font-family:monospace;white-space:pre-wrap;max-height:200px;overflow-y:auto;color:var(--muted)">' + escHtml(JSON.stringify(block.input, null, 2).slice(0, 500)) + '</div>';
22
+ '<div style="display:none;background:var(--bg);padding:4px 8px;border-radius:4px;margin:0 0 4px;font-size:10px;font-family:monospace;white-space:pre-wrap;max-height:200px;overflow-y:auto;color:var(--muted)">' + escHtml(JSON.stringify(block.input || {}, null, 2).slice(0, 500)) + '</div>';
23
23
  }
24
24
  }
25
25
  }
@@ -227,8 +227,8 @@ async function _processQaMessage(message, selection) {
227
227
  _modalDocContext.content = display;
228
228
  }
229
229
 
230
- // If editing paused an active PRD, show re-execute actions
231
- if (data.pausedPrd && capturedFilePath) {
230
+ // If editing paused an active PRD, show re-execute actions (only for plan .md files)
231
+ if (data.pausedPrd && capturedFilePath && /^plans\/.*\.md$/.test(capturedFilePath)) {
232
232
  const planFile = capturedFilePath.replace(/^plans\//, '');
233
233
  const esc = planFile.replace(/'/g, "\\'");
234
234
  const actionDiv = document.createElement('div');
@@ -67,7 +67,10 @@ function renderMd(s) {
67
67
  html = html.replace(/(?<!\w)\*([^*\n]+)\*(?!\w)/g, '<em>$1</em>');
68
68
  html = html.replace(/(?<!\w)_([^_\n]+)_(?!\w)/g, '<em>$1</em>');
69
69
  html = html.replace(/~~(.+?)~~/g, '<s>$1</s>');
70
- html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank" style="color:var(--blue)">$1</a>');
70
+ html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, function(_, text, href) {
71
+ if (/^(javascript|data|vbscript):/i.test(href)) return text;
72
+ return '<a href="' + href + '" target="_blank" rel="noopener" style="color:var(--blue)">' + text + '</a>';
73
+ });
71
74
 
72
75
  // 3. Block-level processing (line by line)
73
76
  var lines = html.split('\n');
package/dashboard.js CHANGED
@@ -1454,7 +1454,7 @@ const server = http.createServer(async (req, res) => {
1454
1454
  }
1455
1455
 
1456
1456
  const { callLLM, trackEngineUsage } = require('./engine/llm');
1457
- const BATCH_SIZE = 80; // ~80 entries per batch to stay within Haiku context
1457
+ const BATCH_SIZE = 30; // ~30 entries per batch to stay within Haiku context
1458
1458
  const batches = [];
1459
1459
  for (let i = 0; i < manifest.length; i += BATCH_SIZE) {
1460
1460
  batches.push(manifest.slice(i, i + BATCH_SIZE));
@@ -1468,10 +1468,7 @@ const server = http.createServer(async (req, res) => {
1468
1468
 
1469
1469
  ## Entries
1470
1470
 
1471
- ${batch.map((m, i) => `<entry index="${offset + i}" category="${m.category}" file="${m.file}" date="${m.date}" agent="${m.agent || 'unknown'}">
1472
- ${m.title}
1473
- ${m.content.slice(0, 800)}
1474
- </entry>`).join('\n\n')}
1471
+ ${batch.map((m, i) => `[${offset + i}] ${m.category}/${m.file} | ${m.title} | ${m.date} | ${m.agent || '?'} | ${(m.content || '').slice(0, 200).replace(/\n/g, ' ')}`).join('\n')}
1475
1472
 
1476
1473
  ## Instructions
1477
1474
 
package/engine/ado.js CHANGED
@@ -389,7 +389,19 @@ async function reconcilePrs(config) {
389
389
  e.log('info', `PR reconciliation: added ${prId} (branch: ${branch}${confirmedItemId ? ', linked to ' + confirmedItemId : ''}) to ${project.name}`);
390
390
  }
391
391
 
392
- if (projectAdded > 0 || projectUpdated > 0) {
392
+ // Backfill prdItems from pr-links for any PR with empty array
393
+ const prLinks = shared.getPrLinks();
394
+ let backfilled = 0;
395
+ for (const pr of existingPrs) {
396
+ const linked = prLinks[pr.id];
397
+ if (linked && !(pr.prdItems || []).includes(linked)) {
398
+ pr.prdItems = Array.isArray(pr.prdItems) ? pr.prdItems : [];
399
+ pr.prdItems.push(linked);
400
+ backfilled++;
401
+ }
402
+ }
403
+
404
+ if (projectAdded > 0 || projectUpdated > 0 || backfilled > 0) {
393
405
  shared.safeWrite(prPath, existingPrs);
394
406
  totalAdded += projectAdded;
395
407
  if (projectUpdated > 0) e.log('info', `PR reconciliation: linked ${projectUpdated} existing PR(s) to PRD items in ${project.name}`);
package/engine/github.js CHANGED
@@ -376,7 +376,19 @@ async function reconcilePrs(config) {
376
376
  e.log('info', `GitHub PR reconciliation: added ${prId} (branch: ${branch}${confirmedItemId ? ', linked to ' + confirmedItemId : ''}) to ${project.name}`);
377
377
  }
378
378
 
379
- if (projectAdded > 0) {
379
+ // Backfill prdItems from pr-links for any PR with empty array
380
+ const prLinks = getPrLinks();
381
+ let backfilled = 0;
382
+ for (const pr of existingPrs) {
383
+ const linked = prLinks[pr.id];
384
+ if (linked && !(pr.prdItems || []).includes(linked)) {
385
+ pr.prdItems = Array.isArray(pr.prdItems) ? pr.prdItems : [];
386
+ pr.prdItems.push(linked);
387
+ backfilled++;
388
+ }
389
+ }
390
+
391
+ if (projectAdded > 0 || backfilled > 0) {
380
392
  safeWrite(prPath, existingPrs);
381
393
  totalAdded += projectAdded;
382
394
  }
@@ -724,6 +724,9 @@ async function handlePostMerge(pr, project, config, newStatus) {
724
724
 
725
725
  if (newStatus !== 'merged') return;
726
726
 
727
+ // Mark review as approved since it was merged
728
+ pr.reviewStatus = 'approved';
729
+
727
730
  // Resolve linked work item from pr-links or PR branch name
728
731
  let mergedItemId = getPrLinks()[pr.id];
729
732
  if (!mergedItemId && pr.branch) {
@@ -761,7 +764,7 @@ async function handlePostMerge(pr, project, config, newStatus) {
761
764
  if (item && item.status !== 'done') {
762
765
  log('info', `Post-merge: marking work item ${mergedItemId} as done (was ${item.status}) for ${pr.id}`);
763
766
  item.status = 'done';
764
- item.completedAt = e.ts();
767
+ item.completedAt = ts();
765
768
  item._mergedVia = pr.id;
766
769
  shared.safeWrite(wiPath, items);
767
770
  break;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.111",
3
+ "version": "0.1.112",
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"