Skip to content

chore: sync plus with upstream main (conflicts)#40

Open
riderx wants to merge 43 commits intoplusfrom
sync/plus-upstream-20260409-053612
Open

chore: sync plus with upstream main (conflicts)#40
riderx wants to merge 43 commits intoplusfrom
sync/plus-upstream-20260409-053612

Conversation

@riderx
Copy link
Copy Markdown
Member

@riderx riderx commented Apr 9, 2026

Merge Conflict Resolution Required

The automatic sync of the plus branch with upstream main encountered merge conflicts.

What happened

  • Claude Code attempted to resolve the merge conflicts
  • The workflow created this PR so CI and manual review can finish the merge safely

Action needed: Review the branch and resolve any remaining concerns before merging.


This PR was created automatically by the Capacitor+ sync workflow

Summary by CodeRabbit

  • New Features

    • Added Swift Package Manager (SPM) support for iOS projects with configurable build settings
    • New GitHub Actions workflow for automated iOS library publishing to CocoaPods
    • Stale issue auto-closure workflow for improved issue management
  • Bug Fixes

    • Enhanced URL instance handling in fetch operations
    • Improved SystemBars safe-area calculations on Android
    • Fixed cookie configuration handling
  • Chores

    • Updated core packages to version 8.3.0
    • Upgraded build dependencies (tar, Node.js types, ESLint)
    • Enhanced CI/CD workflows with extended timeout and simulator setup validation

Github Workflow (on behalf of andredestro) and others added 30 commits January 13, 2026 11:56
Reverts "chore: bump main to 9.0.0-dev.0 (ionic-team#8320)" and “chore: update latest workflow to only allow pointing at 8.x”

This reverts commit c5476c8 and 0412d46
…8338)

Co-authored-by: Mark Anderson <mark.anderson@outsystems.com>
Co-authored-by: Mark Anderson <mark.anderson@outsystems.com>
Co-authored-by: Mark Anderson <emer@emer.net>
)

Co-authored-by: Pedro Bilro <pedro.gustavo.bilro@outsystems.com>
Co-authored-by: Stein Jakob Nordbø <steinjak@gmail.com>
Co-authored-by: Pedro Bilro <pedro.gustavo.bilro@outsystems.com>
…onic-team#7528)

Co-authored-by: Pedro Bilro <pedro.gustavo.bilro@outsystems.com>
Co-authored-by: jcesarmobile <jcesarmobile@gmail.com>
Co-authored-by: Pedro Bilro <pedro.gustavo.bilro@outsystems.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 9, 2026

📝 Walkthrough

Walkthrough

This pull request merges upstream Capacitor code into what appears to be a forked variant, introducing version bumps from 8.0.8 to 8.3.0 across multiple packages, migrating from @capacitor-plus to @capacitor scoping, adding iOS SPM support infrastructure, refactoring CLI package manager detection logic, enhancing native Android/iOS code with improved inset handling and fetch URL proxying, and adding automated GitHub workflows for issue management and iOS CocoaPods publishing.

Changes

Cohort / File(s) Summary
GitHub Workflows & Automation
.github/ISSUE_TEMPLATE/config.yml, .github/ISSUE_TEMPLATE/feature-request.yml, .github/ionic-issue-bot.yml, .github/workflows/needs-reply.yml, .github/workflows/publish-ios.yml, .github/workflows/test.yml
Added feature request contact link, removed feature request template, shortened reproduction deadline from 15 to 7 days, added workflow to auto-close stale issues needing replies, added iOS CocoaPods publishing workflow, and increased job timeouts from 30 to 60 minutes with additional Xcode/simulator setup steps.
Package Metadata & Version Management
android/package.json, cli/package.json, core/package.json, ios/package.json, lerna.json, package.json
Version bumped from 8.0.8 to 8.3.0; package scoping changed from @capacitor-plus to @capacitor; peer dependencies updated; tar upgraded to ^7.5.3 with @types/tar removed; multiple files contain unresolved Git merge conflict markers.
Changelog Files with Merge Conflicts
CHANGELOG.md, android/CHANGELOG.md, cli/CHANGELOG.md, core/CHANGELOG.md, ios/CHANGELOG.md
All changelog files contain unresolved merge conflict markers (<<<<<<< HEAD / ======= / >>>>>>> upstream/main) with duplicate/competing version entries and upstream release notes inserted alongside local content.
CLI Package Manager Detection & Configuration
cli/src/config.ts, cli/src/declarations.ts, cli/src/definitions.ts, cli/src/index.ts, cli/src/ios/build.ts, cli/src/ios/common.ts, cli/src/ios/doctor.ts, cli/src/ios/open.ts, cli/src/ios/run.ts, cli/src/ios/update.ts, cli/src/tasks/add.ts, cli/src/tasks/migrate-spm.ts, cli/src/tasks/migrate.ts, cli/src/tasks/sync.ts, cli/src/tasks/update.ts
Refactored package manager detection from runtime checks to config-driven approach; added support for three managers (Cocoapods, bundler, SPM); introduced experimental SPM configuration with swiftToolsVersion and packageTraits; updated all iOS-related tasks to use config.ios.packageManager instead of calling checkPackageManager utility; added https flag to run command and async check helpers.
iOS SPM & Dependency Tooling
cli/src/util/spm.ts, cli/src/util/template.ts, cli/src/util/livereload.ts, scripts/pack-cli-assets.mjs
Enhanced SPM package generation to support configurable swift-tools-version and per-plugin package traits; replaced tar default import with named create import; added checkSwiftToolsVersion and checkPackageTraitsRequirements validators; updated live-reload URL construction to support https option without port.
Android Native Enhancements
android/capacitor/src/main/java/com/getcapacitor/Bridge.java, android/capacitor/src/main/java/com/getcapacitor/BridgeActivity.java, android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java, android/capacitor/src/main/assets/native-bridge.js
Added null-safety guards in lifecycle callbacks; refactored response header handling with new buildDefaultResponseHeaders() method and deprecated getResponseHeaders(); added Range request header case-insensitive detection; extended fetch interception to handle URL object instances with proper proxying.
iOS Native Improvements
ios/Capacitor/Capacitor/CAPBridgeProtocol.swift, ios/Capacitor/Capacitor/CAPBridgedJSTypes.h, ios/Capacitor/Capacitor/CAPBridgedJSTypes.m, ios/Capacitor/Capacitor/CapacitorBridge.swift, ios/Capacitor/Capacitor/assets/native-bridge.js
Deprecated tmpWindow/tmpVCAppeared and simplified presentVC/dismissVC to use viewController directly; added getArray bridged JS accessor; extended fetch patch to proxy URL instances; deprecated legacy presentation methods in protocol.
SystemBars Advanced Inset Handling
android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java
Major refactoring: replaced margin-based layout with ViewCompat window insets listener; added persistent style tracking with reapply on config changes; introduced CSS variable-based safe-area initialization; added IME visibility detection with clamped bottom insets; added WebView-version gating and theme-aware window decoration; new getThemeColor() public method and internal helpers for version detection.
Core Library & Type Definitions
core/src/core-plugins.ts, core/native-bridge.ts, core/system-bars.md
Conditional expires attribute appending in cookie handling; optional parameters for SystemBars show/hide methods; extended fetch fetch patching for URL instances; updated documentation with SystemBarType import example and disabled inset handling description.
Documentation & Minor Updates
ios-spm-template/App/CapApp-SPM/README.md
Updated README wording from "SPM is used to host SPM dependencies for you" to "package is used to host SPM dependencies for your".

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Poem

🐰 The versions have ascended high,
From 8.0.8 to 8.3!
SPM, Cocoapods, bundlers too—
Package managers, old and new.
With conflicts marked in red, we see
The upstream merged with what we be! ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 12.50% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main changeset: a sync merge between the plus branch and upstream main that encountered conflicts during the process.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch sync/plus-upstream-20260409-053612

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9844a46482

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +35 to 39
<<<<<<< HEAD
"@types/node": "^24.10.1",
"@types/tar": "^6.1.2",
"eslint": "^8.57.1",
"eslint-plugin-import": "^2.31.0",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P0 Badge Remove unresolved merge markers from package.json

This commit leaves Git conflict markers (<<<<<<<, =======, >>>>>>>) in the root package.json, which makes the file invalid JSON. In this state, bun install and any tooling that reads the workspace manifest will fail immediately, so the repository cannot be built or verified.

Useful? React with 👍 / 👎.

Comment on lines +100 to +104
<<<<<<< HEAD
const iosVersion = getMajorMinoriOSVersion(config);
=======
const iosVersion = getMajoriOSVersion(config);
const packageTraits = config.app.extConfig.experimental?.ios?.spm?.packageTraits ?? {};
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P0 Badge Delete conflict markers in SPM utility source

Unresolved merge markers were committed into cli/src/util/spm.ts inside generatePackageText, leaving the TypeScript file syntactically invalid. This prevents the CLI from compiling/transpiling, so the change is not buildable even after dependency installation.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 13

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (7)
android/CHANGELOG.md (1)

6-252: ⚠️ Potential issue | 🔴 Critical

Resolve leftover Git conflict markers before merging.

This file still contains <<<<<<<, =======, and >>>>>>> markers, which means the merge is incomplete and the changelog is currently invalid.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@android/CHANGELOG.md` around lines 6 - 252, The changelog contains unresolved
git conflict markers; remove the conflict blocks marked by <<<<<<< HEAD,
=======, and >>>>>>> upstream/main and reconcile the duplicate release sections
(e.g., the "## [8.0.8]" / "# [8.3.0]" blocks) into a single, valid changelog
entry: decide which version content to keep or merge notes, delete the markers,
ensure heading syntax is consistent (## / # as needed) and that the file parses
as valid markdown with no leftover conflict markers.
cli/CHANGELOG.md (1)

6-280: ⚠️ Potential issue | 🔴 Critical

Finalize the merge by resolving changelog conflict markers.

<<<<<<< HEAD / ======= / >>>>>>> upstream/main are still present, so the file is in a conflicted state.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@cli/CHANGELOG.md` around lines 6 - 280, The changelog contains unresolved git
conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) mixing two
release sections (the local 8.0.8/8.0.x block and the upstream 8.3.0/8.2.0
block); remove the conflict markers and produce a single coherent changelog by
deciding which release history to keep (e.g., keep the upstream 8.3.0..8.1.0
entries and discard the duplicate local 8.0.x block, or merge both histories in
chronological order), ensuring headings (e.g., "# [8.3.0]" and "## [8.0.8]") and
their bullet lists are valid Markdown and no <<<<<<</=======/>>>>>>> tokens
remain.
ios/CHANGELOG.md (1)

6-225: ⚠️ Potential issue | 🔴 Critical

Remove unresolved merge-conflict markers in changelog.

The changelog still contains Git conflict markers (<<<<<<<, =======, >>>>>>>), so this merge is not fully resolved.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ios/CHANGELOG.md` around lines 6 - 225, The changelog contains unresolved Git
conflict markers (<<<<<<<, =======, >>>>>>>) between the local block starting
with "## [8.0.8]" and the upstream block starting with "# [8.3.0]"; open
ios/CHANGELOG.md, remove the conflict marker lines and the duplicate block you
don't want to keep so the file contains one coherent changelog (either keep the
local "## [8.0.8]" series or the upstream "# [8.3.0]" series), ensure headings
like "## [8.0.8]" / "# [8.3.0]" and commit references remain properly formatted
and no leftover marker lines remain.
CHANGELOG.md (1)

6-523: ⚠️ Potential issue | 🔴 Critical

Remove the unresolved merge block from the generated changelog.

This section still contains <<<<<<<, =======, and >>>>>>>, so the sync conflict was never actually resolved. It will ship broken markdown, and this file should not be hand-merged in the first place.

As per coding guidelines, CHANGELOG.md: Do not manually edit CHANGELOG.md; it is managed automatically by CI/CD.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CHANGELOG.md` around lines 6 - 523, The generated CHANGELOG.md contains an
unresolved git merge conflict (markers <<<<<<<, =======, >>>>>>>) that must be
removed; open the CHANGELOG.md, locate and delete the entire conflict block
(including the conflict markers and the duplicate/unmerged sections), then
regenerate or restore the changelog via the automated CI/CD changelog generation
process rather than hand-editing to ensure the file is produced correctly;
ensure no residual conflict markers remain before committing.
cli/src/ios/update.ts (1)

54-59: ⚠️ Potential issue | 🟠 Major

Await Cordova Package.swift generation before building the SPM manifest.

This new branch assumes the per-plugin Package.swift files already exist, but generateCordovaPackageFiles() currently fires async writes without awaiting them. That makes generatePackageFile() race with incomplete plugin package generation.

Proposed fix
 async function generateCordovaPackageFiles(cordovaPlugins: Plugin[], config: Config) {
-  cordovaPlugins.map((plugin: any) => {
-    generateCordovaPackageFile(plugin, config);
-  });
+  await Promise.all(cordovaPlugins.map((plugin) => generateCordovaPackageFile(plugin, config)));
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@cli/src/ios/update.ts` around lines 54 - 59, The call to
generateCordovaPackageFiles(cordovaPlugins, config) starts async file writes but
doesn’t wait for them to finish, causing generatePackageFile to race; update
generateCordovaPackageFiles to return a Promise that only resolves once all
per-plugin Package.swift writes complete (e.g., collect write promises and await
Promise.all or make internal actions fully async/await), keep the await
generateCordovaPackageFiles(...) call here so checkPluginsForPackageSwift and
generatePackageFile run only after all plugin Package.swift files are written.
android/package.json (1)

2-39: ⚠️ Potential issue | 🔴 Critical

Resolve the merge markers before this can ship.

Line 2 and Line 34 still contain conflict markers, which makes this file invalid JSON. The pipeline is already failing npm install with EJSONPARSE, so this is a hard blocker until the final package identity and peer dependencies are reconciled.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@android/package.json` around lines 2 - 39, The package.json contains
unresolved git conflict markers (e.g., <<<<<<< HEAD and >>>>>>> upstream/main)
causing invalid JSON; open the file, remove the conflict markers and reconcile
the fields under "name", "version", "description", "homepage", "author" and the
"peerDependencies" block so they form a single valid JSON object (decide whether
to keep the Capacitor+ values or upstream/main values for "name"/"version"/etc.,
and ensure the "peerDependencies" only lists the correct entries such as
"@capacitor/core": "^8.3.0" or "@capacitor-plus/core": "^8.0.0" as intended),
then run npm install to confirm the JSON parses.
core/CHANGELOG.md (1)

6-159: ⚠️ Potential issue | 🟠 Major

Resolve the remaining merge conflict in this changelog block.

Line 6 starts a raw conflict region that runs through Line 159, so the release notes are still unresolved and the markdown structure is broken.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@core/CHANGELOG.md` around lines 6 - 159, There is an unresolved Git merge
conflict in the changelog containing the conflict markers <<<<<<< HEAD, =======,
and >>>>>>> upstream/main; remove these markers and reconcile the two sections
(either keep the local HEAD release notes, keep the upstream/main release notes,
or merge them into a single coherent changelog), ensuring the final markdown has
valid headings (e.g., only one top-level release section in that block) and no
leftover conflict markers so the changelog parses correctly.
🧹 Nitpick comments (3)
ios/Capacitor/Capacitor/CapacitorBridge.swift (1)

750-756: LGTM! Clean simplification of view controller presentation.

The direct delegation to self.viewController?.present and self.viewController?.dismiss removes unnecessary complexity from the old tmpWindow/TmpViewController pathway.

Note: The observer setup in init (lines 226-228) for tmpVCAppeared is now effectively dead code since TmpViewController is no longer instantiated. Consider removing this observer in a follow-up cleanup once the deprecation period passes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ios/Capacitor/Capacitor/CapacitorBridge.swift` around lines 750 - 756, The
init-added observer for tmpVCAppeared related to the deprecated
TmpViewController is now dead code and should be removed: locate the init method
in CapacitorBridge (the observer registration referencing tmpVCAppeared /
TmpViewController) and unregister or delete the NotificationCenter observer
registration there (and any corresponding tmpVCAppeared handler method if it is
no longer used), ensuring no leftover references to TmpViewController remain;
keep presentVC and dismissVC as the active presentation APIs.
android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java (1)

342-344: Consider avoiding duplicate map lookup.

The ternary calls get("Range") twice when the header exists. A minor optimization:

♻️ Optional: avoid redundant map lookup
         Map<String, String> requestHeaders = request.getRequestHeaders();
-        String rangeString = requestHeaders.get("Range") != null ? requestHeaders.get("Range") : requestHeaders.get("range");
+        String rangeString = requestHeaders.get("Range");
+        if (rangeString == null) {
+            rangeString = requestHeaders.get("range");
+        }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`
around lines 342 - 344, Replace the redundant double lookup of "Range" in
WebViewLocalServer by fetching it once into a temporary variable and falling
back to "range" if null; for example, in the method where requestHeaders and
rangeString are defined, do: String rangeString = requestHeaders.get("Range");
if (rangeString == null) rangeString = requestHeaders.get("range"); This avoids
calling requestHeaders.get("Range") twice while preserving the same behavior.
cli/src/ios/common.ts (1)

32-37: Resolve packageManager once before branching.

config.ios.packageManager is awaited multiple times; caching it once will simplify the control flow.

♻️ Suggested refactor
 export async function getCommonChecks(config: Config): Promise<CheckFunction[]> {
   const checks: CheckFunction[] = [];
-  if ((await config.ios.packageManager) === 'bundler') {
+  const packageManager = await config.ios.packageManager;
+  if (packageManager === 'bundler') {
     checks.push(() => checkBundler(config));
-  } else if ((await config.ios.packageManager) === 'Cocoapods') {
+  } else if (packageManager === 'Cocoapods') {
     checks.push(() => checkCocoaPods(config));
-  } else if ((await config.ios.packageManager) === 'SPM') {
+  } else if (packageManager === 'SPM') {
     const swiftToolsVersion = config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion;
     if (swiftToolsVersion) {
       checks.push(() => checkSwiftToolsVersion(config, swiftToolsVersion));
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@cli/src/ios/common.ts` around lines 32 - 37, Resolve
config.ios.packageManager once into a local const (e.g. const pkgManager = await
config.ios.packageManager) and use pkgManager for the conditional branches
instead of awaiting repeatedly; update the branch that currently checks for
'bundler', 'Cocoapods', and 'SPM' to reference pkgManager and preserve existing
pushes to checks (checkBundler, checkCocoaPods, checkCocoaPods) and the SPM
handling that reads
config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/needs-reply.yml:
- Line 12: Replace the mutable action tag "imhoffd/needs-reply@v2" with the
specific commit SHA that v2 currently resolves to so the workflow uses an
immutable reference; update the uses entry (the string "imhoffd/needs-reply@v2")
to "imhoffd/needs-reply@<COMMIT_SHA>" where <COMMIT_SHA> is the full commit hash
from the action repository to pin the dependency and improve reproducibility.

In @.github/workflows/publish-ios.yml:
- Around line 21-24: The workflow is forcing checkout to a hard-coded branch via
the actions/checkout step (uses: actions/checkout@v5 with ref: 'main'), which
can publish code different from the triggering revision; change that checkout to
use the triggering ref/sha (e.g., remove the fixed ref or set ref: ${{
github.ref }} or ref: ${{ github.sha }}) so the publish job checks out the exact
commit that triggered the workflow (update the actions/checkout@v5 step
accordingly).

In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`:
- Line 103: The initial call to initSafeAreaCSSVariables() is injecting
safe-area CSS before we know if the page uses viewport-fit=cover; change the
behavior so initSafeAreaCSSVariables() is only invoked when hasViewportCover is
true (i.e., gate the initial injection in the load path), and ensure the
onDOMReady()/handleViewportCoverResult path clears the injected CSS vars if the
page reports hasViewportCover=false (remove or reset --safe-area-inset-* in the
same helper used by initSafeAreaCSSVariables()); also apply the same guard/clear
logic to the duplicate calls around the block referenced at lines 166-174 so no
CSS vars remain when native-padding is used.

In `@cli/package.json`:
- Around line 2-14: Remove the Git conflict markers (<<<<<<<, =======, >>>>>>>)
from package.json and keep only one coherent metadata block for the package by
choosing which variant to publish; ensure the retained fields name, version,
description, homepage, and author are consistent with the intended artifact
(e.g., either the "@capacitor-plus/cli" fork values or the upstream
"@capacitor/cli" values) and that the resulting file is valid JSON (no trailing
commas, proper quotes). Locate the conflict inside package.json around the
name/version/description/homepage/author entries and delete the other variant
and the separators so npm can parse the file.

In `@cli/src/index.ts`:
- Around line 30-37: The getPackageManager function currently treats any
non-'cocoapods' input as SPM; change it to explicitly validate the
packageManager argument and reject unsupported values: in getPackageManager,
handle 'cocoapods' (with the existing bundler check via
config.ios.packageManager) and an explicit 'spm' case, and otherwise throw an
informative Error (or return a rejected Promise) indicating the unsupported
--packagemanager value; use the function name getPackageManager and the
config.ios.packageManager check to locate the code and update the returned
identifiers consistently (e.g., 'cocoapods'/'bundler' and 'spm'/'SPM') so typos
no longer silently default to SPM.

In `@cli/src/ios/update.ts`:
- Around line 133-145: The availability check still calls isInstalled('pod')
while the installer uses the configured podPath variable; change the guard to
check the actual podPath (e.g., await isInstalled(podPath)) so that a
custom/absolute podPath is recognized, keeping the rest of the branch that calls
runCommand(podPath, ['install', ...]) and falling back to logger.warn if not
installed.

In `@cli/src/tasks/run.ts`:
- Line 114: The status message template literal that currently reads "App
running with live reload listing for: ${options.https ? 'https' :
'http'}://${options.host}${options.port ? `:${options.port}` : ''}..." contains
a typo — change the word "listing" to "listening" in that string; update the
template literal where it's emitted (the run task that uses the options object)
so the log reads "live reload listening for" while keeping the existing
interpolation of options.

In `@cli/src/util/spm.ts`:
- Around line 100-108: Resolve the leftover merge conflict markers and produce a
single coherent block: remove the <<<<<<</=======/>>>>>>> markers and ensure
iosVersion is assigned using the correct helper (choose and use either
getMajorMinoriOSVersion or getMajoriOSVersion consistently), then add the
missing declarations for packageTraits and swiftToolsVersion (read from
config.app.extConfig.experimental?.ios?.spm) before packageSwiftText so
packageTraits and swiftToolsVersion are always defined; update any downstream
usage of iosVersion/packageTraits/swiftToolsVersion accordingly (symbols:
getMajorMinoriOSVersion, getMajoriOSVersion, packageTraits, swiftToolsVersion,
packageSwiftText, config).

In `@core/package.json`:
- Around line 2-14: The package.json contains unresolved git conflict markers
and duplicate metadata blocks; remove the conflict markers (<<<<<<<, =======,
>>>>>>>) and pick one consistent set of package fields (e.g., "name", "version",
"description", "homepage", "author") so the manifest is valid JSON and the
package identity is unambiguous; update the chosen "name" and "version" values
in the package.json block (referencing the "name" and "version" keys) and ensure
the remaining fields from that block are kept and the other block discarded.

In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m`:
- Line 32: The method implementation for getArray:defaultValue: contains a stray
semicolon before the opening brace which causes invalid Objective-C syntax;
remove the semicolon from the method signature in the CAPBridgedJSTypes.m
implementation so the declaration reads as a proper Objective-C method
implementation (i.e., ensure the signature for - (NSArray *
_Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray *
_Nullable)defaultValue is immediately followed by the opening brace).

In `@ios/package.json`:
- Around line 2-14: The package.json contains unresolved git conflict markers;
remove the conflict section and choose a single consistent package identity
(either "@capacitor/ios" or "@capacitor-plus/ios") and update the "name",
"version", "description", "homepage", and "author" fields accordingly; also
ensure the `@capacitor`.../core peerDependency in this file matches the final
choice in core/package.json so the iOS package contract stays consistent (verify
and align the peer dependency entry in package.json with the core package
identity and version).

In `@lerna.json`:
- Around line 16-20: Remove the Git merge-conflict markers (<<<<<<< HEAD,
=======, >>>>>>> upstream/main) from lerna.json and leave a single valid
"version" entry (choose either "8.0.8" or "8.3.0") so the JSON is well-formed;
ensure the final file contains only one "version" key and valid JSON syntax (no
conflict markers).

In `@package.json`:
- Around line 35-55: Remove the Git conflict markers and produce a valid JSON
devDependencies object: merge the two sides so all required packages appear once
(e.g., include `@types/node`, `@types/tar` if needed, eslint and
eslint-plugin-import, lerna, prettier, prettier-plugin-java, rimraf, semver,
swiftlint, tar, and prettier-pretty-check only if scripts still call it). Then
update the scripts section to either remove any invocation of
"prettier-pretty-check" or add "prettier-pretty-check" back into devDependencies
so scripts and devDependencies remain aligned; ensure the final package.json has
no conflict markers and parses as valid JSON.

---

Outside diff comments:
In `@android/CHANGELOG.md`:
- Around line 6-252: The changelog contains unresolved git conflict markers;
remove the conflict blocks marked by <<<<<<< HEAD, =======, and >>>>>>>
upstream/main and reconcile the duplicate release sections (e.g., the "##
[8.0.8]" / "# [8.3.0]" blocks) into a single, valid changelog entry: decide
which version content to keep or merge notes, delete the markers, ensure heading
syntax is consistent (## / # as needed) and that the file parses as valid
markdown with no leftover conflict markers.

In `@android/package.json`:
- Around line 2-39: The package.json contains unresolved git conflict markers
(e.g., <<<<<<< HEAD and >>>>>>> upstream/main) causing invalid JSON; open the
file, remove the conflict markers and reconcile the fields under "name",
"version", "description", "homepage", "author" and the "peerDependencies" block
so they form a single valid JSON object (decide whether to keep the Capacitor+
values or upstream/main values for "name"/"version"/etc., and ensure the
"peerDependencies" only lists the correct entries such as "@capacitor/core":
"^8.3.0" or "@capacitor-plus/core": "^8.0.0" as intended), then run npm install
to confirm the JSON parses.

In `@CHANGELOG.md`:
- Around line 6-523: The generated CHANGELOG.md contains an unresolved git merge
conflict (markers <<<<<<<, =======, >>>>>>>) that must be removed; open the
CHANGELOG.md, locate and delete the entire conflict block (including the
conflict markers and the duplicate/unmerged sections), then regenerate or
restore the changelog via the automated CI/CD changelog generation process
rather than hand-editing to ensure the file is produced correctly; ensure no
residual conflict markers remain before committing.

In `@cli/CHANGELOG.md`:
- Around line 6-280: The changelog contains unresolved git conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) mixing two release sections (the
local 8.0.8/8.0.x block and the upstream 8.3.0/8.2.0 block); remove the conflict
markers and produce a single coherent changelog by deciding which release
history to keep (e.g., keep the upstream 8.3.0..8.1.0 entries and discard the
duplicate local 8.0.x block, or merge both histories in chronological order),
ensuring headings (e.g., "# [8.3.0]" and "## [8.0.8]") and their bullet lists
are valid Markdown and no <<<<<<</=======/>>>>>>> tokens remain.

In `@cli/src/ios/update.ts`:
- Around line 54-59: The call to generateCordovaPackageFiles(cordovaPlugins,
config) starts async file writes but doesn’t wait for them to finish, causing
generatePackageFile to race; update generateCordovaPackageFiles to return a
Promise that only resolves once all per-plugin Package.swift writes complete
(e.g., collect write promises and await Promise.all or make internal actions
fully async/await), keep the await generateCordovaPackageFiles(...) call here so
checkPluginsForPackageSwift and generatePackageFile run only after all plugin
Package.swift files are written.

In `@core/CHANGELOG.md`:
- Around line 6-159: There is an unresolved Git merge conflict in the changelog
containing the conflict markers <<<<<<< HEAD, =======, and >>>>>>>
upstream/main; remove these markers and reconcile the two sections (either keep
the local HEAD release notes, keep the upstream/main release notes, or merge
them into a single coherent changelog), ensuring the final markdown has valid
headings (e.g., only one top-level release section in that block) and no
leftover conflict markers so the changelog parses correctly.

In `@ios/CHANGELOG.md`:
- Around line 6-225: The changelog contains unresolved Git conflict markers
(<<<<<<<, =======, >>>>>>>) between the local block starting with "## [8.0.8]"
and the upstream block starting with "# [8.3.0]"; open ios/CHANGELOG.md, remove
the conflict marker lines and the duplicate block you don't want to keep so the
file contains one coherent changelog (either keep the local "## [8.0.8]" series
or the upstream "# [8.3.0]" series), ensure headings like "## [8.0.8]" / "#
[8.3.0]" and commit references remain properly formatted and no leftover marker
lines remain.

---

Nitpick comments:
In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`:
- Around line 342-344: Replace the redundant double lookup of "Range" in
WebViewLocalServer by fetching it once into a temporary variable and falling
back to "range" if null; for example, in the method where requestHeaders and
rangeString are defined, do: String rangeString = requestHeaders.get("Range");
if (rangeString == null) rangeString = requestHeaders.get("range"); This avoids
calling requestHeaders.get("Range") twice while preserving the same behavior.

In `@cli/src/ios/common.ts`:
- Around line 32-37: Resolve config.ios.packageManager once into a local const
(e.g. const pkgManager = await config.ios.packageManager) and use pkgManager for
the conditional branches instead of awaiting repeatedly; update the branch that
currently checks for 'bundler', 'Cocoapods', and 'SPM' to reference pkgManager
and preserve existing pushes to checks (checkBundler, checkCocoaPods,
checkCocoaPods) and the SPM handling that reads
config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion.

In `@ios/Capacitor/Capacitor/CapacitorBridge.swift`:
- Around line 750-756: The init-added observer for tmpVCAppeared related to the
deprecated TmpViewController is now dead code and should be removed: locate the
init method in CapacitorBridge (the observer registration referencing
tmpVCAppeared / TmpViewController) and unregister or delete the
NotificationCenter observer registration there (and any corresponding
tmpVCAppeared handler method if it is no longer used), ensuring no leftover
references to TmpViewController remain; keep presentVC and dismissVC as the
active presentation APIs.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 40cb1e65-f5cc-4d55-b8fa-3ffd8d663a3d

📥 Commits

Reviewing files that changed from the base of the PR and between cbf464f and 9844a46.

📒 Files selected for processing (52)
  • .github/ISSUE_TEMPLATE/config.yml
  • .github/ISSUE_TEMPLATE/feature-request.yml
  • .github/ionic-issue-bot.yml
  • .github/workflows/needs-reply.yml
  • .github/workflows/publish-ios.yml
  • .github/workflows/test.yml
  • CHANGELOG.md
  • android/CHANGELOG.md
  • android/capacitor/src/main/assets/native-bridge.js
  • android/capacitor/src/main/java/com/getcapacitor/Bridge.java
  • android/capacitor/src/main/java/com/getcapacitor/BridgeActivity.java
  • android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java
  • android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java
  • android/package.json
  • cli/CHANGELOG.md
  • cli/package.json
  • cli/src/config.ts
  • cli/src/declarations.ts
  • cli/src/definitions.ts
  • cli/src/index.ts
  • cli/src/ios/build.ts
  • cli/src/ios/common.ts
  • cli/src/ios/doctor.ts
  • cli/src/ios/open.ts
  • cli/src/ios/run.ts
  • cli/src/ios/update.ts
  • cli/src/tasks/add.ts
  • cli/src/tasks/migrate-spm.ts
  • cli/src/tasks/migrate.ts
  • cli/src/tasks/run.ts
  • cli/src/tasks/sourcemaps.ts
  • cli/src/tasks/sync.ts
  • cli/src/tasks/update.ts
  • cli/src/util/livereload.ts
  • cli/src/util/spm.ts
  • cli/src/util/template.ts
  • core/CHANGELOG.md
  • core/native-bridge.ts
  • core/package.json
  • core/src/core-plugins.ts
  • core/system-bars.md
  • ios-spm-template/App/CapApp-SPM/README.md
  • ios/CHANGELOG.md
  • ios/Capacitor/Capacitor/CAPBridgeProtocol.swift
  • ios/Capacitor/Capacitor/CAPBridgedJSTypes.h
  • ios/Capacitor/Capacitor/CAPBridgedJSTypes.m
  • ios/Capacitor/Capacitor/CapacitorBridge.swift
  • ios/Capacitor/Capacitor/assets/native-bridge.js
  • ios/package.json
  • lerna.json
  • package.json
  • scripts/pack-cli-assets.mjs
💤 Files with no reviewable changes (1)
  • .github/ISSUE_TEMPLATE/feature-request.yml

runs-on: ubuntu-latest
steps:
- name: Close old issues that need reply
uses: imhoffd/needs-reply@v2
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Resolve the SHA behind tag v2 (and verify whether it's annotated).
ref_json=$(curl -s https://api.github.com/repos/imhoffd/needs-reply/git/ref/tags/v2)
obj_type=$(echo "$ref_json" | jq -r '.object.type')
obj_sha=$(echo "$ref_json" | jq -r '.object.sha')

if [ "$obj_type" = "commit" ]; then
  echo "Pin this SHA: $obj_sha"
else
  tag_json=$(curl -s "https://api.github.com/repos/imhoffd/needs-reply/git/tags/$obj_sha")
  commit_sha=$(echo "$tag_json" | jq -r '.object.sha')
  echo "Pin this SHA: $commit_sha"
fi

Repository: Cap-go/capacitor-plus

Length of output: 119


Pin the GitHub Action to a commit SHA instead of a mutable version tag.

Line 12 uses the mutable tag @v2, which weakens supply-chain guarantees and reproducibility. Pin to the commit SHA that v2 currently resolves to.

Suggested change
-      - name: Close old issues that need reply
-        uses: imhoffd/needs-reply@v2
+      - name: Close old issues that need reply
+        uses: imhoffd/needs-reply@71e8d5144caa0d4a1e292348bfafa3866d08c855
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
uses: imhoffd/needs-reply@v2
uses: imhoffd/needs-reply@71e8d5144caa0d4a1e292348bfafa3866d08c855
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/needs-reply.yml at line 12, Replace the mutable action tag
"imhoffd/needs-reply@v2" with the specific commit SHA that v2 currently resolves
to so the workflow uses an immutable reference; update the uses entry (the
string "imhoffd/needs-reply@v2") to "imhoffd/needs-reply@<COMMIT_SHA>" where
<COMMIT_SHA> is the full commit hash from the action repository to pin the
dependency and improve reproducibility.

Comment on lines +21 to +24
- uses: actions/checkout@v5
with:
fetch-depth: 0
ref: 'main'
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Avoid publishing from a hard-coded branch.

Line 24 forces checkout of main, so publish can run against code different from the triggering revision. That risks publishing the wrong pod contents/version.

Suggested fix
       - uses: actions/checkout@v5
         with:
           fetch-depth: 0
-          ref: 'main'
+          ref: ${{ github.sha }}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- uses: actions/checkout@v5
with:
fetch-depth: 0
ref: 'main'
- uses: actions/checkout@v5
with:
fetch-depth: 0
ref: ${{ github.sha }}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/publish-ios.yml around lines 21 - 24, The workflow is
forcing checkout to a hard-coded branch via the actions/checkout step (uses:
actions/checkout@v5 with ref: 'main'), which can publish code different from the
triggering revision; change that checkout to use the triggering ref/sha (e.g.,
remove the fixed ref or set ref: ${{ github.ref }} or ref: ${{ github.sha }}) so
the publish job checks out the exact commit that triggered the workflow (update
the actions/checkout@v5 step accordingly).


initWindowInsetsListener();
initSafeAreaInsets();
initSafeAreaCSSVariables();
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Don't inject safe-area CSS before viewport-fit=cover is known.

initSafeAreaCSSVariables() now runs during load, before onDOMReady() decides whether the page actually uses viewport-fit=cover. On Android 15+, that can leave non-zero --safe-area-inset-* values on apps that stay in the native-padding path, so apps using the documented CSS fallback can end up with double-applied insets. Gate the initial injection on hasViewportCover, or clear the CSS vars once the page reports false.

Also applies to: 166-174

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java` at
line 103, The initial call to initSafeAreaCSSVariables() is injecting safe-area
CSS before we know if the page uses viewport-fit=cover; change the behavior so
initSafeAreaCSSVariables() is only invoked when hasViewportCover is true (i.e.,
gate the initial injection in the load path), and ensure the
onDOMReady()/handleViewportCoverResult path clears the injected CSS vars if the
page reports hasViewportCover=false (remove or reset --safe-area-inset-* in the
same helper used by initSafeAreaCSSVariables()); also apply the same guard/clear
logic to the duplicate calls around the block referenced at lines 166-174 so no
CSS vars remain when native-padding is used.

Comment on lines +2 to +14
<<<<<<< HEAD
"name": "@capacitor-plus/cli",
"version": "8.0.8",
"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.3.0",
"description": "Capacitor: Cross-platform apps with JavaScript and the web",
"homepage": "https://capacitorjs.com",
"author": "Ionic Team <hi@ionic.io> (https://ionic.io)",
>>>>>>> upstream/main
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Resolve the leftover merge-conflict block before merging.

Lines 2-14 still contain <<<<<<<, =======, and >>>>>>>, so package.json is invalid JSON and npm install already fails with EJSONPARSE. Pick a single package metadata block here and keep the name/version/description/homepage/author fields consistent with the artifact this fork is meant to publish.

🧰 Tools
🪛 Biome (2.4.10)

[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: String values must be double quoted.

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-8: End of file expected

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-14: End of file expected

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character /

(parse)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@cli/package.json` around lines 2 - 14, Remove the Git conflict markers
(<<<<<<<, =======, >>>>>>>) from package.json and keep only one coherent
metadata block for the package by choosing which variant to publish; ensure the
retained fields name, version, description, homepage, and author are consistent
with the intended artifact (e.g., either the "@capacitor-plus/cli" fork values
or the upstream "@capacitor/cli" values) and that the resulting file is valid
JSON (no trailing commas, proper quotes). Locate the conflict inside
package.json around the name/version/description/homepage/author entries and
delete the other variant and the separators so npm can parse the file.

Comment on lines +30 to +37
async function getPackageManager(config: Config, packageManager: any): Promise<PackageManager> {
if (packageManager === 'cocoapods') {
if ((await config.ios.packageManager) === 'bundler') {
return 'bundler';
}
return 'Cocoapods';
}
return 'SPM';
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Reject unsupported --packagemanager values instead of silently using SPM.

Anything other than cocoapods falls through to SPM, so a typo like --packagemanager cocoapod will provision the wrong iOS dependency flow with no error.

🛠 Proposed fix
-async function getPackageManager(config: Config, packageManager: any): Promise<PackageManager> {
-  if (packageManager === 'cocoapods') {
+async function getPackageManager(config: Config, packageManager?: string): Promise<PackageManager> {
+  if (!packageManager || packageManager === 'spm') {
+    return 'SPM';
+  }
+
+  if (packageManager === 'cocoapods') {
     if ((await config.ios.packageManager) === 'bundler') {
       return 'bundler';
     }
     return 'Cocoapods';
   }
-  return 'SPM';
+
+  throw new Error(`Invalid package manager "${packageManager}". Expected "cocoapods" or "spm".`);
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@cli/src/index.ts` around lines 30 - 37, The getPackageManager function
currently treats any non-'cocoapods' input as SPM; change it to explicitly
validate the packageManager argument and reject unsupported values: in
getPackageManager, handle 'cocoapods' (with the existing bundler check via
config.ios.packageManager) and an explicit 'spm' case, and otherwise throw an
informative Error (or return a rejected Promise) indicating the unsupported
--packagemanager value; use the function name getPackageManager and the
config.ios.packageManager check to locate the code and update the returned
identifiers consistently (e.g., 'cocoapods'/'bundler' and 'spm'/'SPM') so typos
no longer silently default to SPM.

Comment on lines +2 to +14
<<<<<<< HEAD
"name": "@capacitor-plus/core",
"version": "8.0.8",
"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.3.0",
"description": "Capacitor: Cross-platform apps with JavaScript and the web",
"homepage": "https://capacitorjs.com",
"author": "Ionic Team <hi@ionic.io> (https://ionic.io)",
>>>>>>> upstream/main
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

This package manifest is still in a conflicted state.

The conflict markers make the file unparsable and also leave the published package identity unresolved. Please pick a single name/version here before merging, because downstream manifests now need to reference whatever this package actually exports.

🧰 Tools
🪛 Biome (2.4.10)

[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: String values must be double quoted.

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-8: End of file expected

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-14: End of file expected

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character /

(parse)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@core/package.json` around lines 2 - 14, The package.json contains unresolved
git conflict markers and duplicate metadata blocks; remove the conflict markers
(<<<<<<<, =======, >>>>>>>) and pick one consistent set of package fields (e.g.,
"name", "version", "description", "homepage", "author") so the manifest is valid
JSON and the package identity is unambiguous; update the chosen "name" and
"version" values in the package.json block (referencing the "name" and "version"
keys) and ensure the remaining fields from that block are kept and the other
block discarded.

return defaultValue;
}

- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue; {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Detect Objective-C method implementations that mistakenly include ';' before '{'
rg -nP --type=objc '^\s*[-+]\s*\([^)]*\)\s*[^{}]*;\s*\{' ios/Capacitor/Capacitor/CAPBridgedJSTypes.m

Repository: Cap-go/capacitor-plus

Length of output: 174


Remove the stray semicolon from the method implementation signature.

Line 32 contains invalid Objective-C syntax with a semicolon before the opening brace, which will cause compilation failure.

Proposed fix
-- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue; {
+- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue {
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue; {
- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m` at line 32, The method
implementation for getArray:defaultValue: contains a stray semicolon before the
opening brace which causes invalid Objective-C syntax; remove the semicolon from
the method signature in the CAPBridgedJSTypes.m implementation so the
declaration reads as a proper Objective-C method implementation (i.e., ensure
the signature for - (NSArray * _Nullable)getArray:(NSString * _Nonnull)key
defaultValue:(NSArray * _Nullable)defaultValue is immediately followed by the
opening brace).

Comment on lines +2 to +14
<<<<<<< HEAD
"name": "@capacitor-plus/ios",
"version": "8.0.8",
"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.3.0",
"description": "Capacitor: Cross-platform apps with JavaScript and the web",
"homepage": "https://capacitorjs.com",
"author": "Ionic Team <hi@ionic.io> (https://ionic.io)",
>>>>>>> upstream/main
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Finish the merge here before publishing or installing this workspace.

This manifest still contains conflict markers, so it cannot be parsed. When you resolve it, keep the package identity and the @capacitor.../core peer dependency consistent with the final choice in core/package.json; mixing the two identities will break the iOS package contract.

Also applies to: 36-41

🧰 Tools
🪛 Biome (2.4.10)

[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: String values must be double quoted.

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-8: End of file expected

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-14: End of file expected

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character /

(parse)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ios/package.json` around lines 2 - 14, The package.json contains unresolved
git conflict markers; remove the conflict section and choose a single consistent
package identity (either "@capacitor/ios" or "@capacitor-plus/ios") and update
the "name", "version", "description", "homepage", and "author" fields
accordingly; also ensure the `@capacitor`.../core peerDependency in this file
matches the final choice in core/package.json so the iOS package contract stays
consistent (verify and align the peer dependency entry in package.json with the
core package identity and version).

Comment on lines +16 to +20
<<<<<<< HEAD
"version": "8.0.8",
=======
"version": "8.3.0",
>>>>>>> upstream/main
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify unresolved merge markers are gone and JSON is valid.

set -euo pipefail

echo "Checking for conflict markers..."
rg -n '^(<<<<<<<|=======|>>>>>>>)' lerna.json && {
  echo "Found unresolved conflict markers in lerna.json"
  exit 1
} || true

echo "Validating JSON parse..."
python - <<'PY'
import json
from pathlib import Path
p = Path("lerna.json")
json.loads(p.read_text(encoding="utf-8"))
print("lerna.json is valid JSON")
PY

Repository: Cap-go/capacitor-plus

Length of output: 197


Resolve unresolved merge-conflict markers in lerna.json (lines 16–20).

The file contains conflict markers that break JSON parsing and block release tooling. Remove the markers and select a single "version" value.

Proposed fix
-<<<<<<< HEAD
-  "version": "8.0.8",
-=======
   "version": "8.3.0",
->>>>>>> upstream/main
🧰 Tools
🪛 Biome (2.4.10)

[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: String values must be double quoted.

(parse)


[error] 17-17: End of file expected

(parse)


[error] 17-17: End of file expected

(parse)


[error] 17-17: End of file expected

(parse)


[error] 17-18: End of file expected

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 19-19: End of file expected

(parse)


[error] 19-19: End of file expected

(parse)


[error] 19-19: End of file expected

(parse)


[error] 19-20: End of file expected

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character /

(parse)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lerna.json` around lines 16 - 20, Remove the Git merge-conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) from lerna.json and leave a
single valid "version" entry (choose either "8.0.8" or "8.3.0") so the JSON is
well-formed; ensure the final file contains only one "version" key and valid
JSON syntax (no conflict markers).

Comment on lines +35 to +55
<<<<<<< HEAD
"@types/node": "^24.10.1",
"@types/tar": "^6.1.2",
"eslint": "^8.57.1",
"eslint-plugin-import": "^2.31.0",
=======
"@types/node": "18.18.6",
"eslint": "^8.57.0",
>>>>>>> upstream/main
"lerna": "^7.1.3",
"prettier": "^3.6.2",
"prettier-plugin-java": "^2.7.7",
"rimraf": "^6.1.0",
"semver": "^7.3.7",
"swiftlint": "^2.0.0",
<<<<<<< HEAD
"tar": "^6.1.11",
"prettier-pretty-check": "^0.2.0"
=======
"tar": "^7.5.3"
>>>>>>> upstream/main
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Resolve this merge block and keep the remaining scripts' dependencies aligned.

package.json is still invalid JSON here, which is already blocking npm install in CI. Also, if this is resolved by taking the upstream side verbatim, Line 22 will still call prettier-pretty-check even though that dependency disappears. Remove the conflict markers and make sure the final devDependencies still cover the scripts that remain.

🧰 Tools
🪛 Biome (2.4.10)

[error] 35-35: unexpected character <

(parse)


[error] 35-35: unexpected character <

(parse)


[error] 35-35: unexpected character <

(parse)


[error] 35-35: unexpected character <

(parse)


[error] 35-35: unexpected character <

(parse)


[error] 35-35: unexpected character <

(parse)


[error] 35-35: unexpected character <

(parse)


[error] 35-35: String values must be double quoted.

(parse)


[error] 36-36: End of file expected

(parse)


[error] 36-36: End of file expected

(parse)


[error] 36-36: End of file expected

(parse)


[error] 36-36: End of file expected

(parse)


[error] 37-37: End of file expected

(parse)


[error] 37-37: End of file expected

(parse)


[error] 37-37: End of file expected

(parse)


[error] 37-37: End of file expected

(parse)


[error] 38-38: End of file expected

(parse)


[error] 38-38: End of file expected

(parse)


[error] 38-38: End of file expected

(parse)


[error] 38-38: End of file expected

(parse)


[error] 39-39: End of file expected

(parse)


[error] 39-39: End of file expected

(parse)


[error] 39-39: End of file expected

(parse)


[error] 39-40: End of file expected

(parse)


[error] 40-40: unexpected character =

(parse)


[error] 40-40: unexpected character =

(parse)


[error] 40-40: unexpected character =

(parse)


[error] 40-40: unexpected character =

(parse)


[error] 40-40: unexpected character =

(parse)


[error] 40-40: unexpected character =

(parse)


[error] 40-40: unexpected character =

(parse)


[error] 41-41: End of file expected

(parse)


[error] 41-41: End of file expected

(parse)


[error] 41-41: End of file expected

(parse)


[error] 41-41: End of file expected

(parse)


[error] 42-42: End of file expected

(parse)


[error] 42-42: End of file expected

(parse)


[error] 42-42: End of file expected

(parse)


[error] 42-43: End of file expected

(parse)


[error] 43-43: unexpected character >

(parse)


[error] 43-43: unexpected character >

(parse)


[error] 43-43: unexpected character >

(parse)


[error] 43-43: unexpected character >

(parse)


[error] 43-43: unexpected character >

(parse)


[error] 43-43: unexpected character >

(parse)


[error] 43-43: unexpected character >

(parse)


[error] 43-43: unexpected character /

(parse)


[error] 44-44: End of file expected

(parse)


[error] 44-44: End of file expected

(parse)


[error] 44-44: End of file expected

(parse)


[error] 44-44: End of file expected

(parse)


[error] 45-45: End of file expected

(parse)


[error] 45-45: End of file expected

(parse)


[error] 45-45: End of file expected

(parse)


[error] 45-45: End of file expected

(parse)


[error] 46-46: End of file expected

(parse)


[error] 46-46: End of file expected

(parse)


[error] 46-46: End of file expected

(parse)


[error] 46-46: End of file expected

(parse)


[error] 47-47: End of file expected

(parse)


[error] 47-47: End of file expected

(parse)


[error] 47-47: End of file expected

(parse)


[error] 47-47: End of file expected

(parse)


[error] 48-48: End of file expected

(parse)


[error] 48-48: End of file expected

(parse)


[error] 48-48: End of file expected

(parse)


[error] 48-48: End of file expected

(parse)


[error] 49-49: End of file expected

(parse)


[error] 49-49: End of file expected

(parse)


[error] 49-49: End of file expected

(parse)


[error] 49-50: End of file expected

(parse)


[error] 50-50: unexpected character <

(parse)


[error] 50-50: unexpected character <

(parse)


[error] 50-50: unexpected character <

(parse)


[error] 50-50: unexpected character <

(parse)


[error] 50-50: unexpected character <

(parse)


[error] 50-50: unexpected character <

(parse)


[error] 50-50: unexpected character <

(parse)


[error] 51-51: End of file expected

(parse)


[error] 51-51: End of file expected

(parse)


[error] 51-51: End of file expected

(parse)


[error] 51-51: End of file expected

(parse)


[error] 52-52: End of file expected

(parse)


[error] 52-52: End of file expected

(parse)


[error] 52-52: End of file expected

(parse)


[error] 53-53: unexpected character =

(parse)


[error] 53-53: unexpected character =

(parse)


[error] 53-53: unexpected character =

(parse)


[error] 53-53: unexpected character =

(parse)


[error] 53-53: unexpected character =

(parse)


[error] 53-53: unexpected character =

(parse)


[error] 53-53: unexpected character =

(parse)


[error] 54-54: End of file expected

(parse)


[error] 54-54: End of file expected

(parse)


[error] 54-54: End of file expected

(parse)


[error] 55-55: unexpected character >

(parse)


[error] 55-55: unexpected character >

(parse)


[error] 55-55: unexpected character >

(parse)


[error] 55-55: unexpected character >

(parse)


[error] 55-55: unexpected character >

(parse)


[error] 55-55: unexpected character >

(parse)


[error] 55-55: unexpected character >

(parse)


[error] 55-55: String values must be double quoted.

(parse)


[error] 55-55: unexpected character /

(parse)


[error] 55-55: String values must be double quoted.

(parse)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@package.json` around lines 35 - 55, Remove the Git conflict markers and
produce a valid JSON devDependencies object: merge the two sides so all required
packages appear once (e.g., include `@types/node`, `@types/tar` if needed, eslint
and eslint-plugin-import, lerna, prettier, prettier-plugin-java, rimraf, semver,
swiftlint, tar, and prettier-pretty-check only if scripts still call it). Then
update the scripts section to either remove any invocation of
"prettier-pretty-check" or add "prettier-pretty-check" back into devDependencies
so scripts and devDependencies remain aligned; ensure the final package.json has
no conflict markers and parses as valid JSON.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.