@launchmatic/cli 0.2.0 → 0.3.1

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 (65) hide show
  1. package/dist/c.js +14185 -250
  2. package/dist/index.js +25203 -28
  3. package/package.json +37 -34
  4. package/dist/api.d.ts +0 -2
  5. package/dist/api.d.ts.map +0 -1
  6. package/dist/api.js +0 -70
  7. package/dist/api.js.map +0 -1
  8. package/dist/c.d.ts +0 -11
  9. package/dist/c.d.ts.map +0 -1
  10. package/dist/c.js.map +0 -1
  11. package/dist/commands/deploy.d.ts +0 -3
  12. package/dist/commands/deploy.d.ts.map +0 -1
  13. package/dist/commands/deploy.js +0 -217
  14. package/dist/commands/deploy.js.map +0 -1
  15. package/dist/commands/destroy.d.ts +0 -3
  16. package/dist/commands/destroy.d.ts.map +0 -1
  17. package/dist/commands/destroy.js +0 -53
  18. package/dist/commands/destroy.js.map +0 -1
  19. package/dist/commands/domains.d.ts +0 -3
  20. package/dist/commands/domains.d.ts.map +0 -1
  21. package/dist/commands/domains.js +0 -38
  22. package/dist/commands/domains.js.map +0 -1
  23. package/dist/commands/env.d.ts +0 -3
  24. package/dist/commands/env.d.ts.map +0 -1
  25. package/dist/commands/env.js +0 -74
  26. package/dist/commands/env.js.map +0 -1
  27. package/dist/commands/init.d.ts +0 -3
  28. package/dist/commands/init.d.ts.map +0 -1
  29. package/dist/commands/init.js +0 -201
  30. package/dist/commands/init.js.map +0 -1
  31. package/dist/commands/lightspeed.d.ts +0 -3
  32. package/dist/commands/lightspeed.d.ts.map +0 -1
  33. package/dist/commands/lightspeed.js +0 -165
  34. package/dist/commands/lightspeed.js.map +0 -1
  35. package/dist/commands/login.d.ts +0 -3
  36. package/dist/commands/login.d.ts.map +0 -1
  37. package/dist/commands/login.js +0 -131
  38. package/dist/commands/login.js.map +0 -1
  39. package/dist/commands/logs.d.ts +0 -3
  40. package/dist/commands/logs.d.ts.map +0 -1
  41. package/dist/commands/logs.js +0 -48
  42. package/dist/commands/logs.js.map +0 -1
  43. package/dist/commands/quicklaunch.d.ts +0 -3
  44. package/dist/commands/quicklaunch.d.ts.map +0 -1
  45. package/dist/commands/quicklaunch.js +0 -324
  46. package/dist/commands/quicklaunch.js.map +0 -1
  47. package/dist/commands/status.d.ts +0 -3
  48. package/dist/commands/status.d.ts.map +0 -1
  49. package/dist/commands/status.js +0 -77
  50. package/dist/commands/status.js.map +0 -1
  51. package/dist/config.d.ts +0 -12
  52. package/dist/config.d.ts.map +0 -1
  53. package/dist/config.js +0 -41
  54. package/dist/config.js.map +0 -1
  55. package/dist/context.d.ts +0 -10
  56. package/dist/context.d.ts.map +0 -1
  57. package/dist/context.js +0 -27
  58. package/dist/context.js.map +0 -1
  59. package/dist/detect.d.ts +0 -20
  60. package/dist/detect.d.ts.map +0 -1
  61. package/dist/detect.js +0 -281
  62. package/dist/detect.js.map +0 -1
  63. package/dist/index.d.ts +0 -3
  64. package/dist/index.d.ts.map +0 -1
  65. package/dist/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { Command } from "commander";
2
- export declare function registerInit(program: Command): void;
3
- //# sourceMappingURL=init.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+NnD"}
@@ -1,201 +0,0 @@
1
- import readline from "node:readline";
2
- import { execFileSync } from "node:child_process";
3
- import chalk from "chalk";
4
- import ora from "ora";
5
- import { api } from "../api.js";
6
- import { isLoggedIn } from "../config.js";
7
- import { contextExists, writeContext } from "../context.js";
8
- import { detectLocal, getGitInfo } from "../detect.js";
9
- function toSlug(name) {
10
- return name
11
- .toLowerCase()
12
- .replace(/[^a-z0-9]+/g, "-")
13
- .replace(/^-|-$/g, "");
14
- }
15
- export function registerInit(program) {
16
- program
17
- .command("init")
18
- .description("Initialize a project in the current directory")
19
- .action(async () => {
20
- if (!isLoggedIn()) {
21
- console.error(chalk.red('Not logged in. Run "lm login" first.'));
22
- process.exitCode = 1;
23
- return;
24
- }
25
- if (contextExists()) {
26
- console.error(chalk.red(".launchmatic.json already exists. Remove it to re-initialize."));
27
- process.exitCode = 1;
28
- return;
29
- }
30
- try {
31
- // 1. Local detection (before any network calls)
32
- const detection = detectLocal(process.cwd());
33
- const gitInfo = getGitInfo(process.cwd());
34
- // Display detection results
35
- const runtimeLabel = detection.framework
36
- ? `${detection.runtime} (${detection.framework})`
37
- : detection.runtime;
38
- console.log(chalk.dim("\nDetected:"));
39
- console.log(chalk.dim(` Runtime: ${runtimeLabel}`));
40
- if (detection.buildCmd)
41
- console.log(chalk.dim(` Build: ${detection.buildCmd}`));
42
- if (detection.startCmd)
43
- console.log(chalk.dim(` Start: ${detection.startCmd}`));
44
- console.log(chalk.dim(` Port: ${detection.port}`));
45
- if (gitInfo.repoOwner && gitInfo.repoName) {
46
- console.log(chalk.dim(` Repo: ${gitInfo.repoOwner}/${gitInfo.repoName} @ ${gitInfo.repoBranch}`));
47
- }
48
- if (detection.confidence === "low") {
49
- console.log(chalk.yellow("\n Runtime detection uncertain — builder will re-detect at build time"));
50
- }
51
- console.log();
52
- // 2. Select team
53
- const spinner = ora("Fetching teams...").start();
54
- const { data: teams } = await api("/api/teams");
55
- spinner.stop();
56
- let teamId;
57
- if (teams.length === 1) {
58
- teamId = teams[0].id;
59
- console.log(chalk.dim(`Team: ${teams[0].name}`));
60
- }
61
- else {
62
- console.log("\nSelect a team:");
63
- teams.forEach((t, i) => console.log(` ${i + 1}. ${t.name}`));
64
- const choice = await prompt(`Enter number (1-${teams.length}): `);
65
- const idx = parseInt(choice, 10) - 1;
66
- if (idx < 0 || idx >= teams.length) {
67
- console.error(chalk.red("Invalid selection."));
68
- process.exitCode = 1;
69
- return;
70
- }
71
- teamId = teams[idx].id;
72
- }
73
- // 3. Select or create project
74
- const projSpinner = ora("Fetching projects...").start();
75
- const { data: projects } = await api(`/api/projects?teamId=${teamId}`);
76
- projSpinner.stop();
77
- let projectId;
78
- let projectName;
79
- if (projects.length > 0) {
80
- console.log("\nSelect a project or create new:");
81
- projects.forEach((p, i) => console.log(` ${i + 1}. ${p.name}`));
82
- console.log(` ${projects.length + 1}. Create new project`);
83
- const choice = await prompt(`Enter number (1-${projects.length + 1}): `);
84
- const idx = parseInt(choice, 10) - 1;
85
- if (idx === projects.length) {
86
- // Create new
87
- const name = await prompt("Project name: ");
88
- const slug = toSlug(name);
89
- const { data: project } = await api("/api/projects", {
90
- method: "POST",
91
- body: JSON.stringify({ name, slug, teamId }),
92
- });
93
- projectId = project.id;
94
- projectName = project.name;
95
- }
96
- else if (idx >= 0 && idx < projects.length) {
97
- projectId = projects[idx].id;
98
- projectName = projects[idx].name;
99
- }
100
- else {
101
- console.error(chalk.red("Invalid selection."));
102
- process.exitCode = 1;
103
- return;
104
- }
105
- }
106
- else {
107
- const name = await prompt("Project name: ");
108
- const slug = toSlug(name);
109
- const { data: project } = await api("/api/projects", {
110
- method: "POST",
111
- body: JSON.stringify({ name, slug, teamId }),
112
- });
113
- projectId = project.id;
114
- projectName = project.name;
115
- }
116
- // 4. Create service with all detected fields
117
- const svcSpinner = ora("Creating service...").start();
118
- const serviceName = gitInfo.repoName || projectName;
119
- const servicePayload = {
120
- projectId,
121
- name: serviceName,
122
- slug: toSlug(serviceName),
123
- ...(gitInfo.repoOwner && gitInfo.repoName
124
- ? {
125
- repoOwner: gitInfo.repoOwner,
126
- repoName: gitInfo.repoName,
127
- repoBranch: gitInfo.repoBranch,
128
- }
129
- : {}),
130
- ...(detection.framework
131
- ? { framework: detection.framework }
132
- : {}),
133
- ...(detection.buildCmd ? { buildCmd: detection.buildCmd } : {}),
134
- ...(detection.startCmd ? { startCmd: detection.startCmd } : {}),
135
- port: detection.port,
136
- };
137
- const { data: service } = await api("/api/services", {
138
- method: "POST",
139
- body: JSON.stringify(servicePayload),
140
- });
141
- svcSpinner.succeed("Service created");
142
- // 4b. Create GitHub repo if no remote exists
143
- if (!gitInfo.hasRemote) {
144
- const repoSpinner = ora("Creating GitHub repository...").start();
145
- try {
146
- const { data: repoData } = await api(`/api/services/${service.id}/create-repo`, {
147
- method: "POST",
148
- body: JSON.stringify({}),
149
- });
150
- // Add the remote to local git
151
- try {
152
- execFileSync("git", ["remote", "add", "origin", repoData.cloneUrl], {
153
- cwd: process.cwd(),
154
- stdio: ["pipe", "pipe", "pipe"],
155
- });
156
- }
157
- catch {
158
- // Remote may already exist with a different URL, try set-url
159
- try {
160
- execFileSync("git", ["remote", "set-url", "origin", repoData.cloneUrl], {
161
- cwd: process.cwd(),
162
- stdio: ["pipe", "pipe", "pipe"],
163
- });
164
- }
165
- catch {
166
- // Not a git repo or other issue — user can set remote manually
167
- }
168
- }
169
- repoSpinner.succeed(`Repository created: ${chalk.dim(repoData.repoFullName)} (private)`);
170
- }
171
- catch (err) {
172
- repoSpinner.warn(`Could not create repo: ${err instanceof Error ? err.message : "Unknown error"} — you can add a repo later`);
173
- }
174
- }
175
- // 5. Write context file
176
- writeContext({
177
- projectId,
178
- serviceId: service.id,
179
- teamId,
180
- });
181
- console.log(chalk.green(`\n✓ Project "${chalk.bold(projectName)}" initialized`));
182
- }
183
- catch (err) {
184
- console.error(chalk.red(`Init failed: ${err instanceof Error ? err.message : "Unknown error"}`));
185
- process.exitCode = 1;
186
- }
187
- });
188
- }
189
- function prompt(question) {
190
- const rl = readline.createInterface({
191
- input: process.stdin,
192
- output: process.stdout,
193
- });
194
- return new Promise((resolve) => {
195
- rl.question(question, (answer) => {
196
- rl.close();
197
- resolve(answer.trim());
198
- });
199
- });
200
- }
201
- //# sourceMappingURL=init.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -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;AAwCpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwMzD"}
@@ -1,165 +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
- function prompt(question) {
8
- const rl = readline.createInterface({
9
- input: process.stdin,
10
- output: process.stdout,
11
- });
12
- return new Promise((resolve) => {
13
- rl.question(question, (answer) => {
14
- rl.close();
15
- resolve(answer.trim());
16
- });
17
- });
18
- }
19
- function confirm(question) {
20
- return prompt(`${question} (y/N) `).then((a) => a.toLowerCase() === "y");
21
- }
22
- export function registerLightspeed(program) {
23
- program
24
- .command("lightspeed")
25
- .alias("c")
26
- .description("Modify your service with AI — describe changes in natural language")
27
- .argument("[prompt...]", "What you want to change")
28
- .action(async (promptWords) => {
29
- if (!isLoggedIn()) {
30
- console.error(chalk.red('Not logged in. Run "lm login" first.'));
31
- process.exitCode = 1;
32
- return;
33
- }
34
- let ctx;
35
- try {
36
- ctx = readContext();
37
- }
38
- catch {
39
- console.error(chalk.red('No .launchmatic.json found. Run "lm init" first.'));
40
- process.exitCode = 1;
41
- return;
42
- }
43
- // Get prompt from args or interactively
44
- let userPrompt = promptWords.join(" ");
45
- if (!userPrompt) {
46
- console.log(chalk.bold.cyan("⚡ Lightspeed") +
47
- chalk.dim(" — describe what you want to change\n"));
48
- userPrompt = await prompt(chalk.cyan("→ "));
49
- }
50
- if (!userPrompt || userPrompt.length < 10) {
51
- console.error(chalk.red("Prompt too short. Describe your change in at least 10 characters."));
52
- process.exitCode = 1;
53
- return;
54
- }
55
- // Step 1: Generate modification plan
56
- const planSpinner = ora("Analyzing repository and planning changes...").start();
57
- let generationId;
58
- let plan;
59
- let existingFileCount;
60
- let complexity;
61
- try {
62
- const res = await api("/api/lightspeed/modify", {
63
- method: "POST",
64
- body: JSON.stringify({
65
- serviceId: ctx.serviceId,
66
- prompt: userPrompt,
67
- }),
68
- });
69
- if (!res.success || !res.data) {
70
- throw new Error(res.error || "Failed to generate plan");
71
- }
72
- generationId = res.data.generationId;
73
- plan = res.data.plan;
74
- existingFileCount = res.data.existingFileCount;
75
- complexity = res.data.complexity;
76
- planSpinner.succeed("Modification plan ready");
77
- }
78
- catch (err) {
79
- if (err.message?.includes("REPO_PERMISSION_DENIED")) {
80
- planSpinner.fail(chalk.red("No push access to repository. Re-authorize with GitHub."));
81
- }
82
- else {
83
- planSpinner.fail(chalk.red(`Plan failed: ${err.message}`));
84
- }
85
- process.exitCode = 1;
86
- return;
87
- }
88
- // Step 2: Display the plan
89
- console.log();
90
- console.log(chalk.bold.cyan(" Plan: ") + chalk.white(plan.summary));
91
- console.log(chalk.dim(` ${existingFileCount} files in repo\n`));
92
- if (plan.filesToModify.length > 0) {
93
- console.log(chalk.yellow(` ✏️ Modify (${plan.filesToModify.length}):`));
94
- for (const f of plan.filesToModify) {
95
- console.log(chalk.yellow(` ${f}`));
96
- }
97
- }
98
- if (plan.filesToCreate.length > 0) {
99
- console.log(chalk.green(` + Create (${plan.filesToCreate.length}):`));
100
- for (const f of plan.filesToCreate) {
101
- console.log(chalk.green(` ${f}`));
102
- }
103
- }
104
- if (plan.filesToDelete.length > 0) {
105
- console.log(chalk.red(` ✕ Delete (${plan.filesToDelete.length}):`));
106
- for (const f of plan.filesToDelete) {
107
- console.log(chalk.red(` ${f}`));
108
- }
109
- }
110
- if (plan.description) {
111
- console.log();
112
- console.log(chalk.dim(` ${plan.description}`));
113
- }
114
- console.log();
115
- // Subtle upgrade tease for complex modifications on free tier
116
- if (complexity?.requiresUpgrade) {
117
- console.log(chalk.yellow(" ✨ Great plan! ") +
118
- chalk.dim("This modification involves "));
119
- for (const reason of complexity.reasons) {
120
- console.log(chalk.dim(` · ${reason}`));
121
- }
122
- console.log();
123
- console.log(chalk.yellow(" ⚡ ") +
124
- chalk.white("Upgrade to ") +
125
- chalk.bold.cyan("Pro") +
126
- chalk.white(" to apply these changes → ") +
127
- chalk.cyan.underline("launchmatic.io/pricing"));
128
- console.log();
129
- return;
130
- }
131
- // Step 3: Confirm
132
- const shouldApply = await confirm(chalk.cyan(" Apply these changes and redeploy?"));
133
- if (!shouldApply) {
134
- console.log(chalk.dim(" Cancelled."));
135
- return;
136
- }
137
- // Step 4: Apply modifications
138
- const applySpinner = ora("Generating modified code...").start();
139
- try {
140
- const res = await api("/api/lightspeed/modify/apply", {
141
- method: "POST",
142
- body: JSON.stringify({ generationId }),
143
- });
144
- if (!res.success || !res.data) {
145
- throw new Error(res.error || "Failed to apply modifications");
146
- }
147
- applySpinner.succeed("Changes committed and deploy triggered");
148
- console.log();
149
- console.log(chalk.green(" ✓ ") +
150
- chalk.bold("Commit: ") +
151
- chalk.cyan(res.data.commitUrl));
152
- console.log(chalk.green(" ✓ ") +
153
- chalk.bold("Deploy: ") +
154
- chalk.dim(`deployment ${res.data.deploymentId}`));
155
- console.log();
156
- console.log(chalk.dim(' Run "lm logs" to watch the deployment.'));
157
- }
158
- catch (err) {
159
- applySpinner.fail(chalk.red(`Apply failed: ${err.message}`));
160
- process.exitCode = 1;
161
- return;
162
- }
163
- });
164
- }
165
- //# 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;AAQpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyDpD"}
@@ -1,131 +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
- export function registerLogin(program) {
8
- program
9
- .command("login")
10
- .description("Authenticate with your Launchmatic account")
11
- .option("--api-url <url>", "Override API URL")
12
- .option("--callback-url <url>", "Manually provide the callback URL with tokens (skip browser flow)")
13
- .action(async (opts) => {
14
- if (opts.apiUrl) {
15
- setApiUrl(opts.apiUrl);
16
- }
17
- const apiUrl = getApiUrl();
18
- console.log(chalk.dim(`API: ${apiUrl}`));
19
- try {
20
- let accessToken;
21
- let refreshToken;
22
- if (opts.callbackUrl) {
23
- // Manual token extraction from pasted callback URL
24
- const url = new URL(opts.callbackUrl);
25
- const at = url.searchParams.get("access_token");
26
- const rt = url.searchParams.get("refresh_token");
27
- if (!at || !rt) {
28
- console.error(chalk.red("Callback URL missing access_token or refresh_token"));
29
- process.exitCode = 1;
30
- return;
31
- }
32
- accessToken = at;
33
- refreshToken = rt;
34
- }
35
- else {
36
- const result = await waitForOAuth(apiUrl);
37
- accessToken = result.accessToken;
38
- refreshToken = result.refreshToken;
39
- }
40
- setTokens(accessToken, refreshToken);
41
- // Fetch user info
42
- const { data } = await api("/auth/me");
43
- setUsername(data.username);
44
- console.log(chalk.green(`\n✓ Authenticated as ${chalk.bold(data.username)}`));
45
- }
46
- catch (err) {
47
- console.error(chalk.red(`Login failed: ${err instanceof Error ? err.message : "Unknown error"}`));
48
- process.exitCode = 1;
49
- }
50
- });
51
- }
52
- function waitForOAuth(apiUrl) {
53
- return new Promise((resolve, reject) => {
54
- let settled = false;
55
- function settle() {
56
- if (settled)
57
- return false;
58
- settled = true;
59
- rl.close();
60
- // Unref stdin so it doesn't keep the process alive
61
- process.stdin.unref();
62
- server.close();
63
- server.unref();
64
- return true;
65
- }
66
- const server = http.createServer((req, res) => {
67
- const url = new URL(req.url, `http://localhost`);
68
- if (url.pathname === "/callback") {
69
- const accessToken = url.searchParams.get("access_token");
70
- const refreshToken = url.searchParams.get("refresh_token");
71
- if (accessToken && refreshToken) {
72
- res.writeHead(200, { "Content-Type": "text/html" });
73
- res.end("<html><body><h2>Authentication successful!</h2><p>You can close this tab and return to the terminal.</p></body></html>", () => {
74
- if (settle()) {
75
- resolve({ accessToken, refreshToken });
76
- }
77
- });
78
- }
79
- else {
80
- const error = url.searchParams.get("error") || "Missing tokens";
81
- res.writeHead(400, { "Content-Type": "text/html" });
82
- res.end(`<html><body><h2>Authentication failed</h2><p>${error}</p></body></html>`, () => {
83
- if (settle()) {
84
- reject(new Error(error));
85
- }
86
- });
87
- }
88
- }
89
- });
90
- // Readline for manual paste fallback
91
- const rl = createInterface({ input: process.stdin, terminal: false });
92
- rl.on("line", (line) => {
93
- const trimmed = line.trim();
94
- if (!trimmed || settled)
95
- return;
96
- try {
97
- const pastedUrl = new URL(trimmed);
98
- const at = pastedUrl.searchParams.get("access_token");
99
- const rt = pastedUrl.searchParams.get("refresh_token");
100
- if (at && rt) {
101
- if (settle()) {
102
- resolve({ accessToken: at, refreshToken: rt });
103
- }
104
- }
105
- }
106
- catch {
107
- // not a valid URL, ignore
108
- }
109
- });
110
- server.listen(0, "127.0.0.1", () => {
111
- const address = server.address();
112
- if (!address || typeof address === "string") {
113
- reject(new Error("Failed to start local server"));
114
- return;
115
- }
116
- const callbackUrl = `http://127.0.0.1:${address.port}/callback`;
117
- const authUrl = `${apiUrl}/auth/github?cli_redirect=${encodeURIComponent(callbackUrl)}`;
118
- console.log(chalk.cyan("\n⏳ Waiting for browser authentication...\n"));
119
- console.log(chalk.dim(`Auth URL: ${authUrl}\n`));
120
- console.log(chalk.dim(`Paste the callback URL here if the browser redirect doesn't work:\n`));
121
- open(authUrl);
122
- });
123
- // Timeout after 5 minutes
124
- setTimeout(() => {
125
- if (settle()) {
126
- reject(new Error("Authentication timed out"));
127
- }
128
- }, 5 * 60 * 1000).unref();
129
- });
130
- }
131
- //# 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,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,CACL,wHAAwH,EACxH,GAAG,EAAE;wBACH,IAAI,MAAM,EAAE,EAAE,CAAC;4BACb,OAAO,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;wBACzC,CAAC;oBACH,CAAC,CACF,CAAC;gBACJ,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,CACL,gDAAgD,KAAK,oBAAoB,EACzE,GAAG,EAAE;wBACH,IAAI,MAAM,EAAE,EAAE,CAAC;4BACb,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;wBAC3B,CAAC;oBACH,CAAC,CACF,CAAC;gBACJ,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;AAMpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsDnD"}
@@ -1,48 +0,0 @@
1
- import chalk from "chalk";
2
- import WebSocket from "ws";
3
- import { isLoggedIn, getApiUrl, getTokens } from "../config.js";
4
- import { readContext } from "../context.js";
5
- export function registerLogs(program) {
6
- program
7
- .command("logs")
8
- .description("Stream live logs from a deployment")
9
- .action(async () => {
10
- if (!isLoggedIn()) {
11
- console.error(chalk.red('Not logged in. Run "lm login" first.'));
12
- process.exitCode = 1;
13
- return;
14
- }
15
- const ctx = readContext();
16
- const apiUrl = getApiUrl();
17
- const wsUrl = apiUrl.replace(/^http/, "ws");
18
- const { accessToken } = getTokens();
19
- console.log(chalk.dim("Streaming logs (Ctrl+C to stop)...\n"));
20
- const ws = new WebSocket(`${wsUrl}/ws/runtime-logs/${ctx.serviceId}?token=${accessToken}`);
21
- ws.on("message", (data) => {
22
- const msg = data.toString();
23
- try {
24
- const parsed = JSON.parse(msg);
25
- const ts = parsed.timestamp
26
- ? chalk.dim(`[${new Date(parsed.timestamp).toLocaleTimeString()}]`)
27
- : "";
28
- const line = parsed.message || parsed.line || msg;
29
- console.log(`${ts} ${line}`);
30
- }
31
- catch {
32
- console.log(msg);
33
- }
34
- });
35
- ws.on("error", (err) => {
36
- console.error(chalk.red(`WebSocket error: ${err.message}`));
37
- process.exitCode = 1;
38
- });
39
- ws.on("close", () => {
40
- console.log(chalk.dim("\nLog stream ended."));
41
- });
42
- // Handle Ctrl+C gracefully
43
- process.on("SIGINT", () => {
44
- ws.close();
45
- });
46
- });
47
- }
48
- //# 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,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAChE,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,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,CAAC;QAEpC,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,WAAW,EAAE,CACjE,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 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;AAkBpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuU1D"}