agentleFS
Cap-goCap-go/capgo-skills/skills/capacitor-app-upgrade-v5-to-v6/SKILL.md

capacitor-app-upgrade-v5-to-v6

Skill75 starsChanged 35 days agoMITView on GitHub

Upgrades a Capacitor app from v5 to v6 using `npx cap migrate` from `@capacitor/cli@latest-6`, then the manual checklist - Node 18+, Xcode 15+, Android Studio Hedgehog, AGP 8.2.1, Gradle 8.2.1, compile/target SDK 34, `compileSdkVersion` to `compileSdk`, the `androidScheme` default flipping to `https` (data loss risk), iOS local plugins no longer auto-registered, iOS zoom disabled by default, and official plugin breaking changes (`addListener` returns only a Promise, Camera Photo Picker, Filesystem ctime/mtime numbers). Use when `@capacitor/core` is 5.x and the target is 6.x, or after the upgrade users are logged out on Android, a custom iOS plugin is "not implemented", or `addListener(...).remove` no longer compiles. Do not use for other major versions, plugin library upgrades, or non-Capacitor apps.

  • Installs packages

1 other project uses a version of this, 1 of them edited.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

6 rules. About 0 are common, 3 are distinctive, and 3 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈3

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 3

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    After upgrading: Android users lose localStorage/cookies, a local (non-npm) iOS plugin reports "<Name>" plugin is not implemented on ios, …

    line 15
  2. Distinctive:

    Only load a reference when its topic is in play.

    line 31
  3. Distinctive:

    Run the automated migration:

    line 62
  4. Distinctive:

    Read the output and finish every step it reports as failed.

    line 69
  5. Very specific:

    Update all @capacitor/* plugins to ^6.0.0 and community plugins to their Capacitor 6 releases.

    line 74
  6. Very specific:

    Do not remove READ_MEDIA_IMAGES / storage permissions if saveToGallery: true or another plugin needs them.

    line 82

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Capacitor App Upgrade v5 to v6

Move a Capacitor 5 app to Capacitor 6. Source of truth: https://capacitorjs.com/docs/updating/6-0

When to Use

  • @capacitor/core in the snapshot below is 5.x and the user wants 6.x.
  • After upgrading: Android users lose localStorage/cookies, a local (non-npm) iOS plugin reports "<Name>" plugin is not implemented on ios, pinch-zoom stopped working on iOS, or TypeScript errors around addListener.
  • The user asks for the exact 5 -> 6 checklist.

Do not use:

  • App on 4.x -> capacitor-app-upgrade-v4-to-v5 first. On 6.x -> capacitor-app-upgrade-v6-to-v7. Multi-hop planning -> capacitor-app-upgrades.
  • Plugin library upgrade -> capacitor-plugin-upgrade-v5-to-v6.
  • Moving iOS from CocoaPods to SPM (experimental in 6) -> cocoapods-to-spm.

Live Project Snapshot

Current Capacitor packages from package.json: !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=[];for(const section of ['dependencies','devDependencies']){for(const [name,version] of Object.entries(pkg[section]||{})){if(name.startsWith('@capacitor/'))out.push(section+'.'+name+'='+version)}}console.log(out.sort().join('\n'))"

References

Only load a reference when its topic is in play.

FileLoad when
references/android.mdEditing variables.gradle, build.gradle, wrapper, or Kotlin by hand
references/plugins.mdThe app uses official @capacitor/* plugins or stores addListener results

Preflight

ToolMinimum for Capacitor 6
Node.js18+ (latest LTS recommended)
Xcode15.0+
Android StudioHedgehog 2023.1.1+
Java (Gradle JDK)17
AGP / Gradle8.2.1 / 8.2.1
Android SDKminSdk 22, compileSdk 34, targetSdk 34
iOS deployment target13.0 (unchanged)
node -v && xcodebuild -version && java -version
git status --short
grep -rn "androidScheme" capacitor.config.*   # decide the scheme BEFORE migrating

Procedure

  1. Confirm 5.x from the snapshot.
  2. Decide androidScheme first (judgement call, ask the user if unclear). Capacitor 6 defaults existing apps to https. Changing scheme changes the WebView origin, so localStorage, IndexedDB, cookies and service workers from the installed app are no longer readable.
    • No androidScheme set today -> add server: { androidScheme: "http" } to keep user data.
    • Already "https" -> the entry can be removed.
  3. Run the automated migration:

    npm i -D @capacitor/cli@latest-6
    npx cap migrate

    Read the output and finish every step it reports as failed.

  4. iOS:
    • Plugin classes are no longer auto-registered. npm plugins are handled by the CLI-generated list. Local plugins written in the app target (custom code guide) need a CAPBridgeViewController subclass that overrides capacitorDidLoad() and calls bridge?.registerPluginInstance(MyPlugin()), and Main.storyboard must use that subclass as the view controller's custom class.
    • Zoom is disabled by default. If the app relied on pinch zoom, set zoomEnabled: true in the Capacitor config.
  5. Android: apply references/android.md (AGP 8.2.1, Gradle 8.2.1, google-services 4.4.0, compileSdk, Kotlin 1.9.10).
  6. Update all @capacitor/* plugins to ^6.0.0 and community plugins to their Capacitor 6 releases. Fix code per references/plugins.md.
  7. Run verification.

Traps

  • addListener now returns only Promise<PluginListenerHandle>. const h = Plugin.addListener(...); h.remove() no longer compiles; use const h = await Plugin.addListener(...).
  • Camera now uses the Android Photo Picker. Gallery cancel rejects with "User cancelled photos app" on Android, like other platforms; update error matching.
  • Filesystem stat() on iOS returns ctime / mtime as numbers, not strings.
  • Do not remove READ_MEDIA_IMAGES / storage permissions if saveToGallery: true or another plugin needs them.

Verification

grep -rn "androidScheme" capacitor.config.*                 # explicit decision recorded
grep -n "compileSdkVersion rootProject" android/app/build.gradle   # expect none (now compileSdk)
grep -n "gradle:8.2.1\|google-services:4.4.0" android/build.gradle
grep -n "distributionUrl" android/gradle/wrapper/gradle-wrapper.properties   # gradle-8.2.1
grep -n "SdkVersion" android/variables.gradle                # 22 / 34 / 34
grep -rnE "= *[A-Za-z]+\.addListener\(" src/                 # each must be awaited
grep -rn "registerPluginInstance" ios/App/App/               # present if the app has local plugins
npx cap sync
cd android && ./gradlew assembleDebug

Build and launch iOS in Xcode 15+. On a device that had the v5 build installed, upgrade in place and confirm login/localStorage survived.

Error Handling

ErrorFix
Migrate can only be used on capacitor 5 and above, please use the CLI in Capacitor 5 to upgrade to 5 firstRun capacitor-app-upgrade-v4-to-v5 first.
Capacitor 6 requires JDK 17 or higher. Some steps may fail.Set Gradle JDK to 17+.
Unable to find "<text>" in <file>. Try updating it manuallyApply the diff from references/android.md.
"<Plugin>" plugin is not implemented on ios (local plugin)Register it in a CAPBridgeViewController subclass (step 4).
Property 'remove' does not exist on type 'Promise<PluginListenerHandle>'await the addListener call.
Users logged out / data gone on AndroidScheme changed. Restore the previous androidScheme value.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.