@atbash/cli 0.5.15-dev.12 → 0.5.15-dev.15

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.
@@ -0,0 +1,412 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.detectChannel = detectChannel;
7
+ exports.updateCommand = updateCommand;
8
+ exports.detectOpenclaw = detectOpenclaw;
9
+ exports.writeStrategy = writeStrategy;
10
+ exports.supportStatus = supportStatus;
11
+ exports.verifyOpenclawPlugin = verifyOpenclawPlugin;
12
+ exports.validateConfig = validateConfig;
13
+ /**
14
+ * What the OpenClaw on THIS machine actually is, and what it can actually do.
15
+ *
16
+ * WHY THIS MODULE EXISTS — it is the fix for a whole class of bug, not one bug.
17
+ *
18
+ * `atbash setup` used to assert OpenClaw's shape from a single machine we happened
19
+ * to have installed. It hardcoded `~/.openclaw/extensions/<id>` as the plugin
20
+ * store and wrote that path into `plugins.load.paths`. On the box it was written
21
+ * against — 2026.2.1, brew formula — that was correct. On a fresh 2026.6.6 it is
22
+ * a path OpenClaw never creates, and a `load.paths` entry naming a missing
23
+ * directory fails the ENTIRE config, which then takes down the
24
+ * `openclaw plugins install` in the same run. The command broke its own install
25
+ * step and left behind a dangling entry that `openclaw doctor --fix` offers to
26
+ * delete — silently un-governing the agent.
27
+ *
28
+ * The lesson is not "update the hardcoded path". It is that we cannot know what
29
+ * OpenClaw a user has:
30
+ *
31
+ * - It ships on at least three channels, each on its own version number. When
32
+ * this was written: brew formula `openclaw-cli` 2026.7.1, brew cask
33
+ * `openclaw` 2026.8.1, npm-global 2026.8.2, plus an npm `extended-stable`
34
+ * tag on a fourth number. "The latest OpenClaw" does not identify a build.
35
+ * - It moved its plugin store twice in six months, and the migration is
36
+ * destructive (`plugins/installs.json` → `installs.json.migrated`).
37
+ * - Keys change meaning: `plugins.allow` was repurposed to gate bundled
38
+ * provider discovery; `plugins.entries.<id>.hooks` went from a FATAL unknown
39
+ * key on 2026.2.1 to a valid one on 2026.6.6.
40
+ *
41
+ * So: ASK, never assume. Everything here is probed from the binary on the box,
42
+ * and version numbers are used for REPORTING, not for deciding. Capability
43
+ * detection is what makes a range of versions supportable instead of one —
44
+ * comparing version strings is how you end up shipping a table that goes stale
45
+ * the next time OpenClaw releases.
46
+ */
47
+ const child_process_1 = require("child_process");
48
+ const path_1 = __importDefault(require("path"));
49
+ const NO_CAPS = { patch: false, validate: false, schema: false, configFile: false };
50
+ /** Bounded probe of a command. Never throws; a missing binary is a normal answer. */
51
+ function probe(command, args) {
52
+ const r = (0, child_process_1.spawnSync)(command, args, { encoding: "utf8", timeout: 20000 });
53
+ const out = `${r.stdout ?? ""}${r.stderr ?? ""}`;
54
+ return { ok: !r.error && r.status === 0, out };
55
+ }
56
+ /**
57
+ * Where the `openclaw` on PATH came from.
58
+ *
59
+ * Path-based rather than asked of a package manager, because shelling out to
60
+ * brew and npm to answer a question we can read off a path is slow and can hang
61
+ * on a bad network — and this runs before we have written anything, where a
62
+ * hang looks like the command being broken.
63
+ *
64
+ * ⚠️ The npm case is not hypothetical or unusual: the machine that reported the
65
+ * original failure ran `/Users/m4/.nvm/versions/node/v24.13.0/bin/openclaw`,
66
+ * so `brew info openclaw-cli` there said "Not installed" while OpenClaw was
67
+ * plainly running. Telling that user `brew upgrade openclaw-cli` would have been
68
+ * useless, which is the whole reason this returns a channel at all.
69
+ */
70
+ function detectChannel(binPath) {
71
+ if (!binPath)
72
+ return "unknown";
73
+ const p = binPath.replace(/\\/g, "/");
74
+ // Follows the formula's Cellar layout, and the /opt/homebrew symlink to it.
75
+ if (/\/Cellar\/openclaw-cli\//.test(p) || /\/(opt\/homebrew|usr\/local)\/(bin|Cellar)\//.test(p))
76
+ return "brew-formula";
77
+ if (/\/Applications\/OpenClaw\.app\//.test(p))
78
+ return "brew-cask";
79
+ // nvm, fnm, volta, asdf and a plain global prefix all land under a node dir or
80
+ // an npm/lib/node_modules path.
81
+ if (/\/(\.nvm|\.fnm|\.volta|\.asdf)\//.test(p) || /\/lib\/node_modules\//.test(p) || /\/node\/v?\d/.test(p))
82
+ return "npm";
83
+ return "unknown";
84
+ }
85
+ /**
86
+ * The command that updates THIS install, or undefined when we cannot tell.
87
+ *
88
+ * Returning undefined is deliberate and better than a plausible guess: a user
89
+ * told to run `brew upgrade openclaw-cli` on an npm install gets "No available
90
+ * formula", concludes our instructions are wrong, and is no closer to an
91
+ * upgrade. `openclaw update` is the honest fallback where the channel is
92
+ * unknown — it is OpenClaw's own self-updater, and 2026.6.6's `doctor` already
93
+ * recommends exactly that ("Run `openclaw update` to update via your package
94
+ * manager (npm/pnpm)").
95
+ */
96
+ function updateCommand(channel) {
97
+ switch (channel) {
98
+ case "brew-formula":
99
+ return "brew upgrade openclaw-cli";
100
+ case "brew-cask":
101
+ return "brew upgrade --cask openclaw";
102
+ case "npm":
103
+ return "openclaw update";
104
+ default:
105
+ return "openclaw update";
106
+ }
107
+ }
108
+ /**
109
+ * Parse the subcommand list out of `openclaw config --help`.
110
+ *
111
+ * Reads the two-space-indented ` <name> <description>` rows commander prints
112
+ * under `Commands:`. A capability we cannot see is reported as absent, which is
113
+ * the safe direction: we fall back to the path that works everywhere rather than
114
+ * invoking a subcommand that exits "unknown command" mid-run.
115
+ */
116
+ function parseConfigCaps(help) {
117
+ const lines = help.split(/\r?\n/);
118
+ // Only the `Commands:` section. `Options:` lists flags, and the trailing
119
+ // `Docs:` line is prose — neither describes a subcommand.
120
+ const start = lines.findIndex((l) => /^\s*Commands:\s*$/.test(l));
121
+ const section = start === -1 ? lines : lines.slice(start + 1);
122
+ const names = new Set(section
123
+ // EXACTLY two spaces of indent. Commander puts subcommand names at 2 and
124
+ // wraps long descriptions much deeper, and 2026.7.1's `config --help` is
125
+ // full of those continuations — `patch` and `set` each carry several lines
126
+ // of examples like "openclaw config patch --stdin". A looser `^ {2,}`
127
+ // could read a wrapped line as a subcommand and invent a capability that
128
+ // does not exist, which then gets invoked mid-run and exits "unknown
129
+ // command" after earlier steps have already written.
130
+ .map((line) => /^ {2}(?! )([a-z][a-z-]*)\s{2,}\S/.exec(line)?.[1])
131
+ .filter((n) => Boolean(n)));
132
+ return {
133
+ patch: names.has("patch"),
134
+ validate: names.has("validate"),
135
+ schema: names.has("schema"),
136
+ configFile: names.has("file"),
137
+ };
138
+ }
139
+ /**
140
+ * The version out of `openclaw --version`, in either format OpenClaw has used.
141
+ *
142
+ * ⚠️ THE OUTPUT FORMAT CHANGED TOO, and this function's first version only
143
+ * handled the newer one — the exact mistake this module exists to prevent,
144
+ * committed inside the module itself. Caught only by running a real old binary:
145
+ *
146
+ * 2026.2.1 → "2026.2.1\n" (bare, verified with od -c)
147
+ * 2026.7.1 → "OpenClaw 2026.7.1 (2d2ddc4)"
148
+ *
149
+ * A regex anchored on the word "OpenClaw" returned undefined for every 2026.2.x
150
+ * machine. Behavior did not break — capabilities drive every decision here, which
151
+ * is the point of the design — but the operator lost the version from the message
152
+ * that tells them what was detected, and any future version-dependent reporting
153
+ * would have silently had nothing to work with.
154
+ *
155
+ * Neither format can be assumed, so try the labelled form first and fall back to
156
+ * a line that is nothing but a version. Both are matched by PATTERN rather than
157
+ * by line position: a loaded Atbash plugin prints `[atbash] plugin loaded` and
158
+ * `guard manager ready …` ahead of anything else on stdout.
159
+ */
160
+ function parseVersion(out) {
161
+ const labelled = /OpenClaw\s+v?(\d[\w.-]*)(?:\s+\(([0-9a-f]{4,})\))?/i.exec(out);
162
+ if (labelled)
163
+ return { version: labelled[1], ...(labelled[2] ? { build: labelled[2] } : {}) };
164
+ // A line holding only a version, e.g. 2026.2.1 — with an optional build hash,
165
+ // since a future build could print that form too.
166
+ const bare = /^[ \t]*v?(\d{4}\.\d+[\w.-]*)(?:[ \t]+\(([0-9a-f]{4,})\))?[ \t]*$/m.exec(out);
167
+ if (bare)
168
+ return { version: bare[1], ...(bare[2] ? { build: bare[2] } : {}) };
169
+ return {};
170
+ }
171
+ /**
172
+ * Inspect the OpenClaw on this machine. Read-only: probes `--version` and
173
+ * `config --help`, writes nothing, and never throws.
174
+ */
175
+ function detectOpenclaw(binary = "openclaw") {
176
+ const which = (0, child_process_1.spawnSync)(process.platform === "win32" ? "where" : "which", [binary], { encoding: "utf8" });
177
+ const binPath = which.status === 0 ? (which.stdout ?? "").split(/\r?\n/)[0]?.trim() || undefined : undefined;
178
+ if (!binPath)
179
+ return { present: false, channel: "unknown", caps: { ...NO_CAPS } };
180
+ const channel = detectChannel(binPath);
181
+ const ver = probe(binary, ["--version"]);
182
+ const parsedVersion = parseVersion(ver.out);
183
+ const help = probe(binary, ["config", "--help"]);
184
+ return {
185
+ present: true,
186
+ binPath,
187
+ channel,
188
+ ...parsedVersion,
189
+ caps: help.out ? parseConfigCaps(help.out) : { ...NO_CAPS },
190
+ };
191
+ }
192
+ function writeStrategy(rt) {
193
+ return rt.caps.patch ? "openclaw-patch" : "hand-merge";
194
+ }
195
+ /**
196
+ * Whether this OpenClaw is one we can wire at all, and what to say if not.
197
+ *
198
+ * DELIBERATELY PERMISSIVE. The floor is "there is an OpenClaw here", not "it has
199
+ * the newest config commands", because 2026.2.x installs are real — the box every
200
+ * CLI attestation was verified on is one — and the minimal entry-only config we
201
+ * now write was confirmed to load there with the plugin reporting
202
+ * `[atbash] plugin loaded` and `guard manager ready`. Narrowing support to the
203
+ * versions we happen to run is the mistake that produced this whole module.
204
+ *
205
+ * So an older build is a DEGRADED path with an offer, never a refusal: it gets
206
+ * the hand-merge, and the reason to upgrade is stated once, with the command for
207
+ * its own channel. Refusal is reserved for "no OpenClaw at all", where there is
208
+ * genuinely nothing to configure.
209
+ */
210
+ function supportStatus(rt) {
211
+ if (!rt.present) {
212
+ return {
213
+ supported: false,
214
+ degraded: false,
215
+ message: "No OpenClaw found on this machine. Nothing was changed. If this agent runs on a different computer, run this command there instead — the plugin has to be installed where the agent actually runs.",
216
+ };
217
+ }
218
+ const where = rt.version ? `OpenClaw ${rt.version}` : "This OpenClaw";
219
+ if (writeStrategy(rt) === "openclaw-patch") {
220
+ return { supported: true, degraded: false, message: `${where} — supported, and OpenClaw will validate the config change itself.` };
221
+ }
222
+ return {
223
+ supported: true,
224
+ degraded: true,
225
+ message: `${where} is supported, but it predates OpenClaw's validated config commands (\`config patch\` / \`config validate\`), so Atbash has to edit the config file directly and cannot ask OpenClaw to check it first. Upgrading is optional and makes this step safer.`,
226
+ upgrade: updateCommand(rt.channel),
227
+ };
228
+ }
229
+ /**
230
+ * Parse JSON out of a stream that also carries log lines.
231
+ *
232
+ * `openclaw plugins list --json` is clean on stdout, but a loaded plugin prints
233
+ * its own startup lines — this project's plugin logs `[atbash] plugin loaded` and
234
+ * `guard manager ready` — and those can interleave. So find the JSON rather than
235
+ * assuming the output begins with it.
236
+ */
237
+ function parseLooseJson(text) {
238
+ for (let start = text.indexOf("{"); start !== -1; start = text.indexOf("{", start + 1)) {
239
+ // Walk to the matching brace instead of parsing "the rest of the output".
240
+ //
241
+ // ⚠️ Slicing to the end and parsing that is what the first version did, and
242
+ // it failed on real 2026.2.1: its plugin log lines land on the SAME stream
243
+ // AFTER the JSON object, so `JSON.parse` saw `{…}` followed by
244
+ // `[plugins] [atbash] plugin loaded` and threw on the trailing text. The
245
+ // whole verification then reported "unknown" for a plugin that was
246
+ // demonstrably loaded — a false negative on the one check that says whether
247
+ // an agent is governed.
248
+ //
249
+ // String-aware, because a description field legitimately contains braces:
250
+ // this project's own plugin describes itself as mapping OpenClaw's hook, and
251
+ // other plugins embed JSON snippets in their descriptions.
252
+ let depth = 0;
253
+ let inString = false;
254
+ let escaped = false;
255
+ for (let i = start; i < text.length; i++) {
256
+ const ch = text[i];
257
+ if (inString) {
258
+ if (escaped)
259
+ escaped = false;
260
+ else if (ch === "\\")
261
+ escaped = true;
262
+ else if (ch === '"')
263
+ inString = false;
264
+ continue;
265
+ }
266
+ if (ch === '"')
267
+ inString = true;
268
+ else if (ch === "{")
269
+ depth++;
270
+ else if (ch === "}") {
271
+ depth--;
272
+ if (depth === 0) {
273
+ try {
274
+ return JSON.parse(text.slice(start, i + 1));
275
+ }
276
+ catch {
277
+ break; // this `{` began something that is not JSON; try the next
278
+ }
279
+ }
280
+ }
281
+ }
282
+ }
283
+ return undefined;
284
+ }
285
+ /**
286
+ * Ask OpenClaw whether the plugin actually loaded — the check setup never had.
287
+ *
288
+ * ⚠️ WHY THIS IS NOT OPTIONAL. Setup used to declare success on the strength of
289
+ * having written what it meant to write. That is not the same claim: on the
290
+ * machine that reported the original failure, the config entry existed and the
291
+ * plugin did not, and OpenClaw said so plainly —
292
+ *
293
+ * plugins.entries.atbash-openclaw: plugin not found: atbash-openclaw
294
+ * (stale config entry ignored; remove it from plugins config)
295
+ *
296
+ * — while setup reported the run as done. An owner reading that summary believes
297
+ * their agent is governed. Nothing is more expensive than a false green on a
298
+ * control boundary, so the last word belongs to OpenClaw, not to us.
299
+ *
300
+ * ⚠️ DO NOT check `hookCount` or `hookNames` here. They are 0 and empty for a
301
+ * perfectly healthy plugin: hooks register when the GATEWAY starts, not when
302
+ * `plugins list` runs. Verified against a plugin that was demonstrably loaded and
303
+ * enforcing — it reports `hookCount: 0`. Treating that as a fault would fail
304
+ * every correct install.
305
+ */
306
+ function verifyOpenclawPlugin(rt, opts) {
307
+ const binary = opts.binary ?? "openclaw";
308
+ if (!rt.present)
309
+ return { state: "unknown", detail: "OpenClaw is not on this machine." };
310
+ const r = (0, child_process_1.spawnSync)(binary, ["plugins", "list", "--json"], {
311
+ encoding: "utf8",
312
+ timeout: 120000,
313
+ env: {
314
+ ...process.env,
315
+ ...(opts.configPath ? { OPENCLAW_CONFIG_PATH: path_1.default.resolve(opts.configPath) } : {}),
316
+ ...(opts.home ? { HOME: opts.home } : {}),
317
+ },
318
+ });
319
+ if (r.error)
320
+ return { state: "unknown", detail: `\`${binary} plugins list\` could not run: ${r.error.message}` };
321
+ const parsed = parseLooseJson(`${r.stdout ?? ""}${r.stderr ?? ""}`);
322
+ const plugins = parsed?.plugins;
323
+ // No parseable answer is UNKNOWN, never "missing" — reporting a governed agent
324
+ // as ungoverned on a parse failure is its own kind of wrong.
325
+ if (!Array.isArray(plugins)) {
326
+ return { state: "unknown", detail: `Could not read \`${binary} plugins list --json\` output.` };
327
+ }
328
+ const rows = plugins;
329
+ // Preference order, so a stood-down legacy entry cannot shadow the live one —
330
+ // the same rule the dashboard scan needs for the same reason.
331
+ const found = opts.entryIds
332
+ .map((id) => rows.find((p) => typeof p.id === "string" && p.id === id))
333
+ .filter((p) => Boolean(p));
334
+ const row = found.find((p) => p.enabled !== false) ?? found[0];
335
+ if (!row) {
336
+ return {
337
+ state: "missing",
338
+ detail: `OpenClaw does not list the Atbash plugin (looked for: ${opts.entryIds.join(", ")}). The config may name a plugin that is not installed — OpenClaw calls that a stale entry and \`openclaw doctor --fix\` will delete it.`,
339
+ };
340
+ }
341
+ const entry = typeof row.id === "string" ? row.id : undefined;
342
+ const version = typeof row.version === "string" ? row.version : undefined;
343
+ const missing = Array.isArray(row.dependencyStatus?.missing)
344
+ ? row.dependencyStatus.missing.filter((m) => typeof m === "string")
345
+ : [];
346
+ const base = { entry, ...(version ? { version } : {}), ...(missing.length ? { missingDeps: missing } : {}) };
347
+ if (row.enabled === false) {
348
+ return { ...base, state: "disabled", detail: "The plugin is installed but switched off in the config, so it governs nothing." };
349
+ }
350
+ if (typeof row.status === "string" && row.status !== "loaded") {
351
+ return { ...base, state: "load-error", detail: `OpenClaw reports its status as "${row.status}" rather than "loaded".` };
352
+ }
353
+ // A plugin whose required dependencies are absent loads and then fails at the
354
+ // moment it matters — the SDK it signs with is one of them.
355
+ if (row.dependencyStatus?.requiredInstalled === false || missing.length) {
356
+ return {
357
+ ...base,
358
+ state: "load-error",
359
+ detail: `OpenClaw reports required dependencies missing${missing.length ? `: ${missing.join(", ")}` : ""}. The plugin cannot reach the judge without them.`,
360
+ };
361
+ }
362
+ // Right plugin, wrong build. Loads cleanly, hooks fire, and every judge call
363
+ // fails because the agent does not exist on the chain that build targets.
364
+ if (opts.expectedSpec && version) {
365
+ const wantsDev = /@dev$/.test(opts.expectedSpec);
366
+ const isDev = /-dev\./.test(version);
367
+ if (wantsDev !== isDev) {
368
+ return {
369
+ ...base,
370
+ state: "load-error",
371
+ detail: `The installed build (${version}) does not match the deployment this agent was onboarded on (${opts.expectedSpec}). It will load and fire its hook, then fail every judge call because the agent does not exist on the chain that build targets.`,
372
+ };
373
+ }
374
+ }
375
+ return { ...base, state: "loaded" };
376
+ }
377
+ /**
378
+ * Ask OpenClaw whether a config is valid, when it can answer.
379
+ *
380
+ * This is the PREFLIGHT the command never had. Setup merged into
381
+ * `~/.openclaw/openclaw.json` without ever checking whether that file currently
382
+ * loads — so on a machine whose config was already broken it added its own entry
383
+ * to an unloadable file, and then its `openclaw plugins install` step died on the
384
+ * pre-existing breakage. Reported as an Atbash failure; it was not one.
385
+ *
386
+ * `undefined` means "cannot tell" (no `validate` on this build) and must be
387
+ * treated as such — not as a pass and not as a failure.
388
+ */
389
+ function validateConfig(rt, configPath, binary = "openclaw",
390
+ /** The home being configured, when not the process's own — see verifyOpenclawPlugin. */
391
+ home) {
392
+ if (!rt.caps.validate)
393
+ return undefined;
394
+ const r = (0, child_process_1.spawnSync)(binary, ["config", "validate"], {
395
+ encoding: "utf8",
396
+ timeout: 60000,
397
+ env: { ...process.env, OPENCLAW_CONFIG_PATH: path_1.default.resolve(configPath), ...(home ? { HOME: home } : {}) },
398
+ });
399
+ if (r.error)
400
+ return undefined;
401
+ const out = `${r.stdout ?? ""}${r.stderr ?? ""}`;
402
+ // 2026.6.6/2026.7.1 print "Config valid: <path>" on success, and
403
+ // "OpenClaw config is invalid: <path>" followed by `× <key>: <reason>` lines.
404
+ const valid = r.status === 0 && /config valid/i.test(out);
405
+ const problems = out
406
+ .split(/\r?\n/)
407
+ .filter((l) => /^\s*[×x✘]\s/.test(l))
408
+ .map((l) => l.replace(/^\s*[×x✘]\s*/, "").trim())
409
+ .join("\n");
410
+ return { valid, problems: problems || (valid ? "" : out.trim()) };
411
+ }
412
+ //# sourceMappingURL=openclaw-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-runtime.js","sourceRoot":"","sources":["../../src/shared/openclaw-runtime.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atbash/cli",
3
- "version": "0.5.15-dev.12",
3
+ "version": "0.5.15-dev.15",
4
4
  "description": "Atbash CLI — control boundary before the last irreversible step in an agent workflow",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "homepage": "https://atbash.ai",