@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 +2 -1
- package/dashboard.js +2 -3
- package/engine/ado.js +1 -1
- package/engine/llm.js +2 -15
- package/engine/preflight.js +7 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
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
|
-
|
|
2333
|
-
|
|
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(/\((
|
|
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(); });
|
package/engine/preflight.js
CHANGED
|
@@ -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(
|
|
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.
|
|
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"
|