Skip to content

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

Closed
riderx wants to merge 46 commits into
plusfrom
sync/plus-upstream-20260425-053635
Closed

chore: sync plus with upstream main (conflicts)#56
riderx wants to merge 46 commits into
plusfrom
sync/plus-upstream-20260425-053635

Conversation

@riderx

@riderx riderx commented Apr 25, 2026

Copy link
Copy Markdown
Member

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 HTTPS support for live-reload functionality.
    • Enhanced Swift Package Manager (SPM) configuration options for iOS builds.
    • Improved multipart form-data handling with robust boundary extraction.
  • Bug Fixes

    • Fixed URL object support in fetch interception.
    • Resolved null version handling in app detection.
    • Enhanced SystemBars style persistence across configuration changes.
    • Improved safe-area CSS variable injection for better viewport coverage.
  • Chores

    • Updated version to 8.3.1 across all packages.
    • Increased CI/CD job timeouts from 30 to 60 minutes.
    • Updated issue templates and automation workflows.

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>
jcesarmobile and others added 16 commits March 16, 2026 17:46
…onic-team#8391)

Co-authored-by: Pedro Bilro <pedro.gustavo.bilro@outsystems.com>
…ic-team#8351)

Co-authored-by: OS-pedrogustavobilro <pedro.gustavo.bilro@outsystems.com>
Co-authored-by: OS-ruimoreiramendes <rui.moreira.mendes@outsystems.com>
Co-authored-by: OS-ruimoreiramendes <rui.moreira.mendes@outsystems.com>
Co-authored-by: Pedro Bilro <pedro.gustavo.bilro@outsystems.com>
@coderabbitai

coderabbitai Bot commented Apr 25, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR merges upstream Capacitor v8.3.1 changes into the fork, transitioning from @capacitor-plus to @capacitor packages (v8.0.8 → v8.3.1). It includes new GitHub Actions workflows, iOS Swift Package Manager support with configuration surface, fetch URL object interception, native bridge enhancements, and unresolved Git merge conflicts in multiple changelog files.

Changes

Cohort / File(s) Summary
GitHub Actions & Workflows
.github/workflows/needs-reply.yml, .github/workflows/publish-ios.yml, .github/workflows/test.yml
New daily auto-close workflow for issues needing reply, iOS publishing workflow with CocoaPods token support, and expanded job timeouts (30→60 min) plus iOS simulator setup steps.
Issue Templates & Config
.github/ISSUE_TEMPLATE/config.yml, .github/ISSUE_TEMPLATE/feature-request.yml, .github/ionic-issue-bot.yml
Config updated with Canny feature request link; feature-request.yml deleted; issue-bot deadline shortened from 15 to 7 days.
Package Metadata & Versioning
lerna.json, package.json, android/package.json, cli/package.json, core/package.json, ios/package.json
Upstream sync: package names switched from @capacitor-plus to @capacitor (v8.0.8 → v8.3.1); peer dependencies updated; merge conflicts present in some files.
Changelog Files
CHANGELOG.md, android/CHANGELOG.md, cli/CHANGELOG.md, core/CHANGELOG.md, ios/CHANGELOG.md
Unresolved merge conflicts with upstream release notes (8.3.1–8.0.1) mixed with local 8.0.8 content.
CLI iOS Package Manager Configuration
cli/src/config.ts, cli/src/definitions.ts, cli/src/index.ts
New packageManager property ('Cocoapods' | 'bundler' | 'SPM') in IOSConfig; refactored CocoaPods path detection; new Writable type helper and getPackageManager function.
CLI SPM Support & Utilities
cli/src/util/spm.ts, cli/src/ios/common.ts, cli/src/declarations.ts
Added experimental.ios.spm config for SwiftPM version and plugin traits; new validation checks (checkSwiftToolsVersion, checkPackageTraitsRequirements); getCommonChecks helper centralizes package-manager-specific checks.
CLI Build & Workflow Commands
cli/src/ios/build.ts, cli/src/ios/open.ts, cli/src/ios/run.ts, cli/src/ios/update.ts, cli/src/ios/doctor.ts
Commands refactored to use config.ios.packageManager directly instead of dynamic detection; workspace vs. project build selection now based on packageManager value.
CLI Tasks & Sync
cli/src/tasks/add.ts, cli/src/tasks/migrate.ts, cli/src/tasks/migrate-spm.ts, cli/src/tasks/run.ts, cli/src/tasks/sync.ts, cli/src/tasks/update.ts
Async check composition via new addUpdateChecks and getCommonChecks; iOS packageManager set before template mutations; run command adds --https flag and conditional port display; sync/update use async check retrieval.
CLI Utilities
cli/src/util/livereload.ts, cli/src/util/template.ts, scripts/pack-cli-assets.mjs
Live-reload supports HTTPS scheme; tar library switched to named extract export; sourcemaps inlining extended to .css files.
Android Native Bridge & HTTP
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
Added URL object support in fetch interception; null versionName handling in binary check; defensive null-check guards in Activity lifecycle methods.
Android Web View & Request Handling
android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java, android/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.java
PathHandler deprecated with new buildDefaultResponseHeaders() defensive copy method; multipart boundary extraction robustified with extractBoundaryFromContentType helper; range request refactored for case-insensitive header detection.
Android SystemBars Plugin
android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java
Major refactor: preserves bar styles across config changes, refactored safe-area injection, rewritten window-insets listener with WebView version-aware behavior, IME visibility detection, new getThemeColor helper, activity decor background color setup.
Core Framework & Plugins
core/package.json, core/native-bridge.ts, core/src/core-plugins.ts, core/system-bars.md
Package switched to @capacitor/core v8.3.1; URL fetch interception added; SystemBars.show/hide options made optional; cookies plugin omits empty expires attribute; documentation updated with optional parameter clarity.
iOS Bridging & Protocol Updates
ios/Capacitor/Capacitor/CAPBridgeProtocol.swift, ios/Capacitor/Capacitor/CAPBridgedJSTypes.h, ios/Capacitor/Capacitor/CAPBridgedJSTypes.m
presentVC/dismissVC deprecated with guidance to use viewController directly; new getArray:defaultValue: bridged accessor added.
iOS Bridge & URL Handling
ios/Capacitor/Capacitor/CapacitorBridge.swift, ios/Capacitor/Capacitor/Plugins/CapacitorUrlRequest.swift, ios/Capacitor/Capacitor/assets/native-bridge.js
Deprecated tmpWindow/tmpVCAppeared; removed popover special-case and tmpWindow usage in presentVC/dismissVC; boundary extraction robustified with stricter "boundary=" parsing and quote stripping; URL fetch interception added.
iOS Metadata & Documentation
ios/package.json, ios-spm-template/App/CapApp-SPM/README.md
Package switched to @capacitor/ios v8.3.1 with updated peers; simulator device bumped iPhone 16→17; SPM README wording refinement ("SPM"→"package", "you"→"your").

Estimated code review effort

🎯 5 (Critical) | ⏱️ 90+ minutes

Possibly related issues

Possibly related PRs

  • fix: SPM correct platform for iOS #38 — Shares direct code modifications in cli/src/util/spm.ts and iOS version helper refactoring (getMajoriOSVersion vs. getMajorMinoriOSVersion), indicating overlapping SPM and versioning concerns.

Poem

🐰 A rabbit hops through merge-conflict trees,
SPM sprouts and package changes with ease,
From Plus to plain, v8 takes its leap,
With bridges rebuilt and workflows run deep.
Fetch now handles URLs by the score,
The warren rejoices—eight-point-three-one's here to adore!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.86% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'chore: sync plus with upstream main (conflicts)' directly and clearly describes the primary change: syncing the plus branch with upstream main while acknowledging unresolved merge conflicts present in the changeset.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ 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-20260425-053635

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

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

Copy link
Copy Markdown

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: 3bba479212

ℹ️ 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 thread cli/src/util/spm.ts

export async function generatePackageText(config: Config, plugins: Plugin[]): Promise<string> {
const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name);
<<<<<<< HEAD

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 merge markers from SPM package generation

The committed conflict markers in generatePackageText make cli/src/util/spm.ts invalid TypeScript, so any command path that compiles or imports this file will fail before execution (for example bun run build / tsc). This is a hard parse error, not a runtime edge case, and blocks all iOS SPM-related CLI flows until the merge is resolved.

Useful? React with 👍 / 👎.

Comment thread package.json
"@ionic/eslint-config": "^0.4.0",
"@ionic/prettier-config": "^4.0.0",
"@ionic/swiftlint-config": "^2.0.0",
<<<<<<< HEAD

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 Resolve conflict markers in package manifests

This commit leaves unresolved merge markers in JSON manifests, making them unparsable (starting here in root package.json, and similarly in lerna.json, cli/package.json, android/package.json, ios/package.json, and core/package.json). Package tooling that reads these files (bun install, npm, release/version scripts) will fail immediately with JSON parse errors, so the repository cannot be built or published until these conflicts are removed.

Useful? React with 👍 / 👎.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 19

Caution

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

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

6-260: ⚠️ Potential issue | 🟠 Major

Finish resolving this changelog merge.

This section still contains conflict markers and two incompatible histories. Merging it as-is would publish contradictory release notes for the same slot and makes it clear the upstream sync was not fully resolved.

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

In `@android/CHANGELOG.md` around lines 6 - 260, The changelog contains unresolved
git conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) and two
different release histories (e.g., the "## [8.0.8]" block and the "## [8.3.1]" /
"## [8.3.0]" blocks). Remove the conflict markers and reconcile the two
histories by keeping the intended canonical history: either retain the local "##
[8.0.8]" entries or replace them with the upstream "## [8.3.1]/8.3.0" section
(or merge their entries into a single chronological release list), ensuring only
one coherent set of release headings remains; verify headings like "## [8.0.8]"
and "## [8.3.1]" are in proper order, remove duplicate/redundant entries, and
save the file with no conflict markers before committing.
core/CHANGELOG.md (1)

6-163: ⚠️ Potential issue | 🟠 Major

Resolve the conflicting release-history block.

This file still has raw merge markers and mixed fork/upstream entries at the top, so the changelog is currently self-contradictory rather than a single resolved history.

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

In `@core/CHANGELOG.md` around lines 6 - 163, The file contains unresolved git
merge markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) mixing two
changelog histories; open core/CHANGELOG.md, remove the conflict markers and the
duplicated block you don't want, and produce a single coherent release-history
section (either keep the HEAD block or the upstream/main block) ensuring
headings (e.g., "## [8.0.8]" vs "## [8.3.1]") are not duplicated and the
chronology is correct; save the cleaned file so the changelog is one continuous
history with no raw merge markers.
cli/CHANGELOG.md (1)

6-286: ⚠️ Potential issue | 🟠 Major

Resolve unresolved merge-conflict markers in the changelog.

Line 6 through Line 286 still contains <<<<<<<, =======, and >>>>>>>, which means this merge was not fully resolved. Please remove markers and keep a single, coherent release history before merging.

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

In `@cli/CHANGELOG.md` around lines 6 - 286, The changelog contains unresolved git
conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main); remove these
markers and merge the two blocks into one coherent release history, choosing the
correct entries to keep (either the HEAD section or the upstream/main section)
and deduplicate overlapping release entries (e.g., the 8.0.x vs 8.3.x sections),
ensuring the file contains a single, consistent chronological changelog without
any conflict markers.
ios/CHANGELOG.md (1)

6-231: ⚠️ Potential issue | 🟠 Major

Remove unresolved merge-conflict markers and consolidate iOS release history.

Line 6 through Line 231 still includes conflict markers (<<<<<<<, =======, >>>>>>>). Please resolve to one final changelog stream; current state is an incomplete merge artifact.

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

In `@ios/CHANGELOG.md` around lines 6 - 231, The file contains Git merge conflict
markers (<<<<<<<, =======, >>>>>>>) mixing two CHANGLEOG streams; remove all
conflict markers and consolidate into a single coherent iOS changelog by keeping
one timeline (e.g., the upstream/main stream starting with 8.3.1… or the HEAD
stream starting with 8.0.8…) and merging any non-duplicated entries, ensuring no
leftover <<<<<<<, =======, or >>>>>>> tokens remain and that headings (e.g., "##
[8.3.1]..." and "## [8.0.8]...") appear only once in chronological order.
CHANGELOG.md (1)

6-532: ⚠️ Potential issue | 🔴 Critical

Resolve merge markers and regenerate the changelog output.

Line 6, Line 457, and Line 532 still contain conflict markers (<<<<<<<, =======, >>>>>>>), so this merge is incomplete and blocking.

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 - 532, The changelog contains unresolved git
merge conflict markers (<<<<<<<, =======, >>>>>>>) that must be removed; restore
a clean autogenerated changelog instead of manual edits by discarding the
conflicted file changes and re-running the changelog generation workflow/command
used by CI (e.g., the repo's changelog/regeneration script or release workflow)
so the file is regenerated without conflict markers; ensure you do not hand-edit
the changelog and commit the regenerated output only.
🧹 Nitpick comments (1)
ios/Capacitor/Capacitor/CapacitorBridge.swift (1)

96-99: Consider removing the now-obsolete tmp window compatibility path.

tmpWindow/tmpVCAppeared are deprecated, but the observer lifecycle still references them (Line 226-228), and TmpViewController still posts that notification. If no compatibility contract remains, this dead path should be removed to reduce maintenance surface.

🤖 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 96 - 99, Remove
the deprecated temporary window compatibility path by deleting the unused
symbols tmpWindow and tmpVCAppeared and removing any observer
registration/removal and notification posting tied to that path: remove
references to tmpVCAppeared in the observer lifecycle (the
addObserver/removeObserver calls that reference tmpVCAppeared) and stop
TmpViewController from posting Notification.Name("tmpViewControllerAppeared");
also search for any other uses of tmpWindow/tmpVCAppeared/TmpViewController
notification behavior and delete or refactor them to the modern flow so no dead
compatibility code remains.
🤖 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 ref "imhoffd/needs-reply@v2" with an
immutable commit SHA to prevent silent upstream changes; locate the uses line
that references imhoffd/needs-reply (the string "uses: imhoffd/needs-reply@v2")
and update it to "uses: imhoffd/needs-reply@<full-commit-sha>" where
<full-commit-sha> is the SHA returned by the repository's commits API for the v2
ref.

In @.github/workflows/publish-ios.yml:
- Around line 21-24: The workflow is forcing actions/checkout@v5 to ref: 'main',
which overrides the triggering commit/tag and can publish from main instead of
the caller's ref; update the publish job's checkout step so it does not hardcode
ref: 'main' (remove the ref line or set it to the triggering ref such as
github.ref or github.sha) so actions/checkout@v5 checks out the actual event ref
that triggered the workflow.

In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`:
- Around line 59-60: The currentStatusBarStyle and currentGestureBarStyle are
being stored with DEFAULT resolved to LIGHT/DARK, causing apps using DEFAULT to
stop reacting to theme changes; modify setStyle() and any assignment sites
(including where currentStatusBarStyle/currentGestureBarStyle are set and the
logic in the block around the other affected code paths) so that when the
incoming style equals STYLE_DEFAULT you persist STYLE_DEFAULT (do not map it to
STYLE_LIGHT or STYLE_DARK before storing), but still apply the resolved
LIGHT/DARK to the system UI; in other words, separate "appliedStyle" (resolve
DEFAULT to LIGHT/DARK for immediate application) from "persistedStyle" (store
the raw incoming value like STYLE_DEFAULT) so DEFAULT remains persisted and
theme changes will trigger recalculation.
- Around line 321-325: getWebViewMajorVersion() currently parses the WebView
version with Integer.valueOf(versionSegments[0]) and can throw
NumberFormatException; update this method to reuse the guarded parsing pattern
from Bridge.java by wrapping the version extraction in a try-catch, log the
exception using the same logger used in Bridge (or Platform/Bridge logging
helper) and return null on parse failure so callers are safe; reference
getWebViewMajorVersion and the existing extractWebViewMajorVersion() in
Bridge.java as the model for the try/catch + logging behavior.

In
`@android/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.java`:
- Around line 323-346: The extractBoundaryFromContentType function can return an
empty string when the header has "boundary=" which causes setRequestBody to skip
fallback generation; modify extractBoundaryFromContentType so after trimming and
stripping surrounding quotes it checks if the resulting boundary is empty and
returns null in that case (i.e., ensure extractBoundaryFromContentType returns
null for empty boundary values) so setRequestBody will fall back to generating a
valid boundary.

In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`:
- Line 343: The code in WebViewLocalServer that sets rangeString only checks
"Range" and "range", missing mixed-case headers; update the lookup for
requestHeaders to be case-insensitive (e.g., normalize header names to
lower-case or iterate keys to match ignoring case) so rangeString is populated
for any casing variant, using the existing requestHeaders map and the
rangeString variable in the request-handling method.

In `@android/package.json`:
- Around line 2-14: This package manifest contains unresolved git merge conflict
markers (<<<<<<<, =======, >>>>>>>) making it invalid JSON; open the
package.json, remove the conflict markers and pick the intended values for the
conflicting fields (name, version, description, homepage, author) so both blocks
are reconciled into one valid JSON object (also check and resolve the similar
conflict at the later block mentioned around lines 34-39), then run a JSON
lint/npm install to verify the file parses and CI EJSONPARSE will be resolved.

In `@cli/package.json`:
- Around line 2-14: Remove the Git merge markers and produce a valid JSON object
for package.json; choose and apply a single, internally consistent set of
metadata values for the keys "name", "version", "description", "homepage", and
"author" (do not mix the HEAD and upstream blocks), ensure the package "name"
matches the rest of the file (e.g., keep "@capacitor-plus/cli" if this repo is
Cap-go/capacitor-plus or switch all metadata to "@capacitor/cli" and the
upstream values), and validate the result with a JSON linter so npm install no
longer errors with EJSONPARSE.

In `@cli/src/declarations.ts`:
- Around line 533-536: Fix the typo in the user-facing documentation string that
begins with "Warning: Capacitor does not officially support Swift 6 yet." by
replacing "throughrouly" with the correct spelling "thoroughly" so the sentence
reads "make sure to thoroughly test your iOS app."; update the text in the same
comment block in cli/src/declarations.ts (look for the Swift 6 warning string)
to apply this correction.

In `@cli/src/index.ts`:
- Line 327: configWritable.ios.packageManager is being assigned the Promise
returned by the async function getPackageManager; change the assignment to await
getPackageManager(packagemanager?.toLowerCase()) so the resolved PackageManager
is stored, and ensure the enclosing function is declared async (or otherwise
handles await) so awaiting is valid; reference the assignment to
configWritable.ios.packageManager and the getPackageManager(...) call when
making the change.

In `@cli/src/ios/update.ts`:
- Around line 133-142: The availability check uses the hardcoded string 'pod'
but the code later invokes the configured podPath; change the precheck to call
isInstalled(podPath) so the install branch runs for custom pod executables;
update the conditional in the else-if that currently reads isInstalled('pod') to
use the const podPath (declared earlier) and keep the subsequent
runCommand(podPath, ['install', ...(deployment ? ['--deployment'] : [])], { cwd:
config.ios.nativeProjectDirAbs }) as-is.

In `@cli/src/util/spm.ts`:
- Around line 100-106: Resolve the unresolved git conflict by keeping the
upstream changes: replace the usage of getMajorMinoriOSVersion with
getMajoriOSVersion, add the packageTraits and swiftToolsVersion variables
(packageTraits = config.app.extConfig.experimental?.ios?.spm?.packageTraits ??
{} and swiftToolsVersion =
config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion ?? '5.9') in
place of the conflict block, and remove the conflict markers; also update the
import on the top of the file to import getMajoriOSVersion instead of
getMajorMinoriOSVersion so the new references compile and the downstream code
using swiftToolsVersion and packageTraits resolves correctly.

In `@core/package.json`:
- Around line 2-14: Remove the unresolved Git conflict markers (<<<<<<<,
=======, >>>>>>>) from core/package.json and produce a valid merged package.json
entry: decide whether the package name/version/description/homepage/author
should be the original Capacitor values or the Capacitor+ fork values, then keep
only the chosen block (no markers) and ensure proper JSON formatting and commas
(e.g., around "name", "version", "description", "homepage", "author") so the
manifest parses correctly; reference the conflicting markers <<<<<<< HEAD and
>>>>>>> upstream/main to locate the conflict.

In `@ios/Capacitor/Capacitor/CapacitorBridge.swift`:
- Around line 750-755: presentVC(_:animated:completion:),
dismissVC(animated:completion:), and the similar showAlertWith method must call
UIKit APIs only on the main thread; update each to dispatch
presentation/dismissal to the main queue (e.g., wrap the existing
self.viewController?.present(...)/dismiss(...) and alert presentation calls in
DispatchQueue.main.async or conditionally call directly if already on main) so
modal operations always run on the main thread and preserve the original
animated and completion parameters.

In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m`:
- Line 32: The method implementation for - (NSArray *
_Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray *
_Nullable)defaultValue currently contains an extra semicolon before the opening
brace; remove the stray semicolon so the implementation reads as a normal method
body (i.e., change the signature in CAPBridgedJSTypes.m for
getArray:defaultValue: to not include "; {" but simply "{").

In `@ios/Capacitor/Capacitor/Plugins/CapacitorUrlRequest.swift`:
- Around line 94-109: The extractBoundary(from:) function currently returns an
empty string for headers like "boundary=", which leads to malformed multipart
bodies; update extractBoundary(from:) to trim surrounding whitespace and quotes
from the extracted boundary and if the resulting string is empty (zero-length)
return nil so callers treat it as missing and can fall back to a generated
boundary or header override; ensure you handle both the quoted and unquoted
cases and reference the extractBoundary(from:) function in your change.

In `@ios/package.json`:
- Around line 2-14: The package.json contains unresolved merge markers (<<<<<<<
HEAD, =======, >>>>>>> upstream/main) splitting two variants of fields like
"name", "version", "description", "homepage", and "author"; remove the conflict
markers, pick the intended values for those fields (or merge them into a single
coherent set), and ensure the resulting JSON is valid (no trailing commas) for
the "name", "version", "description", "homepage", and "author" entries
referenced here; also apply the same fix for the duplicate/conflicting block
around lines 36-41 so the entire file parses correctly.

In `@lerna.json`:
- Around line 16-20: The repository contains unresolved Git merge conflict
markers (e.g., in lerna.json with the "version" field, multiple package.json
files, CHANGELOGs, and source files like cli/src/util/spm.ts); locate each file
with conflict markers (<<<<<<<, =======, >>>>>>>), decide the correct content
for each conflict (choose the appropriate version, merge changes, or synthesize
a correct combined form), remove the conflict markers, validate JSON and code
syntax (ensure lerna.json and package.json are valid JSON and that spm.ts
compiles), run repository-wide lint/tests to catch remaining issues, and commit
the resolved files with a clear merge-resolution message.

In `@package.json`:
- Around line 35-55: Resolve the merge-conflict markers in package.json by
removing the <<<<<<<, =======, and >>>>>>> lines and producing a valid
dependencies/devDependencies block; pick the intended versions and merge unique
packages so there are no duplicate keys—specifically reconcile "@types/node"
(choose either "18.18.6" or "^24.10.1"), "eslint" (pick one version), restore or
drop "@types/tar" and "eslint-plugin-import" as needed, and decide which "tar"
and "prettier-pretty-check" entries to keep; ensure the final JSON has a single
entry per package name and valid commas/braces so npm install/CI can run.

---

Outside diff comments:
In `@android/CHANGELOG.md`:
- Around line 6-260: The changelog contains unresolved git conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) and two different release
histories (e.g., the "## [8.0.8]" block and the "## [8.3.1]" / "## [8.3.0]"
blocks). Remove the conflict markers and reconcile the two histories by keeping
the intended canonical history: either retain the local "## [8.0.8]" entries or
replace them with the upstream "## [8.3.1]/8.3.0" section (or merge their
entries into a single chronological release list), ensuring only one coherent
set of release headings remains; verify headings like "## [8.0.8]" and "##
[8.3.1]" are in proper order, remove duplicate/redundant entries, and save the
file with no conflict markers before committing.

In `@CHANGELOG.md`:
- Around line 6-532: The changelog contains unresolved git merge conflict
markers (<<<<<<<, =======, >>>>>>>) that must be removed; restore a clean
autogenerated changelog instead of manual edits by discarding the conflicted
file changes and re-running the changelog generation workflow/command used by CI
(e.g., the repo's changelog/regeneration script or release workflow) so the file
is regenerated without conflict markers; ensure you do not hand-edit the
changelog and commit the regenerated output only.

In `@cli/CHANGELOG.md`:
- Around line 6-286: The changelog contains unresolved git conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main); remove these markers and merge
the two blocks into one coherent release history, choosing the correct entries
to keep (either the HEAD section or the upstream/main section) and deduplicate
overlapping release entries (e.g., the 8.0.x vs 8.3.x sections), ensuring the
file contains a single, consistent chronological changelog without any conflict
markers.

In `@core/CHANGELOG.md`:
- Around line 6-163: The file contains unresolved git merge markers (<<<<<<<
HEAD, =======, >>>>>>> upstream/main) mixing two changelog histories; open
core/CHANGELOG.md, remove the conflict markers and the duplicated block you
don't want, and produce a single coherent release-history section (either keep
the HEAD block or the upstream/main block) ensuring headings (e.g., "## [8.0.8]"
vs "## [8.3.1]") are not duplicated and the chronology is correct; save the
cleaned file so the changelog is one continuous history with no raw merge
markers.

In `@ios/CHANGELOG.md`:
- Around line 6-231: The file contains Git merge conflict markers (<<<<<<<,
=======, >>>>>>>) mixing two CHANGLEOG streams; remove all conflict markers and
consolidate into a single coherent iOS changelog by keeping one timeline (e.g.,
the upstream/main stream starting with 8.3.1… or the HEAD stream starting with
8.0.8…) and merging any non-duplicated entries, ensuring no leftover <<<<<<<,
=======, or >>>>>>> tokens remain and that headings (e.g., "## [8.3.1]..." and
"## [8.0.8]...") appear only once in chronological order.

---

Nitpick comments:
In `@ios/Capacitor/Capacitor/CapacitorBridge.swift`:
- Around line 96-99: Remove the deprecated temporary window compatibility path
by deleting the unused symbols tmpWindow and tmpVCAppeared and removing any
observer registration/removal and notification posting tied to that path: remove
references to tmpVCAppeared in the observer lifecycle (the
addObserver/removeObserver calls that reference tmpVCAppeared) and stop
TmpViewController from posting Notification.Name("tmpViewControllerAppeared");
also search for any other uses of tmpWindow/tmpVCAppeared/TmpViewController
notification behavior and delete or refactor them to the modern flow so no dead
compatibility code remains.
🪄 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: 1a4fc028-6581-422c-9cac-b175491e7eba

📥 Commits

Reviewing files that changed from the base of the PR and between 2b5cfe0 and 3bba479.

📒 Files selected for processing (54)
  • .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/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.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/Plugins/CapacitorUrlRequest.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

Pin third-party GitHub Action to an immutable commit SHA.

Line 12 uses imhoffd/needs-reply@v2 (mutable tag). Pinning to a full SHA avoids silent upstream drift in scheduled automation.

#!/bin/bash
# Read-only: resolve the current commit behind the v2 ref
gh api repos/imhoffd/needs-reply/commits/v2 --jq '.sha'
Suggested hardening change
-      - name: Close old issues that need reply
-        uses: imhoffd/needs-reply@v2
+      - name: Close old issues that need reply
+        uses: imhoffd/needs-reply@<PINNED_COMMIT_SHA>
🤖 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 ref
"imhoffd/needs-reply@v2" with an immutable commit SHA to prevent silent upstream
changes; locate the uses line that references imhoffd/needs-reply (the string
"uses: imhoffd/needs-reply@v2") and update it to "uses:
imhoffd/needs-reply@<full-commit-sha>" where <full-commit-sha> is the SHA
returned by the repository's commits API for the v2 ref.

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

Do not force checkout to main in publish job.

Line 24 overrides the triggering ref and may publish podspec changes from main instead of the caller’s commit/tag.

Suggested fix
       - uses: actions/checkout@v5
         with:
           fetch-depth: 0
-          ref: 'main'
📝 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
🤖 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 actions/checkout@v5 to ref: 'main', which overrides the triggering
commit/tag and can publish from main instead of the caller's ref; update the
publish job's checkout step so it does not hardcode ref: 'main' (remove the ref
line or set it to the triggering ref such as github.ref or github.sha) so
actions/checkout@v5 checks out the actual event ref that triggered the workflow.

Comment on lines +59 to +60
private String currentStatusBarStyle = STYLE_DEFAULT;
private String currentGestureBarStyle = STYLE_DEFAULT;

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

Keep DEFAULT as the persisted style mode.

setStyle() resolves DEFAULT to LIGHT/DARK before storing it, so after the first run Lines 89-90 will keep reapplying that resolved value instead of recalculating from the new theme. Apps configured with DEFAULT will stop tracking dark/light mode changes after a configuration change.

♻️ Suggested fix
-    private String currentStatusBarStyle = STYLE_DEFAULT;
-    private String currentGestureBarStyle = STYLE_DEFAULT;
+    private String requestedStatusBarStyle = STYLE_DEFAULT;
+    private String requestedGestureBarStyle = STYLE_DEFAULT;
@@
-        setStyle(currentGestureBarStyle, BAR_GESTURE_BAR);
-        setStyle(currentStatusBarStyle, BAR_STATUS_BAR);
+        setStyle(requestedGestureBarStyle, BAR_GESTURE_BAR);
+        setStyle(requestedStatusBarStyle, BAR_STATUS_BAR);
@@
     private void setStyle(String style, String bar) {
+        final String requestedStyle = style;
         if (style.equals(STYLE_DEFAULT)) {
             style = getStyleForTheme();
         }
@@
-            currentStatusBarStyle = style;
+            requestedStatusBarStyle = requestedStyle;
             windowInsetsControllerCompat.setAppearanceLightStatusBars(!style.equals(STYLE_DARK));
         }
@@
-            currentGestureBarStyle = style;
+            requestedGestureBarStyle = requestedStyle;
             windowInsetsControllerCompat.setAppearanceLightNavigationBars(!style.equals(STYLE_DARK));
         }

Also applies to: 89-90, 263-277

🤖 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`
around lines 59 - 60, The currentStatusBarStyle and currentGestureBarStyle are
being stored with DEFAULT resolved to LIGHT/DARK, causing apps using DEFAULT to
stop reacting to theme changes; modify setStyle() and any assignment sites
(including where currentStatusBarStyle/currentGestureBarStyle are set and the
logic in the block around the other affected code paths) so that when the
incoming style equals STYLE_DEFAULT you persist STYLE_DEFAULT (do not map it to
STYLE_LIGHT or STYLE_DARK before storing), but still apply the resolved
LIGHT/DARK to the system UI; in other words, separate "appliedStyle" (resolve
DEFAULT to LIGHT/DARK for immediate application) from "persistedStyle" (store
the raw incoming value like STYLE_DEFAULT) so DEFAULT remains persisted and
theme changes will trigger recalculation.

Comment on lines +321 to +325
private Integer getWebViewMajorVersion() {
PackageInfo info = WebViewCompat.getCurrentWebViewPackage(getContext());
if (info != null && info.versionName != null) {
String[] versionSegments = info.versionName.split("\\.");
return Integer.valueOf(versionSegments[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.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Show the existing guarded WebView major-version parsing helper.
sed -n '375,385p' android/capacitor/src/main/java/com/getcapacitor/Bridge.java

# Show the new unguarded parsing site and nearby usages.
rg -n -C2 'getCurrentWebViewPackage|versionName\.split|Integer\.valueOf\(versionSegments\[0\]\)' android/capacitor/src/main/java

Repository: Cap-go/capacitor-plus

Length of output: 4276


Reuse the guarded WebView version parsing from Bridge.java.

The getWebViewMajorVersion() method at lines 321-325 parses the WebView version without exception handling. Integer.valueOf(versionSegments[0]) will throw NumberFormatException if the version string is malformed. The extractWebViewMajorVersion() method in Bridge.java wraps this parsing in a try-catch block with logging, providing a safe pattern already used elsewhere in the codebase.

🤖 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`
around lines 321 - 325, getWebViewMajorVersion() currently parses the WebView
version with Integer.valueOf(versionSegments[0]) and can throw
NumberFormatException; update this method to reuse the guarded parsing pattern
from Bridge.java by wrapping the version extraction in a try-catch, log the
exception using the same logger used in Bridge (or Platform/Bridge logging
helper) and return null on parse failure so callers are safe; reference
getWebViewMajorVersion and the existing extractWebViewMajorVersion() in
Bridge.java as the model for the try/catch + logging behavior.

Comment on lines +323 to +346
public static String extractBoundaryFromContentType(String contentType) {
String boundaryPrefix = "boundary=";
int boundaryIndex = contentType.indexOf(boundaryPrefix);
if (boundaryIndex == -1) {
return null;
}

// Extract the substring starting right after "boundary="
String boundary = contentType.substring(boundaryIndex + boundaryPrefix.length());

// Find the end of the boundary value by looking for the next ";"
int endIndex = boundary.indexOf(";");
if (endIndex != -1) {
boundary = boundary.substring(0, endIndex);
}

// Remove surrounding double quotes if present
boundary = boundary.trim();
if (boundary.startsWith("\"") && boundary.endsWith("\"")) {
boundary = boundary.substring(1, boundary.length() - 1);
}

return boundary;
}

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 | 🟡 Minor

Return null for empty boundary values.

On Line 331-Line 345, extractBoundaryFromContentType returns empty string for boundary=. In setRequestBody (Line 229), that skips fallback generation and writes invalid multipart delimiters.

💡 Proposed fix
 public static String extractBoundaryFromContentType(String contentType) {
+    if (contentType == null) {
+        return null;
+    }
     String boundaryPrefix = "boundary=";
     int boundaryIndex = contentType.indexOf(boundaryPrefix);
     if (boundaryIndex == -1) {
         return null;
     }
@@
-    if (boundary.startsWith("\"") && boundary.endsWith("\"")) {
+    if (boundary.startsWith("\"") && boundary.endsWith("\"") && boundary.length() >= 2) {
         boundary = boundary.substring(1, boundary.length() - 1);
     }
 
-    return boundary;
+    return boundary.isEmpty() ? null : boundary;
 }
🤖 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/util/CapacitorHttpUrlConnection.java`
around lines 323 - 346, The extractBoundaryFromContentType function can return
an empty string when the header has "boundary=" which causes setRequestBody to
skip fallback generation; modify extractBoundaryFromContentType so after
trimming and stripping surrounding quotes it checks if the resulting boundary is
empty and returns null in that case (i.e., ensure extractBoundaryFromContentType
returns null for empty boundary values) so setRequestBody will fall back to
generating a valid boundary.

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 accidentally use '; {' in .m/.mm files.
# Expected: no matches after the fix.
rg -nP '^\s*[-+]\s*\([^)]+\)[^{;]*;\s*\{' -g '**/*.m' -g '**/*.mm'

Repository: Cap-go/capacitor-plus

Length of output: 219


Remove trailing semicolon from method implementation.

The method declaration at line 32 has an invalid semicolon before the opening brace (; {). In Objective-C, method implementations must not include a semicolon before the method body, only method declarations do.

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 - (NSArray * _Nullable)getArray:(NSString * _Nonnull)key
defaultValue:(NSArray * _Nullable)defaultValue currently contains an extra
semicolon before the opening brace; remove the stray semicolon so the
implementation reads as a normal method body (i.e., change the signature in
CAPBridgedJSTypes.m for getArray:defaultValue: to not include "; {" but simply
"{").

Comment on lines +94 to +109
private func extractBoundary(from contentType: String) -> String? {
if let boundaryRange = contentType.range(of: "boundary=") {
var boundary = contentType[boundaryRange.upperBound...]
if let endRange = boundary.range(of: ";") {
boundary = boundary[..<endRange.lowerBound]
}

if boundary.hasPrefix("\"") && boundary.hasSuffix("\"") {
return String(boundary.dropFirst().dropLast())
} else {
return String(boundary)
}
}

return nil
}

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 | 🟡 Minor

Handle empty extracted boundary as missing value.

On Line 95-Line 105, extractBoundary(from:) can return "" for headers like boundary=. That produces malformed multipart bodies instead of falling back to generated boundary/header override.

💡 Proposed fix
 private func extractBoundary(from contentType: String) -> String? {
     if let boundaryRange = contentType.range(of: "boundary=") {
         var boundary = contentType[boundaryRange.upperBound...]
         if let endRange = boundary.range(of: ";") {
             boundary = boundary[..<endRange.lowerBound]
         }
-        
-        if boundary.hasPrefix("\"") && boundary.hasSuffix("\"") {
-            return String(boundary.dropFirst().dropLast())
-        } else {
-            return String(boundary)
-        }
+
+        let trimmed = String(boundary).trimmingCharacters(in: .whitespacesAndNewlines)
+        let unquoted: String
+        if trimmed.hasPrefix("\""), trimmed.hasSuffix("\""), trimmed.count >= 2 {
+            unquoted = String(trimmed.dropFirst().dropLast())
+        } else {
+            unquoted = trimmed
+        }
+
+        return unquoted.isEmpty ? nil : unquoted
     }
     
     return nil
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ios/Capacitor/Capacitor/Plugins/CapacitorUrlRequest.swift` around lines 94 -
109, The extractBoundary(from:) function currently returns an empty string for
headers like "boundary=", which leads to malformed multipart bodies; update
extractBoundary(from:) to trim surrounding whitespace and quotes from the
extracted boundary and if the resulting string is empty (zero-length) return nil
so callers treat it as missing and can fall back to a generated boundary or
header override; ensure you handle both the quoted and unquoted cases and
reference the extractBoundary(from:) function in your change.

Comment thread ios/package.json
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.1",
"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 file still has unresolved merge conflicts.

The conflict markers make ios/package.json invalid JSON, so package installation and the iOS verify job cannot run. Please pick the intended values for both sections and remove the markers before this is merged.

Also applies to: 36-41

🧰 Tools
🪛 Biome (2.4.12)

[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
merge markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) splitting two
variants of fields like "name", "version", "description", "homepage", and
"author"; remove the conflict markers, pick the intended values for those fields
(or merge them into a single coherent set), and ensure the resulting JSON is
valid (no trailing commas) for the "name", "version", "description", "homepage",
and "author" entries referenced here; also apply the same fix for the
duplicate/conflicting block around lines 36-41 so the entire file parses
correctly.

Comment thread lerna.json
Comment on lines +16 to +20
<<<<<<< HEAD
"version": "8.0.8",
=======
"version": "8.3.1",
>>>>>>> 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
set -euo pipefail

# Expect no output once all merge conflicts are resolved.
rg -n '^(<<<<<<<|=======|>>>>>>>)'

Repository: Cap-go/capacitor-plus

Length of output: 1607


Resolve all unresolved merge conflicts throughout the repository.

The lerna.json file contains raw conflict markers (lines 16-20) making it invalid JSON, but the merge conflict problem extends across the entire repository. Multiple package.json files, CHANGELOG files, and source files (cli/src/util/spm.ts) all contain unresolved conflict markers that must be resolved before any merging or release can proceed.

🧰 Tools
🪛 Biome (2.4.12)

[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, The repository contains unresolved Git
merge conflict markers (e.g., in lerna.json with the "version" field, multiple
package.json files, CHANGELOGs, and source files like cli/src/util/spm.ts);
locate each file with conflict markers (<<<<<<<, =======, >>>>>>>), decide the
correct content for each conflict (choose the appropriate version, merge
changes, or synthesize a correct combined form), remove the conflict markers,
validate JSON and code syntax (ensure lerna.json and package.json are valid JSON
and that spm.ts compiles), run repository-wide lint/tests to catch remaining
issues, and commit the resolved files with a clear merge-resolution message.

Comment thread package.json
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 merge conflicts in root package.json (current CI blocker).

Line 35 through Line 55 still contains merge conflict markers, which makes the root manifest invalid JSON and directly matches the EJSONPARSE pipeline failure. Resolve this block first to unblock install/test.

🧰 Tools
🪛 Biome (2.4.12)

[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, Resolve the merge-conflict markers in
package.json by removing the <<<<<<<, =======, and >>>>>>> lines and producing a
valid dependencies/devDependencies block; pick the intended versions and merge
unique packages so there are no duplicate keys—specifically reconcile
"@types/node" (choose either "18.18.6" or "^24.10.1"), "eslint" (pick one
version), restore or drop "@types/tar" and "eslint-plugin-import" as needed, and
decide which "tar" and "prettier-pretty-check" entries to keep; ensure the final
JSON has a single entry per package name and valid commas/braces so npm
install/CI can run.

@riderx riderx closed this May 5, 2026
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.