Capabilities

A capability is a pipeline stage. Built-ins default to Aggregate; Graph/Layer variants are explicit constructors. Test, publish, and docker are built-in; you can add your own (see Custom capabilities).

Built-ins

CapabilityDefault modeRunsParticipatesPhaseGate
testAggregate (Once)root zipxTestTaskwhole build (.aggregate)Verifyalways
publishAggregate+?<module>/<publishTask> (joined)modules that publishPublishrelease tag
dockerAggregate<module>/Docker/publish (joined)DockerPlugin modulesPublishrelease tag

Use testGraph / publishGraph / dockerGraph for one-job-per-module. Use *Layers for wave scheduling. Use testJoined if Aggregate must join <module>/<testTask> instead of a root task.

Phases and replace-by-name

Capabilities run Verify → Publish → Deploy. A capability can depend on another via needsCapabilities.

Path gating is Graph Verify only (zipxAffectedOnPR / zipxAffectedOnPush; fail open). Publish is OnReleaseTag today (Publish∩Affected is an open seam). Deploy is destination-driven and never path-affected.

Gate today is Always | OnReleaseTag | AffectedOnly. AffectedOnly is rejected at generate time — it is a design seam for future Publish affected-gating, not a silent Always. See Affected.

zipxCapabilities += ... merges with built-ins; the same name replaces a built-in (e.g. turn Aggregate docker into a multi-registry Graph capability).

zipxCapabilities += Capability.publish.copy(
  env = Map(
    "PGP_PASSPHRASE"    -> secret"PGP_PASSPHRASE",
    "SONATYPE_USERNAME" -> secret"SONATYPE_USERNAME",
  )
)
DocsRender.job("publish")(
  Capability.publish.copy(
    env = Map(
      "PGP_PASSPHRASE"    -> secret"PGP_PASSPHRASE",
      "SONATYPE_USERNAME" -> EnvValue.secret("SONATYPE_USERNAME"),
    )
  )
)
publish:
  name: publish
  runs-on: ubuntu-latest
  if: startsWith(github.ref, 'refs/tags/v')
  env:
    PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
    SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
  steps:
    - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
      with:
        fetch-depth: "0"
        fetch-tags: "true"
    - name: Setup JDK 21
      uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95
      with:
        distribution: temurin
        java-version: "21"
    - uses: sbt/setup-sbt@d059c39de700f4cc5cb64f9f56577315e44a984e
      with:
        disk-cache: "false"
    - name: Cache sbt
      uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
      with:
        path: |
          ~/.sbt
          ~/.cache/sbt
          ~/.cache/coursier
          target
        key: ubuntu-latest-jdk21-sbt-0.1.0-ci-${{ github.run_id }}-publish
        restore-keys: |
          ubuntu-latest-jdk21-sbt-0.1.0-ci-${{ github.run_id }}-
          ubuntu-latest-jdk21-sbt-0.1.0-ci-
          ubuntu-latest-jdk21-sbt-0.1.0-
          ubuntu-latest-jdk21-sbt-
    - name: publish
      run: sbt 'schema/publish; api/publish'

Verify knobs

Shared across Aggregate, Layer, and Graph (details on the Verify page):

zipxTestTask    := "testFull"
zipxVerifyClean := VerifyClean.CleanFull
// Aggregate → sbt 'cleanFull; testFull'
// Graph     → sbt 'cleanFull; core/testFull' (per job)