gm-skill 2.0.1206 → 2.0.1208

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
@@ -1,6 +1,6 @@
1
1
  # gm-skill — Canonical Universal Harness
2
2
 
3
- The single shipped skill for gm. Install into any harness that loads Claude-style skill directories — Claude Code, OpenCode, Cursor, Zed, VS Code, Codex, Kilo, JetBrains, Copilot CLI, Antigravity, Windsurf, Gemini CLI — and plugkit serves every phase instruction, mutables row, and guardrail on demand via the spool.
3
+ The single shipped skill for gm. Install into any harness that loads Claude-style skill directories — Claude Code, OpenCode, Cursor, Zed, VS Code, Codex, Kilo, JetBrains, Copilot CLI, Antigravity, Windsurf, Gemini CLI — and you dispatch the `instruction` verb each turn to read every phase directive, mutables row, and guardrail from plugkit via the spool. You are the state machine; plugkit serves the response the moment you write the request.
4
4
 
5
5
  ## What this is
6
6
 
@@ -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.1206` — auto-bumped from the canonical `gm` repo. Every push to `AnEntrypoint/gm` (or any cascading sibling crate) republishes this package.
38
+ `2.0.1208` — 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
 
@@ -1 +1 @@
1
- 0.1.443
1
+ 0.1.444
package/bin/plugkit.wasm CHANGED
Binary file
@@ -1 +1 @@
1
- 9ae6f13ee3e4f2c3da128f4ed268ed2a56b370488cd2c937d51f7eecfd5ebad6 plugkit.wasm
1
+ c15068d2910d08d9a1de8cecd05e658f553f0e77af3ed6848b4a76485880d580 plugkit.wasm
package/gm.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gm",
3
- "version": "2.0.1206",
3
+ "version": "2.0.1208",
4
4
  "description": "Spool-dispatch orchestration engine with unified state machine, skills, and automated git enforcement",
5
5
  "author": "AnEntrypoint",
6
6
  "license": "MIT",
@@ -17,5 +17,5 @@
17
17
  "publishConfig": {
18
18
  "access": "public"
19
19
  },
20
- "plugkitVersion": "0.1.443"
20
+ "plugkitVersion": "0.1.444"
21
21
  }
@@ -185,6 +185,26 @@ function markInstructionSeen(sessionId) {
185
185
  } catch (_) {}
186
186
  }
187
187
 
188
+ const SPOOL_POLL_PATTERNS = [
189
+ /\bsleep\s+\d+(?:\.\d+)?\s*[;&]+\s*(?:cat|ls|tail|head|find|test|grep)\b[^|]*\.gm[\\/](?:exec-spool|spool)/i,
190
+ /\bStart-Sleep\b[^;|]*?[;|]\s*(?:Get-Content|Test-Path|Get-ChildItem|cat|ls|gci|gc|tp)\b[^|]*\.gm[\\/](?:exec-spool|spool)/i,
191
+ /\b(?:cat|ls|tail|head|Get-Content|Test-Path|Get-ChildItem)\b[^|]*\.gm[\\/](?:exec-spool|spool)[^|]*?[;&|]+\s*(?:sleep|Start-Sleep)\b/i,
192
+ /\bwhile\b[^;]*?(?:!|-not)\s*(?:-(?:f|e)\s+|Test-Path\s+)[^;]*?\.gm[\\/](?:exec-spool|spool)/i,
193
+ /\buntil\b[^;]*?(?:-f|-e|Test-Path)\s+[^;]*?\.gm[\\/](?:exec-spool|spool)/i,
194
+ /\bfor\s+i\s+in\b[^;]*?;\s*do\b[^;]*?(?:sleep|Start-Sleep)[^;]*?\.gm[\\/](?:exec-spool|spool)/i,
195
+ ];
196
+
197
+ const SPOOL_POLL_REASON = 'spool polling is forbidden — plugkit is synchronous from your view. Read the response file at .gm/exec-spool/out/<verb>-<N>.json directly with the Read tool. If it does not exist, the watcher is either dead (check .gm/exec-spool/.status.json mtime) or the verb is genuinely slow (read .gm/exec-spool/.watcher.log for the dispatch trace). Polling with sleep+cat/ls/Test-Path treats plugkit as an async worker; it is not. You are the state machine; plugkit serves the response the moment you write the request.';
198
+
199
+ function isSpoolPollCommand(command) {
200
+ if (!command) return null;
201
+ const s = String(command);
202
+ for (const re of SPOOL_POLL_PATTERNS) {
203
+ if (re.test(s)) return re.source;
204
+ }
205
+ return null;
206
+ }
207
+
188
208
  const DEFER_MARKERS = [
189
209
  'next pass', 'next session', 'next turn',
190
210
  'defer to later', 'deferred to later', 'deferred for later',
@@ -256,6 +276,14 @@ function checkDispatchGates(sessionId, operation, extra) {
256
276
  logDeviation('deviation.write-before-instruction', { operation, sessionId });
257
277
  }
258
278
 
279
+ if (operation === 'bash' && extra && extra.command) {
280
+ const pattern = isSpoolPollCommand(extra.command);
281
+ if (pattern) {
282
+ logDeviation('deviation.spool-poll', { operation, pattern, command_excerpt: String(extra.command).slice(0, 200) });
283
+ return { allowed: false, reason: SPOOL_POLL_REASON };
284
+ }
285
+ }
286
+
259
287
  if (operation === 'mutable-resolve' && extra && (!extra.witness_evidence || String(extra.witness_evidence).trim() === '')) {
260
288
  logDeviation('deviation.mutable-without-evidence', { mutable_id: extra.id || null });
261
289
  }
@@ -291,4 +319,4 @@ function checkDispatchGates(sessionId, operation, extra) {
291
319
  return { allowed: true };
292
320
  }
293
321
 
294
- module.exports = { dispatchSpool, checkDispatchGates, isWorktreeDirty, hasUnpushedCommits, unsolicitedDocs, logDeviation, markInstructionSeen, hasDispatchedInstruction };
322
+ module.exports = { dispatchSpool, checkDispatchGates, isWorktreeDirty, hasUnpushedCommits, unsolicitedDocs, logDeviation, markInstructionSeen, hasDispatchedInstruction, isSpoolPollCommand, SPOOL_POLL_REASON };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gm-skill",
3
- "version": "2.0.1206",
3
+ "version": "2.0.1208",
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.1206"
42
+ "gm-plugkit": "^2.0.1208"
43
43
  },
44
44
  "engines": {
45
45
  "node": ">=16.0.0"