@techgoblin/gobstack 0.4.4-beta.4 → 0.4.4-beta.7
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 +29 -26
- package/bin/goblin +19 -18
- package/bin/goblin-doctor +3 -3
- package/bin/goblin-emit +3 -3
- package/bin/goblin-init +139 -95
- package/bin/goblin-install +1 -1
- package/bin/goblin-upgrade +5 -5
- package/bin/goblin-verify +1 -1
- package/bin/goblin.js +22 -22
- package/docs/GUIDE.md +26 -25
- package/docs/w6-tty-redraw-pty-transcript.txt +334 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ and a rule that cannot be checked is counted rather than asserted.
|
|
|
7
7
|
|
|
8
8
|
Install it from npm — globally; it is a CLI, not a library:
|
|
9
9
|
|
|
10
|
-
npm install -g @techgoblin/gobstack@beta # gives you the `
|
|
10
|
+
npm install -g @techgoblin/gobstack@beta # gives you the `gob` CLI (`goblin` remains as a legacy alias)
|
|
11
11
|
npx @techgoblin/gobstack@beta init # or the one-shot: run the wizard, install nothing globally
|
|
12
12
|
|
|
13
13
|
## Install
|
|
@@ -27,8 +27,8 @@ never imports, and can fail resolution outright with `ERESOLVE` when the app's o
|
|
|
27
27
|
dependencies disagree with npm's. If you see `ERESOLVE` after a local install, remove the
|
|
28
28
|
dependency from `package.json` and install globally instead.
|
|
29
29
|
|
|
30
|
-
**The two-layer model.** The global install gives you the CLI only. `
|
|
31
|
-
`
|
|
30
|
+
**The two-layer model.** The global install gives you the CLI only. `gob init` (or
|
|
31
|
+
`gob install --target <dir> --class A`) then vendors a self-contained engine into the target
|
|
32
32
|
repo under `.goblin/` — verifier, manifest, ban probes, skills, all of it. That second layer is
|
|
33
33
|
why an initialized repo keeps working on machines with **no gobstack installed at all**: the
|
|
34
34
|
engine lives in the repo, not in your `node_modules`, and `bash .goblin/bin/goblin-verify` (or a
|
|
@@ -36,7 +36,7 @@ plain `git` + `bash` box) is the only runtime the repo's gate needs.
|
|
|
36
36
|
|
|
37
37
|
Then, from any project:
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
gob install --target /path/to/repo --class A
|
|
40
40
|
|
|
41
41
|
The installer writes only paths it records, hash-compares before writing, and prints `no-op` on a
|
|
42
42
|
second run with the same arguments. It never overwrites `HANDOFF.md`, `AGENTS.md`, a `*-SPEC.md`,
|
|
@@ -49,9 +49,9 @@ failure: reconcile the file rather than forcing over it — `docs/ADOPTION.md`.
|
|
|
49
49
|
After installing, in this order:
|
|
50
50
|
|
|
51
51
|
cd <target> && git add -A && git commit # the install is a change like any other
|
|
52
|
-
|
|
52
|
+
gob verify # or .goblin/bin/goblin-verify, inside the target
|
|
53
53
|
hermes skills trust <target> # one-time, Hermes users, so project-tier skills load
|
|
54
|
-
|
|
54
|
+
gob audit # once, deliberately: the ONLY network step (SC-07)
|
|
55
55
|
|
|
56
56
|
**A class-A install verifies green — `43 passed, 0 failed, 11 advisory, 28 skipped`, exit 0 — once
|
|
57
57
|
`HANDOFF.md` names a commit that exists. Before that edit the scaffold's `0000000` placeholder is
|
|
@@ -76,23 +76,26 @@ that only a round can produce — a first review note, a gate that is not the sh
|
|
|
76
76
|
*vacuously* rather than failing, and `P8` (`goblin-bootstrap`) still walks them as work to do.
|
|
77
77
|
The measurement and the vacuous-pass reading are in `docs/CONTRACTS.md`.
|
|
78
78
|
|
|
79
|
-
## The `
|
|
79
|
+
## The `gob` CLI
|
|
80
80
|
|
|
81
81
|
| command | what it does |
|
|
82
82
|
|---|---|
|
|
83
|
-
| `
|
|
84
|
-
| `
|
|
85
|
-
| `
|
|
86
|
-
| `
|
|
87
|
-
| `
|
|
88
|
-
| `
|
|
89
|
-
| `
|
|
90
|
-
| `
|
|
91
|
-
| `
|
|
83
|
+
| `gob verify` | run the rule matrix against the current repo — `PASS`/`FAIL`/`SKIP` per row, exit 0 pass · 1 a check failed · 2 could not run · 3 the manifest is broken |
|
|
84
|
+
| `gob bans` | run the ban list (per-pattern red lines over the source tree) |
|
|
85
|
+
| `gob audit` | check recorded dependency claims against live advisory feeds — the only command that touches the network |
|
|
86
|
+
| `gob install` | install the manifest, skills and verifier into a target repo |
|
|
87
|
+
| `gob uninstall` | remove everything an install wrote, byte-exactly (`gob install --target <dir> --uninstall` is the same job) |
|
|
88
|
+
| `gob upgrade` | migrate a repo to the shared global engine at `~/.goblin/engine` — 8 steps, two commits, one report |
|
|
89
|
+
| `gob doctor` | one run across the platforms below: DETECTED / NOT-DETECTED / DRIFT per platform |
|
|
90
|
+
| `gob emit` | write the skills + context block for one platform (`--scope project` or `global`); `--unshadow` removes a hermes project skill whose hash equals the source |
|
|
91
|
+
| `gob init` | the first-run wizard: detect → class → branch/email → first gate → emit → verify, one screen per question; every question has a flag (`--class app --branch main --email a@b.c --gate 'cmd' --emit hermes`), so CI runs it with zero prompts; `--dry-run` prints the plan and writes nothing |
|
|
92
|
+
|
|
93
|
+
`goblin` remains as a legacy alias for every command above — existing scripts keep working, but
|
|
94
|
+
new commands and docs use `gob`.
|
|
92
95
|
|
|
93
96
|
## Platforms
|
|
94
97
|
|
|
95
|
-
`
|
|
98
|
+
`gob emit` and `gob doctor` cover seven agent platforms, each detected via its own anchor:
|
|
96
99
|
|
|
97
100
|
| platform | what emit writes there |
|
|
98
101
|
|---|---|
|
|
@@ -104,7 +107,7 @@ The measurement and the vacuous-pass reading are in `docs/CONTRACTS.md`.
|
|
|
104
107
|
| `codex` | skills + context block under `~/.codex` (partial: some commands blocked, `docs/LIMITS.md` #47) |
|
|
105
108
|
| `gemini` | skills + context block under `~/.gemini` (partial: some commands blocked, `docs/LIMITS.md` #47) |
|
|
106
109
|
|
|
107
|
-
One run of `
|
|
110
|
+
One run of `gob emit --platform <p> --scope project` writes the skills and the context block a
|
|
108
111
|
session of that platform reads; `--scope global` writes to the machine-level anchor. `--dry-run`
|
|
109
112
|
prints the full write plan first.
|
|
110
113
|
|
|
@@ -143,7 +146,7 @@ vocabulary.
|
|
|
143
146
|
|
|
144
147
|
## Verify
|
|
145
148
|
|
|
146
|
-
|
|
149
|
+
gob verify [--only <id[,id...]>] [--json] [--list] [--source <path>]
|
|
147
150
|
|
|
148
151
|
Exit codes: `0` pass · `1` a check failed · `2` could not
|
|
149
152
|
run · `3` the manifest is broken. Every run prints what it cannot see.
|
|
@@ -166,7 +169,7 @@ touches the others.
|
|
|
166
169
|
|
|
167
170
|
npm uninstall -g @techgoblin/gobstack
|
|
168
171
|
|
|
169
|
-
This removes the `
|
|
172
|
+
This removes the `gob` (and legacy `goblin`) commands from the machine and nothing else: no project, no
|
|
170
173
|
repo, no `.goblin/` directory anywhere is touched. Repos you already initialized keep working
|
|
171
174
|
fully — the engine is vendored into each repo's `.goblin/`, so the CLI's absence removes no
|
|
172
175
|
capability (you lose the installer/upgrade/emit entry points, not the gate; see layer (c) for
|
|
@@ -174,10 +177,10 @@ the machine-level skills the CLI wrote).
|
|
|
174
177
|
|
|
175
178
|
**(b) A project's harness** — the `.goblin/` tree an install created in one repo:
|
|
176
179
|
|
|
177
|
-
|
|
180
|
+
gob uninstall --target .
|
|
178
181
|
|
|
179
|
-
(equivalently `
|
|
180
|
-
`gob
|
|
182
|
+
(equivalently `gob install --target . --uninstall` — through the legacy alias, spell it `goblin`
|
|
183
|
+
instead of `gob`). The uninstall is **byte-exact**: it removes exactly the files
|
|
181
184
|
`installed.json` records — hash-compared preimages, so a file you edited after install is
|
|
182
185
|
reported and kept, never clobbered — then every directory that leaves empty. After it, the repo
|
|
183
186
|
has zero goblin files; only the project's own record (`HANDOFF.md`, `AGENTS.md`, `reviews/`, the
|
|
@@ -188,19 +191,19 @@ self-contained until the moment you remove it.
|
|
|
188
191
|
**(c) Global agent skills** — the machine-level skills an `emit --scope global` wrote outside any
|
|
189
192
|
repo:
|
|
190
193
|
|
|
191
|
-
|
|
194
|
+
gob emit --undo --platform <p> --scope global
|
|
192
195
|
|
|
193
196
|
(`--undo` is the same byte-exact reversal as `--uninstall`, under its friendlier name). By hand,
|
|
194
197
|
the same job is deleting the platform's anchor entries: `~/.claude/skills/goblin-*` (and the
|
|
195
198
|
equivalents under `~/.hermes`, `~/.copilot`, `~/.cursor`, `~/.config/opencode`, `~/.codex`,
|
|
196
|
-
`~/.gemini` — `
|
|
199
|
+
`~/.gemini` — `gob doctor` lists which platforms were detected).
|
|
197
200
|
|
|
198
201
|
The short version, for a full removal from a machine and its repos: (c) first, then (b) in each
|
|
199
202
|
initialized repo, then (a).
|
|
200
203
|
|
|
201
204
|
## Re-pin the referenced standard
|
|
202
205
|
|
|
203
|
-
|
|
206
|
+
gob install --target <dir> --re-pin
|
|
204
207
|
|
|
205
208
|
`practice_sha256:` pins the referenced standard and `IN-02` re-checks it, so editing that standard
|
|
206
209
|
— a legitimate, intended edit — reds `IN-02` in every installed repo. `--re-pin` re-records that
|
package/bin/goblin
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
# goblin — the global CLI dispatcher (W1, PLAN-V1 §2.3 / W1-SPEC §3).
|
|
3
3
|
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
4
|
+
# gob verify [--only <id[,id...]>] [--json] [--list] [--source <path>]
|
|
5
|
+
# gob bans [--only <id[,id...]>] [--list]
|
|
6
|
+
# gob audit [--target <dir>] [--print]
|
|
7
|
+
# gob doctor [--platform <p>] # W4a
|
|
8
|
+
# gob emit --platform <p> [...] # W4a/W4b
|
|
9
|
+
# gob init [...] # W6: the first-run wizard
|
|
10
|
+
# gob upgrade [--target .] [...] # W3
|
|
11
|
+
# gob --version
|
|
12
12
|
#
|
|
13
|
-
# Identity: the package is
|
|
13
|
+
# Identity: the package is gobstack (npm @techgoblin/gobstack), the command is `gob`
|
|
14
|
+
# (`goblin` remains as a legacy alias). W1 ships the DISPATCH
|
|
14
15
|
# SHELL only — the node shim and npm packaging are W2, doctor/emit are W4a (exit-2
|
|
15
16
|
# placeholders naming their workstream), upgrade is W3 (same). G3 forbids a runtime
|
|
16
17
|
# rewrite: the engine stays bash, this file only routes and propagates.
|
|
@@ -39,16 +40,16 @@ g_err() { printf 'error: %s\n' "$*" >&2; }
|
|
|
39
40
|
|
|
40
41
|
usage() {
|
|
41
42
|
cat <<'USAGE'
|
|
42
|
-
|
|
43
|
+
gob — the gobstack command line.
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
45
|
+
gob verify [--only <id[,id...]>] [--json] [--list] [--source <path>]
|
|
46
|
+
gob bans [--only <id[,id...]>] [--list]
|
|
47
|
+
gob audit [--target <dir>] [--print]
|
|
48
|
+
gob doctor [--platform <p>] [--target <dir>]
|
|
49
|
+
gob emit --platform <p> --scope project|global [...]
|
|
50
|
+
gob init [--target <dir>] [--class app|A-F] [--dry-run]
|
|
51
|
+
gob upgrade [--target .] [--dry-run] [--yes] [--engine-dir <path>]
|
|
52
|
+
gob --version
|
|
52
53
|
|
|
53
54
|
Exit codes (verify): 0 pass | 1 a check failed | 2 could not run | 3 the manifest is
|
|
54
55
|
broken. Every subcommand propagates the engine's exit code verbatim.
|
package/bin/goblin-doctor
CHANGED
|
@@ -40,9 +40,9 @@ ADAPTERS_DIR="$SRC/adapters"
|
|
|
40
40
|
|
|
41
41
|
usage() {
|
|
42
42
|
cat <<USAGE
|
|
43
|
-
|
|
43
|
+
gob doctor — one run, seven platforms (W4a, the seven since W4b).
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
gob doctor [--platform <$_PLA|hermes|copilot|cursor|opencode|codex|$_G1$_G2>]
|
|
46
46
|
[--target <dir>] [--source <path>]
|
|
47
47
|
|
|
48
48
|
Prints, per platform: the verdict (DETECTED / NOT-DETECTED / DRIFT), the detected
|
|
@@ -71,7 +71,7 @@ PLATFORMS="$_PLA hermes copilot cursor opencode codex $_G1$_G2"
|
|
|
71
71
|
if [ -n "$ONLY" ]; then
|
|
72
72
|
case "$ONLY" in
|
|
73
73
|
$_PLA|hermes|copilot|cursor|opencode|codex|$_G1$_G2) PLATFORMS="$ONLY" ;;
|
|
74
|
-
*) die "unknown platform '$ONLY' -
|
|
74
|
+
*) die "unknown platform '$ONLY' - gob doctor ships $_PLA, hermes, copilot, cursor, opencode, codex, $_G1$_G2" 2 ;;
|
|
75
75
|
esac
|
|
76
76
|
fi
|
|
77
77
|
|
package/bin/goblin-emit
CHANGED
|
@@ -68,9 +68,9 @@ PREIMG="${GOBLIN_PREIMAGES:-$HOME/.goblin-stack/preimages}"
|
|
|
68
68
|
|
|
69
69
|
usage() {
|
|
70
70
|
cat <<USAGE
|
|
71
|
-
|
|
71
|
+
gob emit — per-platform emission (W4a, the seven platforms since W4b).
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
gob emit --platform <$_PLA|hermes|copilot|cursor|opencode|codex|$_G1$_G2>
|
|
74
74
|
--scope project|global
|
|
75
75
|
[--skills core|all|none] [--target <dir>] [--source <path>]
|
|
76
76
|
[--uninstall] [--unshadow] [--dry-run] [--strict]
|
|
@@ -143,7 +143,7 @@ case "$PLATFORM" in
|
|
|
143
143
|
"") printf 'error: emit: --platform is required\n' >&2; usage >&2; exit 2 ;;
|
|
144
144
|
$_PLA|hermes|copilot|cursor|opencode|codex|$_G1$_G2) ;;
|
|
145
145
|
*)
|
|
146
|
-
die "unknown platform '$PLATFORM' -
|
|
146
|
+
die "unknown platform '$PLATFORM' - gob emit ships $_PLA, hermes, copilot, cursor, opencode, codex, $_G1$_G2" 2
|
|
147
147
|
;;
|
|
148
148
|
esac
|
|
149
149
|
TSV="$ADAPTERS_DIR/$PLATFORM/adapter.tsv"
|