From e49b4c408ec57084189e143cb9fa811937b670b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 15 Apr 2026 15:48:05 +0200 Subject: [PATCH 01/16] build(gradle): Create a script with Caupain to upgrade all Gradle dependencies --- gradle/upgrade-all.sh | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100755 gradle/upgrade-all.sh diff --git a/gradle/upgrade-all.sh b/gradle/upgrade-all.sh new file mode 100755 index 0000000..4a51002 --- /dev/null +++ b/gradle/upgrade-all.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env sh + +# Upgrades all Gradle dependencies +# +# Usage: +# ./gradle/upgrade-all.sh +# (from the project directory) + +caupain() { + docker run \ + --pull=always \ + --rm \ + --user="$(id -u):$(id -g)" \ + --volume="./gradle:/work" \ + --workdir="/work" \ + registry.gitlab.com/opensavvy/automation/containers/caupain:latest \ + $* +} + +caupain -i common.versions.toml --in-place --policy=always --no-cache +caupain -i libs.versions.toml --in-place --policy=always --no-cache -- 2.51.2 From 2c67decf5f3b400cbf70eefbd4ff408b350ea987 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 22 Apr 2026 14:31:42 +0200 Subject: [PATCH 02/16] ci(gitlab): Rerun macOS jobs on script_failure This is a work-around for https://gitlab.com/gitlab-org/gitlab-runner/-/work_items/39175 --- .gitlab-ci.main.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.main.kts b/.gitlab-ci.main.kts index 90ace56..da6446f 100755 --- a/.gitlab-ci.main.kts +++ b/.gitlab-ci.main.kts @@ -90,6 +90,7 @@ fun Job.nativeIosArm64() { retry(1) { onExitCode(1) + on(RetryCause.ScriptFailure) } stripUnicodeTestReports() -- 2.51.2 From 42fef8d2172b6fa942f21808582b8f39a75e836c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 22 Apr 2026 16:10:12 +0200 Subject: [PATCH 03/16] upgrade: OpenSavvy Conventions 2.3.6 --- gradle/conventions/settings.gradle.kts | 2 +- settings.gradle.kts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/conventions/settings.gradle.kts b/gradle/conventions/settings.gradle.kts index 88351f6..57d236c 100644 --- a/gradle/conventions/settings.gradle.kts +++ b/gradle/conventions/settings.gradle.kts @@ -48,7 +48,7 @@ pluginManagement { } plugins { - id("dev.opensavvy.conventions.settings") version "2.3.5" + id("dev.opensavvy.conventions.settings") version "2.3.6" } enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") diff --git a/settings.gradle.kts b/settings.gradle.kts index a15ebe1..a060929 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -55,7 +55,7 @@ pluginManagement { } plugins { - id("dev.opensavvy.conventions.settings") version "2.3.5" + id("dev.opensavvy.conventions.settings") version "2.3.6" } include( -- 2.51.2 From dfbe3c64fd209581c47ba44d2aab462d1a9d6340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 22 Apr 2026 16:21:16 +0200 Subject: [PATCH 04/16] upgrade: TestBalloon 0.8.4 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 3b68582..1fee8e7 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -17,7 +17,7 @@ compose = "1.10.2" kotest = "6.1.7" # https://github.com/infix-de/testBalloon/releases -testBalloon = "0.8.3-K2.3.0" +testBalloon = "0.8.4-K2.3.0" # https://gitlab.com/opensavvy/groundwork/pedestal/-/releases pedestal = "3.2.1" -- 2.51.2 From f0196543e81e9e7516f330d0ef34eca564d1788e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 22 Apr 2026 16:21:30 +0200 Subject: [PATCH 05/16] upgrade: Prepared 2.5.1 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 1fee8e7..838c600 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -23,7 +23,7 @@ testBalloon = "0.8.4-K2.3.0" pedestal = "3.2.1" # https://prepared.opensavvy.dev/news -prepared = "2.5.0" +prepared = "2.5.1" # https://spine.opensavvy.dev/news spine = "0.10.1" -- 2.51.2 From 8c73dcb5c738d9f4940bb4051b2de6b21f5f7057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 22 Apr 2026 16:21:39 +0200 Subject: [PATCH 06/16] upgrade: KtMongo 0.29.1 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 838c600..c320afe 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -29,7 +29,7 @@ prepared = "2.5.1" spine = "0.10.1" # https://ktmongo.opensavvy.dev/news -ktmongo = "0.28.1" +ktmongo = "0.29.1" # https://gitlab.com/opensavvy/telegram-bot/-/releases telegram-bot = "0.2.0" -- 2.51.2 From b64daf937f1ed1f7a7ead71274eaf100dd729dbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 22 Apr 2026 16:21:48 +0200 Subject: [PATCH 07/16] upgrade: Telegram Bot SDK 0.3.1 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index c320afe..2284cb2 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -32,7 +32,7 @@ spine = "0.10.1" ktmongo = "0.29.1" # https://gitlab.com/opensavvy/telegram-bot/-/releases -telegram-bot = "0.2.0" +telegram-bot = "0.3.1" # https://github.com/JetBrains/java-annotations/releases jetbrains-annotations = "26.1.0" -- 2.51.2 From 0ac3b3ae4b628d69d7de58e5b7d0a96cffb405eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 22 Apr 2026 16:21:58 +0200 Subject: [PATCH 08/16] upgrade: NodeJS 24.15.0 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 2284cb2..097f610 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -38,7 +38,7 @@ telegram-bot = "0.3.1" jetbrains-annotations = "26.1.0" # https://nodejs.org/en/download -nodejs = "24.14.0" +nodejs = "24.15.0" [plugins] kotlin = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } -- 2.51.2 From 7db0c9e61d3729ba3e8caaa3a7b946bc6e331836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 3 Jun 2026 15:42:51 +0200 Subject: [PATCH 09/16] upgrade: Kotlin 2.4.0 --- gradle/common.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 097f610..c5f1e5d 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -5,7 +5,7 @@ [versions] # https://kotlinlang.org/docs/releases.html#release-details -kotlin = "2.3.10" +kotlin = "2.4.0" # https://github.com/google/ksp/releases ksp = "2.3.6" @@ -17,7 +17,7 @@ compose = "1.10.2" kotest = "6.1.7" # https://github.com/infix-de/testBalloon/releases -testBalloon = "0.8.4-K2.3.0" +testBalloon = "0.8.4-K2.4.0" # https://gitlab.com/opensavvy/groundwork/pedestal/-/releases pedestal = "3.2.1" -- 2.51.2 From 7e344db35f7e06c9ab92f268d10aacd5a783ade0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 3 Jun 2026 15:43:14 +0200 Subject: [PATCH 10/16] upgrade: KSP 2.3.9 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index c5f1e5d..ca5e060 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -8,7 +8,7 @@ kotlin = "2.4.0" # https://github.com/google/ksp/releases -ksp = "2.3.6" +ksp = "2.3.9" # https://github.com/JetBrains/compose-multiplatform/releases compose = "1.10.2" -- 2.51.2 From 6d2fdd9f072b44e6c8834fe72ca42a8d10c2af80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 3 Jun 2026 15:43:23 +0200 Subject: [PATCH 11/16] upgrade: Compose 1.11.1 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index ca5e060..972d9fb 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -11,7 +11,7 @@ kotlin = "2.4.0" ksp = "2.3.9" # https://github.com/JetBrains/compose-multiplatform/releases -compose = "1.10.2" +compose = "1.11.1" # https://github.com/kotest/kotest/releases kotest = "6.1.7" -- 2.51.2 From f0973e61efb9e431dcfc9eb35024ffd47d56fc6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 3 Jun 2026 15:43:47 +0200 Subject: [PATCH 12/16] upgrade: Kotest 6.1.11 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 972d9fb..36b0728 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -14,7 +14,7 @@ ksp = "2.3.9" compose = "1.11.1" # https://github.com/kotest/kotest/releases -kotest = "6.1.7" +kotest = "6.1.11" # https://github.com/infix-de/testBalloon/releases testBalloon = "0.8.4-K2.4.0" -- 2.51.2 From fd18907755ac7f58a2c57723c4c1b624d5fc276b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 3 Jun 2026 15:43:57 +0200 Subject: [PATCH 13/16] upgrade: TestBalloon 1.0.0 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 36b0728..88b7b61 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -17,7 +17,7 @@ compose = "1.11.1" kotest = "6.1.11" # https://github.com/infix-de/testBalloon/releases -testBalloon = "0.8.4-K2.4.0" +testBalloon = "1.0.0-K2.4.0" # https://gitlab.com/opensavvy/groundwork/pedestal/-/releases pedestal = "3.2.1" -- 2.51.2 From 46f79f6a09531d1566733277c4dcb1743a33e2b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 3 Jun 2026 15:44:05 +0200 Subject: [PATCH 14/16] upgrade: Prepared 2.5.3 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 88b7b61..9fa882d 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -23,7 +23,7 @@ testBalloon = "1.0.0-K2.4.0" pedestal = "3.2.1" # https://prepared.opensavvy.dev/news -prepared = "2.5.1" +prepared = "2.5.3" # https://spine.opensavvy.dev/news spine = "0.10.1" -- 2.51.2 From d3ef9708c629b357b2f411f80922de1d13fdfed9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Wed, 3 Jun 2026 15:44:14 +0200 Subject: [PATCH 15/16] upgrade: KtMongo 0.30.0 --- gradle/common.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/common.versions.toml b/gradle/common.versions.toml index 9fa882d..19aa92a 100644 --- a/gradle/common.versions.toml +++ b/gradle/common.versions.toml @@ -29,7 +29,7 @@ prepared = "2.5.3" spine = "0.10.1" # https://ktmongo.opensavvy.dev/news -ktmongo = "0.29.1" +ktmongo = "0.30.0" # https://gitlab.com/opensavvy/telegram-bot/-/releases telegram-bot = "0.3.1" -- 2.51.2 From 7ea32586ecbea3c471c14f8102bf39cfe730be9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=E2=80=9CCLOVIS=E2=80=9D=20Canet?= Date: Tue, 23 Jun 2026 17:05:38 +0200 Subject: [PATCH 16/16] feat(dokka-mkdocs): Workaround for dependency resolution ambiguity This is a workaround for the following crash: * What went wrong: Execution failed for task ':website:dokkaGeneratePublicationMkdocs'. > A failure occurred while executing org.jetbrains.dokka.gradle.workers.DokkaGeneratorWorker > Conflicting overrides: [Extension: opensavvy.dokka.material.mkdocs.MaterialForMkDocsPlugin/locationProvider, Extension: org.jetbrains.dokka.allModulesPage.AllModulesPagePlugin/multimoduleLocationProvider] --- .../src/main/kotlin/DokkaMkDocsPlugin.kt | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/dokka-mkdocs/src/main/kotlin/DokkaMkDocsPlugin.kt b/dokka-mkdocs/src/main/kotlin/DokkaMkDocsPlugin.kt index e27ea99..127c988 100644 --- a/dokka-mkdocs/src/main/kotlin/DokkaMkDocsPlugin.kt +++ b/dokka-mkdocs/src/main/kotlin/DokkaMkDocsPlugin.kt @@ -1,11 +1,14 @@ package opensavvy.dokka.gradle import org.gradle.api.Project +import org.gradle.api.attributes.Attribute +import org.gradle.api.attributes.Usage import org.gradle.api.file.DuplicatesStrategy import org.gradle.api.provider.Provider import org.gradle.api.tasks.Sync import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.getValue +import org.gradle.kotlin.dsl.named import org.gradle.kotlin.dsl.provideDelegate import org.gradle.kotlin.dsl.registering import org.jetbrains.dokka.gradle.formats.DokkaFormatPlugin @@ -23,6 +26,35 @@ abstract class DokkaMkDocsPlugin : DokkaFormatPlugin(formatName = "mkdocs") { dokkaPlugin("dev.opensavvy.dokka.mkdocs:renderer:$DokkaMkDocsVersion") } + // The aggregator project applies DokkaMkDocsPlugin via the kotlin.library convention plugin. + // Adding it to dokkaMkdocsPublicationPlugin (DokkaClasspathAttribute=dokka-publication-plugins) + // causes Gradle to select the aggregator's empty dokkaMkdocsPublicationPluginApiOnlyConsumable + // variant instead of its JAR, because that variant also has dokka-publication-plugins. + // + // Fix: resolve the aggregator with DokkaClasspathAttribute=dokka-plugins. No aggregator variant + // matches dokka-plugins, so Gradle falls through to runtimeElements and returns the JAR. + val aggregatorBucket = project.configurations.create("dokkaMkdocsAggregatorPlugin~internal") { + isCanBeResolved = false + isCanBeConsumed = false + } + project.dependencies.add("dokkaMkdocsAggregatorPlugin~internal", "dev.opensavvy.dokka.mkdocs:aggregator:$DokkaMkDocsVersion") + + val aggregatorResolver = project.configurations.create("dokkaMkdocsAggregatorPluginResolver~internal") { + isCanBeResolved = true + isCanBeConsumed = false + isTransitive = false + extendsFrom(aggregatorBucket) + attributes { + attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_RUNTIME)) + attribute(Attribute.of("org.jetbrains.dokka.format", String::class.java), formatName) + attribute(Attribute.of("org.jetbrains.dokka.classpath", String::class.java), "dokka-plugins") + } + } + + dokkaTasks.generatePublication.configure { + generator.pluginsClasspath.from(aggregatorResolver) + } + moduleOutputFiles = project.layout.buildDirectory.dir("dokka/mkdocs").map { listOf(it.asFile) } } @@ -34,8 +66,8 @@ abstract class DokkaMkDocsPlugin : DokkaFormatPlugin(formatName = "mkdocs") { // "dokkaMkdocsPublicationPlugin" is used only by dokkaGeneratePublicationMkdocs, // not by the per-module dokkaGenerateModuleMkdocs task. // This prevents all-modules-page-plugin from suppressing singleGeneration in module tasks. + // (The aggregator is handled separately in configure() above to avoid a Gradle variant-selection bug.) target.dependencies.add("dokkaMkdocsPublicationPlugin", "org.jetbrains.dokka:all-modules-page-plugin:$DokkaVersion") - target.dependencies.add("dokkaMkdocsPublicationPlugin", "dev.opensavvy.dokka.mkdocs:aggregator:$DokkaMkDocsVersion") // Use the Gradle project's leaf name (e.g. "example-core") as the module path instead of // the full project path (e.g. "example/example-core"). This gives clean output URLs. -- 2.51.2