feat: scaffold editable schema and flow config - #341
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
1 Skipped Deployment
|
🦋 Changeset detectedLatest commit: fd4c8aa The changes in this PR will be included in the next version bump. This PR includes changesets to release 19 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
There was a problem hiding this comment.
Pull request overview
This PR introduces a new versioned @zitadel/config package to centralize editable local config defaults and schemas, then updates the CLI + server/API to support a “local-first” setup flow where schema/flow files are scaffolded locally, uploaded via APIs, and recorded into sync state while keeping server fallback defaults available for non-CLI project creation.
Changes:
- Add new public package
@zitadel/configwith shared default schema/flow documents and Zod schemas. - Add
seedDefaultsto project creation to allow CLI-created projects to opt out of server fallback defaults. - Update CLI setup + sync + api-mock to scaffold/upload defaults, fix
project_idusage for flows, and seed.zitadel/state.jsonsoplanis immediately idempotent.
Reviewed changes
Copilot reviewed 54 out of 58 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| scripts/release-artifacts.mjs | Include packages/config in public release artifacts. |
| scripts/check-changesets-status.mjs | Treat @zitadel/config as a public package for changeset enforcement. |
| pnpm-lock.yaml | Wire workspace dependency graph for new packages/config. |
| packages/config/tsdown.config.ts | Add tsdown build config for @zitadel/config. |
| packages/config/tsconfig.spec.json | Add config package test TS config. |
| packages/config/tsconfig.lib.json | Add config package library TS config (incl. JSON). |
| packages/config/tsconfig.json | Add project references for config package. |
| packages/config/src/schemas.ts | Export Zod schemas derived from @zitadel/api Zod types. |
| packages/config/src/index.ts | Barrel exports for defaults + schemas. |
| packages/config/src/defaults.ts | Provide default schema/flow templates and rendering helpers. |
| packages/config/package.json | Define new public package metadata/exports. |
| packages/config/moon.yml | Add Moon tasks for config package build/typecheck/test. |
| packages/config/LICENSE | Add MIT license file for the new public package. |
| packages/config/defaults/defaults.go | Embed default JSON documents for Go server fallback usage. |
| packages/config/defaults/default-login.json | Add versioned default login flow JSON template. |
| packages/config/defaults/default-human-user.json | Add versioned default user schema JSON template. |
| packages/api-mock/src/spec-conformance.spec.ts | Update conformance tests for seedDefaults + project_id flow queries. |
| packages/api-mock/src/platform-handlers.ts | Seed/serve default resources, enforce project_id on flow operations, and use config defaults. |
| packages/api-mock/package.json | Add dependency on @zitadel/config. |
| packages/api-mock/moon.yml | Add Moon dependency/build ordering on config. |
| internal/service/project.go | Add optional seeding control for fallback defaults on project creation. |
| internal/service/project_test.go | Add test coverage for skipping fallback defaults. |
| internal/api/project.go | Thread seedDefaults from API request to service. |
| internal/api/integration_test/project_test.go | Add integration coverage for skipping default provisioning via API. |
| apps/cli/tests/unit/scripts/verify-tarballs.test.ts | Expect config tarball in release verification. |
| apps/cli/tests/unit/scripts/local-registry.test.ts | Ensure local registry build list includes @zitadel/config. |
| apps/cli/tests/unit/scripts/check-changesets-status.test.ts | Ensure changesets fixed-group includes @zitadel/config. |
| apps/cli/tests/unit/lib/sync/syncers.test.ts | Update syncer tests for flow schema_uri + project_id + update-not-implemented. |
| apps/cli/tests/unit/lib/orca/patchers/rule/next/index.test.ts | Align expectations: patchers don’t write schema/flow; setup materializer does. |
| apps/cli/tests/integration/setup-next.test.ts | Validate setup scaffolds/uploads schema+flow and seeds .zitadel/state.json. |
| apps/cli/tests/integration/flow-schema.test.ts | Update comment/context to match new default scaffolding behavior. |
| apps/cli/src/lib/sync/types.ts | Extend sync state entries with flow metadata (name, status). |
| apps/cli/src/lib/sync/syncers.ts | Validate via config Zod schemas; enforce flow project_id; block flow updates locally. |
| apps/cli/src/lib/sync/loop.ts | Export hashing helper for consistent state seeding. |
| apps/cli/src/lib/sync/index.ts | Re-export hashResourceContent. |
| apps/cli/src/lib/setup-resources.ts | New helper to scaffold/upload defaults and seed sync state during setup. |
| apps/cli/src/lib/orca/patchers/types.ts | Update patcher context docs for new resource materialization step. |
| apps/cli/src/lib/orca/patchers/rule/base.ts | Clarify .zitadel/{schemas,flows} are created empty then filled later. |
| apps/cli/src/commands/setup/index.ts | Create project with seedDefaults:false, materialize/upload defaults, and report written files. |
| apps/cli/src/commands/doctor/patch-context.ts | Update docstrings for local editable sync resources. |
| apps/cli/src/commands/doctor/checks/schema.ts | Re-enable schema check to validate local .zitadel/schemas/*.json. |
| apps/cli/src/commands/doctor/checks/index.ts | Re-enable SchemaCheck in doctor. |
| apps/cli/SKILLS.md | Update agent-facing CLI contract docs for editable schema/flow scaffolding. |
| apps/cli/README.md | Update CLI README for local-first schema/flow scaffolding and sync behavior. |
| apps/cli/package.json | Add dependency on @zitadel/config. |
| apps/cli/moon.yml | Add Moon dependency/build ordering on config. |
| apps/cli-journey-e2e/scripts/verify-tarballs.mjs | Require config tarball for journey verification. |
| apps/cli-journey-e2e/scripts/local-registry.mjs | Publish config tarball to Verdaccio for journeys. |
| api/openapi/endpoints/schemas/embed.go | Switch server builtin schema template source to packages/config/defaults. |
| api/openapi/endpoints/projects/create-project-request.yaml | Add seedDefaults request field with default true. |
| api/openapi/endpoints/flow_definitions/embed.go | Switch builtin flow template source + wrap create envelope including schema_uri/project_id. |
| api/generated/oas_schemas_gen.go | Regenerated schema: add SeedDefaults to CreateProjectRequest. |
| api/generated/oas_json_gen.go | Regenerated JSON codec: encode/decode seedDefaults + default handling hook. |
| api/generated/oas_defaults_gen.go | Regenerated defaults: set SeedDefaults default to true. |
| .moon/workspace.yml | Register packages/config as a Moon project. |
| .changeset/scaffold-editable-schema-flow-config.md | Add changeset covering CLI/API/server + new config package. |
| .changeset/README.md | Document packages/config as publishable path. |
| .changeset/config.json | Add @zitadel/config into the fixed version group. |
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
…le-schema-flow-config
…le-schema-flow-config # Conflicts: # .changeset/README.md # apps/cli/src/commands/setup/index.ts # internal/api/integration_test/flow_definition_test.go # packages/api-mock/src/platform-handlers.ts # packages/api-mock/src/spec-conformance.spec.ts
Review follow-ups on the editable-config work: - setup: when default resource seeding fails after the patcher already wrote zitadel.json, remove the marker and .zitadel/secret again and surface an actionable error. Previously every rerun reported 'skipped' and the project was stranded with no login flow anywhere (server seeded nothing because seedDefaults=false). - doctor: an empty .zitadel/schemas/ is now a warning, not a failure — projects created before editable config have no local schema files and there is no safe auto-fix; doctor would have failed permanently for every pre-existing project after a CLI upgrade. - validation: doctor and the flows batch validator now use the canonical schemas from @zitadel/config/schemas (same Zod the sync engine uses), and the flow syncer no longer parses every file twice. - moon: replace the per-dist cli mutexes (made redundant by #464's build < test < build-release dep chain) with one shared public-dist mutex on cli:test and api/config/sdk-next:build-release. The built oclif commands import those packages' dists at runtime; their release builds cannot take a task dep on cli:test (cli dependsOn them — the reverse edge cycles the project graph), so the mutex is what keeps a release clean step from wiping a dist mid-test.
|
Post-merge review sweep (after #458 and #464 landed on this branch) — pushed
Known follow-ups deliberately left out of this PR: the same dist-contention pattern exists for the remaining sdk packages' release builds vs their consumers (a systemic fix — e.g. a separate release out-dir — deserves its own PR), and the scaffolded schema's |
demo-next:typecheck failed on this branch because sdk-next:build-release was rewriting packages/sdk-next/dist while the typecheck resolved declarations from it — the same shared-dist race previously patched per-leg with mutexes and a cli test dep, now biting a third consumer. Root cause: release:build-public-packages (and clean-public-package-dist, which deletes every public dist) had runInCI: true, pulling all 14 build-release tasks into the same `moon ci` invocation as the build/test graph. There they race any consumer of a package dist, and per-leg fixes cannot scale: a dist has many readers, a task can hold only one mutex, and writer->reader task deps invert dependsOn edges (project-graph cycles). Set runInCI: false across the release chain instead. `moon ci` no longer schedules any release build; the release:snapshot / journey / pack steps in ci.yml and the release-publish workflow invoke them explicitly via `moon run` (with CI unset), strictly after the build/test step, so coverage is unchanged and the race class is gone. The public-dist / sdk-nuxt-dist mutexes stay as insurance for explicit parallel local runs.
|
Context: the previous run failed with |
release:snapshot failed twice with ENOTEMPTY: clean-public-package-dist bulk-deletes every public package's dist/ while the same moon invocation concurrently runs or cache-hydrates dev builds of those packages (console:build pulls api:build; cli:build-release's test dep pulls the whole cli chain). runDepsInParallel: false on build-public-packages only orders its direct dep targets, not their subtrees, so the clean had no edge to the dev builds writing the same directories. Give the clean explicit deps on every public package's dev build (and on cli:test, which drives the built CLI from apps/cli/dist). All of them are cache hits by the time the release chain runs, and the release builds still rewrite every dist afterwards in the serialized chain. The pre-clean itself stays: api, components (tsdown clean disabled for tsgo-emitted d.ts), and sdk-core (plain tsc) do not clean their own dist, so removing it would let stale files into release tarballs.
…and docs - @zitadel/api: the published ./generated/endpoints/zitadelNextGen.zod export imports zod at runtime, but zod lived in devDependencies, so a fresh consumer of @zitadel/config/schemas (or the zod export directly) could fail with ERR_MODULE_NOT_FOUND. Move zod to dependencies. Declare msw and @faker-js/faker as optional peerDependencies for the same reason (the published .msw export imports both); only consumers of the mock module need them. Verified via pnpm pack that catalog: versions materialize in the published manifest. - schemas list: URL-encode the picked revision id before GET /schemas/:id (ids can be URLs when a schema carried $id — the server-seeded defaults do), mirroring the sync engine's encoding. Extracted the fetch into fetchSchemaRevision and covered it with a URL-shaped-id test; dropped the stray blank line at EOF. - docs: regenerate the README oclif command list (picks up zitadel schemas list) and add the command to the SKILLS.md contract.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 95 out of 99 changed files in this pull request and generated 2 comments.
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
Comments suppressed due to low confidence (1)
packages/api-mock/src/platform-handlers.ts:438
DELETE /schemas/:idvalidates theproject_idquery param but does not enforce it when deleting. This allows deleting a schema by id while supplying a differentproject_id, which breaks project scoping and is inconsistent with the flow-definition delete handler.
Copilot review follow-ups: - GET/DELETE /schemas/:id now enforce project ownership like the real repository (rows are looked up by (project_id, id)); a schema from another project reads as 404 instead of leaking across projects. - POST /schemas keeps storing the raw uploaded document rather than the zod-parsed value: the real server persists the schema bytes verbatim, and the request zod demonstrably strips legitimate JSON Schema content (title, custom x-* extensions) and injects defaults. A new conformance test pins the raw round-trip so this stays deliberate.
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and publish to npm yourself or [setup this action to publish automatically](https://github.com/changesets/action#with-publishing). If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ `main` is currently in **pre mode** so this branch has prereleases rather than normal releases. If you want to exit prereleases, run `changeset pre exit` on `main`.⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ # Releases ## @zitadel/cli@0.1.0-alpha.14 ### Minor Changes - [#341](#341) [`605abe1`](605abe1) Thanks [@fforootd](https://github.com/fforootd)! - Scaffold editable schema and flow config from shared local defaults, add project default seeding control, and seed sync state so plan is idempotent immediately after setup. - [#443](#443) [`ea193dc`](ea193dc) Thanks [@bastionstack](https://github.com/bastionstack)! - Add a post-sign-in `<zitadel-session>` "signed in as" card: a dedicated element exposed through every SPA SDK and re-exported from sdk-next. CLI scaffolds now render it as the post-sign-in `/profile` page (with a Logout action) across all frameworks. Identity is read from `GET /sessions/me`, preferring `name` then `email` then `user_id`. `<zitadel-logout>` now sources its identity from the same `getMySession` operation instead of the `__nextgen_display` cookie, so both signed-in surfaces work against the real backend. Both components route their `getMySession`/`revokeMySession` calls through the shared `api-client` wrappers that enforce `credentials: "include"`. ### Patch Changes - [#469](#469) [`f55a293`](f55a293) Thanks [@fforootd](https://github.com/fforootd)! - Route published CLI telemetry to the production Mixpanel project during npm publish. - [#436](#436) [`13ef6b6`](13ef6b6) Thanks [@fforootd](https://github.com/fforootd)! - Map CLI telemetry events to Mixpanel's event country property so country appears correctly in analytics. - [#474](#474) [`ec0a33c`](ec0a33c) Thanks [@fforootd](https://github.com/fforootd)! - Verify public npm provenance after repository publication. - Updated dependencies [[`eedc8fe`](eedc8fe), [`ddc0c13`](ddc0c13), [`54dcc87`](54dcc87), [`605abe1`](605abe1)]: - @zitadel/server@0.1.0-alpha.14 - @zitadel/api@0.1.0-alpha.14 - @zitadel/config@0.1.0-alpha.14 ## @zitadel/server@0.1.0-alpha.14 ### Minor Changes - [#341](#341) [`605abe1`](605abe1) Thanks [@fforootd](https://github.com/fforootd)! - Scaffold editable schema and flow config from shared local defaults, add project default seeding control, and seed sync state so plan is idempotent immediately after setup. ### Patch Changes - [#456](#456) [`eedc8fe`](eedc8fe) Thanks [@wim07101993](https://github.com/wim07101993)! - Add schema correlation via `objectType`: schemas now persist this field, and `GET /schemas` can filter by `objectType`. - [#434](#434) [`ddc0c13`](ddc0c13) Thanks [@vitorbari](https://github.com/vitorbari)! - Fix passkey signup silently dropping every collected user attribute except the identifier. The passkey-register now routes user creation through `UserService`. - [#453](#453) [`54dcc87`](54dcc87) Thanks [@vitorbari](https://github.com/vitorbari)! - Add back navigation to interactive flows. The engine injects a `back` action on rendered step responses when there's a step to return to, and clears the back stack past irreversible mutations (user creation, passkey registration) and at flow termination. ## @zitadel/api@0.1.0-alpha.14 ### Minor Changes - [#341](#341) [`605abe1`](605abe1) Thanks [@fforootd](https://github.com/fforootd)! - Scaffold editable schema and flow config from shared local defaults, add project default seeding control, and seed sync state so plan is idempotent immediately after setup. ## @zitadel/components@0.1.0-alpha.14 ### Minor Changes - [#443](#443) [`ea193dc`](ea193dc) Thanks [@bastionstack](https://github.com/bastionstack)! - Add a post-sign-in `<zitadel-session>` "signed in as" card: a dedicated element exposed through every SPA SDK and re-exported from sdk-next. CLI scaffolds now render it as the post-sign-in `/profile` page (with a Logout action) across all frameworks. Identity is read from `GET /sessions/me`, preferring `name` then `email` then `user_id`. `<zitadel-logout>` now sources its identity from the same `getMySession` operation instead of the `__nextgen_display` cookie, so both signed-in surfaces work against the real backend. Both components route their `getMySession`/`revokeMySession` calls through the shared `api-client` wrappers that enforce `credentials: "include"`. ### Patch Changes - [#453](#453) [`54dcc87`](54dcc87) Thanks [@vitorbari](https://github.com/vitorbari)! - Add back navigation to interactive flows. The engine injects a `back` action on rendered step responses when there's a step to return to, and clears the back stack past irreversible mutations (user creation, passkey registration) and at flow termination. ## @zitadel/config@0.1.0-alpha.14 ### Minor Changes - [#341](#341) [`605abe1`](605abe1) Thanks [@fforootd](https://github.com/fforootd)! - Scaffold editable schema and flow config from shared local defaults, add project default seeding control, and seed sync state so plan is idempotent immediately after setup. ### Patch Changes - Updated dependencies [[`605abe1`](605abe1)]: - @zitadel/api@0.1.0-alpha.14 ## @zitadel/sdk-angular@0.1.0-alpha.14 ### Minor Changes - [#443](#443) [`ea193dc`](ea193dc) Thanks [@bastionstack](https://github.com/bastionstack)! - Add a post-sign-in `<zitadel-session>` "signed in as" card: a dedicated element exposed through every SPA SDK and re-exported from sdk-next. CLI scaffolds now render it as the post-sign-in `/profile` page (with a Logout action) across all frameworks. Identity is read from `GET /sessions/me`, preferring `name` then `email` then `user_id`. `<zitadel-logout>` now sources its identity from the same `getMySession` operation instead of the `__nextgen_display` cookie, so both signed-in surfaces work against the real backend. Both components route their `getMySession`/`revokeMySession` calls through the shared `api-client` wrappers that enforce `credentials: "include"`. ### Patch Changes - Updated dependencies [[`54dcc87`](54dcc87), [`605abe1`](605abe1), [`ea193dc`](ea193dc)]: - @zitadel/components@0.1.0-alpha.14 - @zitadel/api@0.1.0-alpha.14 - @zitadel/sdk-core@0.1.0-alpha.14 ## @zitadel/sdk-core@0.1.0-alpha.14 ### Minor Changes - [#443](#443) [`ea193dc`](ea193dc) Thanks [@bastionstack](https://github.com/bastionstack)! - Add a post-sign-in `<zitadel-session>` "signed in as" card: a dedicated element exposed through every SPA SDK and re-exported from sdk-next. CLI scaffolds now render it as the post-sign-in `/profile` page (with a Logout action) across all frameworks. Identity is read from `GET /sessions/me`, preferring `name` then `email` then `user_id`. `<zitadel-logout>` now sources its identity from the same `getMySession` operation instead of the `__nextgen_display` cookie, so both signed-in surfaces work against the real backend. Both components route their `getMySession`/`revokeMySession` calls through the shared `api-client` wrappers that enforce `credentials: "include"`. ### Patch Changes - Updated dependencies [[`605abe1`](605abe1)]: - @zitadel/api@0.1.0-alpha.14 ## @zitadel/sdk-next@0.1.0-alpha.14 ### Minor Changes - [#443](#443) [`ea193dc`](ea193dc) Thanks [@bastionstack](https://github.com/bastionstack)! - Add a post-sign-in `<zitadel-session>` "signed in as" card: a dedicated element exposed through every SPA SDK and re-exported from sdk-next. CLI scaffolds now render it as the post-sign-in `/profile` page (with a Logout action) across all frameworks. Identity is read from `GET /sessions/me`, preferring `name` then `email` then `user_id`. `<zitadel-logout>` now sources its identity from the same `getMySession` operation instead of the `__nextgen_display` cookie, so both signed-in surfaces work against the real backend. Both components route their `getMySession`/`revokeMySession` calls through the shared `api-client` wrappers that enforce `credentials: "include"`. ### Patch Changes - Updated dependencies [[`54dcc87`](54dcc87), [`605abe1`](605abe1), [`ea193dc`](ea193dc)]: - @zitadel/components@0.1.0-alpha.14 - @zitadel/api@0.1.0-alpha.14 - @zitadel/sdk-core@0.1.0-alpha.14 ## @zitadel/sdk-qwik@0.1.0-alpha.14 ### Minor Changes - [#443](#443) [`ea193dc`](ea193dc) Thanks [@bastionstack](https://github.com/bastionstack)! - Add a post-sign-in `<zitadel-session>` "signed in as" card: a dedicated element exposed through every SPA SDK and re-exported from sdk-next. CLI scaffolds now render it as the post-sign-in `/profile` page (with a Logout action) across all frameworks. Identity is read from `GET /sessions/me`, preferring `name` then `email` then `user_id`. `<zitadel-logout>` now sources its identity from the same `getMySession` operation instead of the `__nextgen_display` cookie, so both signed-in surfaces work against the real backend. Both components route their `getMySession`/`revokeMySession` calls through the shared `api-client` wrappers that enforce `credentials: "include"`. ### Patch Changes - Updated dependencies [[`54dcc87`](54dcc87), [`605abe1`](605abe1), [`ea193dc`](ea193dc)]: - @zitadel/components@0.1.0-alpha.14 - @zitadel/api@0.1.0-alpha.14 - @zitadel/sdk-core@0.1.0-alpha.14 ## @zitadel/sdk-react@0.1.0-alpha.14 ### Minor Changes - [#443](#443) [`ea193dc`](ea193dc) Thanks [@bastionstack](https://github.com/bastionstack)! - Add a post-sign-in `<zitadel-session>` "signed in as" card: a dedicated element exposed through every SPA SDK and re-exported from sdk-next. CLI scaffolds now render it as the post-sign-in `/profile` page (with a Logout action) across all frameworks. Identity is read from `GET /sessions/me`, preferring `name` then `email` then `user_id`. `<zitadel-logout>` now sources its identity from the same `getMySession` operation instead of the `__nextgen_display` cookie, so both signed-in surfaces work against the real backend. Both components route their `getMySession`/`revokeMySession` calls through the shared `api-client` wrappers that enforce `credentials: "include"`. ### Patch Changes - Updated dependencies [[`54dcc87`](54dcc87), [`605abe1`](605abe1), [`ea193dc`](ea193dc)]: - @zitadel/components@0.1.0-alpha.14 - @zitadel/api@0.1.0-alpha.14 - @zitadel/sdk-core@0.1.0-alpha.14 ## @zitadel/sdk-solid@0.1.0-alpha.14 ### Minor Changes - [#443](#443) [`ea193dc`](ea193dc) Thanks [@bastionstack](https://github.com/bastionstack)! - Add a post-sign-in `<zitadel-session>` "signed in as" card: a dedicated element exposed through every SPA SDK and re-exported from sdk-next. CLI scaffolds now render it as the post-sign-in `/profile` page (with a Logout action) across all frameworks. Identity is read from `GET /sessions/me`, preferring `name` then `email` then `user_id`. `<zitadel-logout>` now sources its identity from the same `getMySession` operation instead of the `__nextgen_display` cookie, so both signed-in surfaces work against the real backend. Both components route their `getMySession`/`revokeMySession` calls through the shared `api-client` wrappers that enforce `credentials: "include"`. ### Patch Changes - Updated dependencies [[`54dcc87`](54dcc87), [`605abe1`](605abe1), [`ea193dc`](ea193dc)]: - @zitadel/components@0.1.0-alpha.14 - @zitadel/api@0.1.0-alpha.14 - @zitadel/sdk-core@0.1.0-alpha.14 ## @zitadel/sdk-svelte@0.1.0-alpha.14 ### Minor Changes - [#443](#443) [`ea193dc`](ea193dc) Thanks [@bastionstack](https://github.com/bastionstack)! - Add a post-sign-in `<zitadel-session>` "signed in as" card: a dedicated element exposed through every SPA SDK and re-exported from sdk-next. CLI scaffolds now render it as the post-sign-in `/profile` page (with a Logout action) across all frameworks. Identity is read from `GET /sessions/me`, preferring `name` then `email` then `user_id`. `<zitadel-logout>` now sources its identity from the same `getMySession` operation instead of the `__nextgen_display` cookie, so both signed-in surfaces work against the real backend. Both components route their `getMySession`/`revokeMySession` calls through the shared `api-client` wrappers that enforce `credentials: "include"`. ### Patch Changes - Updated dependencies [[`54dcc87`](54dcc87), [`605abe1`](605abe1), [`ea193dc`](ea193dc)]: - @zitadel/components@0.1.0-alpha.14 - @zitadel/api@0.1.0-alpha.14 - @zitadel/sdk-core@0.1.0-alpha.14 ## @zitadel/sdk-vue@0.1.0-alpha.14 ### Minor Changes - [#443](#443) [`ea193dc`](ea193dc) Thanks [@bastionstack](https://github.com/bastionstack)! - Add a post-sign-in `<zitadel-session>` "signed in as" card: a dedicated element exposed through every SPA SDK and re-exported from sdk-next. CLI scaffolds now render it as the post-sign-in `/profile` page (with a Logout action) across all frameworks. Identity is read from `GET /sessions/me`, preferring `name` then `email` then `user_id`. `<zitadel-logout>` now sources its identity from the same `getMySession` operation instead of the `__nextgen_display` cookie, so both signed-in surfaces work against the real backend. Both components route their `getMySession`/`revokeMySession` calls through the shared `api-client` wrappers that enforce `credentials: "include"`. ### Patch Changes - Updated dependencies [[`54dcc87`](54dcc87), [`605abe1`](605abe1), [`ea193dc`](ea193dc)]: - @zitadel/components@0.1.0-alpha.14 - @zitadel/api@0.1.0-alpha.14 - @zitadel/sdk-core@0.1.0-alpha.14 ## @zitadel/server-darwin-arm64@0.1.0-alpha.14 ### Patch Changes - [#434](#434) [`ddc0c13`](ddc0c13) Thanks [@vitorbari](https://github.com/vitorbari)! - Fix passkey signup silently dropping every collected user attribute except the identifier. The passkey-register now routes user creation through `UserService`. - [#453](#453) [`54dcc87`](54dcc87) Thanks [@vitorbari](https://github.com/vitorbari)! - Add back navigation to interactive flows. The engine injects a `back` action on rendered step responses when there's a step to return to, and clears the back stack past irreversible mutations (user creation, passkey registration) and at flow termination. ## @zitadel/server-darwin-x64@0.1.0-alpha.14 ### Patch Changes - [#434](#434) [`ddc0c13`](ddc0c13) Thanks [@vitorbari](https://github.com/vitorbari)! - Fix passkey signup silently dropping every collected user attribute except the identifier. The passkey-register now routes user creation through `UserService`. - [#453](#453) [`54dcc87`](54dcc87) Thanks [@vitorbari](https://github.com/vitorbari)! - Add back navigation to interactive flows. The engine injects a `back` action on rendered step responses when there's a step to return to, and clears the back stack past irreversible mutations (user creation, passkey registration) and at flow termination. ## @zitadel/server-linux-arm64@0.1.0-alpha.14 ### Patch Changes - [#434](#434) [`ddc0c13`](ddc0c13) Thanks [@vitorbari](https://github.com/vitorbari)! - Fix passkey signup silently dropping every collected user attribute except the identifier. The passkey-register now routes user creation through `UserService`. - [#453](#453) [`54dcc87`](54dcc87) Thanks [@vitorbari](https://github.com/vitorbari)! - Add back navigation to interactive flows. The engine injects a `back` action on rendered step responses when there's a step to return to, and clears the back stack past irreversible mutations (user creation, passkey registration) and at flow termination. ## @zitadel/server-linux-x64@0.1.0-alpha.14 ### Patch Changes - [#434](#434) [`ddc0c13`](ddc0c13) Thanks [@vitorbari](https://github.com/vitorbari)! - Fix passkey signup silently dropping every collected user attribute except the identifier. The passkey-register now routes user creation through `UserService`. - [#453](#453) [`54dcc87`](54dcc87) Thanks [@vitorbari](https://github.com/vitorbari)! - Add back navigation to interactive flows. The engine injects a `back` action on rendered step responses when there's a step to return to, and clears the back stack past irreversible mutations (user creation, passkey registration) and at flow termination. ## @zitadel/server-win32-x64@0.1.0-alpha.14 ### Patch Changes - [#434](#434) [`ddc0c13`](ddc0c13) Thanks [@vitorbari](https://github.com/vitorbari)! - Fix passkey signup silently dropping every collected user attribute except the identifier. The passkey-register now routes user creation through `UserService`. - [#453](#453) [`54dcc87`](54dcc87) Thanks [@vitorbari](https://github.com/vitorbari)! - Add back navigation to interactive flows. The engine injects a `back` action on rendered step responses when there's a step to return to, and clears the back stack past irreversible mutations (user creation, passkey registration) and at flow termination. ## @zitadel/sdk-nuxt@0.1.0-alpha.14 ### Patch Changes - Updated dependencies [[`54dcc87`](54dcc87), [`605abe1`](605abe1), [`ea193dc`](ea193dc)]: - @zitadel/components@0.1.0-alpha.14 - @zitadel/api@0.1.0-alpha.14 - @zitadel/sdk-core@0.1.0-alpha.14 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Summary
@zitadel/configas the versioned single source for the editable default schema/flow documents and their authoring Zod schemas (@zitadel/config/schemas), shared by the CLI, the api-mock, and the Go server fallback (viago:embed).zitadel setupto be local-first: scaffold.zitadel/schemas/default-human-user.json(withobjectType: "human-user", no$id) and.zitadel/flows/default-login.json, create the project withseedDefaults: false, upload the schema, pin the flow to the server-assigned opaque schema id (feat: implemented correlation between schemas #456/fix: user_schema is an opaque server-assigned id, not a URI #460 model), and seed.zitadel/state.jsonsoplanis immediately empty. READMEs are scaffolded into.zitadel/{schemas,flows}/.applypublishes a new immutable revision and warns about flow files still pinned to the previous id; flows are never auto-repinned. Newzitadel schemas list --object-type=<value>inspects revision history (interactive picker fetches and pretty-prints a revision).seedDefaultsdefaults totrue), rendered from the same shared documents.zitadel.json,.zitadel/secret) when resource seeding fails so a rerun completes instead of stranding the project;doctorwarns (instead of unfixably failing) on projects that predate editable config; doctor andvalidateFlowsuse the same canonical Zod as the sync engine.zodis a runtime dependency of@zitadel/api(its published…zodexport imports it);msw/@faker-js/fakerare optional peers for the.mswexport;@zitadel/configis wired into the release manifest, tarball verification, journey registry, and the changesets fixed group.release:*, all*:build-release) is excluded frommoon ci(runInCI: false; therelease:snapshotstep builds it afterwards, serially), the release pre-clean is ordered after every dev build it races, and contended dists keep mutexes for parallel local runs.Validation
moon ci :lint :typecheck :build :test(full graph green in CI)moon run cli:test(675 tests, incl. setup rollback/rerun, doctor warn, schemas-list URL-encoding, revision sync)moon run config:test api-mock:test api:testgo build ./...,go test ./internal/api ./internal/service ./api/...,go vet -tags postgres_integration ./internal/api/integration_test(postgres run in CI)corepack pnpm --dir packages/api pack→ published manifest carrieszodindependencies(catalog resolved)corepack pnpm exec changeset status --since origin/main,git diff --checkRelease notes / changeset
.changeset/scaffold-editable-schema-flow-config.md— minor product bump covering@zitadel/config(new),@zitadel/cli,@zitadel/api,@zitadel/serverand the fixed alpha group.Notes
user_schema↔ schema-revision model follows feat: implemented correlation between schemas #456 (objectType correlation) and fix: user_schema is an opaque server-assigned id, not a URI #460 (opaque server-assigned ids); re-pinning a flow after a schema edit is an explicit second step by design.metaSchemais pinned to the defaultbuiltin_public_base(needs a server-side decision); api-mock fidelity gaps (409 on duplicate flow names, idempotent deletes, schema project-scoping on get/delete); bundle/atomic-apply design filed on ADR: define architecture for environments and releases #449.