@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
@@ -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,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerSkill(program: Command): void;
@@ -0,0 +1,146 @@
1
+ import { readdirSync, readFileSync, statSync } from "node:fs";
2
+ import { fileURLToPath } from "node:url";
3
+ import path from "node:path";
4
+ import { error, info, isJSONMode, printJSON, table } from "../lib/format.js";
5
+ const DEFAULT_SKILLS_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "skill-data");
6
+ function skillsDir() {
7
+ return process.env.LIZARD_SKILLS_DIR || DEFAULT_SKILLS_DIR;
8
+ }
9
+ function listSkills() {
10
+ const dir = skillsDir();
11
+ try {
12
+ return readdirSync(dir)
13
+ .filter((name) => {
14
+ const p = path.join(dir, name);
15
+ try {
16
+ return statSync(p).isDirectory();
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ })
22
+ .sort();
23
+ }
24
+ catch {
25
+ return [];
26
+ }
27
+ }
28
+ function skillFile(name) {
29
+ return path.join(skillsDir(), name, "SKILL.md");
30
+ }
31
+ // Minimal YAML-ish frontmatter parser. Pulls top-level scalar keys (name,
32
+ // description, etc.) — enough to render `lizard skill list`. Full YAML parsing
33
+ // would add a dependency for no real win.
34
+ function parseFrontmatter(md) {
35
+ if (!md.startsWith("---"))
36
+ return {};
37
+ const end = md.indexOf("\n---", 3);
38
+ if (end === -1)
39
+ return {};
40
+ const body = md.slice(3, end).replace(/^\r?\n/, "");
41
+ const out = {};
42
+ for (const raw of body.split(/\r?\n/)) {
43
+ const m = raw.match(/^([A-Za-z0-9_-]+):\s*(.*)$/);
44
+ if (!m)
45
+ continue;
46
+ let val = m[2].trim();
47
+ if ((val.startsWith('"') && val.endsWith('"')) ||
48
+ (val.startsWith("'") && val.endsWith("'"))) {
49
+ val = val.slice(1, -1);
50
+ }
51
+ out[m[1]] = val;
52
+ }
53
+ return out;
54
+ }
55
+ function readSkill(name) {
56
+ const file = skillFile(name);
57
+ let md;
58
+ try {
59
+ md = readFileSync(file, "utf8");
60
+ }
61
+ catch {
62
+ throw new Error(`Skill '${name}' not found. Run \`lizard skill list\` to see available skills.`);
63
+ }
64
+ return { md, meta: parseFrontmatter(md) };
65
+ }
66
+ function shortDesc(desc, max = 100) {
67
+ const oneLine = desc.replace(/\s+/g, " ").trim();
68
+ return oneLine.length > max ? oneLine.slice(0, max - 1) + "…" : oneLine;
69
+ }
70
+ export function registerSkill(program) {
71
+ const skill = program
72
+ .command("skill")
73
+ .description("Read embedded agent skills shipped with this CLI version");
74
+ skill
75
+ .command("list")
76
+ .description("List available skills with descriptions")
77
+ .action(() => {
78
+ const names = listSkills();
79
+ if (isJSONMode()) {
80
+ printJSON({
81
+ dir: skillsDir(),
82
+ skills: names.map((n) => {
83
+ try {
84
+ const { meta } = readSkill(n);
85
+ return { name: n, description: meta.description || "" };
86
+ }
87
+ catch {
88
+ return { name: n, description: "" };
89
+ }
90
+ }),
91
+ });
92
+ return;
93
+ }
94
+ if (names.length === 0) {
95
+ info("No skills found.");
96
+ return;
97
+ }
98
+ const rows = names.map((n) => {
99
+ try {
100
+ const { meta } = readSkill(n);
101
+ return [n, shortDesc(meta.description || "")];
102
+ }
103
+ catch {
104
+ return [n, ""];
105
+ }
106
+ });
107
+ table(["name", "description"], rows);
108
+ });
109
+ skill
110
+ .command("get")
111
+ .description("Print a skill's full content (markdown)")
112
+ .argument("<name>", "skill name (e.g. core)")
113
+ .option("--full", "Include reference files (reserved; currently equivalent to default)")
114
+ .action((name, _opts) => {
115
+ try {
116
+ const { md, meta } = readSkill(name);
117
+ if (isJSONMode()) {
118
+ printJSON({
119
+ name,
120
+ path: skillFile(name),
121
+ frontmatter: meta,
122
+ content: md,
123
+ });
124
+ return;
125
+ }
126
+ process.stdout.write(md.endsWith("\n") ? md : md + "\n");
127
+ }
128
+ catch (e) {
129
+ error(e.message);
130
+ process.exit(3);
131
+ }
132
+ });
133
+ skill
134
+ .command("path")
135
+ .description("Print the filesystem path of a skill (or the skills root)")
136
+ .argument("[name]", "skill name; omit to print the skills directory")
137
+ .action((name) => {
138
+ const target = name ? skillFile(name) : skillsDir();
139
+ if (isJSONMode()) {
140
+ printJSON({ path: target });
141
+ return;
142
+ }
143
+ console.log(target);
144
+ });
145
+ }
146
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerSSH(program: Command): void;
@@ -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;