@yemi33/minions 0.1.362 → 0.1.364
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 +7 -1
- package/dashboard/js/refresh.js +1 -1
- package/dashboard/js/render-prd.js +5 -5
- package/dashboard/js/state.js +1 -0
- package/dashboard-build.js +1 -1
- package/dashboard.js +5 -5
- package/engine.js +9 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.364 (2026-04-06)
|
|
4
|
+
|
|
5
|
+
### Fixes
|
|
6
|
+
- critical dashboard bugs — plan pause, PRD tautology, inbox null guard (#210)
|
|
7
|
+
|
|
8
|
+
## 0.1.363 (2026-04-06)
|
|
4
9
|
|
|
5
10
|
### Features
|
|
11
|
+
- fix 3 runtime bugs — fan-out branch, dispatch cleanup, pipelines page (#204)
|
|
6
12
|
- Null-safe safeJson wrappers + dashboard crash guards (#203)
|
|
7
13
|
- pipeline plan stage uses LLM to generate structured plan from meeting
|
|
8
14
|
- show 'Converting to PRD' status instead of 'In Progress' during plan conversion
|
package/dashboard/js/refresh.js
CHANGED
|
@@ -41,7 +41,7 @@ function _processStatusUpdate(data) {
|
|
|
41
41
|
renderAgents(data.agents);
|
|
42
42
|
renderPrdProgress(data.prdProgress);
|
|
43
43
|
_cachePrdItems(data.prdProgress);
|
|
44
|
-
renderInbox(data.inbox);
|
|
44
|
+
renderInbox(data.inbox || []);
|
|
45
45
|
cmdUpdateAgentList(data.agents);
|
|
46
46
|
cmdUpdateProjectList(data.projects || []);
|
|
47
47
|
renderNotes(data.notes);
|
|
@@ -200,7 +200,7 @@ function renderPrdProgress(prog) {
|
|
|
200
200
|
|
|
201
201
|
const renderGroupHeader = (g) => {
|
|
202
202
|
const done = g.items.filter(i => i.status === 'done').length;
|
|
203
|
-
const wip = g.items.filter(i => i.status === 'dispatched' || i.status === '
|
|
203
|
+
const wip = g.items.filter(i => i.status === 'dispatched' || i.status === 'pending').length;
|
|
204
204
|
const summary = (g.summary || '').replace(/^Convert plan to PRD:\s*/i, '').slice(0, 80);
|
|
205
205
|
const isAwaitingApproval = g.planStatus === 'awaiting-approval';
|
|
206
206
|
const isPaused = g.planStatus === 'paused';
|
|
@@ -564,7 +564,7 @@ async function prdItemEdit(source, itemId) {
|
|
|
564
564
|
let completionHtml = '';
|
|
565
565
|
const isDone = item.status === 'done';
|
|
566
566
|
const isFailed = item.status === 'failed';
|
|
567
|
-
const isActive = item.status === 'dispatched' || item.status === '
|
|
567
|
+
const isActive = item.status === 'dispatched' || item.status === 'pending';
|
|
568
568
|
|
|
569
569
|
if (isDone || isFailed || isActive) {
|
|
570
570
|
const agent = wi?.dispatched_to || completedEntry?.agent || '';
|
|
@@ -604,9 +604,9 @@ async function prdItemEdit(source, itemId) {
|
|
|
604
604
|
'</select></div>' +
|
|
605
605
|
'<div><label style="font-size:11px;color:var(--muted);display:block;margin-bottom:4px">Complexity</label>' +
|
|
606
606
|
'<select id="prd-edit-complexity" style="padding:4px 8px;background:var(--surface);border:1px solid var(--border);border-radius:4px;color:var(--text)">' +
|
|
607
|
-
'<option value="small"' + (item.complexity === 'small' ? ' selected' : '') + '>Small</option>' +
|
|
608
|
-
'<option value="medium"' + (item.complexity === 'medium' ? ' selected' : '') + '>Medium</option>' +
|
|
609
|
-
'<option value="large"' + (item.complexity === 'large' ? ' selected' : '') + '>Large</option>' +
|
|
607
|
+
'<option value="small"' + ((item.estimated_complexity || item.complexity) === 'small' ? ' selected' : '') + '>Small</option>' +
|
|
608
|
+
'<option value="medium"' + ((item.estimated_complexity || item.complexity) === 'medium' ? ' selected' : '') + '>Medium</option>' +
|
|
609
|
+
'<option value="large"' + ((item.estimated_complexity || item.complexity) === 'large' ? ' selected' : '') + '>Large</option>' +
|
|
610
610
|
'</select></div>' +
|
|
611
611
|
'</div>' +
|
|
612
612
|
'<div style="display:flex;gap:8px">' +
|
package/dashboard/js/state.js
CHANGED
|
@@ -89,6 +89,7 @@ function prunePrdRequeueState(workItems) {
|
|
|
89
89
|
|
|
90
90
|
function rerenderPrdFromCache() {
|
|
91
91
|
if (!window._lastStatus || !window._lastStatus.prdProgress) return;
|
|
92
|
+
renderPrdProgress(window._lastStatus.prdProgress);
|
|
92
93
|
renderPrd(window._lastStatus.prd, window._lastStatus.prdProgress);
|
|
93
94
|
}
|
|
94
95
|
|
package/dashboard-build.js
CHANGED
|
@@ -20,7 +20,7 @@ function buildDashboardHtml() {
|
|
|
20
20
|
const layout = safeRead(layoutPath);
|
|
21
21
|
const css = safeRead(path.join(dashDir, 'styles.css'));
|
|
22
22
|
|
|
23
|
-
const pages = ['home', 'work', 'prs', 'plans', 'inbox', 'tools', 'schedule', 'meetings', 'engine'];
|
|
23
|
+
const pages = ['home', 'work', 'prs', 'plans', 'inbox', 'tools', 'schedule', 'pipelines', 'meetings', 'engine'];
|
|
24
24
|
let pageHtml = '';
|
|
25
25
|
for (const p of pages) {
|
|
26
26
|
const content = safeRead(path.join(dashDir, 'pages', p + '.html'));
|
package/dashboard.js
CHANGED
|
@@ -1898,9 +1898,9 @@ If nothing to do: { "duplicates": [], "reclassify": [], "remove": [] }`;
|
|
|
1898
1898
|
}
|
|
1899
1899
|
}
|
|
1900
1900
|
|
|
1901
|
-
if (w.status !== '
|
|
1902
|
-
w.status = '
|
|
1903
|
-
|
|
1901
|
+
if (w.status !== 'paused') reset++;
|
|
1902
|
+
w.status = 'paused';
|
|
1903
|
+
w._pausedBy = 'prd-pause';
|
|
1904
1904
|
delete w._resumedAt;
|
|
1905
1905
|
delete w.dispatched_at;
|
|
1906
1906
|
delete w.dispatched_to;
|
|
@@ -3202,8 +3202,8 @@ What would you like to discuss or change? When you're happy, say "approve" and I
|
|
|
3202
3202
|
const config = queries.getConfig();
|
|
3203
3203
|
const routing = safeRead(path.join(MINIONS_DIR, 'routing.md')) || '';
|
|
3204
3204
|
return jsonReply(res, 200, {
|
|
3205
|
-
engine: config.engine || {},
|
|
3206
|
-
claude: config.claude || {},
|
|
3205
|
+
engine: { ...shared.ENGINE_DEFAULTS, ...(config.engine || {}) },
|
|
3206
|
+
claude: { ...shared.DEFAULT_CLAUDE, ...(config.claude || {}) },
|
|
3207
3207
|
agents: config.agents || {},
|
|
3208
3208
|
routing,
|
|
3209
3209
|
});
|
package/engine.js
CHANGED
|
@@ -356,14 +356,13 @@ function spawnAgent(dispatchItem, config) {
|
|
|
356
356
|
const existingWtPath = findExistingWorktree(rootDir, branchName);
|
|
357
357
|
if (existingWtPath && fs.existsSync(existingWtPath)) {
|
|
358
358
|
// Bug fix: read dispatch under file lock so check-and-act is atomic
|
|
359
|
-
// Uses withFileLock directly (read-only) — no unnecessary disk write
|
|
360
359
|
let activelyUsed = false;
|
|
361
|
-
|
|
362
|
-
const dp = safeJson(DISPATCH_PATH) || {};
|
|
360
|
+
mutateDispatch((dp) => {
|
|
363
361
|
activelyUsed = (dp.active || []).some(d => {
|
|
364
362
|
const dBranch = d.meta?.branch ? sanitizeBranch(d.meta.branch) : '';
|
|
365
363
|
return dBranch === branchName && d.id !== id;
|
|
366
364
|
});
|
|
365
|
+
return dp;
|
|
367
366
|
});
|
|
368
367
|
if (activelyUsed) {
|
|
369
368
|
log('warn', `Branch ${branchName} actively used by another agent at ${existingWtPath} — cannot create worktree`);
|
|
@@ -910,7 +909,12 @@ function autoCleanPrdWorkItems(prdFile, config) {
|
|
|
910
909
|
}
|
|
911
910
|
if (deletedIds.length > 0) {
|
|
912
911
|
const deletedSet = new Set(deletedIds);
|
|
913
|
-
|
|
912
|
+
mutateDispatch((dispatch) => {
|
|
913
|
+
const pred = d => deletedSet.has(d.meta?.item?.id) && d.meta?.item?.sourcePlan === prdFile;
|
|
914
|
+
dispatch.pending = dispatch.pending.filter(d => !pred(d));
|
|
915
|
+
dispatch.active = dispatch.active.filter(d => !pred(d));
|
|
916
|
+
return dispatch;
|
|
917
|
+
});
|
|
914
918
|
log('info', `Plan sync: cleared ${deletedIds.length} pending/failed work items for ${prdFile}`);
|
|
915
919
|
}
|
|
916
920
|
}
|
|
@@ -1863,7 +1867,7 @@ function discoverCentralWorkItems(config) {
|
|
|
1863
1867
|
prompt,
|
|
1864
1868
|
meta: {
|
|
1865
1869
|
dispatchKey: fanKey, source: 'central-work-item-fanout', item, parentKey: key,
|
|
1866
|
-
branch: `fan/${item.id}/${
|
|
1870
|
+
branch: `fan/${item.id}/${agent.id}`,
|
|
1867
1871
|
deadline: item.timeout ? Date.now() + item.timeout : Date.now() + (config.engine?.fanOutTimeout || config.engine?.agentTimeout || DEFAULTS.agentTimeout)
|
|
1868
1872
|
}
|
|
1869
1873
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.364",
|
|
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"
|