@lizard-build/cli 0.1.0 → 0.3.30

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 (184) hide show
  1. package/.github/workflows/release.yml +90 -0
  2. package/AGENTS.md +113 -0
  3. package/README.md +41 -0
  4. package/dist/commands/add.js +318 -45
  5. package/dist/commands/add.js.map +1 -1
  6. package/dist/commands/config.d.ts +2 -0
  7. package/dist/commands/config.js +68 -0
  8. package/dist/commands/config.js.map +1 -0
  9. package/dist/commands/docs.d.ts +2 -0
  10. package/dist/commands/docs.js +13 -0
  11. package/dist/commands/docs.js.map +1 -0
  12. package/dist/commands/domain.d.ts +9 -0
  13. package/dist/commands/domain.js +195 -0
  14. package/dist/commands/domain.js.map +1 -0
  15. package/dist/commands/git.js +175 -36
  16. package/dist/commands/git.js.map +1 -1
  17. package/dist/commands/init.d.ts +24 -0
  18. package/dist/commands/init.js +128 -86
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/link.d.ts +7 -0
  21. package/dist/commands/link.js +104 -33
  22. package/dist/commands/link.js.map +1 -1
  23. package/dist/commands/login.js +4 -3
  24. package/dist/commands/login.js.map +1 -1
  25. package/dist/commands/logs.js +223 -30
  26. package/dist/commands/logs.js.map +1 -1
  27. package/dist/commands/open.js +3 -2
  28. package/dist/commands/open.js.map +1 -1
  29. package/dist/commands/port.d.ts +7 -0
  30. package/dist/commands/port.js +49 -0
  31. package/dist/commands/port.js.map +1 -0
  32. package/dist/commands/projects.js +36 -6
  33. package/dist/commands/projects.js.map +1 -1
  34. package/dist/commands/ps.js +32 -39
  35. package/dist/commands/ps.js.map +1 -1
  36. package/dist/commands/redeploy.js +48 -8
  37. package/dist/commands/redeploy.js.map +1 -1
  38. package/dist/commands/regions.js +2 -5
  39. package/dist/commands/regions.js.map +1 -1
  40. package/dist/commands/restart.js +84 -10
  41. package/dist/commands/restart.js.map +1 -1
  42. package/dist/commands/run.d.ts +9 -0
  43. package/dist/commands/run.js +61 -22
  44. package/dist/commands/run.js.map +1 -1
  45. package/dist/commands/scale.d.ts +10 -0
  46. package/dist/commands/scale.js +166 -0
  47. package/dist/commands/scale.js.map +1 -0
  48. package/dist/commands/secrets.js +200 -89
  49. package/dist/commands/secrets.js.map +1 -1
  50. package/dist/commands/service-set.d.ts +49 -0
  51. package/dist/commands/service-set.js +552 -0
  52. package/dist/commands/service-set.js.map +1 -0
  53. package/dist/commands/service-show.d.ts +11 -0
  54. package/dist/commands/service-show.js +44 -0
  55. package/dist/commands/service-show.js.map +1 -0
  56. package/dist/commands/service.d.ts +8 -0
  57. package/dist/commands/service.js +262 -0
  58. package/dist/commands/service.js.map +1 -0
  59. package/dist/commands/skill.d.ts +2 -0
  60. package/dist/commands/skill.js +146 -0
  61. package/dist/commands/skill.js.map +1 -0
  62. package/dist/commands/ssh.d.ts +2 -0
  63. package/dist/commands/ssh.js +161 -0
  64. package/dist/commands/ssh.js.map +1 -0
  65. package/dist/commands/status.d.ts +7 -0
  66. package/dist/commands/status.js +49 -38
  67. package/dist/commands/status.js.map +1 -1
  68. package/dist/commands/unlink.d.ts +5 -0
  69. package/dist/commands/unlink.js +18 -0
  70. package/dist/commands/unlink.js.map +1 -0
  71. package/dist/commands/up.d.ts +9 -0
  72. package/dist/commands/up.js +417 -0
  73. package/dist/commands/up.js.map +1 -0
  74. package/dist/commands/upgrade.d.ts +2 -0
  75. package/dist/commands/upgrade.js +79 -0
  76. package/dist/commands/upgrade.js.map +1 -0
  77. package/dist/commands/whoami.js +26 -6
  78. package/dist/commands/whoami.js.map +1 -1
  79. package/dist/commands/workspace.d.ts +8 -0
  80. package/dist/commands/workspace.js +36 -0
  81. package/dist/commands/workspace.js.map +1 -0
  82. package/dist/index.js +209 -82
  83. package/dist/index.js.map +1 -1
  84. package/dist/lib/api.d.ts +17 -2
  85. package/dist/lib/api.js +85 -51
  86. package/dist/lib/api.js.map +1 -1
  87. package/dist/lib/auth.d.ts +3 -11
  88. package/dist/lib/auth.js +16 -36
  89. package/dist/lib/auth.js.map +1 -1
  90. package/dist/lib/config.d.ts +36 -15
  91. package/dist/lib/config.js +71 -58
  92. package/dist/lib/config.js.map +1 -1
  93. package/dist/lib/format.d.ts +1 -0
  94. package/dist/lib/format.js +17 -4
  95. package/dist/lib/format.js.map +1 -1
  96. package/dist/lib/name.d.ts +11 -0
  97. package/dist/lib/name.js +26 -0
  98. package/dist/lib/name.js.map +1 -0
  99. package/dist/lib/picker.d.ts +32 -0
  100. package/dist/lib/picker.js +91 -0
  101. package/dist/lib/picker.js.map +1 -0
  102. package/dist/lib/resolve.d.ts +85 -0
  103. package/dist/lib/resolve.js +203 -0
  104. package/dist/lib/resolve.js.map +1 -0
  105. package/dist/lib/updater.d.ts +16 -0
  106. package/dist/lib/updater.js +102 -0
  107. package/dist/lib/updater.js.map +1 -0
  108. package/lizard-wrapper.sh +2 -0
  109. package/package.json +11 -3
  110. package/skill-data/core/SKILL.md +239 -0
  111. package/src/commands/add.ts +388 -56
  112. package/src/commands/config.ts +80 -0
  113. package/src/commands/docs.ts +15 -0
  114. package/src/commands/domain.ts +248 -0
  115. package/src/commands/git.ts +201 -40
  116. package/src/commands/init.ts +149 -100
  117. package/src/commands/link.ts +127 -35
  118. package/src/commands/login.ts +4 -3
  119. package/src/commands/logs.ts +283 -27
  120. package/src/commands/open.ts +3 -2
  121. package/src/commands/port.ts +57 -0
  122. package/src/commands/projects.ts +43 -6
  123. package/src/commands/ps.ts +39 -60
  124. package/src/commands/redeploy.ts +51 -10
  125. package/src/commands/regions.ts +2 -6
  126. package/src/commands/restart.ts +84 -10
  127. package/src/commands/run.ts +68 -24
  128. package/src/commands/scale.ts +216 -0
  129. package/src/commands/secrets.ts +277 -100
  130. package/src/commands/service-set.ts +669 -0
  131. package/src/commands/service-show.ts +52 -0
  132. package/src/commands/service.ts +298 -0
  133. package/src/commands/skill.ts +157 -0
  134. package/src/commands/ssh.ts +176 -0
  135. package/src/commands/status.ts +51 -46
  136. package/src/commands/unlink.ts +17 -0
  137. package/src/commands/up.ts +461 -0
  138. package/src/commands/upgrade.ts +87 -0
  139. package/src/commands/whoami.ts +34 -6
  140. package/src/commands/workspace.ts +44 -0
  141. package/src/index.ts +219 -85
  142. package/src/lib/api.ts +114 -51
  143. package/src/lib/auth.ts +22 -46
  144. package/src/lib/config.ts +100 -65
  145. package/src/lib/format.ts +18 -4
  146. package/src/lib/name.ts +27 -0
  147. package/src/lib/picker.ts +133 -0
  148. package/src/lib/resolve.ts +285 -0
  149. package/src/lib/updater.ts +106 -0
  150. package/test/cli.test.ts +491 -0
  151. package/test/fixtures/hello-app/Dockerfile +5 -0
  152. package/test/fixtures/hello-app/index.js +5 -0
  153. package/test/unit/api.test.ts +66 -0
  154. package/test/unit/config.test.ts +94 -0
  155. package/test/unit/init.test.ts +211 -0
  156. package/test/unit/json.test.ts +208 -0
  157. package/test/unit/picker.test.ts +161 -0
  158. package/test/unit/resolve.test.ts +124 -0
  159. package/test/unit/service-set.test.ts +355 -0
  160. package/vitest.config.ts +10 -0
  161. package/dist/commands/connect.d.ts +0 -2
  162. package/dist/commands/connect.js +0 -117
  163. package/dist/commands/connect.js.map +0 -1
  164. package/dist/commands/context.d.ts +0 -2
  165. package/dist/commands/context.js +0 -71
  166. package/dist/commands/context.js.map +0 -1
  167. package/dist/commands/deploy.d.ts +0 -2
  168. package/dist/commands/deploy.js +0 -120
  169. package/dist/commands/deploy.js.map +0 -1
  170. package/dist/commands/destroy.d.ts +0 -2
  171. package/dist/commands/destroy.js +0 -51
  172. package/dist/commands/destroy.js.map +0 -1
  173. package/dist/commands/update.d.ts +0 -2
  174. package/dist/commands/update.js +0 -41
  175. package/dist/commands/update.js.map +0 -1
  176. package/dist/commands/version.d.ts +0 -2
  177. package/dist/commands/version.js +0 -37
  178. package/dist/commands/version.js.map +0 -1
  179. package/src/commands/connect.ts +0 -145
  180. package/src/commands/context.ts +0 -93
  181. package/src/commands/deploy.ts +0 -153
  182. package/src/commands/destroy.ts +0 -51
  183. package/src/commands/update.ts +0 -44
  184. package/src/commands/version.ts +0 -37
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare const NAME_REGEX: RegExp;
2
+ export declare const NAME_VALIDATION_HINT = "1\u201340 chars, lowercase a\u2013z, digits, hyphens; can't start or end with a hyphen";
3
+ export declare function validateName(name: string): string | null;
4
+ /** Mirrors `slugifyName` in lizard-client/src/lib/api.ts. */
5
+ export declare function slugifyName(name: string): string;
6
+ /** Mirrors `addonRefName` in lizard-client — what users type inside ${{...}}. */
7
+ export declare function addonRefName(addon: {
8
+ name?: string | null;
9
+ type?: string;
10
+ addonType?: string;
11
+ }): string;
@@ -0,0 +1,26 @@
1
+ // Shared name validator. Mirrors server/src/services/var-transform.ts.
2
+ // LIZARD-55: 1–40 chars, [a-z0-9-], must start and end with [a-z0-9].
3
+ export const NAME_REGEX = /^[a-z0-9]([a-z0-9-]{0,38}[a-z0-9])?$/;
4
+ export const NAME_VALIDATION_HINT = "1–40 chars, lowercase a–z, digits, hyphens; can't start or end with a hyphen";
5
+ export function validateName(name) {
6
+ if (!name)
7
+ return "name is required";
8
+ if (name.length > 40)
9
+ return "name must be 40 characters or fewer";
10
+ if (!NAME_REGEX.test(name))
11
+ return `invalid name (${NAME_VALIDATION_HINT})`;
12
+ return null;
13
+ }
14
+ /** Mirrors `slugifyName` in lizard-client/src/lib/api.ts. */
15
+ export function slugifyName(name) {
16
+ return name
17
+ .toLowerCase()
18
+ .replace(/[^a-z0-9_-]+/g, "-")
19
+ .replace(/^-+|-+$/g, "");
20
+ }
21
+ /** Mirrors `addonRefName` in lizard-client — what users type inside ${{...}}. */
22
+ export function addonRefName(addon) {
23
+ const display = addon.name || addon.type || addon.addonType || "";
24
+ return slugifyName(display) || display;
25
+ }
26
+ //# sourceMappingURL=name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name.js","sourceRoot":"","sources":["../../src/lib/name.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,sEAAsE;AAEtE,MAAM,CAAC,MAAM,UAAU,GAAG,sCAAsC,CAAC;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAC/B,8EAA8E,CAAC;AAEjF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,CAAC,IAAI;QAAE,OAAO,kBAAkB,CAAC;IACrC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,qCAAqC,CAAC;IACnE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,iBAAiB,oBAAoB,GAAG,CAAC;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;SAC7B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,KAAkE;IAC7F,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC;IAClE,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;AACzC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { type Workspace } from "./api.js";
2
+ export declare function fetchWorkspaces(): Promise<Workspace[]>;
3
+ export declare function matchWorkspace(workspaces: Workspace[], idOrSlugOrName: string): Workspace | undefined;
4
+ /**
5
+ * Resolve a workspace by flag value. Fetches the list once; throws with the
6
+ * available names when the value doesn't match anything the user belongs to.
7
+ */
8
+ export declare function resolveWorkspace(flagValue: string): Promise<Workspace>;
9
+ /**
10
+ * Pick a workspace for project creation / linking.
11
+ *
12
+ * 1. --workspace flag wins.
13
+ * 2. If only one workspace exists, auto-select it.
14
+ * 3. Non-TTY → prefer personal, else first.
15
+ * 4. TTY → prompt.
16
+ *
17
+ * `projectNameHint` lets the caller short-circuit when --name X uniquely
18
+ * identifies a workspace (see init flow case 5).
19
+ */
20
+ export declare function pickWorkspace(opts: {
21
+ flag?: string;
22
+ projectNameHint?: string;
23
+ workspaces?: Workspace[];
24
+ }): Promise<Workspace>;
25
+ interface ProjectLite {
26
+ id: string;
27
+ name: string;
28
+ slug: string;
29
+ workspaceId?: string | null;
30
+ }
31
+ export declare function listProjectsInWorkspace(workspaceId: string): Promise<ProjectLite[]>;
32
+ export {};
@@ -0,0 +1,91 @@
1
+ import * as p from "@clack/prompts";
2
+ import { api, withQuery } from "./api.js";
3
+ import { isTTY } from "./format.js";
4
+ export async function fetchWorkspaces() {
5
+ return api.get("/api/workspaces");
6
+ }
7
+ export function matchWorkspace(workspaces, idOrSlugOrName) {
8
+ const lower = idOrSlugOrName.toLowerCase();
9
+ return workspaces.find((w) => w.id.toLowerCase() === lower ||
10
+ w.slug.toLowerCase() === lower ||
11
+ w.name.toLowerCase() === lower);
12
+ }
13
+ /**
14
+ * Resolve a workspace by flag value. Fetches the list once; throws with the
15
+ * available names when the value doesn't match anything the user belongs to.
16
+ */
17
+ export async function resolveWorkspace(flagValue) {
18
+ const workspaces = await fetchWorkspaces();
19
+ const match = matchWorkspace(workspaces, flagValue);
20
+ if (!match) {
21
+ throw new Error(`Workspace "${flagValue}" not found. Available: ${workspaces.map((w) => w.name).join(", ") || "(none)"}`);
22
+ }
23
+ return match;
24
+ }
25
+ /**
26
+ * Pick a workspace for project creation / linking.
27
+ *
28
+ * 1. --workspace flag wins.
29
+ * 2. If only one workspace exists, auto-select it.
30
+ * 3. Non-TTY → prefer personal, else first.
31
+ * 4. TTY → prompt.
32
+ *
33
+ * `projectNameHint` lets the caller short-circuit when --name X uniquely
34
+ * identifies a workspace (see init flow case 5).
35
+ */
36
+ export async function pickWorkspace(opts) {
37
+ if (opts.flag)
38
+ return resolveWorkspace(opts.flag);
39
+ const list = opts.workspaces ?? (await fetchWorkspaces());
40
+ if (list.length === 0) {
41
+ throw new Error("No workspaces available. The backend should always return a personal workspace — please report this.");
42
+ }
43
+ if (list.length === 1)
44
+ return list[0];
45
+ // Hint-based auto-pick: a --name match that is unique across workspaces.
46
+ if (opts.projectNameHint) {
47
+ const matches = await findWorkspacesContainingProject(list, opts.projectNameHint);
48
+ if (matches.length === 1)
49
+ return matches[0].workspace;
50
+ if (matches.length > 1) {
51
+ const detail = matches
52
+ .map((m) => ` • ${m.project.name} in ${m.workspace.name} (--workspace ${m.workspace.slug})`)
53
+ .join("\n");
54
+ throw new Error(`Multiple projects named "${opts.projectNameHint}" found:\n${detail}\nPass --workspace, or run \`lizard init\` without --name to choose interactively.`);
55
+ }
56
+ }
57
+ if (!isTTY()) {
58
+ // Non-TTY fallback: personal first, else first ws.
59
+ const personal = list.find((w) => w.isPersonal);
60
+ return personal ?? list[0];
61
+ }
62
+ const sel = await p.select({
63
+ message: "Workspace",
64
+ options: list.map((w) => ({
65
+ value: w.id,
66
+ label: w.name,
67
+ hint: `${w.role}${w.isPersonal ? " · personal" : ""} · ${w.projectCount ?? 0} project${(w.projectCount ?? 0) === 1 ? "" : "s"}`,
68
+ })),
69
+ });
70
+ if (p.isCancel(sel))
71
+ process.exit(5);
72
+ return list.find((w) => w.id === sel);
73
+ }
74
+ async function findWorkspacesContainingProject(workspaces, nameOrSlugOrId) {
75
+ const all = await api.get("/api/projects");
76
+ const lower = nameOrSlugOrId.toLowerCase();
77
+ const matches = [];
78
+ for (const w of workspaces) {
79
+ const inWs = all.find((pr) => pr.workspaceId === w.id &&
80
+ (pr.id.toLowerCase() === lower ||
81
+ pr.slug.toLowerCase() === lower ||
82
+ pr.name.toLowerCase() === lower));
83
+ if (inWs)
84
+ matches.push({ workspace: w, project: inWs });
85
+ }
86
+ return matches;
87
+ }
88
+ export async function listProjectsInWorkspace(workspaceId) {
89
+ return api.get(withQuery("/api/projects", { workspaceId }));
90
+ }
91
+ //# sourceMappingURL=picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker.js","sourceRoot":"","sources":["../../src/lib/picker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import { type ResourceScope } from "./api.js";
2
+ /**
3
+ * Build a ResourceScope for an arbitrary project. When the project matches the
4
+ * cwd link, reuse its workspaceId (no extra round-trip). Otherwise fetch the
5
+ * project's workspace once so cross-project commands (`-p other-project`) still
6
+ * get `?workspaceId=…` on the request — without it the backend can 404 a
7
+ * project the user reaches via workspace membership.
8
+ */
9
+ export declare function scopeForProject(projectId: string): Promise<ResourceScope>;
10
+ /**
11
+ * Resolve a service (app or addon) within a project. Match by ID or name.
12
+ * Throws with a helpful list of available services when not found.
13
+ */
14
+ export declare function resolveService(projectId: string, nameOrId: string): Promise<{
15
+ id: string;
16
+ name: string;
17
+ kind: "app" | "addon";
18
+ }>;
19
+ /**
20
+ * Pick the active service for a command:
21
+ * 1. --service flag (resolve by name/id)
22
+ * 2. linked service in cwd
23
+ * 3. throw with hint to pass --service
24
+ */
25
+ export declare function getActiveService(serviceFlag: string | undefined, projectId: string): Promise<{
26
+ id: string;
27
+ name: string;
28
+ }>;
29
+ /**
30
+ * Same as `getActiveService`, but also returns whether the target is an app
31
+ * or an addon. Costs one extra `/services` lookup when the service is taken
32
+ * from the cwd link (which otherwise resolves locally), so use this only when
33
+ * the caller branches on kind (e.g. `lizard scale`).
34
+ */
35
+ export declare function getActiveServiceWithKind(serviceFlag: string | undefined, projectId: string): Promise<{
36
+ id: string;
37
+ name: string;
38
+ kind: "app" | "addon";
39
+ }>;
40
+ /**
41
+ * Look up the workspace id for a project. Used to lazy-fill legacy links
42
+ * that were saved before workspaces existed. Returns null if the project
43
+ * isn't accessible to the current user.
44
+ */
45
+ export declare function lookupProjectWorkspace(projectId: string): Promise<{
46
+ workspaceId?: string | null;
47
+ workspaceName?: string | null;
48
+ } | null>;
49
+ /**
50
+ * Resolve a project flag → `{ projectId, scope }`. Scope carries
51
+ * workspaceId for `withScope(url, scope)` queries.
52
+ *
53
+ * For the linked project, lazy-fills missing workspaceId into the cwd link.
54
+ * For a different project (`-p other-project`), fetches the target's
55
+ * workspace so the scope reflects the target — not whatever the cwd link
56
+ * happened to be pointing at.
57
+ */
58
+ export declare function resolveProjectScope(projectFlag?: string): Promise<{
59
+ projectId: string;
60
+ scope: ResourceScope;
61
+ }>;
62
+ export interface ResolvedContext {
63
+ projectId: string;
64
+ workspaceId?: string;
65
+ workspaceName?: string;
66
+ service?: {
67
+ id: string;
68
+ name: string;
69
+ };
70
+ }
71
+ /** Build the scope object for `withScope(url, scope)` API calls. */
72
+ export declare function getScope(ctx: ResolvedContext): ResourceScope;
73
+ /**
74
+ * Convenience: resolve project + active service in one go.
75
+ *
76
+ * Lazily backfills `workspaceId` into the cwd link when missing (legacy
77
+ * configs written before workspaces existed). Once filled, subsequent
78
+ * commands get the scope param for free.
79
+ */
80
+ export declare function resolveContext(opts: {
81
+ projectFlag?: string;
82
+ serviceFlag?: string;
83
+ workspaceFlag?: string;
84
+ requireService?: boolean;
85
+ }): Promise<ResolvedContext>;
@@ -0,0 +1,203 @@
1
+ import { api, withScope } from "./api.js";
2
+ import { getProjectLink, resolveProjectId, updateProjectLink, } from "./config.js";
3
+ /**
4
+ * Build a ResourceScope for an arbitrary project. When the project matches the
5
+ * cwd link, reuse its workspaceId (no extra round-trip). Otherwise fetch the
6
+ * project's workspace once so cross-project commands (`-p other-project`) still
7
+ * get `?workspaceId=…` on the request — without it the backend can 404 a
8
+ * project the user reaches via workspace membership.
9
+ */
10
+ export async function scopeForProject(projectId) {
11
+ const link = getProjectLink();
12
+ if (link?.projectId === projectId && link.workspaceId) {
13
+ return { workspaceId: link.workspaceId };
14
+ }
15
+ const fetched = await lookupProjectWorkspace(projectId);
16
+ return { workspaceId: fetched?.workspaceId ?? null };
17
+ }
18
+ /**
19
+ * Resolve a service (app or addon) within a project. Match by ID or name.
20
+ * Throws with a helpful list of available services when not found.
21
+ */
22
+ export async function resolveService(projectId, nameOrId) {
23
+ const data = await api.get(withScope(`/api/projects/${projectId}/services`, await scopeForProject(projectId)));
24
+ const apps = data.apps || [];
25
+ const addons = data.addons || [];
26
+ const lower = nameOrId.toLowerCase();
27
+ const app = apps.find((a) => a.id.toLowerCase() === lower || a.name?.toLowerCase() === lower);
28
+ if (app)
29
+ return { id: app.id, name: app.name, kind: "app" };
30
+ const addon = addons.find((a) => a.id.toLowerCase() === lower ||
31
+ a.name?.toLowerCase() === lower ||
32
+ a.addonType?.toLowerCase() === lower);
33
+ if (addon) {
34
+ return { id: addon.id, name: addon.name || addon.addonType || "", kind: "addon" };
35
+ }
36
+ const available = [
37
+ ...apps.map((a) => a.name),
38
+ ...addons.map((a) => a.name || a.addonType),
39
+ ].filter(Boolean);
40
+ throw new Error(`Service "${nameOrId}" not found in project. ` +
41
+ (available.length ? `Available: ${available.join(", ")}` : "No services exist."));
42
+ }
43
+ /**
44
+ * Pick the active service for a command:
45
+ * 1. --service flag (resolve by name/id)
46
+ * 2. linked service in cwd
47
+ * 3. throw with hint to pass --service
48
+ */
49
+ export async function getActiveService(serviceFlag, projectId) {
50
+ if (serviceFlag) {
51
+ const resolved = await resolveService(projectId, serviceFlag);
52
+ return { id: resolved.id, name: resolved.name };
53
+ }
54
+ const link = getProjectLink();
55
+ if (link?.serviceId) {
56
+ return {
57
+ id: link.serviceId,
58
+ name: link.serviceName || link.serviceId,
59
+ };
60
+ }
61
+ throw new Error("No service specified. Pass --service <name> or run `lizard service link <name>`.");
62
+ }
63
+ /**
64
+ * Same as `getActiveService`, but also returns whether the target is an app
65
+ * or an addon. Costs one extra `/services` lookup when the service is taken
66
+ * from the cwd link (which otherwise resolves locally), so use this only when
67
+ * the caller branches on kind (e.g. `lizard scale`).
68
+ */
69
+ export async function getActiveServiceWithKind(serviceFlag, projectId) {
70
+ if (serviceFlag) {
71
+ return resolveService(projectId, serviceFlag);
72
+ }
73
+ const link = getProjectLink();
74
+ if (link?.serviceId) {
75
+ const data = await api.get(withScope(`/api/projects/${projectId}/services`, await scopeForProject(projectId)));
76
+ const app = data.apps?.find((a) => a.id === link.serviceId);
77
+ if (app)
78
+ return { id: app.id, name: app.name, kind: "app" };
79
+ const addon = data.addons?.find((a) => a.id === link.serviceId);
80
+ if (addon) {
81
+ return {
82
+ id: addon.id,
83
+ name: addon.name || addon.addonType || link.serviceName || link.serviceId,
84
+ kind: "addon",
85
+ };
86
+ }
87
+ throw new Error(`Linked service "${link.serviceName || link.serviceId}" no longer exists in this project.`);
88
+ }
89
+ throw new Error("No service specified. Pass --service <name> or run `lizard service link <name>`.");
90
+ }
91
+ /**
92
+ * Look up the workspace id for a project. Used to lazy-fill legacy links
93
+ * that were saved before workspaces existed. Returns null if the project
94
+ * isn't accessible to the current user.
95
+ */
96
+ export async function lookupProjectWorkspace(projectId) {
97
+ try {
98
+ const proj = await api.get(`/api/projects/${projectId}`);
99
+ return {
100
+ workspaceId: proj.workspaceId ?? null,
101
+ workspaceName: proj.workspaceName ?? null,
102
+ };
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ }
108
+ /**
109
+ * Resolve a project flag → `{ projectId, scope }`. Scope carries
110
+ * workspaceId for `withScope(url, scope)` queries.
111
+ *
112
+ * For the linked project, lazy-fills missing workspaceId into the cwd link.
113
+ * For a different project (`-p other-project`), fetches the target's
114
+ * workspace so the scope reflects the target — not whatever the cwd link
115
+ * happened to be pointing at.
116
+ */
117
+ export async function resolveProjectScope(projectFlag) {
118
+ const projectId = await resolveProjectId(projectFlag);
119
+ const link = getProjectLink();
120
+ // Same project as the cwd link — reuse cached workspaceId, lazy-fill if missing.
121
+ if (link?.projectId === projectId) {
122
+ let workspaceId = link.workspaceId ?? null;
123
+ let workspaceName = link.workspaceName;
124
+ if (!workspaceId) {
125
+ const fetched = await lookupProjectWorkspace(projectId);
126
+ if (fetched?.workspaceId) {
127
+ workspaceId = fetched.workspaceId;
128
+ workspaceName = fetched.workspaceName ?? undefined;
129
+ try {
130
+ updateProjectLink({ workspaceId, workspaceName });
131
+ }
132
+ catch { }
133
+ }
134
+ }
135
+ return { projectId, scope: { workspaceId: workspaceId ?? null } };
136
+ }
137
+ // Different project — never reuse the link's workspaceId. Look up the
138
+ // target project's workspace directly. Mirrors `scopeForProject`.
139
+ const scope = await scopeForProject(projectId);
140
+ return { projectId, scope };
141
+ }
142
+ /** Build the scope object for `withScope(url, scope)` API calls. */
143
+ export function getScope(ctx) {
144
+ return {
145
+ workspaceId: ctx.workspaceId ?? null,
146
+ };
147
+ }
148
+ /**
149
+ * Convenience: resolve project + active service in one go.
150
+ *
151
+ * Lazily backfills `workspaceId` into the cwd link when missing (legacy
152
+ * configs written before workspaces existed). Once filled, subsequent
153
+ * commands get the scope param for free.
154
+ */
155
+ export async function resolveContext(opts) {
156
+ const projectId = await resolveProjectId(opts.projectFlag);
157
+ let service;
158
+ const link = getProjectLink();
159
+ if (opts.serviceFlag || opts.requireService) {
160
+ service = await getActiveService(opts.serviceFlag, projectId);
161
+ }
162
+ else if (link?.serviceId) {
163
+ service = {
164
+ id: link.serviceId,
165
+ name: link.serviceName || link.serviceId,
166
+ };
167
+ }
168
+ // Workspace resolution: only reuse the link's workspaceId when it
169
+ // describes the same project. For cross-project commands we fetch the
170
+ // target project's workspace so the scope is correct — using the link's
171
+ // ws here would scope into the wrong workspace.
172
+ let workspaceId;
173
+ let workspaceName;
174
+ if (link?.projectId === projectId) {
175
+ workspaceId = link.workspaceId;
176
+ workspaceName = link.workspaceName;
177
+ if (!workspaceId) {
178
+ const fetched = await lookupProjectWorkspace(projectId);
179
+ if (fetched?.workspaceId) {
180
+ workspaceId = fetched.workspaceId;
181
+ workspaceName = fetched.workspaceName ?? undefined;
182
+ try {
183
+ updateProjectLink({ workspaceId, workspaceName });
184
+ }
185
+ catch {
186
+ // Non-fatal: link may not exist for this cwd (e.g. --project flag).
187
+ }
188
+ }
189
+ }
190
+ }
191
+ else {
192
+ const fetched = await lookupProjectWorkspace(projectId);
193
+ workspaceId = fetched?.workspaceId ?? undefined;
194
+ workspaceName = fetched?.workspaceName ?? undefined;
195
+ }
196
+ return {
197
+ projectId,
198
+ workspaceId,
199
+ workspaceName,
200
+ service,
201
+ };
202
+ }
203
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/lib/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare const CURRENT_VERSION = "0.3.30";
2
+ export type LatestVersionResult = {
3
+ kind: "ok";
4
+ version: string;
5
+ } | {
6
+ kind: "rate-limited";
7
+ resetAt: number;
8
+ } | {
9
+ kind: "error";
10
+ };
11
+ export declare function getLatestVersion(): Promise<LatestVersionResult>;
12
+ export declare function selfUpdate(onProgress?: (msg: string) => void): Promise<boolean>;
13
+ /** Check for a newer version and auto-install it in the background.
14
+ * Prints a one-line notice on exit — either "Updated to vX.Y.Z" or nothing on failure.
15
+ * Never blocks or crashes the current command. */
16
+ export declare function checkForUpdateInBackground(): void;
@@ -0,0 +1,102 @@
1
+ import { createWriteStream, existsSync, renameSync, chmodSync } from "node:fs";
2
+ import { pipeline } from "node:stream/promises";
3
+ import { Readable } from "node:stream";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ export const CURRENT_VERSION = "0.3.30";
7
+ const RELEASES_API = "https://api.github.com/repos/lizard-build/lizard-cli/releases/latest";
8
+ const RELEASE_BASE = "https://github.com/lizard-build/lizard-cli/releases/latest/download";
9
+ function getBinaryName() {
10
+ const os = process.platform;
11
+ const arch = process.arch;
12
+ if (os === "darwin" && arch === "arm64")
13
+ return "lizard-darwin-arm64";
14
+ if (os === "darwin" && arch === "x64")
15
+ return "lizard-darwin-x64";
16
+ if (os === "linux" && arch === "x64")
17
+ return "lizard-linux-x64";
18
+ if (os === "linux" && arch === "arm64")
19
+ return "lizard-linux-arm64";
20
+ return null;
21
+ }
22
+ export async function getLatestVersion() {
23
+ try {
24
+ const res = await fetch(RELEASES_API, {
25
+ headers: { "User-Agent": "lizard-cli" },
26
+ signal: AbortSignal.timeout(5000),
27
+ });
28
+ if (res.status === 403 && res.headers.get("x-ratelimit-remaining") === "0") {
29
+ const reset = Number(res.headers.get("x-ratelimit-reset"));
30
+ return { kind: "rate-limited", resetAt: Number.isFinite(reset) ? reset : 0 };
31
+ }
32
+ if (!res.ok)
33
+ return { kind: "error" };
34
+ const data = (await res.json());
35
+ const version = data.tag_name?.replace(/^v/, "");
36
+ return version ? { kind: "ok", version } : { kind: "error" };
37
+ }
38
+ catch {
39
+ return { kind: "error" };
40
+ }
41
+ }
42
+ export async function selfUpdate(onProgress) {
43
+ const binaryName = getBinaryName();
44
+ if (!binaryName)
45
+ return false;
46
+ // Find current executable path
47
+ const currentBin = process.execPath;
48
+ if (!existsSync(currentBin))
49
+ return false;
50
+ const url = `${RELEASE_BASE}/${binaryName}`;
51
+ const tmp = join(tmpdir(), `lizard-update-${Date.now()}`);
52
+ onProgress?.(`Downloading ${binaryName}...`);
53
+ const res = await fetch(url, { signal: AbortSignal.timeout(60000) });
54
+ if (!res.ok)
55
+ throw new Error(`Download failed: ${res.status}`);
56
+ const writer = createWriteStream(tmp);
57
+ await pipeline(Readable.fromWeb(res.body), writer);
58
+ chmodSync(tmp, 0o755);
59
+ onProgress?.("Installing...");
60
+ renameSync(tmp, currentBin);
61
+ return true;
62
+ }
63
+ /** Check for a newer version and auto-install it in the background.
64
+ * Prints a one-line notice on exit — either "Updated to vX.Y.Z" or nothing on failure.
65
+ * Never blocks or crashes the current command. */
66
+ export function checkForUpdateInBackground() {
67
+ // Only auto-update in TTY; skip CI / piped output
68
+ if (!process.stdout.isTTY)
69
+ return;
70
+ let updateMessage = null;
71
+ const promise = getLatestVersion().then(async (r) => {
72
+ if (r.kind !== "ok")
73
+ return;
74
+ const latest = r.version;
75
+ if (latest === CURRENT_VERSION)
76
+ return;
77
+ const [maj, min, pat] = latest.split(".").map(Number);
78
+ const [cmaj, cmin, cpat] = CURRENT_VERSION.split(".").map(Number);
79
+ const isNewer = maj > cmaj || (maj === cmaj && min > cmin) || (maj === cmaj && min === cmin && pat > cpat);
80
+ if (!isNewer)
81
+ return;
82
+ try {
83
+ const ok = await selfUpdate();
84
+ if (ok) {
85
+ updateMessage =
86
+ `\n Updating lizard v${CURRENT_VERSION} → v${latest}...\n` +
87
+ ` lizard updated to v${latest}\n`;
88
+ }
89
+ }
90
+ catch {
91
+ // silent — don't interrupt the current command
92
+ }
93
+ }).catch(() => { });
94
+ process.on("exit", () => {
95
+ if (updateMessage)
96
+ process.stderr.write(updateMessage);
97
+ });
98
+ // Don't block process exit
99
+ if (typeof promise.unref === "function")
100
+ promise.unref();
101
+ }
102
+ //# sourceMappingURL=updater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updater.js","sourceRoot":"","sources":["../../src/lib/updater.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/bin/bash
2
+ exec /home/ubuntu/.nvm/versions/node/v22.22.2/bin/node /home/ubuntu/Work/lizard-cli/dist/index.js "$@"