@lizard-build/cli 0.1.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 (115) hide show
  1. package/dist/commands/add.d.ts +2 -0
  2. package/dist/commands/add.js +72 -0
  3. package/dist/commands/add.js.map +1 -0
  4. package/dist/commands/connect.d.ts +2 -0
  5. package/dist/commands/connect.js +117 -0
  6. package/dist/commands/connect.js.map +1 -0
  7. package/dist/commands/context.d.ts +2 -0
  8. package/dist/commands/context.js +71 -0
  9. package/dist/commands/context.js.map +1 -0
  10. package/dist/commands/deploy.d.ts +2 -0
  11. package/dist/commands/deploy.js +120 -0
  12. package/dist/commands/deploy.js.map +1 -0
  13. package/dist/commands/destroy.d.ts +2 -0
  14. package/dist/commands/destroy.js +51 -0
  15. package/dist/commands/destroy.js.map +1 -0
  16. package/dist/commands/git.d.ts +2 -0
  17. package/dist/commands/git.js +67 -0
  18. package/dist/commands/git.js.map +1 -0
  19. package/dist/commands/init.d.ts +2 -0
  20. package/dist/commands/init.js +107 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/link.d.ts +2 -0
  23. package/dist/commands/link.js +50 -0
  24. package/dist/commands/link.js.map +1 -0
  25. package/dist/commands/login.d.ts +7 -0
  26. package/dist/commands/login.js +123 -0
  27. package/dist/commands/login.js.map +1 -0
  28. package/dist/commands/logout.d.ts +2 -0
  29. package/dist/commands/logout.js +17 -0
  30. package/dist/commands/logout.js.map +1 -0
  31. package/dist/commands/logs.d.ts +2 -0
  32. package/dist/commands/logs.js +92 -0
  33. package/dist/commands/logs.js.map +1 -0
  34. package/dist/commands/open.d.ts +2 -0
  35. package/dist/commands/open.js +16 -0
  36. package/dist/commands/open.js.map +1 -0
  37. package/dist/commands/projects.d.ts +2 -0
  38. package/dist/commands/projects.js +28 -0
  39. package/dist/commands/projects.js.map +1 -0
  40. package/dist/commands/ps.d.ts +2 -0
  41. package/dist/commands/ps.js +52 -0
  42. package/dist/commands/ps.js.map +1 -0
  43. package/dist/commands/redeploy.d.ts +2 -0
  44. package/dist/commands/redeploy.js +69 -0
  45. package/dist/commands/redeploy.js.map +1 -0
  46. package/dist/commands/regions.d.ts +2 -0
  47. package/dist/commands/regions.js +23 -0
  48. package/dist/commands/regions.js.map +1 -0
  49. package/dist/commands/restart.d.ts +2 -0
  50. package/dist/commands/restart.js +21 -0
  51. package/dist/commands/restart.js.map +1 -0
  52. package/dist/commands/run.d.ts +2 -0
  53. package/dist/commands/run.js +33 -0
  54. package/dist/commands/run.js.map +1 -0
  55. package/dist/commands/secrets.d.ts +2 -0
  56. package/dist/commands/secrets.js +138 -0
  57. package/dist/commands/secrets.js.map +1 -0
  58. package/dist/commands/status.d.ts +2 -0
  59. package/dist/commands/status.js +51 -0
  60. package/dist/commands/status.js.map +1 -0
  61. package/dist/commands/update.d.ts +2 -0
  62. package/dist/commands/update.js +41 -0
  63. package/dist/commands/update.js.map +1 -0
  64. package/dist/commands/version.d.ts +2 -0
  65. package/dist/commands/version.js +37 -0
  66. package/dist/commands/version.js.map +1 -0
  67. package/dist/commands/whoami.d.ts +2 -0
  68. package/dist/commands/whoami.js +21 -0
  69. package/dist/commands/whoami.js.map +1 -0
  70. package/dist/index.d.ts +2 -0
  71. package/dist/index.js +151 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/lib/api.d.ts +19 -0
  74. package/dist/lib/api.js +114 -0
  75. package/dist/lib/api.js.map +1 -0
  76. package/dist/lib/auth.d.ts +23 -0
  77. package/dist/lib/auth.js +89 -0
  78. package/dist/lib/auth.js.map +1 -0
  79. package/dist/lib/config.d.ts +23 -0
  80. package/dist/lib/config.js +77 -0
  81. package/dist/lib/config.js.map +1 -0
  82. package/dist/lib/format.d.ts +11 -0
  83. package/dist/lib/format.js +86 -0
  84. package/dist/lib/format.js.map +1 -0
  85. package/install.sh +59 -0
  86. package/package.json +35 -0
  87. package/src/commands/add.ts +100 -0
  88. package/src/commands/connect.ts +145 -0
  89. package/src/commands/context.ts +93 -0
  90. package/src/commands/deploy.ts +153 -0
  91. package/src/commands/destroy.ts +51 -0
  92. package/src/commands/git.ts +80 -0
  93. package/src/commands/init.ts +139 -0
  94. package/src/commands/link.ts +63 -0
  95. package/src/commands/login.ts +158 -0
  96. package/src/commands/logout.ts +17 -0
  97. package/src/commands/logs.ts +104 -0
  98. package/src/commands/open.ts +17 -0
  99. package/src/commands/projects.ts +45 -0
  100. package/src/commands/ps.ts +80 -0
  101. package/src/commands/redeploy.ts +74 -0
  102. package/src/commands/regions.ts +38 -0
  103. package/src/commands/restart.ts +24 -0
  104. package/src/commands/run.ts +43 -0
  105. package/src/commands/secrets.ts +175 -0
  106. package/src/commands/status.ts +65 -0
  107. package/src/commands/update.ts +44 -0
  108. package/src/commands/version.ts +37 -0
  109. package/src/commands/whoami.ts +27 -0
  110. package/src/index.ts +168 -0
  111. package/src/lib/api.ts +134 -0
  112. package/src/lib/auth.ts +113 -0
  113. package/src/lib/config.ts +93 -0
  114. package/src/lib/format.ts +95 -0
  115. package/tsconfig.json +17 -0
@@ -0,0 +1,19 @@
1
+ export declare function setBaseURL(url: string): void;
2
+ export declare function getBaseURL(): string;
3
+ export declare function setAccessToken(token: string): void;
4
+ export declare class APIError extends Error {
5
+ status: number;
6
+ code: string;
7
+ constructor(status: number, message: string, code?: string);
8
+ }
9
+ export declare function isNotFound(err: unknown): boolean;
10
+ export declare function isAuthError(err: unknown): boolean;
11
+ export declare const api: {
12
+ get: <T = any>(path: string) => Promise<T>;
13
+ post: <T = any>(path: string, body?: unknown) => Promise<T>;
14
+ put: <T = any>(path: string, body?: unknown) => Promise<T>;
15
+ patch: <T = any>(path: string, body?: unknown) => Promise<T>;
16
+ delete: <T = any>(path: string) => Promise<T>;
17
+ };
18
+ /** Stream SSE and call handler for each data line. Return false to stop. */
19
+ export declare function streamSSE(path: string, handler: (event: string, data: string) => boolean | void): Promise<void>;
@@ -0,0 +1,114 @@
1
+ import { getToken } from "./auth.js";
2
+ const DEFAULT_BASE_URL = "https://lizard.build";
3
+ const USER_AGENT = "lizard-cli/0.1";
4
+ let baseURL = process.env.LIZARD_API_URL || DEFAULT_BASE_URL;
5
+ let _accessToken = null;
6
+ export function setBaseURL(url) { baseURL = url; }
7
+ export function getBaseURL() { return baseURL; }
8
+ export function setAccessToken(token) { _accessToken = token; }
9
+ export class APIError extends Error {
10
+ status;
11
+ code;
12
+ constructor(status, message, code = "") {
13
+ super(message);
14
+ this.status = status;
15
+ this.code = code;
16
+ }
17
+ }
18
+ export function isNotFound(err) {
19
+ return err instanceof APIError && err.status === 404;
20
+ }
21
+ export function isAuthError(err) {
22
+ return err instanceof APIError && (err.status === 401 || err.status === 403);
23
+ }
24
+ async function request(method, path, body) {
25
+ const url = baseURL + path;
26
+ const token = _accessToken || getToken();
27
+ const headers = {
28
+ "User-Agent": USER_AGENT,
29
+ };
30
+ if (token) {
31
+ headers["Authorization"] = `Bearer ${token}`;
32
+ }
33
+ if (body !== undefined) {
34
+ headers["Content-Type"] = "application/json";
35
+ }
36
+ const res = await fetch(url, {
37
+ method,
38
+ headers,
39
+ body: body !== undefined ? JSON.stringify(body) : undefined,
40
+ });
41
+ if (!res.ok) {
42
+ let msg = res.statusText;
43
+ let code = "";
44
+ try {
45
+ const j = (await res.json());
46
+ msg = j.error || j.message || msg;
47
+ code = j.code || "";
48
+ }
49
+ catch { }
50
+ throw new APIError(res.status, msg, code);
51
+ }
52
+ const text = await res.text();
53
+ if (!text)
54
+ return undefined;
55
+ return JSON.parse(text);
56
+ }
57
+ export const api = {
58
+ get: (path) => request("GET", path),
59
+ post: (path, body) => request("POST", path, body),
60
+ put: (path, body) => request("PUT", path, body),
61
+ patch: (path, body) => request("PATCH", path, body),
62
+ delete: (path) => request("DELETE", path),
63
+ };
64
+ /** Stream SSE and call handler for each data line. Return false to stop. */
65
+ export async function streamSSE(path, handler) {
66
+ const url = baseURL + path;
67
+ const token = _accessToken || getToken();
68
+ const headers = {
69
+ "User-Agent": USER_AGENT,
70
+ Accept: "text/event-stream",
71
+ };
72
+ if (token)
73
+ headers["Authorization"] = `Bearer ${token}`;
74
+ const res = await fetch(url, { headers });
75
+ if (!res.ok) {
76
+ throw new APIError(res.status, `SSE failed: ${res.statusText}`);
77
+ }
78
+ if (!res.body)
79
+ return;
80
+ const reader = res.body.getReader();
81
+ const decoder = new TextDecoder();
82
+ let buffer = "";
83
+ let currentEvent = "";
84
+ let currentData = "";
85
+ while (true) {
86
+ const { done, value } = await reader.read();
87
+ if (done)
88
+ break;
89
+ buffer += decoder.decode(value, { stream: true });
90
+ const lines = buffer.split("\n");
91
+ buffer = lines.pop() || "";
92
+ for (const line of lines) {
93
+ const trimmed = line.replace(/\r$/, "");
94
+ if (trimmed === "") {
95
+ if (currentData) {
96
+ const cont = handler(currentEvent, currentData);
97
+ if (cont === false) {
98
+ reader.cancel();
99
+ return;
100
+ }
101
+ }
102
+ currentEvent = "";
103
+ currentData = "";
104
+ }
105
+ else if (trimmed.startsWith("event:")) {
106
+ currentEvent = trimmed.slice(6).trim();
107
+ }
108
+ else if (trimmed.startsWith("data:")) {
109
+ currentData = trimmed.slice(5).trimStart();
110
+ }
111
+ }
112
+ }
113
+ }
114
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface Credentials {
2
+ accessToken: string;
3
+ refreshToken?: string;
4
+ expiresAt?: string;
5
+ userId: string;
6
+ username: string;
7
+ email?: string;
8
+ avatarUrl?: string;
9
+ }
10
+ export declare function setTokenOverride(token: string): void;
11
+ /** Get the active token in priority order: override → env → file */
12
+ export declare function getToken(): string | null;
13
+ export declare function loadCredentials(): Credentials | null;
14
+ export declare function saveCredentials(creds: Credentials): void;
15
+ export declare function clearCredentials(): void;
16
+ export declare function isLoggedIn(): boolean;
17
+ /**
18
+ * Ensure the user is authenticated. If not logged in and TTY, auto-login.
19
+ * Returns credentials or throws.
20
+ */
21
+ export declare function requireAuth(): Promise<Credentials>;
22
+ /** Open a URL in the default browser, or print it if headless. */
23
+ export declare function openURL(url: string): Promise<boolean>;
@@ -0,0 +1,89 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ import open from "open";
5
+ const LIZARD_DIR = path.join(os.homedir(), ".lizard");
6
+ const CREDENTIALS_FILE = path.join(LIZARD_DIR, "credentials.json");
7
+ let tokenOverride = null;
8
+ export function setTokenOverride(token) {
9
+ tokenOverride = token;
10
+ }
11
+ /** Get the active token in priority order: override → env → file */
12
+ export function getToken() {
13
+ if (tokenOverride)
14
+ return tokenOverride;
15
+ if (process.env.LIZARD_TOKEN)
16
+ return process.env.LIZARD_TOKEN;
17
+ const creds = loadCredentials();
18
+ return creds?.accessToken ?? null;
19
+ }
20
+ export function loadCredentials() {
21
+ try {
22
+ const data = fs.readFileSync(CREDENTIALS_FILE, "utf-8");
23
+ return JSON.parse(data);
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ export function saveCredentials(creds) {
30
+ fs.mkdirSync(LIZARD_DIR, { recursive: true });
31
+ fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), {
32
+ mode: 0o600,
33
+ });
34
+ }
35
+ export function clearCredentials() {
36
+ try {
37
+ fs.unlinkSync(CREDENTIALS_FILE);
38
+ }
39
+ catch { }
40
+ }
41
+ export function isLoggedIn() {
42
+ return getToken() !== null;
43
+ }
44
+ function isTTY() {
45
+ return Boolean(process.stdout.isTTY);
46
+ }
47
+ /**
48
+ * Ensure the user is authenticated. If not logged in and TTY, auto-login.
49
+ * Returns credentials or throws.
50
+ */
51
+ export async function requireAuth() {
52
+ // Token override or env var — we don't have full Credentials, fake it
53
+ if (tokenOverride || process.env.LIZARD_TOKEN) {
54
+ return {
55
+ accessToken: (tokenOverride || process.env.LIZARD_TOKEN),
56
+ userId: "",
57
+ username: "",
58
+ };
59
+ }
60
+ const creds = loadCredentials();
61
+ if (creds)
62
+ return creds;
63
+ // Not logged in
64
+ if (!isTTY()) {
65
+ throw new Error("Not authenticated. Set LIZARD_TOKEN or run `lizard login` first.");
66
+ }
67
+ // Auto-login
68
+ const { performLogin } = await import("../commands/login.js");
69
+ return performLogin();
70
+ }
71
+ /** Open a URL in the default browser, or print it if headless. */
72
+ export async function openURL(url) {
73
+ const isSSH = Boolean(process.env.SSH_CLIENT || process.env.SSH_TTY || process.env.SSH_CONNECTION);
74
+ const isCI = Boolean(process.env.CI);
75
+ const noDisplay = process.platform === "linux" &&
76
+ !process.env.DISPLAY &&
77
+ !process.env.WAYLAND_DISPLAY;
78
+ if (isSSH || isCI || noDisplay) {
79
+ return false; // caller should show URL manually
80
+ }
81
+ try {
82
+ await open(url);
83
+ return true;
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ }
89
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface ProjectConfig {
2
+ workspaceId?: string;
3
+ projectId: string;
4
+ projectName?: string;
5
+ environment?: string;
6
+ }
7
+ export interface GlobalSettings {
8
+ defaultWorkspace?: string;
9
+ }
10
+ /** Find project config by walking up from cwd */
11
+ export declare function findProjectConfig(): ProjectConfig | null;
12
+ /** Save project config in cwd */
13
+ export declare function saveProjectConfig(config: ProjectConfig): void;
14
+ export declare function loadGlobalSettings(): GlobalSettings;
15
+ export declare function saveGlobalSettings(settings: GlobalSettings): void;
16
+ /**
17
+ * Resolve projectId from: --project flag → .lizard/config.json → error
18
+ */
19
+ export declare function resolveProjectId(flagValue?: string): string;
20
+ /**
21
+ * Resolve environment from: --environment flag → .lizard/config.json → "production"
22
+ */
23
+ export declare function resolveEnvironment(flagValue?: string): string;
@@ -0,0 +1,77 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ const CONFIG_DIR = ".lizard";
5
+ const CONFIG_FILE = "config.json";
6
+ const GLOBAL_SETTINGS_FILE = path.join(os.homedir(), ".lizard", "settings.json");
7
+ /** Find project config by walking up from cwd */
8
+ export function findProjectConfig() {
9
+ let dir = process.cwd();
10
+ while (true) {
11
+ const configPath = path.join(dir, CONFIG_DIR, CONFIG_FILE);
12
+ if (fs.existsSync(configPath)) {
13
+ try {
14
+ return JSON.parse(fs.readFileSync(configPath, "utf-8"));
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ const parent = path.dirname(dir);
21
+ if (parent === dir)
22
+ break;
23
+ dir = parent;
24
+ }
25
+ return null;
26
+ }
27
+ /** Save project config in cwd */
28
+ export function saveProjectConfig(config) {
29
+ const dir = path.join(process.cwd(), CONFIG_DIR);
30
+ fs.mkdirSync(dir, { recursive: true });
31
+ fs.writeFileSync(path.join(dir, CONFIG_FILE), JSON.stringify(config, null, 2));
32
+ // Add .lizard/ to .gitignore if not already there
33
+ const gitignorePath = path.join(process.cwd(), ".gitignore");
34
+ try {
35
+ const existing = fs.existsSync(gitignorePath)
36
+ ? fs.readFileSync(gitignorePath, "utf-8")
37
+ : "";
38
+ if (!existing.includes(".lizard/")) {
39
+ fs.appendFileSync(gitignorePath, (existing.endsWith("\n") ? "" : "\n") + ".lizard/\n");
40
+ }
41
+ }
42
+ catch { }
43
+ }
44
+ export function loadGlobalSettings() {
45
+ try {
46
+ return JSON.parse(fs.readFileSync(GLOBAL_SETTINGS_FILE, "utf-8"));
47
+ }
48
+ catch {
49
+ return {};
50
+ }
51
+ }
52
+ export function saveGlobalSettings(settings) {
53
+ const dir = path.dirname(GLOBAL_SETTINGS_FILE);
54
+ fs.mkdirSync(dir, { recursive: true });
55
+ fs.writeFileSync(GLOBAL_SETTINGS_FILE, JSON.stringify(settings, null, 2));
56
+ }
57
+ /**
58
+ * Resolve projectId from: --project flag → .lizard/config.json → error
59
+ */
60
+ export function resolveProjectId(flagValue) {
61
+ if (flagValue)
62
+ return flagValue;
63
+ const config = findProjectConfig();
64
+ if (config?.projectId)
65
+ return config.projectId;
66
+ throw new Error("No project linked. Run `lizard init` or `lizard link` first, or use --project <id>.");
67
+ }
68
+ /**
69
+ * Resolve environment from: --environment flag → .lizard/config.json → "production"
70
+ */
71
+ export function resolveEnvironment(flagValue) {
72
+ if (flagValue)
73
+ return flagValue;
74
+ const config = findProjectConfig();
75
+ return config?.environment ?? "production";
76
+ }
77
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare function isTTY(): boolean;
2
+ export declare function setJSONMode(on: boolean): void;
3
+ export declare function isJSONMode(): boolean;
4
+ export declare function printJSON(data: unknown): void;
5
+ export declare function success(msg: string): void;
6
+ export declare function error(msg: string): void;
7
+ export declare function warn(msg: string): void;
8
+ export declare function info(msg: string): void;
9
+ export declare function table(headers: string[], rows: string[][]): void;
10
+ export declare function statusColor(status: string): string;
11
+ export declare function timeAgo(ts: number | string): string;
@@ -0,0 +1,86 @@
1
+ import chalk from "chalk";
2
+ export function isTTY() {
3
+ return Boolean(process.stdout.isTTY);
4
+ }
5
+ let jsonMode = false;
6
+ export function setJSONMode(on) {
7
+ jsonMode = on;
8
+ }
9
+ export function isJSONMode() {
10
+ return jsonMode;
11
+ }
12
+ export function printJSON(data) {
13
+ console.log(JSON.stringify(data, null, 2));
14
+ }
15
+ export function success(msg) {
16
+ if (jsonMode)
17
+ return;
18
+ process.stderr.write(chalk.green("✓") + " " + msg + "\n");
19
+ }
20
+ export function error(msg) {
21
+ process.stderr.write(chalk.red("Error:") + " " + msg + "\n");
22
+ }
23
+ export function warn(msg) {
24
+ process.stderr.write(chalk.yellow("Warning:") + " " + msg + "\n");
25
+ }
26
+ export function info(msg) {
27
+ if (jsonMode)
28
+ return;
29
+ process.stderr.write(msg + "\n");
30
+ }
31
+ export function table(headers, rows) {
32
+ if (rows.length === 0)
33
+ return;
34
+ const widths = headers.map((h) => h.length);
35
+ for (const row of rows) {
36
+ for (let i = 0; i < row.length; i++) {
37
+ if (i < widths.length) {
38
+ widths[i] = Math.max(widths[i], (row[i] || "").length);
39
+ }
40
+ }
41
+ }
42
+ const header = headers
43
+ .map((h, i) => h.toUpperCase().padEnd(widths[i]))
44
+ .join(" ");
45
+ console.log(chalk.dim(header));
46
+ for (const row of rows) {
47
+ const line = headers
48
+ .map((_, i) => (row[i] || "").padEnd(widths[i]))
49
+ .join(" ");
50
+ console.log(line);
51
+ }
52
+ }
53
+ export function statusColor(status) {
54
+ switch (status) {
55
+ case "running":
56
+ return chalk.green(status);
57
+ case "failed":
58
+ case "error":
59
+ return chalk.red(status);
60
+ case "building":
61
+ case "deploying":
62
+ case "restarting":
63
+ case "pending":
64
+ return chalk.yellow(status);
65
+ case "deleting":
66
+ return chalk.dim(status);
67
+ default:
68
+ return status;
69
+ }
70
+ }
71
+ export function timeAgo(ts) {
72
+ const ms = typeof ts === "string" ? Date.parse(ts) : ts;
73
+ const diff = Date.now() - ms;
74
+ const secs = Math.floor(diff / 1000);
75
+ if (secs < 60)
76
+ return `${secs}s ago`;
77
+ const mins = Math.floor(secs / 60);
78
+ if (mins < 60)
79
+ return `${mins}m ago`;
80
+ const hours = Math.floor(mins / 60);
81
+ if (hours < 24)
82
+ return `${hours}h ago`;
83
+ const days = Math.floor(hours / 24);
84
+ return `${days}d ago`;
85
+ }
86
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"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"}
package/install.sh ADDED
@@ -0,0 +1,59 @@
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ BOLD="\033[1m"
5
+ GREEN="\033[32m"
6
+ CYAN="\033[36m"
7
+ RED="\033[31m"
8
+ DIM="\033[2m"
9
+ RESET="\033[0m"
10
+
11
+ echo ""
12
+ echo -e "${BOLD}Lizard CLI${RESET} installer"
13
+ echo ""
14
+
15
+ # ── Check Node.js ────────────────────────────────────────────────────────────
16
+
17
+ if ! command -v node >/dev/null 2>&1; then
18
+ echo -e "${RED}Error:${RESET} Node.js is required but not found."
19
+ echo ""
20
+ echo "Install Node.js 18+ from https://nodejs.org"
21
+ echo "Or use a version manager:"
22
+ echo " curl -fsSL https://fnm.vercel.app/install | bash"
23
+ exit 1
24
+ fi
25
+
26
+ NODE_MAJOR=$(node -e "process.stdout.write(String(parseInt(process.version.slice(1))))")
27
+ if [ "$NODE_MAJOR" -lt 18 ]; then
28
+ echo -e "${RED}Error:${RESET} Node.js 18+ is required (you have $(node -v))"
29
+ echo "Upgrade at https://nodejs.org"
30
+ exit 1
31
+ fi
32
+
33
+ # ── Install via npm ──────────────────────────────────────────────────────────
34
+
35
+ if ! command -v npm >/dev/null 2>&1; then
36
+ echo -e "${RED}Error:${RESET} npm not found. Please install npm."
37
+ exit 1
38
+ fi
39
+
40
+ echo -e "${DIM}Installing @lizard-build/cli...${RESET}"
41
+ npm install -g @lizard-build/cli --quiet
42
+
43
+ # ── Verify ───────────────────────────────────────────────────────────────────
44
+
45
+ if ! command -v lizard >/dev/null 2>&1; then
46
+ echo ""
47
+ echo -e "${RED}Error:${RESET} Installation succeeded but 'lizard' is not in PATH."
48
+ echo "You may need to add npm global bin to your PATH:"
49
+ echo " export PATH=\"\$(npm prefix -g)/bin:\$PATH\""
50
+ exit 1
51
+ fi
52
+
53
+ VERSION=$(lizard version --json 2>/dev/null | node -e "process.stdin.resume();let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{process.stdout.write(JSON.parse(d).version)}catch{process.stdout.write('?')}})" 2>/dev/null || echo "?")
54
+
55
+ echo ""
56
+ echo -e "${GREEN}✓${RESET} Lizard CLI ${BOLD}v${VERSION}${RESET} installed"
57
+ echo ""
58
+ echo -e " Run ${CYAN}lizard login${RESET} to get started"
59
+ echo ""
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@lizard-build/cli",
3
+ "version": "0.1.0",
4
+ "description": "Lizard CLI — deploy and manage apps on Lizard",
5
+ "type": "module",
6
+ "bin": {
7
+ "lizard": "./dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "dev": "tsx src/index.ts",
11
+ "build": "tsc",
12
+ "start": "node dist/index.js"
13
+ },
14
+ "keywords": [
15
+ "cli",
16
+ "deploy",
17
+ "paas",
18
+ "lizard"
19
+ ],
20
+ "author": "Lizard Build",
21
+ "license": "MIT",
22
+ "dependencies": {
23
+ "@clack/prompts": "^1.2.0",
24
+ "chalk": "^5.6.2",
25
+ "commander": "^14.0.3",
26
+ "conf": "^15.1.0",
27
+ "open": "^10.2.0",
28
+ "ora": "^9.3.0"
29
+ },
30
+ "devDependencies": {
31
+ "@types/node": "^25.6.0",
32
+ "tsx": "^4.21.0",
33
+ "typescript": "^6.0.3"
34
+ }
35
+ }