gm-skill 2.0.1166 → 2.0.1167
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/plugkit.version +1 -1
- package/bin/plugkit.wasm +0 -0
- package/bin/plugkit.wasm.sha256 +1 -1
- package/gm.json +2 -2
- package/package.json +2 -2
- package/skills/gm-skill/SKILL.md +8 -118
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.1167` — 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/plugkit.version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.1.
|
|
1
|
+
0.1.421
|
package/bin/plugkit.wasm
CHANGED
|
Binary file
|
package/bin/plugkit.wasm.sha256
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
f387aea642ed6a5fc23206992ff84537653503b467edff51e8df95b1100d86ca plugkit.wasm
|
package/gm.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gm",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1167",
|
|
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.
|
|
20
|
+
"plugkitVersion": "0.1.421"
|
|
21
21
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gm-skill",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1167",
|
|
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.1167"
|
|
43
43
|
},
|
|
44
44
|
"engines": {
|
|
45
45
|
"node": ">=16.0.0"
|
package/skills/gm-skill/SKILL.md
CHANGED
|
@@ -1,133 +1,23 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gm-skill
|
|
3
|
-
description: AI-native software engineering harness.
|
|
3
|
+
description: AI-native software engineering harness. Every action routes through plugkit via the spool. The agent dispatches verbs; plugkit owns phase, mutables, PRD, recall, instructions, and every other concern.
|
|
4
4
|
allowed-tools: Skill, Read, Write, Bash(node *), Bash(bun *)
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# gm —
|
|
7
|
+
# gm — only plugkit
|
|
8
8
|
|
|
9
|
-
Every turn
|
|
9
|
+
Plugkit owns the discipline. Every turn, dispatch the `instruction` verb and follow the prose it returns. There is no other tool to reach for, no other source of policy to consult, no other surface to plan against. Read/Edit/Bash/Grep/Glob before the first `instruction` dispatch is the failure mode this skill prevents — every one of those is a step taken outside the loop, and the loop is the work.
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
15
|
-
When the question is how wide, how deep, how many phases, how destructive — the answer is wider, deeper, every phase, fully. The shape of the work is whatever the request admits at its outermost reach from this session. Half-measures, single-slice reads, narrow takes, and "do the minimum that satisfies" are forced closure wearing humility. The covering family is the default; the smaller cut is the exception, and the exception requires a named blocker. Larger always beats smaller when both are witnessable.
|
|
16
|
-
|
|
17
|
-
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.
|
|
18
|
-
|
|
19
|
-
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.
|
|
20
|
-
|
|
21
|
-
If the `instruction` response carries a non-null `update_available`, plugkit drift has been detected on disk and the running watcher is behind. Rebootstrap before continuing — newer fixes are sitting on disk unused, and every dispatch is wasted on stale code. `bun x gm-plugkit@latest` (or `npx -y gm-plugkit@latest`) is the one-shot: it fetches the new wasm, replaces the artifact, and the watcher reloads. Drift past one version is a deviation.
|
|
22
|
-
|
|
23
|
-
If `running_tasks` is non-empty, you own them — every entry is a subprocess you started that's still consuming CPU/memory. Stop ones that have outlived their purpose with `task-stop` (write `.gm/exec-spool/in/task-stop/<N>.txt` with `{id: "t<n>"}`). The 15-min idle reaper is the last resort, not a substitute for hygiene. If `stuck_spool` is non-empty, dispatches are wedged — the watcher's host_exec_js is synchronous and a stuck body blocks every other verb until it returns. Diagnose via `.watcher.log` and consider rebootstrapping if it doesn't clear; spool bodies are Turing-complete and can loop forever. Long-running work goes through `task-spawn` (returns a `task_id` immediately, body runs detached), not through the sync `nodejs`/`bash`/`python` language verbs.
|
|
24
|
-
|
|
25
|
-
If `should_residual_scan` is true, dispatch `residual-scan` before any text response that reads like a stop. The marker is one-shot per stopping window — re-checking after you've fired it is fine; firing it for the first time in a session that has pending work is non-negotiable. If `unsupervised_watcher` is non-null, the running watcher predates supervisor.js and has no unplanned-restart recovery; stop the named PID and let the next bootstrap re-spawn it under supervision.
|
|
26
|
-
|
|
27
|
-
No deferral phrasing. "Next pass", "next session", "future work", "defer to later", "address it next", "below criticality", "do later", "fix later" are all forced closure dressed up. `prd-add` rejects items whose description/subject/notes contain these markers unless the item carries `blockedBy: [external]` or `blockedBy: [out-of-reach]`. The dispatch gate also rejects git commits whose message contains them. Per §22 Fix on Sight: in-spirit reachable work is executed this turn, not deferred. If the work is genuinely unreachable, declare it with blockedBy; that's an auditable refusal, not a defer.
|
|
28
|
-
|
|
29
|
-
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.
|
|
30
|
-
|
|
31
|
-
The watcher self-shuts-down after 15 minutes idle (no spool I/O, no live browser session) and is restarted on next agent activity by a detached supervisor. `.gm/exec-spool/.unplanned-restart.json` is a critical-failure marker — present means a prior watcher died without a planned shutdown. Treat as a PRD-worthy incident on sight: diagnose via `.watcher.log` and `gm-log/<day>/plugkit.jsonl` events `supervisor.watcher-exited-unexpectedly` and `supervisor.heartbeat-stale` around the prior_status.ts timestamp, then delete the marker once root cause is named.
|
|
32
|
-
|
|
33
|
-
## Boot the spool watcher (first turn only)
|
|
34
|
-
|
|
35
|
-
Check `.gm/exec-spool/.status.json`. If absent or `ts` > 15s old, boot via the npm package — `bun x gm-plugkit@latest spool` fetches the freshest plugkit (wasm + wrapper), copies them into `~/.claude/gm-tools/`, then enters spool mode:
|
|
11
|
+
If `.gm/exec-spool/.status.json` is absent or its `ts` is older than 15s, boot the watcher first — that is the one thing this skill does directly, because nothing else can be served until the spool is alive:
|
|
36
12
|
|
|
37
13
|
```
|
|
38
14
|
bun x gm-plugkit@latest spool > /dev/null 2>&1 &
|
|
39
15
|
```
|
|
40
16
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
Wait 2 seconds, then verify boot:
|
|
44
|
-
|
|
45
|
-
- Read `.gm/exec-spool/.cli-status.json` — the launcher writes its phase here (`starting` → `bootstrapped` → `ready`). Present with `phase: "ready"` = good.
|
|
46
|
-
- Read `.gm/exec-spool/.status.json` — the watcher writes its heartbeat here every 5s. Fresh `ts` (within 15s) = watcher alive.
|
|
47
|
-
- If neither file exists or `.cli-status.json` is stuck at an earlier phase, read `.gm/exec-spool/.bootstrap-error.json` — the launcher writes `{error_phase, error_message, stack}` on any failure even when stdout/stderr were redirected to `/dev/null`. Also read `.gm/exec-spool/.watcher.log` for the post-spawn trace. Surface the error to the user; do not retry blindly.
|
|
48
|
-
|
|
49
|
-
## Plugkit version updates
|
|
50
|
-
|
|
51
|
-
The watcher checks GitHub Releases every 5 minutes for a newer plugkit. If drift is detected, it writes `.gm/exec-spool/.update-available.json` with `{installed, latest, instruction, update_url}`; if no drift, the file is removed. Read this file at session start (and occasionally afterward); if present, kill the current watcher, run `bootstrapPlugkit({latest: true})` once to fetch the new wasm, then restart the watcher. Default bootstrap never hits the network — only `{latest: true}` fetches the newest binary.
|
|
52
|
-
|
|
53
|
-
## Dispatch ABI
|
|
54
|
-
|
|
55
|
-
Write request body to `.gm/exec-spool/in/<verb>/<N>.txt`. Read response from `.gm/exec-spool/out/<verb>-<N>.json` (nested verbs) or `out/<N>.json` (root verbs). Bodies are JSON, raw code, or a single phase name depending on the verb.
|
|
56
|
-
|
|
57
|
-
## Batch dispatch — never serial round-trips for independent verbs
|
|
58
|
-
|
|
59
|
-
The watcher processes verbs sequentially internally, but the agent's bottleneck is round-trip latency, not the watcher. **Write N inputs in one message via parallel Write tool calls, then read N outputs in one message via parallel Read calls.** A 5-verb batch is one agent turn, not five.
|
|
60
|
-
|
|
61
|
-
Example PLAN orient pack — 3 recalls + 3 codesearches in ONE message:
|
|
62
|
-
```
|
|
63
|
-
Write .gm/exec-spool/in/recall/1.txt body: {"query":"<noun A>"}
|
|
64
|
-
Write .gm/exec-spool/in/recall/2.txt body: {"query":"<noun B>"}
|
|
65
|
-
Write .gm/exec-spool/in/recall/3.txt body: {"query":"<noun C>"}
|
|
66
|
-
Write .gm/exec-spool/in/codesearch/1.txt body: {"query":"<phrase X>"}
|
|
67
|
-
Write .gm/exec-spool/in/codesearch/2.txt body: {"query":"<phrase Y>"}
|
|
68
|
-
Write .gm/exec-spool/in/codesearch/3.txt body: {"query":"<phrase Z>"}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
Then in the NEXT message, all 6 Reads in parallel.
|
|
72
|
-
|
|
73
|
-
For dependent verbs (transition after instruction, prd-resolve after work), the agent must serialize — but only at the dependency boundary, not across independent dispatches.
|
|
74
|
-
|
|
75
|
-
## State lives in plugkit, not in conversation context
|
|
76
|
-
|
|
77
|
-
Never Read `.gm/prd.yml` or `.gm/mutables.yml` directly. Every `instruction` response carries the data you need:
|
|
78
|
-
|
|
79
|
-
```
|
|
80
|
-
{
|
|
81
|
-
phase, // current phase
|
|
82
|
-
instruction, // phase prose (the active discipline)
|
|
83
|
-
prd_items: [...], // full PRD items with id, subject, status, fields
|
|
84
|
-
prd_pending_count,
|
|
85
|
-
mutables_pending: [{id, claim, witness_method, witness_evidence, status}, ...],
|
|
86
|
-
recall_hits: [...], // auto-fired against phase + first pending PRD subject
|
|
87
|
-
next_phase_hint
|
|
88
|
-
}
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## Plugkit observability — read .watcher.log
|
|
92
|
-
|
|
93
|
-
The watcher writes its own stdout + stderr (plus the wasm cdylib's `println!`/`eprintln!`) to `.gm/exec-spool/.watcher.log`. Useful when:
|
|
94
|
-
|
|
95
|
-
- A dispatch returned an error you don't understand → tail the log for the stack
|
|
96
|
-
- A verb seems slow → log shows `[dispatch] ← verb=X ms=N`
|
|
97
|
-
- Sweep cleaned up something → log shows `[retention]` or `[stale-sweep]` lines
|
|
98
|
-
- Watcher boot issues → `--- watcher boot ... ---` markers
|
|
99
|
-
|
|
100
|
-
Read with `offset` to tail:
|
|
101
|
-
```
|
|
102
|
-
Read .gm/exec-spool/.watcher.log offset=<last-known-line>
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
The log is rotated at 10MB (older content moves to `.watcher.log.1`).
|
|
106
|
-
|
|
107
|
-
## The loop
|
|
108
|
-
|
|
109
|
-
Add PRD items via `prd-add` (JSON body), resolve via `prd-resolve` (id as body). Add mutables via `mutable-add`, resolve via `mutable-resolve` once `witness_evidence` is filled — narrative resolution is rejected; only file:line, codesearch hit, or exec output snippet counts. Every `mutable-resolve` auto-fires memorize so the witness becomes recall-able next session.
|
|
110
|
-
|
|
111
|
-
Resolve every entry in `mutables_pending` before transitioning. When the phase's exit condition is met, dispatch `transition` with the next phase name (or empty for auto-advance). Each transition response embeds `recall_hits` automatically — relevant prior memos surface without you asking.
|
|
112
|
-
|
|
113
|
-
Stop only when `phase` is `COMPLETE` AND `residual-scan` returns empty AND the worktree is clean AND CI is green. Any of those false means the chain has not finished.
|
|
114
|
-
|
|
115
|
-
## Orchestrator verbs
|
|
116
|
-
|
|
117
|
-
`instruction`, `transition`, `phase-status`, `prd-add`, `prd-resolve`, `prd-list`, `mutable-add`, `mutable-resolve`, `mutable-list`, `memorize-fire`, `residual-scan`, `auto-recall`, `task-spawn`, `task-list`, `task-stop`, `task-output`.
|
|
118
|
-
|
|
119
|
-
## Host verbs
|
|
120
|
-
|
|
121
|
-
`fs_read`, `fs_write`, `fs_stat`, `fs_readdir`, `kv_get`, `kv_put`, `kv_query`, `fetch`, `exec_js`, `env_get`, `recall`, `codesearch`, `memorize`, `health`, `status`, `wait`, `sleep`, `close`, `kill-port`, `forget`, `feedback`, `learn-status`, `learn-debug`, `learn-build`, `discipline`, `pause`, `runner`, `inference`, `browser`.
|
|
122
|
-
|
|
123
|
-
## Language verbs
|
|
124
|
-
|
|
125
|
-
`nodejs`, `python`, `bash`, `powershell`, `ssh`, `go`, `rust`, `c`, `cpp`, `java`, `deno` — write raw code as the request body.
|
|
126
|
-
|
|
127
|
-
### Browser
|
|
17
|
+
(`npx -y gm-plugkit@latest spool > /dev/null 2>&1 &` if `bun` is missing.) Wait 2s, confirm `.status.json` heartbeat is fresh, then proceed.
|
|
128
18
|
|
|
129
|
-
|
|
19
|
+
Now dispatch `instruction` by writing an empty body to `.gm/exec-spool/in/instruction/<N>.txt` and reading the response from `.gm/exec-spool/out/instruction-<N>.json`. The response carries the active phase prose, the PRD, the open mutables, prior recall, and every signal that should shape the next action. Follow that prose imperatively. When its exit condition is met, dispatch `transition`. The chain runs PLAN → EXECUTE → EMIT → VERIFY → COMPLETE under plugkit's direction; this skill does not duplicate that prose, does not enumerate verbs, does not describe the dispatch format — plugkit will, on demand, when you ask it.
|
|
130
20
|
|
|
131
|
-
|
|
21
|
+
Nothing else lives here. Every concern that feels like it belongs in this file — how to batch, what verbs exist, when to scan for residuals, how the browser surface works, where the watcher logs go, how updates land, when to stop — is served by `instruction` when the moment calls for it. Trying to remember it from this skill instead of asking plugkit is forced closure: the agent acts on a stale snapshot of policy instead of the live one plugkit holds.
|
|
132
22
|
|
|
133
|
-
|
|
23
|
+
Only plugkit.
|