@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.
- package/dist/commands/events.d.ts +2 -0
- package/dist/commands/events.js +70 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/logs.js +103 -32
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/metrics.d.ts +2 -0
- package/dist/commands/metrics.js +280 -0
- package/dist/commands/metrics.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +13 -2
- package/dist/lib/api.js +143 -62
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/updater.d.ts +1 -1
- package/dist/lib/updater.js +1 -1
- package/package.json +1 -1
- package/src/commands/events.ts +106 -0
- package/src/commands/logs.ts +110 -34
- package/src/commands/metrics.ts +390 -0
- package/src/index.ts +4 -0
- package/src/lib/api.ts +158 -70
- package/src/lib/updater.ts +1 -1
- package/test/unit/sse.test.ts +173 -0
package/dist/lib/api.js.map
CHANGED
|
@@ -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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"}
|
package/dist/lib/updater.d.ts
CHANGED
package/dist/lib/updater.js
CHANGED
|
@@ -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.
|
|
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
|
@@ -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
|
+
}
|
package/src/commands/logs.ts
CHANGED
|
@@ -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,
|
|
6
|
-
import {
|
|
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")
|
|
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
|
|
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(
|
|
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
|
-
|
|
117
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 === "
|
|
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
|
});
|