@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.
- package/README.md +39 -0
- package/dist/index.mjs +1450 -1047
- package/dist/index.mjs.map +1 -1
- package/dist/lib/oclif/help.mjs +3 -2
- package/dist/lib/oclif/help.mjs.map +1 -1
- package/dist/skills/zitadel/SKILL.md +111 -0
- package/dist/skills/zitadel-cli/SKILL.md +635 -0
- package/dist/skills/zitadel-cli/references/driving-login-ui.md +124 -0
- package/dist/skills/zitadel-components/SKILL.md +152 -0
- package/dist/skills/zitadel-sdk-angular/SKILL.md +149 -0
- package/dist/skills/zitadel-sdk-next/SKILL.md +174 -0
- package/dist/skills/zitadel-sdk-nuxt/SKILL.md +149 -0
- package/dist/skills/zitadel-sdk-qwik/SKILL.md +136 -0
- package/dist/skills/zitadel-sdk-qwik-router/SKILL.md +126 -0
- package/dist/skills/zitadel-sdk-react/SKILL.md +149 -0
- package/dist/skills/zitadel-sdk-solid/SKILL.md +144 -0
- package/dist/skills/zitadel-sdk-solid-start/SKILL.md +149 -0
- package/dist/skills/zitadel-sdk-svelte/SKILL.md +137 -0
- package/dist/skills/zitadel-sdk-sveltekit/SKILL.md +147 -0
- package/dist/skills/zitadel-sdk-tanstack-start/SKILL.md +150 -0
- package/dist/skills/zitadel-sdk-vue/SKILL.md +147 -0
- package/dist/{skills-hint-N1H5-ny1.mjs → skills-hint-C8oe8cCo.mjs} +1446 -231
- package/dist/skills-hint-C8oe8cCo.mjs.map +1 -0
- package/oclif.manifest.json +102 -3
- package/package.json +8 -5
- package/skills/zitadel-cli/SKILL.md +62 -9
- package/dist/skills-hint-N1H5-ny1.mjs.map +0 -1
package/dist/lib/oclif/help.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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":";;;;;;;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;
|
|
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":"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"}
|
|
@@ -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.
|