@yemi33/minions 0.1.1080 → 0.1.1081

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,11 +1,12 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.1080 (2026-04-18)
3
+ ## 0.1.1081 (2026-04-18)
4
4
 
5
5
  ### Features
6
6
  - seed realActivityMap at spawn time, stamp pid in live-output (#1200)
7
7
 
8
8
  ### Fixes
9
+ - avoid no-op work item writes
9
10
  - resilient claude binary resolution + surface spawn errors
10
11
  - resolve native claude.exe from npm wrapper on Windows
11
12
  - cap temp-agent creation at maxConcurrent per tick (#1219)
@@ -30,6 +31,35 @@
30
31
  - restore: recover daily-arch-improvement and weekly-dead-code-cleanup pipelines
31
32
  - Harden CC stream resilience
32
33
 
34
+ ## 0.1.1079 (2026-04-18)
35
+
36
+ ### Features
37
+ - seed realActivityMap at spawn time, stamp pid in live-output (#1200)
38
+
39
+ ### Fixes
40
+ - resolve native claude.exe from npm wrapper on Windows
41
+ - cap temp-agent creation at maxConcurrent per tick (#1219)
42
+ - reassign pending items from unspawned temp agents to idle named agents (#1204) (#1212)
43
+ - guard undefined agent in pending dispatch loop (closes #1206) (#1210)
44
+ - improve fallback meeting conclusion
45
+ - remove command center chevron
46
+ - stamp live-output.log stub before spawn (#1198)
47
+ - harden settings save and migrate pr poll config
48
+
49
+ ### Other
50
+ - Use PAT for publish merges
51
+ - test(queries): add unit tests for invalidateDispatchCache/getInbox/getAgentCharter (#1214)
52
+ - test(shared): add unit tests for truncateTextBytes/tailTextBytes/execSilent/trackReviewMetric/parseCanonicalPrId (#1215)
53
+ - Fix publish workflow merge
54
+ - chore: raise default meeting round timeout
55
+ - Harden prompt context handling
56
+ - Harden loop watch conversion
57
+ - Add watches sidebar activity badge
58
+ - test(cli): add unit tests for handleCommand, start, stop, kill, spawn (#1191)
59
+ - chore: untrack pipeline files — local config only
60
+ - restore: recover daily-arch-improvement and weekly-dead-code-cleanup pipelines
61
+ - Harden CC stream resilience
62
+
33
63
  ## 0.1.1078 (2026-04-18)
34
64
 
35
65
  ### Features
package/engine/shared.js CHANGED
@@ -347,23 +347,30 @@ function withFileLock(lockPath, fn, {
347
347
  function mutateJsonFileLocked(filePath, mutateFn, {
348
348
  defaultValue = {},
349
349
  lockRetries,
350
- lockRetryBackoffMs
350
+ lockRetryBackoffMs,
351
+ skipWriteIfUnchanged = false
351
352
  } = {}) {
352
353
  const lockPath = `${filePath}.lock`;
353
354
  const retries = lockRetries ?? ENGINE_DEFAULTS.lockRetries;
354
355
  const retryBackoffMs = lockRetryBackoffMs ?? ENGINE_DEFAULTS.lockRetryBackoffMs;
355
356
  return withFileLock(lockPath, () => {
357
+ const fileExists = fs.existsSync(filePath);
356
358
  let data = safeJson(filePath);
359
+ const parsedInvalid = fileExists && data === null;
357
360
  if (data === null || typeof data !== 'object') data = Array.isArray(defaultValue) ? [...defaultValue] : { ...defaultValue };
358
- // Back up last-known-good state before mutation (best-effort)
359
- const backupPath = filePath + '.backup';
360
- try { if (fs.existsSync(filePath)) fs.copyFileSync(filePath, backupPath); } catch { /* backup is best-effort */ }
361
+ const beforeSerialized = skipWriteIfUnchanged ? JSON.stringify(data) : null;
361
362
  if (path.basename(filePath) === 'pull-requests.json' && Array.isArray(data)) {
362
363
  normalizePrRecords(data, resolveProjectForPrPath(filePath));
363
364
  }
364
365
  const next = mutateFn(data);
365
366
  const finalData = next === undefined ? data : next;
366
- safeWrite(filePath, finalData);
367
+ const shouldWrite = !skipWriteIfUnchanged || parsedInvalid || JSON.stringify(finalData) !== beforeSerialized;
368
+ if (shouldWrite) {
369
+ // Back up last-known-good state before mutation (best-effort)
370
+ const backupPath = filePath + '.backup';
371
+ try { if (fileExists) fs.copyFileSync(filePath, backupPath); } catch { /* backup is best-effort */ }
372
+ safeWrite(filePath, finalData);
373
+ }
367
374
  return finalData;
368
375
  }, { retries, retryBackoffMs });
369
376
  }
@@ -1351,7 +1358,7 @@ function mutateWorkItems(filePath, mutator) {
1351
1358
  return mutateJsonFileLocked(filePath, (data) => {
1352
1359
  if (!Array.isArray(data)) data = [];
1353
1360
  return mutator(data) || data;
1354
- }, { defaultValue: [] });
1361
+ }, { defaultValue: [], skipWriteIfUnchanged: true });
1355
1362
  }
1356
1363
 
1357
1364
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.1080",
3
+ "version": "0.1.1081",
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"