CLI
The xema CLI is the single, multi-platform command-line entry point to Xema. It boots a local platform, scaffolds and validates biomes, installs them, invokes capabilities, drops you into the Shell, and runs diagnostics. The same binary works against a locally-booted platform, a self-hosted single-VM deployment, and a multi-node cluster.
Install
1npm install --global @xemahq/xema
2# or
3pnpm add --global @xemahq/xemaVerify
1xema --version
2xema doctorxema doctor checks the local substrate: node version, the ~/.xema/ config directory, the resolvable distribution editions, the license in force and what it entitles, the container runtime and its platform, free disk space, the host ports a launch publishes, and container-registry reachability. Every check is reported — a check that cannot be evaluated says so explicitly rather than passing quietly.
1xema doctor # the local environment
2xema doctor --infra # also TCP-probe the relational database, Redis, etcd, the platform event bus, …
3xema doctor --sources # list the configured biome sources + whether their tokens are presentDeveloper mode
The platform-contributor command xema up is hidden from --help unless developer mode is on. It still runs if invoked directly.
1xema config set dev on # persisted to ~/.xema/config.yaml
2xema config get # shows whether it is active, and whyThe XEMA_DEV environment variable overrides the persisted setting at runtime.
Commands
Every command takes --help.
xema up
Boot the platform with one command. Resolves the distribution lock plus xema.config.yaml into an effective roster, brings up managed infrastructure, and supervises the service waves over the configured substrate (container or native). Foreground by default.
On the container and helm substrates, --release-list <file> is required: the seed image boots at the digest the release list froze, and the list's biomes install afterwards with xema distribution apply. On helm, --chart-set <file> names the chart-set lock, and it must be the one the list froze. Native boots no seed image and needs no list.
The release list must agree with the edition's locks. xema up resolves the tag the edition's images lock pins for the seed and refuses the boot when that digest is not the list's seed digest. It prints xema up failed: followed by seed <repository>: release list <digest>, edition lock <digest>, naming both values and choosing neither. On helm, the release list is the one chart-set authority: the --chart-set file must hash to the list's chartSet, or it is refused as chart set: release list <digest>, --chart-set <digest>, and the verified file is what helm installs from. No other chart-set lock on the machine (an install context's lock or XEMA_CHART_SET_LOCK) is read. --dry-run runs the same seed check before it prints. A verified chart set installs only from its OCI digests, so --chart-set is refused when the charts directory the CLI would use, XEMA_CHARTS_DIR or the install context's charts/ folder, holds any local chart (a <name>-<version>.tgz or a <name>/Chart.yaml); the error names the directory and the charts it found.
--mirror-config <file> (with delivery: relay) copies the release list's seed image to the target registry before the start, so it needs --release-list; without one it is refused, and on native it is refused because native runs no seed image.
The edition is always named, in xema.config.yaml (edition:) or with --edition; there is no default edition.
1xema up
2xema up --edition appliance-base --release-list release-list.json
3xema up --only workflow-engine-api # plus that service's hard prerequisites
4xema up --dry-run # print the resolved roster, waves and ports; boot nothingxema down stops what up started.
xema distribution apply
Converge a Biome Host to a frozen package list and report, per biome, whether it serves. It plans, applies the plan, follows the progress stream until it completes, fails or --ready-within passes, then reads serving status once. There is no polling loop.
1xema distribution apply --list packages.json --ready-within 600 \
2 --host https://biome-host.example.com --client-id apply-client \
3 --client-secret-file ./apply-client.secret \
4 --token-endpoint https://identity.example.com/token| Flag | Meaning |
|---|---|
--list <file> | JSON file holding a distribution package list (required). |
--ready-within <seconds> | How long to wait for the biomes to serve, as a positive whole number of seconds. It is sent to Biome Host and bounds the progress stream (required). |
--json | Print exactly one JSON result document on stdout instead of the human lines. |
--host <url> | Biome Host base URL, or the XEMA_BIOME_HOST_URL environment variable. |
--org <org> | Organization to act in. |
--client-id <id> | The apply client id, authenticated with client_credentials (required). |
--client-secret-file <path> | File holding the client secret (required). |
--token-endpoint <url> | Token endpoint the client authenticates at (required). |
The secret is read only from the file, never from the command line. The file must not be readable by group or others (mode 0600); the command refuses a more open file and names the path, never the content. --token-endpoint must be https; plain http is accepted only for a loopback host (localhost, 127.0.0.0/8, ::1), because the endpoint receives the secret.
Exit codes:
| Code | Meaning |
|---|---|
0 | Every biome is ready. |
1 | At least one biome is not ready; the result is still printed. |
2 | A usage or contract error: a bad flag or input, an open secret file, a refused request (400), another lifecycle operation running, or a response that carries both an operation id and refusals. One line on stderr, no JSON. |
3 | Unreachable: a network error, a 5xx, a token endpoint that does not answer, or the progress stream lost before its end and before the deadline. One line on stderr, no JSON. |
4 | Unauthorized: 401 or 403 from Biome Host, or the token endpoint refused the client. One line on stderr, no JSON. |
The JSON result lists one entry per listed biome, in list order, then unlisted ones sorted by biome. Each entry has a status:
ready: the biome serves, and the digest it serves is the planned digest. The reporteddigestis the serving digest.not-ready: the biome does not serve yet. Thereasonsays why, for exampleserving failed: <detail>,pending (<state>),not installed, orserving-digest-mismatch: serving <A>, planned <B>when it serves a different digest than planned.refused: the plan or the apply refused or excluded the biome, withreasonas<code>: <detail>.unlisted: the plan touches a biome the list does not name.
xema distribution snapshot
Freeze the serving environment into a release list: every bundle biome at its serving digest, the seed image and the chart set. It is all or nothing: if any biome is not serving or has no digest, or the environment reports no seed, nothing is written and each offending biome is printed on its own stderr line.
1xema distribution snapshot --edition appliance-base --chart-set chart-set.lock.json \
2 --out release-list.json --host https://biome-host.example.com \
3 --client-id apply-client --client-secret-file ./apply-client.secret \
4 --token-endpoint https://identity.example.com/token| Flag | Meaning |
|---|---|
--edition <id> | Edition id the release list is for (required). |
--chart-set <file> | The chart-set lock the environment was installed from (required). |
--out <file> | Where to write the release list (required). It must not exist; a release list is never overwritten. |
--host, --org, --client-id, --client-secret-file, --token-endpoint | As for xema distribution apply, including the secret-file and https rules. |
The seed repository comes from the edition's images lock, the same reader xema up uses. The chart set must be the one the environment reports: the digest of the --chart-set lock must equal the digest of the chart set in the environment's seed block, and a mismatch is refused with both digests named. A seed block whose chart set is not a chart-set lock is refused too. The list is written to a temporary file next to --out and renamed onto it, and the temporary file is removed if the write fails.
Exit codes: 0 on success, 1 when the environment cannot be frozen (including a chart-set mismatch), 2 on a usage error, 3 when Biome Host or the token endpoint is unreachable, 4 when the credentials are refused.
xema biome scaffold <name>
Generate a new, valid biome directory — manifest, one example contribution, and the boundary-check config, so the new biome passes lint out of the box.
1xema biome scaffold hello-xema
2xema biome scaffold hello-web --target web --scope platformxema biome validate [path]
Run the pre-boot checks over a biome directory — manifest schema, xema.agents[] ⟷ agents/*.md parity, contribution envelopes, skill frontmatter, workflow schemas — without booting anything. Defaults to the current directory.
1xema biome validate
2xema biome validate ./my-biomeExits 0 when every check passes and non-zero when one fails, listing every issue rather than only the first — so it drops straight into CI.
xema biome dev [path]
The biome sandbox loop: the same validation pass, then overlay the directory as a workspace source (no publish, no token) and boot the smallest platform slice the biome needs.
1xema biome dev
2xema biome dev --dry-run # validate + print the resolved slice, boot nothingA workspace source always outranks every remote source for the same biome. That is what lets xema biome dev run local edits with no publish and no registry token.
xema biome search|list|info
Browse the Store catalog.
1xema biome search "code review"
2xema biome list --trust-tier first-party
3xema biome info <listingId>xema biome install <biomeId>
Install a catalog biome into a running platform, or fetch it to this machine so xema up can boot it without a platform at all.
1xema biome install acme-code-review --org <orgId>
2xema biome install acme-code-review --local --from my-registryThe install goes through Biome Host's lifecycle door: it plans the install (dependencies, permission digest, capability registration), shows the plan, and applies exactly what was planned. Configure the installation afterwards through its settings. xema biome uninstall <biome> uninstalls it through Biome Host (plan, confirm, streamed progress) and keeps the biome data unless you pass --purge.
xema biome publish <path>
Package the biome as an OCI artifact, push it (oras push), then sign the pushed ref (cosign sign).
1COSIGN_KEY=cosign.key xema biome publish ./ --registry ghcr.io/acme --token-env GHCR_TOKEN
2xema biome publish ./ --keyless \
3 --certificate-identity https://github.com/acme/biomes/.github/workflows/publish.yaml@refs/heads/main \
4 --certificate-oidc-issuer https://token.actions.githubusercontent.com # what CI should use
5xema biome publish ./ --dry-run # print the resolved plan and the exact oras/cosign commandsSigning is mandatory. There is no unsigned mode. --keyless requires the run's own signer identity (the workflow file that runs, which is the reusable one when there is one) and its issuer. A publish owes a signature and an attestation by that signer: if the tag already holds the same content, signed only by another identity, it signs and attests the existing digest without pushing again. The identity flags are refused without --keyless; in key mode a dry run of an existing tag needs COSIGN_KEY. See SDK — Publishing for the full flag set.
xema biome submit <path> submits a published artifact to your org's private Store catalog.
xema biome lint
Run boundary and manifest checks across the workspace.
1xema biome lint
2xema biome lint --strictxema run <capabilityRef>
Invoke a capability through the platform's capability router (POST /capabilities/invoke).
1xema run hello:greet@1 --input '{"name":"Ada"}'
2xema run kb:page.read@1 --input @page.json
3xema run shell:concepts.list@1Capability refs such as hello:greet@1 are illustrative: they are invented to teach the syntax and no platform service produces them.
The acting subject is always the token's sub claim — it cannot be overridden. The environment defaults to environment:project and is set with --environment. The full result (allow / denial / audit id) prints as JSON, and a denied invocation exits non-zero so scripts can branch.
xema shell
An interactive REPL over the same router. Each line is <capabilityRef> [inputJson].
1xema shell
2> shell:ls@1 {"path":"/orgs/acme/projects/billing"}
3> shell:explain@1 {"ref":"xema://biomes/acme-code-review"}Built-ins are help and exit / quit; Ctrl-D exits. Only an unreachable router at startup is fail-fast — an invocation error prints and the loop continues.
xema canopy
A conversational REPL over Canopy, the universal Xema agent. Where xema shell expects an exact capability ref on each line, you describe what you want in plain language and Canopy finds the capability, checks it can run it, and runs it.
1xema canopy
2xema canopy --org acme --environment project| Option | What it does |
|---|---|
--org <orgId> | The acting organization, sent as the X-Xema-Org-Id header (or set XEMA_ORG_ID). |
--environment <env> | The execution environment, with the same default and values as xema run. |
On start the command opens, or resumes, your Canopy conversation and prints nothing from earlier turns. Each line you type is sent as one turn and the reply prints when it lands. If the turn is accepted but has not answered yet, the REPL says so and you can keep typing. A denied turn prints the audit id rather than a reason; look the decision up by that id. exit or quit leaves the REPL. The command exits with an error if the platform has no Canopy or your subject cannot see it.
xema objects list|get
Browse the typed object universe.
1xema objects list --space xema://orgs/acme/projects/billing
2xema objects list --type skill --limit 50
3xema objects get xema://orgs/acme/skills/release-notesxema plan|apply|export|import
Declarative provisioning. See Xema-as-Code.
Other commands
| Command | What it does |
|---|---|
xema init | Scaffold a xema.config.yaml |
xema login | Device-code login; writes a session to ~/.xema/session.json |
xema status | What is running |
xema logs | Service logs |
xema source | Manage the biome source registry |
xema edition | Resolve, seal and check editions |
xema license | Inspect the license in force and what it entitles |
xema installation | Installation-level operations |
xema canopy | Conversational REPL over the Canopy agent (see xema canopy) |
xema config | Inspect and change persisted CLI settings |
Command reference
Generated from the CLI itself. Developer-mode commands are hidden from --help and are not listed.
| Command | Summary | Options |
|---|---|---|
xema apply | Apply a xema.yaml manifest to a stack | --auto-approve, --endpoint <url>, --file <path>, --stack <name>, --token-env <NAME>, --token-stdin |
xema auth | Use the signed-in Xema session | |
xema auth token | Print the signed-in user's access token (refreshing it if needed) | --issuer <url> |
xema biome | Discover / author / develop / install / publish / lint biomes | |
xema biome dev [path] | Validate a biome directory, push it to Biome Host as an update, and push again on every change (watch, rebuild, push) against a local or remote seed. Defaults to the current directory; works from anywhere inside the biome. | --dry-run, --host <url>, --org <org>, --output <format>, --token-env <NAME>, --token-stdin, --yes |
xema biome info <id> | Show a catalog listing and its versions (by listing id) | --endpoint <url>, --org <org>, --token-env <name>, --token-stdin |
xema biome install <biomeId> | Install a biome through Biome Host (plan, confirm, streamed progress), or (--local) fetch it to this machine so xema up can boot it without a platform | --accept-all, --channel <channel>, --consent-digest <digest>, --digest <digest>, --dry-run, --endpoint <url>, --from <spec>, --host <url>, --local, --mirror-config <file>, --org <org>, --output <format>, --package <name>, --tag <tag>, --token-env <NAME>, --token-stdin, --with-dependencies, --yes |
xema biome lint | Run boundary + manifest checks across the workspace | --strict |
xema biome list | List biomes in the Xema Store catalog | --archived, --endpoint <url>, --limit <n>, --offset <n>, --org <org>, --scope <scope>, --token-env <name>, --token-stdin, --trust-tier <tier> |
xema biome pack [paths...] | Pack each server biome with a service or worker component as a sealed bundle (<out>/<hex>.tgz) and write <out>/bundles.json; publish the archives with xema biome publish --bundle. Other biomes are skipped: they publish in source mode | --all, --build-commit <sha>, --build-repository <url>, --concurrency <n>, --dry-run, --out <dir>, --platform <os/arch> |
xema biome publish [paths...] | Publish a biome as an OCI artifact: signed (oras + cosign), or --unsigned for the unsigned lane | --all, --bundle <tgz>, --bundle-set-out <file>, --bundle-set-source <repository@commit>, --certificate-identity <uri>, --certificate-oidc-issuer <url>, --channel <channel>, --concurrency <n>, --config <path>, --dry-run, --keyless, --registry <host>, --source <name>, --tag <tag>, --token-env <name>, --unsigned, --username <user> |
xema biome resolve <biome> | Print the archive digest (sha256:<hex>) of a channel's head: the value xema biome install --digest pins. Reads the bundle repository of a configured oci source. | --channel <channel>, --from <source>, --output <format> |
xema biome rollback <biome> | Restore the digest an environment ran before the biome was last updated (the previous digest Biome Host reports). Refuses when there is none. | --dry-run, --env <target>, --host <url>, --org <org>, --output <format>, --token-env <NAME>, --token-stdin, --yes |
xema biome scaffold <name> | Generate a new, valid biome directory | --description <text>, --dir <path>, --scope <tier>, --target <target> |
xema biome search <query> | Search the Xema Store catalog (free-text over name + id) | --endpoint <url>, --limit <n>, --org <org>, --token-env <name>, --token-stdin |
xema biome submit <path> | Submit a biome to your org's private Store catalog (trust tier private-org) | --bundle-sha <digest>, --bundle-uri <ref>, --endpoint <url>, --notes <text>, --org <org>, --token-env <name>, --token-stdin |
xema biome uninstall <biome> | Uninstall a biome through Biome Host (plan, confirm, streamed progress). Without --purge the biome data is kept. | --cascade, --dry-run, --host <url>, --org <org>, --output <format>, --prune-orphans, --purge, --token-env <NAME>, --token-stdin, --yes |
xema biome update <biomes...> | Update installed biomes through Biome Host (plan, confirm, streamed progress). Biomes run one after another, each with its own plan. | --accept-all, --channel <channel>, --consent-digest <digest>, --digest <digest>, --dry-run, --from <spec>, --host <url>, --mirror-config <file>, --org <org>, --output <format>, --token-env <NAME>, --token-stdin, --with-dependencies, --yes |
xema biome validate [path] | Run the pre-boot biome checks (manifest, agents, contributions, skills, workflows) without booting anything. Defaults to the current directory; works from anywhere inside the biome. Exits 3 when a check fails. | |
xema canopy | Talk to Canopy, the universal Xema agent (conversational REPL) | --environment <env>, --org <orgId> |
xema config | Inspect and change xema CLI settings (~/.xema/config.yaml) | |
xema config get | Show whether developer mode is active and why, and the resolved launch config | |
xema config init | Write ~/.xema/config.yaml with the built-in launch defaults | --force |
xema config migrate | Migrate config files to the current config version | --file <path> |
xema config set | Change a persisted CLI setting | |
xema config set dev <state> | Turn developer mode on/off (shows up in --help) | |
xema distribution | Converge an environment to a distribution, or move the installed set between environments. | |
xema distribution apply | Apply a frozen package list through Biome Host and report, per biome, whether it serves. Exit 0 when every biome is ready, 1 when any is not, 2 on a usage or contract error, 3 when Biome Host or the token endpoint is unreachable (network error, 5xx, progress stream lost), 4 when the credentials are refused (401, 403). | --client-id <id>, --client-secret-file <path>, --host <url>, --json, --list <file>, --org <org>, --ready-within <seconds>, --target <tier>, --token-endpoint <url> |
xema distribution plan | Plan a frozen package list through Biome Host and print the plan, applying nothing: the same plan apply runs first, so a refusal (a workload privilege setup naming a service the biome lacks: 422, no install authority: 403) shows here. Exit 0 when nothing is refused, 1 when Biome Host refuses (422 or a refused biome), 2 on a usage or contract error, 3 when Biome Host or the token endpoint is unreachable, 4 when the credentials are refused (401, 403). | --client-id <id>, --client-secret-file <path>, --host <url>, --json, --list <file>, --org <org>, --target <tier>, --token-endpoint <url> |
xema distribution promote | Apply the healthy installed set of one environment to another, each biome at the digest the source runs. Refuses, naming the biome, when any source member is not healthy; running it again changes nothing. | --dry-run, --from <target>, --output <format>, --to <target>, --yes |
xema distribution snapshot | Freeze the serving environment into a release list: every bundle biome at its serving digest, the seed image and the chart set. All or nothing. Exit 0 on success, 1 when the environment cannot be frozen, 2 on a usage error, 3 when Biome Host or the token endpoint is unreachable, 4 when the credentials are refused. | --chart-set <file>, --client-id <id>, --client-secret-file <path>, --edition <id>, --host <url>, --org <org>, --out <file>, --token-endpoint <url> |
xema doctor | Diagnose the local Xema environment | --config <path>, --infra, --sources |
xema down | Stop everything xema up started (container or helm substrate) | --config <path>, --purge |
xema edition | Resolve, seal and check editions | |
xema edition arming [args...] | Print whether the data root evidence trust policy is armed on one channel as one JSON line, exiting 0 only when armed: xema edition arming --channel <release|develop> --data-root <dir> --kernel <dir> | |
xema edition artifact [args...] | Write the OCI artifact files of a release edition from the committed sealed locks: xema edition artifact <id> --channel release --registry <root> --engine-image <repo>@sha256:<digest> --chart-set <file> --out <dir> | |
xema edition biome-manifests [args...] | Print the pinned xema-biome.json of every biome of an edition as JSON: xema edition biome-manifests <id> --json --data-root <dir> --editions-root <dir> --sources-root <dir> --kernel <dir> | |
xema edition catalogue [args...] | Write the catalogue.json of a release offering from its committed sealed locks: xema edition catalogue <id> --chart-set <file> --out <dir> | |
xema edition ceiling [args...] | Print the dev ceiling (DevelopCeilingSchema) of a distribution at a distributions commit as JSON: the selection from the definition and indexes at that commit, the process facts from each producer manifest and ledger at its stated commit: xema edition ceiling --distribution <id> --at <distributions sha> --producer-commit <owner/repo>=<sha> [--producer-commit ...] --data-root <dir> --sources-root <dir> --kernel <dir> | |
xema edition chart-set [args...] | Declare the chart set of a release cut: xema edition chart-set <resolve|source-commit> --data-root <dir> --kernel <dir>; resolve --out <file> writes the one lock the cut names from the charts the registry serves (refused when the file exists); source-commit --chart-set <file> prints the commit each publisher closed that locked set at | |
xema edition check [args...] | Check the committed edition locks and catalogue indices (a release check takes --chart-set <file>, the chart-set lock the release cut names); prints every active per-edition hold (sourcePins) with its exit condition | |
xema edition check-authored [args...] | Check the authored distribution source offline (the develop gate): the definitions, the indexes, the trust policy, the data-root readers, the chart-set pin and the ownership self-tests; resolves no edition and reads no lock content and no source checkout at a pinned commit: xema edition check-authored --data-root <dir> --editions-root <dir> --sources-root <dir> --kernel <dir> | |
xema edition check-lock-readability [args...] | Parse sealed distribution locks with every published @xemahq/contracts version the readability plan grades (the plan resolve-digests writes beside the locks, lock-readability.plan.json): xema edition check-lock-readability --plan <file> [--sandbox docker|none] <distribution.lock.json>...; reads no source repository and takes no root flag; the parse runs in a Docker sandbox (no network, no host environment, read-only, unprivileged) unless --sandbox none is given for a local run, and a missing Docker is refused, never worked around; exits 1 with the refusal when any graded version cannot read a lock | |
xema edition checkout-sources [args...] | Check out the source repositories the runtime image source index names | |
xema edition contract-authority [args...] | Print the edition contract authority (v2: {schemaVersion, packageName, contentDigest}) of the @xemahq/edition-contracts this CLI bundles, as canonical JSON. No root flags: xema edition contract-authority > contract-authority.json. contentDigest is the SHA-256 of the package's edition-contract.schema.json, computed when the package is packed; a kernel is accepted only when its own authority equals this one | |
xema edition develop [args...] | Resolve a develop edition snapshot: xema edition develop <resolve|target|freeze-graph|freeze-sources|check-existing|check-overrides|select-records|image-record> ... (the channel lane: resolve --engine-image <repo>@sha256:<digest> --images-from <record> --channel <tag>; target takes the same plus --chart-set <resolve --out>/chart-set.lock.json, the lock resolve wrote; no signature is verified); or a customer develop edition (catalogue pinned in catalogue.pin.json beside the definition): xema edition develop <resolve|target|check-existing|freeze-sources> --definition <file> ... (resolve: --pins <file> --out <dir> --registry <root> --engine-image <repo>@sha256:<digest> [--source-image <source>=<registry>/<prefix>]...; target: --pins <file> --registry <root> --engine-image <repo>@sha256:<digest> [--source-image ...]; check-existing: --pins <file> --artifact <dir> --engine-image <repo>@sha256:<digest> [--source-image ...]). The develop tag is sha256 of the @xemahq/edition-tooling version, the engine image, the pins, the source-image map and the infra chart index digest of the chart set. | |
xema edition evidence [args...] | Build, accept and plan image evidence (never signs): xema edition evidence <assemble-input|assemble-third-party-input|statement|assemble-set|check-committed|plan-refresh|oci> …; evidence assemble-third-party-input and the public-input mode (--contract-authority <file>) of statement producer <stage|accept> and oci <attach-plan|validate> are refused: third-party public-input evidence was removed (XEMA-2790) | |
xema edition index [args...] | Rebuild a catalogue index: xema edition index <biome|platform-service|runtime-image-source> [--check]; xema edition index runtime-image-source --trusted-write --third-party <name> verifies a third-party source offline against the OCI registry and the trusted cosign (flags and --check-third-party in edition/README.md), and commits its evidence and pin | |
xema edition list [args...] | Print the offering ids of an editions root as JSON: xema edition list --editions-root <dir> | |
xema edition locks [args...] | Print the validated locks of an edition as JSON: xema edition locks <id> --channel <release|develop> --data-root <dir> --editions-root <dir> --kernel <dir> | |
xema edition pin [args...] | Hold one repository of a vendor edition at an exact commit, then re-resolve the edition (the commit must exist, be contained in origin/main and be built; a pin equal to the shared repository pin is not a hold): xema edition pin <edition> <repo> <ref> --until "<exit condition>" --data-root <dir> --editions-root <dir> --sources-root <dir> --kernel <dir> | |
xema edition release [args...] | Resolve a customer release edition (catalogue pinned for release in catalogue.pin.json beside the definition): xema edition release <freeze-sources|target|check-existing|resolve> --definition <file> ... (freeze-sources: --out <pins.json>, each source at its declared ref; resolve: --pins <file> --out <dir> --registry <root> --engine-image <repo>@sha256:<digest> [--source-image <source>=<registry>/<prefix>]...; target: --pins <file> --registry <root> --engine-image <repo>@sha256:<digest> [--source-image ...]; resolve and check-existing are refused until the release catalogue evidence is verified) | |
xema edition release-cut [args...] | Install a frozen release list into the environment the cut brought up and prove it ready, through the xema CLI verb xema distribution apply (on PATH, or --xema <bin>), then stage its bundles in the dev registry (the stores read from xema-deploy registry-config.mjs at --deploy-root) and write their manifest digests to --staged-out; one line per refused, not-ready or unstaged bundle, and for a seed or chart set other than the frozen ones, exiting 1: xema edition release-cut --release-list <file> --deploy-root <dir> --ready-within <seconds> --staged-out <file> --client-id <id> --client-secret-file <path> --token-endpoint <url> [--host <url>] [--org <org>] | |
xema edition resolve [args...] | Resolve the whole release lock set of an edition: xema edition resolve <id> [--check]; or a customer edition against the catalogue pinned in catalogue.pin.json beside the definition: xema edition resolve --definition <file> --channel release --out <dir> (a develop customer edition is resolved by xema edition develop resolve --definition) [--source-image <source>=<registry>/<prefix>]... | |
xema edition resolve-digests [args...] | Resolve the image digests of an edition: xema edition resolve-digests <id> [--definition <file>] (a customer edition resolves them against the release catalogue pinned in catalogue.pin.json beside the definition) | |
xema edition seal [args...] | Seal one exact resolved RELEASE edition (kind resolved, pulled by the caller): xema edition seal --resolved <repository>@sha256:<digest> --manifest <file> --artifact <dir> --out <dir> --cosign <abs path> --resolve-workflow-sha <40-hex> [--local] --data-root <dir> --editions-root <dir> --kernel <dir>; cosign-verifies it offline against the contract issuer and the resolve publisher (only the data root edition-workspace.json editionPublishers.resolved.release, in the repository the edition provenance records; undeclared is refused), then writes its layers unchanged plus a kind sealed release descriptor naming it as sealOf, refused unless the evidence trust policy is armed on release | |
xema edition source-closure [args...] | Print the source tree hash and workspace closure of a source directory at a commit as JSON: xema edition source-closure --repo <repo> --path <dir> --commit <sha> --sources-root <dir> --kernel <dir> | |
xema edition unpin [args...] | Release one hold (or all holds) of a vendor edition, then re-resolve the edition: xema edition unpin <edition> [<repo>] --data-root <dir> --editions-root <dir> --sources-root <dir> --kernel <dir> | |
xema edition verify-evidence [args...] | Verify the signed image evidence of an edition with the pinned verifier bundle: xema edition verify-evidence <id> --evidence-root <dir> --descriptor <path> --state <path> --cosign <path> --git <path> [--json] --data-root <dir> --editions-root <dir> --kernel <dir> | |
xema edition verify-platforms [args...] | Prove the registry serves every required platform of an edition: xema edition verify-platforms <id> | |
xema edition why [args...] | Explain why a biome is in an edition: xema edition why <id> <biome> | |
xema export | Export a stack's managed resources to a xema.yaml | --endpoint <url>, --stack <name>, --token-env <NAME>, --token-stdin, -o, --output <path> |
xema import | Adopt live resources into a stack from a xema.yaml | --endpoint <url>, --file <path>, --stack <name>, --token-env <NAME>, --token-stdin |
xema init | Scaffold a xema.config.yaml (interactive or --preset) | --edition <id>, --force, --license <key>, --license-file <path>, --output <path>, --preset <name>, --web, --yes |
xema installation | Plan, apply, inspect, and diagnose this Xema installation | |
xema installation apply | Apply the installation — through the deployment engine on Kubernetes, the shared launcher locally | --allow-destructive, --authority <dir>, --chart-set <file>, --config <path>, --detach, --file <path>, --from <deployment-root>, --kubeconfig <path>, --release-list <file>, --web |
xema installation create | Create (or resume) this installation's slice of the shared servers | --authority <dir>, --biome-registry-credential <file>, --file <path>, --from <deployment-root>, --inventory <path>, --license <file>, --lifecycle <lifecycle>, --reach <server=url>, --seed-image <repository@digest>, --servers <file> |
xema installation delete <name> | Delete an installation from the shared servers and prove nothing is left behind | --after-down, --authority <dir>, --confirm <phrase>, --inventory <path>, --ready-url <url>, --servers <file> |
xema installation identity | This installation's identity — the id a licence is issued to | |
xema installation identity create | Mint this installation's identity, once | |
xema installation identity show | Print this installation's id | |
xema installation import <name> | Import an existing environment from its deployment root: writes the installation file and the inventory | --authority <dir>, --biome-registry-credential <file>, --edition <edition>, --force, --from <deployment-root>, --inventory <path>, --license <file>, --lifecycle <lifecycle>, --member-database <member>=<database>, --no-protect, --openfga-store <name>, --output <path>, --profile <profile>, --reach <server=url>, --servers <file> |
xema installation init | Create a developer, starter, or single-node installation file | --context <name>, --edition <edition>, --force, --kubeconfig <path>, --name <name>, --output <path>, --profile <profile>, --target <kind> |
xema installation list | List the installations with an inventory here, and (with --discover) the ones marked on the shared Postgres | --authority <dir>, --discover, --inventory <path>, --root <dir...>, --servers <file> |
xema installation plan | Show what apply would change — the local plan, then the deployment engine's on Kubernetes | --authority <dir>, --config <path>, --file <path>, --from <deployment-root>, --inventory <path>, --kubeconfig <path>, --reach <server=url>, --seed-image <repository@digest>, --servers <file> |
xema installation protect <name> | Turn deletion protection on or off for an installation inventory | --authority <dir>, --confirm <phrase>, --inventory <path>, --off, --on, --servers <file> |
xema installation status | Compare desired, last-applied, and observed installation state | --config <path> |
xema installation support-bundle | Write a redacted, integrity-hashed diagnostic bundle | --config <path>, --force, --output <path> |
xema installation validate | Validate the installation: providers, then the deployment root (Kubernetes) or the setup render (local) | --available-provider <provider...>, --file <path> |
xema installation verify | Verify a Kubernetes installation: every release present, at its digest, converged | --config <path>, --file <path>, --kubeconfig <path> |
xema license | Inspect and apply the Xema license | |
xema license apply <file> | Install or replace this machine's license | |
xema license show | Report the license state and what it entitles | --config <path> |
xema login | Sign in to a Xema deployment via device-code login | --client-id <id>, --endpoint <url>, --issuer <url> |
xema logout | Remove the stored Xema session | |
xema logs [service] | Show logs for a launcher-owned workload (any substrate) | --config <path>, -f, --follow |
xema mirror | Plan and deliver the content a private network receives | |
xema mirror export | Write an air-gap kit (an uncompressed tar of OCI layouts, npm tarballs, kit.json and SHA256SUMS) of the content mirror.lock.json names; with --since a receipt, only what the target does not hold | --config <file>, --out <file>, --output <mode>, --since <receipt> |
xema mirror import <kit> | Verify a kit completely, then stage it into the target by digest and commit by moving the receipt; a failure before the commit leaves nothing referenced | --config <file>, --output <mode>, --plain-http, --receipt-out <file> |
xema mirror plan | Resolve a mirror content declaration into mirror.lock.json beside it (digest-pinned images, bundles, charts, referrers and npm packages); with --check, fail when the committed lock is not what a fresh plan produces | --bundle-registry <registry>, --check, --content <file>, --data-root <dir>, --editions-root <dir>, --kernel <dir>, --npm-registry <url>, --output <mode> |
xema mirror push | Make the target (the registry and npm registry of mirror.yaml) hold mirror.lock.json: images, bundles, charts and referrers by digest, npm tarballs by integrity; nothing is deleted; records a receipt | --config <file>, --output <mode>, --plain-http, --receipt-out <file> |
xema mirror status | Verify the target against mirror.lock.json by content and name what it lacks; with --receipt, record what it verifiably holds | --config <file>, --output <mode>, --plain-http, --receipt <file> |
xema objects | Browse Xema objects (skills, agents, biomes, capabilities, …) | |
xema objects get <ref> | Resolve a single Xema object by canonical ref | --endpoint <url>, --token-env <NAME>, --token-stdin |
xema objects list | List Xema objects visible to your token | --endpoint <url>, --limit <n>, --space <ref>, --token-env <NAME>, --token-stdin, --type <kind> |
xema onboard <deployment> | Provision a deployment end to end — substrate, then platform | --engine <engine>, --execute, --externals <path>, --infra <dir>, --kubeconfig <path>, --no-infra, --root <dir> |
xema plan | Plan a xema.yaml manifest against a stack (read-only) | --endpoint <url>, --file <path>, --stack <name>, --token-env <NAME>, --token-stdin |
xema run <capabilityRef> | Invoke a capability via the platform capability-router | --endpoint <url>, --environment <ref>, --input <json>, --org <id>, --token-env <NAME>, --token-stdin |
xema shell | Launch the interactive Xema capability shell (REPL) | --endpoint <url>, --environment <ref>, --org <id>, --token-env <NAME> |
xema source | Add / remove / list biome sources (registries) | |
xema source add <name> <kind> | Add a biome source (kind: git | npm | oci | distribution | workspace) | --auth-token-env <VAR>, --edition <id>, --global, --ref <ref>, --registry <host>, --registry-url <url>, --root <dir>, --scope <scope>, --url <url> |
xema source list | List configured biome sources | |
xema source remove <name> | Remove a biome source by name | --global |
xema status | Show launcher-owned workloads and their health | --config <path> |
xema whoami | Show the current Xema session |
Common workflows
Authoring a biome end-to-end
1xema biome scaffold my-biome
2cd my-biome
3# edit ./contributions, ./agents, ./skills, ./api...
4xema biome validate
5xema biome lint
6xema biome dev # boot the smallest slice that runs it
7xema biome publish ./ # ship itWorking against a running platform
1export XEMA_ENDPOINT=https://xema.acme.dev
2xema login
3xema run kb:page.read@1 --input '{"pageId":"…"}'
4xema shellConfiguration
Persisted CLI settings live in ~/.xema/config.yaml; the login session lives in ~/.xema/session.json (owner-only). Platform configuration — the roster, biome sources, the edition — lives in xema.config.yaml, resolved through the standard search order or named with --config.
Connection details resolve identically for every command that talks to a platform:
| Flag | Environment variable | What it is |
|---|---|---|
--endpoint <url> | XEMA_ENDPOINT | Platform API base URL |
--token <jwt> | XEMA_TOKEN | Bearer token |
--org <id> | XEMA_ORG_ID | Acting organization id |
| — | XEMA_DEV | Overrides the persisted developer-mode setting |
A private biome source names the environment variable that holds its token (authTokenEnv) — the secret is never written into xema.config.yaml. A variable that is named but unset fails fast; it never falls through to an unauthenticated request.
Related concepts
- Capabilities —
xema runinvokes through the same surface. - Shell —
xema shellspeaks the same capability surface the web terminal exposes. - Biomes —
xema biomecommands manage the lifecycle. - Xema-as-Code —
xema plan/apply/export/importdrive declarative provisioning. - SDK / Getting Started — the end-to-end walkthrough.
Previous: ← Developer Annotations Next: Xema-as-Code →