Skip to main content
In an Ekanos repo, ekanos publish plans the packages first, checks every one, and only then submits anything. Everything on Publishing & target verification (seats, --source, --yes, exit codes) still applies to each integration it submits.

Choose what to publish

  • Name packages or pass --all, not both.
  • Run from the repo root, a package name is required (or --all). Run from inside a package directory, a bare ekanos publish publishes that package.
  • A name that is not a package of the repo is a usage error that lists the packages.
  • --all refuses to run while any package’s ekanos.json is unreadable, and names it.
  • Package names and --all outside a repo are a usage error. A plain project publishes as before.

The plan

The plan is the packages you chose, in topological order: an integration comes before every experience that uses it. The CLI prints it first:
Because an integration of the same repo is not an override, it is ordered first rather than refused. If you select an experience whose same-repo integration is not in the selection, the plan warns you: publish that integration first, or make sure it is already published at a compatible version. Nothing stops you; the warning is the check.

Every package is checked before anything is sent

Each package passes its own gate:
  • an integration: the same findings pass as ekanos validate, with the publish escalations (see Complete publish flow);
  • an experience: the experience gate, as ekanos check, and the refusals in Build an experience (an active local override, a tracked ekanos.local.json, any ignore entry).
If any package fails, the CLI prints a summary table, says “Nothing was published.”, and exits 10 (gate_failed). The status column says which package and why. Fix them, then re-run.

Dry run

--dry-run gates every package, builds every artifact, prints a summary, and touches no network. It needs no login and no --source. Each package gets a folder under the repo root:
An experience’s pack is checked: it may contain dist/, manifest.json, ekanos.json, ekanos.lock.json and contracts/, and nothing else. Integration code in the tarball fails the dry run. The summary:
.ekanos/ is gitignored. With --json, data carries repo, dryRun, order, warnings, notes, packages (one row each, with status, artifact, availability, any findings) and published: false.

A real publish

Without --dry-run, the CLI submits the integrations in plan order, each through the usual path (session, source resolution, seat verification, the 4 MiB archive limit, a version that has not been submitted before). The --source, --host and --yes flags apply to every one.
  • If an integration fails to submit, the run stops there. Its row says failed, the ones after it say not attempted, and the earlier ones stay submitted.
  • Each submitted row carries the host’s receipt (submissionId, state, and so on) in --json.
Publishing an experience is not supported by the host yet. A real run submits the integrations in your selection, marks each experience not supported by the host, and then exits 10 with “Publishing an experience is not supported by the host yet.” The integrations were submitted. Use ekanos publish --dry-run to build and pack an experience; that is the only thing it does today.

Availability

A package can say who may use it once it is published, in its own ekanos.json:
'global' | 'restricted'
required
global means every Source may use the package. restricted means only the Sources named in sources, plus the one that owns it. A Source is a tenant of Ekanos, such as your company’s deployment.
string[]
Source slugs, kebab-case, at least one if present. Only with restricted; global with sources is a validation error. A restricted package with no sources is available to its owner only.
No availability field means global. The plan and the summary table show each package’s availability as global, restricted: acme-media or restricted: owner only.
Availability is declared, not enforced yet. The host does not take availability at submission today. For each integration that declares one, the plan’s summary ends with note: acme-news: restricted: acme-media - availability is set by a super admin today; the host does not take it at submission. A super admin sets who can use the package. Declare it now: the CLI shows it in the plan and the table, so it is ready when the host starts reading it.

Exit codes

Authentication, seat and version-already-submitted exit codes are those of a single publish.

Next steps