@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 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 `goblin` CLI (and `gob`)
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. `goblin init` (or
31
- `goblin install --target <dir> --class A`) then vendors a self-contained engine into the target
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
- goblin install --target /path/to/repo --class A
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
- goblin verify # or .goblin/bin/goblin-verify, inside the target
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
- goblin audit # once, deliberately: the ONLY network step (SC-07)
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 `goblin` CLI
79
+ ## The `gob` CLI
80
80
 
81
81
  | command | what it does |
82
82
  |---|---|
83
- | `goblin 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
- | `goblin bans` | run the ban list (per-pattern red lines over the source tree) |
85
- | `goblin audit` | check recorded dependency claims against live advisory feeds — the only command that touches the network |
86
- | `goblin install` | install the manifest, skills and verifier into a target repo |
87
- | `goblin uninstall` | remove everything an install wrote, byte-exactly (`goblin install --target <dir> --uninstall` is the same job) |
88
- | `goblin upgrade` | migrate a repo to the shared global engine at `~/.goblin/engine` — 8 steps, two commits, one report |
89
- | `goblin doctor` | one run across the platforms below: DETECTED / NOT-DETECTED / DRIFT per platform |
90
- | `goblin 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
- | `goblin 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 |
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
- `goblin emit` and `goblin doctor` cover seven agent platforms, each detected via its own anchor:
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 `goblin emit --platform <p> --scope project` writes the skills and the context block a
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
- goblin verify [--only <id[,id...]>] [--json] [--list] [--source <path>]
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 `goblin` and `gob` commands from the machine and nothing else: no project, no
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
- goblin uninstall --target .
180
+ gob uninstall --target .
178
181
 
179
- (equivalently `goblin install --target . --uninstall`; through the short alias:
180
- `gob uninstall --target .`). The uninstall is **byte-exact**: it removes exactly the files
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
- goblin emit --undo --platform <p> --scope global
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` — `goblin doctor` lists which platforms were detected).
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
- goblin install --target <dir> --re-pin
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
- # goblin verify [--only <id[,id...]>] [--json] [--list] [--source <path>]
5
- # goblin bans [--only <id[,id...]>] [--list]
6
- # goblin audit [--target <dir>] [--print]
7
- # goblin doctor [--platform <p>] # W4a
8
- # goblin emit --platform <p> [...] # W4a/W4b
9
- # goblin init [...] # W6: the first-run wizard
10
- # goblin upgrade [--target .] [...] # W3
11
- # goblin --version
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 goblin-stack, the command is `goblin`. W1 ships the DISPATCH
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
- goblin — the goblin-stack command line.
43
+ gob — the gobstack command line.
43
44
 
44
- goblin verify [--only <id[,id...]>] [--json] [--list] [--source <path>]
45
- goblin bans [--only <id[,id...]>] [--list]
46
- goblin audit [--target <dir>] [--print]
47
- goblin doctor [--platform <p>] [--target <dir>]
48
- goblin emit --platform <p> --scope project|global [...]
49
- goblin init [--target <dir>] [--class app|A-F] [--dry-run]
50
- goblin upgrade [--target .] [--dry-run] [--yes] [--engine-dir <path>]
51
- goblin --version
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
- goblin doctor — one run, seven platforms (W4a, the seven since W4b).
43
+ gob doctor — one run, seven platforms (W4a, the seven since W4b).
44
44
 
45
- goblin doctor [--platform <$_PLA|hermes|copilot|cursor|opencode|codex|$_G1$_G2>]
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' - goblin doctor ships $_PLA, hermes, copilot, cursor, opencode, codex, $_G1$_G2" 2 ;;
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
- goblin emit — per-platform emission (W4a, the seven platforms since W4b).
71
+ gob emit — per-platform emission (W4a, the seven platforms since W4b).
72
72
 
73
- goblin emit --platform <$_PLA|hermes|copilot|cursor|opencode|codex|$_G1$_G2>
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' - goblin emit ships $_PLA, hermes, copilot, cursor, opencode, codex, $_G1$_G2" 2
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"