@lizard-build/cli 0.1.0 → 0.3.29

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.
Files changed (178) hide show
  1. package/.github/workflows/release.yml +90 -0
  2. package/README.md +41 -0
  3. package/dist/commands/add.js +318 -45
  4. package/dist/commands/add.js.map +1 -1
  5. package/dist/commands/config.d.ts +2 -0
  6. package/dist/commands/config.js +68 -0
  7. package/dist/commands/config.js.map +1 -0
  8. package/dist/commands/docs.d.ts +2 -0
  9. package/dist/commands/docs.js +13 -0
  10. package/dist/commands/docs.js.map +1 -0
  11. package/dist/commands/domain.d.ts +9 -0
  12. package/dist/commands/domain.js +195 -0
  13. package/dist/commands/domain.js.map +1 -0
  14. package/dist/commands/git.js +175 -36
  15. package/dist/commands/git.js.map +1 -1
  16. package/dist/commands/init.d.ts +24 -0
  17. package/dist/commands/init.js +128 -86
  18. package/dist/commands/init.js.map +1 -1
  19. package/dist/commands/link.d.ts +7 -0
  20. package/dist/commands/link.js +104 -33
  21. package/dist/commands/link.js.map +1 -1
  22. package/dist/commands/login.js +4 -3
  23. package/dist/commands/login.js.map +1 -1
  24. package/dist/commands/logs.js +223 -30
  25. package/dist/commands/logs.js.map +1 -1
  26. package/dist/commands/open.js +3 -2
  27. package/dist/commands/open.js.map +1 -1
  28. package/dist/commands/port.d.ts +7 -0
  29. package/dist/commands/port.js +49 -0
  30. package/dist/commands/port.js.map +1 -0
  31. package/dist/commands/projects.js +36 -6
  32. package/dist/commands/projects.js.map +1 -1
  33. package/dist/commands/ps.js +32 -39
  34. package/dist/commands/ps.js.map +1 -1
  35. package/dist/commands/redeploy.js +48 -8
  36. package/dist/commands/redeploy.js.map +1 -1
  37. package/dist/commands/regions.js +2 -5
  38. package/dist/commands/regions.js.map +1 -1
  39. package/dist/commands/restart.js +84 -10
  40. package/dist/commands/restart.js.map +1 -1
  41. package/dist/commands/run.d.ts +9 -0
  42. package/dist/commands/run.js +61 -22
  43. package/dist/commands/run.js.map +1 -1
  44. package/dist/commands/scale.d.ts +10 -0
  45. package/dist/commands/scale.js +166 -0
  46. package/dist/commands/scale.js.map +1 -0
  47. package/dist/commands/secrets.js +200 -89
  48. package/dist/commands/secrets.js.map +1 -1
  49. package/dist/commands/service-set.d.ts +49 -0
  50. package/dist/commands/service-set.js +552 -0
  51. package/dist/commands/service-set.js.map +1 -0
  52. package/dist/commands/service-show.d.ts +11 -0
  53. package/dist/commands/service-show.js +44 -0
  54. package/dist/commands/service-show.js.map +1 -0
  55. package/dist/commands/service.d.ts +8 -0
  56. package/dist/commands/service.js +262 -0
  57. package/dist/commands/service.js.map +1 -0
  58. package/dist/commands/ssh.d.ts +2 -0
  59. package/dist/commands/ssh.js +161 -0
  60. package/dist/commands/ssh.js.map +1 -0
  61. package/dist/commands/status.d.ts +7 -0
  62. package/dist/commands/status.js +49 -38
  63. package/dist/commands/status.js.map +1 -1
  64. package/dist/commands/unlink.d.ts +5 -0
  65. package/dist/commands/unlink.js +18 -0
  66. package/dist/commands/unlink.js.map +1 -0
  67. package/dist/commands/up.d.ts +9 -0
  68. package/dist/commands/up.js +417 -0
  69. package/dist/commands/up.js.map +1 -0
  70. package/dist/commands/upgrade.d.ts +2 -0
  71. package/dist/commands/upgrade.js +79 -0
  72. package/dist/commands/upgrade.js.map +1 -0
  73. package/dist/commands/whoami.js +26 -6
  74. package/dist/commands/whoami.js.map +1 -1
  75. package/dist/commands/workspace.d.ts +8 -0
  76. package/dist/commands/workspace.js +36 -0
  77. package/dist/commands/workspace.js.map +1 -0
  78. package/dist/index.js +204 -82
  79. package/dist/index.js.map +1 -1
  80. package/dist/lib/api.d.ts +17 -2
  81. package/dist/lib/api.js +85 -51
  82. package/dist/lib/api.js.map +1 -1
  83. package/dist/lib/auth.d.ts +3 -11
  84. package/dist/lib/auth.js +16 -36
  85. package/dist/lib/auth.js.map +1 -1
  86. package/dist/lib/config.d.ts +36 -15
  87. package/dist/lib/config.js +71 -58
  88. package/dist/lib/config.js.map +1 -1
  89. package/dist/lib/format.d.ts +1 -0
  90. package/dist/lib/format.js +17 -4
  91. package/dist/lib/format.js.map +1 -1
  92. package/dist/lib/name.d.ts +11 -0
  93. package/dist/lib/name.js +26 -0
  94. package/dist/lib/name.js.map +1 -0
  95. package/dist/lib/picker.d.ts +32 -0
  96. package/dist/lib/picker.js +91 -0
  97. package/dist/lib/picker.js.map +1 -0
  98. package/dist/lib/resolve.d.ts +85 -0
  99. package/dist/lib/resolve.js +203 -0
  100. package/dist/lib/resolve.js.map +1 -0
  101. package/dist/lib/updater.d.ts +16 -0
  102. package/dist/lib/updater.js +102 -0
  103. package/dist/lib/updater.js.map +1 -0
  104. package/lizard-wrapper.sh +2 -0
  105. package/package.json +11 -3
  106. package/src/commands/add.ts +388 -56
  107. package/src/commands/config.ts +80 -0
  108. package/src/commands/docs.ts +15 -0
  109. package/src/commands/domain.ts +248 -0
  110. package/src/commands/git.ts +201 -40
  111. package/src/commands/init.ts +149 -100
  112. package/src/commands/link.ts +127 -35
  113. package/src/commands/login.ts +4 -3
  114. package/src/commands/logs.ts +283 -27
  115. package/src/commands/open.ts +3 -2
  116. package/src/commands/port.ts +57 -0
  117. package/src/commands/projects.ts +43 -6
  118. package/src/commands/ps.ts +39 -60
  119. package/src/commands/redeploy.ts +51 -10
  120. package/src/commands/regions.ts +2 -6
  121. package/src/commands/restart.ts +84 -10
  122. package/src/commands/run.ts +68 -24
  123. package/src/commands/scale.ts +216 -0
  124. package/src/commands/secrets.ts +277 -100
  125. package/src/commands/service-set.ts +669 -0
  126. package/src/commands/service-show.ts +52 -0
  127. package/src/commands/service.ts +298 -0
  128. package/src/commands/ssh.ts +176 -0
  129. package/src/commands/status.ts +51 -46
  130. package/src/commands/unlink.ts +17 -0
  131. package/src/commands/up.ts +461 -0
  132. package/src/commands/upgrade.ts +87 -0
  133. package/src/commands/whoami.ts +34 -6
  134. package/src/commands/workspace.ts +44 -0
  135. package/src/index.ts +214 -85
  136. package/src/lib/api.ts +114 -51
  137. package/src/lib/auth.ts +22 -46
  138. package/src/lib/config.ts +100 -65
  139. package/src/lib/format.ts +18 -4
  140. package/src/lib/name.ts +27 -0
  141. package/src/lib/picker.ts +133 -0
  142. package/src/lib/resolve.ts +285 -0
  143. package/src/lib/updater.ts +106 -0
  144. package/test/cli.test.ts +491 -0
  145. package/test/fixtures/hello-app/Dockerfile +5 -0
  146. package/test/fixtures/hello-app/index.js +5 -0
  147. package/test/unit/api.test.ts +66 -0
  148. package/test/unit/config.test.ts +94 -0
  149. package/test/unit/init.test.ts +211 -0
  150. package/test/unit/json.test.ts +208 -0
  151. package/test/unit/picker.test.ts +161 -0
  152. package/test/unit/resolve.test.ts +124 -0
  153. package/test/unit/service-set.test.ts +355 -0
  154. package/vitest.config.ts +10 -0
  155. package/dist/commands/connect.d.ts +0 -2
  156. package/dist/commands/connect.js +0 -117
  157. package/dist/commands/connect.js.map +0 -1
  158. package/dist/commands/context.d.ts +0 -2
  159. package/dist/commands/context.js +0 -71
  160. package/dist/commands/context.js.map +0 -1
  161. package/dist/commands/deploy.d.ts +0 -2
  162. package/dist/commands/deploy.js +0 -120
  163. package/dist/commands/deploy.js.map +0 -1
  164. package/dist/commands/destroy.d.ts +0 -2
  165. package/dist/commands/destroy.js +0 -51
  166. package/dist/commands/destroy.js.map +0 -1
  167. package/dist/commands/update.d.ts +0 -2
  168. package/dist/commands/update.js +0 -41
  169. package/dist/commands/update.js.map +0 -1
  170. package/dist/commands/version.d.ts +0 -2
  171. package/dist/commands/version.js +0 -37
  172. package/dist/commands/version.js.map +0 -1
  173. package/src/commands/connect.ts +0 -145
  174. package/src/commands/context.ts +0 -93
  175. package/src/commands/deploy.ts +0 -153
  176. package/src/commands/destroy.ts +0 -51
  177. package/src/commands/update.ts +0 -44
  178. package/src/commands/version.ts +0 -37
@@ -0,0 +1,417 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import { execSync, spawn } from "child_process";
4
+ import * as fs from "node:fs";
5
+ import * as path from "node:path";
6
+ import * as readline from "node:readline";
7
+ import { api, streamSSE, getBaseURL } from "../lib/api.js";
8
+ import { updateProjectLink } from "../lib/config.js";
9
+ import { resolveContext, getScope } from "../lib/resolve.js";
10
+ import { ensureLinked } from "./init.js";
11
+ import { success, info, error, isJSONMode, isTTY, printJSON, statusColor, } from "../lib/format.js";
12
+ /**
13
+ * Builds the `up` command:
14
+ * - upload local code (or `[path]`) as a tarball
15
+ * - target a service via --service / linked / first-in-project
16
+ * - --ci streams build logs only and exits when build finishes
17
+ * - --detach returns immediately after upload
18
+ */
19
+ export function registerUp(program) {
20
+ const up = program
21
+ .command("up")
22
+ .description("Upload and deploy code to Lizard")
23
+ .argument("[path]", "Path to deploy (default: current directory)")
24
+ .option("-d, --detach", "Don't attach to the log stream")
25
+ .option("-c, --ci", "Stream build logs only, exit on completion")
26
+ .option("-s, --service <name>", "Service to deploy to (defaults to linked)")
27
+ .option("--no-gitignore", "Don't ignore paths from .gitignore")
28
+ .option("--region <code>", "Region to create the service in (new services only)")
29
+ .option("--build-command <cmd>", "Build command to run (e.g. 'npm run build')")
30
+ .option("--start-command <cmd>", "Start command to run (e.g. 'node dist/index.js')")
31
+ .option("--pre-deploy-command <cmd>", "Pre-deploy command (e.g. 'node dist/migrate.js')")
32
+ .option("--port <number>", "Container port (default: 3000)")
33
+ .action(async (pathArg, opts, cmd) => {
34
+ const merged = cmd.optsWithGlobals();
35
+ const serviceFlag = merged.service ?? opts.service;
36
+ const projectFlag = merged.project;
37
+ const region = opts.region;
38
+ // Run init flow if cwd isn't linked yet
39
+ await ensureLinked({ projectName: projectFlag });
40
+ // Resolve target service: --service flag → linked → first-in-project → prompt-or-fail
41
+ const ctx = await resolveContext({
42
+ projectFlag,
43
+ serviceFlag,
44
+ });
45
+ const projectId = ctx.projectId;
46
+ const scope = getScope(ctx);
47
+ const targetPath = pathArg ? path.resolve(pathArg) : process.cwd();
48
+ // `up` always uploads a local tarball. For redeploy of an existing
49
+ // build without re-uploading, use `lizard redeploy`.
50
+ await deployFromLocal({
51
+ projectId,
52
+ scope,
53
+ targetPath,
54
+ useGitignore: opts.gitignore !== false,
55
+ serviceFlag,
56
+ existingServiceId: ctx.service?.id,
57
+ region,
58
+ buildCommand: opts.buildCommand,
59
+ startCommand: opts.startCommand,
60
+ preDeployCommand: opts.preDeployCommand,
61
+ port: opts.port ? parseInt(opts.port, 10) : undefined,
62
+ opts,
63
+ });
64
+ });
65
+ // `lizard up status <id>` — show build/deploy status
66
+ up
67
+ .command("status")
68
+ .argument("<id>", "App or deploy ID")
69
+ .description("Show deployment status")
70
+ .action(async (id) => {
71
+ const app = await api.get(`/api/apps/${id}`);
72
+ if (isJSONMode()) {
73
+ printJSON(app);
74
+ return;
75
+ }
76
+ console.log(`${chalk.bold(app.name)} ${statusColor(app.status)}`);
77
+ if (app.domain)
78
+ console.log(` URL: ${chalk.cyan(`https://${app.domain}`)}`);
79
+ if (app.builds?.length)
80
+ console.log(` Latest build: ${statusColor(app.builds[0].status)}`);
81
+ });
82
+ }
83
+ // ── deploy strategies ────────────────────────────────────────────────────────
84
+ async function deployFromLocal(args) {
85
+ const defaultName = args.serviceFlag || getDefaultAppName(args.targetPath);
86
+ info(`${args.existingServiceId ? "Uploading" : "Creating service from"} ${chalk.dim(args.targetPath)}`);
87
+ let appName = args.serviceFlag || defaultName;
88
+ if (!args.existingServiceId && !args.serviceFlag && isTTY()) {
89
+ const nameInput = await prompt(`Service name [${defaultName}]: `);
90
+ appName = nameInput || defaultName;
91
+ }
92
+ const files = getUploadFiles(args.targetPath, args.useGitignore);
93
+ if (files.length === 0) {
94
+ throw new Error("No files to upload. Run from a directory with files, or pass a path: `lizard up <path>`.");
95
+ }
96
+ info(chalk.dim(` ${files.length} files selected`));
97
+ const detectedPort = args.port === undefined ? detectLocalPort(args.targetPath) : undefined;
98
+ if (detectedPort)
99
+ info(`Detected port ${chalk.bold(detectedPort)} from Dockerfile`);
100
+ const tarball = await createTarball(files, args.targetPath);
101
+ info(chalk.dim(` Tarball: ${(tarball.length / 1024 / 1024).toFixed(1)} MB`));
102
+ const spinner = ora("Uploading...").start();
103
+ let newApp;
104
+ try {
105
+ const resolvedPort = args.port ?? detectedPort;
106
+ const qs = new URLSearchParams();
107
+ // Only send port when explicitly given or detected — lets server keep the stored
108
+ // containerPort on redeploy instead of overwriting it with the 3000 default.
109
+ if (resolvedPort !== undefined)
110
+ qs.set("port", String(resolvedPort));
111
+ if (!args.existingServiceId) {
112
+ qs.set("name", appName);
113
+ if (args.region)
114
+ qs.set("region", args.region);
115
+ // New services with no detected port default to 3000
116
+ if (resolvedPort === undefined)
117
+ qs.set("port", "3000");
118
+ }
119
+ if (args.existingServiceId)
120
+ qs.set("appId", args.existingServiceId);
121
+ if (args.buildCommand)
122
+ qs.set("buildCommand", args.buildCommand);
123
+ if (args.startCommand)
124
+ qs.set("startCommand", args.startCommand);
125
+ if (args.preDeployCommand)
126
+ qs.set("preDeployCommand", args.preDeployCommand);
127
+ if (args.scope.workspaceId)
128
+ qs.set("workspaceId", args.scope.workspaceId);
129
+ const url = `${getBaseURL()}/api/projects/${args.projectId}/apps/upload?${qs.toString()}`;
130
+ const res = await fetch(url, {
131
+ method: "POST",
132
+ headers: {
133
+ "Content-Type": "application/octet-stream",
134
+ Authorization: `Bearer ${(await import("../lib/auth.js")).getToken()}`,
135
+ },
136
+ body: tarball.buffer,
137
+ });
138
+ if (!res.ok) {
139
+ const text = await res.text();
140
+ throw new Error(`Upload failed (${res.status}): ${text || res.statusText}`);
141
+ }
142
+ newApp = (await res.json());
143
+ spinner.succeed(`Service ${chalk.bold(newApp.name)} ${args.existingServiceId ? "updated" : "created"}`);
144
+ }
145
+ catch (err) {
146
+ spinner.fail("Upload failed");
147
+ throw err;
148
+ }
149
+ saveServiceToConfig(args.projectId, newApp.id, newApp.name);
150
+ if (args.opts.detach) {
151
+ isJSONMode()
152
+ ? printJSON({ appId: newApp.id, version: 1, status: "deploying" })
153
+ : success(`Deploy started ${chalk.dim(`lizard up status ${newApp.id}`)}`);
154
+ return;
155
+ }
156
+ await streamBuildLogs(newApp.id, args.opts.ci);
157
+ }
158
+ // ── helpers ──────────────────────────────────────────────────────────────────
159
+ function saveServiceToConfig(_projectId, serviceId, serviceName) {
160
+ try {
161
+ updateProjectLink({ serviceId, serviceName });
162
+ }
163
+ catch { }
164
+ }
165
+ function getDefaultAppName(cwd = process.cwd()) {
166
+ try {
167
+ const pkg = JSON.parse(fs.readFileSync(path.join(cwd, "package.json"), "utf8"));
168
+ if (pkg.name)
169
+ return pkg.name.replace(/^@[^/]+\//, "");
170
+ }
171
+ catch { }
172
+ return path.basename(cwd);
173
+ }
174
+ function getUploadFiles(cwd, useGitignore) {
175
+ if (useGitignore) {
176
+ try {
177
+ // `-z` outputs NUL-separated paths and disables git's default behaviour
178
+ // of double-quoting names with unusual characters. Without it, a file
179
+ // called `weird\nname.txt` would either get quoted (and never matched
180
+ // by tar) or split the listing across newlines.
181
+ const tracked = execSync("git ls-files -z", {
182
+ cwd,
183
+ stdio: ["pipe", "pipe", "pipe"],
184
+ })
185
+ .toString("utf8")
186
+ .split("\0")
187
+ .filter(Boolean);
188
+ const untracked = execSync("git ls-files --others --exclude-standard -z", {
189
+ cwd,
190
+ stdio: ["pipe", "pipe", "pipe"],
191
+ })
192
+ .toString("utf8")
193
+ .split("\0")
194
+ .filter(Boolean);
195
+ return [...new Set([...tracked, ...untracked])];
196
+ }
197
+ catch {
198
+ // fall through to manual collection
199
+ }
200
+ }
201
+ return collectFilesManually(cwd, cwd);
202
+ }
203
+ const EXCLUDE_DIRS = new Set([
204
+ "node_modules",
205
+ ".git",
206
+ "dist",
207
+ ".next",
208
+ "build",
209
+ "__pycache__",
210
+ ".venv",
211
+ "venv",
212
+ ".cache",
213
+ "coverage",
214
+ ".turbo",
215
+ ".vercel",
216
+ ]);
217
+ const EXCLUDE_EXT = new Set([".pyc", ".pyo", ".log", ".DS_Store"]);
218
+ function collectFilesManually(root, dir) {
219
+ const results = [];
220
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
221
+ if (EXCLUDE_DIRS.has(entry.name))
222
+ continue;
223
+ if (EXCLUDE_EXT.has(path.extname(entry.name)))
224
+ continue;
225
+ const full = path.join(dir, entry.name);
226
+ if (entry.isDirectory())
227
+ results.push(...collectFilesManually(root, full));
228
+ else
229
+ results.push(path.relative(root, full));
230
+ }
231
+ return results;
232
+ }
233
+ function createTarball(files, cwd) {
234
+ return new Promise((resolve, reject) => {
235
+ const chunks = [];
236
+ // `--null` makes tar read NUL-separated paths from stdin, matching what
237
+ // `git ls-files -z` writes. Newline-separated input would split filenames
238
+ // containing `\n` across multiple entries. Both bsdtar (macOS) and GNU
239
+ // tar accept `--null` before `-T -`.
240
+ const tar = spawn("tar", ["--null", "-czf", "-", "-T", "-"], { cwd });
241
+ tar.stdout.on("data", (c) => chunks.push(c));
242
+ tar.stderr.on("data", () => { });
243
+ tar.on("close", (code) => {
244
+ if (code === 0) {
245
+ const total = chunks.reduce((n, c) => n + c.length, 0);
246
+ const out = new Uint8Array(total);
247
+ let off = 0;
248
+ for (const c of chunks) {
249
+ out.set(c, off);
250
+ off += c.length;
251
+ }
252
+ resolve(out);
253
+ }
254
+ else {
255
+ reject(new Error(`tar exited ${code}`));
256
+ }
257
+ });
258
+ if (files.length > 0)
259
+ tar.stdin.write(files.join("\0") + "\0");
260
+ tar.stdin.end();
261
+ });
262
+ }
263
+ function detectLocalPort(dir) {
264
+ for (const name of ["Dockerfile", "dockerfile", "Dockerfile.production"]) {
265
+ try {
266
+ const text = fs.readFileSync(path.join(dir, name), "utf8");
267
+ const match = text.match(/^EXPOSE\s+(\d+)/m);
268
+ if (match)
269
+ return parseInt(match[1], 10);
270
+ }
271
+ catch { }
272
+ }
273
+ return undefined;
274
+ }
275
+ function prompt(question) {
276
+ return new Promise((resolve) => {
277
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
278
+ rl.question(question, (answer) => {
279
+ rl.close();
280
+ resolve(answer.trim());
281
+ });
282
+ });
283
+ }
284
+ async function streamBuildLogs(appId, ciMode = false) {
285
+ const spinner = ora("Waiting for build...").start();
286
+ let buildId = null;
287
+ for (let i = 0; i < 30; i++) {
288
+ await sleep(2000);
289
+ try {
290
+ const app = await api.get(`/api/apps/${appId}`);
291
+ if (app.builds?.length) {
292
+ const latest = app.builds[0];
293
+ if (["building", "deploying", "running", "failed"].includes(latest.status)) {
294
+ buildId = latest.id;
295
+ break;
296
+ }
297
+ }
298
+ }
299
+ catch { }
300
+ }
301
+ spinner.stop();
302
+ if (!buildId) {
303
+ info(chalk.dim("No build found. Check `lizard up status <id>`."));
304
+ return;
305
+ }
306
+ info(chalk.dim("Streaming build logs...\n"));
307
+ // Stream with auto-reconnect — connections can drop mid-build (Cloudflare
308
+ // idle timeout, network blips). Reconnect until the build itself reports
309
+ // a terminal status, with a hard cap so we don't loop forever.
310
+ const deadline = Date.now() + 15 * 60 * 1000; // 15 min max
311
+ while (Date.now() < deadline) {
312
+ let dropped = false;
313
+ try {
314
+ await streamSSE(`/api/builds/${buildId}/logs`, (event, data) => {
315
+ if (event === "done" || event === "error") {
316
+ if (event === "error")
317
+ emitBuildError(data);
318
+ else
319
+ emitBuildDone();
320
+ return false;
321
+ }
322
+ emitBuildLine(data);
323
+ return true;
324
+ });
325
+ }
326
+ catch {
327
+ dropped = true;
328
+ }
329
+ // Whether we got a clean SSE end or a dropped connection, check the
330
+ // build state — terminal status means we stop reconnecting.
331
+ try {
332
+ const build = await api.get(`/api/builds/${buildId}`);
333
+ if (build.status === "done" || build.status === "failed")
334
+ break;
335
+ }
336
+ catch { }
337
+ if (!dropped)
338
+ break; // clean SSE end — don't reconnect
339
+ await sleep(2000);
340
+ }
341
+ if (ciMode)
342
+ return;
343
+ const app = await api.get(`/api/apps/${appId}`);
344
+ if (app.status === "running") {
345
+ if (isJSONMode()) {
346
+ process.stdout.write(JSON.stringify({
347
+ event: "deployed",
348
+ status: "running",
349
+ url: app.domain ? `https://${app.domain}` : null,
350
+ }) + "\n");
351
+ }
352
+ else {
353
+ success(`Deployed! ${app.domain ? chalk.cyan(`https://${app.domain}`) : ""}`);
354
+ }
355
+ }
356
+ else if (app.status === "failed") {
357
+ if (isJSONMode()) {
358
+ process.stdout.write(JSON.stringify({ event: "failed", status: "failed" }) + "\n");
359
+ }
360
+ else {
361
+ error("Deploy failed. Check logs with `lizard logs --build`");
362
+ }
363
+ }
364
+ else if (app.status === "deploying") {
365
+ if (isJSONMode()) {
366
+ process.stdout.write(JSON.stringify({ event: "deploying", status: "deploying" }) + "\n");
367
+ }
368
+ else {
369
+ info(chalk.dim("Still deploying... check status with `lizard ps`"));
370
+ }
371
+ }
372
+ }
373
+ // ── build stream emitters ────────────────────────────────────────────────────
374
+ function emitBuildLine(data) {
375
+ let parsed;
376
+ try {
377
+ parsed = JSON.parse(data);
378
+ }
379
+ catch {
380
+ parsed = { line: data };
381
+ }
382
+ if (typeof parsed === "string")
383
+ parsed = { line: parsed };
384
+ const line = parsed.line ?? parsed.message ?? "";
385
+ if (isJSONMode()) {
386
+ process.stdout.write(JSON.stringify({ event: "log", line, ...stripLine(parsed) }) + "\n");
387
+ return;
388
+ }
389
+ if (line)
390
+ process.stdout.write(line + "\n");
391
+ else
392
+ process.stdout.write(data + "\n");
393
+ }
394
+ function stripLine(obj) {
395
+ const { line: _l, message: _m, ...rest } = obj;
396
+ return rest;
397
+ }
398
+ function emitBuildDone() {
399
+ if (isJSONMode()) {
400
+ process.stdout.write(JSON.stringify({ event: "done" }) + "\n");
401
+ }
402
+ else {
403
+ success("Build complete");
404
+ }
405
+ }
406
+ function emitBuildError(data) {
407
+ if (isJSONMode()) {
408
+ process.stdout.write(JSON.stringify({ event: "error", message: data }) + "\n");
409
+ }
410
+ else {
411
+ error(`Build failed: ${data}`);
412
+ }
413
+ }
414
+ function sleep(ms) {
415
+ return new Promise((r) => setTimeout(r, ms));
416
+ }
417
+ //# sourceMappingURL=up.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"up.js","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerUpgrade(program: Command): void;
@@ -0,0 +1,79 @@
1
+ import chalk from "chalk";
2
+ import { info, success, isJSONMode, printJSON } from "../lib/format.js";
3
+ import { CURRENT_VERSION, getLatestVersion, selfUpdate } from "../lib/updater.js";
4
+ export function registerUpgrade(program) {
5
+ program
6
+ .command("upgrade")
7
+ .description("Upgrade Lizard CLI to latest version")
8
+ .option("--check", "Only check for updates without installing")
9
+ .action(async (opts) => {
10
+ const result = await getLatestVersion();
11
+ if (result.kind === "rate-limited") {
12
+ if (isJSONMode()) {
13
+ printJSON({
14
+ currentVersion: CURRENT_VERSION,
15
+ error: { code: "rate_limited", resetAt: result.resetAt },
16
+ });
17
+ return;
18
+ }
19
+ const eta = result.resetAt > 0
20
+ ? ` Try again in ~${Math.max(1, Math.ceil((result.resetAt * 1000 - Date.now()) / 60_000))} min.`
21
+ : "";
22
+ info(`GitHub API rate-limited (60 req/h per IP).${eta}`);
23
+ return;
24
+ }
25
+ if (result.kind === "error") {
26
+ if (isJSONMode()) {
27
+ printJSON({
28
+ currentVersion: CURRENT_VERSION,
29
+ error: { code: "check_failed" },
30
+ });
31
+ return;
32
+ }
33
+ info("Could not check for updates. Check your internet connection.");
34
+ return;
35
+ }
36
+ const latest = result.version;
37
+ const updateAvailable = latest !== CURRENT_VERSION;
38
+ if (isJSONMode() && opts.check) {
39
+ printJSON({ currentVersion: CURRENT_VERSION, latestVersion: latest, updateAvailable });
40
+ return;
41
+ }
42
+ if (!updateAvailable) {
43
+ if (isJSONMode()) {
44
+ printJSON({
45
+ currentVersion: CURRENT_VERSION,
46
+ latestVersion: latest,
47
+ updateAvailable: false,
48
+ upgraded: false,
49
+ });
50
+ return;
51
+ }
52
+ info(`Already up to date (v${CURRENT_VERSION})`);
53
+ return;
54
+ }
55
+ if (opts.check) {
56
+ info(`Update available: v${CURRENT_VERSION} → ${chalk.green("v" + latest)}`);
57
+ info(chalk.dim(`Run \`lizard upgrade\` to install`));
58
+ return;
59
+ }
60
+ info(`Upgrading v${CURRENT_VERSION} → ${chalk.green("v" + latest)}...`);
61
+ try {
62
+ await selfUpdate((msg) => info(chalk.dim(msg)));
63
+ if (isJSONMode()) {
64
+ printJSON({
65
+ previousVersion: CURRENT_VERSION,
66
+ latestVersion: latest,
67
+ upgraded: true,
68
+ });
69
+ }
70
+ else {
71
+ success(`Upgraded to v${latest}`);
72
+ }
73
+ }
74
+ catch (e) {
75
+ throw new Error(`Upgrade failed: ${e.message}`);
76
+ }
77
+ });
78
+ }
79
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,40 @@
1
1
  import chalk from "chalk";
2
2
  import { api } from "../lib/api.js";
3
+ import { getProjectLink } from "../lib/config.js";
3
4
  import { isJSONMode, printJSON } from "../lib/format.js";
4
5
  export function registerWhoami(program) {
5
6
  program
6
7
  .command("whoami")
7
- .description("Show current user")
8
+ .description("Show current user, active workspace, and linked project")
8
9
  .action(async () => {
9
10
  const user = await api.get("/api/auth/me");
11
+ const link = getProjectLink();
12
+ const project = link
13
+ ? {
14
+ id: link.projectId,
15
+ name: link.projectName,
16
+ workspaceId: link.workspaceId ?? null,
17
+ workspaceName: link.workspaceName ?? null,
18
+ }
19
+ : null;
10
20
  if (isJSONMode()) {
11
- printJSON(user);
21
+ printJSON({ ...user, project });
22
+ return;
23
+ }
24
+ console.log(chalk.bold(user.username));
25
+ if (user.hasGithubApp) {
26
+ console.log(chalk.dim("GitHub App: connected"));
27
+ }
28
+ if (user.activeWorkspaceName) {
29
+ console.log(chalk.dim("Workspace: ") + user.activeWorkspaceName);
30
+ }
31
+ if (project) {
32
+ const label = project.name || project.id;
33
+ const wsTag = project.workspaceName ? chalk.dim(` (${project.workspaceName})`) : "";
34
+ console.log(chalk.dim("Project: ") + label + wsTag + chalk.dim(" (linked here)"));
12
35
  }
13
36
  else {
14
- console.log(chalk.bold(user.username));
15
- if (user.hasGithubApp) {
16
- console.log(chalk.dim("GitHub App: connected"));
17
- }
37
+ console.log(chalk.dim("Project: none — run `lizard init` in a project directory"));
18
38
  }
19
39
  });
20
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAKvB,cAAc,CAAC,CAAC;QAEnB,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAQvB,cAAc,CAAC,CAAC;QAEnB,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI;YAClB,CAAC,CAAC;gBACE,EAAE,EAAE,IAAI,CAAC,SAAS;gBAClB,IAAI,EAAE,IAAI,CAAC,WAAW;gBACtB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;gBACrC,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI;aAC1C;YACH,CAAC,CAAC,IAAI,CAAC;QAET,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACpF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,0DAA0D,CAAC,CACtE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * `lizard workspace` — workspace info.
4
+ *
5
+ * Member management (invite/remove/rename) intentionally lives in the
6
+ * dashboard, not here, to keep CLI surface narrow (Railway model).
7
+ */
8
+ export declare function registerWorkspace(program: Command): void;
@@ -0,0 +1,36 @@
1
+ import chalk from "chalk";
2
+ import { fetchWorkspaces } from "../lib/picker.js";
3
+ import { isJSONMode, printJSON, table } from "../lib/format.js";
4
+ /**
5
+ * `lizard workspace` — workspace info.
6
+ *
7
+ * Member management (invite/remove/rename) intentionally lives in the
8
+ * dashboard, not here, to keep CLI surface narrow (Railway model).
9
+ */
10
+ export function registerWorkspace(program) {
11
+ const ws = program
12
+ .command("workspace")
13
+ .description("Workspace info");
14
+ ws.command("list")
15
+ .alias("ls")
16
+ .description("List workspaces you belong to")
17
+ .action(async () => {
18
+ const list = await fetchWorkspaces();
19
+ if (isJSONMode()) {
20
+ printJSON(list);
21
+ return;
22
+ }
23
+ if (list.length === 0) {
24
+ console.log("No workspaces. The backend should always return a personal workspace.");
25
+ return;
26
+ }
27
+ table(["Name", "Slug", "Role", "Projects", "Personal"], list.map((w) => [
28
+ w.name,
29
+ w.slug,
30
+ w.role,
31
+ String(w.projectCount ?? 0),
32
+ w.isPersonal ? chalk.green("✓") : "",
33
+ ]));
34
+ });
35
+ }
36
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,EAAE,GAAG,OAAO;SACf,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAEjC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SACf,KAAK,CAAC,IAAI,CAAC;SACX,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;QAErC,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;YACrF,OAAO;QACT,CAAC;QAED,KAAK,CACH,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,EAChD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACd,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI;YACN,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;YAC3B,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;SACrC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}