@yemi33/minions 0.1.355 → 0.1.357
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 +10 -0
- package/dashboard/js/render-plans.js +8 -6
- package/engine/spawn-agent.js +15 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.357 (2026-04-06)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
- show 'Converting to PRD' status instead of 'In Progress' during plan conversion
|
|
7
|
+
|
|
8
|
+
## 0.1.356 (2026-04-06)
|
|
9
|
+
|
|
10
|
+
### Fixes
|
|
11
|
+
- add MCP startup timeout — kill agent if no output after 3 minutes
|
|
12
|
+
|
|
3
13
|
## 0.1.355 (2026-04-06)
|
|
4
14
|
|
|
5
15
|
### Fixes
|
|
@@ -83,7 +83,8 @@ function derivePlanStatus(prdFile, mdFile, prdJsonStatus, workItems) {
|
|
|
83
83
|
|
|
84
84
|
// Derive from work item progress
|
|
85
85
|
if (allDone && !hasActiveWork) return 'completed';
|
|
86
|
-
if (hasActiveWork
|
|
86
|
+
if (hasActiveWork) return 'dispatched';
|
|
87
|
+
if (hasPendingPrd) return 'converting';
|
|
87
88
|
if (hasFailed && !hasActiveWork) return 'has-failures';
|
|
88
89
|
|
|
89
90
|
if (prdJsonStatus === 'awaiting-approval' && implementWi.length === 0) return 'awaiting-approval';
|
|
@@ -192,9 +193,10 @@ function renderPlans(plans) {
|
|
|
192
193
|
const effectiveStatus = isArchived ? 'completed' : derivePlanStatus(prdFile, p.file, prdJsonStatus, allWi);
|
|
193
194
|
|
|
194
195
|
const statusLabelsMap = {
|
|
195
|
-
'completed': 'Completed', 'dispatched': 'In Progress', '
|
|
196
|
-
'awaiting-approval': 'Awaiting Approval', 'approved': 'Approved',
|
|
197
|
-
'
|
|
196
|
+
'completed': 'Completed', 'dispatched': 'In Progress', 'converting': 'Converting to PRD',
|
|
197
|
+
'paused': 'Paused', 'awaiting-approval': 'Awaiting Approval', 'approved': 'Approved',
|
|
198
|
+
'rejected': 'Rejected', 'revision-requested': 'Revision Requested',
|
|
199
|
+
'has-failures': 'Has Failures', 'active': 'Active'
|
|
198
200
|
};
|
|
199
201
|
const label = statusLabelsMap[effectiveStatus] || effectiveStatus;
|
|
200
202
|
const needsAction = (effectiveStatus === 'awaiting-approval' || effectiveStatus === 'paused') && !isArchived;
|
|
@@ -246,8 +248,8 @@ function renderPlans(plans) {
|
|
|
246
248
|
'onclick="event.stopPropagation();planDelete(\'' + escHtml(p.file) + '\')">Delete</button>' : '';
|
|
247
249
|
|
|
248
250
|
const versionBadge = p.version ? ' <span style="font-size:9px;font-weight:700;padding:1px 5px;border-radius:3px;background:rgba(56,139,253,0.15);color:var(--blue);vertical-align:middle">v' + p.version + '</span>' : '';
|
|
249
|
-
const statusColors = { 'completed': 'var(--green)', 'dispatched': 'var(--blue)', 'paused': 'var(--muted)', 'awaiting-approval': 'var(--yellow)', 'approved': 'var(--green)', 'rejected': 'var(--red)', 'has-failures': 'var(--red)', 'revision-requested': 'var(--purple,#a855f7)', 'active': 'var(--muted)' };
|
|
250
|
-
const cardClass = effectiveStatus === 'dispatched' ? 'working' : effectiveStatus === 'awaiting-approval' || effectiveStatus === 'paused' ? 'awaiting' : effectiveStatus;
|
|
251
|
+
const statusColors = { 'completed': 'var(--green)', 'dispatched': 'var(--blue)', 'converting': 'var(--yellow)', 'paused': 'var(--muted)', 'awaiting-approval': 'var(--yellow)', 'approved': 'var(--green)', 'rejected': 'var(--red)', 'has-failures': 'var(--red)', 'revision-requested': 'var(--purple,#a855f7)', 'active': 'var(--muted)' };
|
|
252
|
+
const cardClass = effectiveStatus === 'dispatched' || effectiveStatus === 'converting' ? 'working' : effectiveStatus === 'awaiting-approval' || effectiveStatus === 'paused' ? 'awaiting' : effectiveStatus;
|
|
251
253
|
return '<div class="plan-card ' + cardClass + '" data-file="plans/' + escHtml(p.file) + '" style="cursor:pointer' + (isArchived ? ';opacity:0.7' : '') + '" onclick="planView(\'' + escHtml(p.file) + '\')">' +
|
|
252
254
|
'<div class="plan-card-header">' +
|
|
253
255
|
'<div><div class="plan-card-title">' + escHtml(p.summary || p.file) + versionBadge + '</div>' +
|
package/engine/spawn-agent.js
CHANGED
|
@@ -189,7 +189,22 @@ proc.stderr.on('data', (chunk) => {
|
|
|
189
189
|
// Pipe stdout to parent
|
|
190
190
|
proc.stdout.pipe(process.stdout);
|
|
191
191
|
|
|
192
|
+
// MCP startup timeout: kill if no stdout within 3 minutes (MCP servers downloading/starting)
|
|
193
|
+
const MCP_STARTUP_TIMEOUT = 180000; // 3 minutes
|
|
194
|
+
let gotFirstOutput = false;
|
|
195
|
+
const startupTimer = setTimeout(() => {
|
|
196
|
+
if (!gotFirstOutput) {
|
|
197
|
+
const msg = `TIMEOUT: Claude CLI produced no output after ${MCP_STARTUP_TIMEOUT / 1000}s (likely MCP server startup stall)`;
|
|
198
|
+
console.error(msg);
|
|
199
|
+
fs.appendFileSync(debugPath, msg + '\n');
|
|
200
|
+
try { proc.kill('SIGTERM'); } catch { /* process may be dead */ }
|
|
201
|
+
setTimeout(() => { try { proc.kill('SIGKILL'); } catch {} }, 5000);
|
|
202
|
+
}
|
|
203
|
+
}, MCP_STARTUP_TIMEOUT);
|
|
204
|
+
proc.stdout.once('data', () => { gotFirstOutput = true; clearTimeout(startupTimer); });
|
|
205
|
+
|
|
192
206
|
proc.on('close', (code) => {
|
|
207
|
+
clearTimeout(startupTimer);
|
|
193
208
|
fs.appendFileSync(debugPath, `EXIT: code=${code}\nSTDERR: ${stderrBuf.slice(0, 500)}\n`);
|
|
194
209
|
process.exit(code || 0);
|
|
195
210
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.357",
|
|
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"
|