import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.api.artifacts.ConfigurationContainer plugins { alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.shadow) } kotlin { jvmToolchain(21) // Suppress Beta-предупреждения от expect/actual объектов — фича стабильна с Kotlin 1.9, // но компилятор всё ещё требует -Xexpect-actual-classes, чтобы не ныть. compilerOptions { freeCompilerArgs.add("-Xexpect-actual-classes") } // "Все возможные цели сборки": jvm + весь натив. Зеркалит набор :server/:proto. // commonMain зависит только от :proto (KMP). jvmMain подключает :client (JVM-only) // и JLine — там же и `:client`'s AgentClient. nativeMain пока получает stub actual, // расширять будем через ktor-client-* {curl,darwin,winhttp} когда дойдёт очередь. jvm() macosX64() macosArm64() iosX64() iosArm64() iosSimulatorArm64() linuxX64() linuxArm64() mingwX64() sourceSets { commonMain.dependencies { implementation(project(":proto")) implementation(libs.kotlinx.coroutines.core) implementation(libs.kotlinx.serialization.core) implementation(libs.kotlinx.serialization.json) } jvmMain.dependencies { // :client JVM-only (ktor-cio). Подключаем только в jvmMain. implementation(project(":client")) // JLine для readline с историей и completion. implementation(libs.jline) } commonTest.dependencies { implementation(kotlin("test")) implementation(libs.kotlinx.coroutines.core) // runTest { } — suspend test runner для commonTest. implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.11.0") } jvmTest.dependencies { // JUnit нужен в jvmTest — kotlin-test на JVM = JUnit4. implementation("junit:junit:4.13.2") } } @OptIn(ExperimentalKotlinGradlePluginApi::class) jvm { binaries { executable { mainClass.set("pw.binom.agentik.cli.MainKt") } } } } // --- Fatjar (uberjar) --- // // По аналогии с :standalone: shadowJar берёт `jvmJar` + `jvmRuntimeClasspath`. // Shadow 8.x не авторегистрирует shadowJar в KMP-проектах — нужно явно register. val shadowJarTask = tasks.register("shadowJar") { archiveBaseName.set("agentik-cli") archiveClassifier.set("all") description = "Self-contained fatjar with all runtime dependencies bundled." group = "build" from(tasks.named("jvmJar")) val cc = try { @Suppress("UNCHECKED_CAST") configurations as org.gradle.api.artifacts.ConfigurationContainer } catch (_: ClassCastException) { @Suppress("UNCHECKED_CAST") (project as org.gradle.api.Project).configurations as org.gradle.api.artifacts.ConfigurationContainer } from(cc.getByName("jvmRuntimeClasspath")) mergeServiceFiles() duplicatesStrategy = DuplicatesStrategy.EXCLUDE manifest { attributes["Main-Class"] = "pw.binom.agentik.cli.MainKt" attributes["Implementation-Title"] = "agentik-cli" attributes["Implementation-Version"] = project.version.toString() } includeEmptyDirs = false }