@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.
- package/.github/workflows/release.yml +90 -0
- package/AGENTS.md +113 -0
- package/README.md +41 -0
- package/dist/commands/add.js +318 -45
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.js +68 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/docs.d.ts +2 -0
- package/dist/commands/docs.js +13 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/domain.d.ts +9 -0
- package/dist/commands/domain.js +195 -0
- package/dist/commands/domain.js.map +1 -0
- package/dist/commands/git.js +175 -36
- package/dist/commands/git.js.map +1 -1
- package/dist/commands/init.d.ts +24 -0
- package/dist/commands/init.js +128 -86
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/link.d.ts +7 -0
- package/dist/commands/link.js +104 -33
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/login.js +4 -3
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logs.js +223 -30
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/open.js +3 -2
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/port.d.ts +7 -0
- package/dist/commands/port.js +49 -0
- package/dist/commands/port.js.map +1 -0
- package/dist/commands/projects.js +36 -6
- package/dist/commands/projects.js.map +1 -1
- package/dist/commands/ps.js +32 -39
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/redeploy.js +48 -8
- package/dist/commands/redeploy.js.map +1 -1
- package/dist/commands/regions.js +2 -5
- package/dist/commands/regions.js.map +1 -1
- package/dist/commands/restart.js +84 -10
- package/dist/commands/restart.js.map +1 -1
- package/dist/commands/run.d.ts +9 -0
- package/dist/commands/run.js +61 -22
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/scale.d.ts +10 -0
- package/dist/commands/scale.js +166 -0
- package/dist/commands/scale.js.map +1 -0
- package/dist/commands/secrets.js +200 -89
- package/dist/commands/secrets.js.map +1 -1
- package/dist/commands/service-set.d.ts +49 -0
- package/dist/commands/service-set.js +552 -0
- package/dist/commands/service-set.js.map +1 -0
- package/dist/commands/service-show.d.ts +11 -0
- package/dist/commands/service-show.js +44 -0
- package/dist/commands/service-show.js.map +1 -0
- package/dist/commands/service.d.ts +8 -0
- package/dist/commands/service.js +262 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/skill.d.ts +2 -0
- package/dist/commands/skill.js +146 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/ssh.d.ts +2 -0
- package/dist/commands/ssh.js +161 -0
- package/dist/commands/ssh.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.js +49 -38
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/unlink.d.ts +5 -0
- package/dist/commands/unlink.js +18 -0
- package/dist/commands/unlink.js.map +1 -0
- package/dist/commands/up.d.ts +9 -0
- package/dist/commands/up.js +417 -0
- package/dist/commands/up.js.map +1 -0
- package/dist/commands/upgrade.d.ts +2 -0
- package/dist/commands/upgrade.js +79 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/whoami.js +26 -6
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/workspace.d.ts +8 -0
- package/dist/commands/workspace.js +36 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/index.js +209 -82
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +17 -2
- package/dist/lib/api.js +85 -51
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/auth.d.ts +3 -11
- package/dist/lib/auth.js +16 -36
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/config.d.ts +36 -15
- package/dist/lib/config.js +71 -58
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/format.d.ts +1 -0
- package/dist/lib/format.js +17 -4
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/name.d.ts +11 -0
- package/dist/lib/name.js +26 -0
- package/dist/lib/name.js.map +1 -0
- package/dist/lib/picker.d.ts +32 -0
- package/dist/lib/picker.js +91 -0
- package/dist/lib/picker.js.map +1 -0
- package/dist/lib/resolve.d.ts +85 -0
- package/dist/lib/resolve.js +203 -0
- package/dist/lib/resolve.js.map +1 -0
- package/dist/lib/updater.d.ts +16 -0
- package/dist/lib/updater.js +102 -0
- package/dist/lib/updater.js.map +1 -0
- package/lizard-wrapper.sh +2 -0
- package/package.json +11 -3
- package/skill-data/core/SKILL.md +239 -0
- package/src/commands/add.ts +388 -56
- package/src/commands/config.ts +80 -0
- package/src/commands/docs.ts +15 -0
- package/src/commands/domain.ts +248 -0
- package/src/commands/git.ts +201 -40
- package/src/commands/init.ts +149 -100
- package/src/commands/link.ts +127 -35
- package/src/commands/login.ts +4 -3
- package/src/commands/logs.ts +283 -27
- package/src/commands/open.ts +3 -2
- package/src/commands/port.ts +57 -0
- package/src/commands/projects.ts +43 -6
- package/src/commands/ps.ts +39 -60
- package/src/commands/redeploy.ts +51 -10
- package/src/commands/regions.ts +2 -6
- package/src/commands/restart.ts +84 -10
- package/src/commands/run.ts +68 -24
- package/src/commands/scale.ts +216 -0
- package/src/commands/secrets.ts +277 -100
- package/src/commands/service-set.ts +669 -0
- package/src/commands/service-show.ts +52 -0
- package/src/commands/service.ts +298 -0
- package/src/commands/skill.ts +157 -0
- package/src/commands/ssh.ts +176 -0
- package/src/commands/status.ts +51 -46
- package/src/commands/unlink.ts +17 -0
- package/src/commands/up.ts +461 -0
- package/src/commands/upgrade.ts +87 -0
- package/src/commands/whoami.ts +34 -6
- package/src/commands/workspace.ts +44 -0
- package/src/index.ts +219 -85
- package/src/lib/api.ts +114 -51
- package/src/lib/auth.ts +22 -46
- package/src/lib/config.ts +100 -65
- package/src/lib/format.ts +18 -4
- package/src/lib/name.ts +27 -0
- package/src/lib/picker.ts +133 -0
- package/src/lib/resolve.ts +285 -0
- package/src/lib/updater.ts +106 -0
- package/test/cli.test.ts +491 -0
- package/test/fixtures/hello-app/Dockerfile +5 -0
- package/test/fixtures/hello-app/index.js +5 -0
- package/test/unit/api.test.ts +66 -0
- package/test/unit/config.test.ts +94 -0
- package/test/unit/init.test.ts +211 -0
- package/test/unit/json.test.ts +208 -0
- package/test/unit/picker.test.ts +161 -0
- package/test/unit/resolve.test.ts +124 -0
- package/test/unit/service-set.test.ts +355 -0
- package/vitest.config.ts +10 -0
- package/dist/commands/connect.d.ts +0 -2
- package/dist/commands/connect.js +0 -117
- package/dist/commands/connect.js.map +0 -1
- package/dist/commands/context.d.ts +0 -2
- package/dist/commands/context.js +0 -71
- package/dist/commands/context.js.map +0 -1
- package/dist/commands/deploy.d.ts +0 -2
- package/dist/commands/deploy.js +0 -120
- package/dist/commands/deploy.js.map +0 -1
- package/dist/commands/destroy.d.ts +0 -2
- package/dist/commands/destroy.js +0 -51
- package/dist/commands/destroy.js.map +0 -1
- package/dist/commands/update.d.ts +0 -2
- package/dist/commands/update.js +0 -41
- package/dist/commands/update.js.map +0 -1
- package/dist/commands/version.d.ts +0 -2
- package/dist/commands/version.js +0 -37
- package/dist/commands/version.js.map +0 -1
- package/src/commands/connect.ts +0 -145
- package/src/commands/context.ts +0 -93
- package/src/commands/deploy.ts +0 -153
- package/src/commands/destroy.ts +0 -51
- package/src/commands/update.ts +0 -44
- 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
|
|
4
|
-
import {
|
|
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("
|
|
9
|
-
.description("
|
|
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
|
-
.
|
|
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
|
|
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
|
-
|
|
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"redeploy.js","sourceRoot":"","sources":["../../src/commands/redeploy.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/regions.js
CHANGED
|
@@ -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
|
-
|
|
5
|
-
.command("
|
|
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,
|
|
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"}
|
package/dist/commands/restart.js
CHANGED
|
@@ -1,20 +1,94 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
1
2
|
import ora from "ora";
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
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("
|
|
8
|
-
.description("Restart
|
|
9
|
-
.
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../../src/commands/restart.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/run.d.ts
CHANGED
|
@@ -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;
|
package/dist/commands/run.js
CHANGED
|
@@ -1,33 +1,72 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { api } from "../lib/api.js";
|
|
3
|
-
import {
|
|
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
|
|
8
|
-
.description("Run a command with project
|
|
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 =
|
|
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
|
-
|
|
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
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
package/dist/commands/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOxE;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,cAAc,EAAE,uCAAuC,CAAC;SACjE,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,sBAAsB,EAAE,mDAAmD,CAAC;SACnF,MAAM,CAAC,cAAc,EAAE,0CAA0C,CAAC;SAClE,MAAM,CAAC,oBAAoB,EAAE,iCAAiC,CAAC;SAC/D,kBAAkB,EAAE;SACpB,MAAM,CAAC,KAAK,EAAE,IAAc,EAAE,IAAS,EAAE,EAAE;QAC1C,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAErE,MAAM,GAAG,GAA2B,EAAE,GAAI,OAAO,CAAC,GAA8B,EAAE,CAAC;QAEnF,qBAAqB;QACrB,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,GAAG,CAClC,SAAS,CAAC,iBAAiB,SAAS,UAAU,EAAE,KAAK,CAAC,CACvD,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,cAAc;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QAErD,gDAAgD;QAChD,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,UAAU,GACd,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,SAAS,CAAC;YAEhF,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;gBACxD,MAAM,IAAI,GACR,GAAG,CAAC,IAAI,KAAK,KAAK;oBAChB,CAAC,CAAC,SAAS,CAAC,aAAa,GAAG,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC;oBACjD,CAAC,CAAC,SAAS,CAAC,iBAAiB,SAAS,WAAW,GAAG,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;gBAC9E,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,GAAG,CAAW,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAQ,EAAE,EAAE;oBACtE,IAAI,GAAG,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;wBACxB,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;4BACzB,OAAO,CAAC,IAAI,CACV,mBAAmB,GAAG,CAAC,IAAI,oCAAoC;gCAC7D,cAAc,IAAI,sCAAsC,CAC3D,CAAC;wBACJ,CAAC;wBACD,OAAO,EAAc,CAAC;oBACxB,CAAC;oBACD,MAAM,GAAG,CAAC;gBACZ,CAAC,CAAC,CAAC;gBACH,KAAK,MAAM,CAAC,IAAI,cAAc;oBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YACvD,CAAC;QACH,CAAC;QAED,yEAAyE;QACzE,yEAAyE;QACzE,yEAAyE;QACzE,kCAAkC;QAClC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YAC/C,GAAG;YACH,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,IAAI,GAAI,MAAM,CAAC,KAA+B,CAAC,IAAI,CAAC;YAC1D,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,kCAAkC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -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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"}
|