12 Commits

  • Fix iOS IPA zip path when packaging from Gradle working directory.
    Resolve release-staging to an absolute path before cd into the Payload stage.
    
    Co-authored-by: Cursor <cursoragent@cursor.com>
  • Build iOS release framework via linkReleaseFrameworkIosArm64 in CI.
    Avoid embedAndSignAppleFrameworkForXcode when Xcode env detection fails on GitHub macOS runners; stage ComposeApp.framework under xcode-frameworks manually.
    
    Co-authored-by: Cursor <cursoragent@cursor.com>
  • Fix release CI JVM artifact transfer and iOS SDK naming.
    Tar JVM build outputs for artifact upload, extract before packaging verify, derive iphoneos SDK_NAME from xcrun, and skip appimagetool permission checks on CI.
    
    Co-authored-by: Cursor <cursoragent@cursor.com>
  • Fix release iOS CI hang and JVM artifact uploads.
    Build the KMP framework with plain Gradle logs before xcodebuild, skip the Xcode Gradle script phase, and include gitignored build outputs in jvm-compile-outputs artifacts.
    
    Co-authored-by: Cursor <cursoragent@cursor.com>
  • Fix Windows taskbar icon and improve Parallels beta builds.
    Stamp AppUserModel IDs on installer shortcuts to match the desktop app, embed proper ICOs in launchers, derive beta setup names from versionName, and sync/copy helpers for the Windows VM workflow.
    
    Co-authored-by: Cursor <cursoragent@cursor.com>
  • Restore release files
    Signed-off-by: denis0001-dev <denis0001.dev@ya.ru>
  • Massive refactor and cleanup
    Signed-off-by: denis0001-dev <denis0001.dev@ya.ru>
    
    Massive refactor and cleanup #2
    
    Signed-off-by: denis0001-dev <denis0001.dev@ya.ru>
    
    Fix iOS build
    
    Signed-off-by: denis0001-dev <denis0001.dev@ya.ru>
    
    Final refactoring
    
    Signed-off-by: denis0001-dev <denis0001.dev@ya.ru>
  • Fix release ProGuard: Adoptium JDK 25 ships no jmods
    Compose Desktop's AbstractProguardTask builds ProGuard's -libraryjars by
    walking <javaHome>/jmods and nothing else. Adoptium stopped shipping the
    jmods/ directory in JDK 25 archives (verified: 0 jmods entries in both the
    linux/x64 and macOS/aarch64 Temurin 25.0.4.1 tarballs, vs 71 for Temurin
    17), so on the runners the desktop packaging JDK resolves to
    /usr/lib/jvm/temurin-25-jdk-amd64 and ProGuard gets no JDK whatsoever.
    Every class then fails to resolve java.lang.Object — 1.3M
    "can't find superclass or interface java.lang.Object" warnings, followed by
    "Please correct the above warnings first".
    
    This is why the Java 25 toolchain bump broke every release while the
    v1.2.0-beta release on the toolchain 17 build kept working, and why a local
    build with the JetBrains Runtime (which does ship jmods) succeeded while CI
    did not. ProGuard's version was never the cause; 7.10.0 was still kept
    because it is what understands this project's Kotlin 2.4 metadata.
    
    Install Zulu 25 (still ships jmods) in the desktop-proguard job and export
    it as FROMCHAT_PACKAGING_JDK; setup-java runs before Temurin 17 so JAVA_HOME
    stays on 17 for Gradle and the Android build. resolvePackagingJdkHome() now
    warns loudly when the JDK it picks has no jmods/, instead of leaving it to
    ProGuard's wall of warnings.
    
    Use setup-java's `path` output for FROMCHAT_PACKAGING_JDK
    
    setup-java@v5 names the installed JDK's location `path`, not `java-path`
    (the v4 name), so the beta4 run exported an empty value, fell back to the
    jmods-less /usr/lib/jvm/temurin-25-jdk-amd64 and failed with the same
    "can't find superclass or interface java.lang.Object" wall of warnings.
    
    The Gradle-side guard added in b0159eb correctly named the offending JDK
    in the beta4 log, which is what pointed at the empty export.
    
    Give the Linux packaging jobs a jmods-capable JDK too
    
    beta5 proved the ProGuard fix: Build JAR passed in 9m35s, and Windows
    (x64 + ARM) and macOS (arm64 + Intel) all packaged successfully. Only the
    two Linux jobs failed, at :app:desktop:createRuntimeImage — jlink exits 1
    because jlink defaults its --module-path to <javaHome>/jmods, the same
    directory ProGuard needs. So the jmods gap bites twice: ProGuard degrades
    into a wall of warnings, jlink just dies.
    
    macOS/Windows runners happen to resolve a JDK 25 that still ships jmods;
    ubuntu-latest's /usr/lib/jvm only has the jmods-less Temurin 25. Point the
    Linux jobs at Zulu 25 via the setup action's desktop-jdk input, and stop
    the packaging step's `export FROMCHAT_PACKAGING_JDK="$JAVA_HOME"` from
    clobbering it with Temurin 17 (hence ${VAR:-$JAVA_HOME}).
    
    Also widen the Gradle guard to name jlink, since that is what actually
    fails on a jmods-less JDK during packaging.
    
    Fix two Windows ARM64 failures: JDK-8371740 and a needless JDK download
    
    Neither is related to the jmods work; both were visible only on the
    windows-11-arm runner.
    
    1. Gradle hung at build shutdown. The runner's ambient JAVA_HOME is Temurin
       21.0.12 aarch64, and JDK-8371740 — a LinkedTransferQueue race fixed only
       in JDK 26 — makes Gradle on Windows ARM64 hang whenever it runs on JDK
       21+, failing the build after the installer was already written with
       "Timeout waiting for concurrent jobs to complete". Gradle's own repo and
       linroid/Ketch both carry workarounds for this. Pin the Gradle JVM to 17,
       which is what the x64 job already does; Adoptium ships no Windows aarch64
       17, hence the new `java-distribution` input and zulu there. Packaging is
       unaffected: resolvePackagingJdkHome() rejects 17 as too old and falls back
       to the Java 25 toolchain JDK for jpackage.
    
    2. "Ensure ARM64 packaging JDK" stalled for minutes and looked hung. The
       script only scanned C:\Program Files\Eclipse Adoptium, but hosted ARM64
       runners ship their ARM64 Temurin 21 under the hostedtoolcache, so the scan
       missed it and fell through to downloading a ~180 MB JDK via
       Invoke-WebRequest + Expand-Archive. Re-running the job showed it still
       installing 3m24s later. Accept JAVA_HOME when it reports os.arch=aarch64 —
       the script's own comments already call Java 21 good enough as the Gradle
       daemon JVM.
    
    Stop the Gradle build cache from being invalidated on every release
    
    Two independent defects, both found while a release sat at 8.83 GB of the
    10 GB per-repo cache limit with entries being evicted.
    
    1. set-version rewrote build.gradle.kts with sed on every run, and that file
       is hashed into the Gradle build-cache key — so each release produced a
       brand-new key and orphaned the previous one. The repo inventory showed the
       damage: windows-package-x64, macos-x64 and windows-package-arm64 each had
       two ~1.1 GB entries differing only in that hash. build.gradle.kts now reads
       -PversionName/-PversionCode (injected as ORG_GRADLE_PROJECT_* by
       set-version) and keeps its previous values as defaults, so local builds are
       unchanged. Types stay String/Integer for the `as Int`/`as String` consumers
       in app/android and app/shared. Side benefit: hash-release-build-inputs also
       hashes build.gradle.kts, so the "inputs unchanged" marker no longer churns
       per version either.
    
    2. Every desktop scope archived the Android build dirs (never built there)
       plus the final installers, the exported ProGuard jars, the jpackage runtime
       image and the ProGuard temp output — all regenerated for each version, and
       together the bulk of a ~1.7 GB entry. Those paths are now excluded, which
       is what kept the repo over the limit and into eviction (GitHub evicts by
       oldest last-accessed once the limit is hit).
    
    Restore and save path lists stay in sync: actions/cache silently skips the save
    when they differ.
    
    Cross-tag reuse is NOT addressed here and cannot be: per the docs, a run for one
    tag cannot read another tag's cache, and the automatic retry against the default
    branch is a no-op for us because main has no app/desktop module to warm it.
    
    Stage each packaging host's own Skiko/JavaFX natives
    
    The beta7 desktop builds cannot start. Both failures the user reported
    (macOS arm64 and Linux arm64) are the same bug:
    
      ERROR: [Desktop] uncaught on main Failed to loade library
      .../libskiko-macos-arm64.dylib
      Caused by: java.lang.UnsatisfiedLinkError: Can't load library
    
    ProGuard runs once, on ubuntu-latest, and its output is shipped to every
    packaging job. But the Compose desktop runtime classpath is host-specific:
    that single ProGuard run froze in skiko-awt-runtime-linux-x64 and
    javafx-*-27-linux, and nothing for any other target. Inspecting the published
    macOS arm64 DMG confirmed it — 140 jars, the entire ProGuard set, with
    skiko-awt-runtime-linux-x64 as the only Skiko runtime and no
    libskiko-*-arm64 anywhere in the bundle, plus no JavaFX natives either. The
    macOS x64 build is broken the same way; Linux x64 is the only target that
    happened to match, and the Windows installers shipped Linux natives too.
    
    stageCiPrebuiltProguard now also stages the packaging host's own natives
    (skiko-awt-runtime-<os>-<arch>, javafx-*-<os>-<arch>) from its resolved
    runtimeClasspath. Skiko and JavaFX each pick their library by os/arch, so the
    foreign Linux copies stay inert and cost only some bundle size. The task
    fails loudly if a host resolves no natives at all.
    
    Verified locally end-to-end with a prebuilt-ProGuard packaging run:
    Contents/app/libskiko-macos-arm64.dylib (21.3 MB) is now present, which is
    the exact path Skiko failed to load before.
    
    Keep ProGuard's output cached in the one scope that runs it
    
    Follow-up to 0e7b181, which excluded compose/tmp from every desktop scope
    to shrink the cache entries. That was too blunt for the build-jar scope:
    compose/tmp/main-release/proguard holds proguardReleaseJars' *output*, so
    without those jars Gradle can never consider the task up-to-date and
    re-runs its ~8 minutes on every re-run of a tag.
    
    Split the non-android path list in two. build-jar keeps compose/tmp; the
    packaging scopes drop it, because they never run ProGuard — they stage the
    Build JAR artifact's jars instead, so their copy is a redundant 122 MB.
  • Fix silent launch failure: require Java 25 packaging JDK
    jvmToolchain(25) (f89619a) compiles classes to class file 69, but
    resolvePackagingJdkHome() accepted any JDK that shipped jpackage. On Windows
    ARM64 the candidate list hardcoded jdk-21-arm64 first and
    ensure-windows-arm64-jdk.cmd provisioned Temurin 21; on macOS the first
    candidate was Adoptium 17. jpackage then bundled a Java 17/21 runtime and the
    installed app died at launch with UnsupportedClassVersionError on the hidden
    launcher's stderr (invisible: GUI subsystem, no error dialogs).
    
    CI hit this too: setup-java-gradle installs Temurin 17 and the workflows
    export FROMCHAT_PACKAGING_JDK="$JAVA_HOME", which the resolver returned
    verbatim — so the x64 installer built by desktop-windows-x64.yml was broken
    on launch.
    
    - build.gradle.kts: version-gate FROMCHAT_PACKAGING_JDK / JAVA_HOME /
      candidate JDKs to >= desktopJvmTarget (25) with a warning, then fall back to
      the Gradle-provisioned toolchain JDK (recursive .gradle/jdks scan).
    - ensure-windows-arm64-jdk.cmd: prefer an installed jdk-25* or the
      Gradle-provisioned Java 25 toolchain JDK; Temurin 21 remains only the
      last-resort daemon JVM.
    
    Ported from c53b54b, minus ensure-windows-x64-jdk.cmd and diag-launch.ps1:
    this branch has no packageWindowsX64 path to feed, and diag-launch.ps1 is
    machine-specific and unreferenced.
    
    Verified on macOS: createDistributable now bundles JAVA_VERSION 25.0.4.1,
    matching class file 69, where a previous build had bundled 17.0.19.
  • Add optimized multi-platform release CI/CD pipeline.
    Split Windows builds into shared x64 prep and arch-specific packaging, add comprehensive caching, verification scripts, and a PR smoke workflow.
    
    Co-authored-by: Cursor <cursoragent@cursor.com>
    
    Fix release-smoke workflow YAML syntax error.
    
    Co-authored-by: Cursor <cursoragent@cursor.com>
    
    Fix CI smoke test compile scope and PE fixture size.
    
    Co-authored-by: Cursor <cursoragent@cursor.com>
  • Windows installer
    Improve the installer, fix context menu on Windows, add CI workflows