chore: sync plus with upstream main (upstream-preferred conflicts) - #111
chore: sync plus with upstream main (upstream-preferred conflicts)#111riderx wants to merge 31 commits into
Conversation
Co-authored-by: jcesarmobile <jcesarmobile@gmail.com>
Co-authored-by: Joey Pender <joey.pender@outsystems.com> Co-authored-by: Pedro Bilro <pedro.gustavo.bilro@outsystems.com> Co-authored-by: Mark Anderson <mark.anderson@outsystems.com>
…#8476) Co-authored-by: jcesarmobile <jcesarmobile@gmail.com>
…am#8492) Co-authored-by: Mark Anderson <mark.anderson@outsystems.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
…-team#8271) Co-authored-by: Eric Horodyski <horodyski@ionic.io>
# Conflicts: # .github/workflows/ci.yml
Beta npm buildMaintainers can publish one Capacitor Plus workspace package from this PR to npm for fast testing. Comment Examples: /publish-beta core
/publish-beta cli
/publish-beta @capacitor-plus/coreIf exactly one workspace package changed, Packages:
The workflow will:
Security note: beta publish is only enabled for branches inside this repository. |
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 59 minutes Limit details: You’ve used the included review currently available. Your 60 included PR review attempts over the past 7 days set your current allowance at 1 review per hour. You’re in a promotional period — use the checkbox below to run this review for free:
On-demand reviews are free for the next 31 days. After that, they cost $0.25 per reviewed file. How can I continue?Run this review now using the option above, or comment You can also wait for the limit to reset, then comment An organization admin can change what happens after included review limits in Billing. How do review limits work?CodeRabbit enforces per-developer PR review limits within each organization. For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (57)
Comment |
There was a problem hiding this comment.
34 issues found across 57 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="core/CHANGELOG.md">
<violation number="1" location="core/CHANGELOG.md:6">
P3: The upstream-preferred merge replaced the whole file with upstream's @capacitor/core history, so the changelog no longer documents any @capacitor-plus/core release and its version history no longer corresponds to the package actually published (published as @capacitor-plus/core per README, even though package.json still says @capacitor/core). Readers of the fork's changelog now see only upstream entries that omit fork-specific fixes. This is the known consequence of the upstream-preferred strategy, but confirm the fork's release history (8.3.x) is intentionally discarded rather than accidentally lost in the conflict resolution.</violation>
</file>
<file name="cli/test/migrate-uiscene-scan.spec.ts">
<violation number="1" location="cli/test/migrate-uiscene-scan.spec.ts:155">
P2: The test named 'skips Pods/, build/, and DerivedData/ directories' only creates and asserts on Pods and build. It never creates DerivedData/ or .build/ dirs, even though the scanAndWarn filter also excludes those (and the test title promises them). Add those dirs with matching pattern files so the claimed skip behavior is actually verified.</violation>
</file>
<file name="cli/CHANGELOG.md">
<violation number="1" location="cli/CHANGELOG.md:6">
P2: The upstream-preferred merge replaced the plus changelog head (8.3.12 back to 8.0.x) with upstream's history, dropping entries that document plus-only shipped changes that do not exist upstream: 'enhance package resolution fallbacks' (7a03a14), 'update package references to use @capacitor-plus namespace' (6dd88e6), 'generate correct SPM platforms iOS version' (ddde15c), 'iOS enum' (e78f602), and 'address follow-up review comments' (8bee786). These user-visible plus features are now undocumented in cli/CHANGELOG.md. Preserve the plus-only entries when regenerating or re-merging the changelog instead of replacing it wholesale.</violation>
</file>
<file name="cli/src/ios/update.ts">
<violation number="1" location="cli/src/ios/update.ts:64">
P3: In the new SPM-version-patching block, `getCapacitorPackageVersion(config, config.ios.name)` is awaited inside the `Promise.all(validSPMPackages.map(...))` callback, so the same package-version lookup repeats once per valid SPM plugin instead of once. The value (`iosPlatformVersion`) does not depend on `plugin`, so hoist it before the `map` to avoid N redundant lookups (each goes through `requireCapacitorPackage`).</violation>
<violation number="2" location="cli/src/ios/update.ts:75">
P2: When a plugin formats its Swift package dependency differently from the exact `url: "...",` string, this branch detects the major mismatch but `setAllStringIn` cannot replace it, leaving SwiftPM with the incompatible old dependency. Replace the matched dependency with the regex (or make the replacement search format-independent).</violation>
</file>
<file name="android/capacitor/src/test/java/com/getcapacitor/plugin/SystemBarsTest.java">
<violation number="1" location="android/capacitor/src/test/java/com/getcapacitor/plugin/SystemBarsTest.java:68">
P2: This sync dropped the plus-specific tests that covered `navBarVisible` tracking, but `SystemBars.java` still ships that field and the setHidden logic (lines 65/231/371/382) that updates it. The plus-specific hide/toggle behavior is now completely untested and can regress silently. Keep the `navBarVisible` tests (hideWithEmptyBarHidesSystemBars, togglingNavigationBarTracksNavBarVisible, etc.) and the `navBarVisible` reflection helper alongside the production code, or remove the production field too.</violation>
</file>
<file name="android/CHANGELOG.md">
<violation number="1" location="android/CHANGELOG.md:6">
P2: The upstream-preferred resolution replaced the entire android CHANGELOG with upstream's, silently deleting the plus-branch release history. The @capacitor-plus/android 8.3.x entries and the plus-only fix 'add null check for plugin annotation in getPermissionStates (#92), closes #8400' no longer appear anywhere in the file. That fix was never merged upstream, so its release note is now lost for @capacitor-plus users. Re-add the plus-specific notes into the upstream changelog instead of wholesale replacing it, or confirm this intentional loss and record it in the PR description.</violation>
</file>
<file name="core/package.json">
<violation number="1" location="core/package.json:2">
P1: This merge reverts the package name to `@capacitor/core`, discarding the plus fork's scoped identity. The plus branch requires `@capacitor-plus/core` (drop-in replacement with a distinct scoped name): core/README.md installs `@capacitor-plus/core`, cli/src/cordova.ts and cli/src/common.ts resolve `@capacitor-plus/core` first, and doctor.ts queries `@capacitor-plus/cli`. Publishing under `@capacitor/core` would target the official Ionic package name rather than the fork's scope, breaking the fork's distribution and its drop-in contract with the CLI. Keep the name as `@capacitor-plus/core` when resolving the conflict.</violation>
<violation number="2" location="core/package.json:2">
P0: The upstream-preferred merge reverted the package name to `@capacitor/core`, which breaks the plus fork's identity and its automated publishing pipeline. `build.yml` publishes with `@capacitor-plus/core` (both the stage-dispatch `client_payload[package]` and the release install notes use `@capacitor-plus/core`), and `scripts/sync-peer-dependencies.mjs` finds core packages via `p.name === '@capacitor-plus/core'` — that lookup now fails, so peer-dependency syncing silently skips core. Publishing this package as `@capacitor/core` would target the official npm package owned by Ionic instead of the `@capacitor-plus` scope this fork is meant to publish under. Keep the scoped name `@capacitor-plus/core` and only take upstream's version/fields.</violation>
</file>
<file name="cli/src/util/spm.ts">
<violation number="1" location="cli/src/util/spm.ts:169">
P2: When a Cordova plugin uses a `package` platform tag, the generated product silently drops its configured `moduleAliases` because the Cordova override replaces this string without `aliasText`. Preserve the alias arguments in that override so package options work for all supported SPM plugins.</violation>
</file>
<file name="ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift">
<violation number="1" location="ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift:24">
P2: When multiple scenes are connected, the first `capacitorViewDidAppear` from any bridge consumes every scene's pending `connectionOptions`, so one scene can receive another scene's initial URL and disconnected scenes can deliver stale URLs later. Scope readiness to the originating scene and remove pending observers when that scene disconnects.</violation>
</file>
<file name="android/package.json">
<violation number="1" location="android/package.json:2">
P0: The conflict resolution took the upstream value for the package name, so android now publishes as `@capacitor/android` instead of `@capacitor-plus/android`. The publish job in `.github/workflows/build.yml` runs `npm publish` (`npm stage publish`) inside each package dir and reads the `name` field, so this would publish to the upstream Ionic `@capacitor/android` scope rather than the fork's `@capacitor-plus/android`, and users installing `@capacitor-plus/android` would get nothing. Restore the plus scope (`@capacitor-plus/android`); the version bump to 8.5.0 is fine.</violation>
<violation number="2" location="android/package.json:26">
P1: The peerDependencies entry for `@capacitor-plus/core` was removed and replaced by `@capacitor/core` (upstream-preferred). The android package must peer-depend on the fork's core, not upstream's, otherwise a `@capacitor-plus/android` install would not pull the matching `@capacitor-plus/core` and the plus/drop-in model breaks. Note also that once the name is restored to `@capacitor-plus/android`, `scripts/sync-peer-dependencies.mjs` sets this value to `^8.x.0` automatically, so keep `@capacitor-plus/core` here.</violation>
</file>
<file name="android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java">
<violation number="1" location="android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java:414">
P1: When the host activity is recreated while an image capture intent is open, the new `BridgeWebChromeClient` cannot deliver the result. Restore the static image callback, URI, and chooser type before launching, as the video capture path does.</violation>
</file>
<file name="cli/src/util/xcode.ts">
<violation number="1" location="cli/src/util/xcode.ts:23">
P2: When the file reference already exists elsewhere in the project but is not a member of the first native target, this early return skips adding its build-file and Sources-phase entries. Check target membership (and the requested group) before treating an existing reference as a no-op.</violation>
<violation number="2" location="cli/src/util/xcode.ts:48">
P2: When an Xcode project contains duplicate PBXGroup comments such as multiple `App` groups, this helper adds the file to whichever matching group appears first. Resolve the group by a unique path/parent or reject ambiguous matches before calling `addSourceFile`.</violation>
</file>
<file name="cli/src/util/node.ts">
<violation number="1" location="cli/src/util/node.ts:41">
P2: When a TypeScript 7 config uses non-erasable TypeScript syntax such as an enum or parameter property, native loading rejects it instead of transpiling it, so CLI config loading fails. Preserve a transpilation path for syntax that Node's type stripper cannot handle, or explicitly validate and document this reduced config syntax.</violation>
</file>
<file name="cli/package.json">
<violation number="1" location="cli/package.json:2">
P0: The upstream-preferred conflict resolution reverted the plus-specific package identity: the package name changed from `@capacitor-plus/cli` to `@capacitor/cli` (plus version dropped from 8.3.12 to 8.5.0). The plus branch must publish under the `@capacitor-plus` scope — `cli/README.md` and the root README document `@capacitor-plus/cli`, `.github/workflows/build.yml` publishes `@capacitor-plus/$pkg`, bun.lock maps the cli workspace to `@capacitor-plus/cli`, and `scripts/sync-peer-dependencies.mjs` matches `@capacitor-plus/*`. Publishing under `@capacitor/cli` targets Ionic's real npm package and would collide with it, and it breaks the drop-in-replacement contract that this repo is built around. Restore `@capacitor-plus/cli` (and the plus author/homepage/description) and keep re-running `bun install` so bun.lock stays aligned.</violation>
</file>
<file name="cli/src/tasks/migrate-uiscene.ts">
<violation number="1" location="cli/src/tasks/migrate-uiscene.ts:146">
P2: When an existing `AppDelegate.swift` contains `{` or `}` inside a string or comment, this raw brace scan mistakes it for Swift syntax and can fail to patch the delegate. Ignore strings/comments or use a Swift-aware parser when finding the class boundary.</violation>
<violation number="2" location="cli/src/tasks/migrate-uiscene.ts:174">
P2: When the shipped template archive is missing or unreadable, `extractTemplate` rejects before the `assets === null` fallback, so `migrateToUIScene` aborts instead of skipping safely. Catch extraction errors and return `null` after cleanup.</violation>
<violation number="3" location="cli/src/tasks/migrate-uiscene.ts:187">
P2: When `extractTemplate` or a read under `loadTemplateAssets` throws (missing/corrupt template archive, or an unwritable `assetsDirAbs` because the temp dir is created inside the CLI's node_modules assets folder), the function has only `try/finally` and no `catch`. The exception propagates through `migrateToUIScene`'s unguarded `await loadTemplateAssets(config)` and aborts the whole `migrate` command, bypassing the graceful `if (!assets) { logger.error(...); return; }` skip that the code clearly intends. Add a `catch` that logs and returns `null` so template-load failures degrade to the designed skip instead of crashing.</violation>
</file>
<file name="ios/package.json">
<violation number="1" location="ios/package.json:2">
P0: The upstream-preferred conflict resolution overwrote the plus package identity: `name` is now `@capacitor/ios` instead of `@capacitor-plus/ios`. Publishing relies on the `name` field, so this releases the package into the `@capacitor` scope instead of `@capacitor-plus`, breaking the documented `npm install @capacitor-plus/ios` install path and the CI publish/release flow. Restore `@capacitor-plus/ios` and treat the plus branding as a non-conflicting, always-kept value during sync.</violation>
<violation number="2" location="ios/package.json:28">
P1: The sync reverted `peerDependencies` to only `@capacitor/core`, dropping the `@capacitor-plus/core` peer entry. Since this fork's core is published as `@capacitor-plus/core`, consumers who install this package no longer resolve against the plus core, breaking the plus dependency chain. Keep `@capacitor-plus/core` in the peer dependencies during the upstream sync.</violation>
</file>
<file name="android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java">
<violation number="1" location="android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java:275">
P2: On API < 30, AppCompat can consume the bottom inset from the listener's `insets`, while `safeAreaSource` explicitly preserves the root inset. Use `safeAreaSource` here so passthrough still injects the navigation safe area.</violation>
<violation number="2" location="android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java:300">
P1: When passthrough is disabled, `newInsets` has the system-bar and cutout values zeroed immediately above, so this injects zero safe-area variables on API 30+. Calculate from `safeAreaSource` before returning the consumed insets.</violation>
</file>
<file name="cli/src/tasks/migrate.ts">
<violation number="1" location="cli/src/tasks/migrate.ts:218">
P1: When dependency installation is declined or fails, this still writes the 8.5 UIScene code against the old Capacitor native package. Guard the call on a successful dependency install, or verify the installed native version first.</violation>
<violation number="2" location="cli/src/tasks/migrate.ts:449">
P2: When a project uses `@capacitor-plus/ios`, this migration notice is never emitted even though the migration code handles that package. Include the plus package scope so Capacitor+ users receive the same UIScene guidance.</violation>
</file>
<file name="CHANGELOG.md">
<violation number="1" location="CHANGELOG.md:6">
P3: The conflict resolution interleaved the upstream block (8.5.0..8.3.1) above the plus block (8.3.11..8.3.5), producing duplicate version headings `8.3.4`, `8.3.3`, and `8.3.2` (an upstream entry plus a Cap-go entry, with different dates/content) and an out-of-order top where the newest plus release (8.3.11, 2026-08-13) appears below older upstream entries (8.3.1, 2026-04-16). This makes the changelog misleading to readers and to any lerna/CI tooling that parses headings. Keep the changelog newest-first and de-duplicate the 8.3.x sections so each version has a single heading with merged content.</violation>
<violation number="2" location="CHANGELOG.md:6">
P2: This merge dropped the `8.3.12` changelog section, which was the top (most recent) plus release entry before the sync. The upstream-preferred conflict resolution removed it and never re-added it, so the changelog no longer documents the latest @capacitor-plus release and the version stream jumps from 8.5.0 down into 8.3.11. Restore the 8.3.12 section (the only 8.3.x entry whose release is missing).</violation>
<violation number="3" location="CHANGELOG.md:6">
P2: This merge removed the plus release entry `## [8.3.12]` ("Version bump only for package capacitor") that was the top of the changelog before the sync. It is not re-added anywhere, so the record for that plus release is lost from the changelog. Re-add the 8.3.12 entry (or verify the sync tooling intentionally dropped it) before merging.</violation>
<violation number="4" location="CHANGELOG.md:69">
P2: The 8.3.1 heading now points to the upstream repo (ionic-team/capacitor), but its section body is the plus-specific "sync upstream SystemBars fixes" entry (Cap-go issue #8480/#8481/#106, Cap-go commit a63975d). The merge dropped upstream 8.3.1's own fixes and mislabeled the plus entry under the upstream URL, so the heading and its content no longer agree. Restore the plus 8.3.1 entry under its Cap-go heading and keep upstream 8.3.1 content separate under the ionic-team heading.</violation>
</file>
<file name=".github/workflows/ci.yml">
<violation number="1" location=".github/workflows/ci.yml:28">
P2: The `setup` job restores/saves the `~/.npm` cache but never runs `npm install`, so it never warms or fills that cache. Because all test jobs declare `needs: setup`, actions/cache@v4 saves the (empty) `~/.npm` under the shared ubuntu key when setup finishes first, and the later ubuntu jobs restore that empty entry as a cache hit and skip their own save — so `npm install` stays cold on every run. Run `npm install` in the `setup` job (before the cache save) so the cache is actually populated, or drop the job and its `needs: setup` dependencies.</violation>
<violation number="2" location=".github/workflows/ci.yml:46">
P3: This workflow installs with `npm install` but the repository has no package-lock.json (it is bun-managed, per bun.lock and test.yml's use of oven-sh/setup-bun). Without a lockfile, `npm install` resolves floating dependency versions, so builds are non-reproducible and can diverge from the bun-based test.yml. Install with `bun install`/`bun install --frozen-lockfile` (matching test.yml, keying the cache on bun.lock) or commit a package-lock.json.</violation>
</file>
<file name="cli/src/tasks/run.ts">
<violation number="1" location="cli/src/tasks/run.ts:119">
P2: With live reload on Android, this new failure-path cleanup reverts the capacitor config but leaves the cordova Android manifest modified. writeCordovaAndroidManifest(..., true) added android:usesCleartextTraffic="true", and the catch block never calls it again with false, unlike the SIGINT path that reverts both. After a failed run the manifest keeps the cleartext flag, so a later non-live-reload build still has usesCleartextTraffic="true". Revert the manifest in the catch too when platformName is android.</violation>
</file>
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| "name": "@capacitor/android", |
There was a problem hiding this comment.
P0: The conflict resolution took the upstream value for the package name, so android now publishes as @capacitor/android instead of @capacitor-plus/android. The publish job in .github/workflows/build.yml runs npm publish (npm stage publish) inside each package dir and reads the name field, so this would publish to the upstream Ionic @capacitor/android scope rather than the fork's @capacitor-plus/android, and users installing @capacitor-plus/android would get nothing. Restore the plus scope (@capacitor-plus/android); the version bump to 8.5.0 is fine.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At android/package.json, line 2:
<comment>The conflict resolution took the upstream value for the package name, so android now publishes as `@capacitor/android` instead of `@capacitor-plus/android`. The publish job in `.github/workflows/build.yml` runs `npm publish` (`npm stage publish`) inside each package dir and reads the `name` field, so this would publish to the upstream Ionic `@capacitor/android` scope rather than the fork's `@capacitor-plus/android`, and users installing `@capacitor-plus/android` would get nothing. Restore the plus scope (`@capacitor-plus/android`); the version bump to 8.5.0 is fine.</comment>
<file context>
@@ -1,9 +1,9 @@
- "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
- "homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
- "author": "Capgo Team <support@capgo.app> (https://capgo.app)",
+ "name": "@capacitor/android",
+ "version": "8.5.0",
+ "description": "Capacitor: Cross-platform apps with JavaScript and the web",
</file context>
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| "name": "@capacitor/cli", |
There was a problem hiding this comment.
P0: The upstream-preferred conflict resolution reverted the plus-specific package identity: the package name changed from @capacitor-plus/cli to @capacitor/cli (plus version dropped from 8.3.12 to 8.5.0). The plus branch must publish under the @capacitor-plus scope — cli/README.md and the root README document @capacitor-plus/cli, .github/workflows/build.yml publishes @capacitor-plus/$pkg, bun.lock maps the cli workspace to @capacitor-plus/cli, and scripts/sync-peer-dependencies.mjs matches @capacitor-plus/*. Publishing under @capacitor/cli targets Ionic's real npm package and would collide with it, and it breaks the drop-in-replacement contract that this repo is built around. Restore @capacitor-plus/cli (and the plus author/homepage/description) and keep re-running bun install so bun.lock stays aligned.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At cli/package.json, line 2:
<comment>The upstream-preferred conflict resolution reverted the plus-specific package identity: the package name changed from `@capacitor-plus/cli` to `@capacitor/cli` (plus version dropped from 8.3.12 to 8.5.0). The plus branch must publish under the `@capacitor-plus` scope — `cli/README.md` and the root README document `@capacitor-plus/cli`, `.github/workflows/build.yml` publishes `@capacitor-plus/$pkg`, bun.lock maps the cli workspace to `@capacitor-plus/cli`, and `scripts/sync-peer-dependencies.mjs` matches `@capacitor-plus/*`. Publishing under `@capacitor/cli` targets Ionic's real npm package and would collide with it, and it breaks the drop-in-replacement contract that this repo is built around. Restore `@capacitor-plus/cli` (and the plus author/homepage/description) and keep re-running `bun install` so bun.lock stays aligned.</comment>
<file context>
@@ -1,9 +1,9 @@
- "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
- "homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
- "author": "Capgo Team <support@capgo.app> (https://capgo.app)",
+ "name": "@capacitor/cli",
+ "version": "8.5.0",
+ "description": "Capacitor: Cross-platform apps with JavaScript and the web",
</file context>
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| "name": "@capacitor/ios", |
There was a problem hiding this comment.
P0: The upstream-preferred conflict resolution overwrote the plus package identity: name is now @capacitor/ios instead of @capacitor-plus/ios. Publishing relies on the name field, so this releases the package into the @capacitor scope instead of @capacitor-plus, breaking the documented npm install @capacitor-plus/ios install path and the CI publish/release flow. Restore @capacitor-plus/ios and treat the plus branding as a non-conflicting, always-kept value during sync.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At ios/package.json, line 2:
<comment>The upstream-preferred conflict resolution overwrote the plus package identity: `name` is now `@capacitor/ios` instead of `@capacitor-plus/ios`. Publishing relies on the `name` field, so this releases the package into the `@capacitor` scope instead of `@capacitor-plus`, breaking the documented `npm install @capacitor-plus/ios` install path and the CI publish/release flow. Restore `@capacitor-plus/ios` and treat the plus branding as a non-conflicting, always-kept value during sync.</comment>
<file context>
@@ -1,9 +1,9 @@
- "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
- "homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
- "author": "Capgo Team <support@capgo.app> (https://capgo.app)",
+ "name": "@capacitor/ios",
+ "version": "8.5.0",
+ "description": "Capacitor: Cross-platform apps with JavaScript and the web",
</file context>
| "name": "@capacitor/ios", | |
| "name": "@capacitor-plus/ios", |
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| "name": "@capacitor/core", |
There was a problem hiding this comment.
P0: The upstream-preferred merge reverted the package name to @capacitor/core, which breaks the plus fork's identity and its automated publishing pipeline. build.yml publishes with @capacitor-plus/core (both the stage-dispatch client_payload[package] and the release install notes use @capacitor-plus/core), and scripts/sync-peer-dependencies.mjs finds core packages via p.name === '@capacitor-plus/core' — that lookup now fails, so peer-dependency syncing silently skips core. Publishing this package as @capacitor/core would target the official npm package owned by Ionic instead of the @capacitor-plus scope this fork is meant to publish under. Keep the scoped name @capacitor-plus/core and only take upstream's version/fields.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At core/package.json, line 2:
<comment>The upstream-preferred merge reverted the package name to `@capacitor/core`, which breaks the plus fork's identity and its automated publishing pipeline. `build.yml` publishes with `@capacitor-plus/core` (both the stage-dispatch `client_payload[package]` and the release install notes use `@capacitor-plus/core`), and `scripts/sync-peer-dependencies.mjs` finds core packages via `p.name === '@capacitor-plus/core'` — that lookup now fails, so peer-dependency syncing silently skips core. Publishing this package as `@capacitor/core` would target the official npm package owned by Ionic instead of the `@capacitor-plus` scope this fork is meant to publish under. Keep the scoped name `@capacitor-plus/core` and only take upstream's version/fields.</comment>
<file context>
@@ -1,9 +1,9 @@
- "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
- "homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
- "author": "Capgo Team <support@capgo.app> (https://capgo.app)",
+ "name": "@capacitor/core",
+ "version": "8.5.0",
+ "description": "Capacitor: Cross-platform apps with JavaScript and the web",
</file context>
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| "name": "@capacitor/core", |
There was a problem hiding this comment.
P1: This merge reverts the package name to @capacitor/core, discarding the plus fork's scoped identity. The plus branch requires @capacitor-plus/core (drop-in replacement with a distinct scoped name): core/README.md installs @capacitor-plus/core, cli/src/cordova.ts and cli/src/common.ts resolve @capacitor-plus/core first, and doctor.ts queries @capacitor-plus/cli. Publishing under @capacitor/core would target the official Ionic package name rather than the fork's scope, breaking the fork's distribution and its drop-in contract with the CLI. Keep the name as @capacitor-plus/core when resolving the conflict.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At core/package.json, line 2:
<comment>This merge reverts the package name to `@capacitor/core`, discarding the plus fork's scoped identity. The plus branch requires `@capacitor-plus/core` (drop-in replacement with a distinct scoped name): core/README.md installs `@capacitor-plus/core`, cli/src/cordova.ts and cli/src/common.ts resolve `@capacitor-plus/core` first, and doctor.ts queries `@capacitor-plus/cli`. Publishing under `@capacitor/core` would target the official Ionic package name rather than the fork's scope, breaking the fork's distribution and its drop-in contract with the CLI. Keep the name as `@capacitor-plus/core` when resolving the conflict.</comment>
<file context>
@@ -1,9 +1,9 @@
- "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
- "homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
- "author": "Capgo Team <support@capgo.app> (https://capgo.app)",
+ "name": "@capacitor/core",
+ "version": "8.5.0",
+ "description": "Capacitor: Cross-platform apps with JavaScript and the web",
</file context>
| "name": "@capacitor/core", | |
| "name": "@capacitor-plus/core", |
| } finally { | ||
| deleteFolderRecursive(tempDir); | ||
| } |
There was a problem hiding this comment.
P2: When extractTemplate or a read under loadTemplateAssets throws (missing/corrupt template archive, or an unwritable assetsDirAbs because the temp dir is created inside the CLI's node_modules assets folder), the function has only try/finally and no catch. The exception propagates through migrateToUIScene's unguarded await loadTemplateAssets(config) and aborts the whole migrate command, bypassing the graceful if (!assets) { logger.error(...); return; } skip that the code clearly intends. Add a catch that logs and returns null so template-load failures degrade to the designed skip instead of crashing.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At cli/src/tasks/migrate-uiscene.ts, line 187:
<comment>When `extractTemplate` or a read under `loadTemplateAssets` throws (missing/corrupt template archive, or an unwritable `assetsDirAbs` because the temp dir is created inside the CLI's node_modules assets folder), the function has only `try/finally` and no `catch`. The exception propagates through `migrateToUIScene`'s unguarded `await loadTemplateAssets(config)` and aborts the whole `migrate` command, bypassing the graceful `if (!assets) { logger.error(...); return; }` skip that the code clearly intends. Add a `catch` that logs and returns `null` so template-load failures degrade to the designed skip instead of crashing.</comment>
<file context>
@@ -0,0 +1,305 @@
+ return null;
+ }
+ return { sceneDelegate, configurationForConnectingSnippet };
+ } finally {
+ deleteFolderRecursive(tempDir);
+ }
</file context>
| } finally { | |
| deleteFolderRecursive(tempDir); | |
| } | |
| } catch (err) { | |
| logger.error(`UIScene migration: could not extract template assets: ${err}`); | |
| return null; | |
| } finally { | |
| deleteFolderRecursive(tempDir); | |
| } |
|
|
||
|
|
||
| ## [8.0.3](https://github.com/Cap-go/capacitor-plus/compare/8.0.2...8.0.3) (2025-12-16) | ||
| # [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31) |
There was a problem hiding this comment.
P3: The upstream-preferred merge replaced the whole file with upstream's @capacitor/core history, so the changelog no longer documents any @capacitor-plus/core release and its version history no longer corresponds to the package actually published (published as @capacitor-plus/core per README, even though package.json still says @capacitor/core). Readers of the fork's changelog now see only upstream entries that omit fork-specific fixes. This is the known consequence of the upstream-preferred strategy, but confirm the fork's release history (8.3.x) is intentionally discarded rather than accidentally lost in the conflict resolution.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At core/CHANGELOG.md, line 6:
<comment>The upstream-preferred merge replaced the whole file with upstream's @capacitor/core history, so the changelog no longer documents any @capacitor-plus/core release and its version history no longer corresponds to the package actually published (published as @capacitor-plus/core per README, even though package.json still says @capacitor/core). Readers of the fork's changelog now see only upstream entries that omit fork-specific fixes. This is the known consequence of the upstream-preferred strategy, but confirm the fork's release history (8.3.x) is intentionally discarded rather than accidentally lost in the conflict resolution.</comment>
<file context>
@@ -3,228 +3,33 @@
-
-
-## [8.0.3](https://github.com/Cap-go/capacitor-plus/compare/8.0.2...8.0.3) (2025-12-16)
+# [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31)
+**Note:** Version bump only for package @capacitor/core
</file context>
| const validSPMPackages = await checkPluginsForPackageSwift(config, plugins); | ||
| await Promise.all( | ||
| validSPMPackages.map(async (plugin) => { | ||
| const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name); |
There was a problem hiding this comment.
P3: In the new SPM-version-patching block, getCapacitorPackageVersion(config, config.ios.name) is awaited inside the Promise.all(validSPMPackages.map(...)) callback, so the same package-version lookup repeats once per valid SPM plugin instead of once. The value (iosPlatformVersion) does not depend on plugin, so hoist it before the map to avoid N redundant lookups (each goes through requireCapacitorPackage).
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At cli/src/ios/update.ts, line 64:
<comment>In the new SPM-version-patching block, `getCapacitorPackageVersion(config, config.ios.name)` is awaited inside the `Promise.all(validSPMPackages.map(...))` callback, so the same package-version lookup repeats once per valid SPM plugin instead of once. The value (`iosPlatformVersion`) does not depend on `plugin`, so hoist it before the `map` to avoid N redundant lookups (each goes through `requireCapacitorPackage`).</comment>
<file context>
@@ -58,6 +59,30 @@ async function updatePluginFiles(config: Config, plugins: Plugin[], deployment:
const validSPMPackages = await checkPluginsForPackageSwift(config, plugins);
+ await Promise.all(
+ validSPMPackages.map(async (plugin) => {
+ const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name);
+ const packageSwiftPath = join(plugin.rootPath, 'Package.swift');
+ let content = await readFile(packageSwiftPath, { encoding: 'utf-8' });
</file context>
| @@ -3,8 +3,70 @@ | |||
| All notable changes to this project will be documented in this file. | |||
There was a problem hiding this comment.
P3: The conflict resolution interleaved the upstream block (8.5.0..8.3.1) above the plus block (8.3.11..8.3.5), producing duplicate version headings 8.3.4, 8.3.3, and 8.3.2 (an upstream entry plus a Cap-go entry, with different dates/content) and an out-of-order top where the newest plus release (8.3.11, 2026-08-13) appears below older upstream entries (8.3.1, 2026-04-16). This makes the changelog misleading to readers and to any lerna/CI tooling that parses headings. Keep the changelog newest-first and de-duplicate the 8.3.x sections so each version has a single heading with merged content.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At CHANGELOG.md, line 6:
<comment>The conflict resolution interleaved the upstream block (8.5.0..8.3.1) above the plus block (8.3.11..8.3.5), producing duplicate version headings `8.3.4`, `8.3.3`, and `8.3.2` (an upstream entry plus a Cap-go entry, with different dates/content) and an out-of-order top where the newest plus release (8.3.11, 2026-08-13) appears below older upstream entries (8.3.1, 2026-04-16). This makes the changelog misleading to readers and to any lerna/CI tooling that parses headings. Keep the changelog newest-first and de-duplicate the 8.3.x sections so each version has a single heading with merged content.</comment>
<file context>
@@ -3,8 +3,70 @@
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-## [8.3.12](https://github.com/Cap-go/capacitor-plus/compare/8.3.11...8.3.12) (2026-08-13)
+# [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31)
+### Bug Fixes
</file context>
| with: | ||
| path: ~/.npm | ||
| key: ${{ runner.OS }}-dependencies-cache-${{ hashFiles('**/package.json') }} | ||
| - run: npm install |
There was a problem hiding this comment.
P3: This workflow installs with npm install but the repository has no package-lock.json (it is bun-managed, per bun.lock and test.yml's use of oven-sh/setup-bun). Without a lockfile, npm install resolves floating dependency versions, so builds are non-reproducible and can diverge from the bun-based test.yml. Install with bun install/bun install --frozen-lockfile (matching test.yml, keying the cache on bun.lock) or commit a package-lock.json.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .github/workflows/ci.yml, line 46:
<comment>This workflow installs with `npm install` but the repository has no package-lock.json (it is bun-managed, per bun.lock and test.yml's use of oven-sh/setup-bun). Without a lockfile, `npm install` resolves floating dependency versions, so builds are non-reproducible and can diverge from the bun-based test.yml. Install with `bun install`/`bun install --frozen-lockfile` (matching test.yml, keying the cache on bun.lock) or commit a package-lock.json.</comment>
<file context>
@@ -0,0 +1,142 @@
+ with:
+ path: ~/.npm
+ key: ${{ runner.OS }}-dependencies-cache-${{ hashFiles('**/package.json') }}
+ - run: npm install
+ - run: brew install swiftlint
+ - run: npm run lint
</file context>
There was a problem hiding this comment.
34 issues found across 57 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="core/CHANGELOG.md">
<violation number="1" location="core/CHANGELOG.md:6">
P3: The upstream-preferred merge replaced the whole file with upstream's @capacitor/core history, so the changelog no longer documents any @capacitor-plus/core release and its version history no longer corresponds to the package actually published (published as @capacitor-plus/core per README, even though package.json still says @capacitor/core). Readers of the fork's changelog now see only upstream entries that omit fork-specific fixes. This is the known consequence of the upstream-preferred strategy, but confirm the fork's release history (8.3.x) is intentionally discarded rather than accidentally lost in the conflict resolution.</violation>
</file>
<file name="cli/test/migrate-uiscene-scan.spec.ts">
<violation number="1" location="cli/test/migrate-uiscene-scan.spec.ts:155">
P2: The test named 'skips Pods/, build/, and DerivedData/ directories' only creates and asserts on Pods and build. It never creates DerivedData/ or .build/ dirs, even though the scanAndWarn filter also excludes those (and the test title promises them). Add those dirs with matching pattern files so the claimed skip behavior is actually verified.</violation>
</file>
<file name="cli/CHANGELOG.md">
<violation number="1" location="cli/CHANGELOG.md:6">
P2: The upstream-preferred merge replaced the plus changelog head (8.3.12 back to 8.0.x) with upstream's history, dropping entries that document plus-only shipped changes that do not exist upstream: 'enhance package resolution fallbacks' (7a03a14), 'update package references to use @capacitor-plus namespace' (6dd88e6), 'generate correct SPM platforms iOS version' (ddde15c), 'iOS enum' (e78f602), and 'address follow-up review comments' (8bee786). These user-visible plus features are now undocumented in cli/CHANGELOG.md. Preserve the plus-only entries when regenerating or re-merging the changelog instead of replacing it wholesale.</violation>
</file>
<file name="cli/src/ios/update.ts">
<violation number="1" location="cli/src/ios/update.ts:64">
P3: In the new SPM-version-patching block, `getCapacitorPackageVersion(config, config.ios.name)` is awaited inside the `Promise.all(validSPMPackages.map(...))` callback, so the same package-version lookup repeats once per valid SPM plugin instead of once. The value (`iosPlatformVersion`) does not depend on `plugin`, so hoist it before the `map` to avoid N redundant lookups (each goes through `requireCapacitorPackage`).</violation>
<violation number="2" location="cli/src/ios/update.ts:75">
P2: When a plugin formats its Swift package dependency differently from the exact `url: "...",` string, this branch detects the major mismatch but `setAllStringIn` cannot replace it, leaving SwiftPM with the incompatible old dependency. Replace the matched dependency with the regex (or make the replacement search format-independent).</violation>
</file>
<file name="android/capacitor/src/test/java/com/getcapacitor/plugin/SystemBarsTest.java">
<violation number="1" location="android/capacitor/src/test/java/com/getcapacitor/plugin/SystemBarsTest.java:68">
P2: This sync dropped the plus-specific tests that covered `navBarVisible` tracking, but `SystemBars.java` still ships that field and the setHidden logic (lines 65/231/371/382) that updates it. The plus-specific hide/toggle behavior is now completely untested and can regress silently. Keep the `navBarVisible` tests (hideWithEmptyBarHidesSystemBars, togglingNavigationBarTracksNavBarVisible, etc.) and the `navBarVisible` reflection helper alongside the production code, or remove the production field too.</violation>
</file>
<file name="android/CHANGELOG.md">
<violation number="1" location="android/CHANGELOG.md:6">
P2: The upstream-preferred resolution replaced the entire android CHANGELOG with upstream's, silently deleting the plus-branch release history. The @capacitor-plus/android 8.3.x entries and the plus-only fix 'add null check for plugin annotation in getPermissionStates (#92), closes #8400' no longer appear anywhere in the file. That fix was never merged upstream, so its release note is now lost for @capacitor-plus users. Re-add the plus-specific notes into the upstream changelog instead of wholesale replacing it, or confirm this intentional loss and record it in the PR description.</violation>
</file>
<file name="core/package.json">
<violation number="1" location="core/package.json:2">
P1: This merge reverts the package name to `@capacitor/core`, discarding the plus fork's scoped identity. The plus branch requires `@capacitor-plus/core` (drop-in replacement with a distinct scoped name): core/README.md installs `@capacitor-plus/core`, cli/src/cordova.ts and cli/src/common.ts resolve `@capacitor-plus/core` first, and doctor.ts queries `@capacitor-plus/cli`. Publishing under `@capacitor/core` would target the official Ionic package name rather than the fork's scope, breaking the fork's distribution and its drop-in contract with the CLI. Keep the name as `@capacitor-plus/core` when resolving the conflict.</violation>
<violation number="2" location="core/package.json:2">
P0: The upstream-preferred merge reverted the package name to `@capacitor/core`, which breaks the plus fork's identity and its automated publishing pipeline. `build.yml` publishes with `@capacitor-plus/core` (both the stage-dispatch `client_payload[package]` and the release install notes use `@capacitor-plus/core`), and `scripts/sync-peer-dependencies.mjs` finds core packages via `p.name === '@capacitor-plus/core'` — that lookup now fails, so peer-dependency syncing silently skips core. Publishing this package as `@capacitor/core` would target the official npm package owned by Ionic instead of the `@capacitor-plus` scope this fork is meant to publish under. Keep the scoped name `@capacitor-plus/core` and only take upstream's version/fields.</violation>
</file>
<file name="cli/src/util/spm.ts">
<violation number="1" location="cli/src/util/spm.ts:169">
P2: When a Cordova plugin uses a `package` platform tag, the generated product silently drops its configured `moduleAliases` because the Cordova override replaces this string without `aliasText`. Preserve the alias arguments in that override so package options work for all supported SPM plugins.</violation>
</file>
<file name="ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift">
<violation number="1" location="ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift:24">
P2: When multiple scenes are connected, the first `capacitorViewDidAppear` from any bridge consumes every scene's pending `connectionOptions`, so one scene can receive another scene's initial URL and disconnected scenes can deliver stale URLs later. Scope readiness to the originating scene and remove pending observers when that scene disconnects.</violation>
</file>
<file name="android/package.json">
<violation number="1" location="android/package.json:2">
P0: The conflict resolution took the upstream value for the package name, so android now publishes as `@capacitor/android` instead of `@capacitor-plus/android`. The publish job in `.github/workflows/build.yml` runs `npm publish` (`npm stage publish`) inside each package dir and reads the `name` field, so this would publish to the upstream Ionic `@capacitor/android` scope rather than the fork's `@capacitor-plus/android`, and users installing `@capacitor-plus/android` would get nothing. Restore the plus scope (`@capacitor-plus/android`); the version bump to 8.5.0 is fine.</violation>
<violation number="2" location="android/package.json:26">
P1: The peerDependencies entry for `@capacitor-plus/core` was removed and replaced by `@capacitor/core` (upstream-preferred). The android package must peer-depend on the fork's core, not upstream's, otherwise a `@capacitor-plus/android` install would not pull the matching `@capacitor-plus/core` and the plus/drop-in model breaks. Note also that once the name is restored to `@capacitor-plus/android`, `scripts/sync-peer-dependencies.mjs` sets this value to `^8.x.0` automatically, so keep `@capacitor-plus/core` here.</violation>
</file>
<file name="android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java">
<violation number="1" location="android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java:414">
P1: When the host activity is recreated while an image capture intent is open, the new `BridgeWebChromeClient` cannot deliver the result. Restore the static image callback, URI, and chooser type before launching, as the video capture path does.</violation>
</file>
<file name="cli/src/util/xcode.ts">
<violation number="1" location="cli/src/util/xcode.ts:23">
P2: When the file reference already exists elsewhere in the project but is not a member of the first native target, this early return skips adding its build-file and Sources-phase entries. Check target membership (and the requested group) before treating an existing reference as a no-op.</violation>
<violation number="2" location="cli/src/util/xcode.ts:48">
P2: When an Xcode project contains duplicate PBXGroup comments such as multiple `App` groups, this helper adds the file to whichever matching group appears first. Resolve the group by a unique path/parent or reject ambiguous matches before calling `addSourceFile`.</violation>
</file>
<file name="cli/src/util/node.ts">
<violation number="1" location="cli/src/util/node.ts:41">
P2: When a TypeScript 7 config uses non-erasable TypeScript syntax such as an enum or parameter property, native loading rejects it instead of transpiling it, so CLI config loading fails. Preserve a transpilation path for syntax that Node's type stripper cannot handle, or explicitly validate and document this reduced config syntax.</violation>
</file>
<file name="cli/package.json">
<violation number="1" location="cli/package.json:2">
P0: The upstream-preferred conflict resolution reverted the plus-specific package identity: the package name changed from `@capacitor-plus/cli` to `@capacitor/cli` (plus version dropped from 8.3.12 to 8.5.0). The plus branch must publish under the `@capacitor-plus` scope — `cli/README.md` and the root README document `@capacitor-plus/cli`, `.github/workflows/build.yml` publishes `@capacitor-plus/$pkg`, bun.lock maps the cli workspace to `@capacitor-plus/cli`, and `scripts/sync-peer-dependencies.mjs` matches `@capacitor-plus/*`. Publishing under `@capacitor/cli` targets Ionic's real npm package and would collide with it, and it breaks the drop-in-replacement contract that this repo is built around. Restore `@capacitor-plus/cli` (and the plus author/homepage/description) and keep re-running `bun install` so bun.lock stays aligned.</violation>
</file>
<file name="cli/src/tasks/migrate-uiscene.ts">
<violation number="1" location="cli/src/tasks/migrate-uiscene.ts:146">
P2: When an existing `AppDelegate.swift` contains `{` or `}` inside a string or comment, this raw brace scan mistakes it for Swift syntax and can fail to patch the delegate. Ignore strings/comments or use a Swift-aware parser when finding the class boundary.</violation>
<violation number="2" location="cli/src/tasks/migrate-uiscene.ts:174">
P2: When the shipped template archive is missing or unreadable, `extractTemplate` rejects before the `assets === null` fallback, so `migrateToUIScene` aborts instead of skipping safely. Catch extraction errors and return `null` after cleanup.</violation>
<violation number="3" location="cli/src/tasks/migrate-uiscene.ts:187">
P2: When `extractTemplate` or a read under `loadTemplateAssets` throws (missing/corrupt template archive, or an unwritable `assetsDirAbs` because the temp dir is created inside the CLI's node_modules assets folder), the function has only `try/finally` and no `catch`. The exception propagates through `migrateToUIScene`'s unguarded `await loadTemplateAssets(config)` and aborts the whole `migrate` command, bypassing the graceful `if (!assets) { logger.error(...); return; }` skip that the code clearly intends. Add a `catch` that logs and returns `null` so template-load failures degrade to the designed skip instead of crashing.</violation>
</file>
<file name="ios/package.json">
<violation number="1" location="ios/package.json:2">
P0: The upstream-preferred conflict resolution overwrote the plus package identity: `name` is now `@capacitor/ios` instead of `@capacitor-plus/ios`. Publishing relies on the `name` field, so this releases the package into the `@capacitor` scope instead of `@capacitor-plus`, breaking the documented `npm install @capacitor-plus/ios` install path and the CI publish/release flow. Restore `@capacitor-plus/ios` and treat the plus branding as a non-conflicting, always-kept value during sync.</violation>
<violation number="2" location="ios/package.json:28">
P1: The sync reverted `peerDependencies` to only `@capacitor/core`, dropping the `@capacitor-plus/core` peer entry. Since this fork's core is published as `@capacitor-plus/core`, consumers who install this package no longer resolve against the plus core, breaking the plus dependency chain. Keep `@capacitor-plus/core` in the peer dependencies during the upstream sync.</violation>
</file>
<file name="android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java">
<violation number="1" location="android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java:275">
P2: On API < 30, AppCompat can consume the bottom inset from the listener's `insets`, while `safeAreaSource` explicitly preserves the root inset. Use `safeAreaSource` here so passthrough still injects the navigation safe area.</violation>
<violation number="2" location="android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java:300">
P1: When passthrough is disabled, `newInsets` has the system-bar and cutout values zeroed immediately above, so this injects zero safe-area variables on API 30+. Calculate from `safeAreaSource` before returning the consumed insets.</violation>
</file>
<file name="cli/src/tasks/migrate.ts">
<violation number="1" location="cli/src/tasks/migrate.ts:218">
P1: When dependency installation is declined or fails, this still writes the 8.5 UIScene code against the old Capacitor native package. Guard the call on a successful dependency install, or verify the installed native version first.</violation>
<violation number="2" location="cli/src/tasks/migrate.ts:449">
P2: When a project uses `@capacitor-plus/ios`, this migration notice is never emitted even though the migration code handles that package. Include the plus package scope so Capacitor+ users receive the same UIScene guidance.</violation>
</file>
<file name="CHANGELOG.md">
<violation number="1" location="CHANGELOG.md:6">
P3: The conflict resolution interleaved the upstream block (8.5.0..8.3.1) above the plus block (8.3.11..8.3.5), producing duplicate version headings `8.3.4`, `8.3.3`, and `8.3.2` (an upstream entry plus a Cap-go entry, with different dates/content) and an out-of-order top where the newest plus release (8.3.11, 2026-08-13) appears below older upstream entries (8.3.1, 2026-04-16). This makes the changelog misleading to readers and to any lerna/CI tooling that parses headings. Keep the changelog newest-first and de-duplicate the 8.3.x sections so each version has a single heading with merged content.</violation>
<violation number="2" location="CHANGELOG.md:6">
P2: This merge dropped the `8.3.12` changelog section, which was the top (most recent) plus release entry before the sync. The upstream-preferred conflict resolution removed it and never re-added it, so the changelog no longer documents the latest @capacitor-plus release and the version stream jumps from 8.5.0 down into 8.3.11. Restore the 8.3.12 section (the only 8.3.x entry whose release is missing).</violation>
<violation number="3" location="CHANGELOG.md:6">
P2: This merge removed the plus release entry `## [8.3.12]` ("Version bump only for package capacitor") that was the top of the changelog before the sync. It is not re-added anywhere, so the record for that plus release is lost from the changelog. Re-add the 8.3.12 entry (or verify the sync tooling intentionally dropped it) before merging.</violation>
<violation number="4" location="CHANGELOG.md:69">
P2: The 8.3.1 heading now points to the upstream repo (ionic-team/capacitor), but its section body is the plus-specific "sync upstream SystemBars fixes" entry (Cap-go issue #8480/#8481/#106, Cap-go commit a63975d). The merge dropped upstream 8.3.1's own fixes and mislabeled the plus entry under the upstream URL, so the heading and its content no longer agree. Restore the plus 8.3.1 entry under its Cap-go heading and keep upstream 8.3.1 content separate under the ionic-team heading.</violation>
</file>
<file name=".github/workflows/ci.yml">
<violation number="1" location=".github/workflows/ci.yml:28">
P2: The `setup` job restores/saves the `~/.npm` cache but never runs `npm install`, so it never warms or fills that cache. Because all test jobs declare `needs: setup`, actions/cache@v4 saves the (empty) `~/.npm` under the shared ubuntu key when setup finishes first, and the later ubuntu jobs restore that empty entry as a cache hit and skip their own save — so `npm install` stays cold on every run. Run `npm install` in the `setup` job (before the cache save) so the cache is actually populated, or drop the job and its `needs: setup` dependencies.</violation>
<violation number="2" location=".github/workflows/ci.yml:46">
P3: This workflow installs with `npm install` but the repository has no package-lock.json (it is bun-managed, per bun.lock and test.yml's use of oven-sh/setup-bun). Without a lockfile, `npm install` resolves floating dependency versions, so builds are non-reproducible and can diverge from the bun-based test.yml. Install with `bun install`/`bun install --frozen-lockfile` (matching test.yml, keying the cache on bun.lock) or commit a package-lock.json.</violation>
</file>
<file name="cli/src/tasks/run.ts">
<violation number="1" location="cli/src/tasks/run.ts:119">
P2: With live reload on Android, this new failure-path cleanup reverts the capacitor config but leaves the cordova Android manifest modified. writeCordovaAndroidManifest(..., true) added android:usesCleartextTraffic="true", and the catch block never calls it again with false, unlike the SIGINT path that reverts both. After a failed run the manifest keeps the cleartext flag, so a later non-live-reload build still has usesCleartextTraffic="true". Revert the manifest in the catch too when platformName is android.</violation>
</file>
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| "name": "@capacitor/android", |
There was a problem hiding this comment.
P0: The conflict resolution took the upstream value for the package name, so android now publishes as @capacitor/android instead of @capacitor-plus/android. The publish job in .github/workflows/build.yml runs npm publish (npm stage publish) inside each package dir and reads the name field, so this would publish to the upstream Ionic @capacitor/android scope rather than the fork's @capacitor-plus/android, and users installing @capacitor-plus/android would get nothing. Restore the plus scope (@capacitor-plus/android); the version bump to 8.5.0 is fine.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At android/package.json, line 2:
<comment>The conflict resolution took the upstream value for the package name, so android now publishes as `@capacitor/android` instead of `@capacitor-plus/android`. The publish job in `.github/workflows/build.yml` runs `npm publish` (`npm stage publish`) inside each package dir and reads the `name` field, so this would publish to the upstream Ionic `@capacitor/android` scope rather than the fork's `@capacitor-plus/android`, and users installing `@capacitor-plus/android` would get nothing. Restore the plus scope (`@capacitor-plus/android`); the version bump to 8.5.0 is fine.</comment>
<file context>
@@ -1,9 +1,9 @@
- "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
- "homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
- "author": "Capgo Team <support@capgo.app> (https://capgo.app)",
+ "name": "@capacitor/android",
+ "version": "8.5.0",
+ "description": "Capacitor: Cross-platform apps with JavaScript and the web",
</file context>
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| "name": "@capacitor/cli", |
There was a problem hiding this comment.
P0: The upstream-preferred conflict resolution reverted the plus-specific package identity: the package name changed from @capacitor-plus/cli to @capacitor/cli (plus version dropped from 8.3.12 to 8.5.0). The plus branch must publish under the @capacitor-plus scope — cli/README.md and the root README document @capacitor-plus/cli, .github/workflows/build.yml publishes @capacitor-plus/$pkg, bun.lock maps the cli workspace to @capacitor-plus/cli, and scripts/sync-peer-dependencies.mjs matches @capacitor-plus/*. Publishing under @capacitor/cli targets Ionic's real npm package and would collide with it, and it breaks the drop-in-replacement contract that this repo is built around. Restore @capacitor-plus/cli (and the plus author/homepage/description) and keep re-running bun install so bun.lock stays aligned.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At cli/package.json, line 2:
<comment>The upstream-preferred conflict resolution reverted the plus-specific package identity: the package name changed from `@capacitor-plus/cli` to `@capacitor/cli` (plus version dropped from 8.3.12 to 8.5.0). The plus branch must publish under the `@capacitor-plus` scope — `cli/README.md` and the root README document `@capacitor-plus/cli`, `.github/workflows/build.yml` publishes `@capacitor-plus/$pkg`, bun.lock maps the cli workspace to `@capacitor-plus/cli`, and `scripts/sync-peer-dependencies.mjs` matches `@capacitor-plus/*`. Publishing under `@capacitor/cli` targets Ionic's real npm package and would collide with it, and it breaks the drop-in-replacement contract that this repo is built around. Restore `@capacitor-plus/cli` (and the plus author/homepage/description) and keep re-running `bun install` so bun.lock stays aligned.</comment>
<file context>
@@ -1,9 +1,9 @@
- "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
- "homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
- "author": "Capgo Team <support@capgo.app> (https://capgo.app)",
+ "name": "@capacitor/cli",
+ "version": "8.5.0",
+ "description": "Capacitor: Cross-platform apps with JavaScript and the web",
</file context>
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| "name": "@capacitor/ios", |
There was a problem hiding this comment.
P0: The upstream-preferred conflict resolution overwrote the plus package identity: name is now @capacitor/ios instead of @capacitor-plus/ios. Publishing relies on the name field, so this releases the package into the @capacitor scope instead of @capacitor-plus, breaking the documented npm install @capacitor-plus/ios install path and the CI publish/release flow. Restore @capacitor-plus/ios and treat the plus branding as a non-conflicting, always-kept value during sync.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At ios/package.json, line 2:
<comment>The upstream-preferred conflict resolution overwrote the plus package identity: `name` is now `@capacitor/ios` instead of `@capacitor-plus/ios`. Publishing relies on the `name` field, so this releases the package into the `@capacitor` scope instead of `@capacitor-plus`, breaking the documented `npm install @capacitor-plus/ios` install path and the CI publish/release flow. Restore `@capacitor-plus/ios` and treat the plus branding as a non-conflicting, always-kept value during sync.</comment>
<file context>
@@ -1,9 +1,9 @@
- "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
- "homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
- "author": "Capgo Team <support@capgo.app> (https://capgo.app)",
+ "name": "@capacitor/ios",
+ "version": "8.5.0",
+ "description": "Capacitor: Cross-platform apps with JavaScript and the web",
</file context>
| "name": "@capacitor/ios", | |
| "name": "@capacitor-plus/ios", |
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| "name": "@capacitor/core", |
There was a problem hiding this comment.
P0: The upstream-preferred merge reverted the package name to @capacitor/core, which breaks the plus fork's identity and its automated publishing pipeline. build.yml publishes with @capacitor-plus/core (both the stage-dispatch client_payload[package] and the release install notes use @capacitor-plus/core), and scripts/sync-peer-dependencies.mjs finds core packages via p.name === '@capacitor-plus/core' — that lookup now fails, so peer-dependency syncing silently skips core. Publishing this package as @capacitor/core would target the official npm package owned by Ionic instead of the @capacitor-plus scope this fork is meant to publish under. Keep the scoped name @capacitor-plus/core and only take upstream's version/fields.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At core/package.json, line 2:
<comment>The upstream-preferred merge reverted the package name to `@capacitor/core`, which breaks the plus fork's identity and its automated publishing pipeline. `build.yml` publishes with `@capacitor-plus/core` (both the stage-dispatch `client_payload[package]` and the release install notes use `@capacitor-plus/core`), and `scripts/sync-peer-dependencies.mjs` finds core packages via `p.name === '@capacitor-plus/core'` — that lookup now fails, so peer-dependency syncing silently skips core. Publishing this package as `@capacitor/core` would target the official npm package owned by Ionic instead of the `@capacitor-plus` scope this fork is meant to publish under. Keep the scoped name `@capacitor-plus/core` and only take upstream's version/fields.</comment>
<file context>
@@ -1,9 +1,9 @@
- "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
- "homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
- "author": "Capgo Team <support@capgo.app> (https://capgo.app)",
+ "name": "@capacitor/core",
+ "version": "8.5.0",
+ "description": "Capacitor: Cross-platform apps with JavaScript and the web",
</file context>
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| "name": "@capacitor/core", |
There was a problem hiding this comment.
P1: This merge reverts the package name to @capacitor/core, discarding the plus fork's scoped identity. The plus branch requires @capacitor-plus/core (drop-in replacement with a distinct scoped name): core/README.md installs @capacitor-plus/core, cli/src/cordova.ts and cli/src/common.ts resolve @capacitor-plus/core first, and doctor.ts queries @capacitor-plus/cli. Publishing under @capacitor/core would target the official Ionic package name rather than the fork's scope, breaking the fork's distribution and its drop-in contract with the CLI. Keep the name as @capacitor-plus/core when resolving the conflict.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At core/package.json, line 2:
<comment>This merge reverts the package name to `@capacitor/core`, discarding the plus fork's scoped identity. The plus branch requires `@capacitor-plus/core` (drop-in replacement with a distinct scoped name): core/README.md installs `@capacitor-plus/core`, cli/src/cordova.ts and cli/src/common.ts resolve `@capacitor-plus/core` first, and doctor.ts queries `@capacitor-plus/cli`. Publishing under `@capacitor/core` would target the official Ionic package name rather than the fork's scope, breaking the fork's distribution and its drop-in contract with the CLI. Keep the name as `@capacitor-plus/core` when resolving the conflict.</comment>
<file context>
@@ -1,9 +1,9 @@
- "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
- "homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
- "author": "Capgo Team <support@capgo.app> (https://capgo.app)",
+ "name": "@capacitor/core",
+ "version": "8.5.0",
+ "description": "Capacitor: Cross-platform apps with JavaScript and the web",
</file context>
| "name": "@capacitor/core", | |
| "name": "@capacitor-plus/core", |
| } finally { | ||
| deleteFolderRecursive(tempDir); | ||
| } |
There was a problem hiding this comment.
P2: When extractTemplate or a read under loadTemplateAssets throws (missing/corrupt template archive, or an unwritable assetsDirAbs because the temp dir is created inside the CLI's node_modules assets folder), the function has only try/finally and no catch. The exception propagates through migrateToUIScene's unguarded await loadTemplateAssets(config) and aborts the whole migrate command, bypassing the graceful if (!assets) { logger.error(...); return; } skip that the code clearly intends. Add a catch that logs and returns null so template-load failures degrade to the designed skip instead of crashing.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At cli/src/tasks/migrate-uiscene.ts, line 187:
<comment>When `extractTemplate` or a read under `loadTemplateAssets` throws (missing/corrupt template archive, or an unwritable `assetsDirAbs` because the temp dir is created inside the CLI's node_modules assets folder), the function has only `try/finally` and no `catch`. The exception propagates through `migrateToUIScene`'s unguarded `await loadTemplateAssets(config)` and aborts the whole `migrate` command, bypassing the graceful `if (!assets) { logger.error(...); return; }` skip that the code clearly intends. Add a `catch` that logs and returns `null` so template-load failures degrade to the designed skip instead of crashing.</comment>
<file context>
@@ -0,0 +1,305 @@
+ return null;
+ }
+ return { sceneDelegate, configurationForConnectingSnippet };
+ } finally {
+ deleteFolderRecursive(tempDir);
+ }
</file context>
| } finally { | |
| deleteFolderRecursive(tempDir); | |
| } | |
| } catch (err) { | |
| logger.error(`UIScene migration: could not extract template assets: ${err}`); | |
| return null; | |
| } finally { | |
| deleteFolderRecursive(tempDir); | |
| } |
|
|
||
|
|
||
| ## [8.0.3](https://github.com/Cap-go/capacitor-plus/compare/8.0.2...8.0.3) (2025-12-16) | ||
| # [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31) |
There was a problem hiding this comment.
P3: The upstream-preferred merge replaced the whole file with upstream's @capacitor/core history, so the changelog no longer documents any @capacitor-plus/core release and its version history no longer corresponds to the package actually published (published as @capacitor-plus/core per README, even though package.json still says @capacitor/core). Readers of the fork's changelog now see only upstream entries that omit fork-specific fixes. This is the known consequence of the upstream-preferred strategy, but confirm the fork's release history (8.3.x) is intentionally discarded rather than accidentally lost in the conflict resolution.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At core/CHANGELOG.md, line 6:
<comment>The upstream-preferred merge replaced the whole file with upstream's @capacitor/core history, so the changelog no longer documents any @capacitor-plus/core release and its version history no longer corresponds to the package actually published (published as @capacitor-plus/core per README, even though package.json still says @capacitor/core). Readers of the fork's changelog now see only upstream entries that omit fork-specific fixes. This is the known consequence of the upstream-preferred strategy, but confirm the fork's release history (8.3.x) is intentionally discarded rather than accidentally lost in the conflict resolution.</comment>
<file context>
@@ -3,228 +3,33 @@
-
-
-## [8.0.3](https://github.com/Cap-go/capacitor-plus/compare/8.0.2...8.0.3) (2025-12-16)
+# [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31)
+**Note:** Version bump only for package @capacitor/core
</file context>
| const validSPMPackages = await checkPluginsForPackageSwift(config, plugins); | ||
| await Promise.all( | ||
| validSPMPackages.map(async (plugin) => { | ||
| const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name); |
There was a problem hiding this comment.
P3: In the new SPM-version-patching block, getCapacitorPackageVersion(config, config.ios.name) is awaited inside the Promise.all(validSPMPackages.map(...)) callback, so the same package-version lookup repeats once per valid SPM plugin instead of once. The value (iosPlatformVersion) does not depend on plugin, so hoist it before the map to avoid N redundant lookups (each goes through requireCapacitorPackage).
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At cli/src/ios/update.ts, line 64:
<comment>In the new SPM-version-patching block, `getCapacitorPackageVersion(config, config.ios.name)` is awaited inside the `Promise.all(validSPMPackages.map(...))` callback, so the same package-version lookup repeats once per valid SPM plugin instead of once. The value (`iosPlatformVersion`) does not depend on `plugin`, so hoist it before the `map` to avoid N redundant lookups (each goes through `requireCapacitorPackage`).</comment>
<file context>
@@ -58,6 +59,30 @@ async function updatePluginFiles(config: Config, plugins: Plugin[], deployment:
const validSPMPackages = await checkPluginsForPackageSwift(config, plugins);
+ await Promise.all(
+ validSPMPackages.map(async (plugin) => {
+ const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name);
+ const packageSwiftPath = join(plugin.rootPath, 'Package.swift');
+ let content = await readFile(packageSwiftPath, { encoding: 'utf-8' });
</file context>
| @@ -3,8 +3,70 @@ | |||
| All notable changes to this project will be documented in this file. | |||
There was a problem hiding this comment.
P3: The conflict resolution interleaved the upstream block (8.5.0..8.3.1) above the plus block (8.3.11..8.3.5), producing duplicate version headings 8.3.4, 8.3.3, and 8.3.2 (an upstream entry plus a Cap-go entry, with different dates/content) and an out-of-order top where the newest plus release (8.3.11, 2026-08-13) appears below older upstream entries (8.3.1, 2026-04-16). This makes the changelog misleading to readers and to any lerna/CI tooling that parses headings. Keep the changelog newest-first and de-duplicate the 8.3.x sections so each version has a single heading with merged content.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At CHANGELOG.md, line 6:
<comment>The conflict resolution interleaved the upstream block (8.5.0..8.3.1) above the plus block (8.3.11..8.3.5), producing duplicate version headings `8.3.4`, `8.3.3`, and `8.3.2` (an upstream entry plus a Cap-go entry, with different dates/content) and an out-of-order top where the newest plus release (8.3.11, 2026-08-13) appears below older upstream entries (8.3.1, 2026-04-16). This makes the changelog misleading to readers and to any lerna/CI tooling that parses headings. Keep the changelog newest-first and de-duplicate the 8.3.x sections so each version has a single heading with merged content.</comment>
<file context>
@@ -3,8 +3,70 @@
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-## [8.3.12](https://github.com/Cap-go/capacitor-plus/compare/8.3.11...8.3.12) (2026-08-13)
+# [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31)
+### Bug Fixes
</file context>
| with: | ||
| path: ~/.npm | ||
| key: ${{ runner.OS }}-dependencies-cache-${{ hashFiles('**/package.json') }} | ||
| - run: npm install |
There was a problem hiding this comment.
P3: This workflow installs with npm install but the repository has no package-lock.json (it is bun-managed, per bun.lock and test.yml's use of oven-sh/setup-bun). Without a lockfile, npm install resolves floating dependency versions, so builds are non-reproducible and can diverge from the bun-based test.yml. Install with bun install/bun install --frozen-lockfile (matching test.yml, keying the cache on bun.lock) or commit a package-lock.json.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .github/workflows/ci.yml, line 46:
<comment>This workflow installs with `npm install` but the repository has no package-lock.json (it is bun-managed, per bun.lock and test.yml's use of oven-sh/setup-bun). Without a lockfile, `npm install` resolves floating dependency versions, so builds are non-reproducible and can diverge from the bun-based test.yml. Install with `bun install`/`bun install --frozen-lockfile` (matching test.yml, keying the cache on bun.lock) or commit a package-lock.json.</comment>
<file context>
@@ -0,0 +1,142 @@
+ with:
+ path: ~/.npm
+ key: ${{ runner.OS }}-dependencies-cache-${{ hashFiles('**/package.json') }}
+ - run: npm install
+ - run: brew install swiftlint
+ - run: npm run lint
</file context>
There was a problem hiding this comment.
34 issues found across 57 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="core/CHANGELOG.md">
<violation number="1" location="core/CHANGELOG.md:6">
P3: The upstream-preferred merge replaced the whole file with upstream's @capacitor/core history, so the changelog no longer documents any @capacitor-plus/core release and its version history no longer corresponds to the package actually published (published as @capacitor-plus/core per README, even though package.json still says @capacitor/core). Readers of the fork's changelog now see only upstream entries that omit fork-specific fixes. This is the known consequence of the upstream-preferred strategy, but confirm the fork's release history (8.3.x) is intentionally discarded rather than accidentally lost in the conflict resolution.</violation>
</file>
<file name="cli/test/migrate-uiscene-scan.spec.ts">
<violation number="1" location="cli/test/migrate-uiscene-scan.spec.ts:155">
P2: The test named 'skips Pods/, build/, and DerivedData/ directories' only creates and asserts on Pods and build. It never creates DerivedData/ or .build/ dirs, even though the scanAndWarn filter also excludes those (and the test title promises them). Add those dirs with matching pattern files so the claimed skip behavior is actually verified.</violation>
</file>
<file name="cli/CHANGELOG.md">
<violation number="1" location="cli/CHANGELOG.md:6">
P2: The upstream-preferred merge replaced the plus changelog head (8.3.12 back to 8.0.x) with upstream's history, dropping entries that document plus-only shipped changes that do not exist upstream: 'enhance package resolution fallbacks' (7a03a14), 'update package references to use @capacitor-plus namespace' (6dd88e6), 'generate correct SPM platforms iOS version' (ddde15c), 'iOS enum' (e78f602), and 'address follow-up review comments' (8bee786). These user-visible plus features are now undocumented in cli/CHANGELOG.md. Preserve the plus-only entries when regenerating or re-merging the changelog instead of replacing it wholesale.</violation>
</file>
<file name="cli/src/ios/update.ts">
<violation number="1" location="cli/src/ios/update.ts:64">
P3: In the new SPM-version-patching block, `getCapacitorPackageVersion(config, config.ios.name)` is awaited inside the `Promise.all(validSPMPackages.map(...))` callback, so the same package-version lookup repeats once per valid SPM plugin instead of once. The value (`iosPlatformVersion`) does not depend on `plugin`, so hoist it before the `map` to avoid N redundant lookups (each goes through `requireCapacitorPackage`).</violation>
<violation number="2" location="cli/src/ios/update.ts:75">
P2: When a plugin formats its Swift package dependency differently from the exact `url: "...",` string, this branch detects the major mismatch but `setAllStringIn` cannot replace it, leaving SwiftPM with the incompatible old dependency. Replace the matched dependency with the regex (or make the replacement search format-independent).</violation>
</file>
<file name="android/capacitor/src/test/java/com/getcapacitor/plugin/SystemBarsTest.java">
<violation number="1" location="android/capacitor/src/test/java/com/getcapacitor/plugin/SystemBarsTest.java:68">
P2: This sync dropped the plus-specific tests that covered `navBarVisible` tracking, but `SystemBars.java` still ships that field and the setHidden logic (lines 65/231/371/382) that updates it. The plus-specific hide/toggle behavior is now completely untested and can regress silently. Keep the `navBarVisible` tests (hideWithEmptyBarHidesSystemBars, togglingNavigationBarTracksNavBarVisible, etc.) and the `navBarVisible` reflection helper alongside the production code, or remove the production field too.</violation>
</file>
<file name="android/CHANGELOG.md">
<violation number="1" location="android/CHANGELOG.md:6">
P2: The upstream-preferred resolution replaced the entire android CHANGELOG with upstream's, silently deleting the plus-branch release history. The @capacitor-plus/android 8.3.x entries and the plus-only fix 'add null check for plugin annotation in getPermissionStates (#92), closes #8400' no longer appear anywhere in the file. That fix was never merged upstream, so its release note is now lost for @capacitor-plus users. Re-add the plus-specific notes into the upstream changelog instead of wholesale replacing it, or confirm this intentional loss and record it in the PR description.</violation>
</file>
<file name="core/package.json">
<violation number="1" location="core/package.json:2">
P1: This merge reverts the package name to `@capacitor/core`, discarding the plus fork's scoped identity. The plus branch requires `@capacitor-plus/core` (drop-in replacement with a distinct scoped name): core/README.md installs `@capacitor-plus/core`, cli/src/cordova.ts and cli/src/common.ts resolve `@capacitor-plus/core` first, and doctor.ts queries `@capacitor-plus/cli`. Publishing under `@capacitor/core` would target the official Ionic package name rather than the fork's scope, breaking the fork's distribution and its drop-in contract with the CLI. Keep the name as `@capacitor-plus/core` when resolving the conflict.</violation>
<violation number="2" location="core/package.json:2">
P0: The upstream-preferred merge reverted the package name to `@capacitor/core`, which breaks the plus fork's identity and its automated publishing pipeline. `build.yml` publishes with `@capacitor-plus/core` (both the stage-dispatch `client_payload[package]` and the release install notes use `@capacitor-plus/core`), and `scripts/sync-peer-dependencies.mjs` finds core packages via `p.name === '@capacitor-plus/core'` — that lookup now fails, so peer-dependency syncing silently skips core. Publishing this package as `@capacitor/core` would target the official npm package owned by Ionic instead of the `@capacitor-plus` scope this fork is meant to publish under. Keep the scoped name `@capacitor-plus/core` and only take upstream's version/fields.</violation>
</file>
<file name="cli/src/util/spm.ts">
<violation number="1" location="cli/src/util/spm.ts:169">
P2: When a Cordova plugin uses a `package` platform tag, the generated product silently drops its configured `moduleAliases` because the Cordova override replaces this string without `aliasText`. Preserve the alias arguments in that override so package options work for all supported SPM plugins.</violation>
</file>
<file name="ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift">
<violation number="1" location="ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift:24">
P2: When multiple scenes are connected, the first `capacitorViewDidAppear` from any bridge consumes every scene's pending `connectionOptions`, so one scene can receive another scene's initial URL and disconnected scenes can deliver stale URLs later. Scope readiness to the originating scene and remove pending observers when that scene disconnects.</violation>
</file>
<file name="android/package.json">
<violation number="1" location="android/package.json:2">
P0: The conflict resolution took the upstream value for the package name, so android now publishes as `@capacitor/android` instead of `@capacitor-plus/android`. The publish job in `.github/workflows/build.yml` runs `npm publish` (`npm stage publish`) inside each package dir and reads the `name` field, so this would publish to the upstream Ionic `@capacitor/android` scope rather than the fork's `@capacitor-plus/android`, and users installing `@capacitor-plus/android` would get nothing. Restore the plus scope (`@capacitor-plus/android`); the version bump to 8.5.0 is fine.</violation>
<violation number="2" location="android/package.json:26">
P1: The peerDependencies entry for `@capacitor-plus/core` was removed and replaced by `@capacitor/core` (upstream-preferred). The android package must peer-depend on the fork's core, not upstream's, otherwise a `@capacitor-plus/android` install would not pull the matching `@capacitor-plus/core` and the plus/drop-in model breaks. Note also that once the name is restored to `@capacitor-plus/android`, `scripts/sync-peer-dependencies.mjs` sets this value to `^8.x.0` automatically, so keep `@capacitor-plus/core` here.</violation>
</file>
<file name="android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java">
<violation number="1" location="android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java:414">
P1: When the host activity is recreated while an image capture intent is open, the new `BridgeWebChromeClient` cannot deliver the result. Restore the static image callback, URI, and chooser type before launching, as the video capture path does.</violation>
</file>
<file name="cli/src/util/xcode.ts">
<violation number="1" location="cli/src/util/xcode.ts:23">
P2: When the file reference already exists elsewhere in the project but is not a member of the first native target, this early return skips adding its build-file and Sources-phase entries. Check target membership (and the requested group) before treating an existing reference as a no-op.</violation>
<violation number="2" location="cli/src/util/xcode.ts:48">
P2: When an Xcode project contains duplicate PBXGroup comments such as multiple `App` groups, this helper adds the file to whichever matching group appears first. Resolve the group by a unique path/parent or reject ambiguous matches before calling `addSourceFile`.</violation>
</file>
<file name="cli/src/util/node.ts">
<violation number="1" location="cli/src/util/node.ts:41">
P2: When a TypeScript 7 config uses non-erasable TypeScript syntax such as an enum or parameter property, native loading rejects it instead of transpiling it, so CLI config loading fails. Preserve a transpilation path for syntax that Node's type stripper cannot handle, or explicitly validate and document this reduced config syntax.</violation>
</file>
<file name="cli/package.json">
<violation number="1" location="cli/package.json:2">
P0: The upstream-preferred conflict resolution reverted the plus-specific package identity: the package name changed from `@capacitor-plus/cli` to `@capacitor/cli` (plus version dropped from 8.3.12 to 8.5.0). The plus branch must publish under the `@capacitor-plus` scope — `cli/README.md` and the root README document `@capacitor-plus/cli`, `.github/workflows/build.yml` publishes `@capacitor-plus/$pkg`, bun.lock maps the cli workspace to `@capacitor-plus/cli`, and `scripts/sync-peer-dependencies.mjs` matches `@capacitor-plus/*`. Publishing under `@capacitor/cli` targets Ionic's real npm package and would collide with it, and it breaks the drop-in-replacement contract that this repo is built around. Restore `@capacitor-plus/cli` (and the plus author/homepage/description) and keep re-running `bun install` so bun.lock stays aligned.</violation>
</file>
<file name="cli/src/tasks/migrate-uiscene.ts">
<violation number="1" location="cli/src/tasks/migrate-uiscene.ts:146">
P2: When an existing `AppDelegate.swift` contains `{` or `}` inside a string or comment, this raw brace scan mistakes it for Swift syntax and can fail to patch the delegate. Ignore strings/comments or use a Swift-aware parser when finding the class boundary.</violation>
<violation number="2" location="cli/src/tasks/migrate-uiscene.ts:174">
P2: When the shipped template archive is missing or unreadable, `extractTemplate` rejects before the `assets === null` fallback, so `migrateToUIScene` aborts instead of skipping safely. Catch extraction errors and return `null` after cleanup.</violation>
<violation number="3" location="cli/src/tasks/migrate-uiscene.ts:187">
P2: When `extractTemplate` or a read under `loadTemplateAssets` throws (missing/corrupt template archive, or an unwritable `assetsDirAbs` because the temp dir is created inside the CLI's node_modules assets folder), the function has only `try/finally` and no `catch`. The exception propagates through `migrateToUIScene`'s unguarded `await loadTemplateAssets(config)` and aborts the whole `migrate` command, bypassing the graceful `if (!assets) { logger.error(...); return; }` skip that the code clearly intends. Add a `catch` that logs and returns `null` so template-load failures degrade to the designed skip instead of crashing.</violation>
</file>
<file name="ios/package.json">
<violation number="1" location="ios/package.json:2">
P0: The upstream-preferred conflict resolution overwrote the plus package identity: `name` is now `@capacitor/ios` instead of `@capacitor-plus/ios`. Publishing relies on the `name` field, so this releases the package into the `@capacitor` scope instead of `@capacitor-plus`, breaking the documented `npm install @capacitor-plus/ios` install path and the CI publish/release flow. Restore `@capacitor-plus/ios` and treat the plus branding as a non-conflicting, always-kept value during sync.</violation>
<violation number="2" location="ios/package.json:28">
P1: The sync reverted `peerDependencies` to only `@capacitor/core`, dropping the `@capacitor-plus/core` peer entry. Since this fork's core is published as `@capacitor-plus/core`, consumers who install this package no longer resolve against the plus core, breaking the plus dependency chain. Keep `@capacitor-plus/core` in the peer dependencies during the upstream sync.</violation>
</file>
<file name="android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java">
<violation number="1" location="android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java:275">
P2: On API < 30, AppCompat can consume the bottom inset from the listener's `insets`, while `safeAreaSource` explicitly preserves the root inset. Use `safeAreaSource` here so passthrough still injects the navigation safe area.</violation>
<violation number="2" location="android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java:300">
P1: When passthrough is disabled, `newInsets` has the system-bar and cutout values zeroed immediately above, so this injects zero safe-area variables on API 30+. Calculate from `safeAreaSource` before returning the consumed insets.</violation>
</file>
<file name="cli/src/tasks/migrate.ts">
<violation number="1" location="cli/src/tasks/migrate.ts:218">
P1: When dependency installation is declined or fails, this still writes the 8.5 UIScene code against the old Capacitor native package. Guard the call on a successful dependency install, or verify the installed native version first.</violation>
<violation number="2" location="cli/src/tasks/migrate.ts:449">
P2: When a project uses `@capacitor-plus/ios`, this migration notice is never emitted even though the migration code handles that package. Include the plus package scope so Capacitor+ users receive the same UIScene guidance.</violation>
</file>
<file name="CHANGELOG.md">
<violation number="1" location="CHANGELOG.md:6">
P3: The conflict resolution interleaved the upstream block (8.5.0..8.3.1) above the plus block (8.3.11..8.3.5), producing duplicate version headings `8.3.4`, `8.3.3`, and `8.3.2` (an upstream entry plus a Cap-go entry, with different dates/content) and an out-of-order top where the newest plus release (8.3.11, 2026-08-13) appears below older upstream entries (8.3.1, 2026-04-16). This makes the changelog misleading to readers and to any lerna/CI tooling that parses headings. Keep the changelog newest-first and de-duplicate the 8.3.x sections so each version has a single heading with merged content.</violation>
<violation number="2" location="CHANGELOG.md:6">
P2: This merge dropped the `8.3.12` changelog section, which was the top (most recent) plus release entry before the sync. The upstream-preferred conflict resolution removed it and never re-added it, so the changelog no longer documents the latest @capacitor-plus release and the version stream jumps from 8.5.0 down into 8.3.11. Restore the 8.3.12 section (the only 8.3.x entry whose release is missing).</violation>
<violation number="3" location="CHANGELOG.md:6">
P2: This merge removed the plus release entry `## [8.3.12]` ("Version bump only for package capacitor") that was the top of the changelog before the sync. It is not re-added anywhere, so the record for that plus release is lost from the changelog. Re-add the 8.3.12 entry (or verify the sync tooling intentionally dropped it) before merging.</violation>
<violation number="4" location="CHANGELOG.md:69">
P2: The 8.3.1 heading now points to the upstream repo (ionic-team/capacitor), but its section body is the plus-specific "sync upstream SystemBars fixes" entry (Cap-go issue #8480/#8481/#106, Cap-go commit a63975d). The merge dropped upstream 8.3.1's own fixes and mislabeled the plus entry under the upstream URL, so the heading and its content no longer agree. Restore the plus 8.3.1 entry under its Cap-go heading and keep upstream 8.3.1 content separate under the ionic-team heading.</violation>
</file>
<file name=".github/workflows/ci.yml">
<violation number="1" location=".github/workflows/ci.yml:28">
P2: The `setup` job restores/saves the `~/.npm` cache but never runs `npm install`, so it never warms or fills that cache. Because all test jobs declare `needs: setup`, actions/cache@v4 saves the (empty) `~/.npm` under the shared ubuntu key when setup finishes first, and the later ubuntu jobs restore that empty entry as a cache hit and skip their own save — so `npm install` stays cold on every run. Run `npm install` in the `setup` job (before the cache save) so the cache is actually populated, or drop the job and its `needs: setup` dependencies.</violation>
<violation number="2" location=".github/workflows/ci.yml:46">
P3: This workflow installs with `npm install` but the repository has no package-lock.json (it is bun-managed, per bun.lock and test.yml's use of oven-sh/setup-bun). Without a lockfile, `npm install` resolves floating dependency versions, so builds are non-reproducible and can diverge from the bun-based test.yml. Install with `bun install`/`bun install --frozen-lockfile` (matching test.yml, keying the cache on bun.lock) or commit a package-lock.json.</violation>
</file>
<file name="cli/src/tasks/run.ts">
<violation number="1" location="cli/src/tasks/run.ts:119">
P2: With live reload on Android, this new failure-path cleanup reverts the capacitor config but leaves the cordova Android manifest modified. writeCordovaAndroidManifest(..., true) added android:usesCleartextTraffic="true", and the catch block never calls it again with false, unlike the SIGINT path that reverts both. After a failed run the manifest keeps the cleartext flag, so a later non-live-reload build still has usesCleartextTraffic="true". Revert the manifest in the catch too when platformName is android.</violation>
</file>
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| "name": "@capacitor/android", |
There was a problem hiding this comment.
P0: The conflict resolution took the upstream value for the package name, so android now publishes as @capacitor/android instead of @capacitor-plus/android. The publish job in .github/workflows/build.yml runs npm publish (npm stage publish) inside each package dir and reads the name field, so this would publish to the upstream Ionic @capacitor/android scope rather than the fork's @capacitor-plus/android, and users installing @capacitor-plus/android would get nothing. Restore the plus scope (@capacitor-plus/android); the version bump to 8.5.0 is fine.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At android/package.json, line 2:
<comment>The conflict resolution took the upstream value for the package name, so android now publishes as `@capacitor/android` instead of `@capacitor-plus/android`. The publish job in `.github/workflows/build.yml` runs `npm publish` (`npm stage publish`) inside each package dir and reads the `name` field, so this would publish to the upstream Ionic `@capacitor/android` scope rather than the fork's `@capacitor-plus/android`, and users installing `@capacitor-plus/android` would get nothing. Restore the plus scope (`@capacitor-plus/android`); the version bump to 8.5.0 is fine.</comment>
<file context>
@@ -1,9 +1,9 @@
- "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
- "homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
- "author": "Capgo Team <support@capgo.app> (https://capgo.app)",
+ "name": "@capacitor/android",
+ "version": "8.5.0",
+ "description": "Capacitor: Cross-platform apps with JavaScript and the web",
</file context>
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| "name": "@capacitor/cli", |
There was a problem hiding this comment.
P0: The upstream-preferred conflict resolution reverted the plus-specific package identity: the package name changed from @capacitor-plus/cli to @capacitor/cli (plus version dropped from 8.3.12 to 8.5.0). The plus branch must publish under the @capacitor-plus scope — cli/README.md and the root README document @capacitor-plus/cli, .github/workflows/build.yml publishes @capacitor-plus/$pkg, bun.lock maps the cli workspace to @capacitor-plus/cli, and scripts/sync-peer-dependencies.mjs matches @capacitor-plus/*. Publishing under @capacitor/cli targets Ionic's real npm package and would collide with it, and it breaks the drop-in-replacement contract that this repo is built around. Restore @capacitor-plus/cli (and the plus author/homepage/description) and keep re-running bun install so bun.lock stays aligned.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At cli/package.json, line 2:
<comment>The upstream-preferred conflict resolution reverted the plus-specific package identity: the package name changed from `@capacitor-plus/cli` to `@capacitor/cli` (plus version dropped from 8.3.12 to 8.5.0). The plus branch must publish under the `@capacitor-plus` scope — `cli/README.md` and the root README document `@capacitor-plus/cli`, `.github/workflows/build.yml` publishes `@capacitor-plus/$pkg`, bun.lock maps the cli workspace to `@capacitor-plus/cli`, and `scripts/sync-peer-dependencies.mjs` matches `@capacitor-plus/*`. Publishing under `@capacitor/cli` targets Ionic's real npm package and would collide with it, and it breaks the drop-in-replacement contract that this repo is built around. Restore `@capacitor-plus/cli` (and the plus author/homepage/description) and keep re-running `bun install` so bun.lock stays aligned.</comment>
<file context>
@@ -1,9 +1,9 @@
- "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
- "homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
- "author": "Capgo Team <support@capgo.app> (https://capgo.app)",
+ "name": "@capacitor/cli",
+ "version": "8.5.0",
+ "description": "Capacitor: Cross-platform apps with JavaScript and the web",
</file context>
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| "name": "@capacitor/ios", |
There was a problem hiding this comment.
P0: The upstream-preferred conflict resolution overwrote the plus package identity: name is now @capacitor/ios instead of @capacitor-plus/ios. Publishing relies on the name field, so this releases the package into the @capacitor scope instead of @capacitor-plus, breaking the documented npm install @capacitor-plus/ios install path and the CI publish/release flow. Restore @capacitor-plus/ios and treat the plus branding as a non-conflicting, always-kept value during sync.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At ios/package.json, line 2:
<comment>The upstream-preferred conflict resolution overwrote the plus package identity: `name` is now `@capacitor/ios` instead of `@capacitor-plus/ios`. Publishing relies on the `name` field, so this releases the package into the `@capacitor` scope instead of `@capacitor-plus`, breaking the documented `npm install @capacitor-plus/ios` install path and the CI publish/release flow. Restore `@capacitor-plus/ios` and treat the plus branding as a non-conflicting, always-kept value during sync.</comment>
<file context>
@@ -1,9 +1,9 @@
- "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
- "homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
- "author": "Capgo Team <support@capgo.app> (https://capgo.app)",
+ "name": "@capacitor/ios",
+ "version": "8.5.0",
+ "description": "Capacitor: Cross-platform apps with JavaScript and the web",
</file context>
| "name": "@capacitor/ios", | |
| "name": "@capacitor-plus/ios", |
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| "name": "@capacitor/core", |
There was a problem hiding this comment.
P0: The upstream-preferred merge reverted the package name to @capacitor/core, which breaks the plus fork's identity and its automated publishing pipeline. build.yml publishes with @capacitor-plus/core (both the stage-dispatch client_payload[package] and the release install notes use @capacitor-plus/core), and scripts/sync-peer-dependencies.mjs finds core packages via p.name === '@capacitor-plus/core' — that lookup now fails, so peer-dependency syncing silently skips core. Publishing this package as @capacitor/core would target the official npm package owned by Ionic instead of the @capacitor-plus scope this fork is meant to publish under. Keep the scoped name @capacitor-plus/core and only take upstream's version/fields.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At core/package.json, line 2:
<comment>The upstream-preferred merge reverted the package name to `@capacitor/core`, which breaks the plus fork's identity and its automated publishing pipeline. `build.yml` publishes with `@capacitor-plus/core` (both the stage-dispatch `client_payload[package]` and the release install notes use `@capacitor-plus/core`), and `scripts/sync-peer-dependencies.mjs` finds core packages via `p.name === '@capacitor-plus/core'` — that lookup now fails, so peer-dependency syncing silently skips core. Publishing this package as `@capacitor/core` would target the official npm package owned by Ionic instead of the `@capacitor-plus` scope this fork is meant to publish under. Keep the scoped name `@capacitor-plus/core` and only take upstream's version/fields.</comment>
<file context>
@@ -1,9 +1,9 @@
- "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
- "homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
- "author": "Capgo Team <support@capgo.app> (https://capgo.app)",
+ "name": "@capacitor/core",
+ "version": "8.5.0",
+ "description": "Capacitor: Cross-platform apps with JavaScript and the web",
</file context>
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| "name": "@capacitor/core", |
There was a problem hiding this comment.
P1: This merge reverts the package name to @capacitor/core, discarding the plus fork's scoped identity. The plus branch requires @capacitor-plus/core (drop-in replacement with a distinct scoped name): core/README.md installs @capacitor-plus/core, cli/src/cordova.ts and cli/src/common.ts resolve @capacitor-plus/core first, and doctor.ts queries @capacitor-plus/cli. Publishing under @capacitor/core would target the official Ionic package name rather than the fork's scope, breaking the fork's distribution and its drop-in contract with the CLI. Keep the name as @capacitor-plus/core when resolving the conflict.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At core/package.json, line 2:
<comment>This merge reverts the package name to `@capacitor/core`, discarding the plus fork's scoped identity. The plus branch requires `@capacitor-plus/core` (drop-in replacement with a distinct scoped name): core/README.md installs `@capacitor-plus/core`, cli/src/cordova.ts and cli/src/common.ts resolve `@capacitor-plus/core` first, and doctor.ts queries `@capacitor-plus/cli`. Publishing under `@capacitor/core` would target the official Ionic package name rather than the fork's scope, breaking the fork's distribution and its drop-in contract with the CLI. Keep the name as `@capacitor-plus/core` when resolving the conflict.</comment>
<file context>
@@ -1,9 +1,9 @@
- "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
- "homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
- "author": "Capgo Team <support@capgo.app> (https://capgo.app)",
+ "name": "@capacitor/core",
+ "version": "8.5.0",
+ "description": "Capacitor: Cross-platform apps with JavaScript and the web",
</file context>
| "name": "@capacitor/core", | |
| "name": "@capacitor-plus/core", |
| } finally { | ||
| deleteFolderRecursive(tempDir); | ||
| } |
There was a problem hiding this comment.
P2: When extractTemplate or a read under loadTemplateAssets throws (missing/corrupt template archive, or an unwritable assetsDirAbs because the temp dir is created inside the CLI's node_modules assets folder), the function has only try/finally and no catch. The exception propagates through migrateToUIScene's unguarded await loadTemplateAssets(config) and aborts the whole migrate command, bypassing the graceful if (!assets) { logger.error(...); return; } skip that the code clearly intends. Add a catch that logs and returns null so template-load failures degrade to the designed skip instead of crashing.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At cli/src/tasks/migrate-uiscene.ts, line 187:
<comment>When `extractTemplate` or a read under `loadTemplateAssets` throws (missing/corrupt template archive, or an unwritable `assetsDirAbs` because the temp dir is created inside the CLI's node_modules assets folder), the function has only `try/finally` and no `catch`. The exception propagates through `migrateToUIScene`'s unguarded `await loadTemplateAssets(config)` and aborts the whole `migrate` command, bypassing the graceful `if (!assets) { logger.error(...); return; }` skip that the code clearly intends. Add a `catch` that logs and returns `null` so template-load failures degrade to the designed skip instead of crashing.</comment>
<file context>
@@ -0,0 +1,305 @@
+ return null;
+ }
+ return { sceneDelegate, configurationForConnectingSnippet };
+ } finally {
+ deleteFolderRecursive(tempDir);
+ }
</file context>
| } finally { | |
| deleteFolderRecursive(tempDir); | |
| } | |
| } catch (err) { | |
| logger.error(`UIScene migration: could not extract template assets: ${err}`); | |
| return null; | |
| } finally { | |
| deleteFolderRecursive(tempDir); | |
| } |
|
|
||
|
|
||
| ## [8.0.3](https://github.com/Cap-go/capacitor-plus/compare/8.0.2...8.0.3) (2025-12-16) | ||
| # [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31) |
There was a problem hiding this comment.
P3: The upstream-preferred merge replaced the whole file with upstream's @capacitor/core history, so the changelog no longer documents any @capacitor-plus/core release and its version history no longer corresponds to the package actually published (published as @capacitor-plus/core per README, even though package.json still says @capacitor/core). Readers of the fork's changelog now see only upstream entries that omit fork-specific fixes. This is the known consequence of the upstream-preferred strategy, but confirm the fork's release history (8.3.x) is intentionally discarded rather than accidentally lost in the conflict resolution.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At core/CHANGELOG.md, line 6:
<comment>The upstream-preferred merge replaced the whole file with upstream's @capacitor/core history, so the changelog no longer documents any @capacitor-plus/core release and its version history no longer corresponds to the package actually published (published as @capacitor-plus/core per README, even though package.json still says @capacitor/core). Readers of the fork's changelog now see only upstream entries that omit fork-specific fixes. This is the known consequence of the upstream-preferred strategy, but confirm the fork's release history (8.3.x) is intentionally discarded rather than accidentally lost in the conflict resolution.</comment>
<file context>
@@ -3,228 +3,33 @@
-
-
-## [8.0.3](https://github.com/Cap-go/capacitor-plus/compare/8.0.2...8.0.3) (2025-12-16)
+# [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31)
+**Note:** Version bump only for package @capacitor/core
</file context>
| const validSPMPackages = await checkPluginsForPackageSwift(config, plugins); | ||
| await Promise.all( | ||
| validSPMPackages.map(async (plugin) => { | ||
| const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name); |
There was a problem hiding this comment.
P3: In the new SPM-version-patching block, getCapacitorPackageVersion(config, config.ios.name) is awaited inside the Promise.all(validSPMPackages.map(...)) callback, so the same package-version lookup repeats once per valid SPM plugin instead of once. The value (iosPlatformVersion) does not depend on plugin, so hoist it before the map to avoid N redundant lookups (each goes through requireCapacitorPackage).
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At cli/src/ios/update.ts, line 64:
<comment>In the new SPM-version-patching block, `getCapacitorPackageVersion(config, config.ios.name)` is awaited inside the `Promise.all(validSPMPackages.map(...))` callback, so the same package-version lookup repeats once per valid SPM plugin instead of once. The value (`iosPlatformVersion`) does not depend on `plugin`, so hoist it before the `map` to avoid N redundant lookups (each goes through `requireCapacitorPackage`).</comment>
<file context>
@@ -58,6 +59,30 @@ async function updatePluginFiles(config: Config, plugins: Plugin[], deployment:
const validSPMPackages = await checkPluginsForPackageSwift(config, plugins);
+ await Promise.all(
+ validSPMPackages.map(async (plugin) => {
+ const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name);
+ const packageSwiftPath = join(plugin.rootPath, 'Package.swift');
+ let content = await readFile(packageSwiftPath, { encoding: 'utf-8' });
</file context>
| @@ -3,8 +3,70 @@ | |||
| All notable changes to this project will be documented in this file. | |||
There was a problem hiding this comment.
P3: The conflict resolution interleaved the upstream block (8.5.0..8.3.1) above the plus block (8.3.11..8.3.5), producing duplicate version headings 8.3.4, 8.3.3, and 8.3.2 (an upstream entry plus a Cap-go entry, with different dates/content) and an out-of-order top where the newest plus release (8.3.11, 2026-08-13) appears below older upstream entries (8.3.1, 2026-04-16). This makes the changelog misleading to readers and to any lerna/CI tooling that parses headings. Keep the changelog newest-first and de-duplicate the 8.3.x sections so each version has a single heading with merged content.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At CHANGELOG.md, line 6:
<comment>The conflict resolution interleaved the upstream block (8.5.0..8.3.1) above the plus block (8.3.11..8.3.5), producing duplicate version headings `8.3.4`, `8.3.3`, and `8.3.2` (an upstream entry plus a Cap-go entry, with different dates/content) and an out-of-order top where the newest plus release (8.3.11, 2026-08-13) appears below older upstream entries (8.3.1, 2026-04-16). This makes the changelog misleading to readers and to any lerna/CI tooling that parses headings. Keep the changelog newest-first and de-duplicate the 8.3.x sections so each version has a single heading with merged content.</comment>
<file context>
@@ -3,8 +3,70 @@
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-## [8.3.12](https://github.com/Cap-go/capacitor-plus/compare/8.3.11...8.3.12) (2026-08-13)
+# [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31)
+### Bug Fixes
</file context>
| with: | ||
| path: ~/.npm | ||
| key: ${{ runner.OS }}-dependencies-cache-${{ hashFiles('**/package.json') }} | ||
| - run: npm install |
There was a problem hiding this comment.
P3: This workflow installs with npm install but the repository has no package-lock.json (it is bun-managed, per bun.lock and test.yml's use of oven-sh/setup-bun). Without a lockfile, npm install resolves floating dependency versions, so builds are non-reproducible and can diverge from the bun-based test.yml. Install with bun install/bun install --frozen-lockfile (matching test.yml, keying the cache on bun.lock) or commit a package-lock.json.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .github/workflows/ci.yml, line 46:
<comment>This workflow installs with `npm install` but the repository has no package-lock.json (it is bun-managed, per bun.lock and test.yml's use of oven-sh/setup-bun). Without a lockfile, `npm install` resolves floating dependency versions, so builds are non-reproducible and can diverge from the bun-based test.yml. Install with `bun install`/`bun install --frozen-lockfile` (matching test.yml, keying the cache on bun.lock) or commit a package-lock.json.</comment>
<file context>
@@ -0,0 +1,142 @@
+ with:
+ path: ~/.npm
+ key: ${{ runner.OS }}-dependencies-cache-${{ hashFiles('**/package.json') }}
+ - run: npm install
+ - run: brew install swiftlint
+ - run: npm run lint
</file context>
Upstream Plus Sync
The automatic sync of the
plusbranch encountered merge conflicts.What happened
This PR was created automatically by the Capacitor+ sync workflow
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.