@zitadel/cli 0.1.0-alpha.1 → 0.1.0-alpha.2

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 (33) hide show
  1. package/README.md +44 -29
  2. package/SKILLS.md +30 -13
  3. package/dist/commands/apply.mjs +4 -4
  4. package/dist/commands/doctor.mjs +54 -30
  5. package/dist/commands/doctor.mjs.map +1 -1
  6. package/dist/commands/eject.mjs +4 -4
  7. package/dist/commands/logs.mjs +3 -3
  8. package/dist/commands/logs.mjs.map +1 -1
  9. package/dist/commands/plan.mjs +4 -4
  10. package/dist/commands/reset.mjs +5 -6
  11. package/dist/commands/reset.mjs.map +1 -1
  12. package/dist/commands/setup.mjs +187 -23
  13. package/dist/commands/setup.mjs.map +1 -1
  14. package/dist/commands/start.mjs +13 -17
  15. package/dist/commands/start.mjs.map +1 -1
  16. package/dist/commands/status.mjs +15 -9
  17. package/dist/commands/status.mjs.map +1 -1
  18. package/dist/commands/stop.mjs +4 -5
  19. package/dist/commands/stop.mjs.map +1 -1
  20. package/dist/{docker-C0aVpJqm.mjs → docker-DrOBycgG.mjs} +6 -5
  21. package/dist/docker-DrOBycgG.mjs.map +1 -0
  22. package/dist/{oclif-DSPO9Sck.mjs → oclif-CqkWBQ7i.mjs} +89 -33
  23. package/dist/oclif-CqkWBQ7i.mjs.map +1 -0
  24. package/dist/{orca-DOxshV9n.mjs → orca-S1tVnngd.mjs} +38 -12
  25. package/dist/{orca-DOxshV9n.mjs.map → orca-S1tVnngd.mjs.map} +1 -1
  26. package/dist/{project-Dwb9WVAT.mjs → project-B6YfSaZw.mjs} +3 -3
  27. package/dist/{project-Dwb9WVAT.mjs.map → project-B6YfSaZw.mjs.map} +1 -1
  28. package/dist/{sync-DmtTYNmq.mjs → sync-DN4oNLVH.mjs} +3 -3
  29. package/dist/{sync-DmtTYNmq.mjs.map → sync-DN4oNLVH.mjs.map} +1 -1
  30. package/oclif.manifest.json +7 -1
  31. package/package.json +3 -3
  32. package/dist/docker-C0aVpJqm.mjs.map +0 -1
  33. package/dist/oclif-DSPO9Sck.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
- import { T as ZitadelError, d as ensureContainerIdentity, f as ensureLocalState, g as localServerUrl, m as localContainerName, s as DEFAULT_LOCAL_SERVER_PORT, t as BaseCommand, u as checkLocalServerHealth, x as writeRuntimeMetadata } from "../oclif-DSPO9Sck.mjs";
2
- import { c as metadataFromStart, i as ensureImage, l as startContainer, n as currentUser, s as inspectContainer, u as stopAndRemoveContainer } from "../docker-C0aVpJqm.mjs";
1
+ import { E as ZitadelError, a as DEFAULT_LOCAL_SERVER_PORT, b as writeRuntimeMetadata, c as checkLocalServerHealth, d as ensureLocalState, h as localServerUrl, l as defaultLocalServerImageForCliVersion, p as localContainerName, t as BaseCommand, u as ensureContainerIdentity, x as publicCliCommand } from "../oclif-CqkWBQ7i.mjs";
2
+ import { c as metadataFromStart, i as ensureImage, l as startContainer, n as currentUser, s as inspectContainer, u as stopAndRemoveContainer } from "../docker-DrOBycgG.mjs";
3
3
  import { Flags } from "@oclif/core";
4
4
  import { setTimeout } from "node:timers/promises";
5
5
  //#region src/commands/start.ts
@@ -22,7 +22,7 @@ var Start = class Start extends BaseCommand {
22
22
  source: serverUrl
23
23
  });
24
24
  validatePort(port);
25
- const image = flags.image ?? this.meta.env.ZITADEL_LOCAL_IMAGE ?? "ghcr.io/zitadel/nextgen:latest";
25
+ const image = flags.image ?? this.meta.env.ZITADEL_LOCAL_IMAGE ?? defaultLocalServerImageForCliVersion(this.meta.cliVersion);
26
26
  const containerName = localContainerName(this.meta.cwd);
27
27
  if (this.meta.dryRun) return this.emit({
28
28
  status: "ok",
@@ -38,12 +38,12 @@ var Start = class Start extends BaseCommand {
38
38
  console: `${serverUrl}/ui/console/`,
39
39
  login: `${serverUrl}/ui/login/`
40
40
  },
41
- next_commands: ["zitadel start"]
41
+ next_commands: [publicCliCommand("start", this.meta.cliVersion)]
42
42
  }
43
43
  });
44
44
  const paths = await ensureLocalState(this.meta.cwd);
45
45
  const existing = await inspectContainer(containerName);
46
- if (existing.exists && existing.running && await checkLocalServerHealth(serverUrl)) {
46
+ if (existing.exists && existing.running && existing.image === image && await checkLocalServerHealth(serverUrl)) {
47
47
  const metadata = metadataFromStart({
48
48
  cwdDataDir: paths.dataDir,
49
49
  cliVersion: this.meta.cliVersion,
@@ -56,7 +56,7 @@ var Start = class Start extends BaseCommand {
56
56
  await writeRuntimeMetadata(this.meta.cwd, metadata);
57
57
  return this.emit({
58
58
  status: "ok",
59
- data: readyData(metadata, true)
59
+ data: readyData(metadata, true, this.meta.cliVersion)
60
60
  });
61
61
  }
62
62
  if (existing.exists) await stopAndRemoveContainer(containerName);
@@ -68,7 +68,7 @@ var Start = class Start extends BaseCommand {
68
68
  dataDir: paths.dataDir,
69
69
  identity: await ensureContainerIdentity(this.meta.cwd, currentUser())
70
70
  });
71
- await waitForHealth(serverUrl, containerName);
71
+ await waitForHealth(serverUrl, containerName, this.meta.cliVersion);
72
72
  const metadata = metadataFromStart({
73
73
  cwdDataDir: paths.dataDir,
74
74
  cliVersion: this.meta.cliVersion,
@@ -81,11 +81,11 @@ var Start = class Start extends BaseCommand {
81
81
  await writeRuntimeMetadata(this.meta.cwd, metadata);
82
82
  return this.emit({
83
83
  status: "ok",
84
- data: readyData(metadata, false)
84
+ data: readyData(metadata, false, this.meta.cliVersion)
85
85
  });
86
86
  }
87
87
  };
88
- function readyData(metadata, alreadyRunning) {
88
+ function readyData(metadata, alreadyRunning, cliVersion) {
89
89
  return {
90
90
  title: alreadyRunning ? "Local Zitadel server is already running." : "Local Zitadel server is ready.",
91
91
  runtime: {
@@ -100,15 +100,11 @@ function readyData(metadata, alreadyRunning) {
100
100
  console: `${metadata.server_url}/ui/console/`,
101
101
  login: `${metadata.server_url}/ui/login/`
102
102
  },
103
- next_actions: ["Set up your app, then start its dev server."],
104
- next_commands: [
105
- "npx @zitadel/cli@alpha setup --framework next --server local",
106
- "npm install",
107
- "npm run dev"
108
- ]
103
+ next_actions: ["From your app directory, run setup; the CLI will detect the framework or ask when needed.", "Setup installs dependencies when needed; then start your app dev server."],
104
+ next_commands: [publicCliCommand("setup --server local", cliVersion)]
109
105
  };
110
106
  }
111
- async function waitForHealth(serverUrl, containerName) {
107
+ async function waitForHealth(serverUrl, containerName, cliVersion) {
112
108
  const started = Date.now();
113
109
  while (Date.now() - started < START_TIMEOUT_MS) {
114
110
  if (await checkLocalServerHealth(serverUrl, 1e3)) return;
@@ -116,7 +112,7 @@ async function waitForHealth(serverUrl, containerName) {
116
112
  }
117
113
  throw new ZitadelError("E_NETWORK", "Local Zitadel server did not become healthy", {
118
114
  hint: "Inspect the container logs, then reset the local runtime if needed.",
119
- nextCommands: ["zitadel logs", "zitadel reset --force"],
115
+ nextCommands: [publicCliCommand("logs", cliVersion), publicCliCommand("reset --force", cliVersion)],
120
116
  details: {
121
117
  container_name: containerName,
122
118
  server_url: serverUrl
@@ -1 +1 @@
1
- {"version":3,"file":"start.mjs","names":["sleep"],"sources":["../../src/commands/start.ts"],"sourcesContent":["import { setTimeout as sleep } from \"node:timers/promises\";\n\nimport { Flags } from \"@oclif/core\";\n\nimport { BaseCommand, type JsonEnvelope } from \"../lib/oclif\";\nimport { ZitadelError } from \"../lib/errors\";\nimport {\n currentUser,\n ensureImage,\n inspectContainer,\n metadataFromStart,\n startContainer,\n stopAndRemoveContainer,\n} from \"../lib/local-server/docker\";\nimport {\n DEFAULT_LOCAL_SERVER_IMAGE,\n DEFAULT_LOCAL_SERVER_PORT,\n checkLocalServerHealth,\n ensureContainerIdentity,\n ensureLocalState,\n localContainerName,\n localServerUrl,\n writeRuntimeMetadata,\n} from \"../lib/local-server/runtime\";\n\nconst START_TIMEOUT_MS = 90_000;\n\nexport default class Start extends BaseCommand {\n static override description = \"Start a local Zitadel server.\";\n static override flags = {\n image: Flags.string({ description: \"Container image to run.\" }),\n port: Flags.integer({ description: \"Local HTTP port.\", default: DEFAULT_LOCAL_SERVER_PORT }),\n };\n\n async run(): Promise<JsonEnvelope> {\n const { flags } = await this.parse(Start);\n const port = flags.port ?? DEFAULT_LOCAL_SERVER_PORT;\n const serverUrl = localServerUrl(port);\n await this.toMeta(flags, { resolveServer: false, source: serverUrl });\n\n validatePort(port);\n const image = flags.image ?? this.meta.env.ZITADEL_LOCAL_IMAGE ?? DEFAULT_LOCAL_SERVER_IMAGE;\n const containerName = localContainerName(this.meta.cwd);\n if (this.meta.dryRun) {\n return this.emit({\n status: \"ok\",\n data: {\n title: \"Local Zitadel server start plan.\",\n runtime: {\n container_name: containerName,\n image,\n port,\n },\n urls: {\n api: serverUrl,\n console: `${serverUrl}/ui/console/`,\n login: `${serverUrl}/ui/login/`,\n },\n next_commands: [\"zitadel start\"],\n },\n });\n }\n\n const paths = await ensureLocalState(this.meta.cwd);\n\n const existing = await inspectContainer(containerName);\n if (existing.exists && existing.running && (await checkLocalServerHealth(serverUrl))) {\n const metadata = metadataFromStart({\n cwdDataDir: paths.dataDir,\n cliVersion: this.meta.cliVersion,\n containerName,\n containerId: existing.id ?? containerName,\n image,\n port,\n serverUrl,\n });\n await writeRuntimeMetadata(this.meta.cwd, metadata);\n return this.emit({ status: \"ok\", data: readyData(metadata, true) });\n }\n\n if (existing.exists) {\n await stopAndRemoveContainer(containerName);\n }\n\n await ensureImage(image);\n const containerId = await startContainer({\n containerName,\n image,\n port,\n dataDir: paths.dataDir,\n identity: await ensureContainerIdentity(this.meta.cwd, currentUser()),\n });\n await waitForHealth(serverUrl, containerName);\n\n const metadata = metadataFromStart({\n cwdDataDir: paths.dataDir,\n cliVersion: this.meta.cliVersion,\n containerName,\n containerId,\n image,\n port,\n serverUrl,\n });\n await writeRuntimeMetadata(this.meta.cwd, metadata);\n return this.emit({ status: \"ok\", data: readyData(metadata, false) });\n }\n}\n\nfunction readyData(metadata: ReturnType<typeof metadataFromStart>, alreadyRunning: boolean) {\n return {\n title: alreadyRunning\n ? \"Local Zitadel server is already running.\"\n : \"Local Zitadel server is ready.\",\n runtime: {\n container_name: metadata.container_name,\n container_id: metadata.container_id,\n image: metadata.image,\n port: metadata.port,\n data_dir: metadata.data_dir,\n },\n urls: {\n api: metadata.server_url,\n console: `${metadata.server_url}/ui/console/`,\n login: `${metadata.server_url}/ui/login/`,\n },\n next_actions: [\"Set up your app, then start its dev server.\"],\n next_commands: [\n \"npx @zitadel/cli@alpha setup --framework next --server local\",\n \"npm install\",\n \"npm run dev\",\n ],\n };\n}\n\nasync function waitForHealth(serverUrl: string, containerName: string): Promise<void> {\n const started = Date.now();\n while (Date.now() - started < START_TIMEOUT_MS) {\n if (await checkLocalServerHealth(serverUrl, 1000)) {\n return;\n }\n await sleep(1000);\n }\n throw new ZitadelError(\"E_NETWORK\", \"Local Zitadel server did not become healthy\", {\n hint: \"Inspect the container logs, then reset the local runtime if needed.\",\n nextCommands: [\"zitadel logs\", \"zitadel reset --force\"],\n details: { container_name: containerName, server_url: serverUrl },\n });\n}\n\nfunction validatePort(port: number): void {\n if (!Number.isInteger(port) || port < 1 || port > 65_535) {\n throw new ZitadelError(\"E_VALIDATION\", `Invalid port ${String(port)}`, {\n hint: \"Use a TCP port between 1 and 65535.\",\n });\n }\n}\n"],"mappings":";;;;;AAyBA,MAAM,mBAAmB;AAEzB,IAAqB,QAArB,MAAqB,cAAc,YAAY;CAC7C,OAAgB,cAAc;CAC9B,OAAgB,QAAQ;EACtB,OAAO,MAAM,OAAO,EAAE,aAAa,2BAA2B,CAAC;EAC/D,MAAM,MAAM,QAAQ;GAAE,aAAa;GAAoB,SAAS;GAA2B,CAAC;EAC7F;CAED,MAAM,MAA6B;EACjC,MAAM,EAAE,UAAU,MAAM,KAAK,MAAM,MAAM;EACzC,MAAM,OAAO,MAAM,QAAA;EACnB,MAAM,YAAY,eAAe,KAAK;AACtC,QAAM,KAAK,OAAO,OAAO;GAAE,eAAe;GAAO,QAAQ;GAAW,CAAC;AAErE,eAAa,KAAK;EAClB,MAAM,QAAQ,MAAM,SAAS,KAAK,KAAK,IAAI,uBAAA;EAC3C,MAAM,gBAAgB,mBAAmB,KAAK,KAAK,IAAI;AACvD,MAAI,KAAK,KAAK,OACZ,QAAO,KAAK,KAAK;GACf,QAAQ;GACR,MAAM;IACJ,OAAO;IACP,SAAS;KACP,gBAAgB;KAChB;KACA;KACD;IACD,MAAM;KACJ,KAAK;KACL,SAAS,GAAG,UAAU;KACtB,OAAO,GAAG,UAAU;KACrB;IACD,eAAe,CAAC,gBAAgB;IACjC;GACF,CAAC;EAGJ,MAAM,QAAQ,MAAM,iBAAiB,KAAK,KAAK,IAAI;EAEnD,MAAM,WAAW,MAAM,iBAAiB,cAAc;AACtD,MAAI,SAAS,UAAU,SAAS,WAAY,MAAM,uBAAuB,UAAU,EAAG;GACpF,MAAM,WAAW,kBAAkB;IACjC,YAAY,MAAM;IAClB,YAAY,KAAK,KAAK;IACtB;IACA,aAAa,SAAS,MAAM;IAC5B;IACA;IACA;IACD,CAAC;AACF,SAAM,qBAAqB,KAAK,KAAK,KAAK,SAAS;AACnD,UAAO,KAAK,KAAK;IAAE,QAAQ;IAAM,MAAM,UAAU,UAAU,KAAK;IAAE,CAAC;;AAGrE,MAAI,SAAS,OACX,OAAM,uBAAuB,cAAc;AAG7C,QAAM,YAAY,MAAM;EACxB,MAAM,cAAc,MAAM,eAAe;GACvC;GACA;GACA;GACA,SAAS,MAAM;GACf,UAAU,MAAM,wBAAwB,KAAK,KAAK,KAAK,aAAa,CAAC;GACtE,CAAC;AACF,QAAM,cAAc,WAAW,cAAc;EAE7C,MAAM,WAAW,kBAAkB;GACjC,YAAY,MAAM;GAClB,YAAY,KAAK,KAAK;GACtB;GACA;GACA;GACA;GACA;GACD,CAAC;AACF,QAAM,qBAAqB,KAAK,KAAK,KAAK,SAAS;AACnD,SAAO,KAAK,KAAK;GAAE,QAAQ;GAAM,MAAM,UAAU,UAAU,MAAM;GAAE,CAAC;;;AAIxE,SAAS,UAAU,UAAgD,gBAAyB;AAC1F,QAAO;EACL,OAAO,iBACH,6CACA;EACJ,SAAS;GACP,gBAAgB,SAAS;GACzB,cAAc,SAAS;GACvB,OAAO,SAAS;GAChB,MAAM,SAAS;GACf,UAAU,SAAS;GACpB;EACD,MAAM;GACJ,KAAK,SAAS;GACd,SAAS,GAAG,SAAS,WAAW;GAChC,OAAO,GAAG,SAAS,WAAW;GAC/B;EACD,cAAc,CAAC,8CAA8C;EAC7D,eAAe;GACb;GACA;GACA;GACD;EACF;;AAGH,eAAe,cAAc,WAAmB,eAAsC;CACpF,MAAM,UAAU,KAAK,KAAK;AAC1B,QAAO,KAAK,KAAK,GAAG,UAAU,kBAAkB;AAC9C,MAAI,MAAM,uBAAuB,WAAW,IAAK,CAC/C;AAEF,QAAMA,WAAM,IAAK;;AAEnB,OAAM,IAAI,aAAa,aAAa,+CAA+C;EACjF,MAAM;EACN,cAAc,CAAC,gBAAgB,wBAAwB;EACvD,SAAS;GAAE,gBAAgB;GAAe,YAAY;GAAW;EAClE,CAAC;;AAGJ,SAAS,aAAa,MAAoB;AACxC,KAAI,CAAC,OAAO,UAAU,KAAK,IAAI,OAAO,KAAK,OAAO,MAChD,OAAM,IAAI,aAAa,gBAAgB,gBAAgB,OAAO,KAAK,IAAI,EACrE,MAAM,uCACP,CAAC"}
1
+ {"version":3,"file":"start.mjs","names":["sleep"],"sources":["../../src/commands/start.ts"],"sourcesContent":["import { setTimeout as sleep } from \"node:timers/promises\";\n\nimport { Flags } from \"@oclif/core\";\n\nimport { ZitadelError } from \"../lib/errors\";\nimport {\n currentUser,\n ensureImage,\n inspectContainer,\n metadataFromStart,\n startContainer,\n stopAndRemoveContainer,\n} from \"../lib/local-server/docker\";\nimport {\n DEFAULT_LOCAL_SERVER_PORT,\n checkLocalServerHealth,\n defaultLocalServerImageForCliVersion,\n ensureContainerIdentity,\n ensureLocalState,\n localContainerName,\n localServerUrl,\n writeRuntimeMetadata,\n} from \"../lib/local-server/runtime\";\nimport { BaseCommand, type JsonEnvelope } from \"../lib/oclif\";\nimport { publicCliCommand } from \"../lib/public-cli\";\n\nconst START_TIMEOUT_MS = 90_000;\n\nexport default class Start extends BaseCommand {\n static override description = \"Start a local Zitadel server.\";\n static override flags = {\n image: Flags.string({ description: \"Container image to run.\" }),\n port: Flags.integer({ description: \"Local HTTP port.\", default: DEFAULT_LOCAL_SERVER_PORT }),\n };\n\n async run(): Promise<JsonEnvelope> {\n const { flags } = await this.parse(Start);\n const port = flags.port ?? DEFAULT_LOCAL_SERVER_PORT;\n const serverUrl = localServerUrl(port);\n await this.toMeta(flags, { resolveServer: false, source: serverUrl });\n\n validatePort(port);\n const image =\n flags.image ??\n this.meta.env.ZITADEL_LOCAL_IMAGE ??\n defaultLocalServerImageForCliVersion(this.meta.cliVersion);\n const containerName = localContainerName(this.meta.cwd);\n if (this.meta.dryRun) {\n return this.emit({\n status: \"ok\",\n data: {\n title: \"Local Zitadel server start plan.\",\n runtime: {\n container_name: containerName,\n image,\n port,\n },\n urls: {\n api: serverUrl,\n console: `${serverUrl}/ui/console/`,\n login: `${serverUrl}/ui/login/`,\n },\n next_commands: [publicCliCommand(\"start\", this.meta.cliVersion)],\n },\n });\n }\n\n const paths = await ensureLocalState(this.meta.cwd);\n\n const existing = await inspectContainer(containerName);\n if (\n existing.exists &&\n existing.running &&\n existing.image === image &&\n (await checkLocalServerHealth(serverUrl))\n ) {\n const metadata = metadataFromStart({\n cwdDataDir: paths.dataDir,\n cliVersion: this.meta.cliVersion,\n containerName,\n containerId: existing.id ?? containerName,\n image,\n port,\n serverUrl,\n });\n await writeRuntimeMetadata(this.meta.cwd, metadata);\n return this.emit({\n status: \"ok\",\n data: readyData(metadata, true, this.meta.cliVersion),\n });\n }\n\n if (existing.exists) {\n await stopAndRemoveContainer(containerName);\n }\n\n await ensureImage(image);\n const containerId = await startContainer({\n containerName,\n image,\n port,\n dataDir: paths.dataDir,\n identity: await ensureContainerIdentity(this.meta.cwd, currentUser()),\n });\n await waitForHealth(serverUrl, containerName, this.meta.cliVersion);\n\n const metadata = metadataFromStart({\n cwdDataDir: paths.dataDir,\n cliVersion: this.meta.cliVersion,\n containerName,\n containerId,\n image,\n port,\n serverUrl,\n });\n await writeRuntimeMetadata(this.meta.cwd, metadata);\n return this.emit({\n status: \"ok\",\n data: readyData(metadata, false, this.meta.cliVersion),\n });\n }\n}\n\nfunction readyData(\n metadata: ReturnType<typeof metadataFromStart>,\n alreadyRunning: boolean,\n cliVersion: string,\n) {\n return {\n title: alreadyRunning\n ? \"Local Zitadel server is already running.\"\n : \"Local Zitadel server is ready.\",\n runtime: {\n container_name: metadata.container_name,\n container_id: metadata.container_id,\n image: metadata.image,\n port: metadata.port,\n data_dir: metadata.data_dir,\n },\n urls: {\n api: metadata.server_url,\n console: `${metadata.server_url}/ui/console/`,\n login: `${metadata.server_url}/ui/login/`,\n },\n next_actions: [\n \"From your app directory, run setup; the CLI will detect the framework or ask when needed.\",\n \"Setup installs dependencies when needed; then start your app dev server.\",\n ],\n next_commands: [publicCliCommand(\"setup --server local\", cliVersion)],\n };\n}\n\nasync function waitForHealth(\n serverUrl: string,\n containerName: string,\n cliVersion: string,\n): Promise<void> {\n const started = Date.now();\n while (Date.now() - started < START_TIMEOUT_MS) {\n if (await checkLocalServerHealth(serverUrl, 1000)) {\n return;\n }\n await sleep(1000);\n }\n throw new ZitadelError(\"E_NETWORK\", \"Local Zitadel server did not become healthy\", {\n hint: \"Inspect the container logs, then reset the local runtime if needed.\",\n nextCommands: [\n publicCliCommand(\"logs\", cliVersion),\n publicCliCommand(\"reset --force\", cliVersion),\n ],\n details: { container_name: containerName, server_url: serverUrl },\n });\n}\n\nfunction validatePort(port: number): void {\n if (!Number.isInteger(port) || port < 1 || port > 65_535) {\n throw new ZitadelError(\"E_VALIDATION\", `Invalid port ${String(port)}`, {\n hint: \"Use a TCP port between 1 and 65535.\",\n });\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { _ as readRuntimeMetadata, b as runtimeSummary, m as localContainerName, t as BaseCommand, u as checkLocalServerHealth } from "../oclif-DSPO9Sck.mjs";
2
- import { a as readZitadelConfig, n as hasZitadelSecret, o as readZitadelSecret, r as readDevelopmentIssuer, t as hasZitadelConfig } from "../project-Dwb9WVAT.mjs";
3
- import { s as inspectContainer } from "../docker-C0aVpJqm.mjs";
1
+ import { c as checkLocalServerHealth, g as readRuntimeMetadata, p as localContainerName, t as BaseCommand, x as publicCliCommand, y as runtimeSummary } from "../oclif-CqkWBQ7i.mjs";
2
+ import { a as readZitadelConfig, n as hasZitadelSecret, o as readZitadelSecret, r as readDevelopmentIssuer, t as hasZitadelConfig } from "../project-B6YfSaZw.mjs";
3
+ import { s as inspectContainer } from "../docker-DrOBycgG.mjs";
4
4
  //#region src/commands/status.ts
5
5
  /**
6
6
  * `zitadel status` — summarize the local server and project state.
@@ -31,7 +31,8 @@ var Status = class Status extends BaseCommand {
31
31
  const healthy = runtime ? await checkLocalServerHealth(runtime.server_url) : false;
32
32
  const serverLifecycle = runtime ? docker?.running && healthy ? "running" : docker?.exists ? "unhealthy" : "stopped" : "missing";
33
33
  const project = await projectStatus(cwd);
34
- const nextCommands = nextCommandsFor(serverLifecycle, project.lifecycle);
34
+ const nextCommands = nextCommandsFor(serverLifecycle, project.lifecycle, this.meta.cliVersion);
35
+ const nextActions = nextActionsFor(project.lifecycle);
35
36
  return this.emit({
36
37
  status: "ok",
37
38
  data: {
@@ -51,6 +52,7 @@ var Status = class Status extends BaseCommand {
51
52
  }
52
53
  },
53
54
  project,
55
+ next_actions: nextActions,
54
56
  next_commands: nextCommands
55
57
  }
56
58
  });
@@ -74,12 +76,16 @@ async function projectStatus(cwd) {
74
76
  issuer: readDevelopmentIssuer(config)
75
77
  };
76
78
  }
77
- function nextCommandsFor(serverLifecycle, projectLifecycle) {
79
+ function nextActionsFor(projectLifecycle) {
80
+ if (projectLifecycle === "not-configured") return ["From your app directory, run setup; the CLI will detect the framework or ask in an empty directory."];
81
+ return [];
82
+ }
83
+ function nextCommandsFor(serverLifecycle, projectLifecycle, cliVersion) {
78
84
  const commands = [];
79
- if (serverLifecycle !== "running") commands.push("zitadel start");
80
- if (projectLifecycle === "not-configured") commands.push("zitadel setup --framework next --server local");
81
- else if (projectLifecycle === "orphaned-config") commands.push("zitadel setup --force", "zitadel doctor --fix");
82
- else commands.push("zitadel doctor", "zitadel apply");
85
+ if (serverLifecycle !== "running") commands.push(publicCliCommand("start", cliVersion));
86
+ if (projectLifecycle === "not-configured") commands.push(publicCliCommand("setup --server local", cliVersion));
87
+ else if (projectLifecycle === "orphaned-config") commands.push(publicCliCommand("setup --force", cliVersion), publicCliCommand("doctor --fix", cliVersion));
88
+ else commands.push(publicCliCommand("doctor", cliVersion), publicCliCommand("apply", cliVersion));
83
89
  return commands;
84
90
  }
85
91
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"status.mjs","names":[],"sources":["../../src/commands/status.ts"],"sourcesContent":["import { BaseCommand, type JsonEnvelope } from \"../lib/oclif\";\nimport { inspectContainer } from \"../lib/local-server/docker\";\nimport {\n DEFAULT_LOCAL_SERVER_URL,\n checkLocalServerHealth,\n localContainerName,\n readRuntimeMetadata,\n runtimeSummary,\n} from \"../lib/local-server/runtime\";\nimport {\n hasZitadelConfig,\n hasZitadelSecret,\n readDevelopmentIssuer,\n readZitadelConfig,\n readZitadelSecret,\n} from \"../lib/project\";\n\n/**\n * `zitadel status` — summarize the local server and project state.\n *\n * This is intentionally informational: a missing `zitadel.json`, stopped\n * local server, or orphaned config should be visible without making `status`\n * itself fail.\n */\nexport default class Status extends BaseCommand {\n static override description = \"Summarize the local Zitadel server and project state.\";\n\n async run(): Promise<JsonEnvelope> {\n const { flags } = await this.parse(Status);\n const runtime = await readRuntimeMetadata(flags.cwd ? String(flags.cwd) : process.cwd());\n if (flags.server === \"local\") {\n await this.toMeta(flags, {\n resolveServer: false,\n source: runtime?.server_url ?? DEFAULT_LOCAL_SERVER_URL,\n });\n } else {\n await this.toMeta(flags);\n }\n const { cwd } = this.meta;\n\n const containerName = runtime?.container_name ?? localContainerName(cwd);\n let docker: Awaited<ReturnType<typeof inspectContainer>> | undefined;\n let dockerError: string | undefined;\n try {\n docker = await inspectContainer(containerName);\n } catch (error) {\n dockerError = error instanceof Error ? error.message : String(error);\n }\n const healthy = runtime ? await checkLocalServerHealth(runtime.server_url) : false;\n const serverLifecycle = runtime\n ? docker?.running && healthy\n ? \"running\"\n : docker?.exists\n ? \"unhealthy\"\n : \"stopped\"\n : \"missing\";\n\n const project = await projectStatus(cwd);\n const nextCommands = nextCommandsFor(serverLifecycle, project.lifecycle);\n\n return this.emit({\n status: \"ok\",\n data: {\n title: \"Zitadel status.\",\n server: {\n lifecycle: serverLifecycle,\n runtime: runtimeSummary(runtime),\n docker: {\n available: dockerError === undefined,\n error: dockerError,\n container_exists: docker?.exists ?? false,\n container_running: docker?.running ?? false,\n },\n health: {\n healthy,\n url: runtime?.server_url,\n },\n },\n project,\n next_commands: nextCommands,\n },\n });\n }\n}\n\ntype ProjectStatus =\n | {\n lifecycle: \"not-configured\";\n message: string;\n }\n | {\n lifecycle: \"orphaned-config\";\n project_id?: string;\n message: string;\n }\n | {\n lifecycle: \"configured\";\n project_id: string;\n issuer?: string;\n };\n\nasync function projectStatus(cwd: string): Promise<ProjectStatus> {\n if (!(await hasZitadelConfig(cwd))) {\n return {\n lifecycle: \"not-configured\",\n message: \"zitadel.json has not been created yet.\",\n };\n }\n\n const config = await readZitadelConfig(cwd);\n if (!(await hasZitadelSecret(cwd))) {\n return {\n lifecycle: \"orphaned-config\",\n project_id: typeof config.project === \"string\" ? config.project : undefined,\n message: \"zitadel.json exists but .zitadel/secret is missing.\",\n };\n }\n\n const secret = await readZitadelSecret(cwd);\n return {\n lifecycle: \"configured\",\n project_id: String(config.project ?? secret.project_id ?? \"\"),\n issuer: readDevelopmentIssuer(config),\n };\n}\n\nfunction nextCommandsFor(serverLifecycle: string, projectLifecycle: ProjectStatus[\"lifecycle\"]): string[] {\n const commands: string[] = [];\n if (serverLifecycle !== \"running\") {\n commands.push(\"zitadel start\");\n }\n if (projectLifecycle === \"not-configured\") {\n commands.push(\"zitadel setup --framework next --server local\");\n } else if (projectLifecycle === \"orphaned-config\") {\n commands.push(\"zitadel setup --force\", \"zitadel doctor --fix\");\n } else {\n commands.push(\"zitadel doctor\", \"zitadel apply\");\n }\n return commands;\n}\n"],"mappings":";;;;;;;;;;;AAwBA,IAAqB,SAArB,MAAqB,eAAe,YAAY;CAC9C,OAAgB,cAAc;CAE9B,MAAM,MAA6B;EACjC,MAAM,EAAE,UAAU,MAAM,KAAK,MAAM,OAAO;EAC1C,MAAM,UAAU,MAAM,oBAAoB,MAAM,MAAM,OAAO,MAAM,IAAI,GAAG,QAAQ,KAAK,CAAC;AACxF,MAAI,MAAM,WAAW,QACnB,OAAM,KAAK,OAAO,OAAO;GACvB,eAAe;GACf,QAAQ,SAAS,cAAA;GAClB,CAAC;MAEF,OAAM,KAAK,OAAO,MAAM;EAE1B,MAAM,EAAE,QAAQ,KAAK;EAErB,MAAM,gBAAgB,SAAS,kBAAkB,mBAAmB,IAAI;EACxE,IAAI;EACJ,IAAI;AACJ,MAAI;AACF,YAAS,MAAM,iBAAiB,cAAc;WACvC,OAAO;AACd,iBAAc,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;;EAEtE,MAAM,UAAU,UAAU,MAAM,uBAAuB,QAAQ,WAAW,GAAG;EAC7E,MAAM,kBAAkB,UACpB,QAAQ,WAAW,UACjB,YACA,QAAQ,SACN,cACA,YACJ;EAEJ,MAAM,UAAU,MAAM,cAAc,IAAI;EACxC,MAAM,eAAe,gBAAgB,iBAAiB,QAAQ,UAAU;AAExE,SAAO,KAAK,KAAK;GACf,QAAQ;GACR,MAAM;IACJ,OAAO;IACP,QAAQ;KACN,WAAW;KACX,SAAS,eAAe,QAAQ;KAChC,QAAQ;MACN,WAAW,gBAAgB,KAAA;MAC3B,OAAO;MACP,kBAAkB,QAAQ,UAAU;MACpC,mBAAmB,QAAQ,WAAW;MACvC;KACD,QAAQ;MACN;MACA,KAAK,SAAS;MACf;KACF;IACD;IACA,eAAe;IAChB;GACF,CAAC;;;AAoBN,eAAe,cAAc,KAAqC;AAChE,KAAI,CAAE,MAAM,iBAAiB,IAAI,CAC/B,QAAO;EACL,WAAW;EACX,SAAS;EACV;CAGH,MAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,KAAI,CAAE,MAAM,iBAAiB,IAAI,CAC/B,QAAO;EACL,WAAW;EACX,YAAY,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,KAAA;EAClE,SAAS;EACV;CAGH,MAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,QAAO;EACL,WAAW;EACX,YAAY,OAAO,OAAO,WAAW,OAAO,cAAc,GAAG;EAC7D,QAAQ,sBAAsB,OAAO;EACtC;;AAGH,SAAS,gBAAgB,iBAAyB,kBAAwD;CACxG,MAAM,WAAqB,EAAE;AAC7B,KAAI,oBAAoB,UACtB,UAAS,KAAK,gBAAgB;AAEhC,KAAI,qBAAqB,iBACvB,UAAS,KAAK,gDAAgD;UACrD,qBAAqB,kBAC9B,UAAS,KAAK,yBAAyB,uBAAuB;KAE9D,UAAS,KAAK,kBAAkB,gBAAgB;AAElD,QAAO"}
1
+ {"version":3,"file":"status.mjs","names":[],"sources":["../../src/commands/status.ts"],"sourcesContent":["import { inspectContainer } from \"../lib/local-server/docker\";\nimport {\n DEFAULT_LOCAL_SERVER_URL,\n checkLocalServerHealth,\n localContainerName,\n readRuntimeMetadata,\n runtimeSummary,\n} from \"../lib/local-server/runtime\";\nimport { BaseCommand, type JsonEnvelope } from \"../lib/oclif\";\nimport {\n hasZitadelConfig,\n hasZitadelSecret,\n readDevelopmentIssuer,\n readZitadelConfig,\n readZitadelSecret,\n} from \"../lib/project\";\nimport { publicCliCommand } from \"../lib/public-cli\";\n\n/**\n * `zitadel status` — summarize the local server and project state.\n *\n * This is intentionally informational: a missing `zitadel.json`, stopped\n * local server, or orphaned config should be visible without making `status`\n * itself fail.\n */\nexport default class Status extends BaseCommand {\n static override description = \"Summarize the local Zitadel server and project state.\";\n\n async run(): Promise<JsonEnvelope> {\n const { flags } = await this.parse(Status);\n const runtime = await readRuntimeMetadata(flags.cwd ? String(flags.cwd) : process.cwd());\n if (flags.server === \"local\") {\n await this.toMeta(flags, {\n resolveServer: false,\n source: runtime?.server_url ?? DEFAULT_LOCAL_SERVER_URL,\n });\n } else {\n await this.toMeta(flags);\n }\n const { cwd } = this.meta;\n\n const containerName = runtime?.container_name ?? localContainerName(cwd);\n let docker: Awaited<ReturnType<typeof inspectContainer>> | undefined;\n let dockerError: string | undefined;\n try {\n docker = await inspectContainer(containerName);\n } catch (error) {\n dockerError = error instanceof Error ? error.message : String(error);\n }\n const healthy = runtime ? await checkLocalServerHealth(runtime.server_url) : false;\n const serverLifecycle = runtime\n ? docker?.running && healthy\n ? \"running\"\n : docker?.exists\n ? \"unhealthy\"\n : \"stopped\"\n : \"missing\";\n\n const project = await projectStatus(cwd);\n const nextCommands = nextCommandsFor(serverLifecycle, project.lifecycle, this.meta.cliVersion);\n const nextActions = nextActionsFor(project.lifecycle);\n\n return this.emit({\n status: \"ok\",\n data: {\n title: \"Zitadel status.\",\n server: {\n lifecycle: serverLifecycle,\n runtime: runtimeSummary(runtime),\n docker: {\n available: dockerError === undefined,\n error: dockerError,\n container_exists: docker?.exists ?? false,\n container_running: docker?.running ?? false,\n },\n health: {\n healthy,\n url: runtime?.server_url,\n },\n },\n project,\n next_actions: nextActions,\n next_commands: nextCommands,\n },\n });\n }\n}\n\ntype ProjectStatus =\n | {\n lifecycle: \"not-configured\";\n message: string;\n }\n | {\n lifecycle: \"orphaned-config\";\n project_id?: string;\n message: string;\n }\n | {\n lifecycle: \"configured\";\n project_id: string;\n issuer?: string;\n };\n\nasync function projectStatus(cwd: string): Promise<ProjectStatus> {\n if (!(await hasZitadelConfig(cwd))) {\n return {\n lifecycle: \"not-configured\",\n message: \"zitadel.json has not been created yet.\",\n };\n }\n\n const config = await readZitadelConfig(cwd);\n if (!(await hasZitadelSecret(cwd))) {\n return {\n lifecycle: \"orphaned-config\",\n project_id: typeof config.project === \"string\" ? config.project : undefined,\n message: \"zitadel.json exists but .zitadel/secret is missing.\",\n };\n }\n\n const secret = await readZitadelSecret(cwd);\n return {\n lifecycle: \"configured\",\n project_id: String(config.project ?? secret.project_id ?? \"\"),\n issuer: readDevelopmentIssuer(config),\n };\n}\n\nfunction nextActionsFor(projectLifecycle: ProjectStatus[\"lifecycle\"]): string[] {\n if (projectLifecycle === \"not-configured\") {\n return [\n \"From your app directory, run setup; the CLI will detect the framework or ask in an empty directory.\",\n ];\n }\n return [];\n}\n\nfunction nextCommandsFor(\n serverLifecycle: string,\n projectLifecycle: ProjectStatus[\"lifecycle\"],\n cliVersion: string,\n): string[] {\n const commands: string[] = [];\n if (serverLifecycle !== \"running\") {\n commands.push(publicCliCommand(\"start\", cliVersion));\n }\n if (projectLifecycle === \"not-configured\") {\n commands.push(publicCliCommand(\"setup --server local\", cliVersion));\n } else if (projectLifecycle === \"orphaned-config\") {\n commands.push(\n publicCliCommand(\"setup --force\", cliVersion),\n publicCliCommand(\"doctor --fix\", cliVersion),\n );\n } else {\n commands.push(publicCliCommand(\"doctor\", cliVersion), publicCliCommand(\"apply\", cliVersion));\n }\n return commands;\n}\n"],"mappings":";;;;;;;;;;;AAyBA,IAAqB,SAArB,MAAqB,eAAe,YAAY;CAC9C,OAAgB,cAAc;CAE9B,MAAM,MAA6B;EACjC,MAAM,EAAE,UAAU,MAAM,KAAK,MAAM,OAAO;EAC1C,MAAM,UAAU,MAAM,oBAAoB,MAAM,MAAM,OAAO,MAAM,IAAI,GAAG,QAAQ,KAAK,CAAC;AACxF,MAAI,MAAM,WAAW,QACnB,OAAM,KAAK,OAAO,OAAO;GACvB,eAAe;GACf,QAAQ,SAAS,cAAA;GAClB,CAAC;MAEF,OAAM,KAAK,OAAO,MAAM;EAE1B,MAAM,EAAE,QAAQ,KAAK;EAErB,MAAM,gBAAgB,SAAS,kBAAkB,mBAAmB,IAAI;EACxE,IAAI;EACJ,IAAI;AACJ,MAAI;AACF,YAAS,MAAM,iBAAiB,cAAc;WACvC,OAAO;AACd,iBAAc,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;;EAEtE,MAAM,UAAU,UAAU,MAAM,uBAAuB,QAAQ,WAAW,GAAG;EAC7E,MAAM,kBAAkB,UACpB,QAAQ,WAAW,UACjB,YACA,QAAQ,SACN,cACA,YACJ;EAEJ,MAAM,UAAU,MAAM,cAAc,IAAI;EACxC,MAAM,eAAe,gBAAgB,iBAAiB,QAAQ,WAAW,KAAK,KAAK,WAAW;EAC9F,MAAM,cAAc,eAAe,QAAQ,UAAU;AAErD,SAAO,KAAK,KAAK;GACf,QAAQ;GACR,MAAM;IACJ,OAAO;IACP,QAAQ;KACN,WAAW;KACX,SAAS,eAAe,QAAQ;KAChC,QAAQ;MACN,WAAW,gBAAgB,KAAA;MAC3B,OAAO;MACP,kBAAkB,QAAQ,UAAU;MACpC,mBAAmB,QAAQ,WAAW;MACvC;KACD,QAAQ;MACN;MACA,KAAK,SAAS;MACf;KACF;IACD;IACA,cAAc;IACd,eAAe;IAChB;GACF,CAAC;;;AAoBN,eAAe,cAAc,KAAqC;AAChE,KAAI,CAAE,MAAM,iBAAiB,IAAI,CAC/B,QAAO;EACL,WAAW;EACX,SAAS;EACV;CAGH,MAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,KAAI,CAAE,MAAM,iBAAiB,IAAI,CAC/B,QAAO;EACL,WAAW;EACX,YAAY,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,KAAA;EAClE,SAAS;EACV;CAGH,MAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,QAAO;EACL,WAAW;EACX,YAAY,OAAO,OAAO,WAAW,OAAO,cAAc,GAAG;EAC7D,QAAQ,sBAAsB,OAAO;EACtC;;AAGH,SAAS,eAAe,kBAAwD;AAC9E,KAAI,qBAAqB,iBACvB,QAAO,CACL,sGACD;AAEH,QAAO,EAAE;;AAGX,SAAS,gBACP,iBACA,kBACA,YACU;CACV,MAAM,WAAqB,EAAE;AAC7B,KAAI,oBAAoB,UACtB,UAAS,KAAK,iBAAiB,SAAS,WAAW,CAAC;AAEtD,KAAI,qBAAqB,iBACvB,UAAS,KAAK,iBAAiB,wBAAwB,WAAW,CAAC;UAC1D,qBAAqB,kBAC9B,UAAS,KACP,iBAAiB,iBAAiB,WAAW,EAC7C,iBAAiB,gBAAgB,WAAW,CAC7C;KAED,UAAS,KAAK,iBAAiB,UAAU,WAAW,EAAE,iBAAiB,SAAS,WAAW,CAAC;AAE9F,QAAO"}
@@ -1,5 +1,5 @@
1
- import { _ as readRuntimeMetadata, m as localContainerName, t as BaseCommand } from "../oclif-DSPO9Sck.mjs";
2
- import { u as stopAndRemoveContainer } from "../docker-C0aVpJqm.mjs";
1
+ import { g as readRuntimeMetadata, p as localContainerName, t as BaseCommand, x as publicCliCommand } from "../oclif-CqkWBQ7i.mjs";
2
+ import { u as stopAndRemoveContainer } from "../docker-DrOBycgG.mjs";
3
3
  //#region src/commands/stop.ts
4
4
  var Stop = class Stop extends BaseCommand {
5
5
  static description = "Stop the local Zitadel server.";
@@ -20,7 +20,7 @@ var Stop = class Stop extends BaseCommand {
20
20
  data_preserved: true,
21
21
  data_dir: runtime?.data_dir
22
22
  },
23
- next_commands: ["zitadel stop"]
23
+ next_commands: [publicCliCommand("stop", this.meta.cliVersion)]
24
24
  }
25
25
  });
26
26
  await stopAndRemoveContainer(containerName);
@@ -32,8 +32,7 @@ var Stop = class Stop extends BaseCommand {
32
32
  container_name: containerName,
33
33
  data_preserved: true,
34
34
  data_dir: runtime?.data_dir
35
- },
36
- next_commands: ["zitadel start", "zitadel reset --force"]
35
+ }
37
36
  }
38
37
  });
39
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stop.mjs","names":[],"sources":["../../src/commands/stop.ts"],"sourcesContent":["import { BaseCommand, type JsonEnvelope } from \"../lib/oclif\";\nimport { stopAndRemoveContainer } from \"../lib/local-server/docker\";\nimport {\n DEFAULT_LOCAL_SERVER_URL,\n localContainerName,\n readRuntimeMetadata,\n} from \"../lib/local-server/runtime\";\n\nexport default class Stop extends BaseCommand {\n static override description = \"Stop the local Zitadel server.\";\n\n async run(): Promise<JsonEnvelope> {\n const { flags } = await this.parse(Stop);\n const runtime = await readRuntimeMetadata(flags.cwd ? String(flags.cwd) : process.cwd());\n await this.toMeta(flags, {\n resolveServer: false,\n source: runtime?.server_url ?? DEFAULT_LOCAL_SERVER_URL,\n });\n\n const containerName = runtime?.container_name ?? localContainerName(this.meta.cwd);\n if (this.meta.dryRun) {\n return this.emit({\n status: \"ok\",\n data: {\n title: \"Local Zitadel server stop plan.\",\n runtime: {\n container_name: containerName,\n data_preserved: true,\n data_dir: runtime?.data_dir,\n },\n next_commands: [\"zitadel stop\"],\n },\n });\n }\n\n await stopAndRemoveContainer(containerName);\n\n return this.emit({\n status: \"ok\",\n data: {\n title: \"Local Zitadel server stopped.\",\n runtime: {\n container_name: containerName,\n data_preserved: true,\n data_dir: runtime?.data_dir,\n },\n next_commands: [\"zitadel start\", \"zitadel reset --force\"],\n },\n });\n }\n}\n"],"mappings":";;;AAQA,IAAqB,OAArB,MAAqB,aAAa,YAAY;CAC5C,OAAgB,cAAc;CAE9B,MAAM,MAA6B;EACjC,MAAM,EAAE,UAAU,MAAM,KAAK,MAAM,KAAK;EACxC,MAAM,UAAU,MAAM,oBAAoB,MAAM,MAAM,OAAO,MAAM,IAAI,GAAG,QAAQ,KAAK,CAAC;AACxF,QAAM,KAAK,OAAO,OAAO;GACvB,eAAe;GACf,QAAQ,SAAS,cAAA;GAClB,CAAC;EAEF,MAAM,gBAAgB,SAAS,kBAAkB,mBAAmB,KAAK,KAAK,IAAI;AAClF,MAAI,KAAK,KAAK,OACZ,QAAO,KAAK,KAAK;GACf,QAAQ;GACR,MAAM;IACJ,OAAO;IACP,SAAS;KACP,gBAAgB;KAChB,gBAAgB;KAChB,UAAU,SAAS;KACpB;IACD,eAAe,CAAC,eAAe;IAChC;GACF,CAAC;AAGJ,QAAM,uBAAuB,cAAc;AAE3C,SAAO,KAAK,KAAK;GACf,QAAQ;GACR,MAAM;IACJ,OAAO;IACP,SAAS;KACP,gBAAgB;KAChB,gBAAgB;KAChB,UAAU,SAAS;KACpB;IACD,eAAe,CAAC,iBAAiB,wBAAwB;IAC1D;GACF,CAAC"}
1
+ {"version":3,"file":"stop.mjs","names":[],"sources":["../../src/commands/stop.ts"],"sourcesContent":["import { stopAndRemoveContainer } from \"../lib/local-server/docker\";\nimport {\n DEFAULT_LOCAL_SERVER_URL,\n localContainerName,\n readRuntimeMetadata,\n} from \"../lib/local-server/runtime\";\nimport { BaseCommand, type JsonEnvelope } from \"../lib/oclif\";\nimport { publicCliCommand } from \"../lib/public-cli\";\n\nexport default class Stop extends BaseCommand {\n static override description = \"Stop the local Zitadel server.\";\n\n async run(): Promise<JsonEnvelope> {\n const { flags } = await this.parse(Stop);\n const runtime = await readRuntimeMetadata(flags.cwd ? String(flags.cwd) : process.cwd());\n await this.toMeta(flags, {\n resolveServer: false,\n source: runtime?.server_url ?? DEFAULT_LOCAL_SERVER_URL,\n });\n\n const containerName = runtime?.container_name ?? localContainerName(this.meta.cwd);\n if (this.meta.dryRun) {\n return this.emit({\n status: \"ok\",\n data: {\n title: \"Local Zitadel server stop plan.\",\n runtime: {\n container_name: containerName,\n data_preserved: true,\n data_dir: runtime?.data_dir,\n },\n next_commands: [publicCliCommand(\"stop\", this.meta.cliVersion)],\n },\n });\n }\n\n await stopAndRemoveContainer(containerName);\n\n return this.emit({\n status: \"ok\",\n data: {\n title: \"Local Zitadel server stopped.\",\n runtime: {\n container_name: containerName,\n data_preserved: true,\n data_dir: runtime?.data_dir,\n },\n },\n });\n }\n}\n"],"mappings":";;;AASA,IAAqB,OAArB,MAAqB,aAAa,YAAY;CAC5C,OAAgB,cAAc;CAE9B,MAAM,MAA6B;EACjC,MAAM,EAAE,UAAU,MAAM,KAAK,MAAM,KAAK;EACxC,MAAM,UAAU,MAAM,oBAAoB,MAAM,MAAM,OAAO,MAAM,IAAI,GAAG,QAAQ,KAAK,CAAC;AACxF,QAAM,KAAK,OAAO,OAAO;GACvB,eAAe;GACf,QAAQ,SAAS,cAAA;GAClB,CAAC;EAEF,MAAM,gBAAgB,SAAS,kBAAkB,mBAAmB,KAAK,KAAK,IAAI;AAClF,MAAI,KAAK,KAAK,OACZ,QAAO,KAAK,KAAK;GACf,QAAQ;GACR,MAAM;IACJ,OAAO;IACP,SAAS;KACP,gBAAgB;KAChB,gBAAgB;KAChB,UAAU,SAAS;KACpB;IACD,eAAe,CAAC,iBAAiB,QAAQ,KAAK,KAAK,WAAW,CAAC;IAChE;GACF,CAAC;AAGJ,QAAM,uBAAuB,cAAc;AAE3C,SAAO,KAAK,KAAK;GACf,QAAQ;GACR,MAAM;IACJ,OAAO;IACP,SAAS;KACP,gBAAgB;KAChB,gBAAgB;KAChB,UAAU,SAAS;KACpB;IACF;GACF,CAAC"}
@@ -1,4 +1,4 @@
1
- import { T as ZitadelError, a as CONTAINER_HTTP_PORT, i as CONTAINER_DATA_DIR } from "./oclif-DSPO9Sck.mjs";
1
+ import { E as ZitadelError, i as CONTAINER_HTTP_PORT, r as CONTAINER_DATA_DIR } from "./oclif-CqkWBQ7i.mjs";
2
2
  import { spawn } from "node:child_process";
3
3
  //#region src/lib/local-server/docker.ts
4
4
  function dockerRunArgs(spec) {
@@ -116,18 +116,19 @@ async function inspectContainer(containerName) {
116
116
  const result = await runDocker([
117
117
  "inspect",
118
118
  "--format",
119
- "{{.Id}} {{.State.Running}}",
119
+ "{{.Id}} {{.State.Running}} {{.Config.Image}}",
120
120
  containerName
121
121
  ]);
122
122
  if (result.status !== 0) return {
123
123
  exists: false,
124
124
  running: false
125
125
  };
126
- const [id, running] = result.stdout.trim().split(/\s+/);
126
+ const [id, running, ...imageParts] = result.stdout.trim().split(/\s+/);
127
127
  return {
128
128
  exists: true,
129
129
  running: running === "true",
130
- id
130
+ id,
131
+ image: imageParts.join(" ")
131
132
  };
132
133
  }
133
134
  async function startContainer(spec) {
@@ -206,4 +207,4 @@ function dockerError(action, args, cause) {
206
207
  //#endregion
207
208
  export { followContainerLogs as a, metadataFromStart as c, ensureImage as i, startContainer as l, currentUser as n, imageAvailable as o, dockerAvailable as r, inspectContainer as s, containerLogs as t, stopAndRemoveContainer as u };
208
209
 
209
- //# sourceMappingURL=docker-C0aVpJqm.mjs.map
210
+ //# sourceMappingURL=docker-DrOBycgG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-DrOBycgG.mjs","names":[],"sources":["../src/lib/local-server/docker.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\n\nimport { ZitadelError } from \"../errors\";\nimport {\n CONTAINER_DATA_DIR,\n CONTAINER_HTTP_PORT,\n type ContainerIdentity,\n type RuntimeMetadata,\n} from \"./runtime\";\n\nexport type DockerResult = {\n status: number;\n stdout: string;\n stderr: string;\n};\n\nexport type DockerRunSpec = {\n containerName: string;\n image: string;\n port: number;\n dataDir: string;\n identity?: ContainerIdentity;\n};\n\nexport function dockerRunArgs(spec: DockerRunSpec): string[] {\n const args = [\n \"run\",\n \"--detach\",\n \"--name\",\n spec.containerName,\n \"--publish\",\n `127.0.0.1:${spec.port}:${CONTAINER_HTTP_PORT}`,\n \"--volume\",\n `${spec.dataDir}:${CONTAINER_DATA_DIR}`,\n \"--env\",\n `NEXTGEN_SERVER_ADDRESS=:${CONTAINER_HTTP_PORT}`,\n \"--env\",\n `NEXTGEN_SERVER_DATA_DIR=${CONTAINER_DATA_DIR}`,\n ];\n\n if (spec.identity) {\n args.push(\n \"--volume\",\n `${spec.identity.passwdFile}:/etc/passwd:ro`,\n \"--volume\",\n `${spec.identity.groupFile}:/etc/group:ro`,\n \"--user\",\n `${spec.identity.uid}:${spec.identity.gid}`,\n );\n }\n\n args.push(spec.image);\n return args;\n}\n\nexport async function runDocker(args: string[]): Promise<DockerResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"docker\", args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout?.setEncoding(\"utf8\");\n child.stderr?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr?.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n resolve({ status: code ?? 1, stdout, stderr });\n });\n });\n}\n\nexport async function streamDocker(args: string[]): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\"docker\", args, {\n stdio: \"inherit\",\n env: process.env,\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`docker ${args.join(\" \")} exited with status ${code ?? 1}`));\n }\n });\n });\n}\n\nexport async function dockerAvailable(): Promise<DockerResult> {\n return runDocker([\"version\", \"--format\", \"{{.Server.Version}}\"]);\n}\n\nexport async function pullImage(image: string): Promise<void> {\n await requireDocker([\"pull\", \"--quiet\", image], `Pull Docker image ${image}`);\n}\n\nexport async function imageExists(image: string): Promise<boolean> {\n let result: DockerResult;\n const args = [\"image\", \"inspect\", image];\n try {\n result = await runDocker(args);\n } catch (error) {\n throw dockerError(`Inspect Docker image ${image}`, args, error);\n }\n return result.status === 0;\n}\n\nexport async function imageAvailable(image: string): Promise<\"local\" | \"remote\"> {\n if (await imageExists(image)) {\n return \"local\";\n }\n\n const args = [\"manifest\", \"inspect\", image];\n let result: DockerResult;\n try {\n result = await runDocker(args);\n } catch (error) {\n throw dockerError(`Inspect Docker image ${image}`, args, error);\n }\n if (result.status === 0) {\n return \"remote\";\n }\n throw dockerError(`Inspect Docker image ${image}`, args, result);\n}\n\nexport async function ensureImage(image: string): Promise<\"local\" | \"pulled\"> {\n if (await imageExists(image)) {\n return \"local\";\n }\n await pullImage(image);\n return \"pulled\";\n}\n\nexport async function inspectContainer(containerName: string): Promise<{\n exists: boolean;\n running: boolean;\n id?: string;\n image?: string;\n}> {\n const result = await runDocker([\n \"inspect\",\n \"--format\",\n \"{{.Id}} {{.State.Running}} {{.Config.Image}}\",\n containerName,\n ]);\n if (result.status !== 0) {\n return { exists: false, running: false };\n }\n const [id, running, ...imageParts] = result.stdout.trim().split(/\\s+/);\n return { exists: true, running: running === \"true\", id, image: imageParts.join(\" \") };\n}\n\nexport async function startContainer(spec: DockerRunSpec): Promise<string> {\n const args = dockerRunArgs(spec);\n const result = await requireDocker(args, \"Start local Zitadel container\");\n return result.stdout.trim();\n}\n\nexport async function stopAndRemoveContainer(containerName: string): Promise<void> {\n const inspect = await inspectContainer(containerName);\n if (!inspect.exists) {\n return;\n }\n if (inspect.running) {\n await requireDocker([\"stop\", containerName], `Stop ${containerName}`);\n }\n await requireDocker([\"rm\", containerName], `Remove ${containerName}`);\n}\n\nexport async function containerLogs(containerName: string, tail: number): Promise<string> {\n const result = await requireDocker([\"logs\", \"--tail\", String(tail), containerName], \"Read logs\");\n return result.stdout;\n}\n\nexport async function followContainerLogs(containerName: string, tail: number): Promise<void> {\n await streamDocker([\"logs\", \"--tail\", String(tail), \"--follow\", containerName]);\n}\n\nexport function currentUser(): { uid?: number; gid?: number } {\n const getuid = process.getuid;\n const getgid = process.getgid;\n if (typeof getuid !== \"function\") {\n return {};\n }\n const uid = getuid();\n const gid = typeof getgid === \"function\" ? getgid() : uid;\n return { uid, gid };\n}\n\nexport function metadataFromStart(input: {\n cwdDataDir: string;\n cliVersion: string;\n containerName: string;\n containerId: string;\n image: string;\n port: number;\n serverUrl: string;\n}): RuntimeMetadata {\n return {\n schema_version: 1,\n container_name: input.containerName,\n container_id: input.containerId,\n image: input.image,\n port: input.port,\n server_url: input.serverUrl,\n data_dir: input.cwdDataDir,\n created_at: new Date().toISOString(),\n cli_version: input.cliVersion,\n };\n}\n\nexport async function requireDocker(args: string[], action: string): Promise<DockerResult> {\n let result: DockerResult;\n try {\n result = await runDocker(args);\n } catch (error) {\n throw dockerError(action, args, error);\n }\n if (result.status !== 0) {\n throw dockerError(action, args, result);\n }\n return result;\n}\n\nfunction dockerError(action: string, args: string[], cause: unknown): ZitadelError {\n const details =\n cause && typeof cause === \"object\" && \"stderr\" in cause\n ? { command: [\"docker\", ...args], stderr: String((cause as { stderr?: unknown }).stderr) }\n : { command: [\"docker\", ...args], cause };\n return new ZitadelError(\"E_VALIDATION\", `${action} failed`, {\n hint: \"Check that Docker is installed, running, and reachable from this shell.\",\n nextCommands: [\"zitadel doctor\"],\n details,\n });\n}\n"],"mappings":";;;AAwBA,SAAgB,cAAc,MAA+B;CAC3D,MAAM,OAAO;EACX;EACA;EACA;EACA,KAAK;EACL;EACA,aAAa,KAAK,KAAK,GAAG;EAC1B;EACA,GAAG,KAAK,QAAQ,GAAG;EACnB;EACA,2BAA2B;EAC3B;EACA,2BAA2B;EAC5B;AAED,KAAI,KAAK,SACP,MAAK,KACH,YACA,GAAG,KAAK,SAAS,WAAW,kBAC5B,YACA,GAAG,KAAK,SAAS,UAAU,iBAC3B,UACA,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,MACvC;AAGH,MAAK,KAAK,KAAK,MAAM;AACrB,QAAO;;AAGT,eAAsB,UAAU,MAAuC;AACrE,QAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,QAAQ,MAAM,UAAU,MAAM;GAClC,OAAO;IAAC;IAAU;IAAQ;IAAO;GACjC,KAAK,QAAQ;GACd,CAAC;EACF,IAAI,SAAS;EACb,IAAI,SAAS;AACb,QAAM,QAAQ,YAAY,OAAO;AACjC,QAAM,QAAQ,YAAY,OAAO;AACjC,QAAM,QAAQ,GAAG,SAAS,UAAkB;AAC1C,aAAU;IACV;AACF,QAAM,QAAQ,GAAG,SAAS,UAAkB;AAC1C,aAAU;IACV;AACF,QAAM,GAAG,SAAS,OAAO;AACzB,QAAM,GAAG,UAAU,SAAS;AAC1B,WAAQ;IAAE,QAAQ,QAAQ;IAAG;IAAQ;IAAQ,CAAC;IAC9C;GACF;;AAGJ,eAAsB,aAAa,MAA+B;AAChE,OAAM,IAAI,SAAe,SAAS,WAAW;EAC3C,MAAM,QAAQ,MAAM,UAAU,MAAM;GAClC,OAAO;GACP,KAAK,QAAQ;GACd,CAAC;AACF,QAAM,GAAG,SAAS,OAAO;AACzB,QAAM,GAAG,UAAU,SAAS;AAC1B,OAAI,SAAS,EACX,UAAS;OAET,wBAAO,IAAI,MAAM,UAAU,KAAK,KAAK,IAAI,CAAC,sBAAsB,QAAQ,IAAI,CAAC;IAE/E;GACF;;AAGJ,eAAsB,kBAAyC;AAC7D,QAAO,UAAU;EAAC;EAAW;EAAY;EAAsB,CAAC;;AAGlE,eAAsB,UAAU,OAA8B;AAC5D,OAAM,cAAc;EAAC;EAAQ;EAAW;EAAM,EAAE,qBAAqB,QAAQ;;AAG/E,eAAsB,YAAY,OAAiC;CACjE,IAAI;CACJ,MAAM,OAAO;EAAC;EAAS;EAAW;EAAM;AACxC,KAAI;AACF,WAAS,MAAM,UAAU,KAAK;UACvB,OAAO;AACd,QAAM,YAAY,wBAAwB,SAAS,MAAM,MAAM;;AAEjE,QAAO,OAAO,WAAW;;AAG3B,eAAsB,eAAe,OAA4C;AAC/E,KAAI,MAAM,YAAY,MAAM,CAC1B,QAAO;CAGT,MAAM,OAAO;EAAC;EAAY;EAAW;EAAM;CAC3C,IAAI;AACJ,KAAI;AACF,WAAS,MAAM,UAAU,KAAK;UACvB,OAAO;AACd,QAAM,YAAY,wBAAwB,SAAS,MAAM,MAAM;;AAEjE,KAAI,OAAO,WAAW,EACpB,QAAO;AAET,OAAM,YAAY,wBAAwB,SAAS,MAAM,OAAO;;AAGlE,eAAsB,YAAY,OAA4C;AAC5E,KAAI,MAAM,YAAY,MAAM,CAC1B,QAAO;AAET,OAAM,UAAU,MAAM;AACtB,QAAO;;AAGT,eAAsB,iBAAiB,eAKpC;CACD,MAAM,SAAS,MAAM,UAAU;EAC7B;EACA;EACA;EACA;EACD,CAAC;AACF,KAAI,OAAO,WAAW,EACpB,QAAO;EAAE,QAAQ;EAAO,SAAS;EAAO;CAE1C,MAAM,CAAC,IAAI,SAAS,GAAG,cAAc,OAAO,OAAO,MAAM,CAAC,MAAM,MAAM;AACtE,QAAO;EAAE,QAAQ;EAAM,SAAS,YAAY;EAAQ;EAAI,OAAO,WAAW,KAAK,IAAI;EAAE;;AAGvF,eAAsB,eAAe,MAAsC;AAGzE,SAAO,MADc,cADR,cAAc,KACY,EAAE,gCAAgC,EAC3D,OAAO,MAAM;;AAG7B,eAAsB,uBAAuB,eAAsC;CACjF,MAAM,UAAU,MAAM,iBAAiB,cAAc;AACrD,KAAI,CAAC,QAAQ,OACX;AAEF,KAAI,QAAQ,QACV,OAAM,cAAc,CAAC,QAAQ,cAAc,EAAE,QAAQ,gBAAgB;AAEvE,OAAM,cAAc,CAAC,MAAM,cAAc,EAAE,UAAU,gBAAgB;;AAGvE,eAAsB,cAAc,eAAuB,MAA+B;AAExF,SAAO,MADc,cAAc;EAAC;EAAQ;EAAU,OAAO,KAAK;EAAE;EAAc,EAAE,YAAY,EAClF;;AAGhB,eAAsB,oBAAoB,eAAuB,MAA6B;AAC5F,OAAM,aAAa;EAAC;EAAQ;EAAU,OAAO,KAAK;EAAE;EAAY;EAAc,CAAC;;AAGjF,SAAgB,cAA8C;CAC5D,MAAM,SAAS,QAAQ;CACvB,MAAM,SAAS,QAAQ;AACvB,KAAI,OAAO,WAAW,WACpB,QAAO,EAAE;CAEX,MAAM,MAAM,QAAQ;AAEpB,QAAO;EAAE;EAAK,KADF,OAAO,WAAW,aAAa,QAAQ,GAAG;EACnC;;AAGrB,SAAgB,kBAAkB,OAQd;AAClB,QAAO;EACL,gBAAgB;EAChB,gBAAgB,MAAM;EACtB,cAAc,MAAM;EACpB,OAAO,MAAM;EACb,MAAM,MAAM;EACZ,YAAY,MAAM;EAClB,UAAU,MAAM;EAChB,6BAAY,IAAI,MAAM,EAAC,aAAa;EACpC,aAAa,MAAM;EACpB;;AAGH,eAAsB,cAAc,MAAgB,QAAuC;CACzF,IAAI;AACJ,KAAI;AACF,WAAS,MAAM,UAAU,KAAK;UACvB,OAAO;AACd,QAAM,YAAY,QAAQ,MAAM,MAAM;;AAExC,KAAI,OAAO,WAAW,EACpB,OAAM,YAAY,QAAQ,MAAM,OAAO;AAEzC,QAAO;;AAGT,SAAS,YAAY,QAAgB,MAAgB,OAA8B;CACjF,MAAM,UACJ,SAAS,OAAO,UAAU,YAAY,YAAY,QAC9C;EAAE,SAAS,CAAC,UAAU,GAAG,KAAK;EAAE,QAAQ,OAAQ,MAA+B,OAAO;EAAE,GACxF;EAAE,SAAS,CAAC,UAAU,GAAG,KAAK;EAAE;EAAO;AAC7C,QAAO,IAAI,aAAa,gBAAgB,GAAG,OAAO,UAAU;EAC1D,MAAM;EACN,cAAc,CAAC,iBAAiB;EAChC;EACD,CAAC"}
@@ -1,12 +1,12 @@
1
1
  import { Command, Flags } from "@oclif/core";
2
2
  import consola from "consola";
3
- import { access, mkdir, readFile, rm, writeFile } from "node:fs/promises";
4
- import { join, resolve } from "node:path";
5
3
  import { ApiError } from "@zitadel/api/runtime/fetch";
4
+ import { stringify } from "safe-stable-stringify";
5
+ import { join, resolve } from "node:path";
6
+ import { access, mkdir, readFile, rm, writeFile } from "node:fs/promises";
6
7
  import { createHash } from "node:crypto";
7
8
  import { constants } from "node:fs";
8
9
  import { createServer } from "node:net";
9
- import { stringify } from "safe-stable-stringify";
10
10
  //#region src/lib/errors.ts
11
11
  /**
12
12
  * Maps each {@link ZitadelErrorCode} to the process exit code the CLI
@@ -148,8 +148,50 @@ function isObject(value) {
148
148
  return typeof value === "object" && value !== null && !Array.isArray(value);
149
149
  }
150
150
  //#endregion
151
+ //#region src/lib/paths.ts
152
+ /**
153
+ * Resolve the working directory the CLI should operate against, defaulting to
154
+ * the process CWD when no `--cwd` override is given. Always returns an
155
+ * absolute path so downstream `join`/`readFile` calls are unaffected by later
156
+ * `process.chdir` or relative-path ambiguity.
157
+ */
158
+ function resolveCwd(cwd) {
159
+ return resolve(cwd ?? process.cwd());
160
+ }
161
+ /**
162
+ * Sentinel comment stamped at the top of every file the CLI generates and
163
+ * owns. Commands like `doctor` and `eject` look for this marker to decide
164
+ * whether a file is safe to touch; the trailing `v1` lets the format evolve
165
+ * without mistaking newer managed files for hand-edited ones.
166
+ */
167
+ const MANAGED_MARKER = "// zitadel-cli: managed-file v1";
168
+ //#endregion
169
+ //#region src/lib/public-cli.ts
170
+ const CLI_PACKAGE_NAME = "@zitadel/cli";
171
+ function npmDistTagForCliVersion(cliVersion) {
172
+ return cliVersion.trim().replace(/^v/, "").match(/^\d+\.\d+\.\d+-([0-9A-Za-z][0-9A-Za-z-]*)/)?.[1] ?? "latest";
173
+ }
174
+ function npmSelectorForCliVersion(cliVersion) {
175
+ const normalized = cliVersion.trim().replace(/^v/, "");
176
+ if (/^\d+\.\d+\.\d+-alpha\.\d+$/.test(normalized)) return normalized;
177
+ return npmDistTagForCliVersion(normalized);
178
+ }
179
+ function publicCliCommand(args, cliVersion) {
180
+ const prefix = `npx ${CLI_PACKAGE_NAME}@${npmSelectorForCliVersion(cliVersion)}`;
181
+ return args.length > 0 ? `${prefix} ${args}` : prefix;
182
+ }
183
+ function normalizePublicCliCommand(command, cliVersion) {
184
+ if (command === "zitadel") return publicCliCommand("", cliVersion);
185
+ if (command.startsWith("zitadel ")) return publicCliCommand(command.slice(8), cliVersion);
186
+ return command;
187
+ }
188
+ function normalizePublicCliCommands(commands, cliVersion) {
189
+ return commands?.map((command) => normalizePublicCliCommand(command, cliVersion));
190
+ }
191
+ //#endregion
151
192
  //#region src/lib/local-server/runtime.ts
152
- const DEFAULT_LOCAL_SERVER_IMAGE = "ghcr.io/zitadel/nextgen:latest";
193
+ const LOCAL_SERVER_IMAGE_NAME = "ghcr.io/zitadel/nextgen";
194
+ const DEFAULT_LOCAL_SERVER_IMAGE = `${LOCAL_SERVER_IMAGE_NAME}:latest`;
153
195
  const DEFAULT_LOCAL_SERVER_PORT = 8080;
154
196
  const DEFAULT_LOCAL_SERVER_URL = "http://localhost:8080";
155
197
  const LOCAL_RUNTIME_DIR = ".zitadel/local";
@@ -174,6 +216,11 @@ function localContainerName(cwd) {
174
216
  function localServerUrl(port) {
175
217
  return `http://localhost:${port}`;
176
218
  }
219
+ function defaultLocalServerImageForCliVersion(cliVersion) {
220
+ const normalized = cliVersion.trim().replace(/^v/, "");
221
+ if (/^\d+\.\d+\.\d+-alpha\.\d+$/.test(normalized)) return `${LOCAL_SERVER_IMAGE_NAME}:${normalized}`;
222
+ return DEFAULT_LOCAL_SERVER_IMAGE;
223
+ }
177
224
  async function ensureLocalState(cwd) {
178
225
  const paths = localRuntimePaths(cwd);
179
226
  await mkdir(paths.dataDir, {
@@ -422,24 +469,6 @@ function readEnvServer(config, environment) {
422
469
  return typeof branch.server === "string" ? branch.server : void 0;
423
470
  }
424
471
  //#endregion
425
- //#region src/lib/paths.ts
426
- /**
427
- * Resolve the working directory the CLI should operate against, defaulting to
428
- * the process CWD when no `--cwd` override is given. Always returns an
429
- * absolute path so downstream `join`/`readFile` calls are unaffected by later
430
- * `process.chdir` or relative-path ambiguity.
431
- */
432
- function resolveCwd(cwd) {
433
- return resolve(cwd ?? process.cwd());
434
- }
435
- /**
436
- * Sentinel comment stamped at the top of every file the CLI generates and
437
- * owns. Commands like `doctor` and `eject` look for this marker to decide
438
- * whether a file is safe to touch; the trailing `v1` lets the format evolve
439
- * without mistaking newer managed files for hand-edited ones.
440
- */
441
- const MANAGED_MARKER = "// zitadel-cli: managed-file v1";
442
- //#endregion
443
472
  //#region src/lib/oclif/base.ts
444
473
  /**
445
474
  * Base class for every oclif command. Owns the global flags, builds the
@@ -530,8 +559,9 @@ var BaseCommand = class extends Command {
530
559
  * envelope so oclif's `--json` path serialises it.
531
560
  */
532
561
  emit(result) {
533
- this.log(renderPretty(result, this.meta));
534
- return toEnvelope(result, this.meta);
562
+ const normalized = normalizeCommandResult(result, this.meta);
563
+ this.log(renderPretty(normalized, this.meta));
564
+ return toEnvelope(normalized, this.meta);
535
565
  }
536
566
  /**
537
567
  * Renders any thrown error as the failure envelope and exits with its code.
@@ -546,7 +576,7 @@ var BaseCommand = class extends Command {
546
576
  };
547
577
  const zitadelError = toZitadelError(error);
548
578
  if (this.jsonEnabled()) this.logJson(toErrorEnvelope(zitadelError, meta));
549
- else this.logToStderr(renderError(zitadelError));
579
+ else this.logToStderr(renderError(zitadelError, meta));
550
580
  return this.exit(zitadelError.exitCode);
551
581
  }
552
582
  /**
@@ -570,6 +600,24 @@ var BaseCommand = class extends Command {
570
600
  };
571
601
  }
572
602
  };
603
+ function normalizeCommandResult(result, meta) {
604
+ if (result.status === "ok") return {
605
+ ...result,
606
+ data: normalizeDataNextCommands(result.data, meta)
607
+ };
608
+ return {
609
+ ...result,
610
+ data: normalizeDataNextCommands(result.data, meta),
611
+ nextCommands: normalizePublicCliCommands(result.nextCommands, meta.cliVersion)
612
+ };
613
+ }
614
+ function normalizeDataNextCommands(data, meta) {
615
+ if (!isObject(data) || !Array.isArray(data.next_commands)) return data;
616
+ return {
617
+ ...data,
618
+ next_commands: data.next_commands.map((command) => typeof command === "string" ? normalizePublicCliCommand(command, meta.cliVersion) : command)
619
+ };
620
+ }
573
621
  /** Wraps a {@link CommandResult} with the invocation metadata into the final envelope. */
574
622
  function toEnvelope(result, meta) {
575
623
  const base = {
@@ -601,7 +649,7 @@ function toErrorEnvelope(error, meta) {
601
649
  code: error.code,
602
650
  message: error.message,
603
651
  hint: error.hint,
604
- next_commands: error.nextCommands,
652
+ next_commands: normalizePublicCliCommands(error.nextCommands, meta.cliVersion),
605
653
  details: error.details
606
654
  };
607
655
  }
@@ -625,12 +673,13 @@ function renderPretty(result, meta) {
625
673
  * Renders a {@link ZitadelError} as a human-readable block for stderr: the
626
674
  * coded message, an optional hint, and any suggested next commands.
627
675
  */
628
- function renderError(error) {
676
+ function renderError(error, meta) {
629
677
  const lines = [`Error ${error.code}: ${error.message}`];
630
678
  if (error.hint) lines.push(error.hint);
631
- if (error.nextCommands && error.nextCommands.length > 0) {
679
+ const nextCommands = normalizePublicCliCommands(error.nextCommands, meta.cliVersion);
680
+ if (nextCommands && nextCommands.length > 0) {
632
681
  lines.push("Next:");
633
- for (const cmd of error.nextCommands) lines.push(` $ ${cmd}`);
682
+ for (const cmd of nextCommands) lines.push(` $ ${cmd}`);
634
683
  }
635
684
  return lines.join("\n");
636
685
  }
@@ -659,9 +708,16 @@ function formatData(data, warnings, opts) {
659
708
  for (const cmd of data.next_commands) lines.push(` $ ${String(cmd)}`);
660
709
  }
661
710
  }
662
- for (const warning of warnings) lines.push(`Warning: ${warning}`);
711
+ for (const warning of warnings.filter((warning) => !warningRenderedInChecks(data, warning))) lines.push(`Warning: ${warning}`);
663
712
  return lines.join("\n");
664
713
  }
714
+ function warningRenderedInChecks(data, warning) {
715
+ if (!isObject(data) || !Array.isArray(data.checks)) return false;
716
+ return data.checks.some((check) => {
717
+ if (!isObject(check) || check.status !== "warn") return false;
718
+ return warning === `${String(check.name ?? "check")}: ${String(check.message ?? "")}`;
719
+ });
720
+ }
665
721
  function renderKnownSections(lines, data) {
666
722
  if (isObject(data.project)) {
667
723
  const project = data.project;
@@ -689,7 +745,7 @@ function renderKnownSections(lines, data) {
689
745
  lines.push("Checks:");
690
746
  for (const check of data.checks) {
691
747
  if (!isObject(check)) continue;
692
- const status = check.status === "pass" ? "ok" : "fail";
748
+ const status = check.status === "pass" ? "ok" : check.status === "warn" ? "warn" : "fail";
693
749
  lines.push(` [${status}] ${String(check.name ?? "check")}: ${String(check.message ?? "")}`);
694
750
  }
695
751
  }
@@ -708,6 +764,6 @@ function suffixBlock(opts) {
708
764
  return suffix ? ` ${suffix}` : "";
709
765
  }
710
766
  //#endregion
711
- export { parseJsonObject as C, isObject as S, ZitadelError as T, readRuntimeMetadata as _, CONTAINER_HTTP_PORT as a, runtimeSummary as b, DEFAULT_LOCAL_SERVER_URL as c, ensureContainerIdentity as d, ensureLocalState as f, localServerUrl as g, localRuntimePaths as h, CONTAINER_DATA_DIR as i, assertWritableDirectory as l, localContainerName as m, MANAGED_MARKER as n, DEFAULT_LOCAL_SERVER_IMAGE as o, isPortAvailable as p, DEFAULT_SERVER as r, DEFAULT_LOCAL_SERVER_PORT as s, BaseCommand as t, checkLocalServerHealth as u, removeLocalData as v, stableStringify as w, writeRuntimeMetadata as x, removeRuntimeMetadata as y };
767
+ export { isObject as C, ZitadelError as E, MANAGED_MARKER as S, stableStringify as T, removeLocalData as _, DEFAULT_LOCAL_SERVER_PORT as a, writeRuntimeMetadata as b, checkLocalServerHealth as c, ensureLocalState as d, isPortAvailable as f, readRuntimeMetadata as g, localServerUrl as h, CONTAINER_HTTP_PORT as i, defaultLocalServerImageForCliVersion as l, localRuntimePaths as m, DEFAULT_SERVER as n, DEFAULT_LOCAL_SERVER_URL as o, localContainerName as p, CONTAINER_DATA_DIR as r, assertWritableDirectory as s, BaseCommand as t, ensureContainerIdentity as u, removeRuntimeMetadata as v, parseJsonObject as w, publicCliCommand as x, runtimeSummary as y };
712
768
 
713
- //# sourceMappingURL=oclif-DSPO9Sck.mjs.map
769
+ //# sourceMappingURL=oclif-CqkWBQ7i.mjs.map