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] | tesExtr | Custom capabilities (same name replaces built-in). |
zipxWorkflowName | WorkflowName | tesExtr | Name of the generated GitHub Actions workflow. |
zipxWorkflowPath | String | tesExtr | Workflow file path relative to the build root (default .github/workflows/ci.yml). |
zipxJavaVersion | JdkVersion | tesExtr | JDK major version for the CI matrix and cache key. |
zipxRunnerOs | RunnerOs | tesExtr | GitHub Actions runner label (default ubuntu-latest). |
zipxScalaMatrix | Boolean | tesExtr | Expand a per-module Scala matrix over crossScalaVersions (Graph test only). |
zipxMatrixCollapse | Map[CapabilityName, MatrixCollapse] | tesExtr | Per-capability MatrixCollapse defaults (Auto / Off / Strict / Coarse). Capability.withMatrixCollapse overrides. Empty = Auto. |
zipxActions | ActionPins | tesExtr | Hash-pinned GitHub Actions. Override for one-offs; catalog Action vals overlay jar Defaults. See Action pins. |
zipxActionsPath | String | tesExtr | Legacy pin YAML path. If this file exists, generate fails (paste Action vals). Not an input. |
zipxActionRows | Seq[Action] | tesExtr | Action rows collected from the ZipxVersions object (every Action val). Overlay onto ActionPins.Defaults. |
zipxVerify | ZipxVerify | tesExtr | Parallel Verify gates: fmt, workflow-check, advisories. Default Strict (all On). Skip(reason) still emits the job. |
zipxLeftoverSteward | LeftoverOpt | tesExtr | 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 | tesExtr | Emit .github/workflows/zipx-version-updates.yml: schedule plus dispatch, cs launch zipx-cli catalog update --yes --verify-load, then zipxPinUpdate / 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 | tesExtr | Cron for zipx-version-updates.yml. Default Sunday 00:00 UTC. Use Cron.daily / Cron.weekly / Cron.raw. |
zipxVersionUpdatesPreSteps | Seq[Step] | tesExtr | 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] | tesExtr | 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. |
zipxPinFeeds | Seq[PinFeed] | tesExtr | 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 | tesExtr | 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 | tesExtr | 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] | tesExtr | Lib / Plugin rows collected from the ZipxVersions object (every val). Empty skips catalog generate. See Versions. |
zipxPins | Seq[Pin] | tesExtr | Pin rows collected from the ZipxVersions object (every Pin val). Inventory for zipxPinFeeds. See Pin feeds. |
zipxShips | Seq[PublishedRow] | tesExtr | Ship / ShipGroup rows collected from the ZipxVersions object. Presence is the independent-versioning flag. |
zipxModverPropagate | ModverPropagate | tesExtr | Reverse-dep bump policy across Ship groups. Never (default) is the lifted+MiMa set; PatchPublished patches published reverse-deps; MatchBump floors them at the triggering kind; Custom is the whole policy. |
zipxSbt | Option[SbtVersion] | tesExtr | When set, zipx generates project/build.properties from this sbt version. |
zipxScala | Option[ScalaVersion] | tesExtr | When set with zipxCheckDeps, scalaVersion must match. |
zipxCheckDeps | Boolean | tesExtr | Fail generate/check when libraryDependencies contain a GAV that is not a Lib in zipxVersions, or when zipxScala does not match scalaVersion. |
zipxDepCleanupFail | Boolean | tesExtr | When true, zipxDepCleanup fails if the report is non-empty. Default false (doctor, not a gate). |
zipxEmitSelf | Boolean | tesExtr | 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] | tesExtr | Override the sbt-zipx version written when zipxEmitSelf is true. Scripted sets this via -Dplugin.version; dogfood leaves it empty. |
zipxSelfPlugins | Seq[Plugin] | tesExtr | 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 | tesExtr | Catalog source zipxDepUpdate and zipxPinUpdate rewrite (default project/ZipxVersions.scala). |
zipxWorkflowDispatch | Boolean | tesExtr | Emit on.workflow_dispatch so the workflow can be run manually (default false). |
zipxCache | CacheBackend | tesExtr | Cache backend: LocalDir (default), BazelRemoteSidecar, or ManagedRemote. |
zipxCacheEpoch | CacheEpoch | tesExtr | LocalDir cache epoch strategy (default CacheEpoch.GitTags). Use CacheEpoch.Fixed(version.value) to bake at generate time. |
zipxPushBranches | Seq[Predef.String] | tesExtr | Branches whose pushes trigger CI. |
zipxReleaseTagPattern | String | tesExtr | Tag glob that gates publishing. |
zipxAffectedOnPR | Boolean | tesExtr | Whether Verify jobs run only for affected modules on PRs (default true). |
zipxAffectedOnPush | Boolean | tesExtr | Also restrict pushes to affected modules via the before-sha diff (default false). |
zipxAffectedPublish | Boolean | tesExtr | 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 | tesExtr | 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 | tesExtr | Skip Verify on branch pushes when the commit already belongs to a merged PR (default true). |
zipxCacheRehydrateOnMerge | Boolean | tesExtr | 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 | tesExtr | sbt command for the cache-rehydrate job (default compile). Not full Verify. |
zipxCacheRehydrateExtraSteps | StepContext => List[Step] | tesExtr | 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] | tesExtr | Optional env for the cache-rehydrate job only (default empty). Overlay on zipxEnv. |
zipxEnv | Map[Predef.String, EnvValue] | tesExtr | Build-wide job env for normal generated jobs (default empty). Capability/target env overlay this. Omitted on workflow_call callers. |
zipxCancelSupersededRuns | Boolean | tesExtr | 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 | tesExtr | Fail zipxWorkflowGenerate when a declared sbt command name is unknown (default true). |
zipxVerifyClean | VerifyClean | tesExtr | Optional clean/cleanFull prepended to every Verify sbt command (default None). |
zipxVerifyCleanLabel | Option[Predef.String] | tesExtr | When zipxVerifyClean is None, prepend cleanFull on PRs that have this label (default Some("clean")). None disables. One-off cache bust. |
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 | tesExtr | sbt command for Verify: Aggregate root and Graph/Layer per-module (plugin default: testFull). |
zipxPublishTask | SbtCommand | tesExtr | sbt command used to publish this module (plugin default: publish). |
zipxMatrixRoot | Option[ModuleId] | tesExtr | Override the inferred matrix root for this project (Scala-version axes, unusual layouts). Default None. |
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.*, ZipxModver.publish, 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). 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. |
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. |
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. 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. |
zipxModverBump | Rewrite a Ship / ShipGroup version in zipxVersionsFile. Default patch. Identity is a project id or group name. Never writes -ci. |
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. |
zipxModverSuggest | Sticky PR comment with suggested Ship / ShipGroup constructors. Best-effort on forks. |
zipxModverPublishModules | Write target/zipx-modver-publish.json (missing binaries) and target/zipx-modver-modules.json (id array). Fail closed. Empty arg is registry-only. |
zipxModverPublishSigned | Publish this scalaBinaryVersion only when it is in the module's missing list from zipxModverPublishModules. |
zipxModverPublishMoved | Publish every id in target/zipx-modver-modules.json, in zipxPublishOrder, in this sbt session. Missing JSON fails closed. |
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 / 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.