gm-skill 2.0.1265 → 2.0.1266

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/README.md CHANGED
@@ -35,7 +35,7 @@ An earlier generation fanned out fifteen per-platform downstream repos (gm-cc, g
35
35
 
36
36
  ## Version
37
37
 
38
- `2.0.1265` — auto-bumped from the canonical `gm` repo. Every push to `AnEntrypoint/gm` (or any cascading sibling crate) republishes this package.
38
+ `2.0.1266` — auto-bumped from the canonical `gm` repo. Every push to `AnEntrypoint/gm` (or any cascading sibling crate) republishes this package.
39
39
 
40
40
  ## Source of truth
41
41
 
@@ -42,6 +42,7 @@ function emitShutdownReason(reason, err) {
42
42
  version: typeof PLUGKIT_VERSION !== 'undefined' ? PLUGKIT_VERSION : null,
43
43
  };
44
44
  fs.writeFileSync(path.join(spoolDir, '.shutdown-reason.json'), JSON.stringify(body, null, 2));
45
+ try { fs.unlinkSync(path.join(spoolDir, '.boot-active.json')); } catch (_) {}
45
46
  } catch (_) {}
46
47
  }
47
48
 
@@ -1497,6 +1498,47 @@ async function runSpoolWatcher(instance, spoolDir) {
1497
1498
  acquireLock();
1498
1499
  setInterval(refreshLock, 5000);
1499
1500
 
1501
+ const BOOT_ACTIVE_PATH = path.join(spoolDir, '.boot-active.json');
1502
+ const SHUTDOWN_REASON_PATH_EARLY = path.join(spoolDir, '.shutdown-reason.json');
1503
+ try {
1504
+ let priorBoot = null;
1505
+ let priorShutdownForAbort = null;
1506
+ try { priorBoot = JSON.parse(fs.readFileSync(BOOT_ACTIVE_PATH, 'utf-8')); } catch (_) {}
1507
+ try { priorShutdownForAbort = JSON.parse(fs.readFileSync(SHUTDOWN_REASON_PATH_EARLY, 'utf-8')); } catch (_) {}
1508
+ if (priorBoot && Number.isFinite(priorBoot.ts) && priorBoot.pid !== process.pid) {
1509
+ const ageMs = Date.now() - priorBoot.ts;
1510
+ const shutdownIsNewer = priorShutdownForAbort && Number.isFinite(priorShutdownForAbort.ts) && priorShutdownForAbort.ts >= priorBoot.ts;
1511
+ if (ageMs > 30_000 && !shutdownIsNewer) {
1512
+ logEvent('plugkit', 'watcher.silent-abort', {
1513
+ prior_pid: priorBoot.pid,
1514
+ prior_ts: priorBoot.ts,
1515
+ prior_sha: priorBoot.wrapper_sha || null,
1516
+ prior_version: priorBoot.version || null,
1517
+ detected_at: Date.now(),
1518
+ age_ms: ageMs,
1519
+ shutdown_reason_present: !!priorShutdownForAbort,
1520
+ shutdown_reason_ts: priorShutdownForAbort ? priorShutdownForAbort.ts : null,
1521
+ });
1522
+ try { console.error(`[plugkit-wasm] SILENT ABORT detected: prior watcher pid=${priorBoot.pid} sha=${priorBoot.wrapper_sha} died without writing .shutdown-reason.json (age=${ageMs}ms)`); } catch (_) {}
1523
+ }
1524
+ }
1525
+ } catch (_) {}
1526
+ function writeBootActive() {
1527
+ try {
1528
+ const _v = readInstanceVersion(instance);
1529
+ fs.writeFileSync(BOOT_ACTIVE_PATH, JSON.stringify({
1530
+ pid: process.pid,
1531
+ ts: Date.now(),
1532
+ wrapper_sha: _ownWrapperSha12 || null,
1533
+ version: _v || null,
1534
+ }));
1535
+ } catch (_) {}
1536
+ }
1537
+ function clearBootActive() {
1538
+ try { fs.unlinkSync(BOOT_ACTIVE_PATH); } catch (_) {}
1539
+ }
1540
+ writeBootActive();
1541
+
1500
1542
  const PEER_REGISTRY_PATH = path.join(os.homedir(), '.claude', 'gm-tools', 'peer-registry.json');
1501
1543
  function registerSelfAsPeer() {
1502
1544
  try {
@@ -1593,6 +1635,7 @@ async function runSpoolWatcher(instance, spoolDir) {
1593
1635
  } catch (_) {}
1594
1636
 
1595
1637
  try { fs.unlinkSync(STATUS_PATH_FOR_TEARDOWN); } catch (_) {}
1638
+ try { clearBootActive(); } catch (_) {}
1596
1639
  try { releaseLock(); } catch (_) {}
1597
1640
  process.exit(0);
1598
1641
  }
@@ -1624,6 +1667,7 @@ async function runSpoolWatcher(instance, spoolDir) {
1624
1667
  } catch (_) {}
1625
1668
  try { releaseLock(); } catch (_) {}
1626
1669
  try { fs.unlinkSync(STATUS_PATH_FOR_TEARDOWN); } catch (_) {}
1670
+ try { clearBootActive(); } catch (_) {}
1627
1671
  process.exit(0);
1628
1672
  } catch (e) {
1629
1673
  console.error(`[version-drift-check] error: ${e.message}`);
@@ -1659,6 +1703,7 @@ async function runSpoolWatcher(instance, spoolDir) {
1659
1703
  } catch (_) {}
1660
1704
  try { releaseLock(); } catch (_) {}
1661
1705
  try { fs.unlinkSync(STATUS_PATH_FOR_TEARDOWN); } catch (_) {}
1706
+ try { clearBootActive(); } catch (_) {}
1662
1707
  process.exit(0);
1663
1708
  } catch (e) {
1664
1709
  console.error(`[wrapper-drift-check] error: ${e.message}`);
@@ -1690,9 +1735,21 @@ async function runSpoolWatcher(instance, spoolDir) {
1690
1735
  }
1691
1736
  }, IDLE_CHECK_MS);
1692
1737
 
1693
- process.on('SIGINT', () => { releaseLock(); process.exit(0); });
1694
- process.on('SIGTERM', () => { releaseLock(); process.exit(0); });
1695
- process.on('exit', releaseLock);
1738
+ function handleSignalShutdown(sig) {
1739
+ try {
1740
+ fs.writeFileSync(SHUTDOWN_REASON_PATH, JSON.stringify({
1741
+ reason: sig.toLowerCase(),
1742
+ ts: Date.now(),
1743
+ pid: process.pid,
1744
+ }));
1745
+ } catch (_) {}
1746
+ try { clearBootActive(); } catch (_) {}
1747
+ try { releaseLock(); } catch (_) {}
1748
+ process.exit(0);
1749
+ }
1750
+ process.on('SIGINT', () => handleSignalShutdown('SIGINT'));
1751
+ process.on('SIGTERM', () => handleSignalShutdown('SIGTERM'));
1752
+ process.on('exit', () => { try { clearBootActive(); } catch (_) {} releaseLock(); });
1696
1753
 
1697
1754
  try {
1698
1755
  const wrapperDst = path.join(os.homedir(), '.claude', 'gm-tools', 'plugkit-wasm-wrapper.js');
package/gm.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gm",
3
- "version": "2.0.1265",
3
+ "version": "2.0.1266",
4
4
  "description": "Spool-dispatch orchestration engine with unified state machine, skills, and automated git enforcement",
5
5
  "author": "AnEntrypoint",
6
6
  "license": "MIT",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gm-skill",
3
- "version": "2.0.1265",
3
+ "version": "2.0.1266",
4
4
  "description": "Canonical universal harness — AI-native software engineering via skill-driven orchestration; bootstraps plugkit for task execution and session isolation. Install in any AI coding agent host.",
5
5
  "author": "AnEntrypoint",
6
6
  "license": "MIT",
@@ -39,7 +39,7 @@
39
39
  "gm.json"
40
40
  ],
41
41
  "dependencies": {
42
- "gm-plugkit": "^2.0.1265"
42
+ "gm-plugkit": "^2.0.1266"
43
43
  },
44
44
  "engines": {
45
45
  "node": ">=16.0.0"