Skip to content

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

Open
riderx wants to merge 46 commits intoplusfrom
sync/plus-upstream-20260427-060116
Open

chore: sync plus with upstream main (conflicts)#58
riderx wants to merge 46 commits intoplusfrom
sync/plus-upstream-20260427-060116

Conversation

@riderx
Copy link
Copy Markdown
Member

@riderx riderx commented Apr 27, 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 iOS library publishing to CocoaPods via GitHub Actions
    • Added HTTPS support for development server
    • Enhanced SPM configuration with customizable Swift tools version and package traits
    • Automated issue management workflow for unanswered issues
  • Bug Fixes

    • Fixed URL handling in fetch requests
    • Improved safe-area calculations with keyboard visibility awareness
    • Fixed boundary extraction in multipart form data
    • Enhanced system bars styling persistence
    • Fixed null handling in binary version detection
  • CI/Testing

    • Increased build timeout limits
    • Added iOS simulator platform setup

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
Copy link
Copy Markdown

coderabbitai Bot commented Apr 27, 2026

📝 Walkthrough

Walkthrough

This PR introduces an unresolved upstream merge integrating Capacitor 8.3.1 changes into the repository, including new GitHub workflows for automated issue management, iOS CocoaPods publishing, and enhanced CI configuration. Multiple files contain unresolved Git merge conflict markers. Changes span native iOS/Android implementations, CLI package manager detection refactoring, and project metadata updates.

Changes

Cohort / File(s) Summary
GitHub Workflows & Issue Templates
.github/ISSUE_TEMPLATE/config.yml, .github/ISSUE_TEMPLATE/feature-request.yml, .github/workflows/needs-reply.yml, .github/workflows/publish-ios.yml, .github/workflows/test.yml, .github/ionic-issue-bot.yml
New workflows for automated issue closure, iOS CocoaPods publishing, and reply-awaiting issue management. Updated issue template configuration. Increased CI job timeouts from 30 to 60 minutes; added iOS platform pre-download steps. Reduced grace period for reproduction requests from 15 to 7 days.
Android Native HTTP & Bridge
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/util/CapacitorHttpUrlConnection.java
Added null-guards for lifecycle delegations. Enhanced multipart form-data boundary handling with extraction helper. Refactored response headers management to prevent concurrent range-request header conflicts. Fixed null versionName normalization.
Android SystemBars & Native Bridge
android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java, android/capacitor/src/main/assets/native-bridge.js
Refactored safe-area handling from margin-based to CSS variable injection with IME awareness. Persisted style state across configuration changes. Added WebView version gating and theme color support. Extended fetch interception to recognize URL objects as proxy targets.
iOS View Controller & Bridge
ios/Capacitor/Capacitor/CapacitorBridge.swift, ios/Capacitor/Capacitor/CAPBridgeProtocol.swift
Deprecated tmpWindow/tmpVCAppeared properties. Simplified presentVC/dismissVC by removing popover branching and temporary window workflows. Marked legacy methods as deprecated with guidance toward direct viewController APIs.
iOS URL Handling & Multipart
ios/Capacitor/Capacitor/Plugins/CapacitorUrlRequest.swift, ios/Capacitor/Capacitor/assets/native-bridge.js, core/native-bridge.ts
Added boundary extraction helper for multipart requests supporting quoted boundaries. Extended fetch interception to handle URL object inputs by proxying via createProxyUrl. Updated both iOS and core native-bridge implementations.
iOS BridgedJS & Core Plugins
ios/Capacitor/Capacitor/CAPBridgedJSTypes.h, ios/Capacitor/Capacitor/CAPBridgedJSTypes.m, core/src/core-plugins.ts
Added getArray accessor for bridged JS value retrieval. Made SystemBarsPlugin show/hide options parameters optional. Fixed cookie expiration attribute to only append when explicitly provided.
CLI iOS Package Manager Refactoring
cli/src/config.ts, cli/src/definitions.ts, cli/src/util/spm.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/update.ts
Refactored iOS package manager detection from runtime checks to pre-computed config values. Introduced Writable utility type and PackageManager union. Created async getCommonChecks helper consolidating bundler/CocoaPods/SPM validation. Updated SPM Package.swift generation to support configurable Swift tools version and plugin traits. Deprecated checkPackageManager in favor of config.ios.packageManager.
CLI Configuration & Declarations
cli/src/declarations.ts, cli/src/index.ts
Added experimental.ios.spm configuration surface with swiftToolsVersion and packageTraits support. Updated SystemBars.insetsHandling documentation for disable mode. Added --https flag to run command. Updated help text for live-reload URL determination.
CLI Run & Sync Tasks
cli/src/tasks/run.ts, cli/src/tasks/sync.ts, cli/src/util/livereload.ts
Added https option to RunCommandOptions with conditional port handling. Updated live-reload URL builder to include protocol selection and omit port when undefined. Changed sync to await async addUpdateChecks result.
CLI Build Tools & Template
cli/src/util/template.ts, scripts/pack-cli-assets.mjs
Updated tar module imports to use named exports (extract/create) instead of default imports. Affected template extraction and CLI asset packing.
Project Metadata & Changelogs
CHANGELOG.md, android/CHANGELOG.md, android/package.json, cli/CHANGELOG.md, cli/package.json, core/CHANGELOG.md, core/package.json, ios/CHANGELOG.md, ios/package.json, lerna.json, package.json
Unresolved merge conflicts present across multiple files. Version updated from 8.0.8 to 8.3.1. Package identity changes from @capacitor-plus/* to @capacitor/*. Changelogs contain conflicting upstream release notes. Root package.json dependencies updated (@types/node, eslint, tar). Peer dependencies adjusted for @capacitor/core versions.
Documentation
core/system-bars.md, ios-spm-template/App/CapApp-SPM/README.md
Updated SystemBars documentation for optional options parameters and clarified CSS variables injection terminology. Fixed SPM template README phrasing.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related issues

  • Upstream merge integration conflicts: The PR addresses an upstream Capacitor sync that introduced unresolved Git merge conflict markers across package.json, CHANGELOG.md, and lerna.json files, requiring careful manual conflict resolution and verification of the correct version/metadata after merge.

Poem

🐰 A merge from upstream comes hopping through,
Eight-point-three, so fresh and new!
SPM traits and iOS flows align,
Yet conflicts wait for paws to define—
Conflicts resolved, the docs shine bright,
Now Capacitor hops left and right! 🌟

🚥 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)' accurately describes the main change—this PR syncs the plus branch with upstream main and explicitly notes the presence of merge conflicts that need resolution.
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-20260427-060116

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: 8201854fee

ℹ️ 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 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 merge markers in workspace manifest JSON

package.json includes unresolved conflict markers (<<<<<<<, =======, >>>>>>>), which makes the root manifest invalid JSON and causes dependency/install tooling to fail immediately when reading it. This commit introduces the same unresolved conflict pattern in other manifests (android/package.json, cli/package.json, core/package.json, ios/package.json, and lerna.json), so package management and release/versioning workflows are blocked until the conflicts are actually resolved.

Useful? React with 👍 / 👎.

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 conflict markers from SPM generation source

cli/src/util/spm.ts has unresolved merge markers inside generatePackageText, which makes the TypeScript file syntactically invalid and breaks CLI compilation before runtime. Because this is in the SPM package generation path, cap sync/update flows that depend on this module cannot run until the conflict block is resolved.

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: 19

Caution

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

⚠️ Outside diff range comments (4)
android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java (1)

280-318: ⚠️ Potential issue | 🟠 Major

Don't feed windowBackground straight into setBackgroundColor().

The android.R.attr.windowBackground attribute resolves to either a drawable resource or a color. Using only typedValue.data from resolveAttribute() assumes it's always a direct color, but when it's a drawable reference, passing the resource ID to setBackgroundColor() interprets it as an ARGB value and renders the wrong background.

Check whether the resolved value is a drawable resource before applying it:

Suggested fix
-        getActivity().getWindow().getDecorView().setBackgroundColor(getThemeColor(getContext(), android.R.attr.windowBackground));
+        applyThemeBackground(getContext(), getActivity().getWindow().getDecorView());
     }
 
-    public int getThemeColor(Context context, int attrRes) {
+    private void applyThemeBackground(Context context, View view) {
         TypedValue typedValue = new TypedValue();
-
         Resources.Theme theme = context.getTheme();
-        theme.resolveAttribute(attrRes, typedValue, true);
-        return typedValue.data;
+        if (!theme.resolveAttribute(android.R.attr.windowBackground, typedValue, true)) {
+            return;
+        }
+
+        if (typedValue.resourceId != 0) {
+            view.setBackgroundResource(typedValue.resourceId);
+        } else {
+            view.setBackgroundColor(typedValue.data);
+        }
     }
🤖 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 280 - 318, The code feeds android.R.attr.windowBackground into
setBackgroundColor via getThemeColor(), but windowBackground can be a color or a
drawable resource; update the call site and resolution logic so you first
resolve the attribute (using TypedValue as in getThemeColor) and then: if
typedValue.type is TYPE_INT_COLOR call setBackgroundColor(typedValue.data), else
if it's a reference load the Drawable (e.g. use
ContextCompat.getDrawable(getContext(), typedValue.resourceId)) and call
getActivity().getWindow().getDecorView().setBackground(drawable) instead of
setBackgroundColor; refer to the existing getThemeColor() and the call
getActivity().getWindow().getDecorView().setBackgroundColor(...) to locate where
to change this behavior.
CHANGELOG.md (1)

6-532: ⚠️ Potential issue | 🔴 Critical

Resolve committed merge-conflict markers and regenerate changelog via CI.

Line 6, Line 457, and Line 532 still contain <<<<<<<, =======, and >>>>>>>. This is a merge blocker and also causes downstream markdown structure errors. Please resolve the conflict and let CI/CD regenerate the changelog content.

As per coding guidelines, "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.md contains unresolved Git
merge conflict markers (<<<<<<<, =======, >>>>>>>) around the
downstream/UPSTREAM sections (see the conflict blocks starting near the entries
for versions like 8.0.8 / 8.3.1); do not manually edit the content — resolve the
merge by checking out the branch, perform a proper git merge conflict resolution
to choose the correct changelog content (or combine entries) and commit the
resolved file, then trigger the repository's changelog regeneration CI job so
the automated changelog generator rebuilds CHANGELOG.md without markers; ensure
the final commit contains no conflict markers in CHANGELOG.md before pushing.
core/CHANGELOG.md (1)

6-163: ⚠️ Potential issue | 🔴 Critical

Unresolved merge conflict markers must be removed.

The changelog still contains <<<<<<<, =======, and >>>>>>>, indicating merge resolution is incomplete.

🤖 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 CHANGELOG.md contains unresolved
git merge markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) causing broken
content between competing sections (e.g., the blocks around "## [8.0.8]" and "##
[8.3.1]"); remove the conflict markers and reconcile the two versions into a
single coherent changelog entry (keep the correct release lines and headings you
intend to ship, merge or discard duplicate entries as appropriate), ensuring
only one set of release headings and their notes remain and the file has no
remaining <<<<<<<, =======, or >>>>>>> markers.
android/CHANGELOG.md (1)

6-260: ⚠️ Potential issue | 🔴 Critical

Resolve remaining merge conflict markers before merging.

<<<<<<< HEAD, =======, and >>>>>>> upstream/main are still present, so this file is in an unresolved state and should not be merged as-is.

🤖 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) mixing two
versions (Cap-go and ionic-team entries); open android/CHANGELOG.md, remove the
conflict markers and reconcile the sections by choosing the intended content
(either keep the HEAD block for Cap-go or the upstream/main block for
ionic-team) and merge any needed entries so the file is a single coherent
changelog (ensure headings, dates, and lists are syntactically valid and no
markers remain), then save and commit the resolved file.
🧹 Nitpick comments (3)
android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java (1)

342-344: Consider using case-insensitive header lookup or caching the result.

The Range header lookup calls requestHeaders.get("Range") twice, and only handles two case variants. HTTP headers are case-insensitive per RFC 7233.

Proposed optimization
         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");
+        }

Or for comprehensive case-insensitivity:

String rangeString = requestHeaders.entrySet().stream()
    .filter(e -> "range".equalsIgnoreCase(e.getKey()))
    .map(Map.Entry::getValue)
    .findFirst()
    .orElse(null);
🤖 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, The current Range lookup does a duplicate get and only
checks two case variants; replace it with a single case-insensitive lookup over
requestHeaders (e.g., search entries where key.equalsIgnoreCase("range") and
take its value) and assign that to rangeString, so it handles any header casing
and avoids repeated map access; update any usages of rangeString accordingly.
android/CHANGELOG.md (1)

225-242: Fix heading-level jumps in the inserted release section (MD001).

The new block uses ### directly under # version headings, which triggers markdownlint heading-increment.

Proposed markdown fix
-### Bug Fixes
+## Bug Fixes
...
-### Bug Fixes
+## Bug Fixes
...
-### Reverts
+## Reverts
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@android/CHANGELOG.md` around lines 225 - 242, The markdown has heading level
jumps (MD001): change the release-section headings so they don't go from a
top-level "#" version heading straight to "###". For each release block (e.g.,
the "# [8.2.0]" and "# [8.1.0]" headings), either change the version headings
from "#" to "##" or change the subsequent "### Bug Fixes" headings to "## Bug
Fixes" (and adjust other subheadings consistently) so heading levels increment
correctly; update all occurrences like the "# [8.2.0]" / "### Bug Fixes" pairs
and the "# [8.1.0]" block.
core/CHANGELOG.md (1)

135-146: Normalize heading levels in the new upstream section (MD001).

### headings appear immediately under # headings; bump these to ## to avoid heading-level skips.

Proposed markdown fix
-### Bug Fixes
+## Bug Fixes
...
-### Reverts
+## Reverts
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@core/CHANGELOG.md` around lines 135 - 146, Change the heading level for the
release sub-sections under the top-level CHANGELOG heading so there are no
skipped levels: replace the `###` headings (e.g., the "Bug Fixes" lines and any
other `###` headers that appear directly under the top-level `# [8.2.0]...` and
`# [8.1.0]...` version headings) with `##` so the structure goes `#` -> `##` ->
`###` where appropriate; update each occurrence of `### Bug Fixes` (and other
immediate `###` subsections under a `#` version heading) to `##` to satisfy
MD001.
🤖 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 reference "uses: imhoffd/needs-reply@v2"
with a pinned immutable commit SHA for supply-chain safety: locate the "uses:
imhoffd/needs-reply@v2" entry in the workflow and change it to use the full
commit SHA form (e.g., @<full-commit-sha>) by selecting a specific commit from
the imhoffd/needs-reply repository and pasting its commit SHA; ensure you update
any relevant workflow comment to document which commit was chosen and why.

In @.github/workflows/publish-ios.yml:
- Around line 21-24: The checkout step currently pins the ref to 'main' which
causes the workflow to always publish from main; update the actions/checkout@v5
invocation (the step with "uses: actions/checkout@v5" and the "ref:" field) to
use the triggering ref instead (for example use the workflow context like
github.ref or github.sha, or remove the explicit ref so checkout defaults to the
event ref) so the publish uses the branch/tag/commit that invoked the workflow
rather than main.

In
`@android/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.java`:
- Around line 323-346: The extractBoundaryFromContentType method currently
returns an empty string for inputs like "boundary=" or "boundary=\"\"" which
callers treat as valid; modify extractBoundaryFromContentType to treat
blank/empty boundaries as missing by returning null when the computed boundary
is empty after trimming and after stripping surrounding quotes. Locate the
method extractBoundaryFromContentType and, after trimming and after removing
quotes (the logic around boundary.trim() and the startsWith/endsWith block), add
a check that if boundary.length() == 0 return null so callers receive null for
missing boundaries.

In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`:
- Around line 131-142: Fix the malformed Javadoc and add a deprecation "since"
value for the method: in class WebViewLocalServer update the Javadoc for
getResponseHeaders() to remove the orphaned "</p>" tag and use a proper
`@deprecated` Javadoc tag that references buildDefaultResponseHeaders(), then
update the annotation to `@Deprecated`(since = "4.6.0", forRemoval = true)
(replace "4.6.0" with the actual deprecation version if different) so the
annotation includes the since attribute and forRemoval flag; ensure
getResponseHeaders() still returns responseHeaders but the docs clearly point
callers to buildDefaultResponseHeaders().

In `@android/package.json`:
- Around line 2-14: The package.json contains unresolved Git conflict markers
(e.g., <<<<<<< HEAD, =======, >>>>>>> upstream/main) around the manifest fields
"name", "version", "description", "homepage", and "author", which makes the file
invalid JSON and breaks npm install; fix it by removing the conflict markers and
producing a single valid JSON object for those fields (choose the intended
values or reconcile them), validate the JSON (e.g., with a JSON linter), and
repeat the same resolution for the other conflict block mentioned (lines with
similar markers around fields at 34-39).

In `@cli/CHANGELOG.md`:
- Line 6: Remove the leftover Git merge conflict markers (e.g., the lines
starting with "<<<<<<< HEAD", "=======", and ">>>>>>>") from the changelog and
reconcile the two competing sections into a single coherent release history;
edit the entries around those markers to choose or merge the correct content and
delete the conflict markers so the file contains one final timeline (also check
and fix the same markers at the other referenced locations).

In `@cli/package.json`:
- Around line 2-14: The package.json currently contains git conflict markers
(e.g., <<<<<<< HEAD, =======, >>>>>>> upstream/main) which breaks JSON parsing;
open the package.json, remove the conflict markers and choose the correct
metadata for fields "name", "version", "description", "homepage", and "author"
(decide whether to keep `@capacitor-plus/cli` or `@capacitor/cli` and the
corresponding version/author/homepage), then ensure the resulting file is valid
JSON (proper commas/quotes) and run npm install to verify the EJSONPARSE is
resolved.

In `@cli/src/declarations.ts`:
- Line 535: Fix the typo in the documentation comment that reads "If you need to
set this property to 6.0 or higher, make sure to throughrouly test your iOS
app." by replacing "throughrouly" with the correct spelling "thoroughly" in the
declaration/comment string so the sentence reads "...make sure to thoroughly
test your iOS app." This change is in the comment text that contains that exact
sentence.

In `@cli/src/index.ts`:
- Around line 30-37: The getPackageManager function currently treats any
non-'cocoapods' packageManager as 'SPM' which hides typos; update
getPackageManager(config, packageManager) to validate packageManager against an
explicit allowed set (e.g. 'cocoapods' and 'spm' or 'SPM' as your canonical
value) and throw a clear Error when an unknown value is passed, while keeping
the existing special-case that if packageManager === 'cocoapods' and (await
config.ios.packageManager) === 'bundler' you return 'bundler' and otherwise
return 'Cocoapods'; ensure callers handle the thrown error or surface it to fail
fast.

In `@cli/src/ios/update.ts`:
- Around line 133-142: The installation check uses isInstalled('pod') but the
code later executes the pod binary stored in podPath, so replace the hardcoded
check with isInstalled(podPath) (or otherwise verify that podPath is available)
before calling runCommand; update the conditional that currently references
isInstalled('pod') to reference podPath and keep the existing
runCommand(podPath, ['install', ...], { cwd: config.ios.nativeProjectDirAbs })
behavior so custom/non-PATH pod binaries are detected and used correctly
(affecting podPath, isInstalled, runCommand, useBundler logic).

In `@cli/src/tasks/run.ts`:
- Line 114: The status message contains a typo: change the template literal
string that currently reads "App running with live reload listing for:
${options.https ? 'https' : 'http'}://${options.host}${options.port ?
`:${options.port}` : ''}. Press Ctrl+C to quit." so that "listing" becomes
"listening" (preserve the rest of the interpolation using the same options
object and formatting).

In `@cli/src/util/spm.ts`:
- Around line 100-106: Resolve the leftover merge conflict by removing the
conflict markers and choosing/merging the correct iOS version helper and added
variables: ensure iosVersion is set using the intended function (either
getMajorMinoriOSVersion or getMajoriOSVersion), and include the new variables
packageTraits and swiftToolsVersion (sourced from
config.app.extConfig.experimental?.ios?.spm) so swiftToolsVersion is defined
before it's interpolated; update the surrounding code to use those symbols
(iosVersion, packageTraits, swiftToolsVersion) consistently and remove any
duplicate or conflicting lines.

In `@core/package.json`:
- Around line 2-14: Remove the merge conflict markers (<<<<<<< HEAD, =======,
>>>>>>> upstream/main) from package.json and commit a single valid JSON object
for the metadata fields that are currently duplicated (the "name", "version",
"description", "homepage", and "author" properties). Choose which set of values
to keep (or merge them into the correct final values), ensure proper
commas/quotes so the file parses as valid JSON, and run a quick json parse or CI
lint to confirm EJSONPARSE is resolved.

In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m`:
- Around line 32-38: The method implementation for getArray:defaultValue: in
CAPBridgedJSTypes.m has a stray semicolon in the signature ("; {") which breaks
Objective-C syntax; remove the semicolon so the signature reads "- (NSArray *
_Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray *
_Nullable)defaultValue {", then save and rebuild to ensure the file compiles.

In `@ios/Capacitor/Capacitor/Plugins/CapacitorUrlRequest.swift`:
- Around line 94-109: The extractBoundary(from:) function can return an empty
string for inputs like "boundary=" or 'boundary=""'; update the logic in
extractBoundary(from contentType: String) to treat a normalized boundary of ""
as missing by returning nil after trimming surrounding quotes and semicolons.
Specifically, after computing the final boundary string (the variable boundary)
and unquoting it, check if it's empty and return nil if so; otherwise return the
non-empty String(boundary). This ensures callers never receive an empty
delimiter.

In `@ios/CHANGELOG.md`:
- Line 6: The CHANGELOG.md contains unresolved Git merge markers (e.g., the
"<<<<<<< HEAD" block) and duplicate release entries; open ios/CHANGELOG.md,
remove the merge markers and the unwanted side of the conflict, choose and keep
the correct final release text (consolidate entries if needed), and save the
file without any "<<<<<<<", "=======", or ">>>>>>>" markers; repeat the same
cleanup for the other conflict locations referenced (around the other indicated
sections).

In `@ios/package.json`:
- Around line 2-14: The package.json contains unresolved git conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) causing invalid JSON; open
package.json, remove the conflict markers and merge the two variants into one
coherent JSON object for the top-level fields (name, version, description,
homepage, author), choose the correct values (or combine/restore intended ones),
ensure proper commas/quotes so the file is valid JSON, and then validate the
file with a JSON linter or npm install to confirm the manifest is fixed.

In `@lerna.json`:
- Around line 16-20: There are unresolved git conflict markers in lerna.json
around the "version" key; remove the conflict markers (<<<<<<< HEAD, =======,
>>>>>>>) and leave a single valid JSON entry for "version" (pick the intended
value, e.g., "8.3.1" from upstream/main) so the file is valid JSON and tooling
that reads "version" can parse it.

In `@package.json`:
- Around line 35-55: Resolve the Git conflict markers inside package.json's
devDependencies by removing the <<<<<<<, =======, >>>>>>> lines and merging the
intended entries into a single valid JSON object; ensure the final
devDependencies include a consistent set (pick the correct versions for
"@types/node", "eslint", "tar", etc.) and preserve "prettier-pretty-check" if
the project's scripts (check the "prettier" script) still reference it—if you
choose to drop "prettier-pretty-check", also update the corresponding script to
avoid a missing dependency; finally validate the file parses as JSON (no
trailing commas) before committing.

---

Outside diff comments:
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`:
- Around line 280-318: The code feeds android.R.attr.windowBackground into
setBackgroundColor via getThemeColor(), but windowBackground can be a color or a
drawable resource; update the call site and resolution logic so you first
resolve the attribute (using TypedValue as in getThemeColor) and then: if
typedValue.type is TYPE_INT_COLOR call setBackgroundColor(typedValue.data), else
if it's a reference load the Drawable (e.g. use
ContextCompat.getDrawable(getContext(), typedValue.resourceId)) and call
getActivity().getWindow().getDecorView().setBackground(drawable) instead of
setBackgroundColor; refer to the existing getThemeColor() and the call
getActivity().getWindow().getDecorView().setBackgroundColor(...) to locate where
to change this behavior.

In `@android/CHANGELOG.md`:
- Around line 6-260: The changelog contains unresolved Git conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) mixing two versions (Cap-go and
ionic-team entries); open android/CHANGELOG.md, remove the conflict markers and
reconcile the sections by choosing the intended content (either keep the HEAD
block for Cap-go or the upstream/main block for ionic-team) and merge any needed
entries so the file is a single coherent changelog (ensure headings, dates, and
lists are syntactically valid and no markers remain), then save and commit the
resolved file.

In `@CHANGELOG.md`:
- Around line 6-532: The CHANGELOG.md contains unresolved Git merge conflict
markers (<<<<<<<, =======, >>>>>>>) around the downstream/UPSTREAM sections (see
the conflict blocks starting near the entries for versions like 8.0.8 / 8.3.1);
do not manually edit the content — resolve the merge by checking out the branch,
perform a proper git merge conflict resolution to choose the correct changelog
content (or combine entries) and commit the resolved file, then trigger the
repository's changelog regeneration CI job so the automated changelog generator
rebuilds CHANGELOG.md without markers; ensure the final commit contains no
conflict markers in CHANGELOG.md before pushing.

In `@core/CHANGELOG.md`:
- Around line 6-163: The CHANGELOG.md contains unresolved git merge markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) causing broken content between
competing sections (e.g., the blocks around "## [8.0.8]" and "## [8.3.1]");
remove the conflict markers and reconcile the two versions into a single
coherent changelog entry (keep the correct release lines and headings you intend
to ship, merge or discard duplicate entries as appropriate), ensuring only one
set of release headings and their notes remain and the file has no remaining
<<<<<<<, =======, or >>>>>>> markers.

---

Nitpick comments:
In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`:
- Around line 342-344: The current Range lookup does a duplicate get and only
checks two case variants; replace it with a single case-insensitive lookup over
requestHeaders (e.g., search entries where key.equalsIgnoreCase("range") and
take its value) and assign that to rangeString, so it handles any header casing
and avoids repeated map access; update any usages of rangeString accordingly.

In `@android/CHANGELOG.md`:
- Around line 225-242: The markdown has heading level jumps (MD001): change the
release-section headings so they don't go from a top-level "#" version heading
straight to "###". For each release block (e.g., the "# [8.2.0]" and "# [8.1.0]"
headings), either change the version headings from "#" to "##" or change the
subsequent "### Bug Fixes" headings to "## Bug Fixes" (and adjust other
subheadings consistently) so heading levels increment correctly; update all
occurrences like the "# [8.2.0]" / "### Bug Fixes" pairs and the "# [8.1.0]"
block.

In `@core/CHANGELOG.md`:
- Around line 135-146: Change the heading level for the release sub-sections
under the top-level CHANGELOG heading so there are no skipped levels: replace
the `###` headings (e.g., the "Bug Fixes" lines and any other `###` headers that
appear directly under the top-level `# [8.2.0]...` and `# [8.1.0]...` version
headings) with `##` so the structure goes `#` -> `##` -> `###` where
appropriate; update each occurrence of `### Bug Fixes` (and other immediate
`###` subsections under a `#` version heading) to `##` to satisfy MD001.
🪄 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: 53cebad6-a0ed-41a0-93cb-619aac1f5dc2

📥 Commits

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

📒 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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Finds action references pinned to tags/branches instead of immutable SHAs.
rg -n --glob '.github/workflows/*.yml' --glob '.github/workflows/*.yaml' \
  'uses:\s*[^@[:space:]]+@(v?[0-9]+(\.[0-9]+){0,2}|main|master|latest)\b'

Repository: Cap-go/capacitor-plus

Length of output: 214


🏁 Script executed:

#!/bin/bash
# Check if the workflow file exists and list workflow files
echo "=== Checking for workflow files ==="
find . -type d -name ".github" 2>/dev/null
find . -path "*/.github/workflows/*.yml" -o -path "*/.github/workflows/*.yaml" 2>/dev/null | head -20

Repository: Cap-go/capacitor-plus

Length of output: 446


🏁 Script executed:

#!/bin/bash
# Check if the specific file exists and show its content
if [ -f ".github/workflows/needs-reply.yml" ]; then
  echo "File found. Content:"
  cat -n ".github/workflows/needs-reply.yml"
else
  echo "File not found at .github/workflows/needs-reply.yml"
  echo "Searching for similar filenames..."
  find . -name "*needs-reply*" -type f 2>/dev/null
fi

Repository: Cap-go/capacitor-plus

Length of output: 808


🏁 Script executed:

#!/bin/bash
# Search for all action references in workflows to see the full scope
echo "=== All action references in workflows ==="
rg -n 'uses:' '.github/workflows/' --type yaml

Repository: Cap-go/capacitor-plus

Length of output: 3268


🌐 Web query:

imhoffd/needs-reply v2 commit sha github action

💡 Result:

The GitHub Action imhoffd/needs-reply@v2 refers to version tag v2 (specifically v2.0.0, released 2020-12-30). No specific commit SHA is pinned; it resolves to the commit tagged v2.0.0. The repository's default branch (main) latest commit is from 2024-09-25, but @v2 uses the tag, not main. To use a specific commit SHA instead of the tag, specify it explicitly like imhoffd/needs-reply@ (e.g., the SHA of the latest main commit if desired for updates post-v2.0.0).

Citations:


Pin third-party action to a full commit SHA.

Line 12 references a mutable tag (@v2). For workflow supply-chain safety, pin to an immutable commit SHA.

🔒 Proposed hardening
-        uses: imhoffd/needs-reply@v2
+        uses: imhoffd/needs-reply@<full-length-commit-sha> # maps to v2
🤖 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
reference "uses: imhoffd/needs-reply@v2" with a pinned immutable commit SHA for
supply-chain safety: locate the "uses: imhoffd/needs-reply@v2" entry in the
workflow and change it to use the full commit SHA form (e.g.,
@<full-commit-sha>) by selecting a specific commit from the imhoffd/needs-reply
repository and pasting its commit SHA; ensure you update any relevant workflow
comment to document which commit was chosen and why.

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

Don't hard-code the publish checkout to main.

With workflow_dispatch or workflow_call, this will publish whatever is on main rather than the ref that invoked the workflow. That makes the release artifact drift from the reviewed branch/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 checkout step
currently pins the ref to 'main' which causes the workflow to always publish
from main; update the actions/checkout@v5 invocation (the step with "uses:
actions/checkout@v5" and the "ref:" field) to use the triggering ref instead
(for example use the workflow context like github.ref or github.sha, or remove
the explicit ref so checkout defaults to the event ref) so the publish uses the
branch/tag/commit that invoked the workflow rather than main.

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 extracted boundaries.

At Line 345, boundary= or boundary="" currently returns an empty string, which callers treat as valid and then emit invalid multipart delimiters. Treat blank boundaries as missing.

Proposed fix
 public static String extractBoundaryFromContentType(String contentType) {
+    if (contentType == null || contentType.isEmpty()) {
+        return null;
+    }
+
     String boundaryPrefix = "boundary=";
     int boundaryIndex = contentType.indexOf(boundaryPrefix);
     if (boundaryIndex == -1) {
         return null;
     }
@@
     boundary = boundary.trim();
     if (boundary.startsWith("\"") && boundary.endsWith("\"")) {
         boundary = boundary.substring(1, boundary.length() - 1);
     }
-
-    return boundary;
+    boundary = boundary.trim();
+    return boundary.isEmpty() ? null : boundary;
 }
📝 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
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;
}
public static String extractBoundaryFromContentType(String contentType) {
if (contentType == null || contentType.isEmpty()) {
return null;
}
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);
}
boundary = boundary.trim();
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 method currently
returns an empty string for inputs like "boundary=" or "boundary=\"\"" which
callers treat as valid; modify extractBoundaryFromContentType to treat
blank/empty boundaries as missing by returning null when the computed boundary
is empty after trimming and after stripping surrounding quotes. Locate the
method extractBoundaryFromContentType and, after trimming and after removing
quotes (the logic around boundary.trim() and the startsWith/endsWith block), add
a check that if boundary.length() == 0 return null so callers receive null for
missing boundaries.

Comment on lines +131 to 142
/**
* @deprecated This method may return incorrect headers in concurrent range requests.
* <p>
* Use {@link #buildDefaultResponseHeaders()} instead, which returns a copy of the map.
* </p>
* This method will be removed in a future major version of Capacitor.
* </p>
*/
@Deprecated(forRemoval = true) // adjust version as appropriate
public Map<String, String> getResponseHeaders() {
return responseHeaders;
}
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

Malformed Javadoc and missing since attribute in deprecation.

The Javadoc has an orphaned </p> tag on line 137. Also, the @Deprecated annotation should include the since attribute to indicate when the method was deprecated.

Proposed fix
         /**
          * `@deprecated` This method may return incorrect headers in concurrent range requests.
          * <p>
          * Use {`@link` `#buildDefaultResponseHeaders`()} instead, which returns a copy of the map.
-         * </p>
          * This method will be removed in a future major version of Capacitor.
-         * </p>
+         * </p>
          */
-        `@Deprecated`(forRemoval = true) // adjust version as appropriate
+        `@Deprecated`(since = "8.0.0", forRemoval = true)
         public Map<String, String> getResponseHeaders() {
📝 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
/**
* @deprecated This method may return incorrect headers in concurrent range requests.
* <p>
* Use {@link #buildDefaultResponseHeaders()} instead, which returns a copy of the map.
* </p>
* This method will be removed in a future major version of Capacitor.
* </p>
*/
@Deprecated(forRemoval = true) // adjust version as appropriate
public Map<String, String> getResponseHeaders() {
return responseHeaders;
}
/**
* `@deprecated` This method may return incorrect headers in concurrent range requests.
* <p>
* Use {`@link` `#buildDefaultResponseHeaders`()} instead, which returns a copy of the map.
* This method will be removed in a future major version of Capacitor.
* </p>
*/
`@Deprecated`(since = "8.0.0", forRemoval = true)
public Map<String, String> getResponseHeaders() {
return responseHeaders;
}
🤖 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 131 - 142, Fix the malformed Javadoc and add a deprecation "since"
value for the method: in class WebViewLocalServer update the Javadoc for
getResponseHeaders() to remove the orphaned "</p>" tag and use a proper
`@deprecated` Javadoc tag that references buildDefaultResponseHeaders(), then
update the annotation to `@Deprecated`(since = "4.6.0", forRemoval = true)
(replace "4.6.0" with the actual deprecation version if different) so the
annotation includes the since attribute and forRemoval flag; ensure
getResponseHeaders() still returns responseHeaders but the docs clearly point
callers to buildDefaultResponseHeaders().

Comment thread android/package.json
Comment on lines +2 to +14
<<<<<<< HEAD
"name": "@capacitor-plus/android",
"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/android",
"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

Resolve the package manifest conflict first.

This file is not valid JSON while the conflict markers remain, and CI is already failing npm install with EJSONPARSE because of it.

Also applies to: 34-39

🧰 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 `@android/package.json` around lines 2 - 14, The package.json contains
unresolved Git conflict markers (e.g., <<<<<<< HEAD, =======, >>>>>>>
upstream/main) around the manifest fields "name", "version", "description",
"homepage", and "author", which makes the file invalid JSON and breaks npm
install; fix it by removing the conflict markers and producing a single valid
JSON object for those fields (choose the intended values or reconcile them),
validate the JSON (e.g., with a JSON linter), and repeat the same resolution for
the other conflict block mentioned (lines with similar markers around fields at
34-39).

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

Treat empty parsed boundaries as missing.

Line 104 can return an empty boundary (boundary= / boundary=""), which then gets used as a delimiter and produces malformed multipart payloads. Return nil when the normalized boundary is empty.

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]
         }
-        
+
+        var boundaryString = String(boundary).trimmingCharacters(in: .whitespacesAndNewlines)
+
-        if boundary.hasPrefix("\"") && boundary.hasSuffix("\"") {
-            return String(boundary.dropFirst().dropLast())
+        if boundaryString.hasPrefix("\"") && boundaryString.hasSuffix("\"") {
+            boundaryString = String(boundaryString.dropFirst().dropLast()).trimmingCharacters(in: .whitespacesAndNewlines)
+        }
+
+        if boundaryString.isEmpty {
+            return nil
         } else {
-            return String(boundary)
+            return boundaryString
         }
     }
     
     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 can return an empty string for inputs
like "boundary=" or 'boundary=""'; update the logic in extractBoundary(from
contentType: String) to treat a normalized boundary of "" as missing by
returning nil after trimming surrounding quotes and semicolons. Specifically,
after computing the final boundary string (the variable boundary) and unquoting
it, check if it's empty and return nil if so; otherwise return the non-empty
String(boundary). This ensures callers never receive an empty delimiter.

Comment thread ios/CHANGELOG.md
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.

<<<<<<< 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.

⚠️ Potential issue | 🟠 Major

Resolve the changelog conflict instead of committing both sides.

This file still has merge markers and two divergent release histories. Please pick the final changelog contents and delete the conflict block before merging.

Also applies to: 198-198, 231-231

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

In `@ios/CHANGELOG.md` at line 6, The CHANGELOG.md contains unresolved Git merge
markers (e.g., the "<<<<<<< HEAD" block) and duplicate release entries; open
ios/CHANGELOG.md, remove the merge markers and the unwanted side of the
conflict, choose and keep the correct final release text (consolidate entries if
needed), and save the file without any "<<<<<<<", "=======", or ">>>>>>>"
markers; repeat the same cleanup for the other conflict locations referenced
(around the other indicated sections).

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 manifest still has unresolved merge markers.

Until these conflict blocks are collapsed to a single valid JSON object, package installation and any manifest-driven tooling will keep failing.

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
git conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) causing
invalid JSON; open package.json, remove the conflict markers and merge the two
variants into one coherent JSON object for the top-level fields (name, version,
description, homepage, author), choose the correct values (or combine/restore
intended ones), ensure proper commas/quotes so the file is valid JSON, and then
validate the file with a JSON linter or npm install to confirm the manifest is
fixed.

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

Resolve the merge conflict markers before merging.

lerna.json is invalid JSON in its current state, so any Lerna/versioning step that reads it will fail until this block is reduced to a single version value.

🧰 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, There are unresolved git conflict markers
in lerna.json around the "version" key; remove the conflict markers (<<<<<<<
HEAD, =======, >>>>>>>) and leave a single valid JSON entry for "version" (pick
the intended value, e.g., "8.3.1" from upstream/main) so the file is valid JSON
and tooling that reads "version" can parse it.

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 the leftover merge conflict in devDependencies.

Lines 35-55 still contain Git conflict markers, so package.json is invalid JSON and npm install is already failing with EJSONPARSE. Please resolve this block before merge. Also keep it consistent with the rest of the file: Line 22 still invokes prettier-pretty-check, so dropping that package here would break the prettier script unless you update the script in the same change.

🧰 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 Git conflict markers inside
package.json's devDependencies by removing the <<<<<<<, =======, >>>>>>> lines
and merging the intended entries into a single valid JSON object; ensure the
final devDependencies include a consistent set (pick the correct versions for
"@types/node", "eslint", "tar", etc.) and preserve "prettier-pretty-check" if
the project's scripts (check the "prettier" script) still reference it—if you
choose to drop "prettier-pretty-check", also update the corresponding script to
avoid a missing dependency; finally validate the file parses as JSON (no
trailing commas) before committing.

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.