@tvps/agw-client-cli 0.1.0

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/AGENTS.md ADDED
@@ -0,0 +1,31 @@
1
+ # AGW Client CLI
2
+
3
+ Standalone npm package for configuring Claude Code CLI and Codex CLI against Agent Gateway with pasted virtual keys.
4
+
5
+ Published as `@tvps/agw-client-cli` (scoped public package on npmjs.com).
6
+
7
+ ## Distribution
8
+
9
+ - **Package name:** `@tvps/agw-client-cli` (scoped under `@tvps` organization)
10
+ - **publishConfig.access:** `public` — ensures scoped package is publicly installable
11
+ - **Prepack flow:** `npm run build` runs before publish, so the `dist/` directory is always fresh
12
+ - **Version codegen:** The build includes a `prebuild` step that runs `scripts/gen-version.cjs`, which reads `package.json.version` and generates `src/version.ts` with the matching version constant. This eliminates version drift between the package manifest and CLI `--version` output. The generated file is committed to git and will be overwritten on every build.
13
+
14
+ ## Commands
15
+
16
+ ```bash
17
+ npm run typecheck
18
+ npm run lint
19
+ npm run test
20
+ npm run build
21
+ npm pack --dry-run
22
+ ```
23
+
24
+ ## Conventions
25
+
26
+ - Keep the package publishable outside the monorepo.
27
+ - Do not import from `agw-client/`; copy small config-writer behavior when needed.
28
+ - Do not write shell rc snippets, OTel config, MDM baggage headers, or Google SSO flows.
29
+ - Config writes are full replacements with one-time sibling `.egw-backup` restore behavior.
30
+ - Tests must mock gateway traffic and must not require a real gateway.
31
+ - The `--version` flag is **required** — Homebrew Formula `test do` block depends on it.
package/README.md ADDED
@@ -0,0 +1,126 @@
1
+ # agw-client-cli
2
+
3
+ Interactive npm/npx setup for Claude Code CLI and Codex CLI using an existing
4
+ Agent Gateway virtual key.
5
+
6
+ This package is intentionally smaller than the Electron `agw-client` app:
7
+
8
+ - virtual-key only; it does not sign in with Google SSO
9
+ - Claude Code CLI and Codex CLI only; no Claude Cowork support
10
+ - no shell rc snippets, OTel config, MDM baggage headers, or helper session
11
+ - full replacement writes with one-time `.egw-backup` sibling backups
12
+
13
+ ## Install
14
+
15
+ ```bash
16
+ npm install -g @tvps/agw-client-cli
17
+ agw-client-cli setup
18
+ ```
19
+
20
+ Or run without installing:
21
+
22
+ ```bash
23
+ npx @tvps/agw-client-cli setup
24
+ ```
25
+
26
+ `setup`, `switch`, and `uninstall` require an interactive terminal.
27
+
28
+ ### Package Details
29
+
30
+ This package is published as `@tvps/agw-client-cli` (scoped under the `@tvps` organization). The scoped name is required when installing globally or running via npx.
31
+
32
+ ## Setup
33
+
34
+ ```bash
35
+ agw-client-cli setup
36
+ ```
37
+
38
+ The wizard asks for:
39
+
40
+ - gateway URL, for example `https://gateway.example.com`
41
+ - virtual key copied from the AGW Admin virtual-key screen
42
+ - targets to enable: Claude Code CLI, Codex CLI, or both
43
+ - provider/model choices fetched live from the gateway
44
+
45
+ Setup blocks if the selected target binary is missing from `PATH`. It then
46
+ fetches Kiro and Codex model lists and sends tiny generation probes with the
47
+ prompt `Reply with OK.` through all four paths:
48
+
49
+ - `/kiro/anthropic/v1/messages`
50
+ - `/kiro/openai/v1/responses`
51
+ - `/codex/anthropic/v1/messages`
52
+ - `/codex/openai/v1/responses`
53
+
54
+ Those probes verify that the key works through the gateway. They are real model
55
+ requests, so they can consume upstream quota and create gateway audit rows.
56
+
57
+ ## Commands
58
+
59
+ ```bash
60
+ agw-client-cli switch
61
+ agw-client-cli status
62
+ agw-client-cli models
63
+ agw-client-cli uninstall
64
+ ```
65
+
66
+ `switch` interactively changes one target to Kiro, Codex, or official/direct
67
+ mode. Official/direct mode restores the `.egw-backup` file if it exists; if no
68
+ backup exists, it deletes the gateway-managed config so the upstream client can
69
+ fall back to its normal official configuration. The stored virtual key is kept
70
+ so you can switch back later.
71
+
72
+ `status` prints local config paths, binary status, and always runs the model
73
+ list plus tiny generation probes. This is useful for diagnosis but can consume
74
+ upstream quota.
75
+
76
+ `models` fetches both Kiro and Codex every time and prints grouped model lists
77
+ for verbose, OpenAI, and Anthropic formats.
78
+
79
+ `uninstall` restores or deletes Claude and Codex configs, then deletes the CLI
80
+ state file and stored virtual key.
81
+
82
+ ## Files
83
+
84
+ State is stored as plaintext JSON:
85
+
86
+ - macOS: `~/Library/Application Support/agw-client-cli/state.json`
87
+ - Linux: `${XDG_CONFIG_HOME:-~/.config}/agw-client-cli/state.json`
88
+ - Windows: `%LOCALAPPDATA%\agw-client-cli\state.json`
89
+
90
+ Config files are full replacements:
91
+
92
+ - Claude Code CLI: `~/.claude/settings.json`
93
+ - Codex CLI: `~/.codex/config.toml`
94
+
95
+ On first write, an existing config is moved to a sibling backup:
96
+
97
+ - `~/.claude/settings.json.egw-backup`
98
+ - `~/.codex/config.toml.egw-backup`
99
+
100
+ Files containing secrets are written with `0600` permissions where the platform
101
+ supports POSIX modes.
102
+
103
+ ## Codex Config Contract
104
+
105
+ Codex CLI uses the OpenAI Responses-compatible gateway routes. Provider blocks
106
+ use:
107
+
108
+ ```toml
109
+ base_url = "https://gateway.example.com/kiro/openai/v1"
110
+ experimental_bearer_token = "<virtual-key>"
111
+ wire_api = "responses"
112
+ ```
113
+
114
+ The Codex provider uses `/codex/openai/v1`. The CLI does not use `env_key`,
115
+ shell exports, OTel sections, or custom baggage headers.
116
+
117
+ ## Development
118
+
119
+ ```bash
120
+ npm install
121
+ npm run typecheck
122
+ npm run lint
123
+ npm run test
124
+ npm run build
125
+ npm pack --dry-run
126
+ ```
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { main } from "../cli.js";
3
+ const code = await main();
4
+ process.exitCode = code;
5
+ //# sourceMappingURL=agw-client-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agw-client-cli.js","sourceRoot":"","sources":["../../src/bin/agw-client-cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAC;AAC1B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Target } from "./types.js";
2
+ export declare function commandExists(command: string): Promise<boolean>;
3
+ export declare function assertTargetBinary(target: Target): Promise<void>;
4
+ export declare function binaryName(target: Target): string;
@@ -0,0 +1,27 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const execFileAsync = promisify(execFile);
4
+ const BINARIES = {
5
+ claude: "claude",
6
+ codex: "codex",
7
+ };
8
+ export async function commandExists(command) {
9
+ const lookup = process.platform === "win32" ? "where" : "which";
10
+ try {
11
+ await execFileAsync(lookup, [command]);
12
+ return true;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ export async function assertTargetBinary(target) {
19
+ const binary = BINARIES[target];
20
+ if (!(await commandExists(binary))) {
21
+ throw new Error(`Missing ${binary} on PATH. Install ${binary} before enabling the ${target} target.`);
22
+ }
23
+ }
24
+ export function binaryName(target) {
25
+ return BINARIES[target];
26
+ }
27
+ //# sourceMappingURL=binaries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binaries.js","sourceRoot":"","sources":["../src/binaries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,QAAQ,GAA2B;IACvC,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAc;IACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,qBAAqB,MAAM,wBAAwB,MAAM,UAAU,CAAC,CAAC;IACxG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import type { CommandIO } from "./types.js";
2
+ export declare function main(argv?: string[], io?: CommandIO): Promise<number>;
3
+ export declare function setupCommand(io: CommandIO): Promise<void>;
4
+ export declare function switchCommand(io: CommandIO): Promise<void>;
5
+ export declare function statusCommand(io: CommandIO): Promise<void>;
6
+ export declare function modelsCommand(io: CommandIO): Promise<void>;
7
+ export declare function uninstallCommand(io: CommandIO): Promise<void>;
package/dist/cli.js ADDED
@@ -0,0 +1,295 @@
1
+ import { assertTargetBinary, binaryName } from "./binaries.js";
2
+ import { formatCatalog } from "./models.js";
3
+ import { resolveRuntimePaths } from "./paths.js";
4
+ import { assertInteractive, confirm, confirmSetupSummary, promptClaudeSelection, promptCodexSelection, promptGatewayUrl, promptProvider, promptTargetForSwitch, promptTargets, promptVirtualKey, targetsFromStateOrDefault, } from "./prompts.js";
5
+ import { deleteState, loadState, saveState } from "./state.js";
6
+ import { CLIENT_VERSION, TARGETS } from "./types.js";
7
+ import { GatewayClient, normalizeGatewayUrl, runFullProbeMatrix } from "./gateway.js";
8
+ import { restoreClaudeConfig, writeClaudeConfig } from "./writers/claude.js";
9
+ import { restoreCodexConfig, writeCodexConfig, writeCodexModelCatalog } from "./writers/codex.js";
10
+ const HELP = `agw-client-cli
11
+
12
+ Usage:
13
+ agw-client-cli setup
14
+ agw-client-cli switch
15
+ agw-client-cli status
16
+ agw-client-cli models
17
+ agw-client-cli uninstall
18
+
19
+ setup and switch are interactive-only in v1.`;
20
+ export async function main(argv = process.argv.slice(2), io = {
21
+ stdin: process.stdin,
22
+ stdout: process.stdout,
23
+ stderr: process.stderr,
24
+ }) {
25
+ const command = argv[0] ?? "help";
26
+ try {
27
+ switch (command) {
28
+ case "setup":
29
+ assertInteractive(io.stdin, io.stdout, "setup");
30
+ await setupCommand(io);
31
+ return 0;
32
+ case "switch":
33
+ assertInteractive(io.stdin, io.stdout, "switch");
34
+ await switchCommand(io);
35
+ return 0;
36
+ case "status":
37
+ await statusCommand(io);
38
+ return 0;
39
+ case "models":
40
+ await modelsCommand(io);
41
+ return 0;
42
+ case "uninstall":
43
+ assertInteractive(io.stdin, io.stdout, "uninstall");
44
+ await uninstallCommand(io);
45
+ return 0;
46
+ case "-v":
47
+ case "--version":
48
+ io.stdout.write(`${CLIENT_VERSION}\n`);
49
+ return 0;
50
+ case "-h":
51
+ case "--help":
52
+ case "help":
53
+ io.stdout.write(`${HELP}\n`);
54
+ return 0;
55
+ default:
56
+ throw new Error(`Unknown command: ${command}\n\n${HELP}`);
57
+ }
58
+ }
59
+ catch (err) {
60
+ io.stderr.write(`Error: ${err.message}\n`);
61
+ return 1;
62
+ }
63
+ }
64
+ export async function setupCommand(io) {
65
+ const paths = resolveRuntimePaths();
66
+ const gatewayUrl = await promptGatewayUrl();
67
+ const virtualKey = await promptVirtualKey();
68
+ const enabledTargets = await promptTargets();
69
+ io.stdout.write("Fetching gateway models and running virtual-key probes. This sends tiny generation requests.\n");
70
+ const client = new GatewayClient(gatewayUrl, virtualKey);
71
+ const { catalog, summary } = await runFullProbeMatrix(client);
72
+ if (!summary.ok) {
73
+ throw new Error(`Gateway probe failed:\n${formatProbeSummary(summary)}`);
74
+ }
75
+ const existing = await loadState(paths).catch(() => null);
76
+ const selections = {
77
+ claude: enabledTargets.includes("claude")
78
+ ? await promptClaudeSelection(catalog, existing?.selections.claude, { allowOfficial: true })
79
+ : existing?.selections.claude,
80
+ codex: enabledTargets.includes("codex")
81
+ ? await promptCodexSelection(catalog, existing?.selections.codex, { allowOfficial: true })
82
+ : existing?.selections.codex,
83
+ };
84
+ const ok = await confirmSetupSummary(buildSetupSummary(gatewayUrl, enabledTargets, selections));
85
+ if (!ok)
86
+ throw new Error("Setup cancelled.");
87
+ const state = {
88
+ version: CLIENT_VERSION,
89
+ gatewayUrl,
90
+ virtualKey,
91
+ enabledTargets,
92
+ selections,
93
+ configPaths: {
94
+ claudeConfig: paths.claudeConfig,
95
+ codexConfig: paths.codexConfig,
96
+ codexModelCatalog: paths.codexModelCatalog,
97
+ },
98
+ lastWritten: existing?.lastWritten ?? {},
99
+ lastProbe: summary,
100
+ };
101
+ await applySelectedTargets(paths, state, catalog, enabledTargets);
102
+ const postWrite = await runFullProbeMatrix(client);
103
+ state.lastProbe = postWrite.summary;
104
+ await saveState(paths, state);
105
+ if (!postWrite.summary.ok) {
106
+ throw new Error(`Setup wrote configs, but the post-write gateway probe failed:\n${formatProbeSummary(postWrite.summary)}`);
107
+ }
108
+ io.stdout.write(`Setup complete.\n${formatProbeSummary(postWrite.summary)}\n`);
109
+ }
110
+ export async function switchCommand(io) {
111
+ const paths = resolveRuntimePaths();
112
+ const state = await requireState(paths);
113
+ const target = await promptTargetForSwitch();
114
+ const provider = await promptProvider(target);
115
+ if (provider === "official") {
116
+ await restoreTarget(paths, state, target);
117
+ if (target === "claude") {
118
+ state.selections.claude = { provider };
119
+ }
120
+ else {
121
+ state.selections.codex = { provider };
122
+ }
123
+ state.enabledTargets = [...new Set([...state.enabledTargets, target])];
124
+ await saveState(paths, state);
125
+ io.stdout.write(`${target} restored to official/direct behavior.\n`);
126
+ return;
127
+ }
128
+ const gatewayUrl = normalizeGatewayUrl(state.gatewayUrl);
129
+ io.stdout.write("Fetching gateway models for switch.\n");
130
+ const client = new GatewayClient(gatewayUrl, state.virtualKey);
131
+ const catalog = await client.fetchModelCatalog();
132
+ if (target === "claude") {
133
+ state.selections.claude = await promptClaudeSelection(catalog, {
134
+ ...state.selections.claude,
135
+ provider,
136
+ }, { provider });
137
+ }
138
+ else {
139
+ state.selections.codex = await promptCodexSelection(catalog, {
140
+ ...state.selections.codex,
141
+ provider,
142
+ }, { provider });
143
+ }
144
+ state.enabledTargets = [...new Set([...state.enabledTargets, target])];
145
+ await applySelectedTargets(paths, state, catalog, [target]);
146
+ const { summary } = await runFullProbeMatrix(client);
147
+ state.lastProbe = summary;
148
+ await saveState(paths, state);
149
+ if (!summary.ok) {
150
+ throw new Error(`${target} was written, but the post-write gateway probe failed:\n${formatProbeSummary(summary)}`);
151
+ }
152
+ io.stdout.write(`${target} switched.\n${formatProbeSummary(summary)}\n`);
153
+ }
154
+ export async function statusCommand(io) {
155
+ const paths = resolveRuntimePaths();
156
+ const state = await loadState(paths);
157
+ io.stdout.write("AGW Client CLI status\n");
158
+ io.stdout.write(`State: ${state ? paths.stateFile : "not configured"}\n`);
159
+ io.stdout.write(`Claude config: ${paths.claudeConfig}\n`);
160
+ io.stdout.write(`Codex config: ${paths.codexConfig}\n`);
161
+ for (const target of TARGETS) {
162
+ const exists = await binaryStatus(target);
163
+ io.stdout.write(`${target} binary (${binaryName(target)}): ${exists ? "found" : "missing"}\n`);
164
+ }
165
+ if (!state)
166
+ return;
167
+ io.stdout.write(`Gateway: ${state.gatewayUrl}\n`);
168
+ io.stdout.write(`Enabled targets: ${targetsFromStateOrDefault(state.enabledTargets).join(", ")}\n`);
169
+ io.stdout.write("Gateway status runs model-list and tiny generation probes, which may consume upstream quota.\n");
170
+ const client = new GatewayClient(state.gatewayUrl, state.virtualKey);
171
+ const { summary } = await runFullProbeMatrix(client);
172
+ state.lastProbe = summary;
173
+ await saveState(paths, state);
174
+ io.stdout.write(`${formatProbeSummary(summary)}\n`);
175
+ }
176
+ export async function modelsCommand(io) {
177
+ const paths = resolveRuntimePaths();
178
+ const state = await requireState(paths);
179
+ const client = new GatewayClient(state.gatewayUrl, state.virtualKey);
180
+ const catalog = await client.fetchModelCatalog();
181
+ io.stdout.write(`${formatCatalog(catalog)}\n`);
182
+ }
183
+ export async function uninstallCommand(io) {
184
+ const paths = resolveRuntimePaths();
185
+ const state = await loadState(paths);
186
+ if (!state) {
187
+ io.stdout.write("agw-client-cli is not configured.\n");
188
+ return;
189
+ }
190
+ const ok = await confirm("Restore/delete Claude and Codex configs, then delete CLI state and stored virtual key?", false);
191
+ if (!ok)
192
+ throw new Error("Uninstall cancelled.");
193
+ await restoreTarget(paths, state, "claude");
194
+ await restoreTarget(paths, state, "codex");
195
+ await deleteState(paths);
196
+ io.stdout.write("Uninstalled agw-client-cli state and restored/deleted managed configs.\n");
197
+ }
198
+ async function applySelectedTargets(paths, state, catalog, targets) {
199
+ for (const target of targets) {
200
+ await assertTargetBinary(target);
201
+ }
202
+ if (targets.includes("claude") && state.selections.claude?.provider === "official") {
203
+ await restoreTarget(paths, state, "claude");
204
+ await saveState(paths, state);
205
+ }
206
+ else if (targets.includes("claude")) {
207
+ const selection = state.selections.claude;
208
+ if (!selection?.provider || !selection.opusModel || !selection.sonnetModel || !selection.haikuModel) {
209
+ throw new Error("Claude selection is incomplete.");
210
+ }
211
+ const result = await writeClaudeConfig(paths, {
212
+ gatewayUrl: state.gatewayUrl,
213
+ virtualKey: state.virtualKey,
214
+ selection: selection,
215
+ previousSha256: state.lastWritten.claudeConfigSha256,
216
+ confirmDrift: (message) => confirm(message, false),
217
+ });
218
+ state.lastWritten.claudeConfigSha256 = result.sha256;
219
+ await saveState(paths, state);
220
+ }
221
+ if (targets.includes("codex") && state.selections.codex?.provider === "official") {
222
+ await restoreTarget(paths, state, "codex");
223
+ await saveState(paths, state);
224
+ }
225
+ else if (targets.includes("codex")) {
226
+ const selection = state.selections.codex;
227
+ if (!selection?.provider || !selection.model) {
228
+ throw new Error("Codex selection is incomplete.");
229
+ }
230
+ const catalogResult = await writeCodexModelCatalog(paths, catalog);
231
+ const result = await writeCodexConfig(paths, {
232
+ gatewayUrl: state.gatewayUrl,
233
+ virtualKey: state.virtualKey,
234
+ selection: selection,
235
+ previousSha256: state.lastWritten.codexConfigSha256,
236
+ confirmDrift: (message) => confirm(message, false),
237
+ });
238
+ state.lastWritten.codexModelCatalogSha256 = catalogResult.sha256;
239
+ state.lastWritten.codexConfigSha256 = result.sha256;
240
+ await saveState(paths, state);
241
+ }
242
+ }
243
+ async function restoreTarget(paths, state, target) {
244
+ if (target === "claude") {
245
+ await restoreClaudeConfig(paths, {
246
+ previousSha256: state.lastWritten.claudeConfigSha256,
247
+ confirmDrift: (message) => confirm(message, false),
248
+ });
249
+ state.lastWritten.claudeConfigSha256 = undefined;
250
+ return;
251
+ }
252
+ await restoreCodexConfig(paths, {
253
+ previousSha256: state.lastWritten.codexConfigSha256,
254
+ confirmDrift: (message) => confirm(message, false),
255
+ });
256
+ state.lastWritten.codexConfigSha256 = undefined;
257
+ state.lastWritten.codexModelCatalogSha256 = undefined;
258
+ }
259
+ async function requireState(paths) {
260
+ const state = await loadState(paths);
261
+ if (!state) {
262
+ throw new Error("agw-client-cli is not set up yet. Run `agw-client-cli setup` first.");
263
+ }
264
+ return {
265
+ ...state,
266
+ gatewayUrl: normalizeGatewayUrl(state.gatewayUrl),
267
+ };
268
+ }
269
+ async function binaryStatus(target) {
270
+ try {
271
+ await assertTargetBinary(target);
272
+ return true;
273
+ }
274
+ catch {
275
+ return false;
276
+ }
277
+ }
278
+ function buildSetupSummary(gatewayUrl, targets, selections) {
279
+ const lines = [`Gateway: ${gatewayUrl}`, `Targets: ${targets.join(", ")}`];
280
+ if (selections.claude && targets.includes("claude")) {
281
+ lines.push(`Claude: ${selections.claude.provider} opus=${selections.claude.opusModel} sonnet=${selections.claude.sonnetModel} haiku=${selections.claude.haikuModel}`);
282
+ }
283
+ if (selections.codex && targets.includes("codex")) {
284
+ lines.push(`Codex: ${selections.codex.provider} model=${selections.codex.model}`);
285
+ }
286
+ return lines.join("\n");
287
+ }
288
+ function formatProbeSummary(summary) {
289
+ const lines = [`Probe: ${summary.ok ? "ok" : "failed"}`];
290
+ for (const step of summary.steps) {
291
+ lines.push(`- ${step.ok ? "ok" : "fail"} ${step.name}${step.status ? ` HTTP ${step.status}` : ""}${step.error ? `: ${step.error}` : ""}`);
292
+ }
293
+ return lines.join("\n");
294
+ }
295
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/fs.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import type { RestoreResult, WriteResult } from "./types.js";
2
+ export declare function pathExists(target: string): Promise<boolean>;
3
+ export declare function readIfExists(target: string): Promise<string | null>;
4
+ export declare function removeIfExists(target: string): Promise<boolean>;
5
+ export declare function sha256Text(text: string): string;
6
+ export declare function sha256File(target: string): Promise<string | undefined>;
7
+ export declare function chmod600(target: string): Promise<void>;
8
+ export declare function atomicWriteFile(target: string, data: string): Promise<string>;
9
+ export declare function backupIfFirstApply(target: string): Promise<boolean>;
10
+ export declare function writeManagedFile(target: string, body: string, opts?: {
11
+ previousSha256?: string;
12
+ confirmDrift?: (message: string) => Promise<boolean>;
13
+ }): Promise<WriteResult>;
14
+ export declare function restoreOrDeleteManagedFile(target: string, opts?: {
15
+ previousSha256?: string;
16
+ confirmDrift?: (message: string) => Promise<boolean>;
17
+ isManagedContent?: (body: string) => boolean;
18
+ }): Promise<RestoreResult>;