Skip to content

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

Open
riderx wants to merge 46 commits intoplusfrom
sync/plus-upstream-20260423-054556
Open

chore: sync plus with upstream main (conflicts)#54
riderx wants to merge 46 commits intoplusfrom
sync/plus-upstream-20260423-054556

Conversation

@riderx
Copy link
Copy Markdown
Member

@riderx riderx commented Apr 23, 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

Release Notes

  • New Features

    • Added Swift Package Manager configuration support for iOS with experimental swiftToolsVersion and packageTraits options.
    • Extended native bridge fetch handling to support URL objects.
  • Bug Fixes

    • Fixed potential null pointer exceptions in Android lifecycle handling.
    • Improved Android multipart form data boundary parsing.
    • Fixed iOS System Bars safe-area inset calculations and IME visibility handling.
    • Enhanced concurrent request header safety in Android local server responses.
  • API Updates

    • Made SystemBarsPlugin show/hide options parameters optional.
  • Improvements

    • Increased GitHub Actions workflow timeouts for improved reliability.

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 23, 2026

📝 Walkthrough

Walkthrough

A monorepo-wide synchronization with upstream introduces version 8.3.1 across multiple packages, adds iOS SPM support infrastructure, refactors iOS package manager detection, and includes unresolved Git merge conflicts in package metadata and changelog files requiring manual reconciliation.

Changes

Cohort / File(s) Summary
GitHub Actions Workflows
.github/workflows/needs-reply.yml, .github/workflows/publish-ios.yml, .github/workflows/test.yml
New daily workflow to auto-close stale needs reply issues after 7 days; new iOS Cocoapods publish workflow; extended job timeouts (30→60 min) and added iOS platform download steps to prevent simulator failures.
GitHub Issue Templates & Bot Config
.github/ISSUE_TEMPLATE/config.yml, .github/ISSUE_TEMPLATE/feature-request.yml, .github/ionic-issue-bot.yml
Added feature-request link in config; removed feature-request template entirely; shortened needs reproduction closure window from 15 to 7 days.
Merge Conflicts in Package Metadata
lerna.json, package.json, core/package.json, cli/package.json, android/package.json, ios/package.json
Unresolved conflicts shifting package identity from @capacitor-plus/* (8.0.8) to @capacitor/* (8.3.1) with updated author/homepage; dependency constraint adjustments.
Merge Conflicts in Changelogs
CHANGELOG.md, cli/CHANGELOG.md, core/CHANGELOG.md, android/CHANGELOG.md, ios/CHANGELOG.md
Git conflict markers embedding upstream version history (8.3.1–8.0.1) alongside local 8.0.8 entries; manual reconciliation required.
Android Native Bridge
android/capacitor/src/main/assets/native-bridge.js, core/native-bridge.ts, ios/Capacitor/Capacitor/assets/native-bridge.js
Extended fetch interceptor to recognize URL objects in addition to strings, applying proxy transformation for both Android and iOS.
Android Core Classes
android/capacitor/src/main/java/com/getcapacitor/Bridge.java, android/capacitor/src/main/java/com/getcapacitor/BridgeActivity.java
Fixed isNewBinary() null handling; refactored initWebView() to derive URLs from parsed config components; added null-safety guards around lifecycle callbacks.
Android WebView & HTTP
android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java, android/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.java
New buildDefaultResponseHeaders() method to prevent concurrent range-request corruption; deprecated getResponseHeaders(); refactored multipart form-data boundary extraction with dedicated parser.
Android SystemBars Plugin
android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java
Major refactoring: state persistence for bar styles, reworked safe-area CSS injection, IME-aware inset handling, decor-view background color updates, and margin-based inset removal.
iOS Native Types & Protocol
ios/Capacitor/Capacitor/CAPBridgeProtocol.swift, ios/Capacitor/Capacitor/CAPBridgedJSTypes.h, ios/Capacitor/Capacitor/CAPBridgedJSTypes.m
Deprecated presentVC/dismissVC protocol methods; added bridged-JS getArray:defaultValue: accessor.
iOS Bridge Implementation
ios/Capacitor/Capacitor/CapacitorBridge.swift
Removed tmpWindow path and tmpVCAppeared notification (both deprecated); simplified presentation/dismissal to use main bridged view controller.
iOS URL Request
ios/Capacitor/Capacitor/Plugins/CapacitorUrlRequest.swift
Refined multipart boundary extraction with dedicated extractBoundary(from:) helper; improved parsing reliability.
Core Plugin Declarations & Docs
core/src/core-plugins.ts, core/system-bars.md
Made SystemBarsPlugin.show/hide options parameters optional; updated insetsHandling.disable docs to clarify CSS-only scope; optional cookie expires generation.
CLI Config & Package Manager Detection
cli/src/config.ts, cli/src/ios/common.ts, cli/src/ios/build.ts, cli/src/ios/open.ts, cli/src/ios/run.ts
Introduced determinePackageManager() helper and config.ios.packageManager Promise; refactored iOS build/open/run to read cached package manager instead of re-checking; new getCommonChecks() builder for reusable check lists.
CLI Declarations & Definitions
cli/src/declarations.ts, cli/src/definitions.ts
Added experimental.ios.spm config namespace (Swift tools version, package traits); new Writable<T> and PackageManager types; IOSConfig.packageManager promise field.
CLI Migration & Update Tasks
cli/src/tasks/migrate-spm.ts, cli/src/tasks/migrate.ts, cli/src/tasks/update.ts
Refactored to use config.ios.packageManager instead of runtime checks; new async addUpdateChecks() helper for platform-specific checks; SPM assignment via writable-cast config mutation.
CLI SPM & Template Utilities
cli/src/util/spm.ts, cli/src/util/template.ts, scripts/pack-cli-assets.mjs
Parameterized Swift tools version and per-plugin traits from config; added checkSwiftToolsVersion and checkPackageTraitsRequirements validators; refactored tar imports to use named extract/create exports.
CLI Commands & Live Reload
cli/src/index.ts, cli/src/tasks/run.ts, cli/src/tasks/add.ts, cli/src/tasks/sync.ts, cli/src/util/livereload.ts
Added --https flag to run command; conditional port handling for HTTPS; integrated package-manager detection into add flow; async check-list builders for sync/add; dynamic URL scheme in live-reload config.
CLI Source Maps
cli/src/tasks/sourcemaps.ts
Extended source-map inlining to cover *.css in addition to *.js files.
iOS Package Metadata
ios/package.json
Version/scope shift (8.0.8→8.3.1); updated peer dependencies; changed simulator target from iPhone 16 to iPhone 17.
iOS Template Documentation
ios-spm-template/App/CapApp-SPM/README.md
Minor wording adjustment in description.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related issues


🐰 A rabbit hops through upstream streams,
Merging code and fixing dreams,
SystemBars now handle IME,
SPM packages run so free,
With packageManager state cached bright—
Eight point three point one takes flight! 🚀

🚥 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 clearly summarizes the main objective: syncing the Capacitor+ fork with upstream main, and explicitly acknowledges the presence of merge conflicts.
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-20260423-054556

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: 2779eb3597

ℹ️ 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 JSON manifests

This commit leaves unresolved conflict markers in package.json, which makes the root manifest invalid JSON and prevents package managers/CI tooling from parsing the workspace at all. I also confirmed the same marker pattern in android/package.json, cli/package.json, ios/package.json, and lerna.json, so installs and release/version commands will fail until these conflicts are fully resolved.

Useful? React with 👍 / 👎.

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

Choose a reason for hiding this comment

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

P0 Badge Remove unresolved conflict block in SPM utility

The generatePackageText implementation still contains merge-conflict markers, which makes this TypeScript module syntactically invalid and blocks CLI compilation. In this state, iOS-related CLI flows that import this utility cannot run, so the sync/update pipeline is effectively broken.

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

Caution

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

⚠️ Outside diff range comments (8)
android/capacitor/src/main/java/com/getcapacitor/Bridge.java (1)

627-632: ⚠️ Potential issue | 🟠 Major

Preserve full configured server.url in localUrl

At Line 631, rebuilding localUrl with only protocol + authority drops path/query/fragment from server.url. That can break non-root server deployments and cookie scoping, since server.url is read as-is in android/capacitor/src/main/java/com/getcapacitor/CapConfig.java (Lines 244-250) and getLocalUrl() is consumed in android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorCookieManager.java (Lines 44-48).

Proposed fix
         if (appUrlConfig != null) {
             try {
                 URL appUrlObject = new URL(appUrlConfig);
                 authorities.add(appUrlObject.getAuthority());
-                localUrl = appUrlObject.getProtocol() + "://" + appUrlObject.getAuthority();
+                localUrl = appUrlConfig;
             } catch (Exception ex) {
                 Logger.error("Provided server url is invalid: " + ex.getMessage());
                 return;
             }
             appUrl = appUrlConfig;
🤖 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/Bridge.java` around lines
627 - 632, The code reconstructs localUrl as protocol + "://" + authority which
strips path/query/fragment from the configured server.url; instead preserve the
full configured value by assigning localUrl to the original appUrlConfig (or the
full URL string from the URL object) so that server paths and cookie scoping
remain intact; update the block that handles appUrlConfig (references: variable
appUrlConfig, localUrl, URL appUrlObject) to add authorities using
appUrlObject.getAuthority() but set localUrl to the full URL string, and ensure
getLocalUrl() and CapConfig behavior remain compatible.
android/CHANGELOG.md (1)

6-260: ⚠️ Potential issue | 🔴 Critical

Unresolved merge conflict artifacts remain in changelog

Conflict markers are still present (Line 6 through Line 260). This is a hard blocker for merging and release hygiene.

Based on learnings: "Applies to 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 `@android/CHANGELOG.md` around lines 6 - 260, The CHANGELOG.md contains
unresolved Git conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main)
mixed with duplicate release sections (e.g., headings like "## [8.0.8]" and "##
[8.3.1]"); fix by removing the merge conflict markers and restoring the file to
the canonical generated state — do not hand-edit the changelog: either abort the
merge and re-run the repository's changelog generation/release CI or checkout
the upstream/generated CHANGELOG.md and re-apply only intended changes, ensuring
no conflict markers remain.
ios/CHANGELOG.md (1)

6-231: ⚠️ Potential issue | 🔴 Critical

File contains unresolved Git conflict markers

ios/CHANGELOG.md still includes conflict delimiters in the top release block (Line 6 to Line 231). This must be resolved before merge.

Based on learnings: "Applies to 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 `@ios/CHANGELOG.md` around lines 6 - 231, Unresolved Git conflict markers
(<<<<<<<, =======, >>>>>>>) remain in ios/CHANGELOG.md; remove them and restore
the automatically generated changelog content managed by CI. Open
ios/CHANGELOG.md, locate the conflict block surrounding the top release entries
(markers <<<<<<< HEAD, =======, >>>>>>> upstream/main), and resolve by
discarding the manual edits and keeping the intended CI-generated section (or by
checking out the upstream/main version) so the file contains only the valid
changelog content without conflict delimiters; do not manually edit CHANGELOG.md
going forward.
core/CHANGELOG.md (1)

6-163: ⚠️ Potential issue | 🔴 Critical

Resolve unresolved merge conflict markers before merge

The file still contains <<<<<<<, =======, and >>>>>>> (Line 6 through Line 163), which leaves the changelog invalid and blocks a safe release merge.

Suggested conflict cleanup pattern
-<<<<<<< HEAD
-...local section...
-=======
-...upstream section...
->>>>>>> upstream/main
+...single resolved changelog stream (regenerated by CI/release tooling)...

Based on learnings: "Applies to 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 `@core/CHANGELOG.md` around lines 6 - 163, The changelog contains unresolved
Git conflict markers (<<<<<<<, =======, >>>>>>>) mixing two release blocks
(e.g., the local ## [8.0.8] block and the upstream ## [8.3.1]/## [8.3.0] block);
resolve the conflict by removing the markers and keeping the correct, single
changelog content (choose the intended release block — likely the upstream/main
section with ## [8.3.1] etc. — or merge the entries cleanly), ensure only one
coherent sequence of version headings remains, and do not reintroduce manual
edits to CHANGELOG.md (CI/CD manages it).
cli/src/ios/update.ts (1)

54-59: ⚠️ Potential issue | 🟠 Major

Await the per-plugin Package.swift writes before generating the aggregate package file.

The new SPM branch relies on await generateCordovaPackageFiles(...), but that helper currently fires async writeFile() calls via .map() without awaiting them. That makes the SPM update flow racey and can hide write failures while Line 59 continues building the top-level package.

Suggested fix
 async function generateCordovaPackageFiles(cordovaPlugins: Plugin[], config: Config) {
-  cordovaPlugins.map((plugin: any) => {
-    generateCordovaPackageFile(plugin, config);
-  });
+  await Promise.all(cordovaPlugins.map((plugin) => generateCordovaPackageFile(plugin, config)));
 }

Based on learnings, Always support both CocoaPods and Swift Package Manager (SPM) for iOS; maintain valid *.podspec and Package.swift files.

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

In `@cli/src/ios/update.ts` around lines 54 - 59, generateCordovaPackageFiles
currently fires per-plugin writeFile calls without awaiting them, causing a race
when the SPM branch continues to generatePackageFile; update
generateCordovaPackageFiles (and any helper that uses .map to start async
writes) to await all file writes before returning—e.g., collect promises and
await Promise.all or use an async for..of to await each write—so that when
ios/update.ts calls await generateCordovaPackageFiles(cordovaPlugins, config)
all Package.swift files are fully written before checkPluginsForPackageSwift and
generatePackageFile run.
cli/src/util/spm.ts (1)

11-15: ⚠️ Potential issue | 🔴 Critical

Resolve the leftover merge-conflict markers before merging.

This block is still in a conflicted state, so the file does not parse and generatePackageText() cannot compile. It also leaves the helper choice unresolved (getMajorMinoriOSVersion vs getMajoriOSVersion).

Minimal cleanup to unblock the file
-import { getMajorMinoriOSVersion } from '../ios/common';
+import { getMajoriOSVersion } from '../ios/common';
...
-<<<<<<< HEAD
-  const iosVersion = getMajorMinoriOSVersion(config);
-=======
   const iosVersion = getMajoriOSVersion(config);
   const packageTraits = config.app.extConfig.experimental?.ios?.spm?.packageTraits ?? {};
   const swiftToolsVersion = config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion ?? '5.9';
->>>>>>> upstream/main

Also applies to: 100-106

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

In `@cli/src/util/spm.ts` around lines 11 - 15, The file contains leftover git
merge-conflict markers and an unresolved helper import choice—remove the
conflict markers and choose the correct helper name (either
getMajorMinoriOSVersion or getMajoriOSVersion) so imports and all usages match;
update the import statement and any calls to
getMajorMinoriOSVersion/getMajoriOSVersion in functions like generatePackageText
and elsewhere, ensuring you import the actual exported symbol from the ios
common module and that the file parses cleanly.
android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java (1)

280-319: ⚠️ Potential issue | 🟠 Major

Handle resource references correctly in getThemeColor().

The current implementation assumes android.R.attr.windowBackground resolves to an inline color, but resolveAttribute() can return resource references (drawables or color resources). In those cases, typedValue.data is invalid and will be 0, causing setBackgroundColor() at line 280 to apply an incorrect color after every setStyle() call.

Check typedValue.type or use isColorType() to distinguish between inline colors and resource references. For references, resolve the actual color using Resources.getColor() or ResourcesCompat.getColor() with typedValue.resourceId.

🤖 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 - 319, getThemeColor currently returns typedValue.data assuming
an inline color, which fails for resource references; update getThemeColor to
detect whether typedValue represents a color (check TypedValue.type or use
TypedValueUtils.isColorType) and if so return typedValue.data, otherwise resolve
the resourceId to an actual color (use
ResourcesCompat.getColor(context.getResources(), typedValue.resourceId,
context.getTheme()) or equivalent) and return that value so
setBackgroundColor(getThemeColor(...)) receives a valid color; ensure
getThemeColor handles both inline colors and referenced color resources.
cli/src/index.ts (1)

318-320: ⚠️ Potential issue | 🟠 Major

Reject invalid --packagemanager values instead of silently defaulting to SPM.

Line 31 of getPackageManager() only checks for the 'cocoapods' value; any other input silently defaults to 'SPM' at line 37. This means a typo like --packagemanager cocoapds will quietly generate incorrect iOS setup without warning. Use .choices(['cocoapods', 'spm']) and .argParser() on the option to validate at the CLI boundary.

Suggested fix
-    .option(
-      '--packagemanager <packageManager>',
-      'The package manager to use for dependency installs (CocoaPods or SPM)',
-    )
+    .addOption(
+      new Option(
+        '--packagemanager <packageManager>',
+        'The package manager to use for dependency installs (CocoaPods or SPM)',
+      )
+        .choices(['cocoapods', 'spm'])
+        .argParser((value) => value.toLowerCase()),
+    )
...
-          configWritable.ios.packageManager = getPackageManager(config, packagemanager?.toLowerCase());
+          configWritable.ios.packageManager = getPackageManager(config, packagemanager);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@cli/src/index.ts` around lines 318 - 320, The CLI currently silently defaults
unknown --packagemanager values to 'SPM' in getPackageManager; instead validate
at parse time and stop invalid inputs: update the option declaration for
'--packagemanager <packageManager>' to use .choices(['cocoapods','spm']) and an
.argParser() that normalizes to lowercase (e.g., value => value.toLowerCase())
so the parser rejects typos like "cocoapds"; then tighten getPackageManager to
only accept 'cocoapods' or 'spm' (or throw/return an explicit error) and remove
the silent fallback to 'SPM' so invalid values cannot quietly produce wrong iOS
setup.
🧹 Nitpick comments (4)
android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java (1)

342-343: Case-insensitive Range header handling is a reasonable fix.

The fallback from "Range" to "range" addresses the lowercase header issue mentioned in the PR objectives. HTTP headers are case-insensitive per RFC 7230, so handling both variants is correct.

Minor note: the current ternary performs two map lookups when "Range" exists. This is negligible for performance but could be slightly cleaner:

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

In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`
around lines 342 - 343, The current code fetches the Range header with
requestHeaders.get("Range") in a ternary which can perform two lookups; update
the logic in the block that obtains requestHeaders (use getRequestHeaders()) so
you fetch once, e.g. assign String rangeString = requestHeaders.get("Range"); if
(rangeString == null) rangeString = requestHeaders.get("range"); thereby
preserving case-insensitive handling while avoiding the double map lookup on
requestHeaders and keeping the same variables requestHeaders and rangeString.
ios/Capacitor/Capacitor/CapacitorBridge.swift (1)

96-99: Consider removing the now-dead observer registration for tmpVCAppeared.

The deprecation of tmpWindow and tmpVCAppeared is appropriate given the simplified presentVC/dismissVC implementation. However, the observer registered at lines 226-228 is now dead code:

observers.append(NotificationCenter.default.addObserver(forName: type(of: self).tmpVCAppeared.name, object: .none, queue: .none) { [weak self] _ in
    self?.tmpWindow = nil
})

Although the notification is still posted by TmpViewController, the observer callback serves no purpose since tmpWindow is never assigned a non-nil value anywhere in the codebase. The observer simply sets nil to nil, making this cleanup cycle unnecessary.

🤖 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, The
NotificationCenter observer that watches type(of: self).tmpVCAppeared and sets
self?.tmpWindow = nil is dead code because tmpWindow is never assigned; remove
the observer registration block (the addObserver call) and any now-unused
references to tmpVCAppeared/tmpWindow (or delete the deprecated tmpWindow and
tmpVCAppeared declarations if they are otherwise unused), and ensure
TmpViewController’s notification posting is either removed or left harmlessly
unused to keep presentVC/dismissVC behavior unchanged.
.github/workflows/test.yml (1)

111-111: Add retry logic around iOS platform download.

Line 111 is an external network call and can fail transiently; a small retry loop will reduce flaky CI failures.

♻️ Suggested hardening
-      - run: xcodebuild -downloadPlatform iOS
+      - run: |
+          for i in 1 2 3; do
+            xcodebuild -downloadPlatform iOS && exit 0
+            sleep $((i * 15))
+          done
+          exit 1
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/test.yml at line 111, The CI step that runs the external
call "xcodebuild -downloadPlatform iOS" can fail transiently; update the GitHub
Actions step that currently contains that run command to wrap it in a retry loop
(e.g., attempt up to N times with a short pause/backoff between attempts) and
only exit non‑zero after all attempts fail so transient network errors won't
flake the job; change the run entry that invokes "xcodebuild -downloadPlatform
iOS" to execute a small shell retry loop (respecting exit codes) and log each
attempt and final failure.
android/CHANGELOG.md (1)

223-242: Normalize heading hierarchy to satisfy markdownlint

The inserted section includes heading jumps flagged by MD001 (around Line 225, Line 233, Line 242). Please regenerate/fix the section so heading levels increment consistently.

Based on learnings: "Applies to 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 `@android/CHANGELOG.md` around lines 223 - 242, The CHANGELOG.md release block
has inconsistent heading levels (e.g. "# [8.3.0]" used alongside "### Bug
Fixes"), triggering markdownlint MD001; restore a consistent hierarchy by making
release titles level 2 ("## [8.3.0]") and keeping section headers as level 3
("### Bug Fixes") for the blocks that include "## [8.3.0]", "## [8.2.0]" and "##
[8.1.0]" (or regenerate the file instead of manual edits) — do not hand-edit
CHANGELOG.md, re-run the repository's changelog generation/release job so the
headings for the symbols "# [8.3.0]", "# [8.2.0]" and "# [8.1.0]" are produced
as "##" and their sections remain "###".
🤖 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/publish-ios.yml:
- Around line 21-24: The workflow currently hardcodes the checked-out ref by
setting ref: 'main' in the actions/checkout@v5 step which can cause publishing
the wrong artifact; update the checkout step to use the triggering ref instead
(either remove the ref line to use the default current ref or replace it with
ref: ${{ github.ref }} or, for PRs, use ${{ github.head_ref }}) so the job
publishes artifacts from the branch/commit that triggered the workflow.

In
`@android/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.java`:
- Around line 228-235: The boundary handling has two bugs:
extractBoundaryFromContentType can return an empty string and the
quote-stripping logic can throw for a single-quote string; update the logic
around the boundary variable (as used in extractBoundaryFromContentType and the
code that sets connection.setRequestProperty) to treat both null and empty/blank
values as "missing" (i.e., if boundary == null || boundary.trim().isEmpty() then
generate UUID fallback and set Content-Type), and in the quote-stripping step
ensure you only strip surrounding quotes when boundary.length() >= 2 and
boundary.startsWith("\"") && boundary.endsWith("\"") so you avoid substring(1,
length-1) on too-short strings; after stripping re-check for empty and perform
the same UUID fallback and header set if needed.

In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`:
- Around line 131-146: Fix the malformed Javadoc and complete the deprecation
metadata for getResponseHeaders(): remove the extra closing </p> tag so the
Javadoc tags balance, add an `@since` tag (e.g., `@since` 5.0.0 or the appropriate
version) to the Javadoc block for getResponseHeaders(), and replace the inline
comment on the `@Deprecated` annotation ("// adjust version as appropriate") with
the actual version or remove it so the deprecation is documented consistently;
keep buildDefaultResponseHeaders() as the recommended alternative in the Javadoc
text.

In `@android/package.json`:
- Around line 2-14: Remove the Git conflict markers (<<<<<<<, =======, >>>>>>>)
and resolve the package identity block by keeping your fork branding fields
("name": "@capacitor-plus/android", "description": "Capacitor+: Enhanced
Capacitor with automated upstream sync - Cross-platform apps with JavaScript and
the web", "homepage", "author") but update the "version" to the upstream bump
(use 8.3.1); likewise resolve the peerDependencies conflict by keeping the
fork's package names/constraints where applicable but adopting compatible
version ranges from upstream—edit the "name", "version", "description",
"homepage", "author", and "peerDependencies" entries in package.json to produce
a valid JSON object with no conflict markers.

In `@CHANGELOG.md`:
- Line 6: The CHANGELOG.md contains unresolved merge markers (e.g., <<<<<<<
HEAD) and must not be edited manually; revert the manual conflict resolution in
CHANGELOG.md and restore the file to the repository state expected by the
release automation (undo local edits or reset the file to the upstream/main
version), leaving no merge markers or hand-edited content so CI/CD can
regenerate/manage the changelog.

In `@cli/CHANGELOG.md`:
- Line 6: Remove all Git merge conflict markers (e.g., '<<<<<<< HEAD',
'=======', '>>>>>>> upstream/main') from the CHANGELOG.md, reconcile the
conflicting sections by merging the intended content for both the Capacitor+
fork history and upstream changes into a single coherent changelog entry, and
ensure you preserve important lines referenced around the other marker
occurrences (lines with the same markers around 234-286) so the CI/CD
autogenerated CHANGELOG remains valid and parseable.

In `@cli/package.json`:
- Around line 2-14: Remove the Git conflict markers (<<<<<<<, =======, >>>>>>>)
in package.json and resolve the package identity block by keeping the fork
branding fields ("name", "version", "description", "homepage", "author") merged
into a single JSON object (use the fork values but update "version" to the newer
release number), ensuring valid JSON syntax and no duplicate keys; locate the
conflicting fields in the top-level package.json (the "name", "version",
"description", "homepage", and "author" entries) and replace the entire conflict
region with the final chosen values so the file parses cleanly.

In `@cli/src/ios/update.ts`:
- Around line 139-142: The branch currently checks isInstalled('pod') but then
runs runCommand(podPath, ...) which mismatches the check and skips using a
configured CocoaPods binary (config.ios.podPath / podPath); change the condition
to check the actual configured executable by calling isInstalled(podPath) or
resolving config.ios.podPath first so the if uses the same identifier you pass
to runCommand (podPath/config.ios.podPath), ensuring pod install runs when the
configured binary is valid; update the isInstalled call that references 'pod' to
reference podPath (or config.ios.podPath) and keep runCommand(podPath, ...)
as-is.

In `@cli/src/tasks/run.ts`:
- Around line 113-115: The user-facing live-reload status message has a typo
("listing for") in the logger.info call; change the string passed to logger.info
in the run task so it reads "listening on" instead of "listing for" and keep the
existing interpolation of options.https, options.host and options.port (i.e.,
update the message in the logger.info invocation that composes the URL).

In `@cli/src/util/spm.ts`:
- Around line 167-179: The deintegrate step uses config.ios.packageManager
(lazily determined by determinePackageManager()) which currently sees the newly
created CapApp-SPM directory and returns 'SPM', skipping Bundler; update the
flow so runCocoapodsDeintegrate() reliably knows whether to use Bundler by one
of two fixes: (A) change migrateToSPM()/extractSPMPackageDirectory() call order
so you detect Bundler/Gemfile via determinePackageManager() before creating
CapApp-SPM, or (B) add an explicit boolean parameter to
runCocoapodsDeintegrate(useBundler: boolean) (and callers such as
migrateToSPM()) and compute the bundler presence directly (e.g., checking for
Gemfile or Bundler) before creating CapApp-SPM, then use that parameter instead
of reading config.ios.packageManager inside runCocoapodsDeintegrate(); update
references to runCocoapodsDeintegrate, determinePackageManager, migrateToSPM,
and extractSPMPackageDirectory accordingly.

In `@core/package.json`:
- Around line 2-14: Remove the leftover Git conflict markers and resolve the
package identity fields by keeping the fork branding but updating the version to
the upstream version: set "name" to "@capacitor-plus/core", "version" to
"8.3.1", and preserve the fork's "description", "homepage", and "author" values
(i.e. the Capacitor+ description, homepage, and Capgo Team author). Ensure there
are no <<<<<<<, =======, or >>>>>>> markers left in package.json so JSON parses
cleanly.

In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m`:
- Line 32: The method implementation for getArray:defaultValue: in
CAPBridgedJSTypes.m has an extra semicolon before the opening brace which is
invalid Objective-C; remove the stray semicolon so the method signature reads as
a normal implementation (no trailing semicolon) and the compiler can parse the
opening { for the method body.

In `@ios/Capacitor/Capacitor/Plugins/CapacitorUrlRequest.swift`:
- Around line 94-109: extractBoundary(from:) can return an empty string (e.g.
"boundary=") which is then treated as a valid boundary when building multipart
delimiters; fix extractBoundary(from:) to trim whitespace, strip optional
surrounding quotes, and return nil if the resulting boundary is empty, and
update places that use its return value when constructing multipart delimiters
to check for nil before using (i.e., treat an empty boundary as missing and
avoid creating malformed delimiters).

In `@ios/CHANGELOG.md`:
- Around line 199-220: The changelog contains heading-level jumps (a top-level
"#" followed by "## [8.3.1]" then "### Bug Fixes") which triggers markdownlint
MD001; do not manually edit CHANGELOG.md—revert these manual changes and
regenerate the changelog using the repository's release/changelog generation
tooling so headings are produced consistently (ensure entries like "## [8.3.1]"
and its child "### Bug Fixes" follow the normal heading hierarchy and that no
manual top-level "#" headings were introduced).

In `@ios/package.json`:
- Around line 2-14: The package.json contains unresolved Git conflict markers in
the package identity fields (name, version, description, homepage, author) and
in the peerDependencies block causing EJSONPARSE; open ios/package.json, remove
the conflict markers and choose the fork-safe values: set "name" to
"@capacitor-plus/ios", update "version" to "8.3.1", reconcile "description",
"homepage", and "author" to Capgo branding, and then resolve the
peerDependencies section by either keeping both "@capacitor-plus/core" and
"@capacitor/core" if you need dual compatibility or consolidating to the desired
single dependency; ensure the resulting JSON is valid (no <<<<<<<, =======,
>>>>>>>) and run npm install to verify.

In `@lerna.json`:
- Around line 16-20: The lerna.json contains unresolved git merge conflict
markers around the "version" key (the lines starting with <<<<<<<, =======,
>>>>>>>) which makes the JSON invalid; open the file, remove the conflict
markers and collapse the block to a single "version" entry (choose the correct
value between "8.0.8" and "8.3.1") so the file contains only one "version":
"X.Y.Z" pair and valid JSON syntax.

In `@package.json`:
- Around line 35-55: package.json contains unresolved Git conflict markers
(<<<<<<<, =======, >>>>>>>) around dependency entries that break JSON parsing;
open package.json, remove the conflict markers, choose the intended versions for
the conflicting keys (e.g., decide which values to keep for "@types/node",
"eslint", "@types/tar" vs "prettier-pretty-check", and "tar"), ensure the
dependencies object is valid JSON (no duplicate keys, trailing commas) and
commit the resolved file so npm install/CI can parse it successfully.
- Around line 50-55: The merge removed the "prettier-pretty-check" dependency
from package.json causing the existing script that invokes prettier-pretty-check
(e.g., the "prettier" npm script) to break; restore "prettier-pretty-check":
"^0.2.0" into the dependencies/devDependencies alongside "tar": "^7.5.3" so the
script that calls prettier-pretty-check can run, ensuring the package name
matches what the "prettier" script expects.

---

Outside diff comments:
In `@android/capacitor/src/main/java/com/getcapacitor/Bridge.java`:
- Around line 627-632: The code reconstructs localUrl as protocol + "://" +
authority which strips path/query/fragment from the configured server.url;
instead preserve the full configured value by assigning localUrl to the original
appUrlConfig (or the full URL string from the URL object) so that server paths
and cookie scoping remain intact; update the block that handles appUrlConfig
(references: variable appUrlConfig, localUrl, URL appUrlObject) to add
authorities using appUrlObject.getAuthority() but set localUrl to the full URL
string, and ensure getLocalUrl() and CapConfig behavior remain compatible.

In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`:
- Around line 280-319: getThemeColor currently returns typedValue.data assuming
an inline color, which fails for resource references; update getThemeColor to
detect whether typedValue represents a color (check TypedValue.type or use
TypedValueUtils.isColorType) and if so return typedValue.data, otherwise resolve
the resourceId to an actual color (use
ResourcesCompat.getColor(context.getResources(), typedValue.resourceId,
context.getTheme()) or equivalent) and return that value so
setBackgroundColor(getThemeColor(...)) receives a valid color; ensure
getThemeColor handles both inline colors and referenced color resources.

In `@android/CHANGELOG.md`:
- Around line 6-260: The CHANGELOG.md contains unresolved Git conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) mixed with duplicate release
sections (e.g., headings like "## [8.0.8]" and "## [8.3.1]"); fix by removing
the merge conflict markers and restoring the file to the canonical generated
state — do not hand-edit the changelog: either abort the merge and re-run the
repository's changelog generation/release CI or checkout the upstream/generated
CHANGELOG.md and re-apply only intended changes, ensuring no conflict markers
remain.

In `@cli/src/index.ts`:
- Around line 318-320: The CLI currently silently defaults unknown
--packagemanager values to 'SPM' in getPackageManager; instead validate at parse
time and stop invalid inputs: update the option declaration for
'--packagemanager <packageManager>' to use .choices(['cocoapods','spm']) and an
.argParser() that normalizes to lowercase (e.g., value => value.toLowerCase())
so the parser rejects typos like "cocoapds"; then tighten getPackageManager to
only accept 'cocoapods' or 'spm' (or throw/return an explicit error) and remove
the silent fallback to 'SPM' so invalid values cannot quietly produce wrong iOS
setup.

In `@cli/src/ios/update.ts`:
- Around line 54-59: generateCordovaPackageFiles currently fires per-plugin
writeFile calls without awaiting them, causing a race when the SPM branch
continues to generatePackageFile; update generateCordovaPackageFiles (and any
helper that uses .map to start async writes) to await all file writes before
returning—e.g., collect promises and await Promise.all or use an async for..of
to await each write—so that when ios/update.ts calls await
generateCordovaPackageFiles(cordovaPlugins, config) all Package.swift files are
fully written before checkPluginsForPackageSwift and generatePackageFile run.

In `@cli/src/util/spm.ts`:
- Around line 11-15: The file contains leftover git merge-conflict markers and
an unresolved helper import choice—remove the conflict markers and choose the
correct helper name (either getMajorMinoriOSVersion or getMajoriOSVersion) so
imports and all usages match; update the import statement and any calls to
getMajorMinoriOSVersion/getMajoriOSVersion in functions like generatePackageText
and elsewhere, ensuring you import the actual exported symbol from the ios
common module and that the file parses cleanly.

In `@core/CHANGELOG.md`:
- Around line 6-163: The changelog contains unresolved Git conflict markers
(<<<<<<<, =======, >>>>>>>) mixing two release blocks (e.g., the local ##
[8.0.8] block and the upstream ## [8.3.1]/## [8.3.0] block); resolve the
conflict by removing the markers and keeping the correct, single changelog
content (choose the intended release block — likely the upstream/main section
with ## [8.3.1] etc. — or merge the entries cleanly), ensure only one coherent
sequence of version headings remains, and do not reintroduce manual edits to
CHANGELOG.md (CI/CD manages it).

In `@ios/CHANGELOG.md`:
- Around line 6-231: Unresolved Git conflict markers (<<<<<<<, =======, >>>>>>>)
remain in ios/CHANGELOG.md; remove them and restore the automatically generated
changelog content managed by CI. Open ios/CHANGELOG.md, locate the conflict
block surrounding the top release entries (markers <<<<<<< HEAD, =======,
>>>>>>> upstream/main), and resolve by discarding the manual edits and keeping
the intended CI-generated section (or by checking out the upstream/main version)
so the file contains only the valid changelog content without conflict
delimiters; do not manually edit CHANGELOG.md going forward.

---

Nitpick comments:
In @.github/workflows/test.yml:
- Line 111: The CI step that runs the external call "xcodebuild
-downloadPlatform iOS" can fail transiently; update the GitHub Actions step that
currently contains that run command to wrap it in a retry loop (e.g., attempt up
to N times with a short pause/backoff between attempts) and only exit non‑zero
after all attempts fail so transient network errors won't flake the job; change
the run entry that invokes "xcodebuild -downloadPlatform iOS" to execute a small
shell retry loop (respecting exit codes) and log each attempt and final failure.

In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`:
- Around line 342-343: The current code fetches the Range header with
requestHeaders.get("Range") in a ternary which can perform two lookups; update
the logic in the block that obtains requestHeaders (use getRequestHeaders()) so
you fetch once, e.g. assign String rangeString = requestHeaders.get("Range"); if
(rangeString == null) rangeString = requestHeaders.get("range"); thereby
preserving case-insensitive handling while avoiding the double map lookup on
requestHeaders and keeping the same variables requestHeaders and rangeString.

In `@android/CHANGELOG.md`:
- Around line 223-242: The CHANGELOG.md release block has inconsistent heading
levels (e.g. "# [8.3.0]" used alongside "### Bug Fixes"), triggering
markdownlint MD001; restore a consistent hierarchy by making release titles
level 2 ("## [8.3.0]") and keeping section headers as level 3 ("### Bug Fixes")
for the blocks that include "## [8.3.0]", "## [8.2.0]" and "## [8.1.0]" (or
regenerate the file instead of manual edits) — do not hand-edit CHANGELOG.md,
re-run the repository's changelog generation/release job so the headings for the
symbols "# [8.3.0]", "# [8.2.0]" and "# [8.1.0]" are produced as "##" and their
sections remain "###".

In `@ios/Capacitor/Capacitor/CapacitorBridge.swift`:
- Around line 96-99: The NotificationCenter observer that watches type(of:
self).tmpVCAppeared and sets self?.tmpWindow = nil is dead code because
tmpWindow is never assigned; remove the observer registration block (the
addObserver call) and any now-unused references to tmpVCAppeared/tmpWindow (or
delete the deprecated tmpWindow and tmpVCAppeared declarations if they are
otherwise unused), and ensure TmpViewController’s notification posting is either
removed or left harmlessly unused to keep presentVC/dismissVC behavior
unchanged.
🪄 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: cfcf7436-d71a-4f03-8b75-3e1278079094

📥 Commits

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

📒 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

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

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Avoid hardcoding publish source to main.

Line 24 forces publishing from main even when the workflow is triggered from another ref, which can publish the wrong artifact.

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

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

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

In @.github/workflows/publish-ios.yml around lines 21 - 24, The workflow
currently hardcodes the checked-out ref by setting ref: 'main' in the
actions/checkout@v5 step which can cause publishing the wrong artifact; update
the checkout step to use the triggering ref instead (either remove the ref line
to use the default current ref or replace it with ref: ${{ github.ref }} or, for
PRs, use ${{ github.head_ref }}) so the job publishes artifacts from the
branch/commit that triggered the workflow.

Comment on lines +228 to +235
String boundary = extractBoundaryFromContentType(contentType);
if (boundary == null) {
// If no boundary is provided, generate a random one and set the Content-Type header accordingly
// or otherwise servers will not be able to parse the request body. Browsers do this automatically
// but here we need to do this manually in order to comply with browser api behavior.
boundary = UUID.randomUUID().toString();
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + 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 | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="$(fd -p 'CapacitorHttpUrlConnection.java' | head -n1)"
echo "Reviewing: $FILE"
nl -ba "$FILE" | sed -n '220,360p'

python - <<'PY'
from pathlib import Path
import re

p = next(Path(".").rglob("CapacitorHttpUrlConnection.java"))
s = p.read_text()

findings = []

if 'if (boundary == null) {' in s and ('boundary.isEmpty()' not in s and 'boundary.isBlank()' not in s):
    findings.append("setRequestBody only checks null boundary, not empty boundary.")

quote_strip_pattern = re.compile(
    r'if\s*\(boundary\.startsWith\("\\""\)\s*&&\s*boundary\.endsWith\("\\""\)\)\s*\{\s*boundary\s*=\s*boundary\.substring\(1,\s*boundary\.length\(\)\s*-\s*1\);',
    re.S
)
if quote_strip_pattern.search(s):
    findings.append("extractBoundaryFromContentType strips quotes without an explicit length guard.")

print("\n".join(findings) if findings else "No matching risky patterns found.")
PY

Repository: Cap-go/capacitor-plus

Length of output: 228


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Find the file
FILE="$(fd -p 'CapacitorHttpUrlConnection.java' | head -n1)"
echo "Reviewing: $FILE"
echo "---"

# Read the file with line numbers using cat -n (alternatives to nl)
cat -n "$FILE" | sed -n '220,360p'

Repository: Cap-go/capacitor-plus

Length of output: 7528


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Python-based analysis of the exact patterns
python3 << 'PY'
from pathlib import Path
import re

# Find the file
file_path = next(Path(".").rglob("CapacitorHttpUrlConnection.java"), None)
if not file_path:
    print("ERROR: File not found")
    exit(1)

content = file_path.read_text()
lines = content.split('\n')

print(f"File: {file_path}")
print(f"Total lines: {len(lines)}")
print("\n=== FINDING 1: Boundary null check ===")
for i, line in enumerate(lines, 1):
    if 'if (boundary == null)' in line or 'if(boundary==null)' in line.replace(' ', ''):
        print(f"Line {i}: {line.strip()}")
        # Print surrounding context
        for j in range(max(0, i-3), min(len(lines), i+5)):
            print(f"  {j+1}: {lines[j]}")
        break

print("\n=== FINDING 2: Quote stripping logic ===")
for i, line in enumerate(lines, 1):
    if 'boundary.substring(1' in line and 'boundary.length()' in line:
        print(f"Line {i}: {line.strip()}")
        # Print surrounding context
        for j in range(max(0, i-5), min(len(lines), i+2)):
            print(f"  {j+1}: {lines[j]}")

print("\n=== METHOD: extractBoundaryFromContentType ===")
for i, line in enumerate(lines, 1):
    if 'extractBoundaryFromContentType' in line and 'public' in line:
        print(f"Method starts at line {i}")
        for j in range(i-1, min(len(lines), i+30)):
            print(f"  {j+1}: {lines[j]}")
        break

PY

Repository: Cap-go/capacitor-plus

Length of output: 2869


Add length guard to quote stripping and empty-string check for boundary fallback

Two issues with boundary parsing:

  1. Line 229: Only checks if (boundary == null) but extractBoundaryFromContentType can return an empty string (after trimming and quote removal), which would generate invalid multipart delimiters at line 285, 293, and 310.

  2. Line 341: The quote stripping logic lacks a length guard. A boundary of just " (one character) would pass both startsWith and endsWith checks, then call substring(1, 0), causing StringIndexOutOfBoundsException.

Suggested fixes
-            if (boundary == null) {
+            if (boundary == null || boundary.isEmpty()) {
                 // If no boundary is provided, generate a random one and set the Content-Type header accordingly
                 // or otherwise servers will not be able to parse the request body. Browsers do this automatically
                 // but here we need to do this manually in order to comply with browser api behavior.
                 boundary = UUID.randomUUID().toString();
                 connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
             }
         // Remove surrounding double quotes if present
         boundary = boundary.trim();
-        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;
📝 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
String boundary = extractBoundaryFromContentType(contentType);
if (boundary == null) {
// If no boundary is provided, generate a random one and set the Content-Type header accordingly
// or otherwise servers will not be able to parse the request body. Browsers do this automatically
// but here we need to do this manually in order to comply with browser api behavior.
boundary = UUID.randomUUID().toString();
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
}
String boundary = extractBoundaryFromContentType(contentType);
if (boundary == null || boundary.isEmpty()) {
// If no boundary is provided, generate a random one and set the Content-Type header accordingly
// or otherwise servers will not be able to parse the request body. Browsers do this automatically
// but here we need to do this manually in order to comply with browser api behavior.
boundary = UUID.randomUUID().toString();
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + 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 228 - 235, The boundary handling has two bugs:
extractBoundaryFromContentType can return an empty string and the
quote-stripping logic can throw for a single-quote string; update the logic
around the boundary variable (as used in extractBoundaryFromContentType and the
code that sets connection.setRequestProperty) to treat both null and empty/blank
values as "missing" (i.e., if boundary == null || boundary.trim().isEmpty() then
generate UUID fallback and set Content-Type), and in the quote-stripping step
ensure you only strip surrounding quotes when boundary.length() >= 2 and
boundary.startsWith("\"") && boundary.endsWith("\"") so you avoid substring(1,
length-1) on too-short strings; after stripping re-check for empty and perform
the same UUID fallback and header set if needed.

Comment on lines +131 to +146
/**
* @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;
}

public Map<String, String> buildDefaultResponseHeaders() {
return new HashMap<>(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

Good fix for concurrent request safety.

The defensive copy pattern via buildDefaultResponseHeaders() correctly addresses the race condition where multiple threads handling range requests could corrupt a shared headers map. The deprecation is appropriate.

Two minor issues:

  1. Malformed Javadoc HTML – Line 137 has an extra </p> without a matching opening tag.
  2. Incomplete TODO comment – Line 139's // adjust version as appropriate suggests unfinished work; consider adding the since attribute to document when deprecation started.
📝 Suggested Javadoc 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>
      */
-    `@Deprecated`(forRemoval = true) // adjust version as appropriate
+    `@Deprecated`(since = "8.3.1", forRemoval = true)
     public Map<String, String> getResponseHeaders() {
🤖 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 - 146, Fix the malformed Javadoc and complete the deprecation
metadata for getResponseHeaders(): remove the extra closing </p> tag so the
Javadoc tags balance, add an `@since` tag (e.g., `@since` 5.0.0 or the appropriate
version) to the Javadoc block for getResponseHeaders(), and replace the inline
comment on the `@Deprecated` annotation ("// adjust version as appropriate") with
the actual version or remove it so the deprecation is documented consistently;
keep buildDefaultResponseHeaders() as the recommended alternative in the Javadoc
text.

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 merge conflicts blocking CI pipeline.

This file has unresolved merge conflict markers causing EJSONPARSE errors. The conflicts follow the same pattern as ios/package.json:

  1. Lines 2-14: Package identity
  2. Lines 34-39: Peer dependencies
🔧 Suggested resolution (keeping fork branding with updated version)
 {
-<<<<<<< HEAD
   "name": "@capacitor-plus/android",
-  "version": "8.0.8",
+  "version": "8.3.1",
   "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
   "peerDependencies": {
-<<<<<<< HEAD
-    "@capacitor-plus/core": "^8.0.0",
-    "@capacitor/core": "^8.0.0"
-=======
-    "@capacitor/core": "^8.3.0"
->>>>>>> upstream/main
+    "@capacitor-plus/core": "^8.3.0",
+    "@capacitor/core": "^8.3.0"
   },

Also applies to: 34-39

🧰 Tools
🪛 Biome (2.4.11)

[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, Remove the Git conflict markers
(<<<<<<<, =======, >>>>>>>) and resolve the package identity block by keeping
your fork branding fields ("name": "@capacitor-plus/android", "description":
"Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform
apps with JavaScript and the web", "homepage", "author") but update the
"version" to the upstream bump (use 8.3.1); likewise resolve the
peerDependencies conflict by keeping the fork's package names/constraints where
applicable but adopting compatible version ranges from upstream—edit the "name",
"version", "description", "homepage", "author", and "peerDependencies" entries
in package.json to produce a valid JSON object with no conflict markers.

Comment thread 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

Do not resolve CHANGELOG.md by hand.

This file still has merge markers, and in this repo it should be left to the release automation. Revert the manual conflict content here and let CI/CD regenerate/manage the changelog instead.

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

Also applies to: 457-457, 532-532

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

In `@CHANGELOG.md` at line 6, The CHANGELOG.md contains unresolved merge markers
(e.g., <<<<<<< HEAD) and must not be edited manually; revert the manual conflict
resolution in CHANGELOG.md and restore the file to the repository state expected
by the release automation (undo local edits or reset the file to the
upstream/main version), leaving no merge markers or hand-edited content so CI/CD
can regenerate/manage the changelog.

Comment thread ios/CHANGELOG.md
Comment on lines +199 to +220
## [8.3.1](https://github.com/ionic-team/capacitor/compare/8.3.0...8.3.1) (2026-04-16)

### Bug Fixes

- boundary value extraction for form-data requests ([#7518](https://github.com/ionic-team/capacitor/issues/7518)) ([64ab854](https://github.com/ionic-team/capacitor/commit/64ab854c12330804c24275d88d3a9f7c8e52a73d))

# [8.3.0](https://github.com/ionic-team/capacitor/compare/8.2.0...8.3.0) (2026-03-25)

### Bug Fixes

- **http:** handle URL objects on fetch ([#8386](https://github.com/ionic-team/capacitor/issues/8386)) ([003099a](https://github.com/ionic-team/capacitor/commit/003099aef246adfd76d890074d46b1484951824b))
- **ios:** make getArray accesible on Objective-C plugins ([#8392](https://github.com/ionic-team/capacitor/issues/8392)) ([afb80f2](https://github.com/ionic-team/capacitor/commit/afb80f2fecb4bf85dbebe25e815de2a5564264d6))

# [8.2.0](https://github.com/ionic-team/capacitor/compare/8.1.0...8.2.0) (2026-03-06)

### Bug Fixes

- **ios:** remove tmpWindow usages on presentVC/dismissVC ([#8338](https://github.com/ionic-team/capacitor/issues/8338)) ([fc9647f](https://github.com/ionic-team/capacitor/commit/fc9647f26f08ff64f53b32c79fb19f153e3b0a24))

# [8.1.0](https://github.com/ionic-team/capacitor/compare/8.0.2...8.1.0) (2026-02-11)

### Reverts
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

Fix heading-level jumps that trigger markdownlint MD001

The new block has heading-level skips (e.g., # followed by ###) around Line 207, Line 214, and Line 220, matching the static analysis warnings and risking CI lint failure. Regenerate the changelog to produce consistent heading levels.

Based on learnings: "Applies to CHANGELOG.md : Do not manually edit CHANGELOG.md; it is managed automatically by CI/CD".

🧰 Tools
🪛 markdownlint-cli2 (0.22.0)

[warning] 207-207: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3

(MD001, heading-increment)


[warning] 214-214: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3

(MD001, heading-increment)


[warning] 220-220: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3

(MD001, heading-increment)

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

In `@ios/CHANGELOG.md` around lines 199 - 220, The changelog contains
heading-level jumps (a top-level "#" followed by "## [8.3.1]" then "### Bug
Fixes") which triggers markdownlint MD001; do not manually edit
CHANGELOG.md—revert these manual changes and regenerate the changelog using the
repository's release/changelog generation tooling so headings are produced
consistently (ensure entries like "## [8.3.1]" and its child "### Bug Fixes"
follow the normal heading hierarchy and that no manual top-level "#" headings
were introduced).

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

Resolve merge conflicts blocking CI pipeline.

This file has unresolved merge conflict markers that cause EJSONPARSE errors during npm install, as indicated by the pipeline failure. The conflicts are in two areas:

  1. Lines 2-14: Package identity (name, version, description, homepage, author)
  2. Lines 36-41: Peer dependencies section

For the Capacitor+ fork, you likely want to:

  • Keep the @capacitor-plus/ios name and Capgo branding from HEAD
  • Update the version to 8.3.1 to sync with upstream
  • Decide whether to keep dual peer dependencies (@capacitor-plus/core and @capacitor/core) or consolidate
🔧 Suggested resolution (keeping fork branding with updated version)
 {
-<<<<<<< HEAD
   "name": "@capacitor-plus/ios",
-  "version": "8.0.8",
+  "version": "8.3.1",
   "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
   "peerDependencies": {
-<<<<<<< HEAD
-    "@capacitor-plus/core": "^8.0.0",
-    "@capacitor/core": "^8.0.0"
-=======
-    "@capacitor/core": "^8.3.0"
->>>>>>> upstream/main
+    "@capacitor-plus/core": "^8.3.0",
+    "@capacitor/core": "^8.3.0"
   },

Also applies to: 36-41

🧰 Tools
🪛 Biome (2.4.11)

[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 in the package identity fields (name, version, description,
homepage, author) and in the peerDependencies block causing EJSONPARSE; open
ios/package.json, remove the conflict markers and choose the fork-safe values:
set "name" to "@capacitor-plus/ios", update "version" to "8.3.1", reconcile
"description", "homepage", and "author" to Capgo branding, and then resolve the
peerDependencies section by either keeping both "@capacitor-plus/core" and
"@capacitor/core" if you need dual compatibility or consolidating to the desired
single dependency; ensure the resulting JSON is valid (no <<<<<<<, =======,
>>>>>>>) and run npm install to verify.

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 leftover merge markers in lerna.json.

This file is not valid JSON right now, so Lerna/npm tooling cannot read it. Collapse this block to a single version entry and remove the conflict markers before merging.

Suggested fix
-<<<<<<< HEAD
-  "version": "8.0.8",
-=======
   "version": "8.3.1",
->>>>>>> upstream/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
<<<<<<< HEAD
"version": "8.0.8",
=======
"version": "8.3.1",
>>>>>>> upstream/main
"version": "8.3.1",
🧰 Tools
🪛 Biome (2.4.11)

[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 lerna.json contains unresolved git
merge conflict markers around the "version" key (the lines starting with
<<<<<<<, =======, >>>>>>>) which makes the JSON invalid; open the file, remove
the conflict markers and collapse the block to a single "version" entry (choose
the correct value between "8.0.8" and "8.3.1") so the file contains only one
"version": "X.Y.Z" pair and valid JSON syntax.

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

package.json still contains Git conflict markers.

npm install cannot parse this file, and CI is already failing with EJSONPARSE because of it. Resolve the merge and commit valid JSON before anything else.

🧰 Tools
🪛 Biome (2.4.11)

[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, package.json contains unresolved Git
conflict markers (<<<<<<<, =======, >>>>>>>) around dependency entries that
break JSON parsing; open package.json, remove the conflict markers, choose the
intended versions for the conflicting keys (e.g., decide which values to keep
for "@types/node", "eslint", "@types/tar" vs "prettier-pretty-check", and
"tar"), ensure the dependencies object is valid JSON (no duplicate keys,
trailing commas) and commit the resolved file so npm install/CI can parse it
successfully.

Comment thread package.json
Comment on lines +50 to +55
<<<<<<< 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 | 🟠 Major

Keep prettier-pretty-check in the resolved dependency list.

Line 22 still invokes prettier-pretty-check, so taking the upstream side verbatim here will break npm run prettier once the JSON conflict is removed.

Suggested resolution for this block
-    "tar": "^6.1.11",
-    "prettier-pretty-check": "^0.2.0"
+    "tar": "^7.5.3",
+    "prettier-pretty-check": "^0.2.0"
🧰 Tools
🪛 Biome (2.4.11)

[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 50 - 55, The merge removed the
"prettier-pretty-check" dependency from package.json causing the existing script
that invokes prettier-pretty-check (e.g., the "prettier" npm script) to break;
restore "prettier-pretty-check": "^0.2.0" into the dependencies/devDependencies
alongside "tar": "^7.5.3" so the script that calls prettier-pretty-check can
run, ensuring the package name matches what the "prettier" script expects.

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.