@lizard-build/cli 0.3.42 → 0.3.44

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 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export declare const CURRENT_VERSION = "0.3.42";
1
+ export declare const CURRENT_VERSION = "0.3.44";
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.42";
7
+ export const CURRENT_VERSION = "0.3.44";
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.42",
3
+ "version": "0.3.44",
4
4
  "description": "Lizard CLI — deploy and manage apps on Lizard",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,106 @@
1
+ import chalk from "chalk";
2
+ import { Command } from "commander";
3
+ import { api, withQuery } from "../lib/api.js";
4
+ import { resolveProjectScope, getActiveServiceWithKind } from "../lib/resolve.js";
5
+ import { info, error, isJSONMode, printJSON, table, statusColor, timeAgo } from "../lib/format.js";
6
+
7
+ // Shape returned by /api/apps/:id/deploy-events (build-level; crash events
8
+ // per build are surfaced by `lizard logs --restarts`).
9
+ interface DeployEvent {
10
+ buildId: string;
11
+ trigger: string | null;
12
+ status: string;
13
+ commitSha: string | null;
14
+ createdAt: number;
15
+ events: Array<{ id: string; source: string; status: string }>;
16
+ }
17
+
18
+ interface PodStatus {
19
+ name: string;
20
+ phase: string;
21
+ ready: boolean;
22
+ restarts: number;
23
+ reason?: string | null;
24
+ message?: string | null;
25
+ exitCode?: number | null;
26
+ startedAt?: number | null;
27
+ }
28
+
29
+ export function registerEvents(program: Command) {
30
+ program
31
+ .command("events")
32
+ .description("Show deploy history and replica status for an app")
33
+ .option("-s, --service <id>", "Service name or ID (defaults to linked service)")
34
+ .option("-p, --project <id>", "Project name, slug, or ID")
35
+ .option("-n, --limit <n>", "Max deploys to show", "10")
36
+ .action(async (opts) => {
37
+ const n = parseInt(opts.limit, 10);
38
+ if (isNaN(n) || n < 1) {
39
+ error("--limit must be a positive integer");
40
+ process.exit(1);
41
+ }
42
+
43
+ const { projectId } = await resolveProjectScope(opts.project);
44
+ const svc = await getActiveServiceWithKind(opts.service, projectId);
45
+ if (svc.kind === "addon") {
46
+ error(`Deploy events are only available for apps — "${svc.name}" is an addon`);
47
+ process.exit(1);
48
+ }
49
+
50
+ const [builds, podStatus] = await Promise.all([
51
+ api.get<DeployEvent[]>(`/api/apps/${svc.id}/deploy-events`),
52
+ api
53
+ .get<{ pods: PodStatus[] }>(`/api/apps/${svc.id}/pod-status`)
54
+ .catch(() => ({ pods: [] as PodStatus[] })),
55
+ ]);
56
+ const slice = builds.slice(0, n);
57
+
58
+ if (isJSONMode()) {
59
+ printJSON({
60
+ service: { id: svc.id, name: svc.name },
61
+ pods: podStatus.pods,
62
+ deploys: slice,
63
+ });
64
+ return;
65
+ }
66
+
67
+ if (podStatus.pods.length > 0) {
68
+ console.log(chalk.bold("Replicas"));
69
+ table(
70
+ ["Name", "Phase", "Ready", "Restarts", "Started", "Reason"],
71
+ podStatus.pods.map((pod) => [
72
+ pod.name,
73
+ statusColor(pod.phase.toLowerCase()),
74
+ pod.ready ? chalk.green("✓") : chalk.red("✗"),
75
+ String(pod.restarts),
76
+ pod.startedAt ? timeAgo(pod.startedAt) : chalk.dim("—"),
77
+ pod.reason || chalk.dim("—"),
78
+ ]),
79
+ );
80
+ console.log();
81
+ }
82
+
83
+ if (slice.length === 0) {
84
+ info(chalk.dim(`No deploys for ${svc.name} yet.`));
85
+ return;
86
+ }
87
+
88
+ console.log(chalk.bold("Deploys"));
89
+ table(
90
+ ["When", "Status", "Trigger", "Commit", "Restarts", "Build"],
91
+ slice.map((b) => [
92
+ timeAgo(b.createdAt),
93
+ statusColor(b.status),
94
+ b.trigger ?? chalk.dim("—"),
95
+ b.commitSha ? b.commitSha.slice(0, 7) : chalk.dim("—"),
96
+ b.events.length > 0 ? chalk.yellow(String(b.events.length)) : chalk.dim("0"),
97
+ chalk.dim(b.buildId),
98
+ ]),
99
+ );
100
+
101
+ if (builds.length > slice.length) {
102
+ info(chalk.dim(`\n(${builds.length - slice.length} more — re-run with -n ${builds.length})`));
103
+ }
104
+ info(chalk.dim("\nCrash details: lizard logs --restarts Build logs: lizard logs --build"));
105
+ });
106
+ }
@@ -2,8 +2,9 @@ import chalk from "chalk";
2
2
  import * as p from "@clack/prompts";
3
3
  import { Command } from "commander";
4
4
  import { streamSSE, api, withScope, withQuery, type ResourceScope } from "../lib/api.js";
5
- import { resolveProjectScope, resolveService, getActiveService } from "../lib/resolve.js";
6
- import { info, error, isTTY, isJSONMode, printJSON, table, statusColor, timeAgo } from "../lib/format.js";
5
+ import { resolveProjectScope, resolveService, getActiveServiceWithKind } from "../lib/resolve.js";
6
+ import { getProjectLink } from "../lib/config.js";
7
+ import { info, error, warn, isTTY, isJSONMode, printJSON, table, statusColor, timeAgo } from "../lib/format.js";
7
8
 
8
9
  export function registerLogs(program: Command) {
9
10
  program
@@ -20,6 +21,10 @@ export function registerLogs(program: Command) {
20
21
  error("Use --restarts (list) or --restart <id> (detail), not both");
21
22
  process.exit(1);
22
23
  }
24
+ if (opts.tail !== undefined && (opts.restarts !== undefined || opts.restart !== undefined)) {
25
+ error("--tail cannot be combined with --restarts/--restart");
26
+ process.exit(1);
27
+ }
23
28
 
24
29
  const { projectId, scope } = await resolveProjectScope(opts.project);
25
30
 
@@ -50,14 +55,22 @@ export function registerLogs(program: Command) {
50
55
  // branch below talks to the API with a real service ID.
51
56
  let serviceId: string | undefined;
52
57
  let serviceName: string | undefined;
58
+ let serviceKind: "app" | "addon" | undefined;
53
59
  if (opts.service) {
54
60
  const svc = await resolveService(projectId, opts.service);
55
61
  serviceId = svc.id;
56
62
  serviceName = svc.name;
63
+ serviceKind = svc.kind;
57
64
  }
58
65
 
59
66
  // --tail: fetch historical logs and exit
60
67
  if (tailN !== undefined) {
68
+ if (opts.service && !serviceName) {
69
+ // An empty name would be dropped from the query string and the
70
+ // filter would silently match every service.
71
+ error(`Service "${opts.service}" has no name to filter logs by`);
72
+ process.exit(1);
73
+ }
61
74
  // The project log stream tags entries with the service *name*
62
75
  // (not ID), so the historical filter must use the name too.
63
76
  const entries = await api.get<any[]>(
@@ -75,12 +88,13 @@ export function registerLogs(program: Command) {
75
88
 
76
89
  if (!serviceId && isTTY() && !isJSONMode()) {
77
90
  // Offer to pick a specific service or stream all
78
- const data = await api.get<{ apps: any[] }>(
91
+ const data = await api.get<{ apps: any[]; addons?: any[] }>(
79
92
  withScope(`/api/projects/${projectId}/services`, scope),
80
93
  );
81
94
  const apps = data.apps || [];
95
+ const addons = data.addons || [];
82
96
 
83
- if (apps.length > 1) {
97
+ if (apps.length + addons.length > 1) {
84
98
  const choices = [
85
99
  { value: "all", label: "All services", hint: "stream combined logs" },
86
100
  ...apps.map((a: any) => ({
@@ -88,24 +102,42 @@ export function registerLogs(program: Command) {
88
102
  label: a.name || a.id,
89
103
  hint: a.status,
90
104
  })),
105
+ ...addons.map((a: any) => ({
106
+ value: a.id,
107
+ label: a.name || a.addonType || a.id,
108
+ hint: a.status,
109
+ })),
91
110
  ];
92
111
  const selected = await p.select({ message: "Show logs for", options: choices });
93
112
  if (p.isCancel(selected)) process.exit(5);
94
- if (selected !== "all") serviceId = selected as string;
113
+ if (selected !== "all") {
114
+ serviceId = selected as string;
115
+ serviceKind = addons.some((a: any) => a.id === selected) ? "addon" : "app";
116
+ }
95
117
  }
96
118
  }
97
119
 
120
+ const onReconnect = (attempt: number) =>
121
+ warn(`log stream lost — reconnecting (attempt ${attempt}/5)`);
122
+ const streamHandler = (event: string, data: string) => {
123
+ if (event === "error") {
124
+ error(data);
125
+ process.exitCode = 1;
126
+ return false;
127
+ }
128
+ printLogLine(data);
129
+ return true;
130
+ };
131
+
98
132
  if (serviceId) {
99
- // Stream logs for a specific app
133
+ // Stream logs for a specific service. Addons live on a different
134
+ // endpoint — the app one 404s for them.
135
+ const streamPath =
136
+ serviceKind === "addon"
137
+ ? withScope(`/api/projects/${projectId}/addons/${serviceId}/logs`, scope)
138
+ : `/api/apps/${serviceId}/logs`;
100
139
  info(chalk.dim("Streaming logs... (Ctrl+C to stop)\n"));
101
- await streamSSE(`/api/apps/${serviceId}/logs`, (event, data) => {
102
- if (event === "error") {
103
- error(data);
104
- return false;
105
- }
106
- printLogLine(data);
107
- return true;
108
- });
140
+ await streamSSE(streamPath, streamHandler, { reconnect: true, onReconnect });
109
141
  return;
110
142
  }
111
143
 
@@ -113,14 +145,8 @@ export function registerLogs(program: Command) {
113
145
  info(chalk.dim("Streaming project logs... (Ctrl+C to stop)\n"));
114
146
  await streamSSE(
115
147
  withScope(`/api/projects/${projectId}/logs/stream`, scope),
116
- (event, data) => {
117
- if (event === "error") {
118
- error(data);
119
- return false;
120
- }
121
- printLogLine(data);
122
- return true;
123
- },
148
+ streamHandler,
149
+ { reconnect: true, onReconnect },
124
150
  );
125
151
  });
126
152
  }
@@ -174,6 +200,19 @@ type FlatEvent = DeployEvent["events"][number] & {
174
200
 
175
201
  async function fetchFlatRestarts(appId: string): Promise<FlatEvent[]> {
176
202
  const builds = await api.get<DeployEvent[]>(`/api/apps/${appId}/deploy-events`);
203
+ // The plain listing is DB-only; crash events still held by vm-agent are
204
+ // merged in by the server only when a buildId is given. Refetch the newest
205
+ // build so `--restart latest` sees crashes that haven't been persisted yet.
206
+ if (builds.length > 0) {
207
+ try {
208
+ const [withLive] = await api.get<DeployEvent[]>(
209
+ withQuery(`/api/apps/${appId}/deploy-events`, { buildId: builds[0].buildId }),
210
+ );
211
+ if (withLive && withLive.buildId === builds[0].buildId) builds[0] = withLive;
212
+ } catch {
213
+ // node unreachable — the DB-only list is still useful
214
+ }
215
+ }
177
216
  const flat: FlatEvent[] = [];
178
217
  for (const b of builds) {
179
218
  for (const e of b.events) {
@@ -228,12 +267,27 @@ function printLogLine(data: string) {
228
267
  }
229
268
  }
230
269
 
270
+ /** Resolve the target for app-only subcommands; addons have no builds or
271
+ * restart events, so fail with a clear message instead of a server 404. */
272
+ async function getActiveApp(
273
+ serviceRef: string | undefined,
274
+ projectId: string,
275
+ what: string,
276
+ ): Promise<{ id: string; name: string }> {
277
+ const svc = await getActiveServiceWithKind(serviceRef, projectId);
278
+ if (svc.kind === "addon") {
279
+ error(`${what} are only available for apps — "${svc.name}" is an addon`);
280
+ process.exit(1);
281
+ }
282
+ return { id: svc.id, name: svc.name };
283
+ }
284
+
231
285
  async function showRestartList(
232
286
  serviceRef: string | undefined,
233
287
  projectId: string,
234
288
  n: number,
235
289
  ) {
236
- const svc = await getActiveService(serviceRef, projectId);
290
+ const svc = await getActiveApp(serviceRef, projectId, "Restart events");
237
291
  const events = await fetchFlatRestarts(svc.id);
238
292
  const slice = events.slice(0, n);
239
293
 
@@ -272,7 +326,7 @@ async function showRestartLogTail(
272
326
  projectId: string,
273
327
  ref: string,
274
328
  ) {
275
- const svc = await getActiveService(serviceRef, projectId);
329
+ const svc = await getActiveApp(serviceRef, projectId, "Restart events");
276
330
  const events = await fetchFlatRestarts(svc.id);
277
331
 
278
332
  let evt: FlatEvent | undefined;
@@ -319,13 +373,11 @@ async function showBuildLogs(
319
373
  tailN?: number,
320
374
  ) {
321
375
  let appId: string | undefined;
322
- if (serviceRef) {
323
- const svc = await resolveService(projectId, serviceRef);
376
+ if (serviceRef || getProjectLink()?.serviceId) {
377
+ // Explicit -s flag, or the service linked to this cwd.
378
+ const svc = await getActiveApp(serviceRef, projectId, "Build logs");
324
379
  appId = svc.id;
325
- }
326
-
327
- if (!appId) {
328
- // Get first app in project
380
+ } else {
329
381
  const data = await api.get<{ apps: Array<{ id: string; name: string }> }>(
330
382
  withScope(`/api/projects/${projectId}/services`, scope),
331
383
  );
@@ -335,6 +387,9 @@ async function showBuildLogs(
335
387
  );
336
388
  }
337
389
  appId = data.apps[0].id;
390
+ if (data.apps.length > 1) {
391
+ info(chalk.dim(`Multiple apps — showing ${data.apps[0].name}. Use -s to pick another.`));
392
+ }
338
393
  }
339
394
 
340
395
  // Get latest build
@@ -354,24 +409,45 @@ async function showBuildLogs(
354
409
  // Snapshot semantics: the server replays history immediately; if the
355
410
  // build is still running the stream would otherwise follow it forever.
356
411
  // Stop after 3s without new events and print what we have.
357
- const lines: string[] = [];
412
+ //
413
+ // Each SSE event carries a multi-line *chunk* (a logSnippet delta), not a
414
+ // single line — for a finished build the whole log arrives as one event.
415
+ // Reassemble the text first, then tail by line.
416
+ const chunks: string[] = [];
358
417
  await streamSSE(
359
418
  `/api/builds/${buildId}/logs`,
360
419
  (event, data) => {
361
420
  if (event === "done" || event === "error") return false;
362
- lines.push(data);
421
+ try {
422
+ const parsed = JSON.parse(data);
423
+ chunks.push(typeof parsed === "string" ? parsed : data);
424
+ } catch {
425
+ chunks.push(data);
426
+ }
363
427
  return true;
364
428
  },
365
429
  { idleTimeoutMs: 3000 },
366
430
  );
367
- for (const line of lines.slice(-tailN)) printLogLine(line);
431
+ const lines = chunks.join("").split("\n");
432
+ while (lines.length && lines[lines.length - 1] === "") lines.pop();
433
+ for (const line of lines.slice(-tailN)) {
434
+ if (isJSONMode()) {
435
+ process.stdout.write(JSON.stringify({ message: line }) + "\n");
436
+ } else {
437
+ process.stdout.write(line + "\n");
438
+ }
439
+ }
368
440
  return;
369
441
  }
370
442
 
371
443
  await streamSSE(`/api/builds/${buildId}/logs`, (event, data) => {
372
- if (event === "done" || event === "error") {
444
+ if (event === "error") {
445
+ // The human-readable "--- Build failed ---" line already arrived as a
446
+ // data event; just make the failure visible to scripts.
447
+ process.exitCode = 1;
373
448
  return false;
374
449
  }
450
+ if (event === "done") return false;
375
451
  printLogLine(data);
376
452
  return true;
377
453
  });