gm-skill 2.0.1227 → 2.0.1228

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.1227` — auto-bumped from the canonical `gm` repo. Every push to `AnEntrypoint/gm` (or any cascading sibling crate) republishes this package.
38
+ `2.0.1228` — 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
 
@@ -744,19 +744,36 @@ function isPortReachableSync(host, port, timeoutMs) {
744
744
  s.on('connect', () => { done = true; s.destroy(); process.exit(0); });
745
745
  s.on('error', () => { if (!done) process.exit(1); });
746
746
  setTimeout(() => { if (!done) { s.destroy(); process.exit(1); } }, ${timeoutMs || 800});
747
- `], { timeout: (timeoutMs || 800) + 2000 });
747
+ `], { timeout: (timeoutMs || 800) + 2000, windowsHide: true });
748
748
  return r.status === 0;
749
749
  }
750
750
 
751
- let _acptoapiBoot = { spawned_at: 0, pid: null };
751
+ let _acptoapiBoot = { spawned_at: 0, pid: null, last_check_ts: 0, last_check_ok: false };
752
752
  function ensureAcptoapi() {
753
753
  const host = '127.0.0.1';
754
754
  const port = 4800;
755
755
  try {
756
- if (isPortReachableSync(host, port, 500)) {
757
- _acptoapiBoot = { spawned_at: 0, pid: null, status: 'already-running' };
756
+ // Two-strike port check: localhost connect can race against node cold-
757
+ // start on Windows. If the first check fails, retry once with a longer
758
+ // timeout before declaring the port dead. iter9 sniff reported 29
759
+ // bootstrap.acptoapi.spawned events in 30m despite acptoapi being alive
760
+ // on :4800 (HTTP 200) — the check flaked under heartbeat-tick load.
761
+ let reachable = isPortReachableSync(host, port, 1500);
762
+ if (!reachable) {
763
+ reachable = isPortReachableSync(host, port, 3000);
764
+ }
765
+ if (reachable) {
766
+ const wasDown = _acptoapiBoot.spawned_at > 0 || !_acptoapiBoot.last_check_ok;
767
+ _acptoapiBoot = { spawned_at: 0, pid: null, status: 'already-running', last_check_ts: Date.now(), last_check_ok: true };
768
+ // Only log on transitions (down → up) so the heartbeat doesn't spam
769
+ // bootstrap.jsonl every 60s with redundant "alive" events.
770
+ if (wasDown) {
771
+ logEvent('bootstrap', 'acptoapi.heartbeat-ok', { port, transition: 'down-to-up' });
772
+ }
758
773
  return;
759
774
  }
775
+ _acptoapiBoot.last_check_ok = false;
776
+ _acptoapiBoot.last_check_ts = Date.now();
760
777
  if (_acptoapiBoot.spawned_at && Date.now() - _acptoapiBoot.spawned_at < 30000) {
761
778
  return;
762
779
  }
@@ -769,7 +786,9 @@ function ensureAcptoapi() {
769
786
  shell: false,
770
787
  });
771
788
  child.unref();
772
- _acptoapiBoot = { spawned_at: Date.now(), pid: child.pid, status: 'spawned' };
789
+ _acptoapiBoot.spawned_at = Date.now();
790
+ _acptoapiBoot.pid = child.pid;
791
+ _acptoapiBoot.status = 'spawned';
773
792
  logEvent('bootstrap', 'acptoapi.spawned', { pid: child.pid, port });
774
793
  } catch (e) {
775
794
  logEvent('bootstrap', 'acptoapi.spawn-failed', { error: e && e.message });
package/gm.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gm",
3
- "version": "2.0.1227",
3
+ "version": "2.0.1228",
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.1227",
3
+ "version": "2.0.1228",
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.1227"
42
+ "gm-plugkit": "^2.0.1228"
43
43
  },
44
44
  "engines": {
45
45
  "node": ">=16.0.0"