@yemi33/minions 0.1.430 → 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.430 (2026-04-06)
3
+ ## 0.1.431 (2026-04-06)
4
4
 
5
5
  ### Features
6
6
  - version check interval on settings page
@@ -11,6 +11,7 @@
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
14
15
  - extract skills from inbox notes, not just agent stdout
15
16
  - deduplicate PR entries during poll write-back
16
17
  - agent inbox notes include work item ID and time in filename
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 (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
- });
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 (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
- });
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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.430",
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"