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

SettingTypeDefaultPurpose
zipxCapabilitiesSeq[Capability]tesExtrCustom capabilities (same name replaces built-in).
zipxWorkflowNameWorkflowNametesExtrName of the generated GitHub Actions workflow.
zipxWorkflowPathStringtesExtrWorkflow file path relative to the build root (default .github/workflows/ci.yml).
zipxJavaVersionJdkVersiontesExtrJDK major version for the CI matrix and cache key.
zipxRunnerOsRunnerOstesExtrGitHub Actions runner label (default ubuntu-latest).
zipxScalaMatrixBooleantesExtrExpand a per-module Scala matrix over crossScalaVersions (Graph test only).
zipxMatrixCollapseMap[CapabilityName, MatrixCollapse]tesExtrPer-capability MatrixCollapse defaults (Auto / Off / Strict / Coarse). Capability.withMatrixCollapse overrides. Empty = Auto.
zipxActionsActionPinstesExtrHash-pinned GitHub Actions. Override for one-offs; catalog Action vals overlay jar Defaults. See Action pins.
zipxActionsPathStringtesExtrLegacy pin YAML path. If this file exists, generate fails (paste Action vals). Not an input.
zipxActionRowsSeq[Action]tesExtrAction rows collected from the ZipxVersions object (every Action val). Overlay onto ActionPins.Defaults.
zipxVerifyZipxVerifytesExtrParallel Verify gates: fmt, workflow-check, advisories. Default Strict (all On). Skip(reason) still emits the job.
zipxLeftoverStewardLeftoverOpttesExtrIf zipx-scala-steward.yml is on disk: Fail generate/check (default) or Warn(reason). The replacement is zipx-version-updates.yml (zipxVersionUpdates).
zipxVersionUpdatesBooleantesExtrEmit .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.
zipxVersionUpdatesScheduleCrontesExtrCron for zipx-version-updates.yml. Default Sunday 00:00 UTC. Use Cron.daily / Cron.weekly / Cron.raw.
zipxVersionUpdatesPreStepsSeq[Step]tesExtrExtra 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.
zipxVersionUpdatesExtraStepsSeq[Step]tesExtrExtra 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.
zipxPinFeedsSeq[PinFeed]tesExtrPin 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.
zipxPinPrGatePinPrGatetesExtrPR 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).
zipxPreReleasePreReleasetesExtrWhether 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.
zipxVersionsSeq[ZipxCoord]tesExtrLib / Plugin rows collected from the ZipxVersions object (every val). Empty skips catalog generate. See Versions.
zipxPinsSeq[Pin]tesExtrPin rows collected from the ZipxVersions object (every Pin val). Inventory for zipxPinFeeds. See Pin feeds.
zipxShipsSeq[PublishedRow]tesExtrShip / ShipGroup rows collected from the ZipxVersions object. Presence is the independent-versioning flag.
zipxModverPropagateModverPropagatetesExtrReverse-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.
zipxSbtOption[SbtVersion]tesExtrWhen set, zipx generates project/build.properties from this sbt version.
zipxScalaOption[ScalaVersion]tesExtrWhen set with zipxCheckDeps, scalaVersion must match.
zipxCheckDepsBooleantesExtrFail generate/check when libraryDependencies contain a GAV that is not a Lib in zipxVersions, or when zipxScala does not match scalaVersion.
zipxDepCleanupFailBooleantesExtrWhen true, zipxDepCleanup fails if the report is non-empty. Default false (doctor, not a gate).
zipxEmitSelfBooleantesExtrWhen true, generated project/plugins.sbt starts with the loaded sbt-zipx GAV. Dogfood sets false (zipx is loaded from source).
zipxPluginVersionOption[Predef.String]tesExtrOverride the sbt-zipx version written when zipxEmitSelf is true. Scripted sets this via -Dplugin.version; dogfood leaves it empty.
zipxSelfPluginsSeq[Plugin]tesExtrLoaded 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.
zipxVersionsFileStringtesExtrCatalog source zipxDepUpdate and zipxPinUpdate rewrite (default project/ZipxVersions.scala).
zipxWorkflowDispatchBooleantesExtrEmit on.workflow_dispatch so the workflow can be run manually (default false).
zipxCacheCacheBackendtesExtrCache backend: LocalDir (default), BazelRemoteSidecar, or ManagedRemote.
zipxCacheEpochCacheEpochtesExtrLocalDir cache epoch strategy (default CacheEpoch.GitTags). Use CacheEpoch.Fixed(version.value) to bake at generate time.
zipxPushBranchesSeq[Predef.String]tesExtrBranches whose pushes trigger CI.
zipxReleaseTagPatternStringtesExtrTag glob that gates publishing.
zipxAffectedOnPRBooleantesExtrWhether Verify jobs run only for affected modules on PRs (default true).
zipxAffectedOnPushBooleantesExtrAlso restrict pushes to affected modules via the before-sha diff (default false).
zipxAffectedPublishBooleantesExtrAlso 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.
zipxAffectedDeployBooleantesExtrAlso 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.
zipxSkipMergedPrPushBooleantesExtrSkip Verify on branch pushes when the commit already belongs to a merged PR (default true).
zipxCacheRehydrateOnMergeBooleantesExtrOn 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).
zipxCacheRehydrateTaskSbtCommandtesExtrsbt command for the cache-rehydrate job (default compile). Not full Verify.
zipxCacheRehydrateExtraStepsStepContext => List[Step]tesExtrOptional steps on cache-rehydrate after LocalDir restore and before the rehydrate task (default empty). Not copied from Verify capabilities.
zipxCacheRehydrateEnvMap[Predef.String, EnvValue]tesExtrOptional env for the cache-rehydrate job only (default empty). Overlay on zipxEnv.
zipxEnvMap[Predef.String, EnvValue]tesExtrBuild-wide job env for normal generated jobs (default empty). Capability/target env overlay this. Omitted on workflow_call callers.
zipxCancelSupersededRunsBooleantesExtrEmit workflow concurrency so a new push cancels an in-flight run on the same ref (default true). Release-tag runs are never cancelled.
zipxCheckCommandNamesBooleantesExtrFail zipxWorkflowGenerate when a declared sbt command name is unknown (default true).
zipxVerifyCleanVerifyCleantesExtrOptional clean/cleanFull prepended to every Verify sbt command (default None).
zipxVerifyCleanLabelOption[Predef.String]tesExtrWhen zipxVerifyClean is None, prepend cleanFull on PRs that have this label (default Some("clean")). None disables. One-off cache bust.

Per-project

SettingTypeDefaultPurpose
zipxCiRelevantBooleantrue (false for aggregators)Whether this module participates in the CI test fan-out.
zipxPublishOption[Boolean]from publish / skip (+ publishArtifact)Force publish on/off; None (default) derives it from publish/skip.
zipxDockerBooleanfrom DockerPluginWhether this module publishes a docker image via Docker/publish (default false).
zipxTestTaskSbtCommandtesExtrsbt command for Verify: Aggregate root and Graph/Layer per-module (plugin default: testFull).
zipxPublishTaskSbtCommandtesExtrsbt command used to publish this module (plugin default: publish).
zipxMatrixRootOption[ModuleId]tesExtrOverride 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

TaskPurpose
zipxCatalogGenerateWrite project/plugins.sbt, project/build.properties, project/zipx-ci.env, and .github/actions composites. Does not write .github/workflows.
zipxWorkflowGenerateGenerate the GitHub Actions workflow YAML from the build graph.
zipxWorkflowCheckVerify the checked-in workflow matches what the build would generate.
zipxAdvisoryCheckOSV on catalog Libs, Action pins, and Pin vals. Fails on findings at or above min-severity. See Verify.
zipxGraphPrint the resolved module graph and topological layers.
zipxDepCleanupDoctor: selected catalog Libs that the Maven graph already pulls. Prints val names. Does not rewrite ZipxVersions.
zipxPublishOrderPrint the dependency-ordered publish layers (contracted publish chain).
zipxAffectedModulesPrint, as a JSON array, the modules affected by changes since the given git base ref.
zipxPinCheckScheduled pin-feed check: outdated lookup plus OSV. Applies under PinAction.Update. Non-zero exit on Report findings.
zipxPinCheckPrPR pin-check: OSV on current inventory (Introduced diffs vs ZIPX_PIN_BASE_SHA). Never applies or submits a snapshot.
zipxPinSubmitSubmit a GitHub dependency snapshot for feeds with submitSnapshot. Default-branch companion only.
zipxPinInventoryWrite target/zipx-pin-inventory.json of current pin-feed inventory (used by Introduced at the PR base SHA).
zipxPinUpdateLocal 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.
zipxDepUpdateLocal 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.
zipxActionUpdateLocal Action pin bumps: GitHub releases + SHA peel + OSV. Rewrites Action constructors after yes. dry-run lists only. The scheduled companion runs this with yes.
zipxModverBumpRewrite a Ship / ShipGroup version in zipxVersionsFile. Default patch. Identity is a project id or group name. Never writes -ci.
zipxModverCompatCompile the lifted bump set, run MiMa, write target/zipx-modver-report.json. Fail closed on a missing diff.
zipxModverCheckFail closed on a missing or undersized Ship bump. Reads the min-bump report after zipxModverCompat.
zipxModverSuggestSticky PR comment with suggested Ship / ShipGroup constructors. Best-effort on forks.
zipxModverPublishModulesWrite target/zipx-modver-publish.json (missing binaries) and target/zipx-modver-modules.json (id array). Fail closed. Empty arg is registry-only.
zipxModverPublishSignedPublish this scalaBinaryVersion only when it is in the module's missing list from zipxModverPublishModules.
zipxModverPublishMovedPublish 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.