Settings
You can skip this reference until you need a knob. Defaults are enough for Aggregate Verify (test, fmt, workflow-check, advisories) plus publish.
Write settings without ThisBuild /. zipx reads them from the root project (sbt 2).
A typed setting (WorkflowName, JdkVersion, RunnerOs, …) checks its literal where you write it.
zipxTestTask / zipxPublishTask / zipxCacheRehydrateTask are SbtCommand (prefer zipxTasks so a renamed key
fails at load). Declared command names are checked at zipxWorkflowGenerate. See Validation.
Build-level
| Setting | Type | Default | Purpose |
|---|---|---|---|
zipxCapabilities | Seq[Capability] | ep]] = | Custom capabilities (same name replaces built-in). |
zipxWorkflowName | WorkflowName | ep]] = | Name of the generated GitHub Actions workflow. |
zipxWorkflowPath | String | ep]] = | Workflow file path relative to the build root (default .github/workflows/ci.yml). |
zipxJavaVersion | JdkVersion | ep]] = | JDK major version for the CI matrix and cache key. |
zipxRunnerOs | RunnerOs | ep]] = | GitHub Actions runner label (default ubuntu-latest). |
zipxScalaMatrix | Boolean | ep]] = | Expand a per-module Scala matrix over crossScalaVersions (Graph test only). |
zipxMatrixCollapse | Map[CapabilityName, MatrixCollapse] | ep]] = | Per-capability MatrixCollapse defaults (Auto / Off / Strict / Coarse). Capability.withMatrixCollapse overrides. Empty = Auto. |
zipxActions | ActionPins | ep]] = | Hash-pinned GitHub Actions. Override for one-offs; catalog Action vals overlay jar Defaults. See Action pins. |
zipxActionsPath | String | ep]] = | Legacy pin YAML path. If this file exists, generate fails (paste Action vals). Not an input. |
zipxActionRows | Seq[Action] | ep]] = | Action rows collected from the ZipxVersions object (every Action val). Overlay onto ActionPins.Defaults. |
zipxVerify | ZipxVerify | ep]] = | Parallel Verify gates: fmt, workflow-check, advisories. Default Strict (all On). Skip(reason) still emits the job. |
zipxLeftoverSteward | LeftoverOpt | ep]] = | If zipx-scala-steward.yml is on disk: Fail generate/check (default) or Warn(reason). The replacement is zipx-version-updates.yml (zipxVersionUpdates). |
zipxVersionUpdates | Boolean | ep]] = | Emit .github/workflows/zipx-version-updates.yml: schedule plus dispatch, cs launch zipx-cli catalog update --yes --verify-load, then zipxPinUpdate / zipxAgentEnvGenerate / zipxCatalogGenerate, opens zipx/version-updates-$GITHUB_RUN_ID labeled clean. Commits everything except repo-root .github/workflows. Nested extra generate is zipxVersionUpdatesExtraSteps. Default true. false deletes the companion. |
zipxVersionUpdatesSchedule | Cron | ep]] = | Cron for zipx-version-updates.yml. Default Sunday 00:00 UTC. Use Cron.daily / Cron.weekly / Cron.raw. |
zipxVersionUpdatesPreSteps | Seq[Step] | ep]] = | Extra steps on the version-updates companion after zipx-sbt-setup and before zipx-cli apply (default empty). Typical use: publishLocal the whole in-dev graph (not only cli/) so cs launch can resolve zipx-cli plus its modules from m2Local. |
zipxVersionUpdatesExtraSteps | Seq[Step] | ep]] = | Extra steps on the version-updates companion after zipxCatalogGenerate and before opening the PR (default empty). Typical use: publishLocal an in-dev sbt plugin and zipxWorkflowGenerate a nested example. That tree's .github/workflows/ is not repo-root, so GITHUB_TOKEN can commit it. |
zipxReleaseWorkflow | Option[ReleaseWorkflow] | ep]] = | Emit .github/workflows/zipx-release.yml. A tag publishes that ship. A dispatch publishes the ships named in the ships field (default all), plus unreleased in-repo upstreams, in one session and one deployment. Presets: ZipxCentral.releases, ZipxGitHubPackages.releases, ZipxMaven.releases. Default None. None deletes the companion. |
zipxSnapshotRegistries | Seq[ArtifactRegistry] | ep]] = | Snapshot repositories resolved beside the publish registry while a catalog pin ends in -SNAPSHOT. The publish registry's snapshot repository is already included. A pin names no registry of its own. Default empty. |
zipxShellWorkflows | Seq[ShellWorkflow] | ep]] = | Extra workflow_dispatch workflows. Each job checks the repo out and runs zipx-sbt-setup from this build, then the steps the build supplies. There is no sbt command unless a step runs sbt. Paths under .github/workflows that zipx already owns (ci.yml, the companions) are refused. |
zipxCoverageWorkflow | Option[CoverageWorkflow] | ep]] = | Emit .github/workflows/zipx-coverage.yml from Coverage.workflow(triggers): coverage; testFull; coverageAggregate on CoverageTrigger.Scheduled / Dispatch / PrLabel, restoring the build cache and never saving it. Default None. None deletes the companion. |
zipxPinFeeds | Seq[PinFeed] | ep]] = | Pin feeds zipx orchestrates (CDN/sha256 pins, later Docker/JDK). Empty by default. zipx owns Ignore/Report/Update policy and OSV; inventory is catalog Pin vals. See Pin feeds. |
zipxPinPrGate | PinPrGate | ep]] = | PR pin-feed advisory gate inside zipxAdvisoryCheck: All (default), Introduced (new or version-changed vs the PR base), or Off (skip pin OSV; ZipxVerify.advisories Skip turns the whole job off). |
zipxPreRelease | PreRelease | ep]] = | Whether zipxDepUpdate / zipxPinUpdate may list pre-releases (2.1.0-alpha1). Skip (default) stays on the last stable; Include tracks alphas. Actions already skip GitHub prereleases. The scheduled companion uses this setting. |
zipxVersions | Seq[ZipxCoord] | ep]] = | Lib / Plugin rows collected from the ZipxVersions object (every val). Empty skips catalog generate. See Versions. |
zipxPins | Seq[Pin] | ep]] = | Pin rows collected from the ZipxVersions object (every Pin val). Inventory for zipxPinFeeds. See Pin feeds. |
zipxShips | Seq[PublishedRow] | ep]] = | Ship / ShipGroup rows collected from the ZipxVersions object. Presence is the independent-versioning flag. |
zipxModverPropagate | ModverPropagate | ep]] = | Reverse-dep bump policy across Ship rows. MatchBump (default) floors each published reverse-dep at the triggering kind, so a row re-releases when an upstream row it depends on breaks; PatchPublished patches them; Never is only the lifted+MiMa set; Custom is the whole policy. |
zipxDriftGate | DriftGate | ep]] = | Fail (default) or Warn when a row's release tag is in the clone and its sources have changed. Fail stops that row's compile and fails zipxSnapshotPublish. Warn logs and continues. Snapshot publish confirms the number on the zipxReleaseWorkflow registry (Central, GitHub Packages, CodeArtifact, or any other Maven release URL) and fails closed when that registry cannot be read. |
zipxSbt | Option[SbtVersion] | ep]] = | When set, zipx generates project/build.properties from this sbt version. |
zipxScala | Option[ScalaVersion] | ep]] = | When set with zipxCheckDeps, scalaVersion must match. |
zipxCheckDeps | Boolean | ep]] = | Fail generate/check when libraryDependencies contain a GAV that is not a Lib in zipxVersions, or when zipxScala does not match scalaVersion. |
zipxDepCleanupFail | Boolean | ep]] = | When true, zipxDepCleanup fails if the report is non-empty. Default false (doctor, not a gate). |
zipxEmitSelf | Boolean | ep]] = | When true, generated project/plugins.sbt starts with the loaded sbt-zipx GAV. Dogfood sets false (zipx is loaded from source). |
zipxPluginVersion | Option[Predef.String] | ep]] = | Override the sbt-zipx version written when zipxEmitSelf is true. Scripted sets this via -Dplugin.version; dogfood leaves it empty. |
zipxSelfPlugins | Seq[Plugin] | ep]] = | Loaded sbt plugins (besides sbt-zipx) that generate writes into project/plugins.sbt from the classpath version. A plugin that sits on zipx appends with ZipxSelf.emit. See Extending Versions. |
zipxVersionsFile | String | ep]] = | Catalog source zipxDepUpdate and zipxPinUpdate rewrite (default project/ZipxVersions.scala). |
zipxWorkflowDispatch | Boolean | ep]] = | Emit on.workflow_dispatch so the workflow can be run manually (default false). |
zipxCache | CacheBackend | ep]] = | Cache backend: LocalDir (default), BazelRemoteSidecar, or ManagedRemote. |
zipxCacheEpoch | CacheEpoch | ep]] = | LocalDir cache epoch strategy: CacheEpoch.ShipCatalog when the catalog has Ship rows, else CacheEpoch.GitTags. |
zipxPushBranches | Seq[Predef.String] | ep]] = | Branches whose pushes trigger CI. |
zipxReleaseTagPattern | String | ep]] = | Tag glob that gates publishing. |
zipxAffectedOnPR | Boolean | ep]] = | Whether Verify jobs run only for affected modules on PRs (default true). |
zipxAffectedOnPush | Boolean | ep]] = | Also restrict pushes to modules changed since this workflow's last successful push run on the branch (default false). The job calls gh. With zipxSbtImage, Pin("sbt-image", "gh", "<x.y.z>") bakes that client. Without the image the runner already has it. |
zipxAffectedPublish | Boolean | ep]] = | Also affected-gate Graph-scope Publish jobs, so one changed module does not rebuild every image (default false; release tags always publish everything). Separate from zipxAffectedOnPR because under-verifying is silently unsafe while under-publishing is loudly broken. |
zipxAffectedDeploy | Boolean | ep]] = | Also affected-gate Graph-scope Deploy jobs, so a deploy skips exactly when the publish it consumes did (default false; release tags always deploy everything). Separate from zipxAffectedPublish because narrowing image pushes while still reconciling every destination is a legitimate combination. |
zipxSkipMergedPrPush | Boolean | ep]] = | Skip Verify on branch pushes when the commit already belongs to a merged PR (default true). |
zipxCacheRehydrateOnMerge | Boolean | ep]] = | On merged-PR pushes (when skipMergedPrPush skips Verify), run a minimal LocalDir cache-rehydrate job so the default branch gets an actions/cache save for later PRs (default true; inert for remote caches). |
zipxCacheRehydrateTask | SbtCommand | ep]] = | sbt command for the cache-rehydrate job (default Test/compile, so the next PR's test job restores test classes too). Not full Verify. |
zipxCacheRehydrateExtraSteps | StepContext => List[Step] | ep]] = | Optional steps on cache-rehydrate after LocalDir restore and before the rehydrate task (default empty). Not copied from Verify capabilities. |
zipxCacheRehydrateEnv | Map[Predef.String, EnvValue] | ep]] = | Optional env for the cache-rehydrate job only (default empty). Overlay on zipxEnv. |
zipxEnv | Map[Predef.String, EnvValue] | ep]] = | Build-wide job env for normal generated jobs (default empty). Capability/target env overlay this. Omitted on workflow_call callers. Every generated sbt job also sets COURSIER_TTL=0s, and that key wins over this map. |
zipxAgentEnv | CloudAgent | ep]] = | Render a Cursor cloud agent environment from this build (default off). ZipxAgentEnv.cursor(docker = true) installs and starts Docker. Writes .cursor/environment.json, .cursor/Dockerfile, and .github/zipx-agent/install.sh. With zipxSbtImage the Dockerfile is the public sbt image plus a static dockerd, and the Ubuntu agent pins are unused. Without it the Dockerfile is Ubuntu and Docker CE comes from apt. Secret checks are Cursor Runtime Secrets: a Build Secret is not visible to sbt. |
zipxSbtImage | Boolean | ep]] = | Run sbt jobs in the pinned sbtscala/scala-sbt light image (default false). The cloud agent builds from that public pin and does not pull the published ghcr.io tag. The sbt-image feed moves the JDK-qualified tag and its manifest digest. Node, cs, the Docker CLI, and gh are baked into ghcr.io///zipx-env when CI needs them. LocalDir actions/cache stays outside the image. Opt in after the first containerized run, which misses every cache entry saved under /home/runner. |
zipxSbtImageLayers | Seq[SbtImageLayer] | ep]] = | Steps and ENV appended to the derived sbt image (default empty). Each entry is a Pin("sbt-image", id, "x.y.z") plus a pure install function of that version and the CPU architecture. Paths stay off /home/sbtuser. zipx does not bake a tool it has not been given. Refused while zipxSbtImage is false. |
zipxCancelSupersededRuns | Boolean | ep]] = | Emit workflow concurrency so a new push cancels an in-flight run on the same ref (default true). Release-tag runs are never cancelled. |
zipxCheckCommandNames | Boolean | ep]] = | Fail zipxWorkflowGenerate when a declared sbt command name is unknown (default true). |
zipxVerifyClean | VerifyClean | ep]] = | Optional clean/cleanFull prepended to every Verify sbt command (default None). |
zipxVerifyCleanLabel | Option[Predef.String] | ep]] = | When zipxVerifyClean is None, prepend cleanFull on PRs that have this label (default Some("clean")). None disables. Does not skip the LocalDir restore. |
zipxCachePurgeLabel | Option[Predef.String] | ep]] = | On a pull_request payload with this label (default Some("purge")), sbt jobs skip the LocalDir restore and a save owner still saves a fresh snapshot. None disables. |
zipxDeployTrigger | DeployTrigger | ep]] = | OnMerge (default) keeps image pushes and deploys in ci.yml. Manual(images = "zipx-images") moves them to a dispatched .github/workflows/zipx-deploy.yml with modules (changed / all / one), target (choose, a target, or a Target.group), and sha inputs. DeployTrigger.staged(deployLabel, skipLabel) runs the same workflow on every merge and on PRs carrying deployLabel, for DeployStage.PreProduction targets only; production deploys only from a dispatch on the default branch. |
Fail (default) or Warn when a row's release tag is in the clone and its sources have changed. Fail stops that row's compile and fails zipxSnapshotPublish. Warn logs and continues. Snapshot publish confirms the number on the zipxReleaseWorkflow registry (Central, GitHub Packages, CodeArtifact, or any other Maven release URL) and fails closed when that registry cannot be read.
ZipxSettings.driftGate.description: StringFail (default) or Warn when a row's release tag is in the clone and its sources have changed. Fail stops that row's compile and fails zipxSnapshotPublish. Warn logs and continues. Snapshot publish confirms the number on the zipxReleaseWorkflow registry (Central, GitHub Packages, CodeArtifact, or any other Maven release URL) and fails closed when that registry cannot be read.Per-project
| Setting | Type | Default | Purpose |
|---|---|---|---|
zipxCiRelevant | Boolean | true (false for aggregators) | Whether this module participates in the CI test fan-out. |
zipxPublish | Option[Boolean] | from publish / skip (+ publishArtifact) | Force publish on/off; None (default) derives it from publish/skip. |
zipxDocker | Boolean | from DockerPlugin | Whether this module publishes a docker image via Docker/publish (default false). |
zipxTestTask | SbtCommand | ep]] = | sbt command for Verify: Aggregate root and Graph/Layer per-module (plugin default: testFull). |
zipxPublishTask | SbtCommand | ep]] = | sbt command used to publish this module (plugin default: publish). |
zipxMatrixRoot | Option[ModuleId] | ep]] = | Override the inferred matrix root for this project (Scala-version axes, unusual layouts). Default None. |
zipxImageRefs | Seq[Predef.String] | ep]] = | This module's image references, as (Docker / dockerAliases).value.map(_.toString). zipx-deploy.yml checks each with docker manifest inspect and pushes only when one is missing. Required on image modules under DeployTrigger.Manual. |
The catalog types these as SbtCommand (same as ModuleNode / PlanConfig). The plugin exposes
settingKey[SbtCommand] (zipxTestTask, zipxPublishTask, zipxCacheRehydrateTask). Prefer zipxTasks /
cmd"…" so a renamed task fails at load. See Validation.
By default a module is in the publish graph when it is not an aggregator, publish / skip is false, and
publishArtifact is true. Prefer publish / skip := true for non-publishers; set zipxPublish := Some(false/true)
only to override that derivation.
Capability model
Capability fields: name (a CapabilityName), phase, ordering, gate, participates, command, matrixed,
targets, needsCapabilities (List[CapabilityName]), permissions, runsOn, extraSteps, scope
(Aggregate / Layer / Graph / Once),
env, workflowCall, condition (Option[JobCondition], default None; prefer withCondition(...) to set, or
andCondition(...) to layer onto packs that already ship a condition). Compose with JobCondition && / || / !.
extraSteps is a Steps bundle rather than a hand-written lambda: build steps with Step.run(script) /
Step.uses(pin), bodies with the shell AST, and ${{ … }} values with Expr. Bundles compose with ++ and gate
with .when(...). withExtraSteps replaces; plusExtraSteps / dropExtraSteps(name) layer onto a pack that already
filled the field. See Shell and steps.
Constructors: Capability.test / .testJoined / .publish / .docker, .*Layers, .*Graph, .deploy /
.deployGraph, .custom, .once. Packs: ZipxCentral.*, ZipxGitHubPackages.*,
ZipxDocs.pages. A Target is
(name, environment, env, condition) with typed EnvValues and JobCondition.
CapabilityName and TargetName are validated wrappers, not aliases for String: joined with - they are the
jobs.<job_id> key GitHub sees, so a space or a / in one used to produce a workflow that failed on push. A literal
is checked where you write it, CapabilityName("docker-stg"), and the built-in names are available as
Capability.TestName / .FmtName / .WorkflowCheckName / .AdvisoriesName / .PublishName / .DockerName /
.DeployName / .PinCheckName / .ModverCheckName / .ModverSuggestName for needsCapabilities. What a combination of
fields cannot be checked at a literal (needsCapabilities cycles, workflowCall beside services, a never-true if:)
is checked at zipxWorkflowGenerate; see Validation.
Job env merge: zipxEnv → cache
backend → capability → target (zipxCacheRehydrateEnv overlays zipxEnv on rehydrate only). Every generated sbt job
sets COURSIER_TTL=0s on that map, and that key wins over zipxEnv. zipxEnv is omitted on reusable-workflow caller
jobs (workflowCall / uses:). See Job conditions for recipes (fork gate, PR-label stage ECR, multi-publish, docs
on dispatch).
Tasks
| Task | Purpose |
|---|---|
zipxCatalogGenerate | Write project/plugins.sbt, project/build.properties, project/zipx-ci.env, and .github/actions composites. Does not write .github/workflows. |
zipxWorkflowGenerate | Generate the GitHub Actions workflow YAML from the build graph. |
zipxWorkflowCheck | Verify the checked-in workflow matches what the build would generate. |
zipxAgentEnvGenerate | Write the cloud agent environment, or delete it when zipxAgentEnv is off. zipxWorkflowGenerate does this too. The version-updates companion runs it after zipxPinUpdate so a pin bump refreshes the Dockerfile without rewriting ci.yml. |
zipxSbtEnvGenerate | Write .github/zipx-env/Dockerfile when zipxSbtImage bakes tools, or delete a generated Dockerfile when the upstream image is enough. zipxWorkflowGenerate does this too. The pin companions run it after applying pins. ci.yml still needs a human zipxWorkflowGenerate: the companion does not push repo-root workflow YAML. |
zipxAdvisoryCheck | OSV on catalog Libs, Action pins, and Pin vals. Fails on findings at or above min-severity. See Verify. |
zipxGraph | Print the resolved module graph and topological layers. |
zipxDepCleanup | Doctor: selected catalog Libs that the Maven graph already pulls. Prints val names. Does not rewrite ZipxVersions. |
zipxPublishOrder | Print the dependency-ordered publish layers (contracted publish chain). |
zipxAffectedModules | Print, as a JSON array, the modules affected by changes since the given git base ref. |
zipxDeployPlan | zipx-deploy.yml's resolve step: reads the dispatch inputs and each Environment's last deploys, and writes the plan to target/zipx-deploy/. |
zipxImageMissing | Per module: writes true to target/zipx-image-missing when some zipxImageRefs tag is not in its registry. |
zipxPinCheck | Scheduled pin-feed check: outdated lookup plus OSV. Applies under PinAction.Update. Non-zero exit on Report findings. |
zipxPinCheckPr | PR pin-check: OSV on current inventory (Introduced diffs vs ZIPX_PIN_BASE_SHA). Never applies or submits a snapshot. |
zipxPinSubmit | Submit a GitHub dependency snapshot for feeds with submitSnapshot. Default-branch companion only. |
zipxPinInventory | Write target/zipx-pin-inventory.json of current pin-feed inventory (used by Introduced at the PR base SHA). |
zipxPinUpdate | Local outdated pin bumps with approval: lists candidates from zipxPins, rewrites Pin constructors in zipxVersionsFile after yes, then optional feed materialize. dry-run lists only. Ignores PinAction so alert-only feeds can still bump before a PR. The scheduled companion runs this with yes. |
zipxDepUpdate | Local catalog bumps with approval: Coursier/Maven lookup of zipxVersions, rewrite of zipxVersionsFile after yes (or an interactive y). dry-run lists only. A commit pin or -SNAPSHOT pointer is not moved to a newer release; the log names zipxPinRelease when that line is on the registry. The scheduled companion runs this with yes. |
zipxActionUpdate | Local Action pin bumps: GitHub releases + SHA peel + OSV. Rewrites Action constructors after yes. dry-run lists only. The scheduled companion runs this with yes. |
zipxSnapshotStatus | Read the -SNAPSHOT pointer and say whether a catalog pin is current, newer, deleted (snapshots are kept 90 days), or a local build. One artifact name, group:artifact, or no arguments for every snapshot pin. Does not rewrite the pin. |
zipxSnapshotAdvance | Rewrite a commit pin to the sha in the pointer. One artifact name, group:artifact, or no arguments for every commit pin. A dirty pin is refused. Does not run during update, and does not commit. |
zipxReleasePlan | Print which ships can release and which snapshot pins block them. Uploads nothing. No arguments, or all, is every unreleased ship: all refuses when any of them is blocked. A ship name limits the report. shadow prints the post-release paragraph from target/zipx-release-tags.txt. |
zipxPinRelease | Rewrite a commit pin to its own release line after that line is on the release repository. Refuses a missing release, a dirty pin, and a pin that is already a release. Does not jump to a newer line. |
zipxModverBump | Rewrite Ship / ShipGroup versions in zipxVersionsFile. No args, or a kind alone, opens every row the release registry already has, at patch unless a kind is named. A ship id rewrites that row even when it is not released. Does not run MiMa. |
zipxModverCompat | Compile the lifted bump set, run MiMa, write target/zipx-modver-report.json. Fail closed on a missing diff. |
zipxModverCheck | Fail closed on a missing or undersized Ship bump. Reads the min-bump report after zipxModverCompat. |
zipxReleaseDrift | Released rows with changes since their release tag: each publishes no snapshot until its number moves. |
zipxModverSuggest | Sticky PR comment with suggested Ship / ShipGroup constructors. Best-effort on forks. |
Action pins
SHA pins for generated uses: lines. Full guide: Action pins.
Resolve order: leftover .github/zipx/action-pins.yml fails generate (paste Action vals). Else explicit
zipxActions (≠ Defaults) wins. Else jar ActionPins.Defaults overlaid with catalog Action rows.
zipxActionUpdate looks up GitHub releases, peels a SHA, and rewrites constructors. YAML is jar/generate output,
not an input. A github-actions Dependabot ecosystem is not needed.
Pin feeds
Pins Dependabot never sees (CDN + sha256, tarball tags, vendor files). Full guide: Pin feeds.
zipxPinFeeds registers lookup and policy; inventory is catalog Pin vals (zipxPins). zipxPinPrGate is All /
Introduced / Off (Off skips pin OSV inside zipxAdvisoryCheck). Pin OSV folds into the builtin advisories job.
Scheduled apply and snapshot submit are companion workflows, not ci.yml. Local zipxPinUpdate lists outdated pins
and rewrites Pin(...) after approval (yes, or an interactive y), including alert-only feeds. Then you commit
and open the PR.
Versions catalog
Typed inbound Lib / Plugin / Pin / Action vals, plus optional outbound Ship / ShipGroup vals. You extend
ZipxVersions and call MyVersions.settings, which collects every val. You do not maintain a coords list. Excludes
(.excluding) live on the row, not at the libraryDependencies use site. Loaded plugins that emit themselves
(zipxSelfPlugins) write their own plugins.sbt line; your Plugin vals are the rest. Full guide: Versions.
Outbound versions: Independent versions. Plugin authors: Extending Versions.
settings sets scalaVersion and the catalog keys. zipxCheckDeps fails generate when libraryDependencies contain a
GAV that is not a Lib row. zipxCatalogGenerate writes project/plugins.sbt, project/build.properties,
project/zipx-ci.env, and composites; zipxWorkflowGenerate also writes workflow YAML. Local
zipxDepUpdate / zipxPinUpdate / zipxActionUpdate rewrite constructors in zipxVersionsFile. The scheduled companion
(zipxVersionUpdates, default true) launches zipx-cli (catalog update --yes --verify-load), then
zipxPinUpdate / zipxAgentEnvGenerate / zipxSbtEnvGenerate / zipxCatalogGenerate, and opens zipx/version-updates-$GITHUB_RUN_ID labeled clean.
Locally you can still apply, then reload and zipxCatalogGenerate so plugins.sbt / build.properties match.