@yemi33/minions 0.1.905 → 0.1.907
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 +3 -1
- package/dashboard/js/render-prd.js +10 -10
- package/dashboard/styles.css +3 -3
- package/engine/queries.js +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.907 (2026-04-13)
|
|
4
4
|
|
|
5
5
|
### Features
|
|
6
|
+
- add weekly dead code & deprecated cleanup pipeline
|
|
6
7
|
- add red dot notification on CC tab when response completes (#934) (#946)
|
|
7
8
|
|
|
8
9
|
### Fixes
|
|
10
|
+
- PRD item display dispatched/in-progress status conflation (closes #950) (#955)
|
|
9
11
|
- remove KB watchdog — checkpoint never written, restore never worked
|
|
10
12
|
- make KB sweep endpoint async with status polling (#933)
|
|
11
13
|
- prohibit agents from self-merging their own PRs
|
|
@@ -92,7 +92,7 @@ function renderPrdProgress(prog) {
|
|
|
92
92
|
const total = items.length;
|
|
93
93
|
if (total === 0) return '';
|
|
94
94
|
const done = items.filter(i => i.status === 'done').length;
|
|
95
|
-
const inProgress = items.filter(i => i.status === '
|
|
95
|
+
const inProgress = items.filter(i => i.status === 'in-progress').length;
|
|
96
96
|
const failed = items.filter(i => i.status === 'failed').length;
|
|
97
97
|
const paused = items.filter(i => i.status === 'paused').length;
|
|
98
98
|
const updated = items.filter(i => i.status === 'updated').length;
|
|
@@ -111,7 +111,7 @@ function renderPrdProgress(prog) {
|
|
|
111
111
|
|
|
112
112
|
const bar = '<div class="prd-progress-bar">' +
|
|
113
113
|
'<div class="seg complete" style="width:' + pct(done) + '%"></div>' +
|
|
114
|
-
'<div class="seg
|
|
114
|
+
'<div class="seg in-progress" style="width:' + pct(inProgress) + '%"></div>' +
|
|
115
115
|
'<div class="seg updated" style="width:' + pct(updated) + '%"></div>' +
|
|
116
116
|
'<div class="seg paused" style="width:' + pct(paused) + '%"></div>' +
|
|
117
117
|
'<div class="seg missing" style="width:' + pct(missing) + '%"></div>' +
|
|
@@ -120,23 +120,23 @@ function renderPrdProgress(prog) {
|
|
|
120
120
|
return '<div style="margin:6px 0 8px 0;padding:0 8px">' + stats + '<div style="margin-top:8px">' + bar + '</div></div>';
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
// PRD item statuses: missing →
|
|
123
|
+
// PRD item statuses: missing → in-progress → done
|
|
124
124
|
const statusBadge = (s, itemId) => {
|
|
125
125
|
// Decomposed: show WIP if children still running, DONE if all children done
|
|
126
126
|
if (s === 'decomposed' && itemId) {
|
|
127
127
|
const children = (window._lastWorkItems || []).filter(w => w.parent_id === itemId);
|
|
128
128
|
const allChildrenDone = children.length > 0 && children.every(c => c.status === 'done');
|
|
129
129
|
if (allChildrenDone) { s = 'done'; }
|
|
130
|
-
else { s = '
|
|
130
|
+
else { s = 'in-progress'; } // show as WIP while children are running
|
|
131
131
|
}
|
|
132
132
|
const styles = {
|
|
133
133
|
'done': 'background:rgba(63,185,80,0.15);color:var(--green)',
|
|
134
|
-
'
|
|
134
|
+
'in-progress': 'background:rgba(210,153,34,0.15);color:var(--yellow);animation:wipPulse 1.5s infinite',
|
|
135
135
|
'failed': 'background:rgba(248,81,73,0.15);color:var(--red)',
|
|
136
136
|
'paused': 'background:rgba(139,148,158,0.15);color:var(--muted)',
|
|
137
137
|
'updated': 'background:rgba(188,140,255,0.15);color:var(--purple)',
|
|
138
138
|
};
|
|
139
|
-
const labels = { 'done': 'DONE', '
|
|
139
|
+
const labels = { 'done': 'DONE', 'in-progress': 'WIP', 'failed': 'FAIL', 'paused': 'PAUSED', 'missing': '\u2014', 'updated': 'REDO' };
|
|
140
140
|
const style = styles[s] || 'background:var(--surface);color:var(--muted)';
|
|
141
141
|
const label = labels[s] || '—';
|
|
142
142
|
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>';
|
|
@@ -253,7 +253,7 @@ function renderPrdProgress(prog) {
|
|
|
253
253
|
|
|
254
254
|
const renderGroupHeader = (g) => {
|
|
255
255
|
const done = g.items.filter(i => i.status === 'done').length;
|
|
256
|
-
const wip = g.items.filter(i => i.status === '
|
|
256
|
+
const wip = g.items.filter(i => i.status === 'in-progress' || i.status === 'missing').length;
|
|
257
257
|
const summary = (g.summary || '').replace(/^Convert plan to PRD:\s*/i, '').slice(0, 80);
|
|
258
258
|
const isAwaitingApproval = g.planStatus === 'awaiting-approval';
|
|
259
259
|
const isPaused = g.planStatus === 'paused';
|
|
@@ -372,7 +372,7 @@ function renderPrdProgress(prog) {
|
|
|
372
372
|
return 'var(--yellow)'; // children still running
|
|
373
373
|
}
|
|
374
374
|
if (s === 'done') return 'var(--green)';
|
|
375
|
-
if (s === '
|
|
375
|
+
if (s === 'in-progress') return 'var(--yellow)';
|
|
376
376
|
if (s === 'failed') return 'var(--red)';
|
|
377
377
|
if (s === 'updated') return 'var(--purple)';
|
|
378
378
|
if (s === 'paused') return 'var(--muted)';
|
|
@@ -394,7 +394,7 @@ function renderPrdProgress(prog) {
|
|
|
394
394
|
const agentInfo = agentId ? (agentData.find(a => a.id === agentId) || {}) : null;
|
|
395
395
|
const agentDisplay = agentInfo ? (agentInfo.emoji || '') + ' ' + escHtml(agentInfo.name || agentId) : (agentId ? escHtml(agentId) : '');
|
|
396
396
|
const deps = (i.depends_on || []).join(', ');
|
|
397
|
-
const wipAnim = i.status === '
|
|
397
|
+
const wipAnim = i.status === 'in-progress' ? 'animation:prdWipPulse 2s infinite;' : '';
|
|
398
398
|
html += '<div onclick="prdItemEdit(\'' + src + '\',\'' + iid + '\')" ' +
|
|
399
399
|
'style="background:var(--surface2);border:1px solid var(--border);border-left:3px solid ' + borderColor + ';' + wipAnim +
|
|
400
400
|
'border-radius:4px;padding:6px 8px;margin-bottom:6px;cursor:pointer;font-size:11px">' +
|
|
@@ -658,7 +658,7 @@ async function prdItemEdit(source, itemId) {
|
|
|
658
658
|
let completionHtml = '';
|
|
659
659
|
const isDone = item.status === 'done';
|
|
660
660
|
const isFailed = item.status === 'failed';
|
|
661
|
-
const isActive = item.status === '
|
|
661
|
+
const isActive = item.status === 'in-progress' || item.status === 'missing';
|
|
662
662
|
|
|
663
663
|
if (isDone || isFailed || isActive) {
|
|
664
664
|
const agent = wi?.dispatched_to || completedEntry?.agent || '';
|
package/dashboard/styles.css
CHANGED
|
@@ -170,7 +170,7 @@
|
|
|
170
170
|
.prd-progress-bar { width: 100%; height: 20px; background: var(--bg); border-radius: var(--radius-xl); overflow: hidden; display: flex; margin-bottom: var(--space-6); border: 1px solid var(--border); }
|
|
171
171
|
.prd-progress-bar .seg { height: 100%; transition: width 0.5s ease; }
|
|
172
172
|
.prd-progress-bar .seg.complete { background: var(--green); }
|
|
173
|
-
.prd-progress-bar .seg.
|
|
173
|
+
.prd-progress-bar .seg.in-progress { background: var(--yellow); }
|
|
174
174
|
.prd-progress-bar .seg.updated { background: var(--purple); }
|
|
175
175
|
.prd-progress-bar .seg.paused { background: var(--muted); opacity: 0.5; }
|
|
176
176
|
.prd-progress-bar .seg.missing { background: var(--border); }
|
|
@@ -179,7 +179,7 @@
|
|
|
179
179
|
.prd-legend-item { display: flex; align-items: center; gap: 5px; font-size: var(--text-base); color: var(--muted); }
|
|
180
180
|
.prd-legend-dot { width: 10px; height: 10px; border-radius: 2px; }
|
|
181
181
|
.prd-legend-dot.complete { background: var(--green); }
|
|
182
|
-
.prd-legend-dot.
|
|
182
|
+
.prd-legend-dot.in-progress { background: var(--yellow); }
|
|
183
183
|
.prd-legend-dot.updated { background: var(--purple); }
|
|
184
184
|
.prd-legend-dot.missing { background: var(--border); }
|
|
185
185
|
|
|
@@ -210,7 +210,7 @@
|
|
|
210
210
|
.prd-items-list { display: flex; flex-direction: column; gap: 3px; max-height: 400px; overflow-y: auto; padding: 0 8px; }
|
|
211
211
|
.prd-item-row { display: flex; align-items: center; gap: 8px; padding: 4px 8px; border-radius: var(--radius-sm); font-size: var(--text-base); background: var(--surface2); border: 1px solid var(--border); border-left: 3px solid var(--border); }
|
|
212
212
|
.prd-item-row.st-done { border-left-color: var(--green); }
|
|
213
|
-
.prd-item-row.st-
|
|
213
|
+
.prd-item-row.st-in-progress { border-left-color: var(--yellow); animation: prdWipPulse 2s infinite; }
|
|
214
214
|
@keyframes prdWipPulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(210,153,34,0); } 50% { box-shadow: 0 0 0 4px rgba(210,153,34,0.2); } }
|
|
215
215
|
.prd-item-row.st-failed { border-left-color: var(--red); }
|
|
216
216
|
.prd-item-row.st-needs-human-review { border-left-color: var(--orange); }
|
package/engine/queries.js
CHANGED
|
@@ -952,7 +952,7 @@ function getPrdInfo(config) {
|
|
|
952
952
|
// PRD JSON status is the source of truth — kept in sync with work item by syncPrdItemStatus.
|
|
953
953
|
// Map from PRD JSON values to display values (pending → missing for undispatched items)
|
|
954
954
|
// Augment each item with execution metadata from the work item.
|
|
955
|
-
const statusDisplay = { pending: 'missing' };
|
|
955
|
+
const statusDisplay = { pending: 'missing', dispatched: 'in-progress' };
|
|
956
956
|
for (const item of items) {
|
|
957
957
|
const wi = wiById[item.id];
|
|
958
958
|
// PRD 'updated'/'missing' = intentional rework signal — takes priority over a done work item (#930).
|
|
@@ -973,7 +973,7 @@ function getPrdInfo(config) {
|
|
|
973
973
|
const byStatus = {};
|
|
974
974
|
items.forEach(item => { const s = item.status || 'missing'; byStatus[s] = byStatus[s] || []; byStatus[s].push(item); });
|
|
975
975
|
const complete = (byStatus['done'] || []).length + (byStatus['decomposed'] || []).length;
|
|
976
|
-
const inProgress = (byStatus['
|
|
976
|
+
const inProgress = (byStatus['in-progress'] || []).length;
|
|
977
977
|
const paused = (byStatus['paused'] || []).length;
|
|
978
978
|
const missing = (byStatus['missing'] || []).length;
|
|
979
979
|
const donePercent = total > 0 ? Math.round((complete / total) * 100) : 0;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.907",
|
|
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"
|