@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
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerDestroy(program: Command): void;
3
+ //# sourceMappingURL=destroy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destroy.d.ts","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqDtD"}
@@ -0,0 +1,53 @@
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, removeContext } from "../context.js";
7
+ export function registerDestroy(program) {
8
+ program
9
+ .command("destroy")
10
+ .description("Tear down a service")
11
+ .action(async () => {
12
+ if (!isLoggedIn()) {
13
+ console.error(chalk.red('Not logged in. Run "lm login" first.'));
14
+ process.exitCode = 1;
15
+ return;
16
+ }
17
+ const ctx = readContext();
18
+ try {
19
+ // Get service name for confirmation
20
+ const { data: service } = await api(`/api/services/${ctx.serviceId}`);
21
+ console.log(chalk.red(`\nThis will permanently destroy the service "${chalk.bold(service.name)}" and all its deployments.\n`));
22
+ const answer = await prompt(`Type "${service.name}" to confirm: `);
23
+ if (answer !== service.name) {
24
+ console.log(chalk.dim("Aborted."));
25
+ return;
26
+ }
27
+ const spinner = ora("Destroying service...").start();
28
+ await api(`/api/services/${ctx.serviceId}`, {
29
+ method: "DELETE",
30
+ });
31
+ removeContext();
32
+ spinner.succeed(chalk.green("Service destroyed"));
33
+ }
34
+ catch (err) {
35
+ console.error(chalk.red(`Failed: ${err instanceof Error ? err.message : "Unknown error"}`));
36
+ process.exitCode = 1;
37
+ return;
38
+ }
39
+ });
40
+ }
41
+ function prompt(question) {
42
+ const rl = readline.createInterface({
43
+ input: process.stdin,
44
+ output: process.stdout,
45
+ });
46
+ return new Promise((resolve) => {
47
+ rl.question(question, (answer) => {
48
+ rl.close();
49
+ resolve(answer.trim());
50
+ });
51
+ });
52
+ }
53
+ //# sourceMappingURL=destroy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE3D,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,qBAAqB,CAAC;SAClC,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;QAE1B,IAAI,CAAC;YACH,oCAAoC;YACpC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,GAAG,CAGhC,iBAAiB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;YAErC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,gDAAgD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,8BAA8B,CACvG,CACF,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CACzB,SAAS,OAAO,CAAC,IAAI,gBAAgB,CACtC,CAAC;YAEF,IAAI,MAAM,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;gBACnC,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;YAErD,MAAM,GAAG,CAAC,iBAAiB,GAAG,CAAC,SAAS,EAAE,EAAE;gBAC1C,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;YAEH,aAAa,EAAE,CAAC;YAChB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,WAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAClE,CACF,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,MAAM,CAAC,QAAgB;IAC9B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerDomains(program: Command): void;
3
+ //# sourceMappingURL=domains.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domains.d.ts","sourceRoot":"","sources":["../../src/commands/domains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgDtD"}
@@ -0,0 +1,38 @@
1
+ import chalk from "chalk";
2
+ import { api } from "../api.js";
3
+ import { isLoggedIn } from "../config.js";
4
+ import { readContext } from "../context.js";
5
+ export function registerDomains(program) {
6
+ const domains = program
7
+ .command("domains")
8
+ .description("Manage custom domains");
9
+ domains
10
+ .command("add <hostname>")
11
+ .description("Add a custom domain")
12
+ .action(async (hostname) => {
13
+ if (!isLoggedIn()) {
14
+ console.error(chalk.red('Not logged in. Run "lm login" first.'));
15
+ process.exitCode = 1;
16
+ return;
17
+ }
18
+ const ctx = readContext();
19
+ try {
20
+ const { data } = await api("/api/domains", {
21
+ method: "POST",
22
+ body: JSON.stringify({ hostname, serviceId: ctx.serviceId }),
23
+ });
24
+ console.log(chalk.green(`✓ Domain ${chalk.bold(data.hostname)} added`));
25
+ console.log();
26
+ console.log(chalk.bold("DNS Configuration:"));
27
+ console.log(` Add a CNAME record pointing ${chalk.cyan(data.hostname)} to ${chalk.cyan(data.dnsTarget || "your-service.launchmatic.io")}`);
28
+ console.log();
29
+ console.log(chalk.dim("SSL will be provisioned automatically once DNS is configured."));
30
+ }
31
+ catch (err) {
32
+ console.error(chalk.red(`Failed: ${err instanceof Error ? err.message : "Unknown error"}`));
33
+ process.exitCode = 1;
34
+ return;
35
+ }
36
+ });
37
+ }
38
+ //# sourceMappingURL=domains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domains.js","sourceRoot":"","sources":["../../src/commands/domains.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,uBAAuB,CAAC,CAAC;IAExC,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,EAAE;QACjC,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;QAE1B,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAGvB,cAAc,EAAE;gBACjB,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;aAC7D,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CACT,iCAAiC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,6BAA6B,CAAC,EAAE,CAC/H,CAAC;YACF,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,+DAA+D,CAChE,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,WAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAClE,CACF,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerEnv(program: Command): void;
3
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0FlD"}
@@ -0,0 +1,74 @@
1
+ import chalk from "chalk";
2
+ import { api } from "../api.js";
3
+ import { isLoggedIn } from "../config.js";
4
+ import { readContext } from "../context.js";
5
+ export function registerEnv(program) {
6
+ const env = program
7
+ .command("env")
8
+ .description("Manage environment variables");
9
+ env
10
+ .command("set <pairs...>")
11
+ .description("Set environment variables (KEY=VALUE ...)")
12
+ .action(async (pairs) => {
13
+ if (!isLoggedIn()) {
14
+ console.error(chalk.red('Not logged in. Run "lm login" first.'));
15
+ process.exitCode = 1;
16
+ return;
17
+ }
18
+ const ctx = readContext();
19
+ const vars = [];
20
+ for (const pair of pairs) {
21
+ const eqIdx = pair.indexOf("=");
22
+ if (eqIdx === -1) {
23
+ console.error(chalk.red(`Invalid format: "${pair}". Use KEY=VALUE.`));
24
+ process.exitCode = 1;
25
+ return;
26
+ }
27
+ vars.push({
28
+ key: pair.slice(0, eqIdx),
29
+ value: pair.slice(eqIdx + 1),
30
+ });
31
+ }
32
+ try {
33
+ await api(`/api/services/${ctx.serviceId}/env`, {
34
+ method: "PUT",
35
+ body: JSON.stringify({ vars }),
36
+ });
37
+ console.log(chalk.green(`✓ ${vars.length} variable(s) set`));
38
+ }
39
+ catch (err) {
40
+ console.error(chalk.red(`Failed: ${err instanceof Error ? err.message : "Unknown error"}`));
41
+ process.exitCode = 1;
42
+ return;
43
+ }
44
+ });
45
+ env
46
+ .command("list")
47
+ .description("List all environment variables")
48
+ .action(async () => {
49
+ if (!isLoggedIn()) {
50
+ console.error(chalk.red('Not logged in. Run "lm login" first.'));
51
+ process.exitCode = 1;
52
+ return;
53
+ }
54
+ const ctx = readContext();
55
+ try {
56
+ const { data } = await api(`/api/services/${ctx.serviceId}/env`);
57
+ if (data.length === 0) {
58
+ console.log(chalk.dim("No environment variables set."));
59
+ return;
60
+ }
61
+ const maxKeyLen = Math.max(...data.map((v) => v.key.length));
62
+ for (const v of data) {
63
+ const masked = v.value.slice(0, 3) + "•".repeat(Math.max(0, v.value.length - 3));
64
+ console.log(` ${chalk.bold(v.key.padEnd(maxKeyLen))} ${chalk.dim(masked)}`);
65
+ }
66
+ }
67
+ catch (err) {
68
+ console.error(chalk.red(`Failed: ${err instanceof Error ? err.message : "Unknown error"}`));
69
+ process.exitCode = 1;
70
+ return;
71
+ }
72
+ });
73
+ }
74
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerInit(program: Command): void;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,201 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerLightspeed(program: Command): void;
3
+ //# sourceMappingURL=lightspeed.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,165 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightspeed.js","sourceRoot":"","sources":["../../src/commands/lightspeed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerLogin(program: Command): void;
3
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
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"}