Compose Multiplatform Patterns
monta-app/ocpp-emulator
Compose Multiplatform and Jetpack Compose patterns for KMP projects — state management, navigation, theming, performance, and platform-specific UI.
Migrates Kotlin Multiplatform (KMP) projects to Android Gradle Plugin 9.0+.
$ npx skills add JetBrains/skills --skill kotlin-tooling-agp9-migration -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install JetBrains/skills kotlin-tooling-agp9-migration --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/JetBrains/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/kotlin-tooling-agp9-migration .claude/skills/kotlin-tooling-agp9-migration && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "kotlin-tooling-agp9-migration" agent skill from https://github.com/JetBrains/skills/tree/main/kotlin-tooling-agp9-migration into .claude/skills/kotlin-tooling-agp9-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "kotlin-tooling-agp9-migration", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/JetBrains/skills/tree/main/kotlin-tooling-agp9-migrationType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add JetBrains/skills --skill kotlin-tooling-agp9-migration -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install JetBrains/skills kotlin-tooling-agp9-migration --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JetBrains/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/kotlin-tooling-agp9-migration .agents/skills/kotlin-tooling-agp9-migration && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "kotlin-tooling-agp9-migration" agent skill from https://github.com/JetBrains/skills/tree/main/kotlin-tooling-agp9-migration into .agents/skills/kotlin-tooling-agp9-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "kotlin-tooling-agp9-migration", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add JetBrains/skills --skill kotlin-tooling-agp9-migration -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install JetBrains/skills kotlin-tooling-agp9-migration --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JetBrains/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/kotlin-tooling-agp9-migration .cursor/skills/kotlin-tooling-agp9-migration && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "kotlin-tooling-agp9-migration" agent skill from https://github.com/JetBrains/skills/tree/main/kotlin-tooling-agp9-migration into .cursor/skills/kotlin-tooling-agp9-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "kotlin-tooling-agp9-migration", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/JetBrains/skills.git --path kotlin-tooling-agp9-migration--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add JetBrains/skills --skill kotlin-tooling-agp9-migration -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install JetBrains/skills kotlin-tooling-agp9-migration --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JetBrains/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/kotlin-tooling-agp9-migration .gemini/skills/kotlin-tooling-agp9-migration && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "kotlin-tooling-agp9-migration" agent skill from https://github.com/JetBrains/skills/tree/main/kotlin-tooling-agp9-migration into .gemini/skills/kotlin-tooling-agp9-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "kotlin-tooling-agp9-migration", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install JetBrains/skills kotlin-tooling-agp9-migrationInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add JetBrains/skills --skill kotlin-tooling-agp9-migration -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/JetBrains/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/kotlin-tooling-agp9-migration .github/skills/kotlin-tooling-agp9-migration && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "kotlin-tooling-agp9-migration" agent skill from https://github.com/JetBrains/skills/tree/main/kotlin-tooling-agp9-migration into .github/skills/kotlin-tooling-agp9-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "kotlin-tooling-agp9-migration", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add JetBrains/skills --skill kotlin-tooling-agp9-migration -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install JetBrains/skills kotlin-tooling-agp9-migration --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/JetBrains/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/kotlin-tooling-agp9-migration .opencode/skills/kotlin-tooling-agp9-migration && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "kotlin-tooling-agp9-migration" agent skill from https://github.com/JetBrains/skills/tree/main/kotlin-tooling-agp9-migration into .opencode/skills/kotlin-tooling-agp9-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "kotlin-tooling-agp9-migration", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
kotlin-tooling-agp9-migrationMigrates Kotlin Multiplatform (KMP) projects to Android Gradle Plugin 9.0+.
Kotlin Tooling Agp9 Migration is an agent skill from JetBrains/skills, published by the product's own GitHub organization. Migrates Kotlin Multiplatform (KMP) projects to Android Gradle Plugin 9.0+. Handles plugin replacement (com.android.kotlin.multiplatform.library), module splitting, DSL migration, and the new default project structure. Use when upgrading AGP, when build fails due to KMP+AGP incompatibility, or when the user mentions AGP 9.0, android multiplatform plugin, KMP migration, or com.android.kotlin.multiplatform.library.
Its SKILL.md is about 5.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 12 other files, including scripts, reference files and assets (for example `assets/checklist.md`, `references/DSL-REFERENCE.md` and `references/KNOWN-ISSUES.md`).
It sits in Mobile, covering Android development and Cross-platform mobile apps. It works with Kotlin, Android, Gradle and JetBrains IDEs. The repository describes itself as: Curated agent skills collection verified by JetBrains. The licence is Apache-2.0.
Read from SKILL.md and the folder at commit e0f258b. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Shell), which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Kotlin Tooling Agp9 Migration loads about 5.6k tokens when it runs, and up to ~25k if it reads all its reference files. Until then it costs about 112 tokens; SKILL.md has 1,893 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from JetBrains/skills at commit e0f258b, republished under its Apache-2.0 licence (© JetBrains). 1,893 words, ~5,576 tokens.
.claude/skills/kotlin-tooling-agp9-migration/SKILL.md (or your agent's skills folder). This skill also uses 9 other files; get the full folder from GitHub.Android Gradle Plugin 9.0 makes the Android application and library plugins incompatible with the Kotlin Multiplatform plugin in the same module. This skill guides you through the migration.
Before making any changes, understand the project structure:
settings.gradle.kts (or .gradle) to find all modulesbuild.gradle.kts to identify which plugins are appliedgradle/libs.versions.toml). If it exists,
read it for current AGP/Gradle/Kotlin versions. If not, find versions directly in build.gradle.kts
files (typically in the root buildscript {} or plugins {} block). Adapt all examples in this
guide accordingly — version catalog examples use alias(libs.plugins.xxx) while direct usage
uses id("plugin.id") version "x.y.z"gradle/wrapper/gradle-wrapper.properties for the Gradle versiongradle.properties for any existing workarounds (android.enableLegacyVariantApi)org.jetbrains.kotlin.android plugin usage — AGP 9.0 has built-in Kotlin and this plugin must be removedorg.jetbrains.kotlin.kapt plugin usage — incompatible with built-in Kotlin, must migrate to KSP or com.android.legacy-kaptIf Bash is available, run scripts/analyze-project.sh from this skill's directory to get a
structured summary.
For each module, determine its type:
| Current plugins | Migration path |
|---|---|
kotlin.multiplatform + com.android.library | Path A — Library plugin swap |
kotlin.multiplatform + com.android.application | Path B — Mandatory Android split |
kotlin.multiplatform with multiple platform entry points in one module | Path C — Full restructure (recommended) |
com.android.application or com.android.library (no KMP) | See "Pure Android Tips" below |
composeApp (or similar) module
containing entry points for multiple platforms (Android, Desktop, Web). This aligns with the
new JetBrains default project structure where each platform gets its own app module.Use this when a module applies kotlin.multiplatform + com.android.library.
See references/MIGRATION-LIBRARY.md for full before/after code.
Summary:
com.android.library → com.android.kotlin.multiplatform.libraryorg.jetbrains.kotlin.android plugin if present (AGP 9.0 has built-in Kotlin support)android {} block into kotlin { android {} }:kotlin {
android {
namespace = "com.example.lib"
compileSdk = 35
minSdk = 24
}
}src/main → src/androidMainsrc/test → src/androidHostTestsrc/androidTest → src/androidDeviceTestsrc/androidMain/, no directory renames are neededdependencies {} into sourceSets:kotlin {
sourceSets {
androidMain.dependencies {
implementation("androidx.appcompat:appcompat:1.7.0")
}
}
}kotlin {
android {
androidResources { enable = true }
}
}.java source files:kotlin {
android {
withJava()
}
}kotlin {
android {
withHostTest { isIncludeAndroidResources = true }
withDeviceTest {
instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
}
}// Old: debugImplementation(libs.androidx.compose.ui.tooling)
// New:
dependencies {
androidRuntimeClasspath(libs.androidx.compose.ui.tooling)
}kotlin {
android {
consumerProguardFiles.add(file("consumer-rules.pro"))
}
}Use this when a module applies kotlin.multiplatform + com.android.application.
This is mandatory for AGP 9.0 compatibility.
See references/MIGRATION-APP-SPLIT.md for full guide.
Summary:
androidApp module with its own build.gradle.kts:plugins {
alias(libs.plugins.androidApplication)
// Do NOT apply kotlin-android — AGP 9.0 includes Kotlin support
alias(libs.plugins.composeMultiplatform) // if using Compose
alias(libs.plugins.composeCompiler) // if using Compose
}
android {
namespace = "com.example.app"
compileSdk = 35
defaultConfig {
applicationId = "com.example.app"
minSdk = 24
targetSdk = 35
versionCode = 1
versionName = "1.0"
}
buildFeatures { compose = true }
}
dependencies {
implementation(projects.shared) // or whatever the shared module is named
implementation(libs.androidx.activity.compose)
}src/androidMain/ to androidApp/src/main/:MainActivity.kt (and any other Activities/Fragments)AndroidManifest.xml (app-level manifest with <application> and launcher <activity>) — verify android:name on <activity> uses the fully qualified class name in its new locationsettings.gradle.kts: include(":androidApp")build.gradle.kts: plugin declarations with apply falseapplicationId, targetSdk, versionCode, versionNameandroidAppUse this when the project has a monolithic module (typically composeApp) containing entry
points for multiple platforms. This is optional but aligns with the new JetBrains default.
See references/MIGRATION-FULL-RESTRUCTURE.md for full guide.
project/
├── shared/ ← KMP library (was composeApp), pure shared code
├── androidApp/ ← Android entry point only
├── desktopApp/ ← Desktop entry point only (if desktop target exists)
├── webApp/ ← Wasm/JS entry point only (if web target exists)
├── iosApp/ ← iOS Xcode project (usually already separate)
└── ...androidApp (mandatory for AGP 9.0)desktopApp (if desktop target exists):org.jetbrains.compose and application {} pluginmain() function from desktopMain to desktopApp/src/main/kotlin/compose.desktop { application { ... } } config to desktopApp/build.gradle.ktsshared modulewebApp (if wasmJs/js target exists):wasmJsMain/jsMain to webApp/src/wasmJsMain/kotlin/webApp/build.gradle.ktsshared moduleiosApp directory. Verify:binaries.framework) stays in shared modulecomposeApp to shared:settings.gradle.kts includeIf some platforms use native UI (e.g., SwiftUI for iOS), split shared into:
sharedLogic — business logic consumed by ALL platformssharedUI — Compose Multiplatform UI consumed only by platforms using shared UIIf the project includes a server target:
server module at the rootapp/ directorycore module for code shared between server and client (models, validation)These are required regardless of migration path:
Gradle wrapper — update to 9.1.0+:
# gradle/wrapper/gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zipAGP version — update to 9.0.0+.
If using a version catalog (gradle/libs.versions.toml):
[versions]
agp = "9.0.0"If versions are set directly in build files, update all com.android.* plugin version strings:
// root build.gradle.kts
plugins {
id("com.android.application") version "9.0.0" apply false
}Add the KMP library plugin.
With version catalog:
[plugins]
android-kotlin-multiplatform-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "agp" }Without version catalog — use the plugin ID directly in build files:
// root build.gradle.kts
plugins {
id("com.android.kotlin.multiplatform.library") version "9.0.0" apply false
}
// module build.gradle.kts
plugins {
id("com.android.kotlin.multiplatform.library")
}Root build.gradle.kts — add apply false for new plugin (see examples above)
JDK — ensure JDK 17+ is used (required by AGP 9.0)
SDK Build Tools — update to 36.0.0:
Install via SDK Manager or configure in android { buildToolsVersion = "36.0.0" }Remove legacy workarounds from gradle.properties:
android.enableLegacyVariantApi=true (removed in AGP 9.0, causes error if present)android.r8.integratedResourceShrinking (removed in AGP 9.0, causes error if present)android.enableNewResourceShrinker.preciseShrinking (removed in AGP 9.0, causes error if present)android.builtInKotlin=false (unless needed for plugin compatibility — see Plugin Compatibility)android.newDsl=false (unless needed for plugin compatibility)Review gradle.properties defaults — see "Gradle Properties Default Changes" section for properties whose defaults changed in AGP 9.0
AGP 9.0 enables built-in Kotlin support by default for all com.android.application and com.android.library
modules. The org.jetbrains.kotlin.android plugin is no longer needed and will conflict if applied.
Important: Built-in Kotlin does NOT replace KMP support. KMP library modules still need
org.jetbrains.kotlin.multiplatform + com.android.kotlin.multiplatform.library.
Check if the project uses org.jetbrains.kotlin.android or kotlin-android in any build files.
If found, this migration is needed. If not, check gradle.properties for android.builtInKotlin=false
which may indicate a previous opt-out.
Remove from all module-level and root-level build files:
// Remove from module build.gradle.kts
plugins {
// REMOVE: alias(libs.plugins.kotlin.android)
// REMOVE: id("org.jetbrains.kotlin.android")
}
// Remove from root build.gradle.kts
plugins {
// REMOVE: alias(libs.plugins.kotlin.android) apply false
}Remove from version catalog (gradle/libs.versions.toml):
[plugins]
# REMOVE: kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }The org.jetbrains.kotlin.kapt plugin is incompatible with built-in Kotlin.
Preferred: Migrate to KSP — see the KSP migration guide for each annotation processor.
Fallback: Use com.android.legacy-kapt (same version as AGP):
# gradle/libs.versions.toml
[plugins]
legacy-kapt = { id = "com.android.legacy-kapt", version.ref = "agp" }// Module build.gradle.kts — replace kotlin-kapt with legacy-kapt
plugins {
// REMOVE: alias(libs.plugins.kotlin.kapt)
alias(libs.plugins.legacy.kapt)
}For pure Android modules (non-KMP), migrate android.kotlinOptions {} to the top-level
kotlin.compilerOptions {}:
// Old
android {
kotlinOptions {
jvmTarget = "11"
languageVersion = "2.0"
freeCompilerArgs += listOf("-Xopt-in=kotlin.RequiresOptIn")
}
}
// New
kotlin {
compilerOptions {
jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11)
languageVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
optIn.add("kotlin.RequiresOptIn")
}
}Note: With built-in Kotlin, jvmTarget defaults to android.compileOptions.targetCompatibility,
so it may be optional if you already set compileOptions.
With built-in Kotlin, only android.sourceSets {} with the kotlin set is supported:
// NOT SUPPORTED with built-in Kotlin:
kotlin.sourceSets.named("main") {
kotlin.srcDir("additionalSourceDirectory/kotlin")
}
// Correct:
android.sourceSets.named("main") {
kotlin.directories += "additionalSourceDirectory/kotlin"
}For generated sources, use the Variant API:
androidComponents.onVariants { variant ->
variant.sources.kotlin!!.addStaticSourceDirectory("additionalSourceDirectory/kotlin")
}For large projects, migrate module-by-module:
android.builtInKotlin=false in gradle.propertiesplugins {
id("com.android.built-in-kotlin") version "AGP_VERSION"
}android.builtInKotlin=false and all com.android.built-in-kotlin pluginsFor modules that contain no Kotlin sources, disable built-in Kotlin to save build time:
android {
enableKotlin = false
}If blocked by plugin incompatibilities, opt out temporarily:
# gradle.properties
android.builtInKotlin=false
android.newDsl=false # also required if using new DSL opt-outWarning: Ask the user if they want to opt out, and if so, remind them this is a temporary measure.
See references/PLUGIN-COMPATIBILITY.md for the full compatibility table with known compatible versions, opt-out flag workarounds, and broken plugins.
Before migrating, inventory all plugins in the project and check each against that table. If any
plugin is broken without workaround, inform the user. If plugins need opt-out flags, add them to
gradle.properties and note them as temporary workarounds.
AGP 9.0 changes the defaults for many gradle properties. Check gradle.properties for any explicitly
set values that may now conflict. Key changes:
| Property | Old Default | New Default | Action |
|---|---|---|---|
android.uniquePackageNames | false | true | Ensure each library has a unique namespace |
android.enableAppCompileTimeRClass | false | true | Refactor switch on R fields to if/else |
android.defaults.buildfeatures.resvalues | true | false | Enable resValues = true where needed |
android.defaults.buildfeatures.shaders | true | false | Enable shaders where needed |
android.r8.optimizedResourceShrinking | false | true | Review R8 keep rules |
android.r8.strictFullModeForKeepRules | false | true | Update keep rules to be explicit |
android.proguard.failOnMissingFiles | false | true | Remove invalid ProGuard file references |
android.r8.proguardAndroidTxt.disallowed | false | true | Use proguard-android-optimize.txt only |
android.r8.globalOptionsInConsumerRules.disallowed | false | true | Remove global options from library consumer rules |
android.sourceset.disallowProvider | false | true | Use Sources API on androidComponents |
android.sdk.defaultTargetSdkToCompileSdkIfUnset | false | true | Specify targetSdk explicitly |
android.onlyEnableUnitTestForTheTestedBuildType | false | true | Only if testing non-default build types |
Check for and remove properties that now cause errors:
android.r8.integratedResourceShrinking — removed, always onandroid.enableNewResourceShrinker.preciseShrinking — removed, always onFor non-KMP Android modules upgrading to AGP 9.0:
org.jetbrains.kotlin.android plugin — AGP 9.0 includes Kotlin support built-in (see "Built-in Kotlin Migration" above)com.android.legacy-kaptkotlinOptions to kotlin { compilerOptions {} }kotlin.sourceSets to android.sourceSets with .kotlin accessorBaseExtension is removed; use CommonExtension or specific extension typescompileOptions reflects thisswitch statements on R class fields to if/elsetargetSdk explicitly to avoid surprisesndkVersion explicitly if using native codeandroid.builtInKotlin=false + android.newDsl=false in gradle.properties (removed in AGP 10)After migration, verify with the checklist. Key checks:
./gradlew build succeeds with no errors./gradlew :androidApp:assembleDebug succeeds (if app module exists)com.android.library or com.android.application in KMP modulesorg.jetbrains.kotlin.android in AGP 9.0 modulesandroidMain, androidHostTest, androidDeviceTest)See references/KNOWN-ISSUES.md for details. Key gotchas:
AppConfiguration interface, or use BuildKonfig or gradle-buildconfig-plugin for compile-time constantscom.android.library moduleandroidResources { enable = true } (CMP-9547)consumerProguardFiles.add(file(...)) in new DSLorg.jetbrains.kotlin.android must be removed; kapt must be replacedapplicationVariants, libraryVariants, variantFilter replaced by androidComponentsswitch on R fields fails in app modules; refactor to if/elseandroid {} extension helpers are obsolete© JetBrains, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 9 other files (scripts, references, assets) in kotlin-tooling-agp9-migration of JetBrains/skills.
Open the folder on GitHubat commit e0f258b
We found 2 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 2 other GitHub owners. This page covers the copy in JetBrains/skills, which our catalogue first saw on October 7, 2026.
Kotlin Tooling Agp9 Migration next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Kotlin Tooling Agp9 Migration this skillJetBrains/skills | 366 | 2 repos | ~5.6k | Automated safety check: Pass | Apache-2.0 | |
| Compose Multiplatform Patternsmonta-app/ocpp-emulator | 180 | 5 repos | ~2k | Automated safety check: Pass | Apache-2.0 | |
| Claude Android NinjaDrjacky/claude-android-ninja | 124 | — | ~5.2k | Automated safety check: Pass | Apache-2.0 | |
| Expo Brownfield Integrationmweinbach/agent-coworker | 156 | 2 repos | ~900 | Automated safety check: Notes | Custom licence | |
| Jugg Android Dev Loopniki914/zafiro | 241 | — | ~2k | Automated safety check: Pass | MIT | |
| Android Audio E2Ehyochan/react-native-nitro-sound | 961 | — | ~814 | Automated safety check: Pass | MIT |
monta-app/ocpp-emulator
Compose Multiplatform and Jetpack Compose patterns for KMP projects — state management, navigation, theming, performance, and platform-specific UI.
Drjacky/claude-android-ninja
Build and migrate Android apps with Kotlin, Jetpack Compose, MVVM, Hilt, Room 3 (KSP, SQLiteDriver, Flow/suspend DAOs), Navigation3, and multi-module Gradle.
mweinbach/agent-coworker
Helps add Expo and React Native to an existing native iOS or Android app, and choose between a prebuilt AAR or XCFramework and a fully integrated build.
niki914/zafiro
A skill your agent uses when editing source files (Java/Kotlin/XML/layout/AndroidManifest/Gradle) in a Android project, or when user asks to build/deploy/verify an Android app.
hyochan/react-native-nitro-sound
Build and run device-backed Android end-to-end checks for react-native-nitro-sound permissions, recording, playback, listeners, pause/resume, seek, speed, audio focus, lifecycle behavior, and rapid…
rcosteira79/android-skills
Sets house defaults for Android and Kotlin Multiplatform work and routes to the right specialized skill for Compose, networking, testing or build tooling.
JetBrains/skills
A skill your agent uses when the task requires automating a real browser from the terminal (navigation, form filling, snapshots, screenshots, data extraction, UI-flow debugging) via playwright-cli…
JetBrains/skills
Guide for creating effective skills. An agent skill from JetBrains/skills.
JetBrains/skills
Transcribe audio files to text with optional diarization and known-speaker hints.
JetBrains/skills
A skill your agent uses when the user asks to generate or edit images via the OpenAI Image API (for example: generate image, edit/inpaint/mask, background removal or replacement, transparent…
JetBrains/skills
A skill your agent uses when the user asks for text-to-speech narration or voiceover, accessibility reads, audio prompts, or batch speech generation via the OpenAI Audio API; run the bundled CLI…
JetBrains/skills
A skill your agent uses when the user explicitly asks for a desktop or system screenshot (full screen, specific app or window, or a pixel region), or when tool-specific capture capabilities are…
Works with
Categories
Migrates Kotlin Multiplatform (KMP) projects to Android Gradle Plugin 9.0+. Kotlin Tooling Agp9 Migration is an agent skill from JetBrains/skills, published by the product's own GitHub organization.0+.
Kotlin Tooling Agp9 Migration fits situations like: build fails due to KMP+AGP incompatibility; the user mentions AGP 9.0; android multiplatform plugin; com.android.kotlin.multiplatform.library.
Run `npx skills add JetBrains/skills --skill kotlin-tooling-agp9-migration -a claude-code`. Or copy the skill folder (kotlin-tooling-agp9-migration in JetBrains/skills) into .claude/skills/kotlin-tooling-agp9-migration in your project. Claude Code loads it when a task matches its description.
Run `npx skills add JetBrains/skills --skill kotlin-tooling-agp9-migration -a codex`. Or copy the skill folder (kotlin-tooling-agp9-migration in JetBrains/skills) into .agents/skills/kotlin-tooling-agp9-migration in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add JetBrains/skills --skill kotlin-tooling-agp9-migration -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/kotlin-tooling-agp9-migration, .gemini/skills/kotlin-tooling-agp9-migration, .github/skills/kotlin-tooling-agp9-migration and .opencode/skills/kotlin-tooling-agp9-migration in your project.
Going by SKILL.md and its folder, Kotlin Tooling Agp9 Migration needs a shell for the scripts in its folder. Our summary lists: A Bash shell.
SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Kotlin Tooling Agp9 Migration is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.6k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 19k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Kotlin Tooling Agp9 Migration: Compose Multiplatform Patterns (monta-app/ocpp-emulator, 180 stars), Claude Android Ninja (Drjacky/claude-android-ninja, 124 stars), Expo Brownfield Integration (mweinbach/agent-coworker, 156 stars) and Jugg Android Dev Loop (niki914/zafiro, 241 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
JetBrains (a GitHub organization, an official publisher) maintains it in JetBrains/skills, which has 366 GitHub stars. The repository holds 76 skills in this directory. The repository was last updated on June 29, 2026.
Source: JetBrains/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.