@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,14 +1,54 @@
1
1
  import chalk from "chalk";
2
2
  import ora from "ora";
3
- import { api, streamSSE } from "../lib/api.js";
4
- import { success, info, error, isJSONMode, printJSON } from "../lib/format.js";
3
+ import * as p from "@clack/prompts";
4
+ import { api, streamSSE, withScope } from "../lib/api.js";
5
+ import { resolveProjectScope, resolveService } from "../lib/resolve.js";
6
+ import { success, info, error, isJSONMode, printJSON, isTTY } from "../lib/format.js";
5
7
  export function registerRedeploy(program) {
6
8
  program
7
9
  .command("redeploy")
8
- .argument("<id>", "Service ID to redeploy")
9
- .description("Redeploy a service from latest build with current secrets")
10
+ .argument("[nameOrId]", "App name or ID to redeploy")
11
+ .description("Trigger a fresh build (latest commit / last upload) with current vars")
10
12
  .option("--detach", "Run in background")
11
- .action(async (id, opts) => {
13
+ .option("-s, --service <name>", "App name or ID (alias for positional)")
14
+ .option("-p, --project <id>", "Project name, slug, or ID")
15
+ .action(async (nameOrId, opts) => {
16
+ const ref = nameOrId || opts.service;
17
+ let id;
18
+ if (ref) {
19
+ const { projectId } = await resolveProjectScope(opts.project);
20
+ const resolved = await resolveService(projectId, ref);
21
+ if (resolved.kind !== "app") {
22
+ throw new Error(`"${ref}" is not an app`);
23
+ }
24
+ id = resolved.id;
25
+ }
26
+ else {
27
+ if (!isTTY())
28
+ throw new Error("Provide an app name or ID, or run interactively");
29
+ const { projectId, scope } = await resolveProjectScope(opts.project);
30
+ const data = await api.get(withScope(`/api/projects/${projectId}/services`, scope));
31
+ const apps = data.apps || [];
32
+ if (apps.length === 0) {
33
+ throw new Error("No apps in project. Create one with `lizard up` or `lizard add`.");
34
+ }
35
+ if (apps.length === 1) {
36
+ id = apps[0].id;
37
+ }
38
+ else {
39
+ const selected = await p.select({
40
+ message: "Select app to redeploy",
41
+ options: apps.map((a) => ({
42
+ value: a.id,
43
+ label: a.name || a.id,
44
+ hint: a.status,
45
+ })),
46
+ });
47
+ if (p.isCancel(selected))
48
+ process.exit(5);
49
+ id = selected;
50
+ }
51
+ }
12
52
  const spinner = ora("Starting redeploy...").start();
13
53
  await api.post(`/api/apps/${id}/redeploy`);
14
54
  spinner.stop();
@@ -18,11 +58,10 @@ export function registerRedeploy(program) {
18
58
  }
19
59
  else {
20
60
  success("Redeploy started");
21
- info(chalk.dim(` Check status: lizard deploy-status ${id}`));
61
+ info(chalk.dim(` Check status: lizard deploy status ${id}`));
22
62
  }
23
63
  return;
24
64
  }
25
- // Stream build logs if not detached
26
65
  info("Redeploying...");
27
66
  // Poll for build
28
67
  let buildId = null;
@@ -49,7 +88,8 @@ export function registerRedeploy(program) {
49
88
  }
50
89
  try {
51
90
  const parsed = JSON.parse(data);
52
- process.stdout.write((parsed.line || data) + "\n");
91
+ const line = typeof parsed === "string" ? parsed : (parsed.line ?? data);
92
+ process.stdout.write(line + "\n");
53
93
  }
54
94
  catch {
55
95
  process.stdout.write(data + "\n");
@@ -1 +1 @@
1
- {"version":3,"file":"redeploy.js","sourceRoot":"","sources":["../../src/commands/redeploy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"redeploy.js","sourceRoot":"","sources":["../../src/commands/redeploy.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,8 @@
1
1
  import { api } from "../lib/api.js";
2
2
  import { isJSONMode, printJSON, table } from "../lib/format.js";
3
3
  export function registerRegions(program) {
4
- const region = program
5
- .command("region")
6
- .description("Region management");
7
- region
8
- .command("list")
4
+ program
5
+ .command("regions")
9
6
  .description("List available regions")
10
7
  .action(async () => {
11
8
  const regions = await api.get("/api/regions");
@@ -1 +1 @@
1
- {"version":3,"file":"regions.js","sourceRoot":"","sources":["../../src/commands/regions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAShE,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mBAAmB,CAAC,CAAC;IAEpC,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,GAAG,CAAW,cAAc,CAAC,CAAC;QAExD,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,SAAS,CAAC,OAAO,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,KAAK,CACH,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAC7C,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"regions.js","sourceRoot":"","sources":["../../src/commands/regions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAShE,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,GAAG,CAAW,cAAc,CAAC,CAAC;QAExD,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,SAAS,CAAC,OAAO,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,KAAK,CACH,CAAC,MAAM,EAAE,MAAM,CAAC,EAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAC7C,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,20 +1,94 @@
1
+ import chalk from "chalk";
1
2
  import ora from "ora";
2
- import { api } from "../lib/api.js";
3
- import { success, isJSONMode, printJSON } from "../lib/format.js";
3
+ import * as p from "@clack/prompts";
4
+ import { api, withScope } from "../lib/api.js";
5
+ import { resolveProjectScope, resolveService } from "../lib/resolve.js";
6
+ import { success, info, error, isJSONMode, printJSON, isTTY } from "../lib/format.js";
4
7
  export function registerRestart(program) {
5
8
  program
6
9
  .command("restart")
7
- .argument("<id>", "Service ID to restart")
8
- .description("Restart a service")
9
- .action(async (id) => {
10
- const spinner = ora("Restarting...").start();
11
- await api.post(`/api/apps/${id}/restart`);
10
+ .argument("[nameOrId]", "App name or ID to restart")
11
+ .description("Restart an app")
12
+ .option("--detach", "Run in background")
13
+ .option("-s, --service <name>", "App name or ID (alias for positional)")
14
+ .option("-p, --project <id>", "Project name, slug, or ID")
15
+ .action(async (nameOrId, opts) => {
16
+ const ref = nameOrId || opts.service;
17
+ let id;
18
+ if (ref) {
19
+ const { projectId } = await resolveProjectScope(opts.project);
20
+ const resolved = await resolveService(projectId, ref);
21
+ if (resolved.kind !== "app") {
22
+ throw new Error(`"${ref}" is not an app`);
23
+ }
24
+ id = resolved.id;
25
+ }
26
+ else {
27
+ if (!isTTY())
28
+ throw new Error("Provide an app name or ID, or run interactively");
29
+ const { projectId, scope } = await resolveProjectScope(opts.project);
30
+ const data = await api.get(withScope(`/api/projects/${projectId}/services`, scope));
31
+ const apps = data.apps || [];
32
+ if (apps.length === 0)
33
+ throw new Error("No apps in project");
34
+ if (apps.length === 1) {
35
+ id = apps[0].id;
36
+ }
37
+ else {
38
+ const selected = await p.select({
39
+ message: "Select app to restart",
40
+ options: apps.map((a) => ({
41
+ value: a.id,
42
+ label: a.name || a.id,
43
+ hint: a.status,
44
+ })),
45
+ });
46
+ if (p.isCancel(selected))
47
+ process.exit(5);
48
+ id = selected;
49
+ }
50
+ }
51
+ const spinner = ora("Starting restart...").start();
52
+ await api.post(`/api/apps/${id}/restart`, undefined, { "X-Deploy-Source": "cli" });
12
53
  spinner.stop();
13
- if (isJSONMode()) {
14
- printJSON({ id, status: "restarting" });
54
+ if (opts.detach || isJSONMode()) {
55
+ if (isJSONMode()) {
56
+ printJSON({ id, status: "restarting" });
57
+ }
58
+ else {
59
+ success("Restart started");
60
+ info(chalk.dim(` Check status: lizard ps ${id}`));
61
+ }
62
+ return;
63
+ }
64
+ const waitSpinner = ora("Restarting...").start();
65
+ let finalStatus;
66
+ let domain;
67
+ for (let i = 0; i < 60; i++) {
68
+ await new Promise((r) => setTimeout(r, 2000));
69
+ try {
70
+ const app = await api.get(`/api/apps/${id}`);
71
+ domain = app.domain;
72
+ if (app.status === "running") {
73
+ finalStatus = "running";
74
+ break;
75
+ }
76
+ if (app.status === "failed" || app.status === "error") {
77
+ finalStatus = app.status;
78
+ break;
79
+ }
80
+ }
81
+ catch { }
82
+ }
83
+ waitSpinner.stop();
84
+ if (finalStatus === "running") {
85
+ success(`Restarted! ${domain ? chalk.cyan(`https://${domain}`) : ""}`);
86
+ }
87
+ else if (finalStatus) {
88
+ error("Restart failed");
15
89
  }
16
90
  else {
17
- success(`Service ${id} restarting`);
91
+ info(chalk.dim("Still restarting — check status with: lizard ps " + id));
18
92
  }
19
93
  });
20
94
  }
@@ -1 +1 @@
1
- {"version":3,"file":"restart.js","sourceRoot":"","sources":["../../src/commands/restart.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;SACzC,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,CAAC;QAE7C,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAE1C,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"restart.js","sourceRoot":"","sources":["../../src/commands/restart.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,11 @@
1
1
  import { Command } from "commander";
2
+ /**
3
+ * `lizard run <command...>` — run a local command with platform secrets in
4
+ * the environment. Project-scope secrets are loaded first, then the linked
5
+ * (or `-s <service>`) service overrides on key collisions, mirroring the
6
+ * order the platform applies them on the server.
7
+ *
8
+ * Pass `-s <service>` to switch service without touching the link.
9
+ * Pass `--no-service` to load only project-scope secrets.
10
+ */
2
11
  export declare function registerRun(program: Command): void;
@@ -1,33 +1,72 @@
1
- import { execSync } from "node:child_process";
2
- import { api } from "../lib/api.js";
3
- import { resolveProjectId } from "../lib/config.js";
1
+ import { spawnSync } from "node:child_process";
2
+ import { api, withScope } from "../lib/api.js";
3
+ import { getProjectLink } from "../lib/config.js";
4
+ import { resolveProjectScope, resolveService } from "../lib/resolve.js";
5
+ /**
6
+ * `lizard run <command...>` — run a local command with platform secrets in
7
+ * the environment. Project-scope secrets are loaded first, then the linked
8
+ * (or `-s <service>`) service overrides on key collisions, mirroring the
9
+ * order the platform applies them on the server.
10
+ *
11
+ * Pass `-s <service>` to switch service without touching the link.
12
+ * Pass `--no-service` to load only project-scope secrets.
13
+ */
4
14
  export function registerRun(program) {
5
15
  program
6
16
  .command("run")
7
- .argument("<command...>", "Command to run with project env vars")
8
- .description("Run a command with project secrets as env vars")
17
+ .argument("<command...>", "Command to run with platform env vars")
18
+ .description("Run a command with project + service secrets injected")
19
+ .option("-s, --service <name>", "Service to pull secrets from (defaults to linked)")
20
+ .option("--no-service", "Skip service-scope secrets, project only")
21
+ .option("-p, --project <id>", "Project ID (defaults to linked)")
9
22
  .allowUnknownOption()
10
- .action(async (args) => {
11
- const projectId = resolveProjectId(program.opts().project);
12
- // Fetch secrets
13
- const secrets = await api.get(`/api/projects/${projectId}/secrets`);
14
- // Build env
23
+ .action(async (args, opts) => {
24
+ const { projectId, scope } = await resolveProjectScope(opts.project);
15
25
  const env = { ...process.env };
16
- for (const s of secrets) {
26
+ // 1. project secrets
27
+ const projectSecrets = await api.get(withScope(`/api/projects/${projectId}/secrets`, scope));
28
+ for (const s of projectSecrets)
17
29
  env[s.key] = s.value;
30
+ // 2. service / addon secrets (override project)
31
+ if (opts.service !== false) {
32
+ const serviceRef = typeof opts.service === "string" ? opts.service : getProjectLink()?.serviceId;
33
+ if (serviceRef) {
34
+ const svc = await resolveService(projectId, serviceRef);
35
+ const path = svc.kind === "app"
36
+ ? withScope(`/api/apps/${svc.id}/secrets`, scope)
37
+ : withScope(`/api/projects/${projectId}/addons/${svc.id}/secrets`, scope);
38
+ const serviceSecrets = await api.get(path).catch((err) => {
39
+ if (err?.status === 404) {
40
+ if (svc.kind === "addon") {
41
+ console.warn(`warning: addon "${svc.name}" exposes no secrets endpoint yet ` +
42
+ `(needs GET ${path}). Falling back to project-only env.`);
43
+ }
44
+ return [];
45
+ }
46
+ throw err;
47
+ });
48
+ for (const s of serviceSecrets)
49
+ env[s.key] = s.value;
50
+ }
18
51
  }
19
- // Run command
20
- const cmd = args.join(" ");
21
- try {
22
- execSync(cmd, {
23
- env,
24
- stdio: "inherit",
25
- shell: process.env.SHELL || "/bin/sh",
26
- });
27
- }
28
- catch (err) {
29
- process.exit(err.status || 1);
52
+ // argv-style spawn — no shell, so quoting / pipes / `;` in user-supplied
53
+ // args are passed verbatim to the target program instead of being parsed
54
+ // by /bin/sh. If the user wants a shell, they can invoke one explicitly:
55
+ // `lizard run sh -c 'foo | bar'`.
56
+ const result = spawnSync(args[0], args.slice(1), {
57
+ env,
58
+ stdio: "inherit",
59
+ });
60
+ if (result.error) {
61
+ const code = result.error.code;
62
+ if (code === "ENOENT") {
63
+ console.error(`lizard run: command not found: ${args[0]}`);
64
+ process.exit(127);
65
+ }
66
+ console.error(`lizard run: ${result.error.message}`);
67
+ process.exit(1);
30
68
  }
69
+ process.exit(result.status ?? 1);
31
70
  });
32
71
  }
33
72
  //# sourceMappingURL=run.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAOpD,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,cAAc,EAAE,sCAAsC,CAAC;SAChE,WAAW,CAAC,gDAAgD,CAAC;SAC7D,kBAAkB,EAAE;SACpB,MAAM,CAAC,KAAK,EAAE,IAAc,EAAE,EAAE;QAC/B,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;QAE3D,gBAAgB;QAChB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,GAAG,CAC3B,iBAAiB,SAAS,UAAU,CACrC,CAAC;QAEF,YAAY;QACZ,MAAM,GAAG,GAA2B,EAAE,GAAG,OAAO,CAAC,GAA6B,EAAE,CAAC;QACjF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QACvB,CAAC;QAED,cAAc;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC;YACH,QAAQ,CAAC,GAAG,EAAE;gBACZ,GAAG;gBACH,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS;aACtC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * `lizard scale` — service scaling.
4
+ * --replicas <n> change replica count (1-10) — apps only
5
+ * --cpu <cores> CPU cap; allowed: 1, 2, 4
6
+ * --memory <mb> memory cap; allowed: 512, 1024, 2048, 4096
7
+ * --storage <mb> data volume size; addons only, grow-only;
8
+ * allowed: 512, 1024, 2048, 4096, 8192, 16384
9
+ */
10
+ export declare function registerScale(program: Command): void;
@@ -0,0 +1,166 @@
1
+ import chalk from "chalk";
2
+ import { api, withScope } from "../lib/api.js";
3
+ import { getActiveServiceWithKind, resolveProjectScope } from "../lib/resolve.js";
4
+ import { success, isJSONMode, printJSON } from "../lib/format.js";
5
+ // Discrete tiers the dashboard slider exposes (CPU_OPTIONS / MEMORY_OPTIONS in
6
+ // lizard-client). The API and node-agent accept other values, but anything off
7
+ // the tier list lands in DB as a string the UI slider can't snap to — the row
8
+ // shows raw "3000m" and the slider falls to index 0. Mirror the UI tiers so the
9
+ // CLI and dashboard stay in lockstep.
10
+ const ALLOWED_CPU_CORES = [1, 2, 4];
11
+ const ALLOWED_MEMORY_MB = [512, 1024, 2048, 4096];
12
+ // Storage tiers match the addon size selector on the dashboard. Addon-only —
13
+ // apps don't have a resizable data volume on this path.
14
+ const ALLOWED_STORAGE_MB = [512, 1024, 2048, 4096, 8192, 16384];
15
+ /**
16
+ * `lizard scale` — service scaling.
17
+ * --replicas <n> change replica count (1-10) — apps only
18
+ * --cpu <cores> CPU cap; allowed: 1, 2, 4
19
+ * --memory <mb> memory cap; allowed: 512, 1024, 2048, 4096
20
+ * --storage <mb> data volume size; addons only, grow-only;
21
+ * allowed: 512, 1024, 2048, 4096, 8192, 16384
22
+ */
23
+ export function registerScale(program) {
24
+ program
25
+ .command("scale")
26
+ .description("Scale a service (replicas / CPU / memory / storage)")
27
+ .argument("[service]", "Service name or ID (defaults to linked)")
28
+ .option("-s, --service <name>", "Service name or ID")
29
+ .option("-p, --project <id>", "Project name, slug, or ID")
30
+ .option("--replicas <n>", "Number of replicas (1-10), apps only", parseIntOption)
31
+ .option("--cpu <cores>", `CPU cap, whole cores (allowed: ${ALLOWED_CPU_CORES.join(", ")})`, parseIntOption)
32
+ .option("--memory <mb>", `Memory cap in MB (allowed: ${ALLOWED_MEMORY_MB.join(", ")})`, parseIntOption)
33
+ .option("--storage <mb>", `Data volume size in MB, addons only, grow-only (allowed: ${ALLOWED_STORAGE_MB.join(", ")})`, parseIntOption)
34
+ .action(async (serviceArg, opts, _cmd) => {
35
+ const { projectId, scope } = await resolveProjectScope(opts.project);
36
+ const service = await getActiveServiceWithKind(serviceArg || opts.service, projectId);
37
+ if (opts.replicas === undefined &&
38
+ opts.cpu === undefined &&
39
+ opts.memory === undefined &&
40
+ opts.storage === undefined) {
41
+ throw new Error("Pass at least one of: --replicas, --cpu, --memory, --storage.");
42
+ }
43
+ if (opts.replicas !== undefined && (opts.replicas < 1 || opts.replicas > 10)) {
44
+ throw new Error(`--replicas must be between 1 and 10 (got ${opts.replicas}).`);
45
+ }
46
+ if (opts.cpu !== undefined && !ALLOWED_CPU_CORES.includes(opts.cpu)) {
47
+ throw new Error(`--cpu ${opts.cpu} not supported. Allowed: ${ALLOWED_CPU_CORES.join(", ")} cores.`);
48
+ }
49
+ if (opts.memory !== undefined && !ALLOWED_MEMORY_MB.includes(opts.memory)) {
50
+ throw new Error(`--memory ${opts.memory} not supported. Allowed: ${ALLOWED_MEMORY_MB.join(", ")} MB.`);
51
+ }
52
+ if (opts.storage !== undefined && !ALLOWED_STORAGE_MB.includes(opts.storage)) {
53
+ throw new Error(`--storage ${opts.storage} not supported. Allowed: ${ALLOWED_STORAGE_MB.join(", ")} MB.`);
54
+ }
55
+ if (service.kind === "addon") {
56
+ if (opts.replicas !== undefined) {
57
+ throw new Error("Addons run as a single VM and don't support --replicas.");
58
+ }
59
+ return scaleAddon(projectId, scope, service, opts.cpu, opts.memory, opts.storage);
60
+ }
61
+ if (opts.storage !== undefined) {
62
+ throw new Error("--storage is only supported for addons (postgres, redis, mongo, mysql).");
63
+ }
64
+ // App path — replicas go to /scale; cpu/memory go through config:apply
65
+ // (PATCH /api/apps/:id was retired with 410 in favour of config:apply).
66
+ const calls = [];
67
+ if (opts.replicas !== undefined) {
68
+ calls.push(api.patch(`/api/apps/${service.id}/scale`, { replicas: opts.replicas }));
69
+ }
70
+ let configApplyResult;
71
+ if (opts.cpu !== undefined || opts.memory !== undefined) {
72
+ const serviceEntry = { id: service.id, name: service.name };
73
+ if (opts.cpu !== undefined)
74
+ serviceEntry.cpuLimit = `${opts.cpu * 1000}m`;
75
+ if (opts.memory !== undefined)
76
+ serviceEntry.memoryLimit = mbToK8s(opts.memory);
77
+ calls.push(api.post(withScope(`/api/projects/${projectId}/config:apply`, scope), { services: [serviceEntry] }).then((r) => { configApplyResult = r; return r; }));
78
+ }
79
+ await Promise.all(calls);
80
+ if (configApplyResult)
81
+ warnSideEffects(configApplyResult);
82
+ if (isJSONMode()) {
83
+ printJSON({
84
+ id: service.id,
85
+ ...(opts.replicas !== undefined ? { replicas: opts.replicas } : {}),
86
+ ...(opts.cpu !== undefined ? { cpuLimit: `${opts.cpu * 1000}m` } : {}),
87
+ ...(opts.memory !== undefined ? { memoryLimit: mbToK8s(opts.memory) } : {}),
88
+ });
89
+ }
90
+ else {
91
+ success(`Scaled ${chalk.bold(service.name)}`);
92
+ }
93
+ });
94
+ }
95
+ /** Warn the user about any deferred side-effect failures from a config:apply response. */
96
+ function warnSideEffects(result) {
97
+ if (!result.sideEffectFailures?.length)
98
+ return;
99
+ for (const f of result.sideEffectFailures) {
100
+ process.stderr.write(chalk.yellow(`⚠ Side effect failed (${f.op}): ${f.error}\n`));
101
+ }
102
+ }
103
+ async function scaleAddon(projectId, scope, service, cpu, memory, storageMb) {
104
+ // Only pre-fetch addon list when --storage is passed — needed for the
105
+ // grow-only check. cpu/memory go through config:apply which accepts partial
106
+ // deltas, so no pre-fetch is needed for those axes.
107
+ if (storageMb !== undefined) {
108
+ const addons = await api.get(withScope(`/api/projects/${projectId}/addons`, scope));
109
+ const current = addons.find((a) => a.id === service.id);
110
+ if (!current)
111
+ throw new Error(`Addon "${service.name}" not found in project.`);
112
+ const currentMb = current.config?.storageSize ? parseStorageToMb(current.config.storageSize) : 0;
113
+ if (currentMb > 0 && storageMb <= currentMb) {
114
+ throw new Error(`--storage ${storageMb} MB is not larger than current ${currentMb} MB. Storage is grow-only.`);
115
+ }
116
+ }
117
+ // Build the config:apply addon patch. All three axes are optional and can
118
+ // be combined freely — the server writes only the fields present.
119
+ const addonPatch = { id: service.id };
120
+ if (cpu !== undefined || memory !== undefined) {
121
+ const limits = {};
122
+ if (cpu !== undefined)
123
+ limits.vcpu = cpu;
124
+ if (memory !== undefined)
125
+ limits.memoryMb = memory;
126
+ addonPatch.limits = limits;
127
+ }
128
+ if (storageMb !== undefined) {
129
+ addonPatch.storageSize = mbToK8s(storageMb);
130
+ }
131
+ const result = await api.post(withScope(`/api/projects/${projectId}/config:apply`, scope), { addons: [addonPatch] });
132
+ warnSideEffects(result);
133
+ if (isJSONMode()) {
134
+ printJSON({
135
+ id: service.id,
136
+ kind: "addon",
137
+ ...(cpu !== undefined ? { vcpu: cpu } : {}),
138
+ ...(memory !== undefined ? { memoryMb: memory } : {}),
139
+ ...(storageMb !== undefined ? { storageSize: mbToK8s(storageMb) } : {}),
140
+ });
141
+ }
142
+ else {
143
+ success(`Scaled ${chalk.bold(service.name)} (addon)`);
144
+ }
145
+ }
146
+ /** 1024 → "1Gi", 512 → "512Mi". Matches the dashboard size tiers (memory + addon storage). */
147
+ function mbToK8s(mb) {
148
+ return mb % 1024 === 0 ? `${mb / 1024}Gi` : `${mb}Mi`;
149
+ }
150
+ /** Inverse of mbToK8s for grow-only comparison; supports Gi/Mi/Ti. */
151
+ function parseStorageToMb(size) {
152
+ if (size.endsWith("Gi"))
153
+ return parseFloat(size) * 1024;
154
+ if (size.endsWith("Mi"))
155
+ return parseFloat(size);
156
+ if (size.endsWith("Ti"))
157
+ return parseFloat(size) * 1024 * 1024;
158
+ return 0;
159
+ }
160
+ function parseIntOption(v) {
161
+ const n = parseInt(v, 10);
162
+ if (Number.isNaN(n))
163
+ throw new Error(`Invalid number: ${v}`);
164
+ return n;
165
+ }
166
+ //# sourceMappingURL=scale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scale.js","sourceRoot":"","sources":["../../src/commands/scale.ts"],"names":[],"mappings":"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"}