gm-skill 2.0.1150 → 2.0.1152

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.1150` — auto-bumped from the canonical `gm` repo. Every push to `AnEntrypoint/gm` (or any cascading sibling crate) republishes this package.
38
+ `2.0.1152` — 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.415
1
+ 0.1.416
package/bin/plugkit.wasm CHANGED
Binary file
@@ -1 +1 @@
1
- 3af3d80f571bec77e28471184811226f865a150cfcbecef00b6d90e2ed90c140 plugkit.wasm
1
+ 748ab8b58d5c09a447b13cd880853ddecbe1ad3a49ca7ba52501a49e3a6b92d2 plugkit.wasm
package/gm.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gm",
3
- "version": "2.0.1150",
3
+ "version": "2.0.1152",
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.415"
20
+ "plugkitVersion": "0.1.416"
21
21
  }
@@ -50,6 +50,33 @@ function hasUnpushedCommits(cwd) {
50
50
  }
51
51
  }
52
52
 
53
+ const TOPLEVEL_DOC_ALLOWLIST = new Set(['AGENTS.md', 'CLAUDE.md', 'README.md', 'SKILLS.md', 'CHANGELOG.md', 'LICENSE', 'LICENSE.md']);
54
+
55
+ function unsolicitedDocs(cwd) {
56
+ try {
57
+ const r = spawnSync('git', ['status', '--porcelain'], {
58
+ cwd: cwd || process.cwd(), encoding: 'utf8', timeout: 1500, windowsHide: true
59
+ });
60
+ if (r.status !== 0) return { count: 0, files: [], available: false };
61
+ const flagged = [];
62
+ for (const line of r.stdout.split('\n')) {
63
+ if (!line.startsWith('?? ')) continue;
64
+ const rel = line.slice(3).trim();
65
+ if (!rel) continue;
66
+ if (!/\.(md|txt)$/i.test(rel)) continue;
67
+ if (rel.includes('/')) {
68
+ if (rel.startsWith('node_modules/') || rel.startsWith('target/') || rel.startsWith('.gm/') || rel.startsWith('dist/') || rel.startsWith('build/')) continue;
69
+ } else {
70
+ if (TOPLEVEL_DOC_ALLOWLIST.has(rel)) continue;
71
+ }
72
+ flagged.push(rel);
73
+ }
74
+ return { count: flagged.length, files: flagged, available: true };
75
+ } catch (_) {
76
+ return { count: 0, files: [], available: false };
77
+ }
78
+ }
79
+
53
80
  async function dispatchSpool(cmd, lang, body, timeoutMs, sessionId) {
54
81
  const taskId = `${Date.now()}-${Math.random().toString(16).slice(2, 8)}`;
55
82
  const langDir = lang.match(/^(nodejs|python|bash|typescript|go|rust|c|cpp|java|deno)$/) ? lang : 'nodejs';
@@ -177,6 +204,13 @@ function checkDispatchGates(sessionId, operation, extra) {
177
204
  if (unpushed.available && unpushed.unpushed) {
178
205
  residuals.push(`${unpushed.count} unpushed commit${unpushed.count === 1 ? '' : 's'} — push to remote before declaring done`);
179
206
  }
207
+ const docs = unsolicitedDocs(cwd);
208
+ if (docs.available && docs.count > 0) {
209
+ residuals.push(`${docs.count} unsolicited doc${docs.count === 1 ? '' : 's'} (${docs.files.slice(0, 3).join(', ')}${docs.files.length > 3 ? ', …' : ''}) — delete or fold into commit/PRD/memorize, do not ship`);
210
+ for (const f of docs.files) {
211
+ logDeviation('deviation.unsolicited-doc-created', { file: f, operation });
212
+ }
213
+ }
180
214
  if (residuals.length > 0) {
181
215
  logDeviation('deviation.gate-deny', { operation, reason: 'stop-gate residuals', residuals });
182
216
  return { allowed: false, reason: `stop-gate residuals: ${residuals.join('; ')}`, residuals };
@@ -212,4 +246,4 @@ function checkDispatchGates(sessionId, operation, extra) {
212
246
  return { allowed: true };
213
247
  }
214
248
 
215
- module.exports = { dispatchSpool, checkDispatchGates, isWorktreeDirty, hasUnpushedCommits, logDeviation, markInstructionSeen, hasDispatchedInstruction };
249
+ module.exports = { dispatchSpool, checkDispatchGates, isWorktreeDirty, hasUnpushedCommits, unsolicitedDocs, logDeviation, markInstructionSeen, hasDispatchedInstruction };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gm-skill",
3
- "version": "2.0.1150",
3
+ "version": "2.0.1152",
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.1150"
42
+ "gm-plugkit": "^2.0.1152"
43
43
  },
44
44
  "engines": {
45
45
  "node": ">=16.0.0"
@@ -12,6 +12,8 @@ Direct Read/Edit/Bash before the first `instruction` dispatch is the failure mod
12
12
 
13
13
  Fix on Sight. Every unexpected output, broken neighbor, lockfile drift, suppressed error, or stale generated file surfaced during work becomes a PRD item the same turn and is executed before COMPLETE. Surprise is a new mutable, not noise to absorb. Stubs, mocks, placeholder returns, fixture-only paths, and "always succeeds" code paths are forbidden in shipped material; acceptance is real input through real code into real output, witnessed. Edits to code that runs in a browser require a live `browser` verb witness in the same turn — Browser Witness is non-negotiable.
14
14
 
15
+ Do not create documentation files the user did not ask for. No COMPLETED.md, no SUMMARY.txt, no IMPLEMENTATION_NOTES.md, no START-HERE.md, no *-STATUS.md, no build-output.txt left behind, no new top-level `.md` or `.txt` of any kind. Closure narrative lives in the PRD (which plugkit owns), in `memorize-fire` (which becomes recallable next session), and in the commit message (which `git log` preserves) — those are the only sanctioned destinations. A new doc at project root, in `docs/`, or anywhere else is a residual the next stop-gate will flag.
16
+
15
17
  Before any apparent stop, dispatch `residual-scan`. If it returns work that fits the spirit of the original ask and is reachable from this session, expand the PRD and execute; only residuals genuinely out-of-spirit or out-of-reach are name-and-stop. A turn that ends with uncommitted changes, an open PRD slice, or unresolved mutables has not actually stopped — it has stalled the chain.
16
18
 
17
19
  The wasm artifact lives at `~/.claude/gm-tools/plugkit.wasm`; the spool watcher runs it. The watcher's own stdout/stderr is appended to `.gm/exec-spool/.watcher.log` — Read it to see plugkit's internal trace, dispatch timings, sweep actions, errors.