@lizard-build/cli 0.3.59 → 0.3.61

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.
@@ -1,6 +1,6 @@
1
1
  import { readdirSync, readFileSync, statSync } from "node:fs";
2
2
  import path from "node:path";
3
- import { error, info, isJSONMode, printJSON, table } from "../lib/format.js";
3
+ import { fail, info, isJSONMode, printJSON, table } from "../lib/format.js";
4
4
  import { EMBEDDED_SKILLS } from "../lib/skills-data.generated.js";
5
5
  function fsSource(dir) {
6
6
  return {
@@ -140,8 +140,7 @@ export function registerSkill(program) {
140
140
  process.stdout.write(md.endsWith("\n") ? md : md + "\n");
141
141
  }
142
142
  catch (e) {
143
- error(e.message);
144
- process.exit(3);
143
+ fail(e.message, 3);
145
144
  }
146
145
  });
147
146
  skill
@@ -1 +1 @@
1
- {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import chalk from "chalk";
2
2
  import * as p from "@clack/prompts";
3
3
  import { api, getBaseURL, withScope } from "../lib/api.js";
4
4
  import { resolveProjectScope, resolveService } from "../lib/resolve.js";
5
- import { error, isTTY, isJSONMode } from "../lib/format.js";
5
+ import { error, fail, isTTY, isJSONMode } from "../lib/format.js";
6
6
  import { getToken } from "../lib/auth.js";
7
7
  import * as https from "node:https";
8
8
  import * as http from "node:http";
@@ -26,8 +26,7 @@ Examples:
26
26
  // "looks like an ID" by length breaks for long service names.
27
27
  const svc = await resolveService(projectId, opts.service);
28
28
  if (svc.kind !== "app") {
29
- error(`"${svc.name}" is an addon — ssh works only for app services.`);
30
- process.exit(1);
29
+ fail(`"${svc.name}" is an addon — ssh works only for app services.`);
31
30
  }
32
31
  serviceId = svc.id;
33
32
  }
@@ -36,8 +35,7 @@ Examples:
36
35
  const data = await api.get(withScope(`/api/projects/${projectId}/services`, scope));
37
36
  const running = (data.apps || []).filter((a) => a.status === "running");
38
37
  if (running.length === 0) {
39
- error("No running services in this project.");
40
- process.exit(1);
38
+ fail("No running services in this project.");
41
39
  }
42
40
  if (running.length === 1) {
43
41
  serviceId = running[0].id;
@@ -52,13 +50,11 @@ Examples:
52
50
  serviceId = selected;
53
51
  }
54
52
  else {
55
- error("Multiple services — pass -s <service>");
56
- process.exit(1);
53
+ fail("Multiple services — pass -s <service>");
57
54
  }
58
55
  }
59
56
  if (cmdArgs.length === 0) {
60
- error("No command given. Usage: lizard ssh -s <service> -- <cmd> [args...]");
61
- process.exit(1);
57
+ fail("No command given. Usage: lizard ssh -s <service> -- <cmd> [args...]");
62
58
  }
63
59
  // The server executes `cmd` via shell on the VM, so each arg must be
64
60
  // shell-quoted before being joined — otherwise `bash -c "ps | head"`
@@ -1 +1 @@
1
- {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/commands/ssh.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/commands/ssh.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,16 @@ export declare function isTTY(): boolean;
2
2
  export declare function setJSONMode(on: boolean): void;
3
3
  export declare function isJSONMode(): boolean;
4
4
  export declare function printJSON(data: unknown): void;
5
+ /**
6
+ * Terminate with a stable error contract. In JSON mode emit the same
7
+ * `{ error: { code, status, message, body } }` envelope on stdout that the
8
+ * top-level catch in index.ts produces; otherwise print a human "Error:" line
9
+ * on stderr. Use for validation/guard exits that would otherwise bypass the
10
+ * envelope by calling error() + process.exit() directly, leaving agents with
11
+ * empty stdout. `exitCode` is preserved verbatim so callers keep their
12
+ * semantics (2 = auth, 3 = not found, 127 = command not found, …).
13
+ */
14
+ export declare function fail(msg: string, exitCode?: number, code?: string): never;
5
15
  export declare function success(msg: string): void;
6
16
  export declare function error(msg: string): void;
7
17
  export declare function warn(msg: string): void;
@@ -12,6 +12,24 @@ export function isJSONMode() {
12
12
  export function printJSON(data) {
13
13
  console.log(JSON.stringify(data, null, 2));
14
14
  }
15
+ /**
16
+ * Terminate with a stable error contract. In JSON mode emit the same
17
+ * `{ error: { code, status, message, body } }` envelope on stdout that the
18
+ * top-level catch in index.ts produces; otherwise print a human "Error:" line
19
+ * on stderr. Use for validation/guard exits that would otherwise bypass the
20
+ * envelope by calling error() + process.exit() directly, leaving agents with
21
+ * empty stdout. `exitCode` is preserved verbatim so callers keep their
22
+ * semantics (2 = auth, 3 = not found, 127 = command not found, …).
23
+ */
24
+ export function fail(msg, exitCode = 1, code = "ERROR") {
25
+ if (jsonMode) {
26
+ printJSON({ error: { code, status: null, message: msg, body: null } });
27
+ }
28
+ else {
29
+ error(msg);
30
+ }
31
+ process.exit(exitCode);
32
+ }
15
33
  export function success(msg) {
16
34
  if (jsonMode)
17
35
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,KAAK;IACnB,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,IAAI,QAAQ,GAAG,KAAK,CAAC;AACrB,MAAM,UAAU,WAAW,CAAC,EAAW;IACrC,QAAQ,GAAG,EAAE,CAAC;AAChB,CAAC;AACD,MAAM,UAAU,UAAU;IACxB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,IAAI,QAAQ;QAAE,OAAO;IACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,IAAI,QAAQ;QAAE,OAAO;IACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAW,EAAE,IAAa;IAC7C,MAAM,KAAK,GAAG,IAAI,IAAI,GAAG,CAAC;IAC1B,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,WAAW,GAAG,SAAS,KAAK,gBAAgB,CAAC;AACtD,CAAC;AAED,MAAM,OAAO,GAAG,iBAAiB,CAAC;AAClC,SAAS,aAAa,CAAC,CAAS;IAC9B,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AACvC,CAAC;AACD,SAAS,UAAU,CAAC,CAAS,EAAE,KAAa;IAC1C,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,KAAK,CACnB,OAAiB,EACjB,IAAgB;IAEhB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,OAAO;SACnB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;SACrD,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAE/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,OAAO;aACjB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;aAClD,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B,KAAK,UAAU,CAAC;QAChB,KAAK,WAAW,CAAC;QACjB,KAAK,YAAY,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,KAAK,UAAU;YACb,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAmB;IACzC,MAAM,EAAE,GAAG,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACrC,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,OAAO,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACnC,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,OAAO,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACpC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,OAAO,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,IAAI,OAAO,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export declare const CURRENT_VERSION = "0.3.59";
1
+ export declare const CURRENT_VERSION = "0.3.61";
2
2
  /**
3
3
  * True only when running as the Bun-compiled standalone binary. Under
4
4
  * npm/node, `process.execPath` is the *node* executable — self-update would
@@ -4,7 +4,7 @@ import { Readable } from "node:stream";
4
4
  import { join, dirname } from "node:path";
5
5
  import os from "node:os";
6
6
  import { spawn } from "node:child_process";
7
- export const CURRENT_VERSION = "0.3.59";
7
+ export const CURRENT_VERSION = "0.3.61";
8
8
  const RELEASES_API = "https://api.github.com/repos/lizard-build/lizard-cli/releases/latest";
9
9
  const RELEASE_BASE = "https://github.com/lizard-build/lizard-cli/releases/latest/download";
10
10
  /** Minimum gap between background update checks. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lizard-build/cli",
3
- "version": "0.3.59",
3
+ "version": "0.3.61",
4
4
  "description": "Lizard CLI — deploy and manage apps on Lizard",
5
5
  "type": "module",
6
6
  "bin": {
@@ -5,7 +5,7 @@ import ora from "ora";
5
5
  import { Command } from "commander";
6
6
  import { api, withScope } from "../lib/api.js";
7
7
  import { resolveProjectScope } from "../lib/resolve.js";
8
- import { success, error, isJSONMode, printJSON } from "../lib/format.js";
8
+ import { success, isJSONMode, printJSON } from "../lib/format.js";
9
9
 
10
10
  export function registerConfig(program: Command) {
11
11
  const config = program.command("config").description("Manage project configuration");
@@ -73,8 +73,9 @@ export function registerConfig(program: Command) {
73
73
  }
74
74
  } catch (e: any) {
75
75
  spinner.stop();
76
- error(`Failed to apply config: ${e.message}`);
77
- process.exit(1);
76
+ // Throw to the central handler so --json / non-TTY callers get the
77
+ // error envelope instead of a bare human line (matches the guards above).
78
+ throw new Error(`Failed to apply config: ${e.message}`);
78
79
  }
79
80
  });
80
81
  }
@@ -2,7 +2,7 @@ import chalk from "chalk";
2
2
  import { Command } from "commander";
3
3
  import { api, withQuery } from "../lib/api.js";
4
4
  import { resolveProjectScope, getActiveServiceWithKind } from "../lib/resolve.js";
5
- import { info, error, isJSONMode, printJSON, table, statusColor, timeAgo } from "../lib/format.js";
5
+ import { info, fail, isJSONMode, printJSON, table, statusColor, timeAgo } from "../lib/format.js";
6
6
 
7
7
  // Shape returned by /api/apps/:id/deploy-events (build-level; crash events
8
8
  // per build are surfaced by `lizard logs --restarts`).
@@ -36,15 +36,13 @@ export function registerEvents(program: Command) {
36
36
  .action(async (opts) => {
37
37
  const n = parseInt(opts.limit, 10);
38
38
  if (isNaN(n) || n < 1) {
39
- error("--limit must be a positive integer");
40
- process.exit(1);
39
+ fail("--limit must be a positive integer");
41
40
  }
42
41
 
43
42
  const { projectId } = await resolveProjectScope(opts.project);
44
43
  const svc = await getActiveServiceWithKind(opts.service, projectId);
45
44
  if (svc.kind === "addon") {
46
- error(`Deploy events are only available for apps — "${svc.name}" is an addon`);
47
- process.exit(1);
45
+ fail(`Deploy events are only available for apps — "${svc.name}" is an addon`);
48
46
  }
49
47
 
50
48
  const [builds, podStatus] = await Promise.all([
@@ -6,7 +6,7 @@ import { Command } from "commander";
6
6
  import { api, getBaseURL, streamSSE, withScope } from "../lib/api.js";
7
7
  import { openURL } from "../lib/auth.js";
8
8
  import { resolveProjectScope, resolveService } from "../lib/resolve.js";
9
- import { success, error, info, isJSONMode, printJSON, isTTY, link } from "../lib/format.js";
9
+ import { success, error, info, fail, isJSONMode, printJSON, isTTY, link } from "../lib/format.js";
10
10
 
11
11
  interface GitHubInstallation {
12
12
  id: number;
@@ -83,8 +83,7 @@ export function registerGit(program: Command) {
83
83
  success("GitHub connected! You can now deploy private repositories.");
84
84
  info(chalk.dim(" Run `lizard deploy` to deploy your project."));
85
85
  } else {
86
- error("GitHub App not detected. Please try again or connect via the dashboard.");
87
- process.exit(1);
86
+ fail("GitHub App not detected. Please try again or connect via the dashboard.");
88
87
  }
89
88
  });
90
89
 
@@ -4,7 +4,7 @@ import { Command } from "commander";
4
4
  import { streamSSE, api, withScope, withQuery, type ResourceScope } from "../lib/api.js";
5
5
  import { resolveProjectScope, resolveService, getActiveServiceWithKind } from "../lib/resolve.js";
6
6
  import { getProjectLink } from "../lib/config.js";
7
- import { info, error, warn, isTTY, isJSONMode, printJSON, table, statusColor, timeAgo } from "../lib/format.js";
7
+ import { info, error, warn, fail, isTTY, isJSONMode, printJSON, table, statusColor, timeAgo } from "../lib/format.js";
8
8
 
9
9
  // Levels assigned by the platform's log collector (regex over the message
10
10
  // text — apps that log errors without an "error"-like keyword come as info).
@@ -36,20 +36,16 @@ export function registerLogs(program: Command) {
36
36
  .option("--restart <id>", "Print log tail of a specific restart event (or 'latest')")
37
37
  .action(async (opts) => {
38
38
  if (opts.restarts !== undefined && opts.restart !== undefined) {
39
- error("Use --restarts (list) or --restart <id> (detail), not both");
40
- process.exit(1);
39
+ fail("Use --restarts (list) or --restart <id> (detail), not both");
41
40
  }
42
41
  if (opts.tail !== undefined && (opts.restarts !== undefined || opts.restart !== undefined)) {
43
- error("--tail cannot be combined with --restarts/--restart");
44
- process.exit(1);
42
+ fail("--tail cannot be combined with --restarts/--restart");
45
43
  }
46
44
  if (opts.level && !LOG_LEVELS.includes(opts.level)) {
47
- error(`Invalid --level "${opts.level}". Choose one of: ${LOG_LEVELS.join(", ")}`);
48
- process.exit(1);
45
+ fail(`Invalid --level "${opts.level}". Choose one of: ${LOG_LEVELS.join(", ")}`);
49
46
  }
50
47
  if (opts.level && (opts.build || opts.restarts !== undefined || opts.restart !== undefined)) {
51
- error("--level applies to runtime logs only (not --build/--restarts/--restart)");
52
- process.exit(1);
48
+ fail("--level applies to runtime logs only (not --build/--restarts/--restart)");
53
49
  }
54
50
 
55
51
  const { projectId, scope } = await resolveProjectScope(opts.project);
@@ -94,8 +90,7 @@ export function registerLogs(program: Command) {
94
90
  if (opts.service && !serviceName) {
95
91
  // An empty name would be dropped from the query string and the
96
92
  // filter would silently match every service.
97
- error(`Service "${opts.service}" has no name to filter logs by`);
98
- process.exit(1);
93
+ fail(`Service "${opts.service}" has no name to filter logs by`);
99
94
  }
100
95
  // The project log stream tags entries with the service *name*
101
96
  // (not ID), so the historical filter must use the name too.
@@ -183,8 +178,7 @@ export function registerLogs(program: Command) {
183
178
  function parseTail(raw: string): number {
184
179
  const n = parseInt(raw, 10);
185
180
  if (isNaN(n) || n < 1) {
186
- error("--tail must be a positive integer");
187
- process.exit(1);
181
+ fail("--tail must be a positive integer");
188
182
  }
189
183
  if (n > 1000) {
190
184
  info(chalk.yellow("--tail capped at 1000 (server limit)"));
@@ -197,8 +191,7 @@ function parseRestartsN(raw: unknown): number {
197
191
  if (raw === true || raw === "" || raw === undefined) return 20;
198
192
  const n = parseInt(String(raw), 10);
199
193
  if (isNaN(n) || n < 1) {
200
- error("--restarts must be a positive integer");
201
- process.exit(1);
194
+ fail("--restarts must be a positive integer");
202
195
  }
203
196
  return n;
204
197
  }
@@ -305,8 +298,7 @@ async function getActiveApp(
305
298
  ): Promise<{ id: string; name: string }> {
306
299
  const svc = await getActiveServiceWithKind(serviceRef, projectId);
307
300
  if (svc.kind === "addon") {
308
- error(`${what} are only available for apps — "${svc.name}" is an addon`);
309
- process.exit(1);
301
+ fail(`${what} are only available for apps — "${svc.name}" is an addon`);
310
302
  }
311
303
  return { id: svc.id, name: svc.name };
312
304
  }
@@ -362,14 +354,12 @@ async function showRestartLogTail(
362
354
  if (ref === "latest") {
363
355
  evt = events[0];
364
356
  if (!evt) {
365
- error(`No restart events for ${svc.name}.`);
366
- process.exit(1);
357
+ fail(`No restart events for ${svc.name}.`);
367
358
  }
368
359
  } else {
369
360
  evt = events.find((e) => e.id === ref);
370
361
  if (!evt) {
371
- error(`Restart event "${ref}" not found for ${svc.name}.`);
372
- process.exit(1);
362
+ fail(`Restart event "${ref}" not found for ${svc.name}.`);
373
363
  }
374
364
  }
375
365
 
@@ -3,7 +3,7 @@ import { Command } from "commander";
3
3
  import { api, withScope, withQuery, APIError, type ResourceScope } from "../lib/api.js";
4
4
  import { getProjectLink } from "../lib/config.js";
5
5
  import { resolveProjectScope, getActiveServiceWithKind } from "../lib/resolve.js";
6
- import { info, error, isJSONMode, printJSON, table, timeAgo } from "../lib/format.js";
6
+ import { info, fail, isJSONMode, printJSON, table, timeAgo } from "../lib/format.js";
7
7
 
8
8
  // Shapes returned by /api/apps/:id/metrics and /api/projects/:id/metrics.
9
9
  // Units: series cpu = vCPUs, memory/disk_used/disk_total = bytes,
@@ -47,12 +47,10 @@ export function registerMetrics(program: Command) {
47
47
  .option("--cost", "Show running resources, cost per hour, and current billing-period usage (incl. egress)")
48
48
  .action(async (opts) => {
49
49
  if (!RANGES.includes(opts.range)) {
50
- error(`Invalid --range "${opts.range}". Choose one of: ${RANGES.join(", ")}`);
51
- process.exit(1);
50
+ fail(`Invalid --range "${opts.range}". Choose one of: ${RANGES.join(", ")}`);
52
51
  }
53
52
  if (opts.watch && isJSONMode()) {
54
- error("--watch is interactive and cannot be combined with --json (poll without --watch instead)");
55
- process.exit(1);
53
+ fail("--watch is interactive and cannot be combined with --json (poll without --watch instead)");
56
54
  }
57
55
 
58
56
  const { projectId, scope } = await resolveProjectScope(opts.project);
@@ -304,8 +302,7 @@ async function watchLive(projectId: string, scope: ResourceScope, serviceId?: st
304
302
  try {
305
303
  services = await fetchLive(projectId, scope);
306
304
  } catch (e: any) {
307
- error(e.message || String(e));
308
- process.exit(1);
305
+ fail(e.message || String(e));
309
306
  }
310
307
  if (serviceId) services = services.filter((s) => s.id === serviceId);
311
308
 
@@ -487,8 +484,7 @@ function fmtPeriodDate(ms: number): string {
487
484
 
488
485
  async function showCost(projectId: string, scope: ResourceScope) {
489
486
  if (!scope.workspaceId) {
490
- error("Could not resolve the workspace for this project. Run `lizard link` first.");
491
- process.exit(1);
487
+ fail("Could not resolve the workspace for this project. Run `lizard link` first.");
492
488
  }
493
489
 
494
490
  let data: { resources: BillingResource[]; costPerHour: number };
@@ -500,8 +496,7 @@ async function showCost(projectId: string, scope: ResourceScope) {
500
496
  ]);
501
497
  } catch (e) {
502
498
  if (e instanceof APIError && e.status === 403) {
503
- error("Billing is only visible to the workspace owner.");
504
- process.exit(2);
499
+ fail("Billing is only visible to the workspace owner.", 2);
505
500
  }
506
501
  throw e;
507
502
  }
@@ -3,6 +3,7 @@ import { Command } from "commander";
3
3
  import { api, withScope } from "../lib/api.js";
4
4
  import { getProjectLink } from "../lib/config.js";
5
5
  import { resolveProjectScope, resolveService } from "../lib/resolve.js";
6
+ import { warn, fail } from "../lib/format.js";
6
7
 
7
8
  interface Secret {
8
9
  key: string;
@@ -52,8 +53,8 @@ export function registerRun(program: Command) {
52
53
  const serviceSecrets = await api.get<Secret[]>(path).catch((err: any) => {
53
54
  if (err?.status === 404) {
54
55
  if (svc.kind === "addon") {
55
- console.warn(
56
- `warning: addon "${svc.name}" exposes no secrets endpoint yet ` +
56
+ warn(
57
+ `addon "${svc.name}" exposes no secrets endpoint yet ` +
57
58
  `(needs GET ${path}). Falling back to project-only env.`,
58
59
  );
59
60
  }
@@ -73,14 +74,15 @@ export function registerRun(program: Command) {
73
74
  env,
74
75
  stdio: "inherit",
75
76
  });
77
+ // The child's own stdout/stderr is inherited verbatim; only the CLI's
78
+ // own spawn failures go through the error contract (JSON envelope in
79
+ // --json/non-TTY mode), preserving conventional exit codes.
76
80
  if (result.error) {
77
81
  const code = (result.error as NodeJS.ErrnoException).code;
78
82
  if (code === "ENOENT") {
79
- console.error(`lizard run: command not found: ${args[0]}`);
80
- process.exit(127);
83
+ fail(`lizard run: command not found: ${args[0]}`, 127, "ENOENT");
81
84
  }
82
- console.error(`lizard run: ${result.error.message}`);
83
- process.exit(1);
85
+ fail(`lizard run: ${result.error.message}`, 1, "SPAWN_ERROR");
84
86
  }
85
87
  process.exit(result.status ?? 1);
86
88
  });
@@ -4,13 +4,18 @@ import { api, withScope, type ResourceScope } from "../lib/api.js";
4
4
  import { getActiveServiceWithKind, resolveProjectScope } from "../lib/resolve.js";
5
5
  import { success, isJSONMode, printJSON } from "../lib/format.js";
6
6
 
7
- // Discrete tiers the dashboard slider exposes (CPU_OPTIONS / MEMORY_OPTIONS in
8
- // lizard-client). The API and node-agent accept other values, but anything off
9
- // the tier list lands in DB as a string the UI slider can't snap to — the row
10
- // shows raw "3000m" and the slider falls to index 0. Mirror the UI tiers so the
11
- // CLI and dashboard stay in lockstep.
7
+ // Discrete tiers the dashboard exposes (CPU_OPTIONS / STORAGE in lizard-client).
8
+ // The API and node-agent accept other values, but anything off the tier list
9
+ // lands in DB as a string the UI selector can't snap to — the row shows raw
10
+ // "3000m" and the selector falls to index 0. Mirror the UI tiers so the CLI and
11
+ // dashboard stay in lockstep.
12
12
  const ALLOWED_CPU_CORES = [1, 2, 4] as const;
13
- const ALLOWED_MEMORY_MB = [512, 1024, 2048, 4096] as const;
13
+ // Memory is a free-range slider on the dashboard (MemorySliderRow): 1 MB step,
14
+ // 128 MB floor, 8192 MB ceiling. Accept any whole MB in that range — no tier
15
+ // list. Emitted k8s string stays canonical (mbToK8s → Gi when divisible by
16
+ // 1024), so a CLI edit produces the same stored value as the slider.
17
+ const MEM_MIN_MB = 128;
18
+ const MEM_MAX_MB = 8192;
14
19
  // Storage tiers match the addon size selector on the dashboard. Addon-only —
15
20
  // apps don't have a resizable data volume on this path.
16
21
  const ALLOWED_STORAGE_MB = [512, 1024, 2048, 4096, 8192, 16384] as const;
@@ -19,7 +24,7 @@ const ALLOWED_STORAGE_MB = [512, 1024, 2048, 4096, 8192, 16384] as const;
19
24
  * `lizard scale` — service scaling.
20
25
  * --replicas <n> change replica count (1-10) — apps only
21
26
  * --cpu <cores> CPU cap; allowed: 1, 2, 4
22
- * --memory <mb> memory cap; allowed: 512, 1024, 2048, 4096
27
+ * --memory <mb> memory cap in MB; any whole value 128-8192
23
28
  * --storage <mb> data volume size; addons only, grow-only;
24
29
  * allowed: 512, 1024, 2048, 4096, 8192, 16384
25
30
  */
@@ -32,7 +37,7 @@ export function registerScale(program: Command) {
32
37
  .option("-p, --project <id>", "Project name, slug, or ID")
33
38
  .option("--replicas <n>", "Number of replicas (1-10), apps only", parseIntOption)
34
39
  .option("--cpu <cores>", `CPU cap, whole cores (allowed: ${ALLOWED_CPU_CORES.join(", ")})`, parseIntOption)
35
- .option("--memory <mb>", `Memory cap in MB (allowed: ${ALLOWED_MEMORY_MB.join(", ")})`, parseIntOption)
40
+ .option("--memory <mb>", `Memory cap in MB (${MEM_MIN_MB}-${MEM_MAX_MB}, 1 MB steps)`, parseIntOption)
36
41
  .option("--storage <mb>", `Data volume size in MB, addons only, grow-only (allowed: ${ALLOWED_STORAGE_MB.join(", ")})`, parseIntOption)
37
42
  .action(async (serviceArg: string | undefined, opts, _cmd) => {
38
43
  const { projectId, scope } = await resolveProjectScope(opts.project);
@@ -55,9 +60,9 @@ export function registerScale(program: Command) {
55
60
  `--cpu ${opts.cpu} not supported. Allowed: ${ALLOWED_CPU_CORES.join(", ")} cores.`,
56
61
  );
57
62
  }
58
- if (opts.memory !== undefined && !(ALLOWED_MEMORY_MB as readonly number[]).includes(opts.memory)) {
63
+ if (opts.memory !== undefined && (opts.memory < MEM_MIN_MB || opts.memory > MEM_MAX_MB)) {
59
64
  throw new Error(
60
- `--memory ${opts.memory} not supported. Allowed: ${ALLOWED_MEMORY_MB.join(", ")} MB.`,
65
+ `--memory ${opts.memory} out of range. Allowed: ${MEM_MIN_MB}-${MEM_MAX_MB} MB.`,
61
66
  );
62
67
  }
63
68
  if (opts.storage !== undefined && !(ALLOWED_STORAGE_MB as readonly number[]).includes(opts.storage)) {
@@ -1,7 +1,7 @@
1
1
  import { Command } from "commander";
2
2
  import { readdirSync, readFileSync, statSync } from "node:fs";
3
3
  import path from "node:path";
4
- import { error, info, isJSONMode, printJSON, table } from "../lib/format.js";
4
+ import { fail, info, isJSONMode, printJSON, table } from "../lib/format.js";
5
5
  import { EMBEDDED_SKILLS } from "../lib/skills-data.generated.js";
6
6
 
7
7
  // Skills are embedded into the JS bundle at build time (see scripts/gen-skills.mjs).
@@ -166,8 +166,7 @@ export function registerSkill(program: Command) {
166
166
  }
167
167
  process.stdout.write(md.endsWith("\n") ? md : md + "\n");
168
168
  } catch (e: any) {
169
- error(e.message);
170
- process.exit(3);
169
+ fail(e.message, 3);
171
170
  }
172
171
  });
173
172
 
@@ -3,7 +3,7 @@ import * as p from "@clack/prompts";
3
3
  import { Command } from "commander";
4
4
  import { api, getBaseURL, streamSSE, withScope } from "../lib/api.js";
5
5
  import { resolveProjectScope, resolveService } from "../lib/resolve.js";
6
- import { error, isTTY, isJSONMode } from "../lib/format.js";
6
+ import { error, fail, isTTY, isJSONMode } from "../lib/format.js";
7
7
  import { getToken } from "../lib/auth.js";
8
8
  import * as https from "node:https";
9
9
  import * as http from "node:http";
@@ -29,8 +29,7 @@ Examples:
29
29
  // "looks like an ID" by length breaks for long service names.
30
30
  const svc = await resolveService(projectId, opts.service);
31
31
  if (svc.kind !== "app") {
32
- error(`"${svc.name}" is an addon — ssh works only for app services.`);
33
- process.exit(1);
32
+ fail(`"${svc.name}" is an addon — ssh works only for app services.`);
34
33
  }
35
34
  serviceId = svc.id;
36
35
  } else {
@@ -40,8 +39,7 @@ Examples:
40
39
  );
41
40
  const running = (data.apps || []).filter((a) => a.status === "running");
42
41
  if (running.length === 0) {
43
- error("No running services in this project.");
44
- process.exit(1);
42
+ fail("No running services in this project.");
45
43
  }
46
44
  if (running.length === 1) {
47
45
  serviceId = running[0].id;
@@ -53,14 +51,12 @@ Examples:
53
51
  if (p.isCancel(selected)) process.exit(5);
54
52
  serviceId = selected as string;
55
53
  } else {
56
- error("Multiple services — pass -s <service>");
57
- process.exit(1);
54
+ fail("Multiple services — pass -s <service>");
58
55
  }
59
56
  }
60
57
 
61
58
  if (cmdArgs.length === 0) {
62
- error("No command given. Usage: lizard ssh -s <service> -- <cmd> [args...]");
63
- process.exit(1);
59
+ fail("No command given. Usage: lizard ssh -s <service> -- <cmd> [args...]");
64
60
  }
65
61
 
66
62
  // The server executes `cmd` via shell on the VM, so each arg must be
package/src/lib/format.ts CHANGED
@@ -16,6 +16,24 @@ export function printJSON(data: unknown) {
16
16
  console.log(JSON.stringify(data, null, 2));
17
17
  }
18
18
 
19
+ /**
20
+ * Terminate with a stable error contract. In JSON mode emit the same
21
+ * `{ error: { code, status, message, body } }` envelope on stdout that the
22
+ * top-level catch in index.ts produces; otherwise print a human "Error:" line
23
+ * on stderr. Use for validation/guard exits that would otherwise bypass the
24
+ * envelope by calling error() + process.exit() directly, leaving agents with
25
+ * empty stdout. `exitCode` is preserved verbatim so callers keep their
26
+ * semantics (2 = auth, 3 = not found, 127 = command not found, …).
27
+ */
28
+ export function fail(msg: string, exitCode = 1, code = "ERROR"): never {
29
+ if (jsonMode) {
30
+ printJSON({ error: { code, status: null, message: msg, body: null } });
31
+ } else {
32
+ error(msg);
33
+ }
34
+ process.exit(exitCode);
35
+ }
36
+
19
37
  export function success(msg: string) {
20
38
  if (jsonMode) return;
21
39
  process.stderr.write(chalk.green("✓") + " " + msg + "\n");
@@ -5,7 +5,7 @@ import { join, dirname } from "node:path";
5
5
  import os from "node:os";
6
6
  import { spawn } from "node:child_process";
7
7
 
8
- export const CURRENT_VERSION = "0.3.59";
8
+ export const CURRENT_VERSION = "0.3.61";
9
9
  const RELEASES_API = "https://api.github.com/repos/lizard-build/lizard-cli/releases/latest";
10
10
  const RELEASE_BASE = "https://github.com/lizard-build/lizard-cli/releases/latest/download";
11
11