capacitor-plugin-upgrade-v4-to-v5
Guides the agent through upgrading a Capacitor plugin from v4 to v5. Use when the plugin targets Capacitor 4 and needs the v5 migration path. Do not use for app upgrades, other major versions, or non-Capacitor plugins.
By cap-go · 519 installs
npx skills add cap-go/capgo-skills --skill capacitor-plugin-upgrade-v4-to-v5
Source repository · Upstream listing
Capacitor Plugin Upgrade v4 to v5
Move a plugin library to Capacitor 5. Source of truth: https://capacitorjs.com/docs/updating/plugins/5 0
When to Use
Snapshot shows @capacitor/core 4.x in peer/dev deps and the plugin must work in Capacitor 5 apps.
A Capacitor 5 app fails building this plugin with Namespace not specified or Java 17 errors.
The plugin manually conforms to CAPBridgedPlugin or calls getObject() / getArray() .
Do not use:
Upgrading an app capacitor app upgrade v4 to v5 .
Plugin already on 5 capacitor plugin upgrade v5 to v6 . Multi hop capacitor plugin upgrades .
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 Applying Gradle, manifest, Java or Kotlin changes by hand
Preflight
Tool Minimum
Node.js 16+
Xcode 14.1+
Java 17 (AGP 8)
AGP / Gradle 8.0.0 / 8.0.2
Android SDK defaults compileSdk 33, targetSdk 33, minSdk 22
iOS deployment target 13.0 (unchanged)
Procedure
1. Confirm the plugin is on 4.x from the snapshot and the tree is clean ( git status ).
2. From the plugin root run:
It edits package.json , android/build.gradle , the wrapper, gradle.properties , and the manifest. Review git diff .
3. Finish manually anything not applied ( references/android.md ):
@capacitor/cli , core , android , ios dev deps to latest 5 ; peer @capacitor/core to ^5.0.0 .
SDK defaults 33, AGP 8.0.0, Gradle 8.0.2, namespace in android {} and no package= in the manifest, Java 17, Jetifier removed, Kotlin 1.8.20 with kotlin stdlib .
4. iOS code : if the plugin conforms to CAPBridgedPlugin manually (no CAP PLUGIN macro), move requirements to instance level, rename pluginId to identifier , type pluginMethods as [CAPPluginMethod] , and drop getMethod( :) . Macro based plugins need no change.
5. Android code : call.getObject(key) and call.getArray(key) can now return null . Add null checks and call.reject(...) with a clear message when required.
6. Update the example app (if present) to Capacitor 5 via capacitor app upgrade v4 to v5 .
7. Bump the plugin major version and note "Requires Capacitor 5" in the changelog/README.
Verification
Run the example app on both platforms and exercise every method.
Error Handling
Error Fix
Namespace not specified Add namespace "<package " to android {} in the plugin build.gradle .
Android Gradle plugin requires Java 17 to run Switch the Gradle JDK to 17.
NullPointerException from getObject / getArray Add null checks (step 5).
Swift: type does not conform to protocol CAPBridgedPlugin Use instance level identifier , jsName , pluginMethods , or switch to the macro.
Duplicate class ... kotlin stdlib jdk8 Replace kotlin stdlib jdk7/jdk8 with kotlin stdlib .