@yemi33/minions 0.1.429 → 0.1.431
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 +3 -1
- package/engine/ado.js +10 -6
- package/engine/github.js +10 -6
- package/engine/lifecycle.js +15 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.431 (2026-04-06)
|
|
4
4
|
|
|
5
5
|
### Features
|
|
6
6
|
- version check interval on settings page
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
- Convert remaining lifecycle.js safeWrite calls to mutateJsonFileLocked
|
|
12
12
|
|
|
13
13
|
### Fixes
|
|
14
|
+
- PR dedup prefers merged/abandoned over active regardless of order
|
|
15
|
+
- extract skills from inbox notes, not just agent stdout
|
|
14
16
|
- deduplicate PR entries during poll write-back
|
|
15
17
|
- agent inbox notes include work item ID and time in filename
|
|
16
18
|
- Notes & KB sidebar notifies on inbox changes and notes.md edits
|
package/engine/ado.js
CHANGED
|
@@ -108,12 +108,16 @@ async function forEachActivePr(config, token, callback) {
|
|
|
108
108
|
if (idx >= 0) currentPrs[idx] = updatedPr;
|
|
109
109
|
// Don't push if not found — it was deleted by another writer, respect that
|
|
110
110
|
}
|
|
111
|
-
// Remove duplicates
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
111
|
+
// Remove duplicates — prefer merged/abandoned over active
|
|
112
|
+
const bestById = new Map();
|
|
113
|
+
const statusRank = { merged: 3, abandoned: 2, closed: 2, active: 1 };
|
|
114
|
+
for (const p of currentPrs) {
|
|
115
|
+
const existing = bestById.get(p.id);
|
|
116
|
+
if (!existing || (statusRank[p.status] || 0) > (statusRank[existing.status] || 0)) {
|
|
117
|
+
bestById.set(p.id, p);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return [...bestById.values()];
|
|
117
121
|
}, { defaultValue: [] });
|
|
118
122
|
totalUpdated += projectUpdated;
|
|
119
123
|
}
|
package/engine/github.js
CHANGED
|
@@ -77,12 +77,16 @@ async function forEachActiveGhPr(config, callback) {
|
|
|
77
77
|
const idx = currentPrs.findIndex(p => p.id === updatedPr.id);
|
|
78
78
|
if (idx >= 0) currentPrs[idx] = updatedPr;
|
|
79
79
|
}
|
|
80
|
-
// Remove duplicates
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
80
|
+
// Remove duplicates — prefer merged/abandoned over active
|
|
81
|
+
const bestById = new Map();
|
|
82
|
+
const statusRank = { merged: 3, abandoned: 2, closed: 2, active: 1 };
|
|
83
|
+
for (const p of currentPrs) {
|
|
84
|
+
const existing = bestById.get(p.id);
|
|
85
|
+
if (!existing || (statusRank[p.status] || 0) > (statusRank[existing.status] || 0)) {
|
|
86
|
+
bestById.set(p.id, p);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return [...bestById.values()];
|
|
86
90
|
}, { defaultValue: [] });
|
|
87
91
|
totalUpdated += projectUpdated;
|
|
88
92
|
}
|
package/engine/lifecycle.js
CHANGED
|
@@ -1358,7 +1358,21 @@ function runPostCompletionHooks(dispatchItem, agentId, code, stdout, config) {
|
|
|
1358
1358
|
if (type === WORK_TYPE.REVIEW) updatePrAfterReview(agentId, meta?.pr, meta?.project);
|
|
1359
1359
|
if (type === WORK_TYPE.FIX) updatePrAfterFix(meta?.pr, meta?.project, meta?.source);
|
|
1360
1360
|
checkForLearnings(agentId, config.agents[agentId], dispatchItem.task);
|
|
1361
|
-
if (effectiveSuccess)
|
|
1361
|
+
if (effectiveSuccess) {
|
|
1362
|
+
extractSkillsFromOutput(stdout, agentId, dispatchItem, config);
|
|
1363
|
+
// Also scan inbox notes for skill blocks — agents often write skills to inbox, not stdout
|
|
1364
|
+
try {
|
|
1365
|
+
const today = dateStamp();
|
|
1366
|
+
const inboxDir = path.join(MINIONS_DIR, 'notes', 'inbox');
|
|
1367
|
+
const inboxFiles = shared.safeReadDir(inboxDir).filter(f => f.includes(agentId) && f.includes(today));
|
|
1368
|
+
for (const f of inboxFiles) {
|
|
1369
|
+
const content = shared.safeRead(path.join(inboxDir, f));
|
|
1370
|
+
if (content && content.includes('```skill')) {
|
|
1371
|
+
extractSkillsFromOutput(content, agentId, dispatchItem, config);
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
} catch {}
|
|
1375
|
+
}
|
|
1362
1376
|
const finalResult = effectiveSuccess ? DISPATCH_RESULT.SUCCESS : DISPATCH_RESULT.ERROR;
|
|
1363
1377
|
updateAgentHistory(agentId, dispatchItem, finalResult);
|
|
1364
1378
|
// Don't count auto-retries as errors in metrics — only count final outcomes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.431",
|
|
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"
|