@launchmatic/cli 0.2.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 (65) hide show
  1. package/dist/api.d.ts +2 -0
  2. package/dist/api.d.ts.map +1 -0
  3. package/dist/api.js +70 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/c.d.ts +11 -0
  6. package/dist/c.d.ts.map +1 -0
  7. package/dist/c.js +301 -0
  8. package/dist/c.js.map +1 -0
  9. package/dist/commands/deploy.d.ts +3 -0
  10. package/dist/commands/deploy.d.ts.map +1 -0
  11. package/dist/commands/deploy.js +217 -0
  12. package/dist/commands/deploy.js.map +1 -0
  13. package/dist/commands/destroy.d.ts +3 -0
  14. package/dist/commands/destroy.d.ts.map +1 -0
  15. package/dist/commands/destroy.js +53 -0
  16. package/dist/commands/destroy.js.map +1 -0
  17. package/dist/commands/domains.d.ts +3 -0
  18. package/dist/commands/domains.d.ts.map +1 -0
  19. package/dist/commands/domains.js +38 -0
  20. package/dist/commands/domains.js.map +1 -0
  21. package/dist/commands/env.d.ts +3 -0
  22. package/dist/commands/env.d.ts.map +1 -0
  23. package/dist/commands/env.js +74 -0
  24. package/dist/commands/env.js.map +1 -0
  25. package/dist/commands/init.d.ts +3 -0
  26. package/dist/commands/init.d.ts.map +1 -0
  27. package/dist/commands/init.js +201 -0
  28. package/dist/commands/init.js.map +1 -0
  29. package/dist/commands/lightspeed.d.ts +3 -0
  30. package/dist/commands/lightspeed.d.ts.map +1 -0
  31. package/dist/commands/lightspeed.js +165 -0
  32. package/dist/commands/lightspeed.js.map +1 -0
  33. package/dist/commands/login.d.ts +3 -0
  34. package/dist/commands/login.d.ts.map +1 -0
  35. package/dist/commands/login.js +131 -0
  36. package/dist/commands/login.js.map +1 -0
  37. package/dist/commands/logs.d.ts +3 -0
  38. package/dist/commands/logs.d.ts.map +1 -0
  39. package/dist/commands/logs.js +48 -0
  40. package/dist/commands/logs.js.map +1 -0
  41. package/dist/commands/quicklaunch.d.ts +3 -0
  42. package/dist/commands/quicklaunch.d.ts.map +1 -0
  43. package/dist/commands/quicklaunch.js +324 -0
  44. package/dist/commands/quicklaunch.js.map +1 -0
  45. package/dist/commands/status.d.ts +3 -0
  46. package/dist/commands/status.d.ts.map +1 -0
  47. package/dist/commands/status.js +77 -0
  48. package/dist/commands/status.js.map +1 -0
  49. package/dist/config.d.ts +12 -0
  50. package/dist/config.d.ts.map +1 -0
  51. package/dist/config.js +41 -0
  52. package/dist/config.js.map +1 -0
  53. package/dist/context.d.ts +10 -0
  54. package/dist/context.d.ts.map +1 -0
  55. package/dist/context.js +27 -0
  56. package/dist/context.js.map +1 -0
  57. package/dist/detect.d.ts +20 -0
  58. package/dist/detect.d.ts.map +1 -0
  59. package/dist/detect.js +281 -0
  60. package/dist/detect.js.map +1 -0
  61. package/dist/index.d.ts +3 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +29 -0
  64. package/dist/index.js.map +1 -0
  65. package/package.json +34 -0
package/dist/api.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function api<T = unknown>(path: string, options?: RequestInit): Promise<T>;
2
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAuCA,wBAAsB,GAAG,CAAC,CAAC,GAAG,OAAO,EACnC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,CAAC,CAAC,CAqCZ"}
package/dist/api.js ADDED
@@ -0,0 +1,70 @@
1
+ import { getApiUrl, getTokens, setTokens } from "./config.js";
2
+ class ApiError extends Error {
3
+ status;
4
+ constructor(status, message) {
5
+ super(message);
6
+ this.status = status;
7
+ this.name = "ApiError";
8
+ }
9
+ }
10
+ async function refreshAccessToken() {
11
+ const { refreshToken } = getTokens();
12
+ if (!refreshToken)
13
+ return false;
14
+ try {
15
+ const res = await fetch(`${getApiUrl()}/auth/refresh`, {
16
+ method: "POST",
17
+ headers: {
18
+ "Content-Type": "application/json",
19
+ Authorization: `Bearer ${refreshToken}`,
20
+ },
21
+ body: JSON.stringify({ refreshToken }),
22
+ });
23
+ if (!res.ok)
24
+ return false;
25
+ const data = (await res.json());
26
+ if (data.success && data.accessToken) {
27
+ setTokens(data.accessToken, refreshToken);
28
+ return true;
29
+ }
30
+ return false;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ export async function api(path, options = {}) {
37
+ const { accessToken } = getTokens();
38
+ const url = `${getApiUrl()}${path}`;
39
+ const headers = {
40
+ "Content-Type": "application/json",
41
+ ...(options.headers || {}),
42
+ };
43
+ if (accessToken) {
44
+ headers["Authorization"] = `Bearer ${accessToken}`;
45
+ }
46
+ let res = await fetch(url, { ...options, headers });
47
+ // Token refresh on 401
48
+ if (res.status === 401 && accessToken) {
49
+ const refreshed = await refreshAccessToken();
50
+ if (refreshed) {
51
+ const { accessToken: newToken } = getTokens();
52
+ headers["Authorization"] = `Bearer ${newToken}`;
53
+ res = await fetch(url, { ...options, headers });
54
+ }
55
+ }
56
+ if (!res.ok) {
57
+ let message = `HTTP ${res.status}`;
58
+ try {
59
+ const body = (await res.json());
60
+ if (body.error)
61
+ message = body.error;
62
+ }
63
+ catch {
64
+ // ignore parse errors
65
+ }
66
+ throw new ApiError(res.status, message);
67
+ }
68
+ return res.json();
69
+ }
70
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,QAAS,SAAQ,KAAK;IAEjB;IADT,YACS,MAAc,EACrB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,WAAM,GAAN,MAAM,CAAQ;QAIrB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,KAAK,UAAU,kBAAkB;IAC/B,MAAM,EAAE,YAAY,EAAE,GAAG,SAAS,EAAE,CAAC;IACrC,IAAI,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,EAAE,eAAe,EAAE;YACrD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,YAAY,EAAE;aACxC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;SACvC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QAE1B,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA+C,CAAC;QAC9E,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,IAAY,EACZ,UAAuB,EAAE;IAEzB,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,CAAC;IAEpC,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,GAAG,CAAC,OAAO,CAAC,OAAiC,IAAI,EAAE,CAAC;KACrD,CAAC;IAEF,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,WAAW,EAAE,CAAC;IACrD,CAAC;IAED,IAAI,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAEpD,uBAAuB;IACvB,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC7C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAC;YAC9C,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,QAAQ,EAAE,CAAC;YAChD,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,OAAO,GAAG,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;YACtD,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;AAClC,CAAC"}
package/dist/c.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Shortcut entry point: `c`
4
+ *
5
+ * Usage:
6
+ * c -c a babysitter app that tracks my time (create new app)
7
+ * c add a health check endpoint (modify existing service)
8
+ * c (interactive prompt)
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=c.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c.d.ts","sourceRoot":"","sources":["../src/c.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
package/dist/c.js ADDED
@@ -0,0 +1,301 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Shortcut entry point: `c`
4
+ *
5
+ * Usage:
6
+ * c -c a babysitter app that tracks my time (create new app)
7
+ * c add a health check endpoint (modify existing service)
8
+ * c (interactive prompt)
9
+ */
10
+ import readline from "node:readline";
11
+ import chalk from "chalk";
12
+ import ora from "ora";
13
+ import { api } from "./api.js";
14
+ import { isLoggedIn } from "./config.js";
15
+ import { readContext, contextExists } from "./context.js";
16
+ function ask(question) {
17
+ const rl = readline.createInterface({
18
+ input: process.stdin,
19
+ output: process.stdout,
20
+ });
21
+ return new Promise((resolve) => {
22
+ rl.question(question, (answer) => {
23
+ rl.close();
24
+ resolve(answer.trim());
25
+ });
26
+ });
27
+ }
28
+ function confirm(question) {
29
+ return ask(`${question} (y/N) `).then((a) => a.toLowerCase() === "y");
30
+ }
31
+ async function createMode(userPrompt) {
32
+ if (!contextExists()) {
33
+ console.error(chalk.red('No .launchmatic.json found. Run "lm init" first to set your project.'));
34
+ process.exitCode = 1;
35
+ return;
36
+ }
37
+ const ctx = readContext();
38
+ // Step 1: Generate plan
39
+ const planSpinner = ora("Generating app plan...").start();
40
+ let generationId;
41
+ let plan;
42
+ let complexity;
43
+ try {
44
+ const res = await api("/api/lightspeed/generate", {
45
+ method: "POST",
46
+ body: JSON.stringify({
47
+ prompt: userPrompt,
48
+ projectId: ctx.projectId,
49
+ }),
50
+ });
51
+ if (!res.success || !res.data) {
52
+ throw new Error(res.error || "Failed to generate plan");
53
+ }
54
+ generationId = res.data.generationId;
55
+ plan = res.data.plan;
56
+ complexity = res.data.complexity;
57
+ planSpinner.succeed("App plan ready");
58
+ }
59
+ catch (err) {
60
+ planSpinner.fail(chalk.red(`Plan failed: ${err.message}`));
61
+ process.exitCode = 1;
62
+ return;
63
+ }
64
+ // Step 2: Display plan
65
+ console.log();
66
+ console.log(chalk.bold.cyan(` ${plan.appName}`) +
67
+ chalk.dim(` — ${plan.description}`));
68
+ console.log(chalk.dim(` ${plan.runtime} / ${plan.framework} / port ${plan.port}`));
69
+ if (plan.files.length > 0) {
70
+ console.log();
71
+ console.log(chalk.dim(` Files (${plan.files.length}):`));
72
+ for (const f of plan.files) {
73
+ console.log(chalk.green(` ${f}`));
74
+ }
75
+ }
76
+ if (plan.databases.length > 0) {
77
+ console.log(chalk.cyan(` Databases: ${plan.databases.join(", ")}`));
78
+ }
79
+ if (plan.envVars.length > 0) {
80
+ console.log(chalk.dim(` Env vars: ${plan.envVars.join(", ")}`));
81
+ }
82
+ console.log();
83
+ // Subtle upgrade tease for complex apps on free tier
84
+ if (complexity?.requiresUpgrade) {
85
+ console.log(chalk.yellow(" ✨ This is a great concept! ") +
86
+ chalk.dim("Your idea includes "));
87
+ for (const reason of complexity.reasons) {
88
+ console.log(chalk.dim(` · ${reason}`));
89
+ }
90
+ console.log();
91
+ console.log(chalk.yellow(" ⚡ ") +
92
+ chalk.white("Upgrade to ") +
93
+ chalk.bold.cyan("Pro") +
94
+ chalk.white(" to bring this to life → ") +
95
+ chalk.cyan.underline("launchmatic.io/pricing"));
96
+ console.log();
97
+ return;
98
+ }
99
+ // Step 3: Confirm
100
+ const shouldCreate = await confirm(chalk.cyan(" Create this app and deploy?"));
101
+ if (!shouldCreate) {
102
+ console.log(chalk.dim(" Cancelled."));
103
+ return;
104
+ }
105
+ // Step 4: Create + deploy
106
+ const createSpinner = ora("Generating code and creating repo...").start();
107
+ try {
108
+ const res = await api("/api/lightspeed/create", {
109
+ method: "POST",
110
+ body: JSON.stringify({
111
+ generationId,
112
+ projectId: ctx.projectId,
113
+ appName: plan.appName,
114
+ private: true,
115
+ }),
116
+ });
117
+ if (!res.success || !res.data) {
118
+ throw new Error(res.error || "Failed to create app");
119
+ }
120
+ createSpinner.succeed("App created and deploy triggered");
121
+ console.log();
122
+ console.log(chalk.green(" ✓ ") +
123
+ chalk.bold("Repo: ") +
124
+ chalk.cyan(res.data.repoUrl));
125
+ console.log(chalk.green(" ✓ ") +
126
+ chalk.bold("Service: ") +
127
+ chalk.dim(res.data.serviceId));
128
+ console.log();
129
+ console.log(chalk.dim(' Run "lm logs" to watch the deployment.'));
130
+ }
131
+ catch (err) {
132
+ createSpinner.fail(chalk.red(`Create failed: ${err.message}`));
133
+ process.exitCode = 1;
134
+ return;
135
+ }
136
+ }
137
+ async function modifyMode(userPrompt) {
138
+ const ctx = readContext();
139
+ // Step 1: Generate modification plan
140
+ const planSpinner = ora("Analyzing repository and planning changes...").start();
141
+ let generationId;
142
+ let plan;
143
+ let existingFileCount;
144
+ let complexity;
145
+ try {
146
+ const res = await api("/api/lightspeed/modify", {
147
+ method: "POST",
148
+ body: JSON.stringify({
149
+ serviceId: ctx.serviceId,
150
+ prompt: userPrompt,
151
+ }),
152
+ });
153
+ if (!res.success || !res.data) {
154
+ throw new Error(res.error || "Failed to generate plan");
155
+ }
156
+ generationId = res.data.generationId;
157
+ plan = res.data.plan;
158
+ existingFileCount = res.data.existingFileCount;
159
+ complexity = res.data.complexity;
160
+ planSpinner.succeed("Modification plan ready");
161
+ }
162
+ catch (err) {
163
+ if (err.message?.includes("REPO_PERMISSION_DENIED")) {
164
+ planSpinner.fail(chalk.red("No push access to repository. Re-authorize with GitHub."));
165
+ }
166
+ else {
167
+ planSpinner.fail(chalk.red(`Plan failed: ${err.message}`));
168
+ }
169
+ process.exitCode = 1;
170
+ return;
171
+ }
172
+ // Step 2: Display the plan
173
+ console.log();
174
+ console.log(chalk.bold.cyan(" Plan: ") + chalk.white(plan.summary));
175
+ console.log(chalk.dim(` ${existingFileCount} files in repo\n`));
176
+ if (plan.filesToModify.length > 0) {
177
+ console.log(chalk.yellow(` ~ Modify (${plan.filesToModify.length}):`));
178
+ for (const f of plan.filesToModify) {
179
+ console.log(chalk.yellow(` ${f}`));
180
+ }
181
+ }
182
+ if (plan.filesToCreate.length > 0) {
183
+ console.log(chalk.green(` + Create (${plan.filesToCreate.length}):`));
184
+ for (const f of plan.filesToCreate) {
185
+ console.log(chalk.green(` ${f}`));
186
+ }
187
+ }
188
+ if (plan.filesToDelete.length > 0) {
189
+ console.log(chalk.red(` - Delete (${plan.filesToDelete.length}):`));
190
+ for (const f of plan.filesToDelete) {
191
+ console.log(chalk.red(` ${f}`));
192
+ }
193
+ }
194
+ if (plan.description) {
195
+ console.log();
196
+ console.log(chalk.dim(` ${plan.description}`));
197
+ }
198
+ console.log();
199
+ // Subtle upgrade tease for complex modifications on free tier
200
+ if (complexity?.requiresUpgrade) {
201
+ console.log(chalk.yellow(" ✨ Great plan! ") +
202
+ chalk.dim("This modification involves "));
203
+ for (const reason of complexity.reasons) {
204
+ console.log(chalk.dim(` · ${reason}`));
205
+ }
206
+ console.log();
207
+ console.log(chalk.yellow(" ⚡ ") +
208
+ chalk.white("Upgrade to ") +
209
+ chalk.bold.cyan("Pro") +
210
+ chalk.white(" to apply these changes → ") +
211
+ chalk.cyan.underline("launchmatic.io/pricing"));
212
+ console.log();
213
+ return;
214
+ }
215
+ // Step 3: Confirm
216
+ const shouldApply = await confirm(chalk.cyan(" Apply these changes and redeploy?"));
217
+ if (!shouldApply) {
218
+ console.log(chalk.dim(" Cancelled."));
219
+ return;
220
+ }
221
+ // Step 4: Apply modifications
222
+ const applySpinner = ora("Generating modified code...").start();
223
+ try {
224
+ const res = await api("/api/lightspeed/modify/apply", {
225
+ method: "POST",
226
+ body: JSON.stringify({ generationId }),
227
+ });
228
+ if (!res.success || !res.data) {
229
+ throw new Error(res.error || "Failed to apply modifications");
230
+ }
231
+ applySpinner.succeed("Changes committed and deploy triggered");
232
+ console.log();
233
+ console.log(chalk.green(" ✓ ") +
234
+ chalk.bold("Commit: ") +
235
+ chalk.cyan(res.data.commitUrl));
236
+ console.log(chalk.green(" ✓ ") +
237
+ chalk.bold("Deploy: ") +
238
+ chalk.dim(`deployment ${res.data.deploymentId}`));
239
+ console.log();
240
+ console.log(chalk.dim(' Run "lm logs" to watch the deployment.'));
241
+ }
242
+ catch (err) {
243
+ applySpinner.fail(chalk.red(`Apply failed: ${err.message}`));
244
+ process.exitCode = 1;
245
+ return;
246
+ }
247
+ }
248
+ // ─── Main ───────────────────────────────────────────────
249
+ async function main() {
250
+ if (!isLoggedIn()) {
251
+ console.error(chalk.red('Not logged in. Run "lm login" first.'));
252
+ process.exitCode = 1;
253
+ return;
254
+ }
255
+ const args = process.argv.slice(2);
256
+ // Parse -c flag for create mode
257
+ let isCreate = false;
258
+ const filteredArgs = [];
259
+ for (const arg of args) {
260
+ if (arg === "-c" || arg === "--create") {
261
+ isCreate = true;
262
+ }
263
+ else {
264
+ filteredArgs.push(arg);
265
+ }
266
+ }
267
+ let userPrompt = filteredArgs.join(" ");
268
+ // Interactive prompt if none provided
269
+ if (!userPrompt) {
270
+ if (isCreate) {
271
+ console.log(chalk.bold.cyan("⚡ Lightspeed Create") +
272
+ chalk.dim(" — describe the app you want to build\n"));
273
+ }
274
+ else {
275
+ console.log(chalk.bold.cyan("⚡ Lightspeed") +
276
+ chalk.dim(" — describe what you want to change\n"));
277
+ }
278
+ userPrompt = await ask(chalk.cyan("→ "));
279
+ }
280
+ if (!userPrompt || userPrompt.length < 10) {
281
+ console.error(chalk.red("Prompt too short. Describe in at least 10 characters."));
282
+ process.exitCode = 1;
283
+ return;
284
+ }
285
+ if (isCreate) {
286
+ await createMode(userPrompt);
287
+ }
288
+ else {
289
+ if (!contextExists()) {
290
+ console.error(chalk.red('No .launchmatic.json found. Run "lm init" first, or use "c -c" to create a new app.'));
291
+ process.exitCode = 1;
292
+ return;
293
+ }
294
+ await modifyMode(userPrompt);
295
+ }
296
+ }
297
+ main().catch((err) => {
298
+ console.error(chalk.red(err.message));
299
+ process.exitCode = 1;
300
+ });
301
+ //# sourceMappingURL=c.js.map
package/dist/c.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c.js","sourceRoot":"","sources":["../src/c.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerDeploy(program: Command): void;
3
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiOrD"}
@@ -0,0 +1,217 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import WebSocket from "ws";
5
+ import { api } from "../api.js";
6
+ import { isLoggedIn, getApiUrl, getTokens } from "../config.js";
7
+ import { readContext } from "../context.js";
8
+ import { detectLocal, getGitInfo } from "../detect.js";
9
+ export function registerDeploy(program) {
10
+ program
11
+ .command("deploy")
12
+ .description("Build and deploy the current service")
13
+ .action(async () => {
14
+ if (!isLoggedIn()) {
15
+ console.error(chalk.red('Not logged in. Run "lm login" first.'));
16
+ process.exitCode = 1;
17
+ return;
18
+ }
19
+ const ctx = readContext();
20
+ const cwd = process.cwd();
21
+ // Pre-flight: gather git info
22
+ let gitInfo = getGitInfo(cwd);
23
+ const branch = gitInfo.repoBranch;
24
+ // Warn about uncommitted changes
25
+ if (gitInfo.hasUncommitted) {
26
+ console.log(chalk.yellow("Warning: uncommitted changes won't be included"));
27
+ }
28
+ // Auto-push if there are unpushed commits
29
+ if (gitInfo.hasUnpushed && gitInfo.hasRemote) {
30
+ const pushSpinner = ora("Pushing commits to remote...").start();
31
+ try {
32
+ execFileSync("git", ["push", "origin", branch], {
33
+ cwd,
34
+ encoding: "utf-8",
35
+ stdio: ["pipe", "pipe", "pipe"],
36
+ });
37
+ pushSpinner.succeed("Pushed commits to remote");
38
+ // Re-read git info after push
39
+ gitInfo = getGitInfo(cwd);
40
+ }
41
+ catch (pushErr) {
42
+ pushSpinner.fail(chalk.red(`Failed to push: ${pushErr instanceof Error ? pushErr.message : "unknown error"}`));
43
+ console.error(chalk.red("Push your commits manually and retry: git push"));
44
+ process.exitCode = 1;
45
+ return;
46
+ }
47
+ }
48
+ // If no remote, we can't deploy
49
+ if (!gitInfo.hasRemote) {
50
+ console.error(chalk.red("No git remote found. Add a GitHub remote and push your code first."));
51
+ process.exitCode = 1;
52
+ return;
53
+ }
54
+ const commitSha = gitInfo.commitSha || "";
55
+ // Deploy summary
56
+ const shortSha = commitSha ? commitSha.slice(0, 7) : "unknown";
57
+ if (gitInfo.repoOwner && gitInfo.repoName) {
58
+ console.log(chalk.dim(`Deploying ${gitInfo.repoOwner}/${gitInfo.repoName} @ ${branch} (${shortSha})`));
59
+ }
60
+ else {
61
+ console.log(chalk.dim(`Deploying @ ${branch} (${shortSha})`));
62
+ }
63
+ // Auto-diagnose: patch service with locally detected data
64
+ const detection = detectLocal(process.cwd());
65
+ const patch = {};
66
+ if (gitInfo.repoOwner)
67
+ patch.repoOwner = gitInfo.repoOwner;
68
+ if (gitInfo.repoName)
69
+ patch.repoName = gitInfo.repoName;
70
+ if (gitInfo.repoBranch)
71
+ patch.repoBranch = gitInfo.repoBranch;
72
+ if (gitInfo.repoOwner && gitInfo.repoName) {
73
+ patch.repoUrl = `https://github.com/${gitInfo.repoOwner}/${gitInfo.repoName}.git`;
74
+ }
75
+ if (detection.buildCmd)
76
+ patch.buildCmd = detection.buildCmd;
77
+ if (detection.startCmd)
78
+ patch.startCmd = detection.startCmd;
79
+ if (detection.port)
80
+ patch.port = detection.port;
81
+ if (detection.framework)
82
+ patch.framework = detection.framework;
83
+ if (Object.keys(patch).length > 0) {
84
+ try {
85
+ await api(`/api/services/${ctx.serviceId}`, {
86
+ method: "PATCH",
87
+ body: JSON.stringify(patch),
88
+ });
89
+ }
90
+ catch {
91
+ // Best-effort — don't block deploy if patch fails
92
+ }
93
+ }
94
+ const spinner = ora("Triggering deployment...").start();
95
+ try {
96
+ const { data: deployment } = await api("/api/deployments", {
97
+ method: "POST",
98
+ body: JSON.stringify({
99
+ serviceId: ctx.serviceId,
100
+ branch,
101
+ commitSha,
102
+ }),
103
+ });
104
+ spinner.text = "Building...";
105
+ // Stream build logs via WebSocket
106
+ const apiUrl = getApiUrl();
107
+ const wsUrl = apiUrl.replace(/^http/, "ws");
108
+ const { accessToken } = getTokens();
109
+ await new Promise((resolve, reject) => {
110
+ let statusResolved = false;
111
+ // Log stream
112
+ const logWs = new WebSocket(`${wsUrl}/ws/logs/${deployment.id}?token=${accessToken}`);
113
+ logWs.on("message", (data) => {
114
+ const msg = data.toString();
115
+ try {
116
+ const parsed = JSON.parse(msg);
117
+ const line = parsed.message || parsed.line || msg;
118
+ spinner.stop();
119
+ console.log(chalk.dim(line));
120
+ spinner.start();
121
+ }
122
+ catch {
123
+ spinner.stop();
124
+ console.log(chalk.dim(msg));
125
+ spinner.start();
126
+ }
127
+ });
128
+ logWs.on("error", () => {
129
+ // Log streaming is best-effort
130
+ });
131
+ // Status stream
132
+ const statusWs = new WebSocket(`${wsUrl}/ws/status/${deployment.id}?token=${accessToken}`);
133
+ statusWs.on("message", (data) => {
134
+ const msg = data.toString();
135
+ try {
136
+ const parsed = JSON.parse(msg);
137
+ if (parsed.status === "BUILDING") {
138
+ spinner.text = "Building...";
139
+ }
140
+ else if (parsed.status === "DEPLOYING") {
141
+ spinner.text = "Deploying...";
142
+ }
143
+ else if (parsed.status === "ACTIVE" && !statusResolved) {
144
+ statusResolved = true;
145
+ logWs.close();
146
+ statusWs.close();
147
+ const url = parsed.subdomain ||
148
+ deployment.subdomain ||
149
+ "your service URL";
150
+ spinner.succeed(chalk.green(`Deployed → ${chalk.bold(`https://${url}`)}`));
151
+ resolve();
152
+ }
153
+ else if (parsed.status === "FAILED" && !statusResolved) {
154
+ statusResolved = true;
155
+ logWs.close();
156
+ statusWs.close();
157
+ spinner.fail(chalk.red(parsed.error || "Deployment failed"));
158
+ reject(new Error("Deployment failed"));
159
+ }
160
+ }
161
+ catch {
162
+ // Ignore unparseable status messages
163
+ }
164
+ });
165
+ statusWs.on("error", (err) => {
166
+ if (!statusResolved) {
167
+ statusResolved = true;
168
+ logWs.close();
169
+ spinner.fail(chalk.red("Lost connection to deployment status"));
170
+ reject(err);
171
+ }
172
+ });
173
+ statusWs.on("close", () => {
174
+ if (!statusResolved) {
175
+ // Poll for final status if WebSocket closes early
176
+ statusResolved = true;
177
+ logWs.close();
178
+ pollDeploymentStatus(deployment.id, spinner)
179
+ .then(resolve)
180
+ .catch(reject);
181
+ }
182
+ });
183
+ });
184
+ }
185
+ catch (err) {
186
+ const msg = err instanceof Error ? err.message : "Unknown error";
187
+ spinner.fail(chalk.red(`Deploy failed: ${msg}`));
188
+ if (msg.includes("not found") || msg.includes("404")) {
189
+ console.error(chalk.yellow('Service no longer exists. Run "lm init" to re-link.'));
190
+ }
191
+ process.exitCode = 1;
192
+ }
193
+ });
194
+ }
195
+ async function pollDeploymentStatus(deploymentId, spinner) {
196
+ for (let i = 0; i < 120; i++) {
197
+ await new Promise((r) => setTimeout(r, 5000));
198
+ try {
199
+ const { data } = await api(`/api/deployments/${deploymentId}`);
200
+ if (data.status === "ACTIVE") {
201
+ spinner.succeed(chalk.green(`Deployed → ${chalk.bold(`https://${data.subdomain || "your service"}`)}`));
202
+ return;
203
+ }
204
+ if (data.status === "FAILED") {
205
+ spinner.fail(chalk.red("Deployment failed"));
206
+ process.exitCode = 1;
207
+ return;
208
+ }
209
+ }
210
+ catch {
211
+ // Keep polling
212
+ }
213
+ }
214
+ spinner.fail(chalk.red("Deployment timed out"));
215
+ process.exitCode = 1;
216
+ }
217
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}