@lizard-build/cli 0.1.0 → 0.3.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/release.yml +90 -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/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 +204 -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/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/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 +214 -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
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import * as p from "@clack/prompts";
|
|
3
|
+
import { api, withScope, withQuery } from "../lib/api.js";
|
|
4
|
+
import { updateProjectLink, getProjectLink } from "../lib/config.js";
|
|
5
|
+
import { resolveProjectScope, resolveService } from "../lib/resolve.js";
|
|
6
|
+
import { validateName } from "../lib/name.js";
|
|
7
|
+
import { registerServiceSet } from "./service-set.js";
|
|
8
|
+
import { registerServiceShow } from "./service-show.js";
|
|
9
|
+
import { success, info, isJSONMode, printJSON, isTTY, } from "../lib/format.js";
|
|
10
|
+
/**
|
|
11
|
+
* `lizard service` — service group:
|
|
12
|
+
* - bare: link a service to cwd
|
|
13
|
+
* - list / link / status / delete / rename / set / show / logs
|
|
14
|
+
* (scale / redeploy / restart live on the top-level commands of the same name)
|
|
15
|
+
*/
|
|
16
|
+
export function registerService(program) {
|
|
17
|
+
const svc = program
|
|
18
|
+
.command("service")
|
|
19
|
+
.argument("[name]", "Service name to link (legacy form for `service link <name>`)")
|
|
20
|
+
.description("Manage services")
|
|
21
|
+
.action(async (name, _opts, cmd) => {
|
|
22
|
+
// No subcommand → behave like `service link`
|
|
23
|
+
if (!name && cmd.args.length === 0) {
|
|
24
|
+
await linkInteractive(cmd);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (name) {
|
|
28
|
+
await linkByName(cmd, name);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
// `service set` and `service show` — per-service configuration patches.
|
|
32
|
+
// Live in their own files because the apply logic is substantial.
|
|
33
|
+
registerServiceSet(svc);
|
|
34
|
+
registerServiceShow(svc);
|
|
35
|
+
svc
|
|
36
|
+
.command("link")
|
|
37
|
+
.argument("[name]", "Service name or ID")
|
|
38
|
+
.description("Link a service to the current directory")
|
|
39
|
+
.action(async (name, _opts, sub) => {
|
|
40
|
+
if (name) {
|
|
41
|
+
await linkByName(sub, name);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
await linkInteractive(sub);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
svc
|
|
48
|
+
.command("delete")
|
|
49
|
+
.alias("rm")
|
|
50
|
+
.description("Delete a service")
|
|
51
|
+
.argument("[service]", "Service name or ID (defaults to linked)")
|
|
52
|
+
.option("-s, --service <name>", "Service name or ID")
|
|
53
|
+
.option("-p, --project <id>", "Project name, slug, or ID")
|
|
54
|
+
.option("-y, --yes", "Skip confirmation")
|
|
55
|
+
.action(async (serviceArg, opts) => {
|
|
56
|
+
const { projectId, scope } = await resolveProjectScope(opts.project);
|
|
57
|
+
const target = serviceArg || opts.service || getProjectLink()?.serviceId;
|
|
58
|
+
if (!target)
|
|
59
|
+
throw new Error("No service specified or linked.");
|
|
60
|
+
const svcInfo = await resolveService(projectId, target);
|
|
61
|
+
const yes = opts.yes;
|
|
62
|
+
if (!yes) {
|
|
63
|
+
if (!isTTY())
|
|
64
|
+
throw new Error("Use -y to confirm in non-interactive mode");
|
|
65
|
+
const confirm = await p.confirm({
|
|
66
|
+
message: `Delete ${chalk.bold(svcInfo.name)}? This is irreversible.`,
|
|
67
|
+
});
|
|
68
|
+
if (p.isCancel(confirm) || !confirm)
|
|
69
|
+
process.exit(5);
|
|
70
|
+
}
|
|
71
|
+
if (svcInfo.kind === "app") {
|
|
72
|
+
await api.delete(withScope(`/api/apps/${svcInfo.id}`, scope));
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
await api.delete(withScope(`/api/projects/${projectId}/addons/${svcInfo.id}`, scope));
|
|
76
|
+
}
|
|
77
|
+
// Clear link if we just deleted the linked service
|
|
78
|
+
const link = getProjectLink();
|
|
79
|
+
if (link?.serviceId === svcInfo.id) {
|
|
80
|
+
updateProjectLink({ serviceId: undefined, serviceName: undefined });
|
|
81
|
+
}
|
|
82
|
+
if (isJSONMode()) {
|
|
83
|
+
printJSON({ id: svcInfo.id, name: svcInfo.name, status: "deleted" });
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
success(`Service ${chalk.bold(svcInfo.name)} deleted`);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
svc
|
|
90
|
+
.command("rename")
|
|
91
|
+
.argument("<new-name>", "New name for the service")
|
|
92
|
+
.description("Rename a service (apps and addons)")
|
|
93
|
+
.option("-s, --service <name>", "Service name or ID (defaults to linked service)")
|
|
94
|
+
.option("-p, --project <id>", "Project name, slug, or ID")
|
|
95
|
+
.action(async (newName, opts) => {
|
|
96
|
+
const nameErr = validateName(newName);
|
|
97
|
+
if (nameErr)
|
|
98
|
+
throw new Error(`Invalid name: ${nameErr}`);
|
|
99
|
+
const { projectId, scope } = await resolveProjectScope(opts.project);
|
|
100
|
+
const target = opts.service || getProjectLink()?.serviceId;
|
|
101
|
+
if (!target)
|
|
102
|
+
throw new Error("No service specified or linked.");
|
|
103
|
+
const svcInfo = await resolveService(projectId, target);
|
|
104
|
+
if (svcInfo.kind === "app") {
|
|
105
|
+
// PATCH /api/apps/:id is 410-Gone; renames go through config:apply.
|
|
106
|
+
// Backend treats name as a rename only when id is also in the patch
|
|
107
|
+
// (otherwise name is a lookup key).
|
|
108
|
+
await api.post(withScope(`/api/projects/${projectId}/config:apply`, scope), { services: [{ id: svcInfo.id, name: newName }] });
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
await api.patch(withScope(`/api/projects/${projectId}/addons/${svcInfo.id}`, scope), { name: newName });
|
|
112
|
+
}
|
|
113
|
+
// Keep the cwd link's cached name in sync when we just renamed the linked one.
|
|
114
|
+
const link = getProjectLink();
|
|
115
|
+
if (link?.serviceId === svcInfo.id) {
|
|
116
|
+
updateProjectLink({ serviceId: svcInfo.id, serviceName: newName });
|
|
117
|
+
}
|
|
118
|
+
if (isJSONMode()) {
|
|
119
|
+
printJSON({ id: svcInfo.id, oldName: svcInfo.name, name: newName });
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
success(`Renamed ${chalk.bold(svcInfo.name)} → ${chalk.bold(newName)}`);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
svc
|
|
126
|
+
.command("logs")
|
|
127
|
+
.description("Stream logs of a service")
|
|
128
|
+
.argument("[service]", "Service name or ID (defaults to linked)")
|
|
129
|
+
.option("-s, --service <name>", "Service name or ID")
|
|
130
|
+
.option("-p, --project <id>", "Project name, slug, or ID")
|
|
131
|
+
.option("--build", "Show build logs instead of runtime")
|
|
132
|
+
.option("-n, --tail <n>", "Print last N lines and exit (no follow); use --tail all for full history")
|
|
133
|
+
.option("--page <n>", "Page of historical logs (1=most recent, 2=older, …); implies --tail 200")
|
|
134
|
+
.action(async (serviceArg, opts) => {
|
|
135
|
+
const { projectId, scope } = await resolveProjectScope(opts.project);
|
|
136
|
+
const target = serviceArg || opts.service || getProjectLink()?.serviceId;
|
|
137
|
+
if (!target)
|
|
138
|
+
throw new Error("No service specified or linked.");
|
|
139
|
+
const svcInfo = await resolveService(projectId, target);
|
|
140
|
+
const { streamSSE } = await import("../lib/api.js");
|
|
141
|
+
if (opts.build) {
|
|
142
|
+
const app = await api.get(withScope(`/api/apps/${svcInfo.id}`, scope));
|
|
143
|
+
if (!app.builds?.length)
|
|
144
|
+
throw new Error("No builds found");
|
|
145
|
+
info(chalk.dim(`Streaming build logs for ${svcInfo.name}...\n`));
|
|
146
|
+
await streamSSE(`/api/builds/${app.builds[0].id}/logs`, (event, data) => {
|
|
147
|
+
if (event === "done" || event === "error")
|
|
148
|
+
return false;
|
|
149
|
+
process.stdout.write(safeLogLine(data) + "\n");
|
|
150
|
+
return true;
|
|
151
|
+
});
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
// --page: paginate through historical logs without streaming
|
|
155
|
+
if (opts.page !== undefined) {
|
|
156
|
+
const pageSize = 200;
|
|
157
|
+
const pageNum = Math.max(1, parseInt(opts.page, 10) || 1);
|
|
158
|
+
// Fetch pages iteratively: page 1 = most recent, page 2 = one step older, etc.
|
|
159
|
+
let before;
|
|
160
|
+
for (let p = 1; p <= pageNum; p++) {
|
|
161
|
+
const result = await api.get(withScope(withQuery(`/api/apps/${svcInfo.id}/logs/history`, {
|
|
162
|
+
limit: pageSize,
|
|
163
|
+
before,
|
|
164
|
+
}), scope));
|
|
165
|
+
if (p === pageNum) {
|
|
166
|
+
if (!result.entries.length) {
|
|
167
|
+
info(chalk.dim("No more logs."));
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
info(chalk.dim(`Page ${pageNum} (${result.entries.length} lines):\n`));
|
|
171
|
+
for (const e of result.entries)
|
|
172
|
+
process.stdout.write(safeLogLine(JSON.stringify(e)) + "\n");
|
|
173
|
+
if (result.oldest)
|
|
174
|
+
info(chalk.dim(`\n --page ${pageNum + 1} for older logs`));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
if (!result.entries.length || !result.entries[0])
|
|
179
|
+
break;
|
|
180
|
+
before = result.entries[0].id; // oldest entry of this page → upper bound for next
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
// --tail N: fetch N historical lines and exit (no follow)
|
|
186
|
+
if (opts.tail !== undefined) {
|
|
187
|
+
const rawTail = String(opts.tail);
|
|
188
|
+
const limit = rawTail === "all" ? 2000 : Math.min(Math.max(1, parseInt(rawTail, 10) || 200), 2000);
|
|
189
|
+
const result = await api.get(withScope(withQuery(`/api/apps/${svcInfo.id}/logs/history`, { limit }), scope));
|
|
190
|
+
for (const e of result.entries)
|
|
191
|
+
process.stdout.write(safeLogLine(JSON.stringify(e)) + "\n");
|
|
192
|
+
if (result.oldest && result.entries.length === limit) {
|
|
193
|
+
info(chalk.dim(`\n Showing last ${limit} lines. Use --tail all or --page 2 to see older logs.`));
|
|
194
|
+
}
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
info(chalk.dim(`Streaming logs for ${svcInfo.name}... (Ctrl+C to stop)\n`));
|
|
198
|
+
await streamSSE(withScope(withQuery(`/api/apps/${svcInfo.id}/logs`, { limit: 500 }), scope), (event, data) => {
|
|
199
|
+
if (event === "error")
|
|
200
|
+
return false;
|
|
201
|
+
process.stdout.write(safeLogLine(data) + "\n");
|
|
202
|
+
return true;
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
// Helpers in scope of registerService
|
|
206
|
+
async function linkByName(_cmd, name) {
|
|
207
|
+
const { projectId } = await resolveProjectScope(undefined);
|
|
208
|
+
const svcInfo = await resolveService(projectId, name);
|
|
209
|
+
updateProjectLink({ serviceId: svcInfo.id, serviceName: svcInfo.name });
|
|
210
|
+
if (isJSONMode()) {
|
|
211
|
+
printJSON({ serviceId: svcInfo.id, serviceName: svcInfo.name });
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
success(`Linked service ${chalk.bold(svcInfo.name)}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
async function linkInteractive(_cmd) {
|
|
218
|
+
const { projectId, scope } = await resolveProjectScope(undefined);
|
|
219
|
+
const data = await api.get(withScope(`/api/projects/${projectId}/services`, scope));
|
|
220
|
+
const services = [...(data.apps || []), ...(data.addons || [])];
|
|
221
|
+
if (services.length === 0) {
|
|
222
|
+
throw new Error("No services in project. Use `lizard add` first.");
|
|
223
|
+
}
|
|
224
|
+
if (!isTTY()) {
|
|
225
|
+
throw new Error("Service name required in non-interactive mode. Usage: `lizard service link <name>`");
|
|
226
|
+
}
|
|
227
|
+
const sel = await p.select({
|
|
228
|
+
message: "Select a service",
|
|
229
|
+
options: services.map((s) => ({
|
|
230
|
+
value: s.id,
|
|
231
|
+
label: s.name || s.addonType,
|
|
232
|
+
hint: s.status,
|
|
233
|
+
})),
|
|
234
|
+
});
|
|
235
|
+
if (p.isCancel(sel))
|
|
236
|
+
process.exit(5);
|
|
237
|
+
const svcInfo = services.find((s) => s.id === sel);
|
|
238
|
+
updateProjectLink({ serviceId: svcInfo.id, serviceName: svcInfo.name });
|
|
239
|
+
if (isJSONMode()) {
|
|
240
|
+
printJSON({ serviceId: svcInfo.id, serviceName: svcInfo.name });
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
success(`Linked service ${chalk.bold(svcInfo.name)}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
function safeLogLine(data) {
|
|
248
|
+
try {
|
|
249
|
+
const parsed = JSON.parse(data);
|
|
250
|
+
if (parsed.line)
|
|
251
|
+
return parsed.line;
|
|
252
|
+
if (parsed.message)
|
|
253
|
+
return parsed.message;
|
|
254
|
+
if (typeof parsed === "string")
|
|
255
|
+
return parsed;
|
|
256
|
+
return data;
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
return data;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import * as p from "@clack/prompts";
|
|
3
|
+
import { api, getBaseURL, withScope } from "../lib/api.js";
|
|
4
|
+
import { resolveProjectScope } from "../lib/resolve.js";
|
|
5
|
+
import { error, isTTY } from "../lib/format.js";
|
|
6
|
+
import { getToken } from "../lib/auth.js";
|
|
7
|
+
import * as https from "node:https";
|
|
8
|
+
import * as http from "node:http";
|
|
9
|
+
export function registerSSH(program) {
|
|
10
|
+
program
|
|
11
|
+
.command("ssh")
|
|
12
|
+
.description("Execute a command inside a running service VM")
|
|
13
|
+
.argument("[cmd...]", "Command and args to run inside the VM (required; pass after `--` to stop flag parsing, e.g. `-- ls -la /app`)")
|
|
14
|
+
.option("-s, --service <id>", "Service name or ID")
|
|
15
|
+
.option("-p, --project <id>", "Project name, slug, or ID")
|
|
16
|
+
.addHelpText("after", `
|
|
17
|
+
Examples:
|
|
18
|
+
lizard ssh -s my-app -- ls -la /app
|
|
19
|
+
lizard ssh -s my-app -- printenv
|
|
20
|
+
lizard ssh -s my-app -- bash -c "ps aux | head"`)
|
|
21
|
+
.action(async (cmdArgs, opts) => {
|
|
22
|
+
const { projectId, scope } = await resolveProjectScope(opts.project);
|
|
23
|
+
let serviceId = opts.service;
|
|
24
|
+
// Resolve service interactively if not given
|
|
25
|
+
if (!serviceId) {
|
|
26
|
+
const data = await api.get(withScope(`/api/projects/${projectId}/services`, scope));
|
|
27
|
+
const running = (data.apps || []).filter((a) => a.status === "running");
|
|
28
|
+
if (running.length === 0) {
|
|
29
|
+
error("No running services in this project.");
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
if (running.length === 1) {
|
|
33
|
+
serviceId = running[0].id;
|
|
34
|
+
}
|
|
35
|
+
else if (isTTY()) {
|
|
36
|
+
const selected = await p.select({
|
|
37
|
+
message: "Select a service",
|
|
38
|
+
options: running.map((a) => ({ value: a.id, label: a.name || a.id, hint: a.status })),
|
|
39
|
+
});
|
|
40
|
+
if (p.isCancel(selected))
|
|
41
|
+
process.exit(5);
|
|
42
|
+
serviceId = selected;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
error("Multiple services — pass -s <service>");
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Resolve service ID if a name was given (lookup by name)
|
|
50
|
+
if (serviceId && !serviceId.match(/^[A-Za-z0-9_-]{20,}$/)) {
|
|
51
|
+
const data = await api.get(withScope(`/api/projects/${projectId}/services`, scope));
|
|
52
|
+
const match = (data.apps || []).find((a) => a.name === serviceId || a.serviceName === serviceId || a.id === serviceId);
|
|
53
|
+
if (match)
|
|
54
|
+
serviceId = match.id;
|
|
55
|
+
}
|
|
56
|
+
if (cmdArgs.length === 0) {
|
|
57
|
+
error("No command given. Usage: lizard ssh -s <service> -- <cmd> [args...]");
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
// The server executes `cmd` via shell on the VM, so each arg must be
|
|
61
|
+
// shell-quoted before being joined — otherwise `bash -c "ps | head"`
|
|
62
|
+
// collapses to `bash -c ps | head` (quotes lost, `|` becomes a real pipe).
|
|
63
|
+
const cmd = cmdArgs.map(shellQuote).join(" ");
|
|
64
|
+
process.stdout.write(chalk.dim(`$ ${cmd}\n`));
|
|
65
|
+
let exitCode = 0;
|
|
66
|
+
await execStream(serviceId, cmd, (stream, line) => {
|
|
67
|
+
if (stream === "stderr") {
|
|
68
|
+
process.stderr.write(line + "\n");
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
process.stdout.write(line + "\n");
|
|
72
|
+
}
|
|
73
|
+
}, (code) => {
|
|
74
|
+
exitCode = code;
|
|
75
|
+
});
|
|
76
|
+
process.exit(exitCode);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function execStream(appId, cmd, onLine, onExit) {
|
|
80
|
+
return new Promise((resolve, reject) => {
|
|
81
|
+
const baseURL = getBaseURL();
|
|
82
|
+
const url = new URL(`${baseURL}/api/apps/${appId}/exec`);
|
|
83
|
+
const token = getToken();
|
|
84
|
+
const body = JSON.stringify({ cmd });
|
|
85
|
+
const reqHeaders = {
|
|
86
|
+
"Content-Type": "application/json",
|
|
87
|
+
"Content-Length": String(Buffer.byteLength(body)),
|
|
88
|
+
"Accept": "text/event-stream",
|
|
89
|
+
};
|
|
90
|
+
if (token)
|
|
91
|
+
reqHeaders["Authorization"] = `Bearer ${token}`;
|
|
92
|
+
const transport = url.protocol === "https:" ? https : http;
|
|
93
|
+
const req = transport.request({
|
|
94
|
+
hostname: url.hostname,
|
|
95
|
+
port: url.port || (url.protocol === "https:" ? 443 : 80),
|
|
96
|
+
path: url.pathname,
|
|
97
|
+
method: "POST",
|
|
98
|
+
headers: reqHeaders,
|
|
99
|
+
}, (res) => {
|
|
100
|
+
if (res.statusCode && res.statusCode >= 400) {
|
|
101
|
+
let body = "";
|
|
102
|
+
res.on("data", (c) => (body += c.toString()));
|
|
103
|
+
res.on("end", () => reject(new Error(`exec failed ${res.statusCode}: ${body}`)));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
let buf = "";
|
|
107
|
+
let currentEvent = "";
|
|
108
|
+
res.setEncoding("utf8");
|
|
109
|
+
res.on("data", (chunk) => {
|
|
110
|
+
buf += chunk;
|
|
111
|
+
const lines = buf.split("\n");
|
|
112
|
+
buf = lines.pop() ?? "";
|
|
113
|
+
for (const line of lines) {
|
|
114
|
+
const trimmed = line.replace(/\r$/, "");
|
|
115
|
+
if (trimmed === "") {
|
|
116
|
+
currentEvent = "";
|
|
117
|
+
}
|
|
118
|
+
else if (trimmed.startsWith("event:")) {
|
|
119
|
+
currentEvent = trimmed.slice(6).trim();
|
|
120
|
+
}
|
|
121
|
+
else if (trimmed.startsWith("data:")) {
|
|
122
|
+
const data = trimmed.slice(5).trimStart();
|
|
123
|
+
if (currentEvent === "exit") {
|
|
124
|
+
try {
|
|
125
|
+
onExit(JSON.parse(data).exitCode ?? 0);
|
|
126
|
+
}
|
|
127
|
+
catch { }
|
|
128
|
+
}
|
|
129
|
+
else if (currentEvent === "error") {
|
|
130
|
+
error(data);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
try {
|
|
134
|
+
const parsed = JSON.parse(data);
|
|
135
|
+
onLine(parsed.stream ?? "stdout", parsed.line ?? data);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
onLine("stdout", data);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
res.on("end", resolve);
|
|
145
|
+
res.on("error", reject);
|
|
146
|
+
});
|
|
147
|
+
req.on("error", reject);
|
|
148
|
+
req.write(body);
|
|
149
|
+
req.end();
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/** POSIX single-quote escaping. Safe-token chars pass through verbatim;
|
|
153
|
+
* anything else gets wrapped in '…' with embedded `'` rewritten as `'\''`. */
|
|
154
|
+
function shellQuote(arg) {
|
|
155
|
+
if (arg === "")
|
|
156
|
+
return "''";
|
|
157
|
+
if (/^[A-Za-z0-9_./:=@%+,-]+$/.test(arg))
|
|
158
|
+
return arg;
|
|
159
|
+
return "'" + arg.replace(/'/g, "'\\''") + "'";
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=ssh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/commands/ssh.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,9 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* `lizard status` — print the linked workspace / project / service for
|
|
4
|
+
* the current working directory. Mirrors `railway status`.
|
|
5
|
+
*
|
|
6
|
+
* Lazy-fills workspaceId into the link when missing so legacy configs
|
|
7
|
+
* surface their workspace too.
|
|
8
|
+
*/
|
|
2
9
|
export declare function registerStatus(program: Command): void;
|
package/dist/commands/status.js
CHANGED
|
@@ -1,51 +1,62 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { isJSONMode, printJSON,
|
|
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
|
|
15
|
+
.description("Show linked workspace, project, and service")
|
|
9
16
|
.action(async () => {
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,
|
|
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,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;
|