@yemi33/minions 0.1.428 → 0.1.430

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,6 +1,6 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.428 (2026-04-06)
3
+ ## 0.1.430 (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
+ - extract skills from inbox notes, not just agent stdout
15
+ - deduplicate PR entries during poll write-back
14
16
  - agent inbox notes include work item ID and time in filename
15
17
  - Notes & KB sidebar notifies on inbox changes and notes.md edits
16
18
  - live output no longer clobbered by steering send
package/engine/ado.js CHANGED
@@ -108,7 +108,12 @@ 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
- return currentPrs;
111
+ // Remove duplicates (keep last occurrence which has latest status)
112
+ const seen = new Set();
113
+ return currentPrs.filter((p, i, arr) => {
114
+ const lastIdx = arr.findLastIndex(x => x.id === p.id);
115
+ return lastIdx === i;
116
+ });
112
117
  }, { defaultValue: [] });
113
118
  totalUpdated += projectUpdated;
114
119
  }
package/engine/github.js CHANGED
@@ -72,12 +72,17 @@ async function forEachActiveGhPr(config, callback) {
72
72
 
73
73
  if (projectUpdated > 0) {
74
74
  mutateJsonFileLocked(projectPrPath(project), (currentPrs) => {
75
- // Only merge back PRs that the callback actually modified
75
+ // Merge back updated PRs and deduplicate
76
76
  for (const updatedPr of activePrs) {
77
77
  const idx = currentPrs.findIndex(p => p.id === updatedPr.id);
78
78
  if (idx >= 0) currentPrs[idx] = updatedPr;
79
79
  }
80
- return currentPrs;
80
+ // Remove duplicates (keep last occurrence which has latest status)
81
+ const seen = new Set();
82
+ return currentPrs.filter((p, i, arr) => {
83
+ const lastIdx = arr.findLastIndex(x => x.id === p.id);
84
+ return lastIdx === i;
85
+ });
81
86
  }, { defaultValue: [] });
82
87
  totalUpdated += projectUpdated;
83
88
  }
@@ -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) extractSkillsFromOutput(stdout, agentId, dispatchItem, config);
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.428",
3
+ "version": "0.1.430",
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"