initial: Kotlin/Gradle skeleton for cloud-installer
CI / build (push) Failing after 24s
CI / release (push) Has been skipped

Compiles to a 3.4 MB fat jar via shadow plugin.
Entrypoint with CLI dispatch (pull/push subcommands) + FlatLaf init.
Real sync logic stubbed; lands in subsequent commits per task plan.

Build via containerized gradle (8.10.2 + jdk21) to sidestep the
Kotlin 2.1 + JDK 26 compiler crash. Documented in README.

CI workflow tags-only release artifact upload prepared (needs
RELEASE_TOKEN secret in repo settings before first tag).
This commit is contained in:
2026-06-02 20:16:40 +02:00
commit 6ab43a168e
16 changed files with 817 additions and 0 deletions
+61
View File
@@ -0,0 +1,61 @@
plugins {
kotlin("jvm") version "2.1.0"
kotlin("plugin.serialization") version "2.1.0"
id("com.gradleup.shadow") version "8.3.5"
application
}
group = "center.timemachine.cloud"
version = "0.1.0"
repositories {
mavenCentral()
}
dependencies {
// FlatLaf gives us an IntelliJ-style dark theme on Swing —
// closest visual match to Prism Launcher's Qt look in pure Java.
implementation("com.formdev:flatlaf:3.5.4")
implementation("com.formdev:flatlaf-intellij-themes:3.5.4")
// JSON via Kotlin's official lib; supports kotlin data classes natively.
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
testImplementation(kotlin("test"))
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2")
}
// Target Java 17 bytecode using whatever JDK is installed locally (we
// require >= 17). Avoids the Gradle toolchain auto-provisioning dance,
// at the cost of needing a manual JDK 17+ on dev machines and CI runners.
kotlin {
compilerOptions {
jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17)
}
}
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
application {
mainClass.set("center.timemachine.cloud.MainKt")
}
tasks.test {
useJUnitPlatform()
}
tasks.shadowJar {
archiveBaseName.set("cloud-installer")
archiveClassifier.set("")
archiveVersion.set(project.version.toString())
mergeServiceFiles()
}
// Defer to shadowJar for the canonical artifact; the default 'jar' task
// produces a thin jar without dependencies which would be useless to ship.
tasks.jar {
enabled = false
}