@yemi33/minions 0.1.127 → 0.1.129
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 +26 -0
- package/dashboard/js/modal.js +1 -1
- package/dashboard/js/render-agents.js +2 -2
- package/dashboard/js/render-work-items.js +1 -1
- package/dashboard.js +4 -1
- package/engine/dispatch.js +2 -2
- package/engine/github.js +1 -1
- package/engine/lifecycle.js +3 -3
- package/engine/preflight.js +1 -1
- package/engine/spawn-agent.js +3 -2
- package/engine/timeout.js +1 -1
- package/engine.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.129 (2026-04-01)
|
|
4
|
+
|
|
5
|
+
### Engine
|
|
6
|
+
- engine/github.js
|
|
7
|
+
- engine/preflight.js
|
|
8
|
+
- engine/spawn-agent.js
|
|
9
|
+
|
|
10
|
+
### Dashboard
|
|
11
|
+
- dashboard/js/modal.js
|
|
12
|
+
- dashboard/js/render-agents.js
|
|
13
|
+
|
|
14
|
+
## 0.1.128 (2026-04-01)
|
|
15
|
+
|
|
16
|
+
### Engine
|
|
17
|
+
- engine.js
|
|
18
|
+
- engine/dispatch.js
|
|
19
|
+
- engine/lifecycle.js
|
|
20
|
+
- engine/timeout.js
|
|
21
|
+
|
|
22
|
+
### Dashboard
|
|
23
|
+
- dashboard.js
|
|
24
|
+
- dashboard/js/render-work-items.js
|
|
25
|
+
|
|
26
|
+
### Other
|
|
27
|
+
- test/unit.test.js
|
|
28
|
+
|
|
3
29
|
## 0.1.127 (2026-04-01)
|
|
4
30
|
|
|
5
31
|
### Engine
|
package/dashboard/js/modal.js
CHANGED
|
@@ -13,7 +13,7 @@ function closeModal() {
|
|
|
13
13
|
if (_qaSessionKey && (_qaHistory.length > 0 || _qaQueue.length > 0)) {
|
|
14
14
|
_qaSessions.set(_qaSessionKey, {
|
|
15
15
|
history: _qaHistory,
|
|
16
|
-
threadHtml: document.getElementById('modal-qa-thread').innerHTML,
|
|
16
|
+
threadHtml: (document.getElementById('modal-qa-thread') || {}).innerHTML || '',
|
|
17
17
|
docContext: { ..._modalDocContext },
|
|
18
18
|
filePath: _modalFilePath,
|
|
19
19
|
});
|
|
@@ -17,10 +17,10 @@ function renderAgents(agents) {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
async function openAgentDetail(id) {
|
|
20
|
-
currentAgentId = id;
|
|
21
20
|
const agent = agentData.find(a => a.id === id);
|
|
22
|
-
currentTab = (agent?.status === 'working') ? 'live' : 'thought-process';
|
|
23
21
|
if (!agent) return;
|
|
22
|
+
currentAgentId = id;
|
|
23
|
+
currentTab = (agent.status === 'working') ? 'live' : 'thought-process';
|
|
24
24
|
|
|
25
25
|
document.getElementById('detail-agent-name').innerHTML =
|
|
26
26
|
'<span style="font-size:22px">' + agent.emoji + '</span> ' + agent.name + ' — ' + agent.role;
|
|
@@ -94,7 +94,7 @@ function editWorkItem(id, source) {
|
|
|
94
94
|
if (!item) return;
|
|
95
95
|
const types = ['implement', 'fix', 'review', 'plan', 'verify', 'investigate', 'refactor', 'test', 'docs'];
|
|
96
96
|
const priorities = ['critical', 'high', 'medium', 'low'];
|
|
97
|
-
const agentOpts = cmdAgents.map(a => '<option value="' + escHtml(a.id) + '"' + (item.agent === a.id ? ' selected' : '') + '>' + escHtml(a.name) + '</option>').join('');
|
|
97
|
+
const agentOpts = (cmdAgents || []).map(a => '<option value="' + escHtml(a.id) + '"' + (item.agent === a.id ? ' selected' : '') + '>' + escHtml(a.name) + '</option>').join('');
|
|
98
98
|
const typeOpts = types.map(t => '<option value="' + t + '"' + ((item.type || 'implement') === t ? ' selected' : '') + '>' + t + '</option>').join('');
|
|
99
99
|
const priOpts = priorities.map(p => '<option value="' + p + '"' + ((item.priority || 'medium') === p ? ' selected' : '') + '>' + p + '</option>').join('');
|
|
100
100
|
|
package/dashboard.js
CHANGED
|
@@ -3057,7 +3057,10 @@ What would you like to discuss or change? When you're happy, say "approve" and I
|
|
|
3057
3057
|
try {
|
|
3058
3058
|
const body = await readBody(req);
|
|
3059
3059
|
const configPath = path.join(MINIONS_DIR, 'config.json');
|
|
3060
|
-
const config = safeJson(configPath);
|
|
3060
|
+
const config = safeJson(configPath) || {};
|
|
3061
|
+
if (!config.engine) config.engine = {};
|
|
3062
|
+
if (!config.claude) config.claude = {};
|
|
3063
|
+
if (!config.agents) config.agents = {};
|
|
3061
3064
|
|
|
3062
3065
|
if (body.engine) {
|
|
3063
3066
|
// Validate and apply engine settings
|
package/engine/dispatch.js
CHANGED
|
@@ -86,8 +86,8 @@ function completeDispatch(id, result = 'success', reason = '', resultSummary = '
|
|
|
86
86
|
if (reason) item.reason = reason;
|
|
87
87
|
if (resultSummary) item.resultSummary = resultSummary;
|
|
88
88
|
delete item.prompt;
|
|
89
|
-
if (dispatch.completed.length
|
|
90
|
-
dispatch.completed = dispatch.completed.slice(-
|
|
89
|
+
if (dispatch.completed.length > 100) {
|
|
90
|
+
dispatch.completed = dispatch.completed.slice(-100);
|
|
91
91
|
}
|
|
92
92
|
dispatch.completed.push(item);
|
|
93
93
|
return dispatch;
|
package/engine/github.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
const shared = require('./shared');
|
|
8
|
-
const { exec, getProjects, projectPrPath, projectWorkItemsPath, safeJson, safeWrite, MINIONS_DIR, addPrLink } = shared;
|
|
8
|
+
const { exec, getProjects, projectPrPath, projectWorkItemsPath, safeJson, safeWrite, MINIONS_DIR, addPrLink, getPrLinks } = shared;
|
|
9
9
|
const { getPrs } = require('./queries');
|
|
10
10
|
const path = require('path');
|
|
11
11
|
|
package/engine/lifecycle.js
CHANGED
|
@@ -1161,7 +1161,7 @@ function runPostCompletionHooks(dispatchItem, agentId, code, stdout, config) {
|
|
|
1161
1161
|
return d.includes(branchSlug) && fs.statSync(path.join(worktreeRoot, d)).isDirectory();
|
|
1162
1162
|
});
|
|
1163
1163
|
// Only remove if no other active dispatch uses this branch
|
|
1164
|
-
const dispatch =
|
|
1164
|
+
const dispatch = getDispatch();
|
|
1165
1165
|
const otherActive = ((dispatch.active || []).concat(dispatch.pending || [])).some(d =>
|
|
1166
1166
|
d.id !== dispatchItem.id && d.meta?.branch && shared.sanitizeBranch && shared.sanitizeBranch(d.meta.branch) === branchSlug
|
|
1167
1167
|
);
|
|
@@ -1208,10 +1208,10 @@ function runPostCompletionHooks(dispatchItem, agentId, code, stdout, config) {
|
|
|
1208
1208
|
wi._retryCount = retries + 1;
|
|
1209
1209
|
delete wi.dispatched_at;
|
|
1210
1210
|
delete wi.dispatched_to;
|
|
1211
|
-
|
|
1211
|
+
log('info', `Auto-retry ${retries + 1}/3 for ${meta.item.id} (no PR created)`);
|
|
1212
1212
|
} else {
|
|
1213
1213
|
wi.status = 'failed';
|
|
1214
|
-
|
|
1214
|
+
log('warn', `${meta.item.id} failed after 3 retries — no PR created`);
|
|
1215
1215
|
}
|
|
1216
1216
|
shared.safeWrite(wiPath, items);
|
|
1217
1217
|
}
|
package/engine/preflight.js
CHANGED
|
@@ -25,7 +25,7 @@ function findClaudeBinary() {
|
|
|
25
25
|
// Fallback: parse the shell wrapper
|
|
26
26
|
try {
|
|
27
27
|
const which = execSync('bash -c "which claude"', { encoding: 'utf8', windowsHide: true, timeout: 5000 }).trim();
|
|
28
|
-
const whichNative = which.replace(/^\/
|
|
28
|
+
const whichNative = which.replace(/^\/([a-zA-Z])\//, (_, d) => d.toUpperCase() + ':/').replace(/\//g, path.sep);
|
|
29
29
|
const wrapper = fs.readFileSync(whichNative, 'utf8');
|
|
30
30
|
const m = wrapper.match(/node_modules\/@anthropic-ai\/claude-code\/cli\.js/);
|
|
31
31
|
if (m) {
|
package/engine/spawn-agent.js
CHANGED
|
@@ -39,10 +39,11 @@ for (const p of searchPaths) {
|
|
|
39
39
|
if (!claudeBin) {
|
|
40
40
|
try {
|
|
41
41
|
const which = exec('bash -c "which claude"', { encoding: 'utf8', env }).trim();
|
|
42
|
-
const
|
|
42
|
+
const whichNative = which.replace(/^\/([a-zA-Z])\//, (_, d) => d.toUpperCase() + ':/').replace(/\//g, path.sep);
|
|
43
|
+
const wrapper = fs.readFileSync(whichNative, 'utf8');
|
|
43
44
|
const m = wrapper.match(/node_modules\/@anthropic-ai\/claude-code\/cli\.js/);
|
|
44
45
|
if (m) {
|
|
45
|
-
const basedir = path.dirname(
|
|
46
|
+
const basedir = path.dirname(whichNative);
|
|
46
47
|
claudeBin = path.join(basedir, 'node_modules', '@anthropic-ai', 'claude-code', 'cli.js');
|
|
47
48
|
}
|
|
48
49
|
} catch { /* optional */ }
|
package/engine/timeout.js
CHANGED
|
@@ -130,7 +130,7 @@ function checkTimeouts(config) {
|
|
|
130
130
|
// Optimization: only read file if recent activity (avoids reading stale 1MB logs)
|
|
131
131
|
let completedViaOutput = false;
|
|
132
132
|
try {
|
|
133
|
-
if (silentMs > 600000) throw 'skip'; // No point reading a file silent for >10min
|
|
133
|
+
if (silentMs > 600000) throw new Error('skip'); // No point reading a file silent for >10min
|
|
134
134
|
const liveLog = safeRead(liveLogPath);
|
|
135
135
|
if (liveLog && liveLog.includes('"type":"result"')) {
|
|
136
136
|
completedViaOutput = true;
|
package/engine.js
CHANGED
|
@@ -1036,7 +1036,7 @@ function materializePlansAsWorkItems(config) {
|
|
|
1036
1036
|
plan.status = 'approved';
|
|
1037
1037
|
plan.approvedAt = new Date().toISOString();
|
|
1038
1038
|
plan.approvedBy = 'auto-mode';
|
|
1039
|
-
safeWrite(
|
|
1039
|
+
safeWrite(path.join(PRD_DIR, file), plan);
|
|
1040
1040
|
log('info', `Auto-approved plan: ${file}`);
|
|
1041
1041
|
} else {
|
|
1042
1042
|
continue; // Skip — waiting for human approval
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.129",
|
|
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"
|