@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 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 || hasPendingPrd) return 'dispatched';
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', 'paused': 'Paused',
196
- 'awaiting-approval': 'Awaiting Approval', 'approved': 'Approved', 'rejected': 'Rejected',
197
- 'revision-requested': 'Revision Requested', 'has-failures': 'Has Failures', 'active': 'Active'
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>' +
@@ -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.355",
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"