@zitadel/cli 1.0.0-alpha.23 → 1.0.0-alpha.24

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/SKILLS.md CHANGED
@@ -57,10 +57,10 @@ Each invocation prints one JSON object:
57
57
  see what setup created versus merged into (your `package.json` is an
58
58
  `update`). `data.files_written` remains the flat list — deduplicated file
59
59
  paths only, covering both scaffolded and `.zitadel/` resource files.
60
- - `setup` also emits `data.design`: the starter login design it ejected and
61
- published as branding revision 1, or `null` when the built-in template was
62
- kept (no `.zitadel/branding/` files exist in that case). Use it to verify
63
- the requested `--design` took effect without diffing the repo.
60
+ - `setup` never writes `.zitadel/branding/` or publishes a branding
61
+ revision: the login renders the maintained `<zitadel-login>` component.
62
+ Taking ownership of the widget template is the separate, opt-in
63
+ `branding eject` command.
64
64
  - `E_LOCAL_SERVER_NOT_RUNNING`: start the local runtime with
65
65
  `npx @zitadel/cli@alpha start`, then retry with `--server local`.
66
66
  - `E_NOT_FOUND`: an HTTP 404 from the target server. With the platform's
@@ -151,7 +151,7 @@ over reading `--help` per command. It contacts no server.
151
151
  out field by field on a terminal and prints the whole object when piped;
152
152
  `--json` is unchanged either way.
153
153
  - `create` / `update <id>` take the body either as one flag per schema field
154
- (`--name`, `--principal-type`, …; run `<resource> create --help` for the
154
+ (`--name`, `--relation`, …; run `<resource> create --help` for the
155
155
  list, where required fields are marked `(required)`) or as a whole JSON
156
156
  object via `--data '<json>'` / `--file <path>` (`--file -` reads stdin). A
157
157
  field flag overrides the same key in `--data`. A user's schema-defined
@@ -189,7 +189,18 @@ The groups below mirror the ones `zitadel --help` prints.
189
189
  default user schema and login flow into
190
190
  `.zitadel/schemas/default-human-user.json` and
191
191
  `.zitadel/flows/default-login.json`, uploads them through the schema and flow
192
- APIs, then seeds `.zitadel/state.json` so `plan` is immediately empty. Agents
192
+ APIs, then seeds `.zitadel/state.json` so `plan` is immediately empty.
193
+ Against a local server that hosts the platform project and has a local admin
194
+ (the default `start` configuration), setup also attaches the project to the
195
+ local admin's team: it writes `team_id` and `claimed_at` into
196
+ `.zitadel/secret` and prints
197
+ `Project owned by admin@zitadel.localhost (team ...)`, so a later `claim`
198
+ returns `status: "skipped"` with `reason: "already-claimed"`. The step is
199
+ best-effort. When the attempt fails on a platform-hosting runtime, setup
200
+ warns and the normal claim nudge applies. When `start` opted out of the
201
+ platform bootstrap there is no local admin and no claim surface, so setup
202
+ skips the step silently, emits no nudge, and the project has no owning
203
+ team. Agents
193
204
  must pass `--framework` when scaffolding into a fresh directory; interactive
194
205
  humans can omit it and choose from the prompt. Supported floors: Next.js 15+
195
206
  and React 18+ — `setup` and `doctor` fail with `E_UNSUPPORTED_PROJECT_SHAPE`
@@ -217,12 +228,9 @@ The groups below mirror the ones `zitadel --help` prints.
217
228
  email only; `consumer` adds given and family name; `business` also adds a
218
229
  `companyName` attribute and overlays work-email copy on the generated auth
219
230
  pages via the SDK's `businessLocales`; asked before `--preset` and recorded
220
- in `zitadel.json`), `--design centered|split|split-right|hero|minimal`
221
- (starter login design: ejects the design's template into
222
- `.zitadel/branding/` and publishes it as branding revision 1 during setup;
223
- the interactive wizard asks this as its final question with the built-in
224
- template preselected — omit the flag in non-interactive runs to keep the
225
- built-in template and no branding files), `--skip-install`.
231
+ in `zitadel.json`), `--skip-install`. Setup does not ask about or apply a
232
+ login design: it writes no `.zitadel/branding/` files and publishes no
233
+ branding revision (`branding eject` is the opt-in for that).
226
234
  On Next and Nuxt, the scaffolded auth/profile pages derive their embedding
227
235
  posture from the app: a fresh scaffold (setup created the skeleton) pins
228
236
  `variant="page"` full-page chrome, while a pre-existing app embeds
@@ -241,11 +249,8 @@ The groups below mirror the ones `zitadel --help` prints.
241
249
  link color `--zl-link`); the `suppress-header` attribute
242
250
  (wrapper prop `suppressHeader`) visually hides the widget's own heading
243
251
  block when the page already carries one, keeping it in the accessibility
244
- tree. Split-family designs collapse their brand pane by container width —
245
- at card width they show the compact brand mark (`logo_url`, else
246
- `hero_url`, from `.zitadel/branding/branding.json`; `hero` falls back to
247
- editable text), and setup warns when a widget-posture app picks `split`
248
- or `split-right`.
252
+ tree. Page layout around the widget (split screens, hero panes) is the
253
+ app's own code, not a Zitadel template.
249
254
  - `claim` — claim the project for a team to make it permanent. Mints a
250
255
  short-lived link, opens it in a browser, and blocks until the developer
251
256
  finishes signing in there, then records `claimed_at` and `team_id` in
@@ -399,38 +404,41 @@ docker --image <ref>` remains the explicit image override for debugging.
399
404
  `liquid_template`) renders as `(<n> lines, sha256:…)` when it is created or
400
405
  unchanged, and as a changed-line diff when it moved — not as one escaped
401
406
  line. Read the file itself for full content.
407
+ - No command takes `--environment` (`-e`, `--env`). `plan`, `apply` and the
408
+ resource commands work on the project's resources and never selected an
409
+ environment; `variables` names its owner with `--project-level`. The flag
410
+ returns when the platform's environments settle, and `deploy` (ADR 035) is
411
+ what will put config onto one.
402
412
  - `schemas list` — inspect the revision history of a user-schema, filtered by
403
413
  `--object-type` (e.g. `human-user`). Non-interactive/`--json` prints one row
404
414
  per revision (newest first); interactive adds a picker that fetches and
405
415
  pretty-prints the selected revision body.
406
416
  - `branding eject` — take ownership of the login template: scaffold
407
417
  `.zitadel/branding/` (a `branding.json` descriptor plus the `login.liquid`
408
- template) from a shipped design, `--design centered|split|split-right|hero|minimal`
409
- or an interactive picker on a TTY. `plan`/`apply` then publish every edit as
418
+ template) from a shipped design, `--design centered|minimal` (the default card, or
419
+ the same form without card chrome) or an interactive picker on a TTY. `plan`/`apply` then publish every edit as
410
420
  a new branding revision.
411
- - `variables list|get|set|delete` — manage the per-environment variables and
412
- secrets a configuration document references as `${{ NAME }}`. Every command
413
- addresses one owner: `--environment <name>` (`-e`, alias `--env`) names an
414
- environment, and `--project-level` names the project level. Owners do not
415
- inherit from one another — a value set at the project level is **not** seen
416
- by any environment — so a value a running environment needs must be set on
417
- that environment, and one needed on several must be set on each. Because of
418
- that, the owner is never defaulted: with neither flag a person is asked and a
419
- non-interactive run fails with `E_VALIDATION` naming the project's
420
- environments, as ADR 035 specifies for `deploy`. `set` takes its value from a
421
- prompt or from stdin and never from a flag, so a credential never reaches
422
- `argv`; `--secret` stores it encrypted, after which it can be replaced but
423
- never read back (`list` reports it as held, and `--json` omits the value key
424
- entirely). `set --as number|boolean` stores a JSON number or boolean
425
- instead of a string, so a whole-field `${{ NAME }}` reference resolves to that
426
- type; it is refused with `--secret`, and an integer too large to store exactly
427
- is refused rather than rounded. Output follows the resource commands: on a
428
- pipe, `list` prints tab-separated `name`/`value` rows (a secret's value is
429
- `(secret)`) and `get` prints the whole record as JSON, which carries no
430
- `value` key for a secret. There is no `pull` and no bulk import. `set` and
431
- `delete` honour `--dry-run` and make no change (with no owner flag, a person is still asked,
432
- which reads the project's environments); `delete` needs `--force` when
433
- non-interactive.
421
+ - `variables list|get|set|delete` — manage the variables and secrets a
422
+ configuration document references as `${{ NAME }}`. Every command addresses
423
+ one owner, and `--project-level` is the only one the CLI can name today, so it
424
+ is **required**: a run without it fails with `E_VALIDATION`, on a terminal as
425
+ in a script. The platform also keeps variables per environment, but the CLI
426
+ cannot address those until the platform's environments settle; `--environment`
427
+ returns then, and every command written today keeps its meaning because the
428
+ owner was named rather than assumed. Owners do not inherit from one another —
429
+ a value entered at the project level is **not** seen by an environment
430
+ (ADR 062 §4). `set` takes its value from a prompt or from stdin and never from
431
+ a flag, so a credential never reaches `argv`; `--secret` stores it encrypted,
432
+ after which it can be replaced but never read back (`list` reports it as held,
433
+ and `--json` omits the value key entirely). `set --as number|boolean` stores a
434
+ JSON number or boolean instead of a string, so a whole-field `${{ NAME }}`
435
+ reference resolves to that type; it is refused with `--secret`, and an integer
436
+ too large to store exactly is refused rather than rounded. Output follows the
437
+ resource commands: on a pipe, `list` prints tab-separated `name`/`value` rows
438
+ (a secret's value is `(secret)`) and `get` prints the whole record as JSON,
439
+ which carries no `value` key for a secret. There is no `pull` and no bulk
440
+ import. `set` and `delete` honour `--dry-run` and make no change; `delete`
441
+ needs `--force` when non-interactive.
434
442
 
435
443
  ## Golden path
436
444
 
@@ -501,9 +509,8 @@ then re-run `plan` and `apply`. Schema and flow files are synced from
501
509
  (branding) are synced from `.zitadel/branding/`: a single `branding.json`
502
510
  descriptor (layout, asset URLs) plus a sibling `login.liquid` LiquidJS
503
511
  template referenced as `"liquid_template": { "$file": "./login.liquid" }`. Scaffold them with the
504
- `branding eject` command (`--design centered|split|split-right|hero|minimal`,
505
- interactive picker on a TTY) or at project creation with
506
- `setup --design <name>`, which also publishes revision 1. Branding is
512
+ `branding eject` command (`--design centered|minimal`,
513
+ interactive picker on a TTY); setup never scaffolds them. Branding is
507
514
  revisioned and immutable: every edit — including a `.liquid`-only edit —
508
515
  plans as a `revise` and `apply` publishes a new revision; the login serves
509
516
  the newest one. `plan` validates templates with the authoritative LiquidJS