gm-skill 2.0.1238 → 2.0.1239

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.1238` — auto-bumped from the canonical `gm` repo. Every push to `AnEntrypoint/gm` (or any cascading sibling crate) republishes this package.
38
+ `2.0.1239` — 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/gm.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gm",
3
- "version": "2.0.1238",
3
+ "version": "2.0.1239",
4
4
  "description": "Spool-dispatch orchestration engine with unified state machine, skills, and automated git enforcement",
5
5
  "author": "AnEntrypoint",
6
6
  "license": "MIT",
@@ -203,11 +203,11 @@ const SPOOL_POLL_PATTERNS = [
203
203
  /\bwhile\b[^;]*?(?:!|-not)\s*(?:-(?:f|e)\s+|Test-Path\s+)[^;]*?\.gm[\\/](?:exec-spool|spool)/i,
204
204
  /\buntil\b[^;]*?(?:-f|-e|Test-Path)\s+[^;]*?\.gm[\\/](?:exec-spool|spool)/i,
205
205
  /\bfor\s+i\s+in\b[^;]*?;\s*do\b[^;]*?(?:sleep|Start-Sleep)[^;]*?\.gm[\\/](?:exec-spool|spool)/i,
206
- /\b(?:cat|head|tail|less|more|type|Get-Content|gc)\s+(?:-[A-Za-z]+\s+)*['"]?[^'"|;&]*\.gm[\\/](?:exec-spool|spool)[\\/]/i,
207
- /\b(?:ls|dir|Get-ChildItem|gci)\s+(?:-[A-Za-z]+\s+)*['"]?[^'"|;&]*\.gm[\\/](?:exec-spool|spool)[\\/]/i,
208
- /\b(?:test|Test-Path|tp)\s+(?:-[A-Za-z]+\s+)?['"]?[^'"|;&]*\.gm[\\/](?:exec-spool|spool)[\\/]/i,
206
+ /\b(?:cat|head|tail|less|more|type|Get-Content|gc)\s+(?:-[A-Za-z]+\s+)*['"]?[^'"|;&]*\.gm[\\/](?:exec-spool|spool)[\\/]\.status\.json\b/i,
207
+ /\b(?:cat|head|tail|less|more|type|Get-Content|gc)\s+(?:-[A-Za-z]+\s+)*['"]?[^'"|;&]*\.gm[\\/](?:exec-spool|spool)[\\/]\.watcher\.log\b/i,
208
+ /\b(?:ls|dir|Get-ChildItem|gci)\s+(?:-[A-Za-z]+\s+)*['"]?[^'"|;&]*\.gm[\\/](?:exec-spool|spool)(?:[\\/](?:in|out)?)?[\\/]?['"]?\s*(?:$|[|;&])/i,
209
+ /\b(?:test|Test-Path|tp)\s+(?:-[A-Za-z]+\s+)?['"]?[^'"|;&]*\.gm[\\/](?:exec-spool|spool)[\\/](?:out|in)[\\/]/i,
209
210
  /\bfind\b[^|]*['"]?[^'"|;&]*\.gm[\\/](?:exec-spool|spool)\b/i,
210
- /\b(?:stat|file|wc|Get-Item|gi|Get-Acl|Resolve-Path|Select-String|sls)\b[^|]*['"]?[^'"|;&]*\.gm[\\/](?:exec-spool|spool)[\\/]?/i,
211
211
  /\b(?:xargs|parallel|fzf)\b[^|]*\.gm[\\/](?:exec-spool|spool)/i,
212
212
  ];
213
213
 
@@ -251,6 +251,20 @@ function deferMarkerIn(text) {
251
251
  return null;
252
252
  }
253
253
 
254
+ function readPendingStep(cwd) {
255
+ try {
256
+ const f = path.join(cwd, '.gm', 'turn-state.json');
257
+ if (!fs.existsSync(f)) return null;
258
+ const st = JSON.parse(fs.readFileSync(f, 'utf8'));
259
+ if (!st || !st.pending_step_id) return null;
260
+ const deadline = Number(st.pending_step_deadline_ms || 0);
261
+ if (deadline && Date.now() > deadline) return null;
262
+ return { step_id: st.pending_step_id, deadline_ms: deadline };
263
+ } catch (_) { return null; }
264
+ }
265
+
266
+ const AWAIT_RESULT_ALLOWED_VERBS = new Set(['memorize-continue', 'instruction', 'phase-status', 'health']);
267
+
254
268
  function checkDispatchGates(sessionId, operation, extra) {
255
269
  const cwd = process.cwd();
256
270
  const gm = path.join(cwd, '.gm');
@@ -259,6 +273,19 @@ function checkDispatchGates(sessionId, operation, extra) {
259
273
  const needsGmPath = path.join(gm, 'needs-gm');
260
274
  const gmFiredPath = path.join(gm, `gm-fired-${sessionId}`);
261
275
 
276
+ if (operation === 'verb' && extra && extra.verb) {
277
+ const pending = readPendingStep(cwd);
278
+ if (pending && !AWAIT_RESULT_ALLOWED_VERBS.has(extra.verb)) {
279
+ logDeviation('deviation.await-result-violation', { verb: extra.verb, step_id: pending.step_id });
280
+ return {
281
+ allowed: false,
282
+ reason: `pipeline suspended at step_id=${pending.step_id}; only memorize-continue advances state. Read the AWAIT-RESULT instruction (dispatch \`instruction\`), compute the step inline using its prompt_template, then dispatch memorize-continue with the result. No other verb is valid until this completes.`,
283
+ await_result: true,
284
+ pending_step_id: pending.step_id,
285
+ };
286
+ }
287
+ }
288
+
262
289
  if (['stop', 'complete'].includes(operation)) {
263
290
  const residuals = [];
264
291
  if (fs.existsSync(prdPath)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gm-skill",
3
- "version": "2.0.1238",
3
+ "version": "2.0.1239",
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.1238"
42
+ "gm-plugkit": "^2.0.1239"
43
43
  },
44
44
  "engines": {
45
45
  "node": ">=16.0.0"