@lizard-build/cli 0.1.0 → 0.3.29

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 (178) hide show
  1. package/.github/workflows/release.yml +90 -0
  2. package/README.md +41 -0
  3. package/dist/commands/add.js +318 -45
  4. package/dist/commands/add.js.map +1 -1
  5. package/dist/commands/config.d.ts +2 -0
  6. package/dist/commands/config.js +68 -0
  7. package/dist/commands/config.js.map +1 -0
  8. package/dist/commands/docs.d.ts +2 -0
  9. package/dist/commands/docs.js +13 -0
  10. package/dist/commands/docs.js.map +1 -0
  11. package/dist/commands/domain.d.ts +9 -0
  12. package/dist/commands/domain.js +195 -0
  13. package/dist/commands/domain.js.map +1 -0
  14. package/dist/commands/git.js +175 -36
  15. package/dist/commands/git.js.map +1 -1
  16. package/dist/commands/init.d.ts +24 -0
  17. package/dist/commands/init.js +128 -86
  18. package/dist/commands/init.js.map +1 -1
  19. package/dist/commands/link.d.ts +7 -0
  20. package/dist/commands/link.js +104 -33
  21. package/dist/commands/link.js.map +1 -1
  22. package/dist/commands/login.js +4 -3
  23. package/dist/commands/login.js.map +1 -1
  24. package/dist/commands/logs.js +223 -30
  25. package/dist/commands/logs.js.map +1 -1
  26. package/dist/commands/open.js +3 -2
  27. package/dist/commands/open.js.map +1 -1
  28. package/dist/commands/port.d.ts +7 -0
  29. package/dist/commands/port.js +49 -0
  30. package/dist/commands/port.js.map +1 -0
  31. package/dist/commands/projects.js +36 -6
  32. package/dist/commands/projects.js.map +1 -1
  33. package/dist/commands/ps.js +32 -39
  34. package/dist/commands/ps.js.map +1 -1
  35. package/dist/commands/redeploy.js +48 -8
  36. package/dist/commands/redeploy.js.map +1 -1
  37. package/dist/commands/regions.js +2 -5
  38. package/dist/commands/regions.js.map +1 -1
  39. package/dist/commands/restart.js +84 -10
  40. package/dist/commands/restart.js.map +1 -1
  41. package/dist/commands/run.d.ts +9 -0
  42. package/dist/commands/run.js +61 -22
  43. package/dist/commands/run.js.map +1 -1
  44. package/dist/commands/scale.d.ts +10 -0
  45. package/dist/commands/scale.js +166 -0
  46. package/dist/commands/scale.js.map +1 -0
  47. package/dist/commands/secrets.js +200 -89
  48. package/dist/commands/secrets.js.map +1 -1
  49. package/dist/commands/service-set.d.ts +49 -0
  50. package/dist/commands/service-set.js +552 -0
  51. package/dist/commands/service-set.js.map +1 -0
  52. package/dist/commands/service-show.d.ts +11 -0
  53. package/dist/commands/service-show.js +44 -0
  54. package/dist/commands/service-show.js.map +1 -0
  55. package/dist/commands/service.d.ts +8 -0
  56. package/dist/commands/service.js +262 -0
  57. package/dist/commands/service.js.map +1 -0
  58. package/dist/commands/ssh.d.ts +2 -0
  59. package/dist/commands/ssh.js +161 -0
  60. package/dist/commands/ssh.js.map +1 -0
  61. package/dist/commands/status.d.ts +7 -0
  62. package/dist/commands/status.js +49 -38
  63. package/dist/commands/status.js.map +1 -1
  64. package/dist/commands/unlink.d.ts +5 -0
  65. package/dist/commands/unlink.js +18 -0
  66. package/dist/commands/unlink.js.map +1 -0
  67. package/dist/commands/up.d.ts +9 -0
  68. package/dist/commands/up.js +417 -0
  69. package/dist/commands/up.js.map +1 -0
  70. package/dist/commands/upgrade.d.ts +2 -0
  71. package/dist/commands/upgrade.js +79 -0
  72. package/dist/commands/upgrade.js.map +1 -0
  73. package/dist/commands/whoami.js +26 -6
  74. package/dist/commands/whoami.js.map +1 -1
  75. package/dist/commands/workspace.d.ts +8 -0
  76. package/dist/commands/workspace.js +36 -0
  77. package/dist/commands/workspace.js.map +1 -0
  78. package/dist/index.js +204 -82
  79. package/dist/index.js.map +1 -1
  80. package/dist/lib/api.d.ts +17 -2
  81. package/dist/lib/api.js +85 -51
  82. package/dist/lib/api.js.map +1 -1
  83. package/dist/lib/auth.d.ts +3 -11
  84. package/dist/lib/auth.js +16 -36
  85. package/dist/lib/auth.js.map +1 -1
  86. package/dist/lib/config.d.ts +36 -15
  87. package/dist/lib/config.js +71 -58
  88. package/dist/lib/config.js.map +1 -1
  89. package/dist/lib/format.d.ts +1 -0
  90. package/dist/lib/format.js +17 -4
  91. package/dist/lib/format.js.map +1 -1
  92. package/dist/lib/name.d.ts +11 -0
  93. package/dist/lib/name.js +26 -0
  94. package/dist/lib/name.js.map +1 -0
  95. package/dist/lib/picker.d.ts +32 -0
  96. package/dist/lib/picker.js +91 -0
  97. package/dist/lib/picker.js.map +1 -0
  98. package/dist/lib/resolve.d.ts +85 -0
  99. package/dist/lib/resolve.js +203 -0
  100. package/dist/lib/resolve.js.map +1 -0
  101. package/dist/lib/updater.d.ts +16 -0
  102. package/dist/lib/updater.js +102 -0
  103. package/dist/lib/updater.js.map +1 -0
  104. package/lizard-wrapper.sh +2 -0
  105. package/package.json +11 -3
  106. package/src/commands/add.ts +388 -56
  107. package/src/commands/config.ts +80 -0
  108. package/src/commands/docs.ts +15 -0
  109. package/src/commands/domain.ts +248 -0
  110. package/src/commands/git.ts +201 -40
  111. package/src/commands/init.ts +149 -100
  112. package/src/commands/link.ts +127 -35
  113. package/src/commands/login.ts +4 -3
  114. package/src/commands/logs.ts +283 -27
  115. package/src/commands/open.ts +3 -2
  116. package/src/commands/port.ts +57 -0
  117. package/src/commands/projects.ts +43 -6
  118. package/src/commands/ps.ts +39 -60
  119. package/src/commands/redeploy.ts +51 -10
  120. package/src/commands/regions.ts +2 -6
  121. package/src/commands/restart.ts +84 -10
  122. package/src/commands/run.ts +68 -24
  123. package/src/commands/scale.ts +216 -0
  124. package/src/commands/secrets.ts +277 -100
  125. package/src/commands/service-set.ts +669 -0
  126. package/src/commands/service-show.ts +52 -0
  127. package/src/commands/service.ts +298 -0
  128. package/src/commands/ssh.ts +176 -0
  129. package/src/commands/status.ts +51 -46
  130. package/src/commands/unlink.ts +17 -0
  131. package/src/commands/up.ts +461 -0
  132. package/src/commands/upgrade.ts +87 -0
  133. package/src/commands/whoami.ts +34 -6
  134. package/src/commands/workspace.ts +44 -0
  135. package/src/index.ts +214 -85
  136. package/src/lib/api.ts +114 -51
  137. package/src/lib/auth.ts +22 -46
  138. package/src/lib/config.ts +100 -65
  139. package/src/lib/format.ts +18 -4
  140. package/src/lib/name.ts +27 -0
  141. package/src/lib/picker.ts +133 -0
  142. package/src/lib/resolve.ts +285 -0
  143. package/src/lib/updater.ts +106 -0
  144. package/test/cli.test.ts +491 -0
  145. package/test/fixtures/hello-app/Dockerfile +5 -0
  146. package/test/fixtures/hello-app/index.js +5 -0
  147. package/test/unit/api.test.ts +66 -0
  148. package/test/unit/config.test.ts +94 -0
  149. package/test/unit/init.test.ts +211 -0
  150. package/test/unit/json.test.ts +208 -0
  151. package/test/unit/picker.test.ts +161 -0
  152. package/test/unit/resolve.test.ts +124 -0
  153. package/test/unit/service-set.test.ts +355 -0
  154. package/vitest.config.ts +10 -0
  155. package/dist/commands/connect.d.ts +0 -2
  156. package/dist/commands/connect.js +0 -117
  157. package/dist/commands/connect.js.map +0 -1
  158. package/dist/commands/context.d.ts +0 -2
  159. package/dist/commands/context.js +0 -71
  160. package/dist/commands/context.js.map +0 -1
  161. package/dist/commands/deploy.d.ts +0 -2
  162. package/dist/commands/deploy.js +0 -120
  163. package/dist/commands/deploy.js.map +0 -1
  164. package/dist/commands/destroy.d.ts +0 -2
  165. package/dist/commands/destroy.js +0 -51
  166. package/dist/commands/destroy.js.map +0 -1
  167. package/dist/commands/update.d.ts +0 -2
  168. package/dist/commands/update.js +0 -41
  169. package/dist/commands/update.js.map +0 -1
  170. package/dist/commands/version.d.ts +0 -2
  171. package/dist/commands/version.js +0 -37
  172. package/dist/commands/version.js.map +0 -1
  173. package/src/commands/connect.ts +0 -145
  174. package/src/commands/context.ts +0 -93
  175. package/src/commands/deploy.ts +0 -153
  176. package/src/commands/destroy.ts +0 -51
  177. package/src/commands/update.ts +0 -44
  178. package/src/commands/version.ts +0 -37
@@ -1,71 +0,0 @@
1
- import chalk from "chalk";
2
- import { api } from "../lib/api.js";
3
- import { resolveProjectId, findProjectConfig } from "../lib/config.js";
4
- import { isJSONMode, printJSON, statusColor, table } from "../lib/format.js";
5
- export function registerContext(program) {
6
- program
7
- .command("context")
8
- .description("Show full project context (optimized for AI agents)")
9
- .action(async () => {
10
- const projectId = resolveProjectId(program.opts().project);
11
- const config = findProjectConfig();
12
- const [project, services, secrets] = await Promise.all([
13
- api.get(`/api/projects/${projectId}`),
14
- api.get(`/api/projects/${projectId}/services`),
15
- api.get(`/api/projects/${projectId}/secrets`).catch(() => []),
16
- ]);
17
- const context = {
18
- project: {
19
- id: project.id,
20
- name: project.name,
21
- slug: project.slug,
22
- },
23
- environment: config?.environment || "production",
24
- apps: (services.apps || []).map((a) => ({
25
- id: a.id,
26
- name: a.name,
27
- status: a.status,
28
- domain: a.domain,
29
- repo: a.repo,
30
- branch: a.branch,
31
- cpuLimit: a.cpuLimit,
32
- memoryLimit: a.memoryLimit,
33
- })),
34
- addons: (services.addons || []).map((a) => ({
35
- id: a.id,
36
- name: a.name,
37
- type: a.addonType,
38
- status: a.status,
39
- hostname: a.hostname,
40
- })),
41
- secrets: secrets.map((s) => s.key), // names only, not values
42
- };
43
- // Always JSON for pipe, since this is designed for AI agents
44
- if (isJSONMode() || !process.stdout.isTTY) {
45
- printJSON(context);
46
- return;
47
- }
48
- // Human-readable
49
- console.log(chalk.bold(context.project.name) + chalk.dim(` (${context.project.id})`));
50
- console.log(chalk.dim(`Environment: ${context.environment}`));
51
- console.log();
52
- if (context.apps.length > 0) {
53
- console.log(chalk.bold("Apps:"));
54
- table(["Name", "Status", "Domain"], context.apps.map((a) => [
55
- a.name,
56
- statusColor(a.status),
57
- a.domain ? `https://${a.domain}` : "—",
58
- ]));
59
- console.log();
60
- }
61
- if (context.addons.length > 0) {
62
- console.log(chalk.bold("Addons:"));
63
- table(["Name", "Type", "Status", "Host"], context.addons.map((a) => [a.name, a.type, statusColor(a.status), a.hostname || "—"]));
64
- console.log();
65
- }
66
- if (context.secrets.length > 0) {
67
- console.log(chalk.bold("Secrets:") + " " + context.secrets.join(", "));
68
- }
69
- });
70
- }
71
- //# sourceMappingURL=context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import { Command } from "commander";
2
- export declare function registerDeploy(program: Command): void;
@@ -1,120 +0,0 @@
1
- import chalk from "chalk";
2
- import ora from "ora";
3
- import { api, streamSSE } from "../lib/api.js";
4
- import { resolveProjectId } from "../lib/config.js";
5
- import { success, info, error, isJSONMode, printJSON, statusColor, } from "../lib/format.js";
6
- export function registerDeploy(program) {
7
- program
8
- .command("deploy")
9
- .description("Deploy the current project")
10
- .option("--detach", "Run in background without streaming logs")
11
- .option("--region <region>", "Region for deployment")
12
- .action(async (opts) => {
13
- const projectId = resolveProjectId(program.opts().project);
14
- // Check if there's already an app, if so redeploy
15
- const services = await api.get(`/api/projects/${projectId}/services`);
16
- if (services.apps && services.apps.length > 0) {
17
- // Redeploy existing app
18
- const app = services.apps[0];
19
- info(`Redeploying ${chalk.bold(app.name)}...`);
20
- await api.post(`/api/apps/${app.id}/redeploy`);
21
- if (opts.detach) {
22
- if (isJSONMode()) {
23
- printJSON({ appId: app.id, status: "deploying" });
24
- }
25
- else {
26
- success(`Redeploy started for ${app.name}`);
27
- info(chalk.dim(` Check status: lizard deploy status ${app.id}`));
28
- }
29
- return;
30
- }
31
- // Stream build logs
32
- await streamBuildLogs(app.id);
33
- return;
34
- }
35
- // First deploy — create app
36
- // TODO: detect repo from git remote, create app from repo
37
- throw new Error("First deploy requires an existing app. Create one from the dashboard or use `lizard init` + push via git.");
38
- });
39
- program
40
- .command("deploy-status")
41
- .argument("<id>", "App or deploy ID")
42
- .description("Show deployment status")
43
- .action(async (id) => {
44
- const app = await api.get(`/api/apps/${id}`);
45
- if (isJSONMode()) {
46
- printJSON(app);
47
- return;
48
- }
49
- console.log(`${chalk.bold(app.name)} ${statusColor(app.status)}`);
50
- if (app.domain)
51
- console.log(` URL: ${chalk.cyan(`https://${app.domain}`)}`);
52
- if (app.builds?.length) {
53
- const latest = app.builds[0];
54
- console.log(` Latest build: ${statusColor(latest.status)}`);
55
- }
56
- });
57
- }
58
- async function streamBuildLogs(appId) {
59
- // Wait a moment for the build to start
60
- const spinner = ora("Waiting for build...").start();
61
- // Poll until we get a build ID
62
- let buildId = null;
63
- for (let i = 0; i < 30; i++) {
64
- await sleep(2000);
65
- try {
66
- const app = await api.get(`/api/apps/${appId}`);
67
- if (app.builds?.length) {
68
- const latest = app.builds[0];
69
- if (["building", "deploying", "running", "failed"].includes(latest.status)) {
70
- buildId = latest.id;
71
- break;
72
- }
73
- }
74
- }
75
- catch { }
76
- }
77
- spinner.stop();
78
- if (!buildId) {
79
- info(chalk.dim("No build found. Check `lizard deploy status <id>` for status."));
80
- return;
81
- }
82
- info(chalk.dim("Streaming build logs...\n"));
83
- await streamSSE(`/api/builds/${buildId}/logs`, (event, data) => {
84
- if (event === "done" || event === "error") {
85
- if (event === "error") {
86
- error(`Build failed: ${data}`);
87
- }
88
- else {
89
- success("Build complete");
90
- }
91
- return false;
92
- }
93
- // Print log line
94
- try {
95
- const parsed = JSON.parse(data);
96
- if (parsed.line) {
97
- process.stdout.write(parsed.line + "\n");
98
- }
99
- else if (typeof parsed === "string") {
100
- process.stdout.write(parsed + "\n");
101
- }
102
- }
103
- catch {
104
- process.stdout.write(data + "\n");
105
- }
106
- return true;
107
- });
108
- // Check final status
109
- const app = await api.get(`/api/apps/${appId}`);
110
- if (app.status === "running") {
111
- success(`Deployed! ${app.domain ? chalk.cyan(`https://${app.domain}`) : ""}`);
112
- }
113
- else if (app.status === "failed") {
114
- error("Deploy failed. Check logs with `lizard logs --build`");
115
- }
116
- }
117
- function sleep(ms) {
118
- return new Promise((r) => setTimeout(r, ms));
119
- }
120
- //# 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,2 +0,0 @@
1
- import { Command } from "commander";
2
- export declare function registerDestroy(program: Command): void;
@@ -1,51 +0,0 @@
1
- import chalk from "chalk";
2
- import * as p from "@clack/prompts";
3
- import { api } from "../lib/api.js";
4
- import { resolveProjectId } from "../lib/config.js";
5
- import { success, isJSONMode, printJSON, isTTY } from "../lib/format.js";
6
- export function registerDestroy(program) {
7
- program
8
- .command("destroy")
9
- .argument("<id>", "Service ID to destroy")
10
- .description("Destroy a service (irreversible)")
11
- .action(async (id) => {
12
- const projectId = resolveProjectId(program.opts().project);
13
- const yes = program.opts().yes;
14
- // Confirm
15
- if (!yes) {
16
- if (!isTTY()) {
17
- throw new Error("Use -y to confirm destruction in non-interactive mode");
18
- }
19
- const confirm = await p.confirm({
20
- message: `Destroy service ${chalk.bold(id)}? This is irreversible.`,
21
- });
22
- if (p.isCancel(confirm) || !confirm) {
23
- process.exit(5);
24
- }
25
- }
26
- // Try as app first, then as addon
27
- try {
28
- await api.delete(`/api/apps/${id}`);
29
- if (isJSONMode()) {
30
- printJSON({ id, status: "destroyed", type: "app" });
31
- }
32
- else {
33
- success(`Service ${id} destroyed`);
34
- }
35
- return;
36
- }
37
- catch (err) {
38
- if (err.status !== 404)
39
- throw err;
40
- }
41
- // Try as addon
42
- await api.delete(`/api/projects/${projectId}/addons/${id}`);
43
- if (isJSONMode()) {
44
- printJSON({ id, status: "destroyed", type: "addon" });
45
- }
46
- else {
47
- success(`Service ${id} destroyed`);
48
- }
49
- });
50
- }
51
- //# sourceMappingURL=destroy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEpC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzE,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;SACzC,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC;QAE/B,UAAU;QACV,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC3E,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;gBAC9B,OAAO,EAAE,mBAAmB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,yBAAyB;aACpE,CAAC,CAAC;YACH,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI,UAAU,EAAE,EAAE,CAAC;gBACjB,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YACrC,CAAC;YACD,OAAO;QACT,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;gBAAE,MAAM,GAAG,CAAC;QACpC,CAAC;QAED,eAAe;QACf,MAAM,GAAG,CAAC,MAAM,CAAC,iBAAiB,SAAS,WAAW,EAAE,EAAE,CAAC,CAAC;QAC5D,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,2 +0,0 @@
1
- import { Command } from "commander";
2
- export declare function registerUpdate(program: Command): void;
@@ -1,41 +0,0 @@
1
- import chalk from "chalk";
2
- import { info, isJSONMode, printJSON } from "../lib/format.js";
3
- export function registerUpdate(program) {
4
- program
5
- .command("update")
6
- .description("Update Lizard CLI to latest version")
7
- .option("--check", "Only check for updates without installing")
8
- .action(async (opts) => {
9
- // Check npm for latest version
10
- try {
11
- const res = await fetch("https://registry.npmjs.org/@lizard/cli/latest");
12
- if (!res.ok)
13
- throw new Error("Failed to check for updates");
14
- const data = (await res.json());
15
- if (isJSONMode()) {
16
- printJSON({
17
- currentVersion: "0.1.0",
18
- latestVersion: data.version,
19
- updateAvailable: data.version !== "0.1.0",
20
- });
21
- return;
22
- }
23
- if (data.version === "0.1.0") {
24
- info("Already up to date (v0.1.0)");
25
- return;
26
- }
27
- if (opts.check) {
28
- info(`Update available: v0.1.0 → v${data.version}`);
29
- info(chalk.dim(`Run \`lizard update\` to install`));
30
- return;
31
- }
32
- info(`Updating to v${data.version}...`);
33
- const { execSync } = await import("node:child_process");
34
- execSync("npm install -g @lizard/cli@latest", { stdio: "inherit" });
35
- }
36
- catch {
37
- info("Could not check for updates. Run `npm update -g @lizard/cli` manually.");
38
- }
39
- });
40
- }
41
- //# sourceMappingURL=update.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE/D,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,SAAS,EAAE,2CAA2C,CAAC;SAC9D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,+BAA+B;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACzE,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC5D,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwB,CAAC;YAEvD,IAAI,UAAU,EAAE,EAAE,CAAC;gBACjB,SAAS,CAAC;oBACR,cAAc,EAAE,OAAO;oBACvB,aAAa,EAAE,IAAI,CAAC,OAAO;oBAC3B,eAAe,EAAE,IAAI,CAAC,OAAO,KAAK,OAAO;iBAC1C,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBACpC,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,+BAA+B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBACpD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC;YACxC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACxD,QAAQ,CAAC,mCAAmC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,wEAAwE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,2 +0,0 @@
1
- import { Command } from "commander";
2
- export declare function registerVersion(program: Command): void;
@@ -1,37 +0,0 @@
1
- import { isJSONMode, printJSON } from "../lib/format.js";
2
- import { readFileSync } from "node:fs";
3
- import { join, dirname } from "node:path";
4
- import { fileURLToPath } from "node:url";
5
- function getVersion() {
6
- try {
7
- // Try to read from package.json
8
- const __dirname = dirname(fileURLToPath(import.meta.url));
9
- const pkgPath = join(__dirname, "..", "..", "package.json");
10
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
11
- return pkg.version || "0.1.0";
12
- }
13
- catch {
14
- return "0.1.0";
15
- }
16
- }
17
- export function registerVersion(program) {
18
- program
19
- .command("version")
20
- .description("Show CLI version")
21
- .action(() => {
22
- const version = getVersion();
23
- if (isJSONMode()) {
24
- printJSON({
25
- version,
26
- platform: process.platform,
27
- arch: process.arch,
28
- node: process.version,
29
- });
30
- }
31
- else {
32
- console.log(`lizard v${version}`);
33
- console.log(`${process.platform}/${process.arch} node/${process.version}`);
34
- }
35
- });
36
- }
37
- //# sourceMappingURL=version.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,gCAAgC;QAChC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,kBAAkB,CAAC;SAC/B,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,SAAS,CAAC;gBACR,OAAO;gBACP,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,OAAO,CAAC,OAAO;aACtB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,145 +0,0 @@
1
- import { execSync } from "node:child_process";
2
- import chalk from "chalk";
3
- import * as p from "@clack/prompts";
4
- import { Command } from "commander";
5
- import { api } from "../lib/api.js";
6
- import { resolveProjectId } from "../lib/config.js";
7
- import { info, isJSONMode, printJSON, isTTY } from "../lib/format.js";
8
-
9
- interface Addon {
10
- id: string;
11
- name: string;
12
- addonType: string;
13
- status: string;
14
- hostname?: string;
15
- config?: string;
16
- }
17
-
18
- const CLIENT_COMMANDS: Record<string, string> = {
19
- postgres: "psql",
20
- mysql: "mysql",
21
- mongodb: "mongosh",
22
- redis: "redis-cli",
23
- };
24
-
25
- export function registerConnect(program: Command) {
26
- program
27
- .command("connect")
28
- .argument("[service]", "Service type or ID (postgres, redis, etc.)")
29
- .description("Connect to a managed service")
30
- .option("--url", "Print connection string without connecting")
31
- .action(async (service: string | undefined, opts) => {
32
- const projectId = resolveProjectId(program.opts().project);
33
-
34
- // Get addons
35
- const addons = await api.get<Addon[]>(
36
- `/api/projects/${projectId}/addons`,
37
- );
38
-
39
- if (addons.length === 0) {
40
- throw new Error("No managed services in this project. Use `lizard add`.");
41
- }
42
-
43
- let addon: Addon | undefined;
44
-
45
- if (service) {
46
- // Match by type or ID
47
- addon =
48
- addons.find((a) => a.addonType === service) ||
49
- addons.find((a) => a.id === service) ||
50
- addons.find((a) => a.name === service);
51
- } else if (addons.length === 1) {
52
- addon = addons[0];
53
- } else {
54
- if (!isTTY()) {
55
- throw new Error(
56
- "Multiple services found. Specify one: " +
57
- addons.map((a) => a.addonType || a.name).join(", "),
58
- );
59
- }
60
- const selected = await p.select({
61
- message: "Select service to connect to",
62
- options: addons.map((a) => ({
63
- value: a.id,
64
- label: a.name || a.addonType,
65
- hint: a.addonType,
66
- })),
67
- });
68
- if (p.isCancel(selected)) process.exit(5);
69
- addon = addons.find((a) => a.id === selected);
70
- }
71
-
72
- if (!addon) {
73
- throw new Error(`Service "${service}" not found`);
74
- }
75
-
76
- if (addon.status !== "running") {
77
- throw new Error(`Service is ${addon.status}, not running`);
78
- }
79
-
80
- // Build connection string from secrets
81
- const secrets = await api.get<Array<{ key: string; value: string }>>(
82
- `/api/projects/${projectId}/secrets`,
83
- );
84
-
85
- const connString = findConnectionString(addon.addonType, secrets);
86
-
87
- if (opts.url || isJSONMode()) {
88
- if (isJSONMode()) {
89
- printJSON({ type: addon.addonType, connectionString: connString });
90
- } else {
91
- console.log(connString || "Connection string not found in secrets");
92
- }
93
- return;
94
- }
95
-
96
- if (!connString) {
97
- throw new Error(
98
- "Connection string not found in project secrets. Check `lizard secret list --show`.",
99
- );
100
- }
101
-
102
- // Connect using native client
103
- const clientCmd = CLIENT_COMMANDS[addon.addonType];
104
- if (!clientCmd) {
105
- info(`Connection string: ${connString}`);
106
- return;
107
- }
108
-
109
- info(chalk.dim(`Connecting via ${clientCmd}...\n`));
110
-
111
- try {
112
- if (addon.addonType === "postgres") {
113
- execSync(`${clientCmd} "${connString}"`, { stdio: "inherit" });
114
- } else if (addon.addonType === "redis") {
115
- // redis-cli -u redis://...
116
- execSync(`${clientCmd} -u "${connString}"`, { stdio: "inherit" });
117
- } else if (addon.addonType === "mysql") {
118
- execSync(`${clientCmd} "${connString}"`, { stdio: "inherit" });
119
- } else if (addon.addonType === "mongodb") {
120
- execSync(`${clientCmd} "${connString}"`, { stdio: "inherit" });
121
- }
122
- } catch (err: any) {
123
- process.exit(err.status || 1);
124
- }
125
- });
126
- }
127
-
128
- function findConnectionString(
129
- type: string,
130
- secrets: Array<{ key: string; value: string }>,
131
- ): string | null {
132
- const envKeys: Record<string, string[]> = {
133
- postgres: ["DATABASE_URL", "POSTGRES_URL", "PG_URL"],
134
- mysql: ["MYSQL_URL", "DATABASE_URL"],
135
- mongodb: ["MONGODB_URL", "MONGO_URL"],
136
- redis: ["REDIS_URL"],
137
- };
138
-
139
- const keys = envKeys[type] || [];
140
- for (const key of keys) {
141
- const s = secrets.find((s) => s.key === key);
142
- if (s) return s.value;
143
- }
144
- return null;
145
- }
@@ -1,93 +0,0 @@
1
- import chalk from "chalk";
2
- import { Command } from "commander";
3
- import { api } from "../lib/api.js";
4
- import { resolveProjectId, findProjectConfig } from "../lib/config.js";
5
- import { isJSONMode, printJSON, statusColor, table } from "../lib/format.js";
6
-
7
- export function registerContext(program: Command) {
8
- program
9
- .command("context")
10
- .description("Show full project context (optimized for AI agents)")
11
- .action(async () => {
12
- const projectId = resolveProjectId(program.opts().project);
13
- const config = findProjectConfig();
14
-
15
- const [project, services, secrets] = await Promise.all([
16
- api.get<{ id: string; name: string; slug: string }>(
17
- `/api/projects/${projectId}`,
18
- ),
19
- api.get<{ apps: any[]; addons: any[] }>(
20
- `/api/projects/${projectId}/services`,
21
- ),
22
- api.get<Array<{ key: string; value: string }>>(
23
- `/api/projects/${projectId}/secrets`,
24
- ).catch(() => []),
25
- ]);
26
-
27
- const context = {
28
- project: {
29
- id: project.id,
30
- name: project.name,
31
- slug: project.slug,
32
- },
33
- environment: config?.environment || "production",
34
- apps: (services.apps || []).map((a: any) => ({
35
- id: a.id,
36
- name: a.name,
37
- status: a.status,
38
- domain: a.domain,
39
- repo: a.repo,
40
- branch: a.branch,
41
- cpuLimit: a.cpuLimit,
42
- memoryLimit: a.memoryLimit,
43
- })),
44
- addons: (services.addons || []).map((a: any) => ({
45
- id: a.id,
46
- name: a.name,
47
- type: a.addonType,
48
- status: a.status,
49
- hostname: a.hostname,
50
- })),
51
- secrets: secrets.map((s) => s.key), // names only, not values
52
- };
53
-
54
- // Always JSON for pipe, since this is designed for AI agents
55
- if (isJSONMode() || !process.stdout.isTTY) {
56
- printJSON(context);
57
- return;
58
- }
59
-
60
- // Human-readable
61
- console.log(chalk.bold(context.project.name) + chalk.dim(` (${context.project.id})`));
62
- console.log(chalk.dim(`Environment: ${context.environment}`));
63
- console.log();
64
-
65
- if (context.apps.length > 0) {
66
- console.log(chalk.bold("Apps:"));
67
- table(
68
- ["Name", "Status", "Domain"],
69
- context.apps.map((a) => [
70
- a.name,
71
- statusColor(a.status),
72
- a.domain ? `https://${a.domain}` : "—",
73
- ]),
74
- );
75
- console.log();
76
- }
77
-
78
- if (context.addons.length > 0) {
79
- console.log(chalk.bold("Addons:"));
80
- table(
81
- ["Name", "Type", "Status", "Host"],
82
- context.addons.map((a) => [a.name, a.type, statusColor(a.status), a.hostname || "—"]),
83
- );
84
- console.log();
85
- }
86
-
87
- if (context.secrets.length > 0) {
88
- console.log(
89
- chalk.bold("Secrets:") + " " + context.secrets.join(", "),
90
- );
91
- }
92
- });
93
- }