gm-skill 2.0.1264 → 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 +1 -1
- package/bin/bootstrap.js +6 -2
- package/gm-plugkit/bootstrap.js +6 -2
- package/gm-plugkit/plugkit-wasm-wrapper.js +60 -3
- package/gm.json +1 -1
- package/lib/daemon-bootstrap.js +9 -3
- package/package.json +2 -2
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.
|
|
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
|
|
package/bin/bootstrap.js
CHANGED
|
@@ -257,6 +257,7 @@ async function extractNpmPackageWasm(destPath, version) {
|
|
|
257
257
|
obsEvent('bootstrap', 'npm.extract.start', { package: NPM_PACKAGE, version });
|
|
258
258
|
|
|
259
259
|
const npxResolved = resolveWindowsExe('npx');
|
|
260
|
+
const isCmdShim = process.platform === 'win32' && /\.(cmd|bat)$/i.test(npxResolved);
|
|
260
261
|
const result = spawnSync(
|
|
261
262
|
npxResolved,
|
|
262
263
|
[NPM_PACKAGE + '@' + version, '--prefix', tempDir],
|
|
@@ -265,8 +266,7 @@ async function extractNpmPackageWasm(destPath, version) {
|
|
|
265
266
|
timeout: ATTEMPT_TIMEOUT_MS,
|
|
266
267
|
encoding: 'utf8',
|
|
267
268
|
windowsHide: true,
|
|
268
|
-
|
|
269
|
-
// during package extraction, so no conhost flash during install.
|
|
269
|
+
...(isCmdShim ? { shell: true } : {}),
|
|
270
270
|
...(process.platform === 'win32' ? { creationFlags: 0x08000000 } : {}),
|
|
271
271
|
}
|
|
272
272
|
);
|
|
@@ -304,6 +304,10 @@ async function extractNpmPackageWithRetry(destPath, version) {
|
|
|
304
304
|
log(`npx binary unresolvable (ENOENT); skipping retries, falling back`);
|
|
305
305
|
throw err;
|
|
306
306
|
}
|
|
307
|
+
if (err && (err.code === 'EINVAL' || /EINVAL/.test(String(err.message || '')))) {
|
|
308
|
+
log(`spawn EINVAL on npx shim; skipping retries, falling back`);
|
|
309
|
+
throw err;
|
|
310
|
+
}
|
|
307
311
|
if (attempt < MAX_ATTEMPTS) {
|
|
308
312
|
const wait = BACKOFF_MS[attempt - 1] || 120000;
|
|
309
313
|
log(`backing off ${wait}ms`);
|
package/gm-plugkit/bootstrap.js
CHANGED
|
@@ -205,6 +205,7 @@ async function extractNpmPackageWasm(destPath, version) {
|
|
|
205
205
|
|
|
206
206
|
const cmd = resolveWindowsExe('npm');
|
|
207
207
|
const args = ['install', '--no-audit', '--no-fund', '--no-save', NPM_PACKAGE + '@' + version];
|
|
208
|
+
const isCmdShim = process.platform === 'win32' && /\.(cmd|bat)$/i.test(cmd);
|
|
208
209
|
|
|
209
210
|
const result = spawnSync(cmd, args, {
|
|
210
211
|
cwd: tempDir,
|
|
@@ -212,8 +213,7 @@ async function extractNpmPackageWasm(destPath, version) {
|
|
|
212
213
|
timeout: ATTEMPT_TIMEOUT_MS,
|
|
213
214
|
encoding: 'utf8',
|
|
214
215
|
windowsHide: true,
|
|
215
|
-
|
|
216
|
-
// package install, so no conhost flash during the extract step.
|
|
216
|
+
...(isCmdShim ? { shell: true } : {}),
|
|
217
217
|
...(process.platform === 'win32' ? { creationFlags: 0x08000000 } : {}),
|
|
218
218
|
});
|
|
219
219
|
|
|
@@ -305,6 +305,10 @@ async function extractNpmPackageWithRetry(destPath, version) {
|
|
|
305
305
|
log(`npm binary unresolvable (ENOENT); skipping retries, falling back`);
|
|
306
306
|
throw err;
|
|
307
307
|
}
|
|
308
|
+
if (err && (err.code === 'EINVAL' || /EINVAL/.test(String(err.message || '')))) {
|
|
309
|
+
log(`spawn EINVAL on npm shim; skipping retries, falling back`);
|
|
310
|
+
throw err;
|
|
311
|
+
}
|
|
308
312
|
if (attempt < MAX_ATTEMPTS) {
|
|
309
313
|
const wait = BACKOFF_MS[attempt - 1] || 120000;
|
|
310
314
|
log(`backing off ${wait}ms`);
|
|
@@ -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
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
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
package/lib/daemon-bootstrap.js
CHANGED
|
@@ -186,11 +186,13 @@ async function ensureRsLearningDaemonRunning() {
|
|
|
186
186
|
// .cmd shims that bun-x downloads/launches never get a console window.
|
|
187
187
|
// DETACHED_PROCESS (0x00000008) detaches the process group. Windows-only;
|
|
188
188
|
// Node ignores creationFlags on POSIX.
|
|
189
|
-
const
|
|
189
|
+
const bunExe = resolveWindowsExe('bun');
|
|
190
|
+
const proc = spawn(bunExe, ['x', 'rs-learn@latest'], {
|
|
190
191
|
detached: true,
|
|
191
192
|
stdio: 'ignore',
|
|
192
193
|
windowsHide: true,
|
|
193
194
|
env,
|
|
195
|
+
...(process.platform === 'win32' && /\.(cmd|bat)$/i.test(bunExe) ? { shell: true } : {}),
|
|
194
196
|
creationFlags: 0x08000000 | 0x00000008,
|
|
195
197
|
});
|
|
196
198
|
|
|
@@ -237,11 +239,13 @@ async function ensureRsCodeinsightDaemonRunning() {
|
|
|
237
239
|
CLAUDE_SESSION_ID: sessionId,
|
|
238
240
|
});
|
|
239
241
|
|
|
240
|
-
const
|
|
242
|
+
const bunExe = resolveWindowsExe('bun');
|
|
243
|
+
const proc = spawn(bunExe, ['x', 'rs-codeinsight@latest'], {
|
|
241
244
|
detached: true,
|
|
242
245
|
stdio: 'ignore',
|
|
243
246
|
windowsHide: true,
|
|
244
247
|
env,
|
|
248
|
+
...(process.platform === 'win32' && /\.(cmd|bat)$/i.test(bunExe) ? { shell: true } : {}),
|
|
245
249
|
creationFlags: 0x08000000 | 0x00000008,
|
|
246
250
|
});
|
|
247
251
|
|
|
@@ -283,11 +287,13 @@ async function ensureRsSearchDaemonRunning() {
|
|
|
283
287
|
CLAUDE_SESSION_ID: sessionId,
|
|
284
288
|
});
|
|
285
289
|
|
|
286
|
-
const
|
|
290
|
+
const bunExe = resolveWindowsExe('bun');
|
|
291
|
+
const proc = spawn(bunExe, ['x', 'rs-search@latest'], {
|
|
287
292
|
detached: true,
|
|
288
293
|
stdio: 'ignore',
|
|
289
294
|
windowsHide: true,
|
|
290
295
|
env,
|
|
296
|
+
...(process.platform === 'win32' && /\.(cmd|bat)$/i.test(bunExe) ? { shell: true } : {}),
|
|
291
297
|
creationFlags: 0x08000000 | 0x00000008,
|
|
292
298
|
});
|
|
293
299
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gm-skill",
|
|
3
|
-
"version": "2.0.
|
|
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.
|
|
42
|
+
"gm-plugkit": "^2.0.1266"
|
|
43
43
|
},
|
|
44
44
|
"engines": {
|
|
45
45
|
"node": ">=16.0.0"
|