@launchmatic/cli 0.3.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 (105) hide show
  1. package/dist/c.js +14185 -260
  2. package/dist/index.js +25203 -46
  3. package/package.json +11 -10
  4. package/dist/api.d.ts +0 -7
  5. package/dist/api.d.ts.map +0 -1
  6. package/dist/api.js +0 -79
  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/api-key.d.ts +0 -3
  12. package/dist/commands/api-key.d.ts.map +0 -1
  13. package/dist/commands/api-key.js +0 -89
  14. package/dist/commands/api-key.js.map +0 -1
  15. package/dist/commands/browser.d.ts +0 -3
  16. package/dist/commands/browser.d.ts.map +0 -1
  17. package/dist/commands/browser.js +0 -410
  18. package/dist/commands/browser.js.map +0 -1
  19. package/dist/commands/db.d.ts +0 -3
  20. package/dist/commands/db.d.ts.map +0 -1
  21. package/dist/commands/db.js +0 -481
  22. package/dist/commands/db.js.map +0 -1
  23. package/dist/commands/deploy.d.ts +0 -3
  24. package/dist/commands/deploy.d.ts.map +0 -1
  25. package/dist/commands/deploy.js +0 -219
  26. package/dist/commands/deploy.js.map +0 -1
  27. package/dist/commands/deployments.d.ts +0 -3
  28. package/dist/commands/deployments.d.ts.map +0 -1
  29. package/dist/commands/deployments.js +0 -158
  30. package/dist/commands/deployments.js.map +0 -1
  31. package/dist/commands/destroy.d.ts +0 -3
  32. package/dist/commands/destroy.d.ts.map +0 -1
  33. package/dist/commands/destroy.js +0 -53
  34. package/dist/commands/destroy.js.map +0 -1
  35. package/dist/commands/doctor.d.ts +0 -3
  36. package/dist/commands/doctor.d.ts.map +0 -1
  37. package/dist/commands/doctor.js +0 -160
  38. package/dist/commands/doctor.js.map +0 -1
  39. package/dist/commands/domains.d.ts +0 -3
  40. package/dist/commands/domains.d.ts.map +0 -1
  41. package/dist/commands/domains.js +0 -38
  42. package/dist/commands/domains.js.map +0 -1
  43. package/dist/commands/env.d.ts +0 -3
  44. package/dist/commands/env.d.ts.map +0 -1
  45. package/dist/commands/env.js +0 -74
  46. package/dist/commands/env.js.map +0 -1
  47. package/dist/commands/infra.d.ts +0 -3
  48. package/dist/commands/infra.d.ts.map +0 -1
  49. package/dist/commands/infra.js +0 -193
  50. package/dist/commands/infra.js.map +0 -1
  51. package/dist/commands/init.d.ts +0 -3
  52. package/dist/commands/init.d.ts.map +0 -1
  53. package/dist/commands/init.js +0 -239
  54. package/dist/commands/init.js.map +0 -1
  55. package/dist/commands/lightspeed.d.ts +0 -3
  56. package/dist/commands/lightspeed.d.ts.map +0 -1
  57. package/dist/commands/lightspeed.js +0 -175
  58. package/dist/commands/lightspeed.js.map +0 -1
  59. package/dist/commands/login.d.ts +0 -3
  60. package/dist/commands/login.d.ts.map +0 -1
  61. package/dist/commands/login.js +0 -175
  62. package/dist/commands/login.js.map +0 -1
  63. package/dist/commands/logs.d.ts +0 -3
  64. package/dist/commands/logs.d.ts.map +0 -1
  65. package/dist/commands/logs.js +0 -49
  66. package/dist/commands/logs.js.map +0 -1
  67. package/dist/commands/preview.d.ts +0 -3
  68. package/dist/commands/preview.d.ts.map +0 -1
  69. package/dist/commands/preview.js +0 -96
  70. package/dist/commands/preview.js.map +0 -1
  71. package/dist/commands/quicklaunch.d.ts +0 -3
  72. package/dist/commands/quicklaunch.d.ts.map +0 -1
  73. package/dist/commands/quicklaunch.js +0 -452
  74. package/dist/commands/quicklaunch.js.map +0 -1
  75. package/dist/commands/repo.d.ts +0 -3
  76. package/dist/commands/repo.d.ts.map +0 -1
  77. package/dist/commands/repo.js +0 -433
  78. package/dist/commands/repo.js.map +0 -1
  79. package/dist/commands/status.d.ts +0 -3
  80. package/dist/commands/status.d.ts.map +0 -1
  81. package/dist/commands/status.js +0 -77
  82. package/dist/commands/status.js.map +0 -1
  83. package/dist/commands/usage.d.ts +0 -3
  84. package/dist/commands/usage.d.ts.map +0 -1
  85. package/dist/commands/usage.js +0 -95
  86. package/dist/commands/usage.js.map +0 -1
  87. package/dist/config.d.ts +0 -12
  88. package/dist/config.d.ts.map +0 -1
  89. package/dist/config.js +0 -41
  90. package/dist/config.js.map +0 -1
  91. package/dist/connectors.d.ts +0 -16
  92. package/dist/connectors.d.ts.map +0 -1
  93. package/dist/connectors.js +0 -95
  94. package/dist/connectors.js.map +0 -1
  95. package/dist/context.d.ts +0 -10
  96. package/dist/context.d.ts.map +0 -1
  97. package/dist/context.js +0 -32
  98. package/dist/context.js.map +0 -1
  99. package/dist/detect.d.ts +0 -20
  100. package/dist/detect.d.ts.map +0 -1
  101. package/dist/detect.js +0 -281
  102. package/dist/detect.js.map +0 -1
  103. package/dist/index.d.ts +0 -3
  104. package/dist/index.d.ts.map +0 -1
  105. package/dist/index.js.map +0 -1
@@ -1,219 +0,0 @@
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, getWsToken } from "../api.js";
6
- import { isLoggedIn, getApiUrl } 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 wsToken = await getWsToken();
109
- await new Promise((resolve, reject) => {
110
- let statusResolved = false;
111
- // Log stream
112
- const logWs = new WebSocket(`${wsUrl}/ws/logs/${deployment.id}?token=${wsToken}`);
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", (err) => {
129
- // Log streaming is best-effort; surface for debugging
130
- if (process.env.DEBUG)
131
- console.error(chalk.dim(`Log stream error: ${err.message}`));
132
- });
133
- // Status stream
134
- const statusWs = new WebSocket(`${wsUrl}/ws/status/${deployment.id}?token=${wsToken}`);
135
- statusWs.on("message", (data) => {
136
- const msg = data.toString();
137
- try {
138
- const parsed = JSON.parse(msg);
139
- if (parsed.status === "BUILDING") {
140
- spinner.text = "Building...";
141
- }
142
- else if (parsed.status === "DEPLOYING") {
143
- spinner.text = "Deploying...";
144
- }
145
- else if (parsed.status === "ACTIVE" && !statusResolved) {
146
- statusResolved = true;
147
- logWs.close();
148
- statusWs.close();
149
- const url = parsed.subdomain ||
150
- deployment.subdomain ||
151
- "your service URL";
152
- spinner.succeed(chalk.green(`Deployed → ${chalk.bold(`https://${url}`)}`));
153
- resolve();
154
- }
155
- else if (parsed.status === "FAILED" && !statusResolved) {
156
- statusResolved = true;
157
- logWs.close();
158
- statusWs.close();
159
- spinner.fail(chalk.red(parsed.error || "Deployment failed"));
160
- reject(new Error("Deployment failed"));
161
- }
162
- }
163
- catch {
164
- // Ignore unparseable status messages
165
- }
166
- });
167
- statusWs.on("error", (err) => {
168
- if (!statusResolved) {
169
- statusResolved = true;
170
- logWs.close();
171
- spinner.fail(chalk.red("Lost connection to deployment status"));
172
- reject(err);
173
- }
174
- });
175
- statusWs.on("close", () => {
176
- if (!statusResolved) {
177
- // Poll for final status if WebSocket closes early
178
- statusResolved = true;
179
- logWs.close();
180
- pollDeploymentStatus(deployment.id, spinner)
181
- .then(resolve)
182
- .catch(reject);
183
- }
184
- });
185
- });
186
- }
187
- catch (err) {
188
- const msg = err instanceof Error ? err.message : "Unknown error";
189
- spinner.fail(chalk.red(`Deploy failed: ${msg}`));
190
- if (msg.includes("not found") || msg.includes("404")) {
191
- console.error(chalk.yellow('Service no longer exists. Run "lm init" to re-link.'));
192
- }
193
- process.exitCode = 1;
194
- }
195
- });
196
- }
197
- async function pollDeploymentStatus(deploymentId, spinner) {
198
- for (let i = 0; i < 120; i++) {
199
- await new Promise((r) => setTimeout(r, 5000));
200
- try {
201
- const { data } = await api(`/api/deployments/${deploymentId}`);
202
- if (data.status === "ACTIVE") {
203
- spinner.succeed(chalk.green(`Deployed → ${chalk.bold(`https://${data.subdomain || "your service"}`)}`));
204
- return;
205
- }
206
- if (data.status === "FAILED") {
207
- spinner.fail(chalk.red("Deployment failed"));
208
- process.exitCode = 1;
209
- return;
210
- }
211
- }
212
- catch {
213
- // Keep polling
214
- }
215
- }
216
- spinner.fail(chalk.red("Deployment timed out"));
217
- process.exitCode = 1;
218
- }
219
- //# sourceMappingURL=deploy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { Command } from "commander";
2
- export declare function registerDeployments(program: Command): void;
3
- //# sourceMappingURL=deployments.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deployments.d.ts","sourceRoot":"","sources":["../../src/commands/deployments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2CpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgK1D"}
@@ -1,158 +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
- function statusBadge(status) {
7
- switch (status) {
8
- case "ACTIVE": return chalk.green("● active");
9
- case "BUILDING": return chalk.cyan("◌ building");
10
- case "DEPLOYING": return chalk.cyan("◌ deploying");
11
- case "QUEUED": return chalk.dim("○ queued");
12
- case "FAILED": return chalk.red("✕ failed");
13
- case "CANCELLED": return chalk.dim("⊘ cancelled");
14
- case "ROLLED_BACK": return chalk.yellow("↩ rolled back");
15
- default: return chalk.dim(status);
16
- }
17
- }
18
- function duration(start, end) {
19
- if (!start)
20
- return "-";
21
- const s = new Date(start).getTime();
22
- const e = end ? new Date(end).getTime() : Date.now();
23
- const secs = Math.round((e - s) / 1000);
24
- if (secs < 60)
25
- return `${secs}s`;
26
- return `${Math.floor(secs / 60)}m ${secs % 60}s`;
27
- }
28
- export function registerDeployments(program) {
29
- const cmd = program
30
- .command("deployments")
31
- .alias("deploys")
32
- .description("View deployment history");
33
- // ── lm deployments list ──
34
- cmd
35
- .command("list")
36
- .alias("ls")
37
- .description("List deployments for the current service")
38
- .option("-p, --page <page>", "Page number", "1")
39
- .option("-l, --limit <limit>", "Items per page", "15")
40
- .action(async (opts) => {
41
- if (!isLoggedIn()) {
42
- console.error(chalk.red('Not logged in. Run "lm login" first.'));
43
- process.exitCode = 1;
44
- return;
45
- }
46
- const ctx = readContext();
47
- const spinner = ora("Fetching deployments...").start();
48
- try {
49
- const res = await api(`/api/deployments?serviceId=${ctx.serviceId}&page=${opts.page}&limit=${opts.limit}`);
50
- spinner.stop();
51
- if (res.data.length === 0) {
52
- console.log(chalk.dim("No deployments yet."));
53
- return;
54
- }
55
- for (const d of res.data) {
56
- const sha = d.commitSha ? chalk.dim(d.commitSha.slice(0, 7)) : "";
57
- const branch = d.branch ? chalk.dim(`${d.branch}`) : "";
58
- const by = d.triggeredBy ? chalk.dim(`by ${d.triggeredBy.username}`) : "";
59
- const dur = duration(d.startedAt, d.finishedAt);
60
- const rollback = d.rollbackFromId ? chalk.yellow(" (rollback)") : "";
61
- const preview = d.previewId ? chalk.cyan(" (preview)") : "";
62
- const msg = d.commitMessage
63
- ? chalk.dim(` "${d.commitMessage.split("\n")[0].slice(0, 60)}"`)
64
- : "";
65
- console.log(`${statusBadge(d.status)} ${sha} ${branch}${rollback}${preview} ${chalk.dim(dur)} ${by}`);
66
- if (msg)
67
- console.log(msg);
68
- console.log(chalk.dim(` ${d.id} ${new Date(d.createdAt).toLocaleString()}`));
69
- console.log();
70
- }
71
- const { pagination: pg } = res;
72
- if (pg.totalPages > 1) {
73
- console.log(chalk.dim(`Page ${pg.page}/${pg.totalPages} (${pg.total} total)`));
74
- }
75
- }
76
- catch (err) {
77
- spinner.fail(chalk.red(`Failed: ${err instanceof Error ? err.message : "Unknown error"}`));
78
- process.exitCode = 1;
79
- }
80
- });
81
- // ── lm deployments info ──
82
- cmd
83
- .command("info <deploymentId>")
84
- .description("Show deployment details")
85
- .action(async (deploymentId) => {
86
- if (!isLoggedIn()) {
87
- console.error(chalk.red('Not logged in. Run "lm login" first.'));
88
- process.exitCode = 1;
89
- return;
90
- }
91
- const spinner = ora("Fetching deployment...").start();
92
- try {
93
- const { data } = await api(`/api/deployments/${deploymentId}`);
94
- spinner.stop();
95
- console.log(chalk.bold("Deployment: ") + data.id);
96
- console.log(chalk.bold("Status: ") + statusBadge(data.status));
97
- console.log(chalk.bold("Service: ") + data.service?.name || "-");
98
- console.log(chalk.bold("Branch: ") + (data.branch || "-"));
99
- console.log(chalk.bold("Commit: ") + (data.commitSha || "-"));
100
- if (data.commitMessage) {
101
- console.log(chalk.bold("Message: ") + data.commitMessage.split("\n")[0]);
102
- }
103
- console.log(chalk.bold("Duration: ") + duration(data.startedAt, data.finishedAt));
104
- console.log(chalk.bold("Created: ") + new Date(data.createdAt).toLocaleString());
105
- if (data.triggeredBy) {
106
- console.log(chalk.bold("Triggered: ") + data.triggeredBy.username);
107
- }
108
- if (data.imageTag) {
109
- console.log(chalk.bold("Image: ") + data.imageTag);
110
- }
111
- }
112
- catch (err) {
113
- spinner.fail(chalk.red(`Failed: ${err instanceof Error ? err.message : "Unknown error"}`));
114
- process.exitCode = 1;
115
- }
116
- });
117
- // ── lm deployments cancel ──
118
- cmd
119
- .command("cancel <deploymentId>")
120
- .description("Cancel a running deployment")
121
- .action(async (deploymentId) => {
122
- if (!isLoggedIn()) {
123
- console.error(chalk.red('Not logged in. Run "lm login" first.'));
124
- process.exitCode = 1;
125
- return;
126
- }
127
- const spinner = ora("Cancelling deployment...").start();
128
- try {
129
- await api(`/api/deployments/${deploymentId}/cancel`, { method: "POST" });
130
- spinner.succeed("Deployment cancelled");
131
- }
132
- catch (err) {
133
- spinner.fail(chalk.red(`Failed: ${err instanceof Error ? err.message : "Unknown error"}`));
134
- process.exitCode = 1;
135
- }
136
- });
137
- // ── lm deployments rollback ──
138
- cmd
139
- .command("rollback <deploymentId>")
140
- .description("Rollback to a previous deployment")
141
- .action(async (deploymentId) => {
142
- if (!isLoggedIn()) {
143
- console.error(chalk.red('Not logged in. Run "lm login" first.'));
144
- process.exitCode = 1;
145
- return;
146
- }
147
- const spinner = ora("Rolling back...").start();
148
- try {
149
- const { data } = await api(`/api/deployments/${deploymentId}/rollback`, { method: "POST" });
150
- spinner.succeed(`Rollback started → deployment ${chalk.dim(data.id)}`);
151
- }
152
- catch (err) {
153
- spinner.fail(chalk.red(`Failed: ${err instanceof Error ? err.message : "Unknown error"}`));
154
- process.exitCode = 1;
155
- }
156
- });
157
- }
158
- //# sourceMappingURL=deployments.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deployments.js","sourceRoot":"","sources":["../../src/commands/deployments.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { Command } from "commander";
2
- export declare function registerDestroy(program: Command): void;
3
- //# sourceMappingURL=destroy.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,53 +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, 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
@@ -1 +0,0 @@
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"}
@@ -1,3 +0,0 @@
1
- import { Command } from "commander";
2
- export declare function registerDoctor(program: Command): void;
3
- //# sourceMappingURL=doctor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoCrD"}
@@ -1,160 +0,0 @@
1
- import chalk from "chalk";
2
- import { validateFromDisk } from "@launchmatic/validator";
3
- import { existsSync, readFileSync } from "fs";
4
- import { resolve } from "path";
5
- export function registerDoctor(program) {
6
- program
7
- .command("doctor")
8
- .description("Scan project for common deployment issues")
9
- .option("-d, --dir <path>", "Project directory to scan", ".")
10
- .option("--json", "Output results as JSON")
11
- .action(async (opts) => {
12
- const dir = resolve(opts.dir);
13
- if (!existsSync(dir)) {
14
- console.error(chalk.red(`Directory not found: ${dir}`));
15
- process.exitCode = 1;
16
- return;
17
- }
18
- // Detect runtime context from package.json / project files
19
- const ctx = detectContext(dir);
20
- if (!opts.json) {
21
- console.log();
22
- console.log(chalk.bold(` Launchmatic Doctor`));
23
- console.log(chalk.dim(` Scanning ${dir}...`));
24
- console.log();
25
- }
26
- const result = validateFromDisk(dir, ctx);
27
- if (opts.json) {
28
- console.log(JSON.stringify(result, null, 2));
29
- process.exitCode = result.passed ? 0 : 1;
30
- return;
31
- }
32
- printResult(result);
33
- process.exitCode = result.passed ? 0 : 1;
34
- });
35
- }
36
- function detectContext(dir) {
37
- const ctx = {};
38
- // Detect runtime from package.json
39
- const pkgPath = resolve(dir, "package.json");
40
- if (existsSync(pkgPath)) {
41
- try {
42
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
43
- const deps = { ...pkg.dependencies, ...pkg.devDependencies };
44
- if (deps.next)
45
- ctx.runtime = "nodejs";
46
- else if (deps.express || deps.fastify || deps.koa || deps.hapi)
47
- ctx.runtime = "nodejs";
48
- else if (deps.react || deps.vue || deps.svelte)
49
- ctx.runtime = "nodejs";
50
- else if (pkg.type === "module" || deps.typescript)
51
- ctx.runtime = "nodejs";
52
- // Detect package manager
53
- if (existsSync(resolve(dir, "pnpm-lock.yaml")))
54
- ctx.packageManager = "pnpm";
55
- else if (existsSync(resolve(dir, "yarn.lock")))
56
- ctx.packageManager = "yarn";
57
- else if (existsSync(resolve(dir, "package-lock.json")))
58
- ctx.packageManager = "npm";
59
- // Detect port from scripts
60
- const startScript = pkg.scripts?.start || pkg.scripts?.dev || "";
61
- const portMatch = startScript.match(/--port\s+(\d+)|-p\s+(\d+)/);
62
- if (portMatch)
63
- ctx.port = parseInt(portMatch[1] || portMatch[2]);
64
- // Detect Prisma
65
- if (deps.prisma || deps["@prisma/client"])
66
- ctx.hasPrisma = true;
67
- // Detect start command
68
- if (pkg.scripts?.start)
69
- ctx.startCmd = `npm run start`;
70
- }
71
- catch { /* ignore */ }
72
- }
73
- // Python detection
74
- if (existsSync(resolve(dir, "requirements.txt")) || existsSync(resolve(dir, "pyproject.toml"))) {
75
- ctx.runtime = "python";
76
- }
77
- // Go detection
78
- if (existsSync(resolve(dir, "go.mod")))
79
- ctx.runtime = "go";
80
- // Rust detection
81
- if (existsSync(resolve(dir, "Cargo.toml")))
82
- ctx.runtime = "rust";
83
- return ctx;
84
- }
85
- function severityIcon(severity) {
86
- switch (severity) {
87
- case "error": return chalk.red("✗");
88
- case "warning": return chalk.yellow("⚠");
89
- case "info": return chalk.blue("ℹ");
90
- default: return " ";
91
- }
92
- }
93
- function severityLabel(severity) {
94
- switch (severity) {
95
- case "error": return chalk.red("ERROR");
96
- case "warning": return chalk.yellow("WARN");
97
- case "info": return chalk.blue("INFO");
98
- default: return severity;
99
- }
100
- }
101
- function printResult(result) {
102
- const errors = result.issues.filter(i => i.severity === "error");
103
- const warnings = result.issues.filter(i => i.severity === "warning");
104
- const infos = result.issues.filter(i => i.severity === "info");
105
- // Score bar
106
- const scoreColor = result.score >= 80 ? chalk.green : result.score >= 50 ? chalk.yellow : chalk.red;
107
- const filled = Math.round(result.score / 5);
108
- const bar = scoreColor("█".repeat(filled)) + chalk.dim("░".repeat(20 - filled));
109
- console.log(` Health Score: ${bar} ${scoreColor(`${result.score}/100`)}`);
110
- console.log();
111
- if (result.issues.length === 0) {
112
- console.log(chalk.green(" ✓ No issues found — project looks deploy-ready!"));
113
- console.log();
114
- return;
115
- }
116
- // Group by category
117
- const grouped = new Map();
118
- for (const issue of result.issues) {
119
- const list = grouped.get(issue.category) || [];
120
- list.push(issue);
121
- grouped.set(issue.category, list);
122
- }
123
- for (const [category, issues] of grouped) {
124
- console.log(chalk.bold(` ${formatCategory(category)}`));
125
- for (const issue of issues) {
126
- console.log(` ${severityIcon(issue.severity)} ${issue.message}`);
127
- if (issue.fix) {
128
- console.log(chalk.dim(` → ${issue.fix}`));
129
- }
130
- if (issue.file) {
131
- console.log(chalk.dim(` ${issue.file}${issue.line ? `:${issue.line}` : ""}`));
132
- }
133
- }
134
- console.log();
135
- }
136
- // Summary
137
- const parts = [];
138
- if (errors.length > 0)
139
- parts.push(chalk.red(`${errors.length} error${errors.length > 1 ? "s" : ""}`));
140
- if (warnings.length > 0)
141
- parts.push(chalk.yellow(`${warnings.length} warning${warnings.length > 1 ? "s" : ""}`));
142
- if (infos.length > 0)
143
- parts.push(chalk.blue(`${infos.length} info`));
144
- console.log(` ${parts.join(", ")}`);
145
- console.log();
146
- }
147
- function formatCategory(cat) {
148
- const names = {
149
- "dockerfile": "Dockerfile",
150
- "package-json": "package.json",
151
- "health-endpoint": "Health Endpoint",
152
- "port-binding": "Port Binding",
153
- "prisma": "Prisma",
154
- "nextjs": "Next.js",
155
- "start-command": "Start Command",
156
- "structure": "Project Structure",
157
- };
158
- return names[cat] || cat;
159
- }
160
- //# sourceMappingURL=doctor.js.map