A cats-effect IO port of sbt-release for sbt, with composable error handling and resource safety.
Start with the plugin-specific onboarding guides:
- Single-project builds: docs/core/getting-started.md
- Monorepos: docs/monorepo/getting-started.md
- Full docs index: docs/README.md
| Module | Artifact | README | Description |
|---|---|---|---|
| core | sbt-release-io |
docs/core | IO-based release plugin for single-project builds. Independent codebase porting sbt-release onto cats-effect IO with Resource lifecycle, cross-build validation, and typed context threading. |
| monorepo | sbt-release-io-monorepo |
docs/monorepo | Monorepo extension with per-project versioning, git-based change detection, topological ordering, per-project failure isolation, and per-project tags. |
Install in project/plugins.sbt:
addSbtPlugin("io.github.scalauser12" % "sbt-release-io" % "0.9.0")The plugin activates automatically. Add version.sbt with ThisBuild / version := "0.1.0-SNAPSHOT".
First command:
sbt "releaseIO check with-defaults"Read next:
Install in project/plugins.sbt:
addSbtPlugin("io.github.scalauser12" % "sbt-release-io-monorepo" % "0.9.0")In build.sbt:
lazy val root = (project in file("."))
.aggregate(core, api)
.enablePlugins(MonorepoReleasePlugin)By default, each subproject needs its own version.sbt containing version := "0.1.0-SNAPSHOT".
First command:
sbt "releaseIOMonorepo check with-defaults"Read next:
For routine customization, prefer the grouped hook/policy settings
(releaseIOPolicy*, releaseIOHooks*, releaseIOMonorepoPolicy*,
releaseIOMonorepoHooks*) and leave the built-in process intact. For shared-resource or advanced
integration work, use custom plugins built around the hook and resource-hook APIs. The older flat
key names and lower-level step DSLs were removed in the breaking API cleanup; raw process override
is no longer part of the supported public surface.
For local rehearsal recipes, see docs/core/recipes.md and docs/monorepo/recipes.md. For rollback and recovery, see docs/core/operations.md and docs/monorepo/operations.md.
sbt compile # compile both modules
sbt test # run unit tests (MUnit)
sbt -Dsbt.version=2.0.0-RC9 compile # compile on sbt 2 / Scala 3 (version defined as Sbt2Version in build.sbt)
sbt -Dsbt.version=2.0.0-RC9 test # run unit tests on sbt 2 / Scala 3
./bin/sbt2-clean test # same sbt 2 test lane from a clean tracked snapshot (ignores local Metals/Bloop files)
./bin/sbt2-clean core/scripted
./bin/sbt2-clean monorepo/scripted
sbt scripted # run all scripted integration tests
sbt core/test # core unit tests only
sbt monorepo/test # monorepo unit tests only
sbt scalafmtAll # format Scala sources
sbt scalafmtSbt # format .sbt and project/*.scala build files
sbt scalafmtCheckAll # verify Scala source formatting
sbt scalafmtSbtCheck # verify sbt/build file formattingUse ./bin/sbt2-clean ... for local sbt 2 verification if your checkout has generated IDE files such
as project/metals.sbt or .bloop/. CI runs on a clean checkout and can use plain
sbt -Dsbt.version=2.0.0-RC9 ....
- sbt: 1.12.3 and 2.0.0-RC9
- Scala: 2.12 (sbt 1) / Scala 3 (sbt 2) — plugin compile targets, not constraints on your project's Scala version
- cats-effect: 3.7.0
- VCS: Git only
This project is licensed under the Apache License 2.0.
Ports sbt-release by the sbt organization onto cats-effect IO.
Developed with the assistance of Claude Code by Anthropic.