@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 +16 -0
- package/dashboard/js/refresh.js +22 -6
- package/dashboard/js/render-pipelines.js +2 -1
- package/dashboard/js/render-plans.js +1 -41
- package/dashboard/js/render-prd.js +1 -1
- package/engine/lifecycle.js +0 -1
- package/engine/shared.js +1 -2
- package/package.json +1 -1
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
|
package/dashboard/js/refresh.js
CHANGED
|
@@ -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.
|
|
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,
|
|
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 =
|
|
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
|
package/engine/lifecycle.js
CHANGED
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
|
-
|
|
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.
|
|
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"
|