@yemi33/minions 0.1.419 → 0.1.420

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,9 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.419 (2026-04-06)
3
+ ## 0.1.420 (2026-04-06)
4
4
 
5
5
  ### Features
6
+ - Low-priority cleanup: dedupe regex, consolidate streaming parse, add path validation alignment
6
7
  - Fix 6 medium bugs: dispatch pruning, null guards, skill regex, meeting advancement, CLI PID check, pipeline retry
7
8
  - Convert remaining lifecycle.js safeWrite calls to mutateJsonFileLocked
8
9
 
package/dashboard.js CHANGED
@@ -2329,9 +2329,8 @@ If nothing to do: { "duplicates": [], "reclassify": [], "remove": [] }`;
2329
2329
  try {
2330
2330
  const body = await readBody(req);
2331
2331
  if (!body.file) return jsonReply(res, 400, { error: 'file required' });
2332
- if (body.file.includes('..') || body.file.includes('\0') || body.file.includes('/') || body.file.includes('\\')) {
2333
- return jsonReply(res, 400, { error: 'invalid filename' });
2334
- }
2332
+ try { shared.sanitizePath(body.file, body.file.endsWith('.json') ? PRD_DIR : PLANS_DIR); }
2333
+ catch { return jsonReply(res, 400, { error: 'invalid filename' }); }
2335
2334
  const isJson = body.file.endsWith('.json');
2336
2335
  const targetDir = isJson ? PRD_DIR : PLANS_DIR;
2337
2336
  const archivePath = path.join(targetDir, 'archive', body.file);
package/engine/ado.js CHANGED
@@ -381,7 +381,7 @@ async function reconcilePrs(config) {
381
381
  const title = adoPr.title || '';
382
382
  // Extract item ID from branch name or PR title (e.g., feat(P-2cafdc2a): ...)
383
383
  const branchMatch = branch.match(/(P-[a-z0-9]{6,})/i) || branch.match(/(W-[a-z0-9]{6,})/i) || branch.match(/(PL-[a-z0-9]{6,})/i);
384
- const titleMatch = title.match(/\((P-[a-z0-9]{6,})\)/) || title.match(/\((W-[a-z0-9]{6,})\)/) || title.match(/\((W-[a-z0-9]{6,})\)/) || title.match(/\((PL-[a-z0-9]{6,})\)/);
384
+ const titleMatch = title.match(/\((P-[a-z0-9]{6,})\)/) || title.match(/\((W-[a-z0-9]{6,})\)/) || title.match(/\((PL-[a-z0-9]{6,})\)/);
385
385
  const linkedItemId = branchMatch?.[1] || titleMatch?.[1] || null;
386
386
  const linkedItem = linkedItemId ? allItems.find(i => i.id === linkedItemId) : null;
387
387
  const confirmedItemId = linkedItem ? linkedItemId : null;
package/engine/llm.js CHANGED
@@ -160,25 +160,12 @@ function callLLMStreaming(promptText, sysPromptText, { timeout = 120000, label =
160
160
  if (block.type === 'text' && block.text && block.text !== lastTextSent) {
161
161
  lastTextSent = block.text;
162
162
  onChunk(block.text);
163
- }
164
- }
165
- }
166
- } catch { /* incomplete JSON or non-JSON line */ }
167
- }
168
- // Also emit tool_use events so the frontend can show "Using tool: Read..."
169
- for (const line of lines) {
170
- const trimmed = line.trim();
171
- if (!trimmed || !trimmed.startsWith('{')) continue;
172
- try {
173
- const obj = JSON.parse(trimmed);
174
- if (obj.type === 'assistant' && obj.message?.content) {
175
- for (const block of obj.message.content) {
176
- if (block.type === 'tool_use' && block.name && onToolUse) {
163
+ } else if (block.type === 'tool_use' && block.name && onToolUse) {
177
164
  onToolUse(block.name, block.input);
178
165
  }
179
166
  }
180
167
  }
181
- } catch {}
168
+ } catch { /* incomplete JSON or non-JSON line */ }
182
169
  }
183
170
  });
184
171
  proc.stderr.on('data', d => { stderr += d.toString(); });
@@ -27,7 +27,13 @@ function findClaudeBinary() {
27
27
  path.join(path.dirname(process.execPath), '..', 'lib', 'node_modules', '@anthropic-ai', 'claude-code', 'cli.js'),
28
28
  // fnm / volta — sibling to the node binary
29
29
  path.join(path.dirname(process.execPath), 'node_modules', '@anthropic-ai', 'claude-code', 'cli.js'),
30
- ].filter(Boolean);
30
+ ].filter(p => {
31
+ if (!p) {
32
+ if (process.env.MINIONS_DEBUG) console.log('[preflight] Dropped empty CLI search path entry');
33
+ return false;
34
+ }
35
+ return true;
36
+ });
31
37
  for (const p of searchPaths) {
32
38
  try { if (fs.existsSync(p)) return p; } catch {}
33
39
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.419",
3
+ "version": "0.1.420",
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"