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 bareekanos publishpublishes that package. - A name that is not a package of the repo is a usage error that lists the packages.
--allrefuses to run while any package’sekanos.jsonis unreadable, and names it.- Package names and
--alloutside 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: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 trackedekanos.local.json, anyignoreentry).
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 saynot attempted, and the earlier ones stay submitted. - Each submitted row carries the host’s receipt (
submissionId,state, and so on) in--json.
Availability
A package can say who may use it once it is published, in its ownekanos.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.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.