capacitor-plugin-upgrade-v7-to-v8 — Claude Code skill: install & guide
Migrates Capacitor plugin libraries from v7 to v8. It automates package bumps, Gradle syntax changes, Kotlin 2.2 compiler options, and iOS 15 updates.
npx skills add Cap-go/capgo-skills --skill capacitor-plugin-upgrade-v7-to-v8 -a claude-codeWhat capacitor-plugin-upgrade-v7-to-v8 does
This skill triggers migration via npx @capacitor/plugin-migration-v7-to-v8@latest, then guides manual fixes across the repository. It bumps dev dependencies to ^8.0.0 and sets peer @capacitor/core to >=8.0.0 inside package.json.
On Android, build targets switch to compile and target SDK 36, minSdk 24, AGP 8.13.0, and Gradle 8.14.3. Property assignments in Gradle convert to = syntax. When Kotlin 2.2.20 is present, kotlinOptions transforms into compilerOptions, and the deprecated bridge_layout_main reference switches to capacitor_bridge_layout_main.
Native iOS configurations target iOS 15 across podspec and Package.swift, locking capacitor-swift-pm to from: "8.0.0". The environment must provide Node.js 22+, Xcode 26.0+, and Java 17+. The procedure is strictly for plugin libraries and will not handle application project upgrades.
What it helps with
- upgrade a Capacitor plugin library from version 7 to 8
- fix Gradle property assignment syntax errors using
= - switch Kotlin build configuration from
kotlinOptionstocompilerOptions - raise deployment targets to iOS 15 and Android SDK 36
Example prompts for the agent
- Upgrade this plugin library from Capacitor 7 to Capacitor 8
- Run the v7 to v8 migration checklist on this Capacitor plugin
- Fix Kotlin 2 compiler options and update the plugin to Capacitor 8
How to install capacitor-plugin-upgrade-v7-to-v8
1Skills CLI (Vercel)
npx skills add Cap-go/capgo-skills --skill capacitor-plugin-upgrade-v7-to-v8 -a claude-code2Manually: put the files in place
~/.claude/skills/capacitor-plugin-upgrade-v7-to-v8/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/capacitor-plugin-upgrade-v7-to-v8/
1Skills CLI (Vercel)
npx skills add Cap-go/capgo-skills --skill capacitor-plugin-upgrade-v7-to-v8 -a codex2Manually: put the files in place
.agents/skills/capacitor-plugin-upgrade-v7-to-v8/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add Cap-go/capgo-skills --skill capacitor-plugin-upgrade-v7-to-v8 -a cursor2Manually: put the files in place
.cursor/skills/capacitor-plugin-upgrade-v7-to-v8/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install Cap-go/capgo-skills capacitor-plugin-upgrade-v7-to-v82Manually: put the files in place
.github/skills/capacitor-plugin-upgrade-v7-to-v8/SKILL.md1Skills CLI (Vercel)
npx skills add Cap-go/capgo-skills --skill capacitor-plugin-upgrade-v7-to-v8 -a gemini-cli2Platform CLI
gemini skills install https://github.com/Cap-go/capgo-skills --path skills/capacitor-plugin-upgrade-v7-to-v8Manually: put the files in place
.devin/skills/capacitor-plugin-upgrade-v7-to-v8/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add Cap-go/capgo-skills --skill capacitor-plugin-upgrade-v7-to-v8 -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about capacitor-plugin-upgrade-v7-to-v8
How do I install capacitor-plugin-upgrade-v7-to-v8 in Claude Code?
Run npx skills add Cap-go/capgo-skills --skill capacitor-plugin-upgrade-v7-to-v8 -a claude-code.
What does capacitor-plugin-upgrade-v7-to-v8 do?
It upgrades a plugin library to Capacitor 8 by executing the migration script, adjusting Gradle files, and setting up iOS 15 and Android SDK 36 requirements.
Can this skill upgrade an entire Capacitor application?
No, it targets plugin libraries exclusively. For full application updates, use capacitor-app-upgrade-v7-to-v8.
Source text
SKILL.md · MIT
---
name: capacitor-plugin-upgrade-v7-to-v8
description: >-
Upgrades a Capacitor plugin library from v7 to v8 using `npx @capacitor/plugin-migration-v7-to-v8@latest`, then the manual checklist - dev deps `^8.0.0` and peer `@capacitor/core` `>=8.0.0`, minSdk 24 and compile/target SDK 36 defaults, AndroidX dependency defaults, AGP 8.13.0, Gradle 8.14.3, Gradle `=` property assignment syntax, Java 21, Kotlin 2.2.20 (`kotlinOptions` to `compilerOptions`, no `kotlin-android-extensions`), google-services 4.4.4, iOS 15 in podspec and `Package.swift`, `capacitor-swift-pm` `from: "8.0.0"`, and the renamed `capacitor_bridge_layout_main` resource. Use when a plugin targets Capacitor 7 and must support 8, or on Kotlin 2 / Gradle space-assignment errors. Points to the v8-to-v9 next step. Do not use for app upgrades, other major versions, or non-Capacitor libraries.
allowed-tools:
- Bash(node -e *)
- Bash(find *)
---
# Capacitor Plugin Upgrade v7 to v8
Move a plugin library to Capacitor 8. Source of truth: https://capacitorjs.com/docs/updating/plugins/8-0
## When to Use
- Snapshot shows `@capacitor/core` 7.x and the plugin must work in Capacitor 8 apps.
- Building the plugin against Kotlin 2.2 fails on `kotlinOptions` or `kotlin-android-extensions`.
- Gradle warns `Properties should be assigned using the 'propName = value' syntax`.
Do not use:
- Upgrading an app -> `capacitor-app-upgrade-v7-to-v8`.
- Plugin on 6.x -> `capacitor-plugin-upgrade-v6-to-v7` first. Multi-hop -> `capacitor-plugin-upgrades`.
- Plugin already on 8.x -> `capacitor-plugin-upgrade-v8-to-v9`.
- Adding SPM -> `capacitor-plugin-spm-support`.
## Live Project Snapshot
Plugin and Capacitor package snapshot:
!`node -e "const fs=require('fs');if(!fs.existsSync('package.json'))process.exit(0);const pkg=JSON.parse(fs.readFileSync('package.json','utf8'));const out=['package.name='+(pkg.name||''),'package.version='+(pkg.version||'')];for(const section of ['peerDependencies','dependencies','devDependencies']){for(const [name,version] of Object.entries(pkg[section]||{})){if(name.startsWith('@capacitor/'))out.push(section+'.'+name+'='+version)}}console.log(out.join('\n'))"`
Example and native project paths:
!`find . -maxdepth 3 \( -path './example-app' -o -path './ios' -o -path './android' \)`
## References
| File | Load when |
| --- | --- |
| `references/android.md` | Dependency defaults, SDK, AGP/Gradle, `=` syntax, Java 21, Kotlin 2.2 changes |
| `references/ios.md` | iOS 15 in podspec / `Package.swift` / old-structure project, `capacitor-swift-pm` 8 |
## Preflight
| Tool | Minimum |
| --- | --- |
| Node.js | 22+ |
| Xcode | 26.0+ |
| iOS deployment target | 15.0 |
| Java | 21 recommended (17+ supported by AGP 8.13) |
| AGP / Gradle | 8.13.0 / 8.14.3 |
| Android SDK defaults | minSdk 24, compileSdk 36, targetSdk 36 |
| Kotlin (if used) | 2.2.20 |
## Procedure
1. Confirm 7.x and a clean tree.
2. From the plugin root:
```bash
npx @capacitor/plugin-migration-v7-to-v8@latest
```
Review `git diff`.
3. **package.json**: dev deps `@capacitor/cli`, `core`, `android`, `ios` to `^8.0.0`; peer `@capacitor/core` to `>=8.0.0`.
4. **Android** per `references/android.md`:
- Only add/update the `ext {}` dependency defaults the plugin actually uses.
- SDK defaults 24/36/36, AGP 8.13.0, Gradle 8.14.3, google-services 4.4.4 (if used).
- Convert every property assignment to `=` (`namespace = ...`, `compileSdk = ...`, `url = ...`, `abortOnError = ...`). Method calls such as `mavenCentral()` stay unchanged.
- Java 21 `compileOptions`.
- Kotlin plugins: `kotlin_version` 2.2.20, replace `kotlinOptions {}` with `kotlin { compilerOptions { jvmTarget = JvmTarget.JVM_21 } }`, drop `kotlin-android-extensions` (use `kotlin-parcelize` / view binding).
- Code referencing `R.layout.bridge_layout_main` must use `capacitor_bridge_layout_main`.
5. **iOS** per `references/ios.md`: podspec `15.0`, `Package.swift` `.iOS(.v15)`, `capacitor-swift-pm` `from: "8.0.0"`. If the plugin posted `.capacitorViewDidAppear` / `.capacitorViewWillTransition` itself, remove that code; Capacitor 8 emits them.
6. Upgrade the example app via `capacitor-app-upgrade-v7-to-v8`, bump the plugin major, note "Requires Capacitor 8".
## After 8.x: next steps
- Capacitor 8.5 apps adopt the iOS UIScene lifecycle (required by Xcode 27). Plugins that hook AppDelegate methods (`application(_:open:options:)`, `continue userActivity`, `applicationDidBecomeActive`, ...) or use `UIApplication.shared.windows` / `keyWindow` must handle scene-based apps; see `capacitor-uiscene-migration`.
- Then `capacitor-plugin-upgrade-v8-to-v9` (Capacitor 9 is on `next`, not GA).
## Verification
```bash
grep -n "\"@capacitor/" package.json # ^8.0.0 / >=8.0.0
grep -nE "^\s*(namespace|compileSdk|url|abortOnError|minSdkVersion|targetSdkVersion) [^=]" android/build.gradle # expect none
grep -n "kotlinOptions\|kotlin-android-extensions" android/build.gradle # expect none
grep -n "VERSION_21\|gradle:8.13.0" android/build.gradle
grep -n "distributionUrl" android/gradle/wrapper/gradle-wrapper.properties # gradle-8.14.3
grep -rn "bridge_layout_main" android/src | grep -v capacitor_bridge # expect none
grep -n "deployment_target" *.podspec # '15.0'
grep -n "iOS(\|capacitor-swift-pm" Package.swift 2>/dev/null # .v15, from: "8.0.0"
npm run build
npm run verify # if the repo has the template verify scripts
cd android && ./gradlew build --warning-mode all
```
Run the example app on both platforms.
## Error Handling
| Error | Fix |
| --- | --- |
| `Properties should be assigned using the 'propName = value' syntax` | Add `=` to the property assignment. |
| Kotlin: `kotlinOptions` deprecated / error under Kotlin 2.2 | Use `kotlin { compilerOptions { jvmTarget = JvmTarget.JVM_21 } }` with `import org.jetbrains.kotlin.gradle.dsl.JvmTarget`. |
| `Plugin [id: 'kotlin-android-extensions'] was not found` | Remove it; use `kotlin-parcelize` and view binding. |
| `Inconsistent JVM-target compatibility detected for tasks` | Make Java `compileOptions` and Kotlin `jvmTarget` the same version (21). |
| `cannot find symbol` on `R.layout.bridge_layout_main` | Use `capacitor_bridge_layout_main`. |
| SPM resolution picks Capacitor 7 | Set `capacitor-swift-pm` `from: "8.0.0"`. |
© Cap-go · MIT · Cap-go/capgo-skills