@launchmatic/cli 0.3.0 → 0.4.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 (106) hide show
  1. package/README.md +178 -0
  2. package/dist/c.js +14185 -260
  3. package/dist/index.js +25506 -46
  4. package/package.json +37 -36
  5. package/dist/api.d.ts +0 -7
  6. package/dist/api.d.ts.map +0 -1
  7. package/dist/api.js +0 -79
  8. package/dist/api.js.map +0 -1
  9. package/dist/c.d.ts +0 -11
  10. package/dist/c.d.ts.map +0 -1
  11. package/dist/c.js.map +0 -1
  12. package/dist/commands/api-key.d.ts +0 -3
  13. package/dist/commands/api-key.d.ts.map +0 -1
  14. package/dist/commands/api-key.js +0 -89
  15. package/dist/commands/api-key.js.map +0 -1
  16. package/dist/commands/browser.d.ts +0 -3
  17. package/dist/commands/browser.d.ts.map +0 -1
  18. package/dist/commands/browser.js +0 -410
  19. package/dist/commands/browser.js.map +0 -1
  20. package/dist/commands/db.d.ts +0 -3
  21. package/dist/commands/db.d.ts.map +0 -1
  22. package/dist/commands/db.js +0 -481
  23. package/dist/commands/db.js.map +0 -1
  24. package/dist/commands/deploy.d.ts +0 -3
  25. package/dist/commands/deploy.d.ts.map +0 -1
  26. package/dist/commands/deploy.js +0 -219
  27. package/dist/commands/deploy.js.map +0 -1
  28. package/dist/commands/deployments.d.ts +0 -3
  29. package/dist/commands/deployments.d.ts.map +0 -1
  30. package/dist/commands/deployments.js +0 -158
  31. package/dist/commands/deployments.js.map +0 -1
  32. package/dist/commands/destroy.d.ts +0 -3
  33. package/dist/commands/destroy.d.ts.map +0 -1
  34. package/dist/commands/destroy.js +0 -53
  35. package/dist/commands/destroy.js.map +0 -1
  36. package/dist/commands/doctor.d.ts +0 -3
  37. package/dist/commands/doctor.d.ts.map +0 -1
  38. package/dist/commands/doctor.js +0 -160
  39. package/dist/commands/doctor.js.map +0 -1
  40. package/dist/commands/domains.d.ts +0 -3
  41. package/dist/commands/domains.d.ts.map +0 -1
  42. package/dist/commands/domains.js +0 -38
  43. package/dist/commands/domains.js.map +0 -1
  44. package/dist/commands/env.d.ts +0 -3
  45. package/dist/commands/env.d.ts.map +0 -1
  46. package/dist/commands/env.js +0 -74
  47. package/dist/commands/env.js.map +0 -1
  48. package/dist/commands/infra.d.ts +0 -3
  49. package/dist/commands/infra.d.ts.map +0 -1
  50. package/dist/commands/infra.js +0 -193
  51. package/dist/commands/infra.js.map +0 -1
  52. package/dist/commands/init.d.ts +0 -3
  53. package/dist/commands/init.d.ts.map +0 -1
  54. package/dist/commands/init.js +0 -239
  55. package/dist/commands/init.js.map +0 -1
  56. package/dist/commands/lightspeed.d.ts +0 -3
  57. package/dist/commands/lightspeed.d.ts.map +0 -1
  58. package/dist/commands/lightspeed.js +0 -175
  59. package/dist/commands/lightspeed.js.map +0 -1
  60. package/dist/commands/login.d.ts +0 -3
  61. package/dist/commands/login.d.ts.map +0 -1
  62. package/dist/commands/login.js +0 -175
  63. package/dist/commands/login.js.map +0 -1
  64. package/dist/commands/logs.d.ts +0 -3
  65. package/dist/commands/logs.d.ts.map +0 -1
  66. package/dist/commands/logs.js +0 -49
  67. package/dist/commands/logs.js.map +0 -1
  68. package/dist/commands/preview.d.ts +0 -3
  69. package/dist/commands/preview.d.ts.map +0 -1
  70. package/dist/commands/preview.js +0 -96
  71. package/dist/commands/preview.js.map +0 -1
  72. package/dist/commands/quicklaunch.d.ts +0 -3
  73. package/dist/commands/quicklaunch.d.ts.map +0 -1
  74. package/dist/commands/quicklaunch.js +0 -452
  75. package/dist/commands/quicklaunch.js.map +0 -1
  76. package/dist/commands/repo.d.ts +0 -3
  77. package/dist/commands/repo.d.ts.map +0 -1
  78. package/dist/commands/repo.js +0 -433
  79. package/dist/commands/repo.js.map +0 -1
  80. package/dist/commands/status.d.ts +0 -3
  81. package/dist/commands/status.d.ts.map +0 -1
  82. package/dist/commands/status.js +0 -77
  83. package/dist/commands/status.js.map +0 -1
  84. package/dist/commands/usage.d.ts +0 -3
  85. package/dist/commands/usage.d.ts.map +0 -1
  86. package/dist/commands/usage.js +0 -95
  87. package/dist/commands/usage.js.map +0 -1
  88. package/dist/config.d.ts +0 -12
  89. package/dist/config.d.ts.map +0 -1
  90. package/dist/config.js +0 -41
  91. package/dist/config.js.map +0 -1
  92. package/dist/connectors.d.ts +0 -16
  93. package/dist/connectors.d.ts.map +0 -1
  94. package/dist/connectors.js +0 -95
  95. package/dist/connectors.js.map +0 -1
  96. package/dist/context.d.ts +0 -10
  97. package/dist/context.d.ts.map +0 -1
  98. package/dist/context.js +0 -32
  99. package/dist/context.js.map +0 -1
  100. package/dist/detect.d.ts +0 -20
  101. package/dist/detect.d.ts.map +0 -1
  102. package/dist/detect.js +0 -281
  103. package/dist/detect.js.map +0 -1
  104. package/dist/index.d.ts +0 -3
  105. package/dist/index.d.ts.map +0 -1
  106. package/dist/index.js.map +0 -1
@@ -1,3 +0,0 @@
1
- import { Command } from "commander";
2
- export declare function registerLightspeed(program: Command): void;
3
- //# sourceMappingURL=lightspeed.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lightspeed.d.ts","sourceRoot":"","sources":["../../src/commands/lightspeed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmDpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwMzD"}
@@ -1,175 +0,0 @@
1
- import readline from "node:readline";
2
- import chalk from "chalk";
3
- import ora from "ora";
4
- import { api } from "../api.js";
5
- import { isLoggedIn } from "../config.js";
6
- import { readContext } from "../context.js";
7
- /** Strip control characters, excessive whitespace, and cap length */
8
- function sanitizePrompt(raw) {
9
- return raw
10
- .replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, "")
11
- .replace(/\r\n?/g, "\n")
12
- .replace(/\n{3,}/g, "\n\n")
13
- .replace(/[^\S\n]{2,}/g, " ")
14
- .trim()
15
- .slice(0, 5000);
16
- }
17
- function prompt(question) {
18
- const rl = readline.createInterface({
19
- input: process.stdin,
20
- output: process.stdout,
21
- });
22
- return new Promise((resolve) => {
23
- rl.question(question, (answer) => {
24
- rl.close();
25
- resolve(answer.trim());
26
- });
27
- });
28
- }
29
- function confirm(question) {
30
- return prompt(`${question} (y/N) `).then((a) => a.toLowerCase() === "y");
31
- }
32
- export function registerLightspeed(program) {
33
- program
34
- .command("lightspeed")
35
- .alias("c")
36
- .description("Modify your service with AI — describe changes in natural language")
37
- .argument("[prompt...]", "What you want to change")
38
- .action(async (promptWords) => {
39
- if (!isLoggedIn()) {
40
- console.error(chalk.red('Not logged in. Run "lm login" first.'));
41
- process.exitCode = 1;
42
- return;
43
- }
44
- let ctx;
45
- try {
46
- ctx = readContext();
47
- }
48
- catch {
49
- console.error(chalk.red('No .launchmatic.json found. Run "lm init" first.'));
50
- process.exitCode = 1;
51
- return;
52
- }
53
- // Get prompt from args or interactively
54
- let userPrompt = sanitizePrompt(promptWords.join(" "));
55
- if (!userPrompt) {
56
- console.log(chalk.bold.cyan("⚡ Lightspeed") +
57
- chalk.dim(" — describe what you want to change\n"));
58
- userPrompt = sanitizePrompt(await prompt(chalk.cyan("→ ")));
59
- }
60
- if (!userPrompt || userPrompt.length < 10) {
61
- console.error(chalk.red("Prompt too short. Describe your change in at least 10 characters."));
62
- process.exitCode = 1;
63
- return;
64
- }
65
- // Step 1: Generate modification plan
66
- const planSpinner = ora("Analyzing repository and planning changes...").start();
67
- let generationId;
68
- let plan;
69
- let existingFileCount;
70
- let complexity;
71
- try {
72
- const res = await api("/api/lightspeed/modify", {
73
- method: "POST",
74
- body: JSON.stringify({
75
- serviceId: ctx.serviceId,
76
- prompt: userPrompt,
77
- }),
78
- });
79
- if (!res.success || !res.data) {
80
- throw new Error(res.error || "Failed to generate plan");
81
- }
82
- generationId = res.data.generationId;
83
- plan = res.data.plan;
84
- existingFileCount = res.data.existingFileCount;
85
- complexity = res.data.complexity;
86
- planSpinner.succeed("Modification plan ready");
87
- }
88
- catch (err) {
89
- if (err.message?.includes("REPO_PERMISSION_DENIED")) {
90
- planSpinner.fail(chalk.red("No push access to repository. Re-authorize with GitHub."));
91
- }
92
- else {
93
- planSpinner.fail(chalk.red(`Plan failed: ${err.message}`));
94
- }
95
- process.exitCode = 1;
96
- return;
97
- }
98
- // Step 2: Display the plan
99
- console.log();
100
- console.log(chalk.bold.cyan(" Plan: ") + chalk.white(plan.summary));
101
- console.log(chalk.dim(` ${existingFileCount} files in repo\n`));
102
- if (plan.filesToModify.length > 0) {
103
- console.log(chalk.yellow(` ✏️ Modify (${plan.filesToModify.length}):`));
104
- for (const f of plan.filesToModify) {
105
- console.log(chalk.yellow(` ${f}`));
106
- }
107
- }
108
- if (plan.filesToCreate.length > 0) {
109
- console.log(chalk.green(` + Create (${plan.filesToCreate.length}):`));
110
- for (const f of plan.filesToCreate) {
111
- console.log(chalk.green(` ${f}`));
112
- }
113
- }
114
- if (plan.filesToDelete.length > 0) {
115
- console.log(chalk.red(` ✕ Delete (${plan.filesToDelete.length}):`));
116
- for (const f of plan.filesToDelete) {
117
- console.log(chalk.red(` ${f}`));
118
- }
119
- }
120
- if (plan.description) {
121
- console.log();
122
- console.log(chalk.dim(` ${plan.description}`));
123
- }
124
- console.log();
125
- // Subtle upgrade tease for complex modifications on free tier
126
- if (complexity?.requiresUpgrade) {
127
- console.log(chalk.yellow(" ✨ Great plan! ") +
128
- chalk.dim("This modification involves "));
129
- for (const reason of complexity.reasons) {
130
- console.log(chalk.dim(` · ${reason}`));
131
- }
132
- console.log();
133
- console.log(chalk.yellow(" ⚡ ") +
134
- chalk.white("Upgrade to ") +
135
- chalk.bold.cyan("Pro") +
136
- chalk.white(" to apply these changes → ") +
137
- chalk.cyan.underline("launchmatic.io/pricing"));
138
- console.log();
139
- return;
140
- }
141
- // Step 3: Confirm
142
- const shouldApply = await confirm(chalk.cyan(" Apply these changes and redeploy?"));
143
- if (!shouldApply) {
144
- console.log(chalk.dim(" Cancelled."));
145
- return;
146
- }
147
- // Step 4: Apply modifications
148
- const applySpinner = ora("Generating modified code...").start();
149
- try {
150
- const res = await api("/api/lightspeed/modify/apply", {
151
- method: "POST",
152
- body: JSON.stringify({ generationId }),
153
- });
154
- if (!res.success || !res.data) {
155
- throw new Error(res.error || "Failed to apply modifications");
156
- }
157
- applySpinner.succeed("Changes committed and deploy triggered");
158
- console.log();
159
- console.log(chalk.green(" ✓ ") +
160
- chalk.bold("Commit: ") +
161
- chalk.cyan(res.data.commitUrl));
162
- console.log(chalk.green(" ✓ ") +
163
- chalk.bold("Deploy: ") +
164
- chalk.dim(`deployment ${res.data.deploymentId}`));
165
- console.log();
166
- console.log(chalk.dim(' Run "lm logs" to watch the deployment.'));
167
- }
168
- catch (err) {
169
- applySpinner.fail(chalk.red(`Apply failed: ${err.message}`));
170
- process.exitCode = 1;
171
- return;
172
- }
173
- });
174
- }
175
- //# sourceMappingURL=lightspeed.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lightspeed.js","sourceRoot":"","sources":["../../src/commands/lightspeed.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { Command } from "commander";
2
- export declare function registerLogin(program: Command): void;
3
- //# sourceMappingURL=login.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsDpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyDpD"}
@@ -1,175 +0,0 @@
1
- import http from "node:http";
2
- import { createInterface } from "node:readline";
3
- import chalk from "chalk";
4
- import open from "open";
5
- import { getApiUrl, setTokens, setUsername, setApiUrl } from "../config.js";
6
- import { api } from "../api.js";
7
- function authPage(success, error) {
8
- const icon = success
9
- ? `<svg width="48" height="48" viewBox="0 0 48 48" fill="none"><circle cx="24" cy="24" r="24" fill="#0D0D0D"/><circle cx="24" cy="24" r="23" stroke="#1A1A1A" stroke-width="2"/><path d="M16 24l6 6 12-12" stroke="#C8E0FF" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`
10
- : `<svg width="48" height="48" viewBox="0 0 48 48" fill="none"><circle cx="24" cy="24" r="24" fill="#0D0D0D"/><circle cx="24" cy="24" r="23" stroke="#1A1A1A" stroke-width="2"/><path d="M18 18l12 12M30 18L18 30" stroke="#FF6B6B" stroke-width="2.5" stroke-linecap="round"/></svg>`;
11
- const title = success ? "Authentication Successful" : "Authentication Failed";
12
- const subtitle = success
13
- ? "You can close this tab and return to the terminal."
14
- : error || "Something went wrong. Please try again.";
15
- const subtitleColor = success ? "#888" : "#FF6B6B";
16
- return `<!DOCTYPE html>
17
- <html lang="en">
18
- <head>
19
- <meta charset="utf-8">
20
- <meta name="viewport" content="width=device-width, initial-scale=1">
21
- <title>${title} — Launchmatic</title>
22
- <style>
23
- *{margin:0;padding:0;box-sizing:border-box}
24
- body{background:#050505;color:#E8E4DD;font-family:'Segoe UI',system-ui,-apple-system,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;overflow:hidden}
25
- .card{background:#0D0D0D;border:1px solid #1A1A1A;border-radius:16px;padding:48px;max-width:420px;width:90%;text-align:center;animation:fade-in .5s ease}
26
- .icon{margin-bottom:24px}
27
- .logo{display:flex;align-items:center;justify-content:center;gap:8px;margin-bottom:32px;font-size:15px;font-weight:600;letter-spacing:-.01em;color:#E8E4DD}
28
- .logo svg{flex-shrink:0}
29
- h1{font-size:20px;font-weight:600;margin-bottom:8px;color:#E8E4DD;letter-spacing:-.02em}
30
- p{font-size:14px;color:${subtitleColor};line-height:1.5}
31
- .divider{height:1px;background:#1A1A1A;margin:24px 0}
32
- .hint{font-size:12px;color:#555}
33
- .hint kbd{background:#1A1A1A;border:1px solid #2A2A2A;border-radius:4px;padding:1px 6px;font-family:'Space Mono',monospace;font-size:11px;color:#888}
34
- @keyframes fade-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
35
- </style>
36
- </head>
37
- <body>
38
- <div class="card">
39
- <div class="logo">
40
- <svg width="24" height="24" viewBox="0 0 52 36" fill="none"><polygon points="44,18 8,6 13,18 8,30" stroke="#C8E0FF" stroke-width="2.5" fill="none"/></svg>
41
- Launchmatic
42
- </div>
43
- <div class="icon">${icon}</div>
44
- <h1>${title}</h1>
45
- <p>${subtitle}</p>
46
- ${success ? `<div class="divider"></div><p class="hint">Run <kbd>lm deploy</kbd> to get started</p>` : ""}
47
- </div>
48
- </body>
49
- </html>`;
50
- }
51
- export function registerLogin(program) {
52
- program
53
- .command("login")
54
- .description("Authenticate with your Launchmatic account")
55
- .option("--api-url <url>", "Override API URL")
56
- .option("--callback-url <url>", "Manually provide the callback URL with tokens (skip browser flow)")
57
- .action(async (opts) => {
58
- if (opts.apiUrl) {
59
- setApiUrl(opts.apiUrl);
60
- }
61
- const apiUrl = getApiUrl();
62
- console.log(chalk.dim(`API: ${apiUrl}`));
63
- try {
64
- let accessToken;
65
- let refreshToken;
66
- if (opts.callbackUrl) {
67
- // Manual token extraction from pasted callback URL
68
- const url = new URL(opts.callbackUrl);
69
- const at = url.searchParams.get("access_token");
70
- const rt = url.searchParams.get("refresh_token");
71
- if (!at || !rt) {
72
- console.error(chalk.red("Callback URL missing access_token or refresh_token"));
73
- process.exitCode = 1;
74
- return;
75
- }
76
- accessToken = at;
77
- refreshToken = rt;
78
- }
79
- else {
80
- const result = await waitForOAuth(apiUrl);
81
- accessToken = result.accessToken;
82
- refreshToken = result.refreshToken;
83
- }
84
- setTokens(accessToken, refreshToken);
85
- // Fetch user info
86
- const { data } = await api("/auth/me");
87
- setUsername(data.username);
88
- console.log(chalk.green(`\n✓ Authenticated as ${chalk.bold(data.username)}`));
89
- }
90
- catch (err) {
91
- console.error(chalk.red(`Login failed: ${err instanceof Error ? err.message : "Unknown error"}`));
92
- process.exitCode = 1;
93
- }
94
- });
95
- }
96
- function waitForOAuth(apiUrl) {
97
- return new Promise((resolve, reject) => {
98
- let settled = false;
99
- function settle() {
100
- if (settled)
101
- return false;
102
- settled = true;
103
- rl.close();
104
- // Unref stdin so it doesn't keep the process alive
105
- process.stdin.unref();
106
- server.close();
107
- server.unref();
108
- return true;
109
- }
110
- const server = http.createServer((req, res) => {
111
- const url = new URL(req.url, `http://localhost`);
112
- if (url.pathname === "/callback") {
113
- const accessToken = url.searchParams.get("access_token");
114
- const refreshToken = url.searchParams.get("refresh_token");
115
- if (accessToken && refreshToken) {
116
- res.writeHead(200, { "Content-Type": "text/html" });
117
- res.end(authPage(true), () => {
118
- if (settle()) {
119
- resolve({ accessToken, refreshToken });
120
- }
121
- });
122
- }
123
- else {
124
- const error = url.searchParams.get("error") || "Missing tokens";
125
- res.writeHead(400, { "Content-Type": "text/html" });
126
- res.end(authPage(false, error), () => {
127
- if (settle()) {
128
- reject(new Error(error));
129
- }
130
- });
131
- }
132
- }
133
- });
134
- // Readline for manual paste fallback
135
- const rl = createInterface({ input: process.stdin, terminal: false });
136
- rl.on("line", (line) => {
137
- const trimmed = line.trim();
138
- if (!trimmed || settled)
139
- return;
140
- try {
141
- const pastedUrl = new URL(trimmed);
142
- const at = pastedUrl.searchParams.get("access_token");
143
- const rt = pastedUrl.searchParams.get("refresh_token");
144
- if (at && rt) {
145
- if (settle()) {
146
- resolve({ accessToken: at, refreshToken: rt });
147
- }
148
- }
149
- }
150
- catch {
151
- // not a valid URL, ignore
152
- }
153
- });
154
- server.listen(0, "127.0.0.1", () => {
155
- const address = server.address();
156
- if (!address || typeof address === "string") {
157
- reject(new Error("Failed to start local server"));
158
- return;
159
- }
160
- const callbackUrl = `http://127.0.0.1:${address.port}/callback`;
161
- const authUrl = `${apiUrl}/auth/github?cli_redirect=${encodeURIComponent(callbackUrl)}`;
162
- console.log(chalk.cyan("\n⏳ Waiting for browser authentication...\n"));
163
- console.log(chalk.dim(`Auth URL: ${authUrl}\n`));
164
- console.log(chalk.dim(`Paste the callback URL here if the browser redirect doesn't work:\n`));
165
- open(authUrl);
166
- });
167
- // Timeout after 5 minutes
168
- setTimeout(() => {
169
- if (settle()) {
170
- reject(new Error("Authentication timed out"));
171
- }
172
- }, 5 * 60 * 1000).unref();
173
- });
174
- }
175
- //# sourceMappingURL=login.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,SAAS,QAAQ,CAAC,OAAgB,EAAE,KAAc;IAChD,MAAM,IAAI,GAAG,OAAO;QAClB,CAAC,CAAC,oSAAoS;QACtS,CAAC,CAAC,oRAAoR,CAAC;IACzR,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,uBAAuB,CAAC;IAC9E,MAAM,QAAQ,GAAG,OAAO;QACtB,CAAC,CAAC,oDAAoD;QACtD,CAAC,CAAC,KAAK,IAAI,yCAAyC,CAAC;IACvD,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAEnD,OAAO;;;;;WAKE,KAAK;;;;;;;;;6BASa,aAAa;;;;;;;;;;;;;wBAalB,IAAI;UAClB,KAAK;SACN,QAAQ;MACX,OAAO,CAAC,CAAC,CAAC,wFAAwF,CAAC,CAAC,CAAC,EAAE;;;QAGrG,CAAC;AACT,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;SAC7C,MAAM,CAAC,sBAAsB,EAAE,mEAAmE,CAAC;SACnG,MAAM,CAAC,KAAK,EAAE,IAA+C,EAAE,EAAE;QAChE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC;QAEzC,IAAI,CAAC;YACH,IAAI,WAAmB,CAAC;YACxB,IAAI,YAAoB,CAAC;YAEzB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,mDAAmD;gBACnD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACtC,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBAChD,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBACjD,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAC;oBAC/E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;gBACD,WAAW,GAAG,EAAE,CAAC;gBACjB,YAAY,GAAG,EAAE,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC1C,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;gBACjC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;YACrC,CAAC;YAED,SAAS,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAErC,kBAAkB;YAClB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAGvB,UAAU,CAAC,CAAC;YAEf,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,wBAAwB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CACjE,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACxE,CACF,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,YAAY,CACnB,MAAc;IAEd,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,SAAS,MAAM;YACb,IAAI,OAAO;gBAAE,OAAO,KAAK,CAAC;YAC1B,OAAO,GAAG,IAAI,CAAC;YACf,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,mDAAmD;YACnD,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAI,EAAE,kBAAkB,CAAC,CAAC;YAElD,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACjC,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACzD,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAE3D,IAAI,WAAW,IAAI,YAAY,EAAE,CAAC;oBAChC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;oBACpD,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE;wBAC3B,IAAI,MAAM,EAAE,EAAE,CAAC;4BACb,OAAO,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;wBACzC,CAAC;oBACH,CAAC,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC;oBAChE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;oBACpD,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE;wBACnC,IAAI,MAAM,EAAE,EAAE,CAAC;4BACb,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;wBAC3B,CAAC;oBACH,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,qCAAqC;QACrC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACtE,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,IAAI,OAAO;gBAAE,OAAO;YAChC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;gBACnC,MAAM,EAAE,GAAG,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACtD,MAAM,EAAE,GAAG,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBACvD,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;oBACb,IAAI,MAAM,EAAE,EAAE,CAAC;wBACb,OAAO,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;oBACjD,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GAAG,oBAAoB,OAAO,CAAC,IAAI,WAAW,CAAC;YAChE,MAAM,OAAO,GAAG,GAAG,MAAM,6BAA6B,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;YAExF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,OAAO,IAAI,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,qEAAqE,CACtE,CACF,CAAC;YAEF,IAAI,CAAC,OAAO,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,MAAM,EAAE,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAChD,CAAC;QACH,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,3 +0,0 @@
1
- import { Command } from "commander";
2
- export declare function registerLogs(program: Command): void;
3
- //# sourceMappingURL=logs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsDnD"}
@@ -1,49 +0,0 @@
1
- import chalk from "chalk";
2
- import WebSocket from "ws";
3
- import { getWsToken } from "../api.js";
4
- import { isLoggedIn, getApiUrl } from "../config.js";
5
- import { readContext } from "../context.js";
6
- export function registerLogs(program) {
7
- program
8
- .command("logs")
9
- .description("Stream live logs from a deployment")
10
- .action(async () => {
11
- if (!isLoggedIn()) {
12
- console.error(chalk.red('Not logged in. Run "lm login" first.'));
13
- process.exitCode = 1;
14
- return;
15
- }
16
- const ctx = readContext();
17
- const apiUrl = getApiUrl();
18
- const wsUrl = apiUrl.replace(/^http/, "ws");
19
- const wsToken = await getWsToken();
20
- console.log(chalk.dim("Streaming logs (Ctrl+C to stop)...\n"));
21
- const ws = new WebSocket(`${wsUrl}/ws/runtime-logs/${ctx.serviceId}?token=${wsToken}`);
22
- ws.on("message", (data) => {
23
- const msg = data.toString();
24
- try {
25
- const parsed = JSON.parse(msg);
26
- const ts = parsed.timestamp
27
- ? chalk.dim(`[${new Date(parsed.timestamp).toLocaleTimeString()}]`)
28
- : "";
29
- const line = parsed.message || parsed.line || msg;
30
- console.log(`${ts} ${line}`);
31
- }
32
- catch {
33
- console.log(msg);
34
- }
35
- });
36
- ws.on("error", (err) => {
37
- console.error(chalk.red(`WebSocket error: ${err.message}`));
38
- process.exitCode = 1;
39
- });
40
- ws.on("close", () => {
41
- console.log(chalk.dim("\nLog stream ended."));
42
- });
43
- // Handle Ctrl+C gracefully
44
- process.on("SIGINT", () => {
45
- ws.close();
46
- });
47
- });
48
- }
49
- //# sourceMappingURL=logs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;QAEnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;QAE/D,MAAM,EAAE,GAAG,IAAI,SAAS,CACtB,GAAG,KAAK,oBAAoB,GAAG,CAAC,SAAS,UAAU,OAAO,EAAE,CAC7D,CAAC;QAEF,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAI5B,CAAC;gBACF,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS;oBACzB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,GAAG,CAAC;oBACnE,CAAC,CAAC,EAAE,CAAC;gBACP,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACrB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,2BAA2B;QAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,3 +0,0 @@
1
- import { Command } from "commander";
2
- export declare function registerPreview(program: Command): void;
3
- //# sourceMappingURL=preview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuHtD"}
@@ -1,96 +0,0 @@
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 registerPreview(program) {
7
- const preview = program
8
- .command("preview")
9
- .description("Manage preview environments");
10
- // ── lm preview list ──
11
- preview
12
- .command("list")
13
- .alias("ls")
14
- .description("List preview environments for the current service")
15
- .action(async () => {
16
- if (!isLoggedIn()) {
17
- console.error(chalk.red('Not logged in. Run "lm login" first.'));
18
- process.exitCode = 1;
19
- return;
20
- }
21
- const ctx = readContext();
22
- const spinner = ora("Fetching previews...").start();
23
- try {
24
- const { data } = await api(`/api/previews?serviceId=${ctx.serviceId}`);
25
- spinner.stop();
26
- if (data.length === 0) {
27
- console.log(chalk.dim("No preview environments."));
28
- return;
29
- }
30
- for (const p of data) {
31
- const statusColor = p.status === "ACTIVE" ? chalk.green : chalk.dim;
32
- const pr = p.prNumber ? chalk.dim(` PR #${p.prNumber}`) : "";
33
- const lastDeploy = p.deployments[0];
34
- const deployStatus = lastDeploy
35
- ? chalk.dim(` (${lastDeploy.status.toLowerCase()})`)
36
- : "";
37
- console.log(`${statusColor("●")} ${chalk.bold(p.branch)}${pr}${deployStatus}`);
38
- console.log(` ${chalk.cyan(`https://${p.subdomain}`)} ${chalk.dim(p.id)}`);
39
- console.log(chalk.dim(` Created ${new Date(p.createdAt).toLocaleDateString()}` +
40
- ` Expires ${new Date(p.expiresAt).toLocaleDateString()}`));
41
- console.log();
42
- }
43
- }
44
- catch (err) {
45
- spinner.fail(chalk.red(`Failed: ${err instanceof Error ? err.message : "Unknown error"}`));
46
- process.exitCode = 1;
47
- }
48
- });
49
- // ── lm preview create ──
50
- preview
51
- .command("create <branch>")
52
- .description("Create a preview environment for a branch")
53
- .action(async (branch) => {
54
- if (!isLoggedIn()) {
55
- console.error(chalk.red('Not logged in. Run "lm login" first.'));
56
- process.exitCode = 1;
57
- return;
58
- }
59
- const ctx = readContext();
60
- const spinner = ora(`Creating preview for ${branch}...`).start();
61
- try {
62
- const { data } = await api("/api/previews", {
63
- method: "POST",
64
- body: JSON.stringify({ serviceId: ctx.serviceId, branch }),
65
- });
66
- spinner.succeed(`Preview created → ${chalk.bold.cyan(`https://${data.preview.subdomain}`)}`);
67
- console.log(chalk.dim(` Deployment ${data.deployment.id} (${data.deployment.status})`));
68
- }
69
- catch (err) {
70
- spinner.fail(chalk.red(`Failed: ${err instanceof Error ? err.message : "Unknown error"}`));
71
- process.exitCode = 1;
72
- }
73
- });
74
- // ── lm preview delete ──
75
- preview
76
- .command("delete <previewId>")
77
- .alias("rm")
78
- .description("Delete a preview environment")
79
- .action(async (previewId) => {
80
- if (!isLoggedIn()) {
81
- console.error(chalk.red('Not logged in. Run "lm login" first.'));
82
- process.exitCode = 1;
83
- return;
84
- }
85
- const spinner = ora("Deleting preview...").start();
86
- try {
87
- await api(`/api/previews/${previewId}`, { method: "DELETE" });
88
- spinner.succeed("Preview deleted");
89
- }
90
- catch (err) {
91
- spinner.fail(chalk.red(`Failed: ${err instanceof Error ? err.message : "Unknown error"}`));
92
- process.exitCode = 1;
93
- }
94
- });
95
- }
96
- //# sourceMappingURL=preview.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { Command } from "commander";
2
- export declare function registerQuicklaunch(program: Command): void;
3
- //# sourceMappingURL=quicklaunch.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"quicklaunch.d.ts","sourceRoot":"","sources":["../../src/commands/quicklaunch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmCpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgc1D"}