@yemi33/minions 0.1.172 → 0.1.174

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,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.174 (2026-04-02)
4
+
5
+ ### Dashboard
6
+ - dashboard/js/refresh.js
7
+
8
+ ## 0.1.173 (2026-04-02)
9
+
10
+ ### Engine
11
+ - engine/lifecycle.js
12
+ - engine/shared.js
13
+
14
+ ### Dashboard
15
+ - dashboard/js/render-pipelines.js
16
+ - dashboard/js/render-plans.js
17
+ - dashboard/js/render-prd.js
18
+
3
19
  ## 0.1.171 (2026-04-02)
4
20
 
5
21
  ### Dashboard
@@ -6,21 +6,37 @@ let _prevEngineAlert = false;
6
6
  function _detectPageChanges(data) {
7
7
  const counts = {
8
8
  completions: (data.dispatch?.completed || []).length,
9
+ activeDispatches: (data.dispatch?.active || []).length,
9
10
  workDone: (data.workItems || []).filter(w => w.status === 'done' || w.status === 'failed').length,
10
11
  workTotal: (data.workItems || []).length,
12
+ workDispatched: (data.workItems || []).filter(w => w.status === 'dispatched').length,
11
13
  prdComplete: data.prdProgress?.complete || 0,
14
+ prdInProgress: data.prdProgress?.inProgress || 0,
15
+ plansTotal: (data.plans || []).length,
16
+ prsTotal: (data.pullRequests || []).length,
12
17
  prsMerged: (data.pullRequests || []).filter(p => p.status === 'merged').length,
18
+ prsReviewed: (data.pullRequests || []).filter(p => p.reviewStatus === 'approved' || p.reviewStatus === 'changes-requested').length,
13
19
  inbox: (data.inbox?.items || []).length,
20
+ kbTotal: Object.values(data.knowledgeBase || {}).reduce((s, v) => s + (Array.isArray(v) ? v.length : 0), 0),
21
+ skillsTotal: (data.skills || []).length,
22
+ mcpTotal: (data.mcpServers || []).length,
23
+ scheduleTotal: (data.schedules || []).length,
24
+ pipelineRuns: (data.pipelines || []).reduce((s, p) => s + (p.runs || []).length, 0),
25
+ pipelineActive: (data.pipelines || []).filter(p => (p.runs || []).some(r => r.status === 'running')).length,
14
26
  meetingRounds: (data.meetings || []).reduce((s, m) => s + (m.round || 0), 0),
27
+ meetingTotal: (data.meetings || []).length,
15
28
  };
16
29
  const changes = {};
17
30
  if (_prevCounts.completions !== undefined) {
18
- if (counts.completions > _prevCounts.completions) changes.home = true;
19
- if (counts.workDone > _prevCounts.workDone || counts.workTotal > _prevCounts.workTotal) changes.work = true;
20
- if (counts.prdComplete > _prevCounts.prdComplete) changes.plans = true;
21
- if (counts.prsMerged > _prevCounts.prsMerged) changes.prs = true;
22
- if (counts.inbox > _prevCounts.inbox) changes.inbox = true;
23
- if (counts.meetingRounds > _prevCounts.meetingRounds) changes.meetings = true;
31
+ if (counts.completions > _prevCounts.completions || counts.activeDispatches > _prevCounts.activeDispatches) changes.home = true;
32
+ if (counts.workDone > _prevCounts.workDone || counts.workTotal > _prevCounts.workTotal || counts.workDispatched !== _prevCounts.workDispatched) changes.work = true;
33
+ if (counts.prdComplete > _prevCounts.prdComplete || counts.prdInProgress > _prevCounts.prdInProgress || counts.plansTotal > _prevCounts.plansTotal) changes.plans = true;
34
+ if (counts.prsTotal > _prevCounts.prsTotal || counts.prsMerged > _prevCounts.prsMerged || counts.prsReviewed > _prevCounts.prsReviewed) changes.prs = true;
35
+ if (counts.inbox > _prevCounts.inbox || counts.kbTotal > _prevCounts.kbTotal) changes.inbox = true;
36
+ if (counts.skillsTotal > _prevCounts.skillsTotal || counts.mcpTotal > _prevCounts.mcpTotal) changes.tools = true;
37
+ if (counts.scheduleTotal > _prevCounts.scheduleTotal) changes.schedule = true;
38
+ if (counts.pipelineRuns > _prevCounts.pipelineRuns || counts.pipelineActive > _prevCounts.pipelineActive) changes.pipelines = true;
39
+ if (counts.meetingRounds > _prevCounts.meetingRounds || counts.meetingTotal > _prevCounts.meetingTotal) changes.meetings = true;
24
40
  }
25
41
  _prevCounts = counts;
26
42
 
@@ -65,7 +65,8 @@ function _collectRunArtifacts(run) {
65
65
  }
66
66
 
67
67
  function renderPipelines(pipelines) {
68
- _pipelinesData = pipelines || [];
68
+ _pipelinesData = (pipelines || []).filter(function(p) { return !isDeleted('pipeline:' + p.id); });
69
+ pipelines = _pipelinesData;
69
70
  const el = document.getElementById('pipelines-content');
70
71
  const countEl = document.getElementById('pipelines-count');
71
72
  if (!el) return;
@@ -303,46 +303,6 @@ function openArchivedPlansModal() {
303
303
  }
304
304
 
305
305
  // Disable all PRD action buttons to prevent double-clicks
306
- function qaDisablePrdButtons() {
307
- const container = document.getElementById('qa-generate-prd-btn');
308
- if (container) container.querySelectorAll('button').forEach(b => { b.disabled = true; b.style.opacity = '0.5'; });
309
- }
310
-
311
- // Show plan version action buttons (Run alongside / Replace / Just save)
312
- function showPlanVersionActions(thread, newFile, originalFile) {
313
- const esc = newFile.replace(/'/g, "\\'");
314
- // Look up existing PRD for the original plan's project
315
- const allPlans = window._lastStatus?.plans || [];
316
- const origPlan = allPlans.find(p => p.file === originalFile);
317
- const project = origPlan?.project || '';
318
- const existingPrd = allPlans.find(p => p.file.endsWith('.json') && p.project === project && p.status !== 'completed');
319
-
320
- const btn = document.createElement('div');
321
- btn.id = 'qa-generate-prd-btn';
322
- btn.style.cssText = 'margin:8px 0;padding:8px 12px;background:rgba(63,185,80,0.1);border:1px solid rgba(63,185,80,0.3);border-radius:6px;display:flex;flex-wrap:wrap;align-items:center;gap:8px';
323
-
324
- if (existingPrd) {
325
- btn.innerHTML = '<span style="color:var(--green);font-weight:600;font-size:12px;width:100%">New plan version created — existing PRD running</span>' +
326
- '<button onclick="qaNewPrd(\'' + esc + '\')" style="background:var(--green);color:#fff;border:none;border-radius:4px;padding:4px 12px;font-size:11px;font-weight:600;cursor:pointer" title="Execute this plan as a separate PRD alongside the current one">Run alongside</button>' +
327
- '<button onclick="qaReplacePrd(\'' + esc + '\')" style="background:var(--orange);color:#fff;border:none;border-radius:4px;padding:4px 12px;font-size:11px;font-weight:600;cursor:pointer" title="Pause existing PRD, clean pending items, execute this plan instead">Replace old PRD</button>' +
328
- '<button onclick="qaJustSave(this)" style="background:var(--surface2);color:var(--text);border:1px solid var(--border);border-radius:4px;padding:4px 12px;font-size:11px;cursor:pointer" title="Keep the new version saved without dispatching any work">Just save</button>' +
329
- '<span style="color:var(--muted);font-size:10px;width:100%">Run alongside keeps current work going. Replace pauses it and starts fresh.</span>';
330
- } else {
331
- btn.innerHTML = '<span style="color:var(--green);font-weight:600;font-size:12px;width:100%">New plan version created</span>' +
332
- '<button onclick="qaNewPrd(\'' + esc + '\')" style="background:var(--green);color:#fff;border:none;border-radius:4px;padding:4px 12px;font-size:11px;font-weight:600;cursor:pointer">Execute plan</button>' +
333
- '<button onclick="qaJustSave(this)" style="background:var(--surface2);color:var(--text);border:1px solid var(--border);border-radius:4px;padding:4px 12px;font-size:11px;cursor:pointer">Just save</button>' +
334
- '<span style="color:var(--muted);font-size:10px">Execute dispatches an agent to create PRD items from this plan</span>';
335
- }
336
- // Remove any previous action buttons
337
- const old = thread.querySelector('#qa-generate-prd-btn');
338
- if (old) old.remove();
339
- thread.appendChild(btn);
340
- }
341
-
342
- function qaJustSave(el) {
343
- const container = el.closest('#qa-generate-prd-btn');
344
- if (container) container.innerHTML = '<span style="color:var(--muted);font-size:11px">Saved. No work dispatched.</span>';
345
- }
346
306
 
347
307
  async function planExecute(file, project, btn) {
348
308
  if (btn) { btn.textContent = 'Executing...'; btn.disabled = true; btn.style.color = 'var(--blue)'; }
@@ -734,4 +694,4 @@ async function planUnarchive(file, btn) {
734
694
  } catch (e) { resetBtn(); alert('Error: ' + e.message); }
735
695
  }
736
696
 
737
- window.MinionsPlans = { openCreatePlanModal, refreshPlans, derivePlanStatus, renderPlans, openArchivedPlansModal, qaDisablePrdButtons, showPlanVersionActions, qaJustSave, planExecute, planSubmitRevise, planShowRevise, planHideRevise, planView, planApprove, planArchive, planUnarchive, planDelete, planPause, planReject, planDiscuss, planOpenInDocChat, planRegeneratePRD, openVerifyGuide, triggerVerify };
697
+ window.MinionsPlans = { openCreatePlanModal, refreshPlans, derivePlanStatus, renderPlans, openArchivedPlansModal, planExecute, planSubmitRevise, planShowRevise, planHideRevise, planView, planApprove, planArchive, planUnarchive, planDelete, planPause, planReject, planDiscuss, planOpenInDocChat, planRegeneratePRD, openVerifyGuide, triggerVerify };
@@ -228,7 +228,7 @@ function renderPrdProgress(prog) {
228
228
  '<span onclick="event.stopPropagation();planView(\'' + escHtml(g.sourcePlan || g.file) + '\')" style="color:var(--blue);cursor:pointer;font-size:10px;padding:2px 8px;background:rgba(56,139,253,0.1);border:1px solid rgba(56,139,253,0.3);border-radius:4px" title="Review latest plan changes">Review plan</span>' +
229
229
  '</div>'
230
230
  : '';
231
- const isCompleted = (t && t.allDone) || (done > 0 && done === g.items.length);
231
+ const isCompleted = done > 0 && done === g.items.length;
232
232
  const pauseResumeBtn = isAwaitingApproval
233
233
  ? '<span onclick="event.stopPropagation();planApprove(\'' + escHtml(g.file) + '\',this)" style="color:var(--green);cursor:pointer;font-size:9px;padding:1px 6px;background:rgba(63,185,80,0.1);border:1px solid rgba(63,185,80,0.3);border-radius:3px">Approve</span>'
234
234
  : isPaused
@@ -1534,7 +1534,6 @@ module.exports = {
1534
1534
  updateWorkItemStatus,
1535
1535
  syncPrdItemStatus,
1536
1536
  syncPrsFromOutput,
1537
- resolveProjectForPr,
1538
1537
  updatePrAfterReview,
1539
1538
  updatePrAfterFix,
1540
1539
  handlePostMerge,
package/engine/shared.js CHANGED
@@ -7,7 +7,7 @@ const fs = require('fs');
7
7
  const path = require('path');
8
8
 
9
9
  const MINIONS_DIR = path.resolve(__dirname, '..');
10
- const PR_LINKS_PATH = path.join(MINIONS_DIR, 'engine', 'pr-links.json');
10
+ // PR_LINKS_PATH removed — PR linking uses PR.prdItems in pull-requests.json
11
11
  const LOG_PATH = path.join(__dirname, 'log.json');
12
12
 
13
13
  // ── Timestamps & Logging ────────────────────────────────────────────────────
@@ -571,7 +571,6 @@ function linkPrToItem(project, prId, itemId) {
571
571
 
572
572
  module.exports = {
573
573
  MINIONS_DIR,
574
- PR_LINKS_PATH,
575
574
  LOG_PATH,
576
575
  ts,
577
576
  logTs,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.172",
3
+ "version": "0.1.174",
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"