@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
@@ -0,0 +1,90 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ jobs:
9
+ release:
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: write
13
+ id-token: write # required for npm OIDC Trusted Publisher
14
+
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ with:
18
+ fetch-depth: 0
19
+ token: ${{ secrets.GITHUB_TOKEN }}
20
+
21
+ - name: Configure git
22
+ run: |
23
+ git config user.name "github-actions[bot]"
24
+ git config user.email "github-actions[bot]@users.noreply.github.com"
25
+
26
+ - name: Bump patch version
27
+ id: bump
28
+ run: |
29
+ CURRENT=$(node -p "require('./package.json').version")
30
+ IFS='.' read -r MAJ MIN PAT <<< "$CURRENT"
31
+ NEW="$MAJ.$MIN.$((PAT + 1))"
32
+ echo "version=$NEW" >> $GITHUB_OUTPUT
33
+
34
+ node -e "
35
+ const fs = require('fs');
36
+ const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
37
+ pkg.version = '$NEW';
38
+ fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n');
39
+ "
40
+ sed -i "s/export const CURRENT_VERSION = \".*\"/export const CURRENT_VERSION = \"$NEW\"/" src/lib/updater.ts
41
+
42
+ git add package.json src/lib/updater.ts
43
+ git commit -m "chore: bump version to v$NEW [skip ci]"
44
+ git tag "v$NEW"
45
+ git push origin main --tags
46
+
47
+ - uses: actions/setup-node@v4
48
+ with:
49
+ node-version: '22'
50
+
51
+ - name: Upgrade npm
52
+ run: npm install -g npm@latest
53
+
54
+ - name: Install dependencies
55
+ run: npm ci
56
+
57
+ - name: Build
58
+ run: npm run build
59
+
60
+ - name: Publish to npm
61
+ run: npm publish --provenance --access public
62
+
63
+ - uses: oven-sh/setup-bun@v2
64
+ with:
65
+ bun-version: latest
66
+
67
+ - name: Install dependencies (bun)
68
+ run: bun install
69
+
70
+ - name: Build binaries
71
+ run: |
72
+ mkdir -p bin
73
+ bun build --compile --target=bun-darwin-arm64 src/index.ts --outfile bin/lizard-darwin-arm64
74
+ bun build --compile --target=bun-darwin-x64 src/index.ts --outfile bin/lizard-darwin-x64
75
+ bun build --compile --target=bun-linux-x64 src/index.ts --outfile bin/lizard-linux-x64
76
+ bun build --compile --target=bun-linux-arm64 src/index.ts --outfile bin/lizard-linux-arm64
77
+ bun build --compile --target=bun-windows-x64 src/index.ts --outfile bin/lizard-windows-x64.exe
78
+
79
+ - name: Create GitHub release
80
+ uses: softprops/action-gh-release@v2
81
+ with:
82
+ tag_name: v${{ steps.bump.outputs.version }}
83
+ name: v${{ steps.bump.outputs.version }}
84
+ files: |
85
+ bin/lizard-darwin-arm64
86
+ bin/lizard-darwin-x64
87
+ bin/lizard-linux-x64
88
+ bin/lizard-linux-arm64
89
+ bin/lizard-windows-x64.exe
90
+ generate_release_notes: true
package/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # Lizard CLI
2
+
3
+ Deploy and manage apps on [Lizard](https://lizard.build).
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ curl -fsSL https://lizard.build/install.sh | bash
9
+ ```
10
+
11
+ Or via npm:
12
+
13
+ ```bash
14
+ npm i -g @lizard-build/cli
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ```bash
20
+ lizard login
21
+ lizard init
22
+ lizard up
23
+ ```
24
+
25
+ ## Common commands
26
+
27
+ ```
28
+ lizard up # upload and deploy code
29
+ lizard logs # stream runtime logs
30
+ lizard ps # list services
31
+ lizard add # add a database or service
32
+ lizard secrets # manage secrets
33
+ lizard scale # scale replicas / CPU / memory
34
+ lizard domain # manage domains
35
+ ```
36
+
37
+ Run `lizard --help` for the full list.
38
+
39
+ ## License
40
+
41
+ MIT
@@ -1,24 +1,154 @@
1
1
  import chalk from "chalk";
2
2
  import * as p from "@clack/prompts";
3
- import { api } from "../lib/api.js";
4
- import { resolveProjectId } from "../lib/config.js";
3
+ import { api, withQuery, withScope } from "../lib/api.js";
4
+ import { getProjectLink, updateProjectLink, DEFAULT_REGION } from "../lib/config.js";
5
+ import { scopeForProject } from "../lib/resolve.js";
6
+ import { resolveWorkspace } from "../lib/picker.js";
5
7
  import { success, info, isJSONMode, printJSON, isTTY, table, } from "../lib/format.js";
8
+ import { validateName, addonRefName } from "../lib/name.js";
6
9
  const CATALOG = [
7
10
  { name: "postgres", label: "PostgreSQL", description: "Relational database" },
8
11
  { name: "redis", label: "Redis", description: "In-memory key-value store" },
9
- { name: "mysql", label: "MySQL", description: "Relational database" },
10
- { name: "mongodb", label: "MongoDB", description: "Document database" },
12
+ { name: "s3", label: "S3 Bucket", description: "S3-compatible object storage" },
11
13
  ];
14
+ async function detectPortFromDockerfile(repo) {
15
+ const repoPath = repo.startsWith("http") ? repo.replace(/^https?:\/\/github\.com\//, "") : repo;
16
+ for (const branch of ["main", "master"]) {
17
+ try {
18
+ const res = await fetch(`https://raw.githubusercontent.com/${repoPath}/${branch}/Dockerfile`, { signal: AbortSignal.timeout(5000) });
19
+ if (!res.ok)
20
+ continue;
21
+ const text = await res.text();
22
+ const match = text.match(/^EXPOSE\s+(\d+)/m);
23
+ if (match)
24
+ return parseInt(match[1], 10);
25
+ }
26
+ catch { }
27
+ }
28
+ return undefined;
29
+ }
30
+ /** Most-useful env var to surface as a reference example for each addon type.
31
+ * Mirrors urlKey in lizard-client/src/components/AddonPanel.tsx. */
32
+ function addonExampleVar(type) {
33
+ switch (type) {
34
+ case "postgres":
35
+ case "mysql":
36
+ return "DATABASE_URL";
37
+ case "mongo":
38
+ return "MONGODB_URL";
39
+ case "redis":
40
+ return "REDIS_URL";
41
+ case "s3":
42
+ return "S3_ENDPOINT";
43
+ default:
44
+ return "KEY";
45
+ }
46
+ }
47
+ function normalizeDbName(name) {
48
+ for (const c of CATALOG) {
49
+ if (c.name === name)
50
+ return c.name;
51
+ if (c.aliases?.includes(name))
52
+ return c.name;
53
+ }
54
+ return name;
55
+ }
56
+ /**
57
+ * Resolve a project by name/slug/id. Name-based lookup hits /api/projects and
58
+ * matches against the list. Falls back to the cwd-linked project when no
59
+ * -p/--project is supplied.
60
+ *
61
+ * When `workspaceFlag` is provided, the lookup is constrained to that
62
+ * workspace — useful for disambiguating identically-named projects.
63
+ */
64
+ async function resolveProject(flagValue, workspaceFlag) {
65
+ if (flagValue) {
66
+ let workspaceId;
67
+ if (workspaceFlag) {
68
+ workspaceId = (await resolveWorkspace(workspaceFlag)).id;
69
+ }
70
+ const projects = await api.get(withQuery("/api/projects", { workspaceId }));
71
+ const matches = projects.filter((pr) => pr.id === flagValue ||
72
+ pr.slug === flagValue ||
73
+ pr.name === flagValue);
74
+ if (matches.length === 0) {
75
+ throw new Error(`Project "${flagValue}" not found. Available: ${projects.map((pr) => pr.name).join(", ") || "(none)"}`);
76
+ }
77
+ if (matches.length > 1) {
78
+ const detail = matches
79
+ .map((m) => ` • ${m.name} in ${m.workspaceName ?? "(personal)"}`)
80
+ .join("\n");
81
+ throw new Error(`Multiple projects named "${flagValue}" found:\n${detail}\nPass --workspace to disambiguate.`);
82
+ }
83
+ return matches[0].id;
84
+ }
85
+ const link = getProjectLink();
86
+ if (link?.projectId)
87
+ return link.projectId;
88
+ throw new Error("No project linked to this directory. Pass -p <project-name> or run `lizard init`.");
89
+ }
90
+ function parseVariables(pairs) {
91
+ if (!pairs?.length)
92
+ return {};
93
+ const out = {};
94
+ for (const pair of pairs) {
95
+ const eq = pair.indexOf("=");
96
+ if (eq < 1)
97
+ throw new Error(`Invalid variable: "${pair}". Use KEY=value`);
98
+ out[pair.slice(0, eq)] = pair.slice(eq + 1);
99
+ }
100
+ return out;
101
+ }
12
102
  export function registerAdd(program) {
13
103
  program
14
104
  .command("add")
15
- .argument("[name]", "Service name from catalog (postgres, redis, mysql, mongodb)")
16
- .description("Add a service to the project")
17
- .option("--list", "Show available services")
18
- .option("--region <region>", "Region for the service")
19
- .action(async (name, opts) => {
20
- // Show catalog
21
- if (opts.list || (!name && !isTTY())) {
105
+ .argument("[types...]", "Addon type(s) to add (postgres / redis / s3). Multiple allowed: `add postgres redis s3`")
106
+ .description("Add a database, service, or repo to the project")
107
+ .option("-a, --addon <type...>", "Add one or more managed addons (multi-add: -a postgres -a redis -a s3)")
108
+ .option("-s, --service <name>", "Create an empty service with this name")
109
+ .option("-r, --repo <repo>", "Create a service from a GitHub repo (owner/repo)")
110
+ .option("-v, --variables <kv>", "KEY=value pair to seed the service. Repeat for multiple: -v K1=v1 -v K2=v2. Ignored for managed addons.", (val, prev) => [...prev, val], [])
111
+ .option("-n, --name <name>", "Name used in ${{<name>.KEY}} templates and shown in the dashboard. Renamable; refs stay stable.")
112
+ .option("--instance-name <name>", "(deprecated) alias for --name")
113
+ .option("-w, --workspace <ws>", "Disambiguate project lookup by workspace")
114
+ .option("--region <code>", "Region to provision the addon/service in")
115
+ .option("--no-deploy", "With -r: attach repo but skip the initial build. First deploy fires on next `service set` or `redeploy`.")
116
+ .option("--list", "Show available database types")
117
+ .action(async (types, opts, command) => {
118
+ const merged = command.optsWithGlobals();
119
+ await runAdd({
120
+ types,
121
+ addon: opts.addon,
122
+ service: opts.service,
123
+ repo: opts.repo,
124
+ variables: opts.variables,
125
+ name: opts.name,
126
+ instanceName: opts.instanceName,
127
+ workspace: opts.workspace,
128
+ region: opts.region,
129
+ noDeploy: opts.deploy === false,
130
+ list: opts.list,
131
+ projectFlag: merged.project,
132
+ });
133
+ });
134
+ }
135
+ async function runAdd(input) {
136
+ const types = input.types ?? [];
137
+ const opts = {
138
+ addon: input.addon,
139
+ service: input.service,
140
+ repo: input.repo,
141
+ variables: input.variables,
142
+ name: input.name,
143
+ instanceName: input.instanceName,
144
+ list: input.list,
145
+ };
146
+ const projectFlag = input.projectFlag;
147
+ const workspaceFlag = input.workspace;
148
+ const region = input.region ?? DEFAULT_REGION;
149
+ {
150
+ // ── --list: show DB catalog and exit ──────────────────────────────
151
+ if (opts.list || (!types.length && !opts.addon && !opts.service && !opts.repo && !isTTY())) {
22
152
  if (isJSONMode()) {
23
153
  printJSON(CATALOG);
24
154
  }
@@ -27,46 +157,189 @@ export function registerAdd(program) {
27
157
  }
28
158
  return;
29
159
  }
30
- // Interactive selection
31
- if (!name) {
32
- const selected = await p.select({
33
- message: "Select service to add",
34
- options: CATALOG.map((c) => ({
35
- value: c.name,
36
- label: c.label,
37
- hint: c.description,
38
- })),
39
- });
40
- if (p.isCancel(selected))
41
- process.exit(5);
42
- name = selected;
160
+ const variables = parseVariables(opts.variables);
161
+ if (opts.instanceName && !opts.name) {
162
+ info(chalk.yellow("Warning: --instance-name is deprecated, use --name instead."));
163
+ opts.name = opts.instanceName;
43
164
  }
44
- // Validate name is in catalog
45
- const catalogEntry = CATALOG.find((c) => c.name === name);
46
- if (!catalogEntry) {
47
- throw new Error(`Unknown service "${name}". Available: ${CATALOG.map((c) => c.name).join(", ")}`);
165
+ if (opts.name) {
166
+ const err = validateName(opts.name);
167
+ if (err)
168
+ throw new Error(`Invalid --name: ${err}`);
48
169
  }
49
- const projectId = resolveProjectId(program.opts().project);
50
- const region = opts.region || program.opts().region;
51
- info(`Adding ${chalk.cyan(catalogEntry.label)}...`);
52
- const addon = await api.post(`/api/projects/${projectId}/addons`, {
53
- addonType: name,
54
- region,
55
- });
56
- if (isJSONMode()) {
57
- printJSON(addon);
170
+ // Resolve project up front so we fail before any wizard prompts or
171
+ // API calls instead of after the user has filled out the wizard.
172
+ const projectId = await resolveProject(projectFlag, workspaceFlag);
173
+ const scope = await scopeForProject(projectId);
174
+ // ── positional <types...> and/or -a <type...> ────────────────────
175
+ const databases = [];
176
+ const candidates = [...(opts.addon ?? []), ...types];
177
+ for (const t of candidates) {
178
+ const norm = normalizeDbName(t);
179
+ if (!CATALOG.some((c) => c.name === norm)) {
180
+ throw new Error(`Unknown addon "${t}". Available: ${CATALOG.map((c) => c.name).join(", ")}`);
181
+ }
182
+ databases.push(norm);
183
+ }
184
+ // Nudge users off the verbose single-arg `-a` form toward `lizard add <type>`.
185
+ if (opts.addon?.length === 1 && !types.length && !isJSONMode()) {
186
+ info(chalk.dim(`Tip: shorter form — \`lizard add ${opts.addon[0]}\``));
187
+ }
188
+ if (databases.length > 0) {
189
+ if (opts.variables?.length) {
190
+ info(chalk.yellow("Warning: --variables is ignored for managed addons"));
191
+ }
192
+ const isSingle = databases.length === 1;
193
+ for (const db of databases) {
194
+ const cat = CATALOG.find((c) => c.name === db);
195
+ info(`Adding ${chalk.cyan(cat.label)}...`);
196
+ const addon = await api.post(withScope(`/api/projects/${projectId}/addons`, scope), {
197
+ type: db,
198
+ region,
199
+ ...(opts.name ? { name: opts.name } : {}),
200
+ });
201
+ if (isJSONMode())
202
+ printJSON(addon);
203
+ else {
204
+ success(`${cat.label} added`);
205
+ const ref = addonRefName({ name: addon.name, type: addon.type, addonType: addon.addonType });
206
+ const exampleVar = addonExampleVar(db);
207
+ if (ref)
208
+ info(` Name: ${chalk.bold(ref)}`);
209
+ if (ref) {
210
+ info("");
211
+ info(chalk.dim(` Reference the ${exampleVar} from other services:`));
212
+ info(` ${chalk.cyan(`\${{${ref}.${exampleVar}}}`)}`);
213
+ }
214
+ }
215
+ if (isSingle) {
216
+ try {
217
+ updateProjectLink({ serviceId: addon.id, serviceName: addon.name });
218
+ }
219
+ catch { }
220
+ }
221
+ }
58
222
  return;
59
223
  }
60
- success(`${catalogEntry.label} added`);
61
- if (addon.hostname) {
62
- info(` Host: ${chalk.cyan(addon.hostname)}`);
224
+ // ── -r <repo> ─────────────────────────────────────────────────────
225
+ if (opts.repo) {
226
+ const serviceName = opts.name || opts.service || opts.repo.split("/").pop() || "service";
227
+ info(`Creating service ${chalk.bold(serviceName)} from ${chalk.cyan(opts.repo)}...`);
228
+ const detectedPort = await detectPortFromDockerfile(opts.repo);
229
+ if (detectedPort)
230
+ info(`Detected port ${chalk.bold(detectedPort)} from Dockerfile`);
231
+ const app = await api.post(withScope(`/api/projects/${projectId}/apps`, scope), {
232
+ name: serviceName,
233
+ repoUrl: opts.repo.startsWith("http")
234
+ ? opts.repo
235
+ : `https://github.com/${opts.repo}`,
236
+ region,
237
+ variables,
238
+ ...(detectedPort ? { containerPort: detectedPort } : {}),
239
+ ...(input.noDeploy ? { skipInitialDeploy: true } : {}),
240
+ });
241
+ if (isJSONMode())
242
+ printJSON(app);
243
+ else {
244
+ success(`Service ${chalk.bold(app.name)} created${input.noDeploy ? " (initial deploy deferred)" : ""}`);
245
+ info("");
246
+ if (input.noDeploy) {
247
+ info(chalk.dim(` Configure and trigger the first deploy:`));
248
+ info(` ${chalk.cyan(`lizard service set ${app.name} --set buildCommand='...' --set startCommand='...'`)}`);
249
+ info("");
250
+ }
251
+ info(chalk.dim(` Reference this service's private URL from other services:`));
252
+ info(` ${chalk.cyan(`\${{${app.name}.LIZARD_PRIVATE_DOMAIN}}`)}`);
253
+ }
254
+ try {
255
+ updateProjectLink({ serviceId: app.id, serviceName: app.name });
256
+ }
257
+ catch { }
258
+ return;
259
+ }
260
+ // ── --service <name> (empty service) ──────────────────────────────
261
+ if (opts.service) {
262
+ info(`Creating empty service ${chalk.bold(opts.service)}...`);
263
+ const app = await api.post(withScope(`/api/projects/${projectId}/apps`, scope), {
264
+ name: opts.service,
265
+ region,
266
+ variables,
267
+ });
268
+ if (isJSONMode())
269
+ printJSON(app);
270
+ else {
271
+ success(`Service ${chalk.bold(app.name)} created`);
272
+ info("");
273
+ info(chalk.dim(` Reference this service's private URL from other services:`));
274
+ info(` ${chalk.cyan(`\${{${app.name}.LIZARD_PRIVATE_DOMAIN}}`)}`);
275
+ }
276
+ try {
277
+ updateProjectLink({ serviceId: app.id, serviceName: app.name });
278
+ }
279
+ catch { }
280
+ return;
63
281
  }
64
- if (addon.envVars) {
65
- info(chalk.dim("\n Environment variables added to project:"));
66
- for (const [key, val] of Object.entries(addon.envVars)) {
67
- info(` ${chalk.bold(key)}=${chalk.dim(val)}`);
282
+ // ── No flags + no positional → interactive wizard ────────────────
283
+ // After the wizard collects a concrete choice we re-enter runAdd
284
+ // directly (no program.parseAsync round-trip): runAdd routes to a
285
+ // concrete branch above based on the inputs we hand it.
286
+ if (!types.length && !input.skipWizard && isTTY()) {
287
+ const kind = await p.select({
288
+ message: "What do you need?",
289
+ options: [
290
+ { value: "database", label: "Database", hint: "postgres / redis" },
291
+ { value: "s3", label: "S3 Bucket", hint: "S3-compatible object storage" },
292
+ { value: "repo", label: "GitHub Repo", hint: "create a service from a repo" },
293
+ { value: "service", label: "Empty Service", hint: "create a service to upload code into" },
294
+ ],
295
+ });
296
+ if (p.isCancel(kind))
297
+ process.exit(5);
298
+ if (kind === "database") {
299
+ const sel = await p.select({
300
+ message: "Select database",
301
+ options: CATALOG.filter((c) => c.name !== "s3").map((c) => ({
302
+ value: c.name,
303
+ label: c.label,
304
+ hint: c.description,
305
+ })),
306
+ });
307
+ if (p.isCancel(sel))
308
+ process.exit(5);
309
+ await runAdd({ ...input, types: [sel], skipWizard: true });
310
+ return;
311
+ }
312
+ if (kind === "s3") {
313
+ await runAdd({ ...input, types: ["s3"], skipWizard: true });
314
+ return;
315
+ }
316
+ if (kind === "repo") {
317
+ const repo = await p.text({ message: "Repo (owner/name)" });
318
+ if (p.isCancel(repo))
319
+ process.exit(5);
320
+ const svc = await p.text({ message: "Service name", placeholder: String(repo).split("/").pop() });
321
+ if (p.isCancel(svc))
322
+ process.exit(5);
323
+ await runAdd({
324
+ ...input,
325
+ repo: String(repo),
326
+ service: String(svc) || undefined,
327
+ skipWizard: true,
328
+ });
329
+ return;
330
+ }
331
+ if (kind === "service") {
332
+ const svc = await p.text({ message: "Service name" });
333
+ if (p.isCancel(svc))
334
+ process.exit(5);
335
+ await runAdd({ ...input, service: String(svc), skipWizard: true });
336
+ return;
68
337
  }
69
338
  }
70
- });
339
+ throw new Error("No service type specified. Examples:\n" +
340
+ " lizard add postgres Add a managed database\n" +
341
+ " lizard add -r owner/repo Create a service from a GitHub repo\n" +
342
+ " lizard add -s my-service Empty service");
343
+ }
71
344
  }
72
345
  //# sourceMappingURL=add.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerConfig(program: Command): void;
@@ -0,0 +1,68 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import chalk from "chalk";
4
+ import ora from "ora";
5
+ import { api, withScope } from "../lib/api.js";
6
+ import { resolveProjectScope } from "../lib/resolve.js";
7
+ import { success, error, isJSONMode, printJSON } from "../lib/format.js";
8
+ export function registerConfig(program) {
9
+ const config = program.command("config").description("Manage project configuration");
10
+ config
11
+ .command("apply")
12
+ .description("Apply lizard-config.json to the project")
13
+ .option("-p, --project <id>", "Project name, slug, or ID")
14
+ .option("-f, --file <path>", "Path to config file (default: lizard-config.json)")
15
+ .option("--dry-run", "Show what would change without applying")
16
+ .action(async (opts) => {
17
+ const filePath = opts.file
18
+ ? path.resolve(opts.file)
19
+ : path.join(process.cwd(), "lizard-config.json");
20
+ if (!fs.existsSync(filePath)) {
21
+ error(`Config file not found: ${filePath}`);
22
+ process.exit(1);
23
+ }
24
+ let config;
25
+ try {
26
+ config = JSON.parse(fs.readFileSync(filePath, "utf-8"));
27
+ }
28
+ catch (e) {
29
+ error(`Failed to parse config file: ${e.message}`);
30
+ process.exit(1);
31
+ }
32
+ const { projectId, scope } = await resolveProjectScope(opts.project);
33
+ if (opts.dryRun) {
34
+ printJSON({ dryRun: true, projectId, config });
35
+ return;
36
+ }
37
+ const spinner = ora("Applying config...").start();
38
+ try {
39
+ const result = await api.post(withScope(`/api/projects/${projectId}/config:apply`, scope), config);
40
+ spinner.stop();
41
+ if (isJSONMode()) {
42
+ printJSON(result);
43
+ return;
44
+ }
45
+ const changed = [
46
+ ...(result.services || []).filter((s) => s.changed?.length > 0),
47
+ ...(result.addons || []).filter((a) => a.changed?.length > 0),
48
+ ];
49
+ if (changed.length === 0) {
50
+ success("Config applied — nothing changed");
51
+ }
52
+ else {
53
+ success(`Config applied (revision ${result.revision})`);
54
+ for (const svc of result.services || []) {
55
+ if (svc.changed?.length > 0) {
56
+ console.log(` ${chalk.cyan(svc.name)}: ${svc.changed.join(", ")}`);
57
+ }
58
+ }
59
+ }
60
+ }
61
+ catch (e) {
62
+ spinner.stop();
63
+ error(`Failed to apply config: ${e.message}`);
64
+ process.exit(1);
65
+ }
66
+ });
67
+ }
68
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerDocs(program: Command): void;
@@ -0,0 +1,13 @@
1
+ import open from "open";
2
+ import { success } from "../lib/format.js";
3
+ const DOCS_URL = "https://docs.lizard.build";
4
+ export function registerDocs(program) {
5
+ program
6
+ .command("docs")
7
+ .description("Open Lizard documentation in browser")
8
+ .action(async () => {
9
+ await open(DOCS_URL);
10
+ success(`Opened ${DOCS_URL}`);
11
+ });
12
+ }
13
+ //# sourceMappingURL=docs.js.map