Skip to content

Update dependencies and project structure - #2

Merged
yasanglass merged 1 commit into
mainfrom
agp-v9
Jul 4, 2026
Merged

Update dependencies and project structure#2
yasanglass merged 1 commit into
mainfrom
agp-v9

Conversation

@yasanglass

@yasanglass yasanglass commented Jul 3, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features
    • Updated CI build and artifact publishing for Android, desktop, web (JS), and WASM to generate the correct distributable outputs and upload them in the expected locations.
    • Android CI now includes application APK outputs alongside other build artifacts.
  • Bug Fixes
    • Improved compatibility with Compose Preview by switching to the AndroidX preview annotation across the UI screens.
  • Chores
    • Upgraded Gradle/toolchains and refreshed the centralized version catalog; aligned build setup and CI signing/release variant behavior.

@coderabbitai

coderabbitai Bot commented Jul 3, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

This PR reorganizes the catalog into androidApp, desktopApp, and webApp modules, updates build logic and Gradle settings, refreshes dependency/version catalog entries, and switches Preview imports to AndroidX across catalog screens and shared UI code.

Changes

Build restructuring and CI updates

Layer / File(s) Summary
Root settings and version updates
settings.gradle.kts, gradle.properties, gradle/wrapper/gradle-wrapper.properties, gradlew, gradlew.bat, gradle/gradle-daemon-jvm.properties, gradle/libs.versions.toml
Updates module includes, Gradle wrapper, JVM/native properties, daemon toolchains, and version catalog/plugin coordinates.
Build-logic Kotlin Multiplatform migration
build-logic/settings.gradle.kts, build-logic/conventions/build.gradle.kts, build-logic/conventions/src/main/kotlin/.../KotlinMultiplatformExtensions.kt, build-logic/conventions/src/main/kotlin/.../LibraryPlugin.kt
Switches shared build logic to the Kotlin Multiplatform Android library plugin and KMP Android DSL.
Root plugins and shared module dependencies
build.gradle.kts, icons/build.gradle.kts, illustrations/build.gradle.kts, ui/build.gradle.kts
Replaces plugin declarations with version-catalog aliases and rewrites shared dependency declarations to catalog coordinates and runtime classpath wiring.
Catalog library module conversion
catalog/build.gradle.kts, catalog/lint-baseline.xml
Converts catalog to a Kotlin Multiplatform Android library and removes the lint baseline.
New catalog androidApp module
catalog/androidApp/build.gradle.kts, catalog/androidApp/src/main/AndroidManifest.xml
Adds the Android application module with CI versioning, build types, dependencies, and a simplified manifest.
New catalog desktopApp module
catalog/desktopApp/build.gradle.kts, .github/workflows/desktop.yml
Adds the desktop application module and updates its workflow task and artifact path.
New catalog webApp module
catalog/webApp/build.gradle.kts, catalog/webApp/src/jsMain/resources/index.html, catalog/webApp/src/wasmJsMain/resources/index.html, catalog/webApp/webpack.config.d/webApp.js, .github/workflows/js.yml, .github/workflows/wasm.yml, .github/workflows/android.yml, .github/workflows/ios.yml
Adds the web application module, browser entrypoints, webpack configuration changes, and workflow task/artifact updates for JS, WASM, Android, and iOS builds.

Compose preview import migration

Layer / File(s) Summary
Preview imports switched to AndroidX
catalog/src/commonMain/kotlin/.../screens/*.kt, ui/src/commonMain/kotlin/.../internal/Preview.kt
Replaces Preview imports from the JetBrains Compose tooling package with AndroidX Compose tooling imports.

Estimated code review effort: 4 (Complex) | ~60 minutes

Poem

I hopped through modules, light and bright,
Android, web, and desktop in sight.
New builds, new paths, new preview springs,
And AndroidX now fluffs the wings. 🐇

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title is broad, but it matches the PR’s real dependency and project structure changes.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch agp-v9
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch agp-v9

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (5)
catalog/androidApp/build.gradle.kts (2)

45-55: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

storeFile can silently end up null while signing config is still created.

releaseSigningProperties gates whether the release signing config exists, but storeFile/storePassword/keyAlias/keyPassword are each independently nullable via getProperty(...). If signing.properties exists but is missing store.path (typo, partial file, etc.), the signing config is created with a null storeFile, deferring the failure to the packaging step with a less clear error.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@catalog/androidApp/build.gradle.kts` around lines 45 - 55, The release
signing config in signingConfigs should not be created with partially missing
values from releaseSigningProperties, because create("release") can proceed with
a null storeFile. Update the release block to validate the required properties
up front in build.gradle.kts and fail fast with a clear error if any of
store.path, store.password, key.alias, or key.password is missing, so the
release signing configuration is only created when all values are present.

11-14: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Version code calculation silently breaks for two/three-digit version segments.

bits[1] * 1_00 + bits[2] assumes each non-major segment stays below 100; a minor/patch of 100+ overflows into the next segment and produces a wrong (possibly non-monotonic) versionCode, which can break Play Store upgrade ordering.

💡 Suggested guard
 val catalogVersionCode = catalogVersionName.split('.').map { it.toInt() }.let { bits ->
     check(bits.size == 3)
+    check(bits.all { it in 0..99 }) { "Each version component must be between 0 and 99" }
     bits[0] * 1_00_00 + bits[1] * 1_00 + bits[2]
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@catalog/androidApp/build.gradle.kts` around lines 11 - 14, The versionCode
computation in catalogVersionCode assumes minor and patch segments are always
below 100, which can produce incorrect or non-monotonic values for larger
version parts. Update the calculation in build.gradle.kts so it either validates
each segment stays within the supported range or uses a safer encoding scheme
that preserves ordering for all expected version values; keep the logic centered
around catalogVersionName, bits, and the versionCode expression.
catalog/build.gradle.kts (1)

104-108: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚖️ Poor tradeoff

Optional: hoist these DSL helpers into build-logic.

The identical android()/sourceSets() extension helpers are duplicated across catalog, icons, illustrations, ui, and webApp. Since a build-logic conventions module already exists, extracting them (or the shared subset) would remove the copy-paste. The helpers themselves are a reasonable workaround while type-safe accessors for the new AGP 9 KMP plugin are unavailable.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@catalog/build.gradle.kts` around lines 104 - 108, The
KotlinMultiplatformExtension DSL helpers are duplicated across multiple build
scripts, so hoist the shared android() and sourceSets() helpers into the
existing build-logic conventions module and update catalog, icons,
illustrations, ui, and webApp to use the shared definitions. Keep the helper
names and signatures aligned with the current
KotlinMultiplatformExtension/ExtensionAware usage so the workaround remains
available in one place rather than copy-pasted.
build-logic/conventions/src/main/kotlin/glass/yasan/orbit/buildlogic/LibraryPlugin.kt (1)

135-150: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Prefer the documented typed target API over string-keyed ExtensionAware lookup.

android(configure: Action<KotlinMultiplatformAndroidLibraryTarget>) and sourceSets(...) resolve the extensions by hardcoded string name ("android", "sourceSets") via reflection. Android's own guide for authoring custom Gradle plugins for the Android KMP library plugin recommends the typed, documented approach instead: The android {} block within the Kotlin extension in a KMP project is represented by the KotlinMultiplatformAndroidLibraryTarget interface, which also extends KotlinMultiplatformAndroidLibraryExtension. This lets you configure it via kmpExtension.targets.withType<KotlinMultiplatformAndroidLibraryTarget>().configureEach { ... }, avoiding brittle string-based extension lookups that could silently break if the extension is renamed internally.

♻️ Suggested refactor using the documented typed API
-        extensions.configure<KotlinMultiplatformExtension> {
+        extensions.configure<KotlinMultiplatformExtension> {
             explicitApi()
 
             // Android
-            android {
+            targets.withType<KotlinMultiplatformAndroidLibraryTarget>().configureEach {
                 namespace = "glass.yasan.orbit.${project.name}"
                 ...
             }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@build-logic/conventions/src/main/kotlin/glass/yasan/orbit/buildlogic/LibraryPlugin.kt`
around lines 135 - 150, The helper extensions in LibraryPlugin
(`KotlinMultiplatformExtension.android` and
`KotlinMultiplatformExtension.sourceSets`) use string-keyed `ExtensionAware`
lookups, which is brittle and should be replaced with the documented typed
Android KMP API. Refactor the plugin setup to configure the Android target
through
`KotlinMultiplatformExtension.targets.withType<KotlinMultiplatformAndroidLibraryTarget>().configureEach
{ ... }` and access source sets through the typed Kotlin Multiplatform model
instead of `"android"`/`"sourceSets"` extension names. Keep the surrounding task
configuration (`IncrementalSyncTask.isTestExecutableCompileSync`) unchanged.
gradle/libs.versions.toml (1)

24-56: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Mixed catalog styles: some libraries still use inline version strings.

androidx-appCompat, compose-bom, compose-material3, and vannitktech-mavenPublish-gradle still use inline "group:artifact:version" strings while others (agp, androidx-activityCompose, androidx-core, coil) were migrated to module + version.ref. Consider migrating the remaining entries for consistency in a follow-up.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@gradle/libs.versions.toml` around lines 24 - 56, The version catalog still
mixes inline coordinates with the newer module/version.ref style. Update the
remaining entries in libs.versions.toml—androidx-appCompat, compose-bom,
compose-material3, and vannitktech-mavenPublish-gradle—to use the same
module-based pattern as agp, androidx-activityCompose, androidx-core, and coil,
so the catalog stays consistent and easier to maintain.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@build.gradle.kts`:
- Around line 18-24: The root Gradle setup is globally re-enabling npm lifecycle
scripts through the Yarn root extensions, which affects all Kotlin/JS and Wasm
dependencies. Update the configuration around NodeJsPlugin, WasmNodeJsPlugin,
YarnRootExtension, and WasmYarnRootExtension so install-time scripts stay
disabled by default and only the specific dependency that needs scripts is
exempted; if a global exception is unavoidable, add a clear comment documenting
why it must apply to the whole build.

---

Nitpick comments:
In
`@build-logic/conventions/src/main/kotlin/glass/yasan/orbit/buildlogic/LibraryPlugin.kt`:
- Around line 135-150: The helper extensions in LibraryPlugin
(`KotlinMultiplatformExtension.android` and
`KotlinMultiplatformExtension.sourceSets`) use string-keyed `ExtensionAware`
lookups, which is brittle and should be replaced with the documented typed
Android KMP API. Refactor the plugin setup to configure the Android target
through
`KotlinMultiplatformExtension.targets.withType<KotlinMultiplatformAndroidLibraryTarget>().configureEach
{ ... }` and access source sets through the typed Kotlin Multiplatform model
instead of `"android"`/`"sourceSets"` extension names. Keep the surrounding task
configuration (`IncrementalSyncTask.isTestExecutableCompileSync`) unchanged.

In `@catalog/androidApp/build.gradle.kts`:
- Around line 45-55: The release signing config in signingConfigs should not be
created with partially missing values from releaseSigningProperties, because
create("release") can proceed with a null storeFile. Update the release block to
validate the required properties up front in build.gradle.kts and fail fast with
a clear error if any of store.path, store.password, key.alias, or key.password
is missing, so the release signing configuration is only created when all values
are present.
- Around line 11-14: The versionCode computation in catalogVersionCode assumes
minor and patch segments are always below 100, which can produce incorrect or
non-monotonic values for larger version parts. Update the calculation in
build.gradle.kts so it either validates each segment stays within the supported
range or uses a safer encoding scheme that preserves ordering for all expected
version values; keep the logic centered around catalogVersionName, bits, and the
versionCode expression.

In `@catalog/build.gradle.kts`:
- Around line 104-108: The KotlinMultiplatformExtension DSL helpers are
duplicated across multiple build scripts, so hoist the shared android() and
sourceSets() helpers into the existing build-logic conventions module and update
catalog, icons, illustrations, ui, and webApp to use the shared definitions.
Keep the helper names and signatures aligned with the current
KotlinMultiplatformExtension/ExtensionAware usage so the workaround remains
available in one place rather than copy-pasted.

In `@gradle/libs.versions.toml`:
- Around line 24-56: The version catalog still mixes inline coordinates with the
newer module/version.ref style. Update the remaining entries in
libs.versions.toml—androidx-appCompat, compose-bom, compose-material3, and
vannitktech-mavenPublish-gradle—to use the same module-based pattern as agp,
androidx-activityCompose, androidx-core, and coil, so the catalog stays
consistent and easier to maintain.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ac934364-8901-4469-ab6b-d913075b218e

📥 Commits

Reviewing files that changed from the base of the PR and between ef5b830 and 74d123b.

⛔ Files ignored due to path filters (13)
  • catalog/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-mdpi/ic_launcher.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png is excluded by !**/*.png
  • catalog/webApp/src/wasmJsMain/resources/favicon.png is excluded by !**/*.png
  • gradle/wrapper/gradle-wrapper.jar is excluded by !**/*.jar
  • kotlin-js-store/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (71)
  • .github/workflows/android.yml
  • .github/workflows/desktop.yml
  • .github/workflows/ios.yml
  • .github/workflows/js.yml
  • .github/workflows/wasm.yml
  • build-logic/conventions/build.gradle.kts
  • build-logic/conventions/src/main/kotlin/glass/yasan/orbit/buildlogic/LibraryPlugin.kt
  • build-logic/settings.gradle.kts
  • build.gradle.kts
  • catalog/androidApp/build.gradle.kts
  • catalog/androidApp/proguard-rules.pro
  • catalog/androidApp/src/ci/res/values/ic_launcher_background.xml
  • catalog/androidApp/src/debug/res/values/ic_launcher_background.xml
  • catalog/androidApp/src/main/AndroidManifest.xml
  • catalog/androidApp/src/main/kotlin/glass/yasan/orbit/catalog/MainActivity.kt
  • catalog/androidApp/src/main/res/drawable/ic_launcher_foreground.xml
  • catalog/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  • catalog/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  • catalog/androidApp/src/main/res/values-night/themes.xml
  • catalog/androidApp/src/main/res/values/ic_launcher_background.xml
  • catalog/androidApp/src/main/res/values/strings.xml
  • catalog/androidApp/src/main/res/values/themes.xml
  • catalog/build.gradle.kts
  • catalog/desktopApp/build.gradle.kts
  • catalog/desktopApp/src/main/kotlin/glass/yasan/orbit/catalog/Main.kt
  • catalog/lint-baseline.xml
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/AlertScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/BadgeListScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/BadgeScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/ButtonScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/CardScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/CheckboxScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/ChoiceTileScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/CollapseScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/ColorsScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/CouponScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/EmptyStateScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/KeyValueScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/LinearProgressIndicatorScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/ListChoiceScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/ListScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/LoadingScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/PillButtonScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/RadioScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/SegmentedSwitchScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/SelectFieldScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/StepperScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/SwitchScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TabsScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TagScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TextFieldScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TileGroupScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TileScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TimelineScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TypographyScreen.kt
  • catalog/webApp/build.gradle.kts
  • catalog/webApp/src/jsMain/kotlin/glass/yasan/orbit/catalog/Main.kt
  • catalog/webApp/src/jsMain/resources/index.html
  • catalog/webApp/src/wasmJsMain/kotlin/glass/yasan/orbit/catalog/Main.kt
  • catalog/webApp/src/wasmJsMain/resources/index.html
  • catalog/webApp/webpack.config.d/webApp.js
  • gradle.properties
  • gradle/libs.versions.toml
  • gradle/wrapper/gradle-wrapper.properties
  • gradlew
  • gradlew.bat
  • icons/build.gradle.kts
  • illustrations/build.gradle.kts
  • settings.gradle.kts
  • ui/build.gradle.kts
  • ui/src/commonMain/kotlin/glass/yasan/orbit/ui/controls/internal/Preview.kt
💤 Files with no reviewable changes (1)
  • catalog/lint-baseline.xml

Comment thread build.gradle.kts Outdated
Comment on lines +18 to +24
val managedNodeVersion = "22.21.1"

NodeJsPlugin.apply(rootProject).version.set(managedNodeVersion)
WasmNodeJsPlugin.apply(rootProject).version.set(managedNodeVersion)

YarnRootExtension[rootProject].ignoreScripts = false
WasmYarnRootExtension[rootProject].ignoreScripts = false

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Map repository files relevant to build.gradle.kts and npm/yarn configuration.
git ls-files | rg '(^|/)(build\.gradle\.kts|settings\.gradle\.kts|gradle\.properties|package\.json|yarn\.lock|pnpm-lock\.yaml|npm-shrinkwrap\.json|.yarnrc\.yml)$|(^|/)webpack|webApp|npm|yarn|wasm' -n

# Inspect the target file around the cited lines.
wc -l build.gradle.kts
cat -n build.gradle.kts | sed -n '1,80p'

Repository: yasanglass/orbit-compose-multiplatform

Length of output: 2384


🏁 Script executed:

#!/bin/bash
set -euo pipefail

git ls-files | rg '(^|/)(build\.gradle\.kts|settings\.gradle\.kts|gradle\.properties|package\.json|yarn\.lock|pnpm-lock\.yaml|npm-shrinkwrap\.json|.yarnrc\.yml)$|(^|/)webpack|webApp|npm|yarn|wasm' -n

wc -l build.gradle.kts
cat -n build.gradle.kts | sed -n '1,80p'

Repository: yasanglass/orbit-compose-multiplatform

Length of output: 2384


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '--- ignoreScripts / lifecycle references ---'
rg -n --hidden --no-ignore-vcs 'ignoreScripts|postinstall|lifecycle script|npm lifecycle|scripts' \
  build.gradle.kts settings.gradle.kts gradle.properties catalog build-logic .github/workflows kotlin-js-store || true

echo
echo '--- package.json files ---'
git ls-files '*package.json' '*package.json.*' '.yarnrc.yml' '.npmrc' | sed -n '1,200p'

echo
echo '--- catalog/webApp/build.gradle.kts ---'
wc -l catalog/webApp/build.gradle.kts
cat -n catalog/webApp/build.gradle.kts | sed -n '1,220p'

echo
echo '--- .github/workflows/wasm.yml ---'
wc -l .github/workflows/wasm.yml
cat -n .github/workflows/wasm.yml | sed -n '1,220p'

Repository: yasanglass/orbit-compose-multiplatform

Length of output: 3121


Keep npm lifecycle scripts disabled Re-enabling ignoreScripts here turns on install-time scripts for Kotlin/JS and Wasm dependencies; scope this exception to the dependency that needs it, or document why it must be global.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@build.gradle.kts` around lines 18 - 24, The root Gradle setup is globally
re-enabling npm lifecycle scripts through the Yarn root extensions, which
affects all Kotlin/JS and Wasm dependencies. Update the configuration around
NodeJsPlugin, WasmNodeJsPlugin, YarnRootExtension, and WasmYarnRootExtension so
install-time scripts stay disabled by default and only the specific dependency
that needs scripts is exempted; if a global exception is unavoidable, add a
clear comment documenting why it must apply to the whole build.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
catalog/build.gradle.kts (1)

82-86: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicate extension helpers across every KMP module build script.

The exact same KotlinMultiplatformExtension.android(...)/.sourceSets(...) bridging functions are copy-pasted verbatim in icons/build.gradle.kts, illustrations/build.gradle.kts, ui/build.gradle.kts, and webApp/build.gradle.kts (per graph context). Since this PR already touches build-logic/conventions/src/main/kotlin/glass/yasan/orbit/buildlogic/LibraryPlugin.kt, consider hoisting these two functions into a shared build-logic extension/precompiled script plugin instead of duplicating them in every module.

♻️ Example: shared extension in build-logic
// build-logic/conventions/src/main/kotlin/glass/yasan/orbit/buildlogic/KmpExtensions.kt
fun KotlinMultiplatformExtension.android(configure: Action<KotlinMultiplatformAndroidLibraryTarget>): Unit =
    (this as ExtensionAware).extensions.configure("android", configure)

fun KotlinMultiplatformExtension.sourceSets(configure: Action<NamedDomainObjectContainer<KotlinSourceSet>>): Unit =
    (this as ExtensionAware).extensions.configure("sourceSets", configure)

Then import it from each module's build.gradle.kts instead of redefining it locally.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@catalog/build.gradle.kts` around lines 82 - 86, The
`KotlinMultiplatformExtension.android(...)` and `.sourceSets(...)` helper
functions are duplicated across multiple KMP module build scripts. Move these
bridge extensions into a shared build-logic location, such as the conventions
plugin alongside `LibraryPlugin` or a shared `KmpExtensions` file, and have each
module reuse them instead of redefining them locally. Keep the existing function
names and signatures so the module scripts can import and call the shared
helpers unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@catalog/build.gradle.kts`:
- Around line 82-86: The `KotlinMultiplatformExtension.android(...)` and
`.sourceSets(...)` helper functions are duplicated across multiple KMP module
build scripts. Move these bridge extensions into a shared build-logic location,
such as the conventions plugin alongside `LibraryPlugin` or a shared
`KmpExtensions` file, and have each module reuse them instead of redefining them
locally. Keep the existing function names and signatures so the module scripts
can import and call the shared helpers unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 78a43344-dbba-4495-8fb7-c42373b6520b

📥 Commits

Reviewing files that changed from the base of the PR and between 74d123b and a6b2de2.

⛔ Files ignored due to path filters (13)
  • catalog/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-mdpi/ic_launcher.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png is excluded by !**/*.png
  • catalog/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png is excluded by !**/*.png
  • catalog/webApp/src/wasmJsMain/resources/favicon.png is excluded by !**/*.png
  • gradle/wrapper/gradle-wrapper.jar is excluded by !**/*.jar
  • kotlin-js-store/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (71)
  • .github/workflows/android.yml
  • .github/workflows/desktop.yml
  • .github/workflows/ios.yml
  • .github/workflows/js.yml
  • .github/workflows/wasm.yml
  • build-logic/conventions/build.gradle.kts
  • build-logic/conventions/src/main/kotlin/glass/yasan/orbit/buildlogic/LibraryPlugin.kt
  • build-logic/settings.gradle.kts
  • build.gradle.kts
  • catalog/androidApp/build.gradle.kts
  • catalog/androidApp/proguard-rules.pro
  • catalog/androidApp/src/ci/res/values/ic_launcher_background.xml
  • catalog/androidApp/src/debug/res/values/ic_launcher_background.xml
  • catalog/androidApp/src/main/AndroidManifest.xml
  • catalog/androidApp/src/main/kotlin/glass/yasan/orbit/catalog/MainActivity.kt
  • catalog/androidApp/src/main/res/drawable/ic_launcher_foreground.xml
  • catalog/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  • catalog/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  • catalog/androidApp/src/main/res/values-night/themes.xml
  • catalog/androidApp/src/main/res/values/ic_launcher_background.xml
  • catalog/androidApp/src/main/res/values/strings.xml
  • catalog/androidApp/src/main/res/values/themes.xml
  • catalog/build.gradle.kts
  • catalog/desktopApp/build.gradle.kts
  • catalog/desktopApp/src/main/kotlin/glass/yasan/orbit/catalog/Main.kt
  • catalog/lint-baseline.xml
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/AlertScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/BadgeListScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/BadgeScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/ButtonScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/CardScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/CheckboxScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/ChoiceTileScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/CollapseScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/ColorsScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/CouponScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/EmptyStateScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/KeyValueScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/LinearProgressIndicatorScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/ListChoiceScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/ListScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/LoadingScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/PillButtonScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/RadioScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/SegmentedSwitchScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/SelectFieldScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/StepperScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/SwitchScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TabsScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TagScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TextFieldScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TileGroupScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TileScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TimelineScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TypographyScreen.kt
  • catalog/webApp/build.gradle.kts
  • catalog/webApp/src/jsMain/kotlin/glass/yasan/orbit/catalog/Main.kt
  • catalog/webApp/src/jsMain/resources/index.html
  • catalog/webApp/src/wasmJsMain/kotlin/glass/yasan/orbit/catalog/Main.kt
  • catalog/webApp/src/wasmJsMain/resources/index.html
  • catalog/webApp/webpack.config.d/webApp.js
  • gradle.properties
  • gradle/libs.versions.toml
  • gradle/wrapper/gradle-wrapper.properties
  • gradlew
  • gradlew.bat
  • icons/build.gradle.kts
  • illustrations/build.gradle.kts
  • settings.gradle.kts
  • ui/build.gradle.kts
  • ui/src/commonMain/kotlin/glass/yasan/orbit/ui/controls/internal/Preview.kt
💤 Files with no reviewable changes (1)
  • catalog/lint-baseline.xml
✅ Files skipped from review due to trivial changes (32)
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TimelineScreen.kt
  • catalog/webApp/src/wasmJsMain/resources/index.html
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/BadgeListScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TypographyScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TileScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TextFieldScreen.kt
  • gradle/wrapper/gradle-wrapper.properties
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/ListChoiceScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/RadioScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/BadgeScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/ButtonScreen.kt
  • .github/workflows/desktop.yml
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/SegmentedSwitchScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/StepperScreen.kt
  • illustrations/build.gradle.kts
  • gradlew.bat
  • catalog/androidApp/src/main/AndroidManifest.xml
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/CheckboxScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/CardScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/LoadingScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/SwitchScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TileGroupScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/ListScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TabsScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/PillButtonScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/CollapseScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/KeyValueScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/LinearProgressIndicatorScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/SelectFieldScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/ChoiceTileScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/TagScreen.kt
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/EmptyStateScreen.kt
🚧 Files skipped from review as they are similar to previous changes (22)
  • catalog/webApp/src/jsMain/resources/index.html
  • .github/workflows/ios.yml
  • icons/build.gradle.kts
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/CouponScreen.kt
  • .github/workflows/js.yml
  • gradle.properties
  • ui/src/commonMain/kotlin/glass/yasan/orbit/ui/controls/internal/Preview.kt
  • build-logic/conventions/build.gradle.kts
  • .github/workflows/wasm.yml
  • .github/workflows/android.yml
  • catalog/webApp/webpack.config.d/webApp.js
  • gradlew
  • catalog/desktopApp/build.gradle.kts
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/AlertScreen.kt
  • catalog/webApp/build.gradle.kts
  • gradle/libs.versions.toml
  • ui/build.gradle.kts
  • catalog/src/commonMain/kotlin/glass/yasan/orbit/catalog/screens/ColorsScreen.kt
  • build-logic/settings.gradle.kts
  • catalog/androidApp/build.gradle.kts
  • build-logic/conventions/src/main/kotlin/glass/yasan/orbit/buildlogic/LibraryPlugin.kt
  • settings.gradle.kts

@yasanglass
yasanglass force-pushed the agp-v9 branch 2 times, most recently from 90d55e7 to edf4905 Compare July 4, 2026 11:01
@yasanglass yasanglass changed the title Update to AGP v9 Update dependencies and project structure Jul 4, 2026
@yasanglass
yasanglass merged commit e36b7a5 into main Jul 4, 2026
6 checks passed
@yasanglass
yasanglass deleted the agp-v9 branch August 1, 2026 11:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant