@launchmatic/cli 0.2.0 → 0.3.0

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 (70) hide show
  1. package/dist/api.d.ts +5 -0
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +11 -2
  4. package/dist/api.js.map +1 -1
  5. package/dist/c.js +12 -2
  6. package/dist/c.js.map +1 -1
  7. package/dist/commands/api-key.d.ts +3 -0
  8. package/dist/commands/api-key.d.ts.map +1 -0
  9. package/dist/commands/api-key.js +89 -0
  10. package/dist/commands/api-key.js.map +1 -0
  11. package/dist/commands/browser.d.ts +3 -0
  12. package/dist/commands/browser.d.ts.map +1 -0
  13. package/dist/commands/browser.js +410 -0
  14. package/dist/commands/browser.js.map +1 -0
  15. package/dist/commands/db.d.ts +3 -0
  16. package/dist/commands/db.d.ts.map +1 -0
  17. package/dist/commands/db.js +481 -0
  18. package/dist/commands/db.js.map +1 -0
  19. package/dist/commands/deploy.d.ts.map +1 -1
  20. package/dist/commands/deploy.js +9 -7
  21. package/dist/commands/deploy.js.map +1 -1
  22. package/dist/commands/deployments.d.ts +3 -0
  23. package/dist/commands/deployments.d.ts.map +1 -0
  24. package/dist/commands/deployments.js +158 -0
  25. package/dist/commands/deployments.js.map +1 -0
  26. package/dist/commands/doctor.d.ts +3 -0
  27. package/dist/commands/doctor.d.ts.map +1 -0
  28. package/dist/commands/doctor.js +160 -0
  29. package/dist/commands/doctor.js.map +1 -0
  30. package/dist/commands/infra.d.ts +3 -0
  31. package/dist/commands/infra.d.ts.map +1 -0
  32. package/dist/commands/infra.js +193 -0
  33. package/dist/commands/infra.js.map +1 -0
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js +49 -11
  36. package/dist/commands/init.js.map +1 -1
  37. package/dist/commands/lightspeed.d.ts.map +1 -1
  38. package/dist/commands/lightspeed.js +12 -2
  39. package/dist/commands/lightspeed.js.map +1 -1
  40. package/dist/commands/login.d.ts.map +1 -1
  41. package/dist/commands/login.js +46 -2
  42. package/dist/commands/login.js.map +1 -1
  43. package/dist/commands/logs.d.ts.map +1 -1
  44. package/dist/commands/logs.js +4 -3
  45. package/dist/commands/logs.js.map +1 -1
  46. package/dist/commands/preview.d.ts +3 -0
  47. package/dist/commands/preview.d.ts.map +1 -0
  48. package/dist/commands/preview.js +96 -0
  49. package/dist/commands/preview.js.map +1 -0
  50. package/dist/commands/quicklaunch.d.ts.map +1 -1
  51. package/dist/commands/quicklaunch.js +146 -18
  52. package/dist/commands/quicklaunch.js.map +1 -1
  53. package/dist/commands/repo.d.ts +3 -0
  54. package/dist/commands/repo.d.ts.map +1 -0
  55. package/dist/commands/repo.js +433 -0
  56. package/dist/commands/repo.js.map +1 -0
  57. package/dist/commands/usage.d.ts +3 -0
  58. package/dist/commands/usage.d.ts.map +1 -0
  59. package/dist/commands/usage.js +95 -0
  60. package/dist/commands/usage.js.map +1 -0
  61. package/dist/connectors.d.ts +16 -0
  62. package/dist/connectors.d.ts.map +1 -0
  63. package/dist/connectors.js +95 -0
  64. package/dist/connectors.js.map +1 -0
  65. package/dist/context.d.ts.map +1 -1
  66. package/dist/context.js +6 -1
  67. package/dist/context.js.map +1 -1
  68. package/dist/index.js +19 -1
  69. package/dist/index.js.map +1 -1
  70. package/package.json +36 -34
@@ -0,0 +1,433 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { api } from "../api.js";
5
+ import { isLoggedIn } from "../config.js";
6
+ import { getGitInfo } from "../detect.js";
7
+ function requireLogin() {
8
+ if (!isLoggedIn()) {
9
+ console.error(chalk.red('Not logged in. Run "lm login" first.'));
10
+ process.exit(1);
11
+ }
12
+ }
13
+ function getRepo() {
14
+ const info = getGitInfo(process.cwd());
15
+ if (!info.repoOwner || !info.repoName) {
16
+ console.error(chalk.red("No GitHub remote found. Run from a directory with a GitHub remote."));
17
+ process.exit(1);
18
+ }
19
+ return { owner: info.repoOwner, name: info.repoName, branch: info.repoBranch };
20
+ }
21
+ async function ghApi(path, options) {
22
+ return api(`/api/github${path}`, options);
23
+ }
24
+ function timeAgo(date) {
25
+ const diff = Date.now() - new Date(date).getTime();
26
+ const mins = Math.floor(diff / 60000);
27
+ if (mins < 60)
28
+ return `${mins}m ago`;
29
+ const hours = Math.floor(mins / 60);
30
+ if (hours < 24)
31
+ return `${hours}h ago`;
32
+ const days = Math.floor(hours / 24);
33
+ return `${days}d ago`;
34
+ }
35
+ function openUrl(url) {
36
+ const cmd = process.platform === "win32" ? "cmd" : process.platform === "darwin" ? "open" : "xdg-open";
37
+ const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
38
+ try {
39
+ execFileSync(cmd, args, { stdio: "pipe" });
40
+ }
41
+ catch { /* ignore */ }
42
+ }
43
+ export function registerRepo(program) {
44
+ const repo = program
45
+ .command("repo")
46
+ .description("GitHub repository management");
47
+ // ─── view ─────────────────────────────────────────────
48
+ repo
49
+ .command("view")
50
+ .alias("v")
51
+ .description("View repository info")
52
+ .option("--web", "Open in browser")
53
+ .action(async (opts) => {
54
+ requireLogin();
55
+ const { owner, name } = getRepo();
56
+ if (opts.web) {
57
+ openUrl(`https://github.com/${owner}/${name}`);
58
+ console.log(chalk.dim(`Opened https://github.com/${owner}/${name}`));
59
+ return;
60
+ }
61
+ const spinner = ora("Fetching repo info...").start();
62
+ try {
63
+ const { data } = await ghApi(`/repos/${owner}/${name}`);
64
+ spinner.stop();
65
+ console.log();
66
+ console.log(` ${chalk.bold(data.full_name || `${owner}/${name}`)}${data.private ? chalk.dim(" (private)") : ""}`);
67
+ if (data.description)
68
+ console.log(` ${chalk.dim(data.description)}`);
69
+ console.log();
70
+ console.log(` ${chalk.bold("Default branch:")} ${data.default_branch || "main"}`);
71
+ if (data.language)
72
+ console.log(` ${chalk.bold("Language:")} ${data.language}`);
73
+ if (data.stargazers_count !== undefined)
74
+ console.log(` ${chalk.bold("Stars:")} ${data.stargazers_count}`);
75
+ if (data.open_issues_count !== undefined)
76
+ console.log(` ${chalk.bold("Open issues:")} ${data.open_issues_count}`);
77
+ console.log(` ${chalk.bold("URL:")} ${chalk.cyan(`https://github.com/${owner}/${name}`)}`);
78
+ console.log();
79
+ }
80
+ catch (err) {
81
+ spinner.fail(chalk.red(`Failed: ${err.message}`));
82
+ process.exitCode = 1;
83
+ }
84
+ });
85
+ // ─── prs ──────────────────────────────────────────────
86
+ repo
87
+ .command("prs")
88
+ .description("List pull requests")
89
+ .option("--state <state>", "Filter by state: open, closed, all", "open")
90
+ .option("--limit <n>", "Max results", "10")
91
+ .option("--web", "Open in browser")
92
+ .action(async (opts) => {
93
+ requireLogin();
94
+ const { owner, name } = getRepo();
95
+ if (opts.web) {
96
+ openUrl(`https://github.com/${owner}/${name}/pulls`);
97
+ return;
98
+ }
99
+ const spinner = ora("Fetching pull requests...").start();
100
+ try {
101
+ const { data } = await ghApi(`/repos/${owner}/${name}/pulls?state=${opts.state}&limit=${opts.limit}`);
102
+ spinner.stop();
103
+ const prs = data || [];
104
+ if (prs.length === 0) {
105
+ console.log(chalk.dim("\n No pull requests found.\n"));
106
+ return;
107
+ }
108
+ console.log(chalk.bold(`\n Pull Requests — ${owner}/${name} (${opts.state})\n`));
109
+ for (const pr of prs.slice(0, parseInt(opts.limit))) {
110
+ const stateColor = pr.state === "open" ? chalk.green : pr.merged_at ? chalk.magenta : chalk.red;
111
+ const label = pr.merged_at ? "MERGED" : pr.state.toUpperCase();
112
+ console.log(` ${stateColor(`[${label}]`)} ${chalk.bold(`#${pr.number}`)} ${pr.title}` +
113
+ chalk.dim(` — ${pr.user?.login || "unknown"} ${pr.created_at ? timeAgo(pr.created_at) : ""}`));
114
+ if (pr.head?.ref)
115
+ console.log(chalk.dim(` ${pr.head.ref} → ${pr.base?.ref || "main"}`));
116
+ }
117
+ console.log();
118
+ }
119
+ catch (err) {
120
+ spinner.fail(chalk.red(`Failed: ${err.message}`));
121
+ process.exitCode = 1;
122
+ }
123
+ });
124
+ // ─── issues ───────────────────────────────────────────
125
+ repo
126
+ .command("issues")
127
+ .description("List issues")
128
+ .option("--state <state>", "Filter: open, closed, all", "open")
129
+ .option("--limit <n>", "Max results", "10")
130
+ .option("--labels <labels>", "Filter by labels (comma-separated)")
131
+ .option("--web", "Open in browser")
132
+ .action(async (opts) => {
133
+ requireLogin();
134
+ const { owner, name } = getRepo();
135
+ if (opts.web) {
136
+ openUrl(`https://github.com/${owner}/${name}/issues`);
137
+ return;
138
+ }
139
+ const spinner = ora("Fetching issues...").start();
140
+ try {
141
+ let path = `/repos/${owner}/${name}/issues?state=${opts.state}&limit=${opts.limit}`;
142
+ if (opts.labels)
143
+ path += `&labels=${encodeURIComponent(opts.labels)}`;
144
+ const { data } = await ghApi(path);
145
+ spinner.stop();
146
+ const issues = (data || []).filter((i) => !i.pull_request);
147
+ if (issues.length === 0) {
148
+ console.log(chalk.dim("\n No issues found.\n"));
149
+ return;
150
+ }
151
+ console.log(chalk.bold(`\n Issues — ${owner}/${name} (${opts.state})\n`));
152
+ for (const issue of issues.slice(0, parseInt(opts.limit))) {
153
+ const stateIcon = issue.state === "open" ? chalk.green("●") : chalk.red("●");
154
+ const labels = (issue.labels || []).map((l) => chalk.dim(`[${l.name}]`)).join(" ");
155
+ console.log(` ${stateIcon} ${chalk.bold(`#${issue.number}`)} ${issue.title} ${labels}` +
156
+ chalk.dim(` — ${issue.user?.login || ""} ${issue.created_at ? timeAgo(issue.created_at) : ""}`));
157
+ }
158
+ console.log();
159
+ }
160
+ catch (err) {
161
+ spinner.fail(chalk.red(`Failed: ${err.message}`));
162
+ process.exitCode = 1;
163
+ }
164
+ });
165
+ // ─── issue create ─────────────────────────────────────
166
+ repo
167
+ .command("issue-create")
168
+ .alias("ic")
169
+ .description("Create a new issue")
170
+ .requiredOption("-t, --title <title>", "Issue title")
171
+ .option("-b, --body <body>", "Issue body")
172
+ .option("-l, --labels <labels>", "Labels (comma-separated)")
173
+ .action(async (opts) => {
174
+ requireLogin();
175
+ const { owner, name } = getRepo();
176
+ const spinner = ora("Creating issue...").start();
177
+ try {
178
+ const payload = { title: opts.title };
179
+ if (opts.body)
180
+ payload.body = opts.body;
181
+ if (opts.labels)
182
+ payload.labels = opts.labels.split(",").map((l) => l.trim());
183
+ const { data } = await ghApi(`/repos/${owner}/${name}/issues`, {
184
+ method: "POST",
185
+ body: JSON.stringify(payload),
186
+ });
187
+ spinner.succeed(`Issue #${data.number} created → ${chalk.cyan(data.html_url || `https://github.com/${owner}/${name}/issues/${data.number}`)}`);
188
+ }
189
+ catch (err) {
190
+ spinner.fail(chalk.red(`Failed: ${err.message}`));
191
+ process.exitCode = 1;
192
+ }
193
+ });
194
+ // ─── branches ─────────────────────────────────────────
195
+ repo
196
+ .command("branches")
197
+ .alias("br")
198
+ .description("List branches")
199
+ .option("--web", "Open in browser")
200
+ .action(async (opts) => {
201
+ requireLogin();
202
+ const { owner, name, branch: currentBranch } = getRepo();
203
+ if (opts.web) {
204
+ openUrl(`https://github.com/${owner}/${name}/branches`);
205
+ return;
206
+ }
207
+ const spinner = ora("Fetching branches...").start();
208
+ try {
209
+ const { data } = await ghApi(`/repos/${owner}/${name}/branches`);
210
+ spinner.stop();
211
+ const branches = data || [];
212
+ console.log(chalk.bold(`\n Branches — ${owner}/${name}\n`));
213
+ for (const b of branches) {
214
+ const isCurrent = b.name === currentBranch;
215
+ const prefix = isCurrent ? chalk.green("* ") : " ";
216
+ const nameStr = isCurrent ? chalk.green.bold(b.name) : b.name;
217
+ const sha = b.commit?.sha ? chalk.dim(` ${b.commit.sha.slice(0, 7)}`) : "";
218
+ const prot = b.protected ? chalk.yellow(" (protected)") : "";
219
+ console.log(`${prefix}${nameStr}${sha}${prot}`);
220
+ }
221
+ console.log();
222
+ }
223
+ catch (err) {
224
+ spinner.fail(chalk.red(`Failed: ${err.message}`));
225
+ process.exitCode = 1;
226
+ }
227
+ });
228
+ // ─── commits ──────────────────────────────────────────
229
+ repo
230
+ .command("commits")
231
+ .alias("log")
232
+ .description("List recent commits")
233
+ .option("-b, --branch <branch>", "Branch name")
234
+ .option("--limit <n>", "Max results", "10")
235
+ .option("--web", "Open in browser")
236
+ .action(async (opts) => {
237
+ requireLogin();
238
+ const { owner, name, branch: currentBranch } = getRepo();
239
+ const branch = opts.branch || currentBranch;
240
+ if (opts.web) {
241
+ openUrl(`https://github.com/${owner}/${name}/commits/${branch}`);
242
+ return;
243
+ }
244
+ const spinner = ora("Fetching commits...").start();
245
+ try {
246
+ const { data } = await ghApi(`/repos/${owner}/${name}/commits?branch=${branch}&limit=${opts.limit}`);
247
+ spinner.stop();
248
+ const commits = data || [];
249
+ console.log(chalk.bold(`\n Commits — ${owner}/${name} (${branch})\n`));
250
+ for (const c of commits.slice(0, parseInt(opts.limit))) {
251
+ const sha = chalk.yellow(c.sha?.slice(0, 7) || "???????");
252
+ const msg = (c.commit?.message || "").split("\n")[0].slice(0, 72);
253
+ const author = c.commit?.author?.name || c.author?.login || "";
254
+ const date = c.commit?.author?.date ? timeAgo(c.commit.author.date) : "";
255
+ console.log(` ${sha} ${msg}`);
256
+ if (author || date)
257
+ console.log(chalk.dim(` ${author} ${date}`));
258
+ }
259
+ console.log();
260
+ }
261
+ catch (err) {
262
+ spinner.fail(chalk.red(`Failed: ${err.message}`));
263
+ process.exitCode = 1;
264
+ }
265
+ });
266
+ // ─── releases ─────────────────────────────────────────
267
+ repo
268
+ .command("releases")
269
+ .alias("rl")
270
+ .description("List releases")
271
+ .option("--limit <n>", "Max results", "5")
272
+ .option("--web", "Open in browser")
273
+ .action(async (opts) => {
274
+ requireLogin();
275
+ const { owner, name } = getRepo();
276
+ if (opts.web) {
277
+ openUrl(`https://github.com/${owner}/${name}/releases`);
278
+ return;
279
+ }
280
+ const spinner = ora("Fetching releases...").start();
281
+ try {
282
+ const { data } = await ghApi(`/repos/${owner}/${name}/releases?limit=${opts.limit}`);
283
+ spinner.stop();
284
+ const releases = data || [];
285
+ if (releases.length === 0) {
286
+ console.log(chalk.dim("\n No releases found.\n"));
287
+ return;
288
+ }
289
+ console.log(chalk.bold(`\n Releases — ${owner}/${name}\n`));
290
+ for (const r of releases.slice(0, parseInt(opts.limit))) {
291
+ const tag = chalk.cyan(r.tag_name || "untagged");
292
+ const pre = r.prerelease ? chalk.yellow(" (pre-release)") : "";
293
+ const draft = r.draft ? chalk.dim(" (draft)") : "";
294
+ console.log(` ${tag} ${chalk.bold(r.name || "")}${pre}${draft}`);
295
+ if (r.published_at)
296
+ console.log(chalk.dim(` Published ${timeAgo(r.published_at)} by ${r.author?.login || ""}`));
297
+ if (r.body)
298
+ console.log(chalk.dim(` ${r.body.split("\n")[0].slice(0, 80)}`));
299
+ console.log();
300
+ }
301
+ }
302
+ catch (err) {
303
+ spinner.fail(chalk.red(`Failed: ${err.message}`));
304
+ process.exitCode = 1;
305
+ }
306
+ });
307
+ // ─── actions ──────────────────────────────────────────
308
+ repo
309
+ .command("actions")
310
+ .alias("runs")
311
+ .description("List recent GitHub Actions runs")
312
+ .option("--limit <n>", "Max results", "10")
313
+ .option("--web", "Open in browser")
314
+ .action(async (opts) => {
315
+ requireLogin();
316
+ const { owner, name } = getRepo();
317
+ if (opts.web) {
318
+ openUrl(`https://github.com/${owner}/${name}/actions`);
319
+ return;
320
+ }
321
+ const spinner = ora("Fetching workflow runs...").start();
322
+ try {
323
+ const { data } = await ghApi(`/repos/${owner}/${name}/actions?limit=${opts.limit}`);
324
+ spinner.stop();
325
+ const runs = data || [];
326
+ if (runs.length === 0) {
327
+ console.log(chalk.dim("\n No workflow runs found.\n"));
328
+ return;
329
+ }
330
+ console.log(chalk.bold(`\n Actions — ${owner}/${name}\n`));
331
+ for (const r of runs.slice(0, parseInt(opts.limit))) {
332
+ const statusIcon = r.conclusion === "success" ? chalk.green("✓") :
333
+ r.conclusion === "failure" ? chalk.red("✗") :
334
+ r.status === "in_progress" ? chalk.yellow("●") :
335
+ chalk.dim("○");
336
+ const name = r.name || r.workflow_name || "workflow";
337
+ const branch = r.head_branch ? chalk.dim(` (${r.head_branch})`) : "";
338
+ const time = r.created_at ? timeAgo(r.created_at) : "";
339
+ console.log(` ${statusIcon} ${chalk.bold(name)}${branch} ${chalk.dim(time)}`);
340
+ if (r.head_commit?.message) {
341
+ console.log(chalk.dim(` ${r.head_commit.message.split("\n")[0].slice(0, 72)}`));
342
+ }
343
+ }
344
+ console.log();
345
+ }
346
+ catch (err) {
347
+ spinner.fail(chalk.red(`Failed: ${err.message}`));
348
+ process.exitCode = 1;
349
+ }
350
+ });
351
+ // ─── browse ───────────────────────────────────────────
352
+ repo
353
+ .command("browse")
354
+ .alias("web")
355
+ .description("Open repository in browser")
356
+ .argument("[path]", "File or path to open")
357
+ .option("-b, --branch <branch>", "Branch name")
358
+ .action(async (path, opts) => {
359
+ const { owner, name, branch: currentBranch } = getRepo();
360
+ const branch = opts.branch || currentBranch;
361
+ let url = `https://github.com/${owner}/${name}`;
362
+ if (path)
363
+ url += `/blob/${branch}/${path}`;
364
+ else if (branch !== "main" && branch !== "master")
365
+ url += `/tree/${branch}`;
366
+ openUrl(url);
367
+ console.log(chalk.dim(`Opened ${url}`));
368
+ });
369
+ // ─── clone ────────────────────────────────────────────
370
+ repo
371
+ .command("clone <repo>")
372
+ .description("Clone a GitHub repository")
373
+ .option("-b, --branch <branch>", "Branch to clone")
374
+ .action(async (repoArg, opts) => {
375
+ const fullName = repoArg.includes("/") ? repoArg : `${repoArg}/${repoArg}`;
376
+ const url = `https://github.com/${fullName}.git`;
377
+ const spinner = ora(`Cloning ${chalk.cyan(fullName)}...`).start();
378
+ try {
379
+ const args = ["clone", "--depth", "1"];
380
+ if (opts.branch)
381
+ args.push("--branch", opts.branch);
382
+ args.push(url);
383
+ execFileSync("git", args, { stdio: ["pipe", "pipe", "pipe"] });
384
+ spinner.succeed(`Cloned ${chalk.cyan(fullName)}`);
385
+ }
386
+ catch (err) {
387
+ spinner.fail(chalk.red(`Clone failed: ${err.message}`));
388
+ process.exitCode = 1;
389
+ }
390
+ });
391
+ // ─── diff ─────────────────────────────────────────────
392
+ repo
393
+ .command("diff")
394
+ .description("Show uncommitted changes (git diff)")
395
+ .option("--staged", "Show staged changes only")
396
+ .action(async (opts) => {
397
+ try {
398
+ const args = ["diff"];
399
+ if (opts.staged)
400
+ args.push("--staged");
401
+ args.push("--stat");
402
+ const output = execFileSync("git", args, { cwd: process.cwd(), encoding: "utf-8" });
403
+ if (!output.trim()) {
404
+ console.log(chalk.dim("\n No changes.\n"));
405
+ }
406
+ else {
407
+ console.log(output);
408
+ }
409
+ }
410
+ catch (err) {
411
+ console.error(chalk.red(`Failed: ${err.message}`));
412
+ process.exitCode = 1;
413
+ }
414
+ });
415
+ // ─── stash ────────────────────────────────────────────
416
+ repo
417
+ .command("stash [action]")
418
+ .description("Stash changes (push, pop, list)")
419
+ .action(async (action) => {
420
+ try {
421
+ const args = ["stash"];
422
+ if (action)
423
+ args.push(action);
424
+ const output = execFileSync("git", args, { cwd: process.cwd(), encoding: "utf-8" });
425
+ console.log(output || chalk.dim("Done."));
426
+ }
427
+ catch (err) {
428
+ console.error(chalk.red(`Failed: ${err.message}`));
429
+ process.exitCode = 1;
430
+ }
431
+ });
432
+ }
433
+ //# sourceMappingURL=repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/commands/repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerUsage(program: Command): void;
3
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/commands/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwGpD"}
@@ -0,0 +1,95 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import { api } from "../api.js";
4
+ import { isLoggedIn } from "../config.js";
5
+ import { readContext } from "../context.js";
6
+ export function registerUsage(program) {
7
+ const usage = program
8
+ .command("usage")
9
+ .description("View resource usage and metrics");
10
+ // ── lm usage summary ──
11
+ usage
12
+ .command("summary")
13
+ .description("Show aggregated usage stats for the current service")
14
+ .action(async () => {
15
+ if (!isLoggedIn()) {
16
+ console.error(chalk.red('Not logged in. Run "lm login" first.'));
17
+ process.exitCode = 1;
18
+ return;
19
+ }
20
+ const ctx = readContext();
21
+ const spinner = ora("Fetching usage summary...").start();
22
+ try {
23
+ const { data } = await api(`/api/usage/summary?serviceId=${ctx.serviceId}`);
24
+ spinner.stop();
25
+ console.log(chalk.bold("\n Resource Usage\n"));
26
+ console.log(` ${chalk.bold("CPU")} avg ${fmtCpu(data.avgCpu)} peak ${fmtCpu(data.peakCpu)}`);
27
+ console.log(` ${chalk.bold("Memory")} avg ${fmtMem(data.avgMemory)} peak ${fmtMem(data.peakMemory)}`);
28
+ console.log(` ${chalk.bold("Network In")} ${data.totalNetworkIn.toFixed(1)} MB`);
29
+ console.log(` ${chalk.bold("Network Out")} ${data.totalNetworkOut.toFixed(1)} MB`);
30
+ console.log(` ${chalk.bold("Replicas")} ${data.currentReplicas}`);
31
+ console.log(chalk.bold("\n Deployments\n"));
32
+ console.log(` ${chalk.bold("Total")} ${data.totalDeploys}`);
33
+ console.log(` ${chalk.bold("Success Rate")} ${(data.successRate * 100).toFixed(0)}%`);
34
+ console.log(` ${chalk.bold("Avg Build")} ${data.avgBuildMinutes.toFixed(1)} min`);
35
+ console.log();
36
+ }
37
+ catch (err) {
38
+ spinner.fail(chalk.red(`Failed: ${err instanceof Error ? err.message : "Unknown error"}`));
39
+ process.exitCode = 1;
40
+ }
41
+ });
42
+ // ── lm usage history ──
43
+ usage
44
+ .command("history")
45
+ .description("Show time-series resource snapshots")
46
+ .option("-h, --hours <hours>", "Hours of history", "24")
47
+ .action(async (opts) => {
48
+ if (!isLoggedIn()) {
49
+ console.error(chalk.red('Not logged in. Run "lm login" first.'));
50
+ process.exitCode = 1;
51
+ return;
52
+ }
53
+ const ctx = readContext();
54
+ const spinner = ora("Fetching usage history...").start();
55
+ try {
56
+ const { data } = await api(`/api/usage?serviceId=${ctx.serviceId}&hours=${opts.hours}`);
57
+ spinner.stop();
58
+ if (data.length === 0) {
59
+ console.log(chalk.dim("No usage data available yet."));
60
+ return;
61
+ }
62
+ console.log(chalk.bold(padR("TIME", 22) +
63
+ padR("CPU", 10) +
64
+ padR("MEM", 10) +
65
+ padR("NET IN", 10) +
66
+ padR("NET OUT", 10) +
67
+ "REPLICAS"));
68
+ for (const snap of data) {
69
+ const ts = new Date(snap.timestamp).toLocaleString(undefined, {
70
+ month: "short", day: "numeric", hour: "2-digit", minute: "2-digit",
71
+ });
72
+ console.log(padR(ts, 22) +
73
+ padR(fmtCpu(snap.cpuMillicores), 10) +
74
+ padR(fmtMem(snap.memoryMb), 10) +
75
+ padR(`${snap.networkInMb.toFixed(1)}MB`, 10) +
76
+ padR(`${snap.networkOutMb.toFixed(1)}MB`, 10) +
77
+ String(snap.replicas));
78
+ }
79
+ }
80
+ catch (err) {
81
+ spinner.fail(chalk.red(`Failed: ${err instanceof Error ? err.message : "Unknown error"}`));
82
+ process.exitCode = 1;
83
+ }
84
+ });
85
+ }
86
+ function fmtCpu(m) {
87
+ return m >= 1000 ? `${(m / 1000).toFixed(1)} cores` : `${m}m`;
88
+ }
89
+ function fmtMem(mb) {
90
+ return mb >= 1024 ? `${(mb / 1024).toFixed(1)} GB` : `${mb.toFixed(0)} MB`;
91
+ }
92
+ function padR(s, n) {
93
+ return s + " ".repeat(Math.max(0, n - s.length));
94
+ }
95
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/commands/usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface ConnectorInfo {
2
+ service: string;
3
+ url: string;
4
+ hint: string;
5
+ autoValue?: string;
6
+ }
7
+ export declare function getConnector(envKey: string, appName?: string): ConnectorInfo | null;
8
+ /**
9
+ * Detect required environment variables from .env.example, .env.local.example, or .env
10
+ */
11
+ export declare function detectEnvVars(cwd: string): string[];
12
+ /**
13
+ * Format connector info for CLI display
14
+ */
15
+ export declare function formatConnectorLine(key: string, connector: ConnectorInfo | null): string;
16
+ //# sourceMappingURL=connectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectors.d.ts","sourceRoot":"","sources":["../src/connectors.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0CD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAKnF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BnD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CAQxF"}