@yemi33/minions 0.1.354 → 0.1.356

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,8 +1,14 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.354 (2026-04-06)
3
+ ## 0.1.356 (2026-04-06)
4
4
 
5
5
  ### Fixes
6
+ - add MCP startup timeout — kill agent if no output after 3 minutes
7
+
8
+ ## 0.1.355 (2026-04-06)
9
+
10
+ ### Fixes
11
+ - pipeline plan stage includes only meeting conclusion, not full transcript
6
12
  - pipeline plans include full meeting content, conclusion playbook requires concrete details
7
13
  - pipeline template regex now matches hyphenated stage IDs
8
14
  - pipeline Continue button shows immediate feedback
@@ -227,29 +227,18 @@ function executePlanStage(stage, stageState, run, config) {
227
227
  const depStage = run.stages[depId];
228
228
  if (!depStage) continue;
229
229
 
230
- // If dependency is a meeting, include full findings + transcript
230
+ // If dependency is a meeting, include the conclusion (which should be concrete and actionable)
231
231
  const meetingId = depStage.artifacts?.meetings?.[0];
232
232
  if (meetingId) {
233
233
  try {
234
234
  const mtgPath = path.join(__dirname, '..', 'meetings', meetingId + '.json');
235
235
  const mtg = safeJson(mtgPath);
236
236
  if (mtg) {
237
- content += `## Meeting: ${mtg.title || depId}\n\n`;
238
- content += `**Agenda:** ${mtg.agenda || ''}\n\n`;
239
- // Include each agent's findings
240
- for (const [agent, finding] of Object.entries(mtg.findings || {})) {
241
- const text = typeof finding === 'string' ? finding : finding?.content || '';
242
- if (text) content += `### ${agent} — Findings\n\n${text}\n\n`;
243
- }
244
- // Include debate if present
245
- for (const [agent, debate] of Object.entries(mtg.debate || {})) {
246
- const text = typeof debate === 'string' ? debate : debate?.content || '';
247
- if (text) content += `### ${agent} — Debate\n\n${text}\n\n`;
248
- }
249
- // Include conclusion
250
237
  const conclusion = typeof mtg.conclusion === 'string' ? mtg.conclusion : mtg.conclusion?.content || '';
251
- if (conclusion) content += `### Conclusion\n\n${conclusion}\n\n`;
252
- continue;
238
+ if (conclusion) {
239
+ content += `## Meeting Conclusion: ${mtg.title || depId}\n\n${conclusion}\n\n`;
240
+ continue;
241
+ }
253
242
  }
254
243
  } catch { /* fall through to output-only */ }
255
244
  }
@@ -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.354",
3
+ "version": "0.1.356",
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"