@lizard-build/cli 0.1.0 → 0.3.30

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 (184) hide show
  1. package/.github/workflows/release.yml +90 -0
  2. package/AGENTS.md +113 -0
  3. package/README.md +41 -0
  4. package/dist/commands/add.js +318 -45
  5. package/dist/commands/add.js.map +1 -1
  6. package/dist/commands/config.d.ts +2 -0
  7. package/dist/commands/config.js +68 -0
  8. package/dist/commands/config.js.map +1 -0
  9. package/dist/commands/docs.d.ts +2 -0
  10. package/dist/commands/docs.js +13 -0
  11. package/dist/commands/docs.js.map +1 -0
  12. package/dist/commands/domain.d.ts +9 -0
  13. package/dist/commands/domain.js +195 -0
  14. package/dist/commands/domain.js.map +1 -0
  15. package/dist/commands/git.js +175 -36
  16. package/dist/commands/git.js.map +1 -1
  17. package/dist/commands/init.d.ts +24 -0
  18. package/dist/commands/init.js +128 -86
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/link.d.ts +7 -0
  21. package/dist/commands/link.js +104 -33
  22. package/dist/commands/link.js.map +1 -1
  23. package/dist/commands/login.js +4 -3
  24. package/dist/commands/login.js.map +1 -1
  25. package/dist/commands/logs.js +223 -30
  26. package/dist/commands/logs.js.map +1 -1
  27. package/dist/commands/open.js +3 -2
  28. package/dist/commands/open.js.map +1 -1
  29. package/dist/commands/port.d.ts +7 -0
  30. package/dist/commands/port.js +49 -0
  31. package/dist/commands/port.js.map +1 -0
  32. package/dist/commands/projects.js +36 -6
  33. package/dist/commands/projects.js.map +1 -1
  34. package/dist/commands/ps.js +32 -39
  35. package/dist/commands/ps.js.map +1 -1
  36. package/dist/commands/redeploy.js +48 -8
  37. package/dist/commands/redeploy.js.map +1 -1
  38. package/dist/commands/regions.js +2 -5
  39. package/dist/commands/regions.js.map +1 -1
  40. package/dist/commands/restart.js +84 -10
  41. package/dist/commands/restart.js.map +1 -1
  42. package/dist/commands/run.d.ts +9 -0
  43. package/dist/commands/run.js +61 -22
  44. package/dist/commands/run.js.map +1 -1
  45. package/dist/commands/scale.d.ts +10 -0
  46. package/dist/commands/scale.js +166 -0
  47. package/dist/commands/scale.js.map +1 -0
  48. package/dist/commands/secrets.js +200 -89
  49. package/dist/commands/secrets.js.map +1 -1
  50. package/dist/commands/service-set.d.ts +49 -0
  51. package/dist/commands/service-set.js +552 -0
  52. package/dist/commands/service-set.js.map +1 -0
  53. package/dist/commands/service-show.d.ts +11 -0
  54. package/dist/commands/service-show.js +44 -0
  55. package/dist/commands/service-show.js.map +1 -0
  56. package/dist/commands/service.d.ts +8 -0
  57. package/dist/commands/service.js +262 -0
  58. package/dist/commands/service.js.map +1 -0
  59. package/dist/commands/skill.d.ts +2 -0
  60. package/dist/commands/skill.js +146 -0
  61. package/dist/commands/skill.js.map +1 -0
  62. package/dist/commands/ssh.d.ts +2 -0
  63. package/dist/commands/ssh.js +161 -0
  64. package/dist/commands/ssh.js.map +1 -0
  65. package/dist/commands/status.d.ts +7 -0
  66. package/dist/commands/status.js +49 -38
  67. package/dist/commands/status.js.map +1 -1
  68. package/dist/commands/unlink.d.ts +5 -0
  69. package/dist/commands/unlink.js +18 -0
  70. package/dist/commands/unlink.js.map +1 -0
  71. package/dist/commands/up.d.ts +9 -0
  72. package/dist/commands/up.js +417 -0
  73. package/dist/commands/up.js.map +1 -0
  74. package/dist/commands/upgrade.d.ts +2 -0
  75. package/dist/commands/upgrade.js +79 -0
  76. package/dist/commands/upgrade.js.map +1 -0
  77. package/dist/commands/whoami.js +26 -6
  78. package/dist/commands/whoami.js.map +1 -1
  79. package/dist/commands/workspace.d.ts +8 -0
  80. package/dist/commands/workspace.js +36 -0
  81. package/dist/commands/workspace.js.map +1 -0
  82. package/dist/index.js +209 -82
  83. package/dist/index.js.map +1 -1
  84. package/dist/lib/api.d.ts +17 -2
  85. package/dist/lib/api.js +85 -51
  86. package/dist/lib/api.js.map +1 -1
  87. package/dist/lib/auth.d.ts +3 -11
  88. package/dist/lib/auth.js +16 -36
  89. package/dist/lib/auth.js.map +1 -1
  90. package/dist/lib/config.d.ts +36 -15
  91. package/dist/lib/config.js +71 -58
  92. package/dist/lib/config.js.map +1 -1
  93. package/dist/lib/format.d.ts +1 -0
  94. package/dist/lib/format.js +17 -4
  95. package/dist/lib/format.js.map +1 -1
  96. package/dist/lib/name.d.ts +11 -0
  97. package/dist/lib/name.js +26 -0
  98. package/dist/lib/name.js.map +1 -0
  99. package/dist/lib/picker.d.ts +32 -0
  100. package/dist/lib/picker.js +91 -0
  101. package/dist/lib/picker.js.map +1 -0
  102. package/dist/lib/resolve.d.ts +85 -0
  103. package/dist/lib/resolve.js +203 -0
  104. package/dist/lib/resolve.js.map +1 -0
  105. package/dist/lib/updater.d.ts +16 -0
  106. package/dist/lib/updater.js +102 -0
  107. package/dist/lib/updater.js.map +1 -0
  108. package/lizard-wrapper.sh +2 -0
  109. package/package.json +11 -3
  110. package/skill-data/core/SKILL.md +239 -0
  111. package/src/commands/add.ts +388 -56
  112. package/src/commands/config.ts +80 -0
  113. package/src/commands/docs.ts +15 -0
  114. package/src/commands/domain.ts +248 -0
  115. package/src/commands/git.ts +201 -40
  116. package/src/commands/init.ts +149 -100
  117. package/src/commands/link.ts +127 -35
  118. package/src/commands/login.ts +4 -3
  119. package/src/commands/logs.ts +283 -27
  120. package/src/commands/open.ts +3 -2
  121. package/src/commands/port.ts +57 -0
  122. package/src/commands/projects.ts +43 -6
  123. package/src/commands/ps.ts +39 -60
  124. package/src/commands/redeploy.ts +51 -10
  125. package/src/commands/regions.ts +2 -6
  126. package/src/commands/restart.ts +84 -10
  127. package/src/commands/run.ts +68 -24
  128. package/src/commands/scale.ts +216 -0
  129. package/src/commands/secrets.ts +277 -100
  130. package/src/commands/service-set.ts +669 -0
  131. package/src/commands/service-show.ts +52 -0
  132. package/src/commands/service.ts +298 -0
  133. package/src/commands/skill.ts +157 -0
  134. package/src/commands/ssh.ts +176 -0
  135. package/src/commands/status.ts +51 -46
  136. package/src/commands/unlink.ts +17 -0
  137. package/src/commands/up.ts +461 -0
  138. package/src/commands/upgrade.ts +87 -0
  139. package/src/commands/whoami.ts +34 -6
  140. package/src/commands/workspace.ts +44 -0
  141. package/src/index.ts +219 -85
  142. package/src/lib/api.ts +114 -51
  143. package/src/lib/auth.ts +22 -46
  144. package/src/lib/config.ts +100 -65
  145. package/src/lib/format.ts +18 -4
  146. package/src/lib/name.ts +27 -0
  147. package/src/lib/picker.ts +133 -0
  148. package/src/lib/resolve.ts +285 -0
  149. package/src/lib/updater.ts +106 -0
  150. package/test/cli.test.ts +491 -0
  151. package/test/fixtures/hello-app/Dockerfile +5 -0
  152. package/test/fixtures/hello-app/index.js +5 -0
  153. package/test/unit/api.test.ts +66 -0
  154. package/test/unit/config.test.ts +94 -0
  155. package/test/unit/init.test.ts +211 -0
  156. package/test/unit/json.test.ts +208 -0
  157. package/test/unit/picker.test.ts +161 -0
  158. package/test/unit/resolve.test.ts +124 -0
  159. package/test/unit/service-set.test.ts +355 -0
  160. package/vitest.config.ts +10 -0
  161. package/dist/commands/connect.d.ts +0 -2
  162. package/dist/commands/connect.js +0 -117
  163. package/dist/commands/connect.js.map +0 -1
  164. package/dist/commands/context.d.ts +0 -2
  165. package/dist/commands/context.js +0 -71
  166. package/dist/commands/context.js.map +0 -1
  167. package/dist/commands/deploy.d.ts +0 -2
  168. package/dist/commands/deploy.js +0 -120
  169. package/dist/commands/deploy.js.map +0 -1
  170. package/dist/commands/destroy.d.ts +0 -2
  171. package/dist/commands/destroy.js +0 -51
  172. package/dist/commands/destroy.js.map +0 -1
  173. package/dist/commands/update.d.ts +0 -2
  174. package/dist/commands/update.js +0 -41
  175. package/dist/commands/update.js.map +0 -1
  176. package/dist/commands/version.d.ts +0 -2
  177. package/dist/commands/version.js +0 -37
  178. package/dist/commands/version.js.map +0 -1
  179. package/src/commands/connect.ts +0 -145
  180. package/src/commands/context.ts +0 -93
  181. package/src/commands/deploy.ts +0 -153
  182. package/src/commands/destroy.ts +0 -51
  183. package/src/commands/update.ts +0 -44
  184. package/src/commands/version.ts +0 -37
@@ -1,51 +1,62 @@
1
1
  import chalk from "chalk";
2
- import { api } from "../lib/api.js";
3
- import { resolveProjectId, findProjectConfig } from "../lib/config.js";
4
- import { isJSONMode, printJSON, statusColor, table } from "../lib/format.js";
2
+ import { getProjectLink, updateProjectLink } from "../lib/config.js";
3
+ import { lookupProjectWorkspace } from "../lib/resolve.js";
4
+ import { isJSONMode, printJSON, info } from "../lib/format.js";
5
+ /**
6
+ * `lizard status` — print the linked workspace / project / service for
7
+ * the current working directory. Mirrors `railway status`.
8
+ *
9
+ * Lazy-fills workspaceId into the link when missing so legacy configs
10
+ * surface their workspace too.
11
+ */
5
12
  export function registerStatus(program) {
6
13
  program
7
14
  .command("status")
8
- .description("Show project status")
15
+ .description("Show linked workspace, project, and service")
9
16
  .action(async () => {
10
- const projectId = resolveProjectId(program.opts().project);
11
- const config = findProjectConfig();
12
- const [project, services] = await Promise.all([
13
- api.get(`/api/projects/${projectId}`),
14
- api.get(`/api/projects/${projectId}/services`),
15
- ]);
16
- if (isJSONMode()) {
17
- printJSON({ project, services, environment: config?.environment || "production" });
17
+ const link = getProjectLink();
18
+ if (!link) {
19
+ if (isJSONMode()) {
20
+ printJSON({ cwd: process.cwd(), linked: false });
21
+ }
22
+ else {
23
+ info("Not linked. Run `lizard init` to create or link a project.");
24
+ }
18
25
  return;
19
26
  }
20
- console.log(chalk.bold(project.name) + chalk.dim(` (${project.id})`));
21
- if (config?.environment) {
22
- console.log(chalk.dim(`Environment: ${config.environment}`));
27
+ // Backfill workspace info for legacy links (saved before workspaces existed)
28
+ let workspaceName = link.workspaceName;
29
+ if (!link.workspaceId) {
30
+ const fetched = await lookupProjectWorkspace(link.projectId);
31
+ if (fetched?.workspaceId) {
32
+ workspaceName = fetched.workspaceName ?? undefined;
33
+ try {
34
+ updateProjectLink({
35
+ workspaceId: fetched.workspaceId,
36
+ workspaceName,
37
+ });
38
+ }
39
+ catch { }
40
+ }
23
41
  }
24
- console.log();
25
- const allServices = [
26
- ...(services.apps || []).map((a) => ({
27
- name: a.name,
28
- type: "app",
29
- status: a.status,
30
- url: a.domain ? `https://${a.domain}` : "",
31
- })),
32
- ...(services.addons || []).map((a) => ({
33
- name: a.name || a.addonType,
34
- type: a.addonType || "addon",
35
- status: a.status,
36
- url: a.hostname || "",
37
- })),
38
- ];
39
- if (allServices.length === 0) {
40
- console.log(chalk.dim("No services"));
42
+ const out = {
43
+ cwd: process.cwd(),
44
+ linked: true,
45
+ workspace: workspaceName ?? null,
46
+ workspaceId: link.workspaceId ?? null,
47
+ project: link.projectName ?? null,
48
+ projectId: link.projectId,
49
+ service: link.serviceName ?? null,
50
+ serviceId: link.serviceId ?? null,
51
+ };
52
+ if (isJSONMode()) {
53
+ printJSON(out);
41
54
  return;
42
55
  }
43
- table(["Name", "Type", "Status", "URL"], allServices.map((s) => [
44
- s.name,
45
- s.type,
46
- statusColor(s.status),
47
- s.url || chalk.dim("—"),
48
- ]));
56
+ const fmt = (v) => v ?? chalk.dim("—");
57
+ console.log(` ${chalk.dim("Workspace:")} ${fmt(out.workspace)}`);
58
+ console.log(` ${chalk.dim("Project:")} ${chalk.bold(out.project ?? link.projectId)}`);
59
+ console.log(` ${chalk.dim("Service:")} ${out.service ? chalk.bold(out.service) : chalk.dim("(none — `lizard service link`)")}`);
49
60
  });
50
61
  }
51
62
  //# sourceMappingURL=status.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE/D;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,UAAU,EAAE,EAAE,CAAC;gBACjB,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,4DAA4D,CAAC,CAAC;YACrE,CAAC;YACD,OAAO;QACT,CAAC;QAED,6EAA6E;QAC7E,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7D,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;gBACzB,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,SAAS,CAAC;gBACnD,IAAI,CAAC;oBACH,iBAAiB,CAAC;wBAChB,WAAW,EAAE,OAAO,CAAC,WAAW;wBAChC,aAAa;qBACd,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG;YACV,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,aAAa,IAAI,IAAI;YAChC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;YACrC,OAAO,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;YACjC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;YACjC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;SAClC,CAAC;QAEF,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,SAAS,CAAC,GAAG,CAAC,CAAC;YACf,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,CAAC,CAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEtD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,OACxB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,CACpF,EAAE,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * `lizard unlink` — drops the cwd↔project mapping.
4
+ */
5
+ export declare function registerUnlink(program: Command): void;
@@ -0,0 +1,18 @@
1
+ import { clearProjectLink } from "../lib/config.js";
2
+ import { isJSONMode, printJSON, success } from "../lib/format.js";
3
+ /**
4
+ * `lizard unlink` — drops the cwd↔project mapping.
5
+ */
6
+ export function registerUnlink(program) {
7
+ program
8
+ .command("unlink")
9
+ .description("Disassociate the current directory from any project")
10
+ .action(() => {
11
+ clearProjectLink();
12
+ if (isJSONMode())
13
+ printJSON({ status: "unlinked" });
14
+ else
15
+ success("Directory unlinked");
16
+ });
17
+ }
18
+ //# sourceMappingURL=unlink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unlink.js","sourceRoot":"","sources":["../../src/commands/unlink.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAElE;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,GAAG,EAAE;QACX,gBAAgB,EAAE,CAAC;QACnB,IAAI,UAAU,EAAE;YAAE,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;;YAC/C,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Builds the `up` command:
4
+ * - upload local code (or `[path]`) as a tarball
5
+ * - target a service via --service / linked / first-in-project
6
+ * - --ci streams build logs only and exits when build finishes
7
+ * - --detach returns immediately after upload
8
+ */
9
+ export declare function registerUp(program: Command): void;
@@ -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;