@zitadel/cli 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { M as COMMAND_GROUPS, N as CommandGroups, P as compareInGroup, i as exploreAllCommands, t as showSkillsHint } from "../../skills-hint-N1H5-ny1.mjs";
1
+ import { B as CommandGroups, V as compareInGroup, i as exploreAllCommands, t as showSkillsHint, z as COMMAND_GROUPS } from "../../skills-hint-C8oe8cCo.mjs";
2
2
  import { Help, toConfiguredId, ux } from "@oclif/core";
3
3
  //#region src/lib/oclif/help.ts
4
4
  /**
@@ -35,7 +35,8 @@ var ZitadelHelp = class extends Help {
35
35
  ];
36
36
  if (process.argv.length <= 2) await showSkillsHint({
37
37
  env: process.env,
38
- interactive: Boolean(process.stdout.isTTY && process.stdin.isTTY)
38
+ interactive: Boolean(process.stdout.isTTY && process.stdin.isTTY),
39
+ cliVersion: this.config.version
39
40
  });
40
41
  this.log(sections.join("\n\n"));
41
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"help.mjs","names":[],"sources":["../../../src/lib/oclif/help.ts"],"sourcesContent":["import { type Command, Help, type Interfaces, toConfiguredId, ux } from \"@oclif/core\";\n\nimport { exploreAllCommands } from \"../journey-guidance\";\nimport { showSkillsHint } from \"../skills-hint\";\nimport { COMMAND_GROUPS, type CommandGroup, CommandGroups, compareInGroup } from \"./groups\";\n\n/** A loaded command plus the root-help statics `BaseCommand` (`./base`) declares. */\ntype GroupedCommand = Command.Loadable & { group?: CommandGroup; groupOrder?: number };\n\n/** One line of the root screen: a command, or a family of commands under one name. */\ntype Row = { name: string; summary: string; order: number };\n\n/**\n * Summaries for oclif plugin commands that ship without one. `version` prints\n * a blank line otherwise.\n */\nconst PLUGIN_SUMMARIES: Readonly<Record<string, string>> = {\n version: \"Show the CLI version\",\n};\n\n/**\n * Root help in the style of `gh --help`: a tagline, usage, the commands under\n * headed groups, then flags and examples. A family of commands (`users`,\n * `release`) is one row, and its own help lists the operations. Only\n * {@link showRootHelp} is replaced; per-command and per-topic help\n * (`start --help`, `schemas --help`) stay oclif's own, with a pointer back to\n * the root screen added. Wired in via `oclif.helpClass` in `package.json`.\n */\nexport default class ZitadelHelp extends Help {\n protected override async showRootHelp(): Promise<void> {\n const { bin } = this.config;\n const commands = this.rootCommands();\n const groups = COMMAND_GROUPS.map(\n (group) => [group, this.rowsOf(this.commandsOf(commands, group))] as const,\n ).filter(([, rows]) => rows.length > 0);\n const width = Math.max(0, ...groups.flatMap(([, rows]) => rows.map((row) => row.name.length)));\n const list = (rows: readonly Row[]): string =>\n rows.map((row) => `${row.name.padEnd(width)} ${row.summary}`).join(\"\\n\");\n\n const sections = [\n this.render(this.config.pjson.oclif.description ?? this.config.pjson.description ?? \"\"),\n this.section(\"Usage\", `${bin} <command> [flags]`),\n `Run a command below. Use \\`${bin} <command> --help\\` to see its options.`,\n ...groups.map(([group, rows]) => this.section(group, list(rows))),\n this.section(\n \"Flags\",\n [\"--help Show help for command\", `--version Show ${bin} version`].join(\"\\n\"),\n ),\n this.section(\n \"Examples\",\n [`$ ${bin} setup --framework next`, `$ ${bin} start`, `$ ${bin} doctor`].join(\"\\n\"),\n ),\n ];\n // Only a bare `zitadel`, not `zitadel --help` or an unknown command's help.\n if (process.argv.length <= 2) {\n await showSkillsHint({\n env: process.env,\n interactive: Boolean(process.stdout.isTTY && process.stdin.isTTY),\n });\n }\n this.log(sections.join(\"\\n\\n\"));\n }\n\n override async showCommandHelp(command: Command.Loadable): Promise<void> {\n await super.showCommandHelp(command);\n this.log(exploreAllCommands(this.config.version));\n }\n\n override async showTopicHelp(topic: Interfaces.Topic): Promise<void> {\n await super.showTopicHelp(topic);\n this.log(exploreAllCommands(this.config.version));\n }\n\n /**\n * The commands the root screen lists: every visible command, grouped or\n * not, whatever its depth. Alias entries and `help` itself are left out.\n */\n private rootCommands(): GroupedCommand[] {\n return (this.sortedCommands as GroupedCommand[]).filter(\n (command) => command.id !== \"help\" && !command.aliases?.includes(command.id),\n );\n }\n\n /**\n * The commands a group lists. oclif's own utilities declare no group and are\n * listed with the last one.\n */\n private commandsOf(commands: readonly GroupedCommand[], group: CommandGroup): GroupedCommand[] {\n return commands.filter(\n (command) =>\n command.group === group ||\n (command.group === undefined && group === CommandGroups.diagnostics),\n );\n }\n\n /**\n * The rows of one group. Commands sharing a first word (`users create`,\n * `users get`) are one row named for it, described by the topic when it has\n * a description and otherwise by the command of that name; a command on its\n * own keeps its name. Rows follow `groupOrder` (the lowest of a family's\n * commands), then the name.\n */\n private rowsOf(commands: readonly GroupedCommand[]): Row[] {\n const families = new Map<string, GroupedCommand[]>();\n for (const command of commands) {\n const [family = command.id] = command.id.split(\":\");\n families.set(family, [...(families.get(family) ?? []), command]);\n }\n const rows = [...families].map(([family, members]): Row => {\n const order = Math.min(\n ...members.map((member) => member.groupOrder ?? Number.MAX_SAFE_INTEGER),\n );\n const isFamily = members.some((member) => member.id.includes(\":\"));\n if (!isFamily) {\n const [only] = members;\n return {\n name: toConfiguredId(family, this.config),\n summary: this.oneLineSummary(only?.summary ?? only?.description, only?.id),\n order,\n };\n }\n const topic = this.config.topics.find((candidate) => candidate.name === family);\n const root = members.find((member) => member.id === family) ?? members[0];\n return {\n name: toConfiguredId(family, this.config),\n summary: this.oneLineSummary(topic?.description ?? root?.summary ?? root?.description),\n order,\n };\n });\n return rows.sort((a, b) =>\n compareInGroup({ id: a.name, groupOrder: a.order }, { id: b.name, groupOrder: b.order }),\n );\n }\n\n /**\n * The summary as `gh` prints it: the first clause of the summary or\n * description, with no trailing full stop. Built from the raw statics rather\n * than {@link summary} so a user theme's colour codes cannot end up inside\n * the clause; the theme is applied once the text is final.\n */\n private oneLineSummary(text: string | undefined, id?: string): string {\n const source = (id === undefined ? undefined : PLUGIN_SUMMARIES[id]) ?? text ?? \"\";\n const [clause = \"\"] = this.render(source).split(/[.:]\\s|\\n/, 1);\n return ux.colorize(this.config.theme?.commandSummary, clause.trim().replace(/\\.$/, \"\"));\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"help.mjs","names":[],"sources":["../../../src/lib/oclif/help.ts"],"sourcesContent":["import { type Command, Help, type Interfaces, toConfiguredId, ux } from \"@oclif/core\";\n\nimport { exploreAllCommands } from \"../journey-guidance\";\nimport { showSkillsHint } from \"../skills-hint\";\nimport { COMMAND_GROUPS, type CommandGroup, CommandGroups, compareInGroup } from \"./groups\";\n\n/** A loaded command plus the root-help statics `BaseCommand` (`./base`) declares. */\ntype GroupedCommand = Command.Loadable & { group?: CommandGroup; groupOrder?: number };\n\n/** One line of the root screen: a command, or a family of commands under one name. */\ntype Row = { name: string; summary: string; order: number };\n\n/**\n * Summaries for oclif plugin commands that ship without one. `version` prints\n * a blank line otherwise.\n */\nconst PLUGIN_SUMMARIES: Readonly<Record<string, string>> = {\n version: \"Show the CLI version\",\n};\n\n/**\n * Root help in the style of `gh --help`: a tagline, usage, the commands under\n * headed groups, then flags and examples. A family of commands (`users`,\n * `release`) is one row, and its own help lists the operations. Only\n * {@link showRootHelp} is replaced; per-command and per-topic help\n * (`start --help`, `schemas --help`) stay oclif's own, with a pointer back to\n * the root screen added. Wired in via `oclif.helpClass` in `package.json`.\n */\nexport default class ZitadelHelp extends Help {\n protected override async showRootHelp(): Promise<void> {\n const { bin } = this.config;\n const commands = this.rootCommands();\n const groups = COMMAND_GROUPS.map(\n (group) => [group, this.rowsOf(this.commandsOf(commands, group))] as const,\n ).filter(([, rows]) => rows.length > 0);\n const width = Math.max(0, ...groups.flatMap(([, rows]) => rows.map((row) => row.name.length)));\n const list = (rows: readonly Row[]): string =>\n rows.map((row) => `${row.name.padEnd(width)} ${row.summary}`).join(\"\\n\");\n\n const sections = [\n this.render(this.config.pjson.oclif.description ?? this.config.pjson.description ?? \"\"),\n this.section(\"Usage\", `${bin} <command> [flags]`),\n `Run a command below. Use \\`${bin} <command> --help\\` to see its options.`,\n ...groups.map(([group, rows]) => this.section(group, list(rows))),\n this.section(\n \"Flags\",\n [\"--help Show help for command\", `--version Show ${bin} version`].join(\"\\n\"),\n ),\n this.section(\n \"Examples\",\n [`$ ${bin} setup --framework next`, `$ ${bin} start`, `$ ${bin} doctor`].join(\"\\n\"),\n ),\n ];\n // Only a bare `zitadel`, not `zitadel --help` or an unknown command's help.\n if (process.argv.length <= 2) {\n await showSkillsHint({\n env: process.env,\n interactive: Boolean(process.stdout.isTTY && process.stdin.isTTY),\n cliVersion: this.config.version,\n });\n }\n this.log(sections.join(\"\\n\\n\"));\n }\n\n override async showCommandHelp(command: Command.Loadable): Promise<void> {\n await super.showCommandHelp(command);\n this.log(exploreAllCommands(this.config.version));\n }\n\n override async showTopicHelp(topic: Interfaces.Topic): Promise<void> {\n await super.showTopicHelp(topic);\n this.log(exploreAllCommands(this.config.version));\n }\n\n /**\n * The commands the root screen lists: every visible command, grouped or\n * not, whatever its depth. Alias entries and `help` itself are left out.\n */\n private rootCommands(): GroupedCommand[] {\n return (this.sortedCommands as GroupedCommand[]).filter(\n (command) => command.id !== \"help\" && !command.aliases?.includes(command.id),\n );\n }\n\n /**\n * The commands a group lists. oclif's own utilities declare no group and are\n * listed with the last one.\n */\n private commandsOf(commands: readonly GroupedCommand[], group: CommandGroup): GroupedCommand[] {\n return commands.filter(\n (command) =>\n command.group === group ||\n (command.group === undefined && group === CommandGroups.diagnostics),\n );\n }\n\n /**\n * The rows of one group. Commands sharing a first word (`users create`,\n * `users get`) are one row named for it, described by the topic when it has\n * a description and otherwise by the command of that name; a command on its\n * own keeps its name. Rows follow `groupOrder` (the lowest of a family's\n * commands), then the name.\n */\n private rowsOf(commands: readonly GroupedCommand[]): Row[] {\n const families = new Map<string, GroupedCommand[]>();\n for (const command of commands) {\n const [family = command.id] = command.id.split(\":\");\n families.set(family, [...(families.get(family) ?? []), command]);\n }\n const rows = [...families].map(([family, members]): Row => {\n const order = Math.min(\n ...members.map((member) => member.groupOrder ?? Number.MAX_SAFE_INTEGER),\n );\n const isFamily = members.some((member) => member.id.includes(\":\"));\n if (!isFamily) {\n const [only] = members;\n return {\n name: toConfiguredId(family, this.config),\n summary: this.oneLineSummary(only?.summary ?? only?.description, only?.id),\n order,\n };\n }\n const topic = this.config.topics.find((candidate) => candidate.name === family);\n const root = members.find((member) => member.id === family) ?? members[0];\n return {\n name: toConfiguredId(family, this.config),\n summary: this.oneLineSummary(topic?.description ?? root?.summary ?? root?.description),\n order,\n };\n });\n return rows.sort((a, b) =>\n compareInGroup({ id: a.name, groupOrder: a.order }, { id: b.name, groupOrder: b.order }),\n );\n }\n\n /**\n * The summary as `gh` prints it: the first clause of the summary or\n * description, with no trailing full stop. Built from the raw statics rather\n * than {@link summary} so a user theme's colour codes cannot end up inside\n * the clause; the theme is applied once the text is final.\n */\n private oneLineSummary(text: string | undefined, id?: string): string {\n const source = (id === undefined ? undefined : PLUGIN_SUMMARIES[id]) ?? text ?? \"\";\n const [clause = \"\"] = this.render(source).split(/[.:]\\s|\\n/, 1);\n return ux.colorize(this.config.theme?.commandSummary, clause.trim().replace(/\\.$/, \"\"));\n }\n}\n"],"mappings":";;;;;;;AAgBA,MAAM,mBAAqD,EACzD,SAAS,uBACX;;;;;;;;;AAUA,IAAqB,cAArB,cAAyC,KAAK;CAC5C,MAAyB,eAA8B;EACrD,MAAM,EAAE,QAAQ,KAAK;EACrB,MAAM,WAAW,KAAK,aAAa;EACnC,MAAM,SAAS,eAAe,KAC3B,UAAU,CAAC,OAAO,KAAK,OAAO,KAAK,WAAW,UAAU,KAAK,CAAC,CAAC,CAClE,CAAC,CAAC,QAAQ,GAAG,UAAU,KAAK,SAAS,CAAC;EACtC,MAAM,QAAQ,KAAK,IAAI,GAAG,GAAG,OAAO,SAAS,GAAG,UAAU,KAAK,KAAK,QAAQ,IAAI,KAAK,MAAM,CAAC,CAAC;EAC7F,MAAM,QAAQ,SACZ,KAAK,KAAK,QAAQ,GAAG,IAAI,KAAK,OAAO,KAAK,EAAE,IAAI,IAAI,SAAS,CAAC,CAAC,KAAK,IAAI;EAE1E,MAAM,WAAW;GACf,KAAK,OAAO,KAAK,OAAO,MAAM,MAAM,eAAe,KAAK,OAAO,MAAM,eAAe,EAAE;GACtF,KAAK,QAAQ,SAAS,GAAG,IAAI,mBAAmB;GAChD,8BAA8B,IAAI;GAClC,GAAG,OAAO,KAAK,CAAC,OAAO,UAAU,KAAK,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC;GAChE,KAAK,QACH,SACA,CAAC,qCAAqC,oBAAoB,IAAI,SAAS,CAAC,CAAC,KAAK,IAAI,CACpF;GACA,KAAK,QACH,YACA;IAAC,KAAK,IAAI;IAA0B,KAAK,IAAI;IAAS,KAAK,IAAI;GAAQ,CAAC,CAAC,KAAK,IAAI,CACpF;EACF;EAEA,IAAI,QAAQ,KAAK,UAAU,GACzB,MAAM,eAAe;GACnB,KAAK,QAAQ;GACb,aAAa,QAAQ,QAAQ,OAAO,SAAS,QAAQ,MAAM,KAAK;GAChE,YAAY,KAAK,OAAO;EAC1B,CAAC;EAEH,KAAK,IAAI,SAAS,KAAK,MAAM,CAAC;CAChC;CAEA,MAAe,gBAAgB,SAA0C;EACvE,MAAM,MAAM,gBAAgB,OAAO;EACnC,KAAK,IAAI,mBAAmB,KAAK,OAAO,OAAO,CAAC;CAClD;CAEA,MAAe,cAAc,OAAwC;EACnE,MAAM,MAAM,cAAc,KAAK;EAC/B,KAAK,IAAI,mBAAmB,KAAK,OAAO,OAAO,CAAC;CAClD;;;;;CAMA,eAAyC;EACvC,OAAQ,KAAK,eAAoC,QAC9C,YAAY,QAAQ,OAAO,UAAU,CAAC,QAAQ,SAAS,SAAS,QAAQ,EAAE,CAC7E;CACF;;;;;CAMA,WAAmB,UAAqC,OAAuC;EAC7F,OAAO,SAAS,QACb,YACC,QAAQ,UAAU,SACjB,QAAQ,UAAU,KAAA,KAAa,UAAU,cAAc,WAC5D;CACF;;;;;;;;CASA,OAAe,UAA4C;EACzD,MAAM,2BAAW,IAAI,IAA8B;EACnD,KAAK,MAAM,WAAW,UAAU;GAC9B,MAAM,CAAC,SAAS,QAAQ,MAAM,QAAQ,GAAG,MAAM,GAAG;GAClD,SAAS,IAAI,QAAQ,CAAC,GAAI,SAAS,IAAI,MAAM,KAAK,CAAC,GAAI,OAAO,CAAC;EACjE;EAsBA,OArBa,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,CAAC,QAAQ,aAAkB;GACzD,MAAM,QAAQ,KAAK,IACjB,GAAG,QAAQ,KAAK,WAAW,OAAO,cAAc,OAAO,gBAAgB,CACzE;GAEA,IAAI,CADa,QAAQ,MAAM,WAAW,OAAO,GAAG,SAAS,GAAG,CACpD,GAAG;IACb,MAAM,CAAC,QAAQ;IACf,OAAO;KACL,MAAM,eAAe,QAAQ,KAAK,MAAM;KACxC,SAAS,KAAK,eAAe,MAAM,WAAW,MAAM,aAAa,MAAM,EAAE;KACzE;IACF;GACF;GACA,MAAM,QAAQ,KAAK,OAAO,OAAO,MAAM,cAAc,UAAU,SAAS,MAAM;GAC9E,MAAM,OAAO,QAAQ,MAAM,WAAW,OAAO,OAAO,MAAM,KAAK,QAAQ;GACvE,OAAO;IACL,MAAM,eAAe,QAAQ,KAAK,MAAM;IACxC,SAAS,KAAK,eAAe,OAAO,eAAe,MAAM,WAAW,MAAM,WAAW;IACrF;GACF;EACF,CACU,CAAC,CAAC,MAAM,GAAG,MACnB,eAAe;GAAE,IAAI,EAAE;GAAM,YAAY,EAAE;EAAM,GAAG;GAAE,IAAI,EAAE;GAAM,YAAY,EAAE;EAAM,CAAC,CACzF;CACF;;;;;;;CAQA,eAAuB,MAA0B,IAAqB;EACpE,MAAM,UAAU,OAAO,KAAA,IAAY,KAAA,IAAY,iBAAiB,QAAQ,QAAQ;EAChF,MAAM,CAAC,SAAS,MAAM,KAAK,OAAO,MAAM,CAAC,CAAC,MAAM,aAAa,CAAC;EAC9D,OAAO,GAAG,SAAS,KAAK,OAAO,OAAO,gBAAgB,OAAO,KAAK,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC;CACxF;AACF"}
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: zitadel
3
+ description: >-
4
+ Add, configure, and manage Zitadel authentication in a project. Start here for
5
+ any Zitadel task — it routes to the right skill: the `zitadel` CLI for creating
6
+ projects, scaffolding, config, deploys, and the local server, and the
7
+ per-framework SDK skills for integrating the auth UI into a Next.js, React,
8
+ Angular, Nuxt, Vue, Solid, Svelte, Qwik, SvelteKit, SolidStart, Qwik Router, or
9
+ TanStack Start app. Also use to answer questions
10
+ about Zitadel — its concepts, configuration, CLI, SDKs, or API — from the
11
+ official docs. Use whenever the user mentions Zitadel, adding
12
+ login/registration/sessions, or authentication in their app.
13
+ ---
14
+
15
+ # Zitadel
16
+
17
+ This is the entry point for Zitadel work. The full set of Zitadel skills
18
+ installs together, with `npx @zitadel/cli@latest skills add` in the project
19
+ (the set of that CLI version) or `npx skills add zitadel/nextgen --full-depth`;
20
+ this router then points you at the right one for the task. If a skill named
21
+ below is not actually installed, the set was added without `--full-depth` —
22
+ run the CLI's `skills add` to get the CLI and per-framework skills alongside
23
+ this router.
24
+
25
+ ## Route by what you are doing
26
+
27
+ - **Create a project, scaffold a new app, change config, deploy, or run a local
28
+ Zitadel server** → use **`zitadel-cli`**. It drives the `zitadel` CLI
29
+ (`setup`, `plan`, `apply`, resource commands). It can scaffold a fresh app for
30
+ any framework below and integrate an **existing** app on any of them.
31
+
32
+ - **Integrate the auth UI into an app** → use the SDK skill for that framework:
33
+ - Next.js → **`zitadel-sdk-next`**
34
+ - React (including Vite SPAs and TanStack) → **`zitadel-sdk-react`**
35
+ - Angular → **`zitadel-sdk-angular`**
36
+ - Nuxt → **`zitadel-sdk-nuxt`**
37
+ - Vue → **`zitadel-sdk-vue`**
38
+ - Solid → **`zitadel-sdk-solid`**
39
+ - Svelte → **`zitadel-sdk-svelte`**
40
+ - Qwik → **`zitadel-sdk-qwik`**
41
+ - SvelteKit → **`zitadel-sdk-sveltekit`**
42
+ - SolidStart → **`zitadel-sdk-solid-start`**
43
+ - Qwik Router → **`zitadel-sdk-qwik-router`**
44
+ - TanStack Start → **`zitadel-sdk-tanstack-start`**
45
+
46
+ - **Embed, theme, or drive the `<zitadel-login>` web component directly** → use
47
+ **`zitadel-components`**.
48
+
49
+ ## The rule that spans all of them
50
+
51
+ The CLI can **scaffold** a fresh app for every framework above and **integrate
52
+ (patch) an existing app** on each of them: `setup` detects the framework and
53
+ writes the routes, request boundary or root component, and stops with
54
+ `E_CONFLICT` rather than overwrite a file of the app's. It leaves an app it does
55
+ not support unchanged: a Next.js Pages Router app, a React app without Vite, or
56
+ a framework older than setup supports
57
+ ([Add Zitadel to an existing app](https://preview.zitadel.com/docs/get-started/existing-app.md)
58
+ lists the versions). For those, reach for that framework's SDK skill and add
59
+ auth by hand: install `@zitadel/sdk-<framework>@latest`, configure it, add the
60
+ provider/guard/routes, and drop in the login component.
61
+
62
+ Each skill points you at the package's real README and TypeScript types for exact
63
+ APIs — read those rather than guessing, since they move with the package version.
64
+
65
+ ## Zitadel documentation
66
+
67
+ The Zitadel docs cover what these skills do not: what each concept means and
68
+ how the pieces fit together. Read them to answer a question about Zitadel, to
69
+ understand a term or error before acting on it, or to check a claim you are not
70
+ sure of. Do not answer Zitadel questions from memory or training data; the
71
+ product is in preview and changes quickly.
72
+
73
+ The docs are organised into these sections:
74
+
75
+ | Section | What it covers |
76
+ | ------------- | --------------------------------------------------------------------------- |
77
+ | Get started | The quickstart, an existing app, and driving the CLI as an agent |
78
+ | Guides | Local runtime, `plan`/`apply`, social sign-in, login design and copy |
79
+ | Concepts | Projects, teams, users, config as code, flows, schemas, sessions, databases |
80
+ | SDKs | One page per framework SDK, the SDK proxy, the API client, components |
81
+ | CLI reference | Every `zitadel` command with its flags and examples, by command group |
82
+ | API reference | Every REST endpoint, grouped by resource |
83
+
84
+ ### Finding the right page
85
+
86
+ Look the page up before you fetch it — don't guess URLs. The index lists every
87
+ page's Markdown URL with a one-line description:
88
+
89
+ ```
90
+ https://preview.zitadel.com/docs/llms.txt
91
+ ```
92
+
93
+ Links in the index are relative to the docs site, so prefix them with
94
+ `https://preview.zitadel.com`. Fetch only the pages you need. Do not
95
+ fetch `llms-full.txt`: it is the whole site in one file and costs far more
96
+ context than the one or two pages a question needs.
97
+
98
+ ### Fetching a page as Markdown
99
+
100
+ The index's links are already the Markdown. For a page URL from elsewhere, add
101
+ `.md` to get it as Markdown instead of HTML, for example
102
+ `https://preview.zitadel.com/docs/concepts/databases.md`.
103
+
104
+ ### How far to trust the docs
105
+
106
+ The docs are written for the latest Zitadel release and are a good guide to how
107
+ Zitadel works, but they can lag behind or run ahead of the version the user has
108
+ installed: a flag, option, or field may have been renamed, added, or removed.
109
+ When the docs and the installed package disagree, the installed package wins —
110
+ check its README and TypeScript types, or the CLI's own `--help` output, and
111
+ tell the user when the docs are out of step with what you found.