Skip to content

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

Open
riderx wants to merge 43 commits intoplusfrom
sync/plus-upstream-20260410-054302
Open

chore: sync plus with upstream main (conflicts)#41
riderx wants to merge 43 commits intoplusfrom
sync/plus-upstream-20260410-054302

Conversation

@riderx
Copy link
Copy Markdown
Member

@riderx riderx commented Apr 10, 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 (SPM) support for iOS projects.
    • Added HTTPS protocol option for development server.
    • Made SystemBars show() and hide() options parameters optional.
  • Bug Fixes

    • Improved null-safety checks in native Android bridge initialization.
    • Fixed HTTP range request handling for concurrent requests.
    • Enhanced keyboard (IME) visibility handling for safe area insets.
  • Chores

    • Bumped version to 8.3.0.
    • Updated build workflows and test configurations.
    • Updated package dependencies and iOS simulator targets.

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

This reverts commit c5476c8 and 0412d46
…8338)

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

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

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

coderabbitai bot commented Apr 10, 2026

📝 Walkthrough

Walkthrough

This pull request integrates an upstream merge that updates package versions from 8.0.8 to 8.3.0, refactors iOS build toolchain detection to support multiple package managers (SPM, Cocoapods, bundler), adds GitHub Actions workflows for issue automation and iOS publishing, introduces native bridge improvements for URL handling, and updates platform-specific code including SystemBars. The merge introduces unresolved conflict markers in changelog and package metadata files.

Changes

Cohort / File(s) Summary
GitHub Configuration
.github/ISSUE_TEMPLATE/config.yml, .github/ISSUE_TEMPLATE/feature-request.yml, .github/ionic-issue-bot.yml
Added Feature Request contact link in config, removed feature-request.yml template, shortened issue-bot closure window from 15 to 7 days.
GitHub Actions Workflows
.github/workflows/needs-reply.yml, .github/workflows/publish-ios.yml, .github/workflows/test.yml
Added automated issue closure workflow for stale "needs reply" issues, introduced iOS publishing workflow with Xcode setup and CocoaPods integration, extended test job timeouts from 30 to 60 minutes and added iOS simulator/platform download steps.
Merge Conflicts - Changelogs
CHANGELOG.md, android/CHANGELOG.md, cli/CHANGELOG.md, core/CHANGELOG.md, ios/CHANGELOG.md
Unresolved conflict markers with upstream release notes for versions 8.1.0–8.3.0; HEAD retains local 8.0.8 entries while upstream introduces newer versions.
Merge Conflicts - Package Metadata
android/package.json, core/package.json, ios/package.json, package.json, lerna.json
Package name changes from @capacitor-plus/* to @capacitor/*, version bumped to 8.3.0, author/homepage updated to Ionic, unresolved conflict markers present; dependency version updates including tar, @types/node.
iOS Package Manager Refactoring
cli/src/config.ts, cli/src/definitions.ts, cli/src/index.ts, cli/src/declarations.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/update.ts, cli/src/tasks/migrate-spm.ts, cli/src/tasks/migrate.ts
Introduced PackageManager type ('Cocoapods' | 'bundler' | 'SPM'), refactored package manager detection from synchronous checkPackageManager() to async config-based config.ios.packageManager property, updated build/run/update workflows to use new detection, added getCommonChecks() helper for platform-specific validation.
SPM and Validation Enhancements
cli/src/util/spm.ts, cli/src/tasks/migrate.ts
Made swift-tools-version configurable via experimental.ios.spm.swiftToolsVersion, added package traits support for SPM dependencies, introduced validators checkSwiftToolsVersion() and checkPackageTraitsRequirements(), simplified bundler detection logic.
CLI Configuration & Options
cli/src/tasks/run.ts, cli/src/util/livereload.ts, cli/src/tasks/sourcemaps.ts, cli/src/tasks/sync.ts
Added https?: boolean CLI flag for run command with dynamic port/protocol handling in live-reload URL, extended sourcemap inlining to .css files, updated sync checks to use async helpers.
Native Bridge URL Handling
android/capacitor/src/main/assets/native-bridge.js, ios/Capacitor/Capacitor/assets/native-bridge.js, core/native-bridge.ts
Extended window.fetch patch to handle URL object resources by converting them to proxied URLs before execution, maintaining existing string and Request handling.
Android Platform Updates
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
Fixed URL parsing in initWebView(), added null-safety guards in lifecycle callbacks, refactored response header handling to use defensive copies in buildDefaultResponseHeaders() and deprecated getResponseHeaders() to prevent concurrent request issues.
Android SystemBars Plugin
android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java
Added style persistence across configuration changes, replaced safe-area setup with CSS variable injection, introduced IME-aware inset handling, added WebView version detection for inset passthrough behavior, refactored window insets handling to adjust padding instead of margins.
iOS Deprecations & Protocol Updates
ios/Capacitor/Capacitor/CAPBridgeProtocol.swift, ios/Capacitor/Capacitor/CapacitorBridge.swift, ios/Capacitor/Capacitor/CAPBridgedJSTypes.h, ios/Capacitor/Capacitor/CAPBridgedJSTypes.m
Deprecated presentVC and dismissVC in protocol, simplified bridge presentation to always use viewController?.present/dismiss, removed obsolete tmpWindow logic, added getArray:defaultValue: accessor for bridged JS values.
Core Plugin Updates
core/src/core-plugins.ts, core/system-bars.md
Made SystemBars.show/hide() options parameter optional, fixed cookie expires attribute to emit only when value is provided, updated documentation to reflect optional parameters and clarify "disable" mode disables CSS injection.
Build Tooling & Templates
cli/src/util/template.ts, scripts/pack-cli-assets.mjs, ios-spm-template/App/CapApp-SPM/README.md, ios/package.json
Refactored tar module usage to named extract/create exports instead of default import, updated iOS simulator target from iPhone 16 to iPhone 17, corrected SPM template README grammar.

Sequence Diagram(s)

sequenceDiagram
    participant CLI as Capacitor CLI
    participant Config as Config Loader
    participant PkgMgr as Package Manager Detector
    participant iOS as iOS Platform
    participant Validator as Validation System

    CLI->>Config: Load configuration
    Config->>PkgMgr: Determine iOS package manager
    PkgMgr->>PkgMgr: Check for SPM (CapApp-SPM)
    PkgMgr->>PkgMgr: Check COCOAPODS_PATH env
    PkgMgr->>PkgMgr: Inspect Gemfile for bundler
    PkgMgr->>Config: Return PackageManager
    Config->>iOS: Update config.ios.packageManager
    CLI->>Validator: Get common checks
    Validator->>Validator: Query packageManager type
    alt packageManager === 'SPM'
        Validator->>Validator: Add SPM validators (swiftToolsVersion, traits)
    else packageManager === 'bundler'
        Validator->>Validator: Add bundler check
    else packageManager === 'Cocoapods'
        Validator->>Validator: Add CocoaPods check
    end
    Validator-->>CLI: Return platform checks
    CLI->>iOS: Build/Run with determined manager
Loading
sequenceDiagram
    participant Browser as Browser/WebView
    participant App as Native App
    participant Fetch as window.fetch
    participant Proxy as Proxy Handler
    participant Native as Native HTTP

    Browser->>Fetch: fetch(resource)
    Fetch->>Fetch: Check resource type
    alt resource is URL
        Fetch->>Proxy: createProxyUrl(resource.toString())
        Proxy-->>Fetch: proxied URL string
        Fetch->>Fetch: Wrap in new URL()
    else resource is string
        Fetch->>Proxy: createProxyUrl(resource)
        Proxy-->>Fetch: proxied string
    else resource is Request
        Fetch->>Proxy: createProxyUrl from Request.url
        Proxy-->>Fetch: proxied Request
    end
    Fetch->>Native: CapacitorWebFetch(proxied)
    Native->>App: Execute native HTTP
    App-->>Native: Response
    Native-->>Fetch: Return result
    Fetch-->>Browser: Promise<Response>
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Poem

🐰 From distant upstream flows a merge so grand,
With versions bumped and managers all planned!
SPM, Cocoapods, bundler's dance combined,
Safe areas now aware when keyboards bind,
Native bridges handle URLs with grace—
Capacitor hops forward at a brisker pace! 🚀

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 12.50% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'chore: sync plus with upstream main (conflicts)' accurately summarizes the main change: syncing the plus branch with upstream main, with unresolved merge conflicts present in multiple files (CHANGELOG.md, package.json, etc.). The title is clear, concise, and directly related to the primary change in the changeset.

✏️ 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-20260410-054302

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: 0a150fa1b7

ℹ️ 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 Remove merge markers from root package manifest

The commit leaves unresolved conflict markers (<<<<<<<, =======, >>>>>>>) inside package.json, which makes the file invalid JSON. Any install/build step that reads the root manifest (for example bun install/workspace tooling) will fail before running project code, so this blocks normal development and CI execution.

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 Resolve merge markers in SPM utility source

This file still contains conflict markers in generatePackageText, so TypeScript cannot parse the module. As a result, CLI compilation fails and iOS SPM-related commands cannot run in builds that include this change.

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

Caution

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

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

6-523: ⚠️ Potential issue | 🔴 Critical

Do not hand-merge CHANGELOG.md; remove conflict markers and regenerate via CI.

Line 6 and Line 457 show unresolved merge markers and conflicting release-history blocks. This must be resolved by restoring a clean changelog state and letting the automated changelog process regenerate entries, not by manual merge edits.

Suggested cleanup direction
-<<<<<<< HEAD
-...manual merged block...
-=======
-...manual merged block...
->>>>>>> upstream/main
+# Keep only CI-generated changelog content (no conflict markers)

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

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

In `@CHANGELOG.md` around lines 6 - 523, The file contains unresolved git merge
conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) and duplicated
release blocks (e.g., headings "## [8.0.8]" and "# [8.3.0]"); do not hand-edit
the changelog—remove all conflict markers and restore CHANGELOG.md to the clean
generated state by discarding the manual merge (checkout the file from the
target branch or revert to the pre-merge version) and then trigger the automated
changelog generation/CI workflow (the repo's changelog generation script or
release workflow) so the changelog is regenerated correctly.
android/CHANGELOG.md (1)

6-252: ⚠️ Potential issue | 🔴 Critical

Resolve leftover merge conflict markers before merge

This file still contains unresolved Git conflict markers (<<<<<<<, =======, >>>>>>>) and two competing changelog blocks. This must be resolved to a single finalized section before merging; otherwise the sync is incomplete and likely to break docs/lint/release workflows.

Suggested fix pattern
-<<<<<<< HEAD
-...left side...
-=======
-...right side...
->>>>>>> upstream/main
+...single resolved changelog section...
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@android/CHANGELOG.md` around lines 6 - 252, The android/CHANGELOG.md contains
unresolved Git conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main)
with two competing changelog blocks; open CHANGELOG.md, remove the conflict
markers and the duplicate/undesired section, and keep a single finalized
changelog entry (either the local [8.0.8] block or the upstream [8.3.0+] block)
merging any needed lines manually so the file contains one coherent changelog
without markers.
core/CHANGELOG.md (1)

6-159: ⚠️ Potential issue | 🔴 Critical

Unresolved conflict block must be removed

Line 6 through Line 159 still includes raw merge conflict markers and duplicated alternative changelog histories. Please resolve this block to one canonical history before merge.

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

In `@core/CHANGELOG.md` around lines 6 - 159, The file contains raw git conflict
markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) and duplicated changelog
sections (e.g., "## [8.0.8]" vs "# [8.3.0]"); remove the entire unresolved
conflict block and produce a single canonical changelog history. Edit
core/CHANGELOG.md to delete the conflict markers and one of the duplicated
variant blocks (choose the intended upstream history to keep), ensure headings
remain valid Markdown and chronological order is preserved, and run a quick diff
to confirm no <<<<<<<, =======, or >>>>>>> tokens remain.
ios/CHANGELOG.md (1)

6-225: ⚠️ Potential issue | 🔴 Critical

Blocker: unresolved merge conflict markers in changelog

The top section still contains <<<<<<< HEAD / ======= / >>>>>>> upstream/main. This needs manual conflict resolution to a single final changelog block before merging PR #41.

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

In `@ios/CHANGELOG.md` around lines 6 - 225, The changelog contains unresolved git
conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main); open
ios/CHANGELOG.md, remove the conflict markers and manually merge the two
conflicting sections into a single coherent changelog entry (choose and combine
the intended release entries from the HEAD and upstream/main blocks), ensuring
only one final changelog block remains (remove the duplicate headings and keep
chronological order), then save and commit the resolved file.
cli/CHANGELOG.md (1)

6-280: ⚠️ Potential issue | 🔴 Critical

Finalize conflicted changelog section

This segment still has unresolved merge markers and both sides of the conflict. Please keep the intended entries and remove conflict tokens so the file is valid Markdown/history again.

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

In `@cli/CHANGELOG.md` around lines 6 - 280, The file contains unresolved git
conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) around two
competing changelog blocks (e.g., headings "## [8.0.8]" and "# [8.3.0]"); remove
the conflict markers and reconcile the two blocks into a single valid changelog:
either keep the upstream/main section (8.3.0... 8.2.0...) and append the local
8.0.8/8.0.x notes without duplication, or merge their entries chronologically,
ensure only one set of headings per version, remove any duplicate entries, and
save as valid Markdown with no leftover conflict tokens.
android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java (1)

263-277: ⚠️ Potential issue | 🟠 Major

Preserve STYLE_DEFAULT when caching the current style.

Lines 264-266 resolve DEFAULT to LIGHT/DARK before Lines 271 and 276 store it. After that, handleOnConfigurationChanged() can no longer tell whether the caller asked for a fixed style or theme-following behavior, so a bar configured with DEFAULT stops adapting when the system theme changes.

Suggested change
     private void setStyle(String style, String bar) {
+        String requestedStyle = style;
         if (style.equals(STYLE_DEFAULT)) {
             style = getStyleForTheme();
         }
@@
         if (bar.isEmpty() || bar.equals(BAR_STATUS_BAR)) {
-            currentStatusBarStyle = style;
+            currentStatusBarStyle = requestedStyle;
             windowInsetsControllerCompat.setAppearanceLightStatusBars(!style.equals(STYLE_DARK));
         }
 
         if (bar.isEmpty() || bar.equals(BAR_GESTURE_BAR)) {
-            currentGestureBarStyle = style;
+            currentGestureBarStyle = requestedStyle;
             windowInsetsControllerCompat.setAppearanceLightNavigationBars(!style.equals(STYLE_DARK));
         }
🤖 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 263 - 277, In setStyle, don't overwrite the incoming style variable
with getStyleForTheme() because currentStatusBarStyle and currentGestureBarStyle
must retain STYLE_DEFAULT to indicate theme-following; instead compute a
resolvedStyle (or resolvedAppearance boolean) from getStyleForTheme() when
calling windowInsetsControllerCompat.setAppearanceLightStatusBars(...) and
setAppearanceLightNavigationBars(...), but assign the original style (not the
resolved one) to currentStatusBarStyle and currentGestureBarStyle so
handleOnConfigurationChanged() can detect STYLE_DEFAULT. Use the method name
setStyle and the symbols STYLE_DEFAULT, STYLE_DARK, getStyleForTheme(),
currentStatusBarStyle, currentGestureBarStyle, BAR_STATUS_BAR, BAR_GESTURE_BAR,
and the WindowInsetsControllerCompat appearance methods to guide the change.
cli/src/tasks/run.ts (1)

99-101: ⚠️ Potential issue | 🟡 Minor

Remove duplicate await keyword.

There's a double await that is unnecessary and could mask issues if the function signature changes.

🐛 Proposed fix
        if (platformName === config.android.name) {
-          await await writeCordovaAndroidManifest(cordovaPlugins, config, platformName, true);
+          await writeCordovaAndroidManifest(cordovaPlugins, config, platformName, true);
        }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@cli/src/tasks/run.ts` around lines 99 - 101, In run.ts replace the duplicate
await use so the call to writeCordovaAndroidManifest(cordovaPlugins, config,
platformName, true) uses a single await; locate the line containing "await await
writeCordovaAndroidManifest(...)" and remove the extra await to become a single
awaited call (ensuring the function still returns a Promise and behavior is
unchanged).
🧹 Nitpick comments (2)
ios/Capacitor/Capacitor/CapacitorBridge.swift (1)

96-99: Obsolete symbols are still wired into runtime flow; finish the cleanup.

tmpWindow/tmpVCAppeared are marked obsolete, but this file still uses them (Line 226 to Line 228). Consider removing the observer path and related temp-VC plumbing in the same cleanup to avoid dead/deprecated internals lingering.

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

In `@ios/Capacitor/Capacitor/CapacitorBridge.swift` around lines 96 - 99, Remove
the obsolete temp-VC plumbing: delete the deprecated properties tmpWindow and
tmpVCAppeared and remove any observer registration/handling and code paths that
reference them (the observer add/remove and the code around the tmp
view-controller flow currently using tmpWindow/tmpVCAppeared in
CapacitorBridge). Replace the runtime flow that relied on the temporary
UIWindow/notification with the normal VC presentation/completion path (or a
direct completion callback) so no code references tmpWindow or tmpVCAppeared
(search for tmpWindow, tmpVCAppeared, tmpViewControllerAppeared, and the
observer add/remove logic and remove/replace those usages).
cli/src/ios/common.ts (1)

30-44: Consider caching the awaited packageManager value.

The function awaits config.ios.packageManager multiple times (lines 32, 34, 36). While functionally correct (the underlying promise is cached), extracting it once improves readability.

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

In `@cli/src/ios/common.ts` around lines 30 - 44, In getCommonChecks, avoid
awaiting config.ios.packageManager multiple times: await it once into a local
const (e.g. const packageManager = await config.ios.packageManager) and use
packageManager in the subsequent comparisons and conditional logic (replace
repeated awaits in getCommonChecks with that local variable while keeping
existing checks like checkBundler, checkCocoaPods, checkSwiftToolsVersion, and
checkPackageTraitsRequirements intact).
🤖 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 checkout step currently pins ref: 'main' which forces
publishing from main; update the actions/checkout@v5 step to use the workflow's
triggering ref instead of hardcoding 'main' (replace the ref:'main' entry so it
derives from the workflow context or input, e.g., use the event/dispatch/PR
branch ref or a workflow input) so the job checks out the branch/tag that
triggered the workflow; ensure fetch-depth: 0 remains to allow tags and history
for CocoaPods publishing.

In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`:
- Around line 218-224: The fallback path currently builds newInsets by zeroing
out systemBars and displayCutout (WindowInsetsCompat newInsets using
Insets.of(0,0,0,0)), then calls calcSafeAreaInsets(newInsets) which collapses
safe-area values to 0 and wipes --safe-area-inset-*; change the fallback to
compute and inject CSS using the original insets (the incoming insets variable)
instead of newInsets so calcSafeAreaInsets(insets) returns the real safe-area
values and injectSafeAreaCSS(...) restores correct CSS variables (refer to
WindowInsetsCompat newInsets, calcSafeAreaInsets, and injectSafeAreaCSS).
- Line 280: The call that always uses
getActivity().getWindow().getDecorView().setBackgroundColor(getThemeColor(getContext(),
android.R.attr.windowBackground)) is incorrect because
getThemeColor()/resolveAttribute can return a resource id for
android.R.attr.windowBackground; update getThemeColor or add a new helper that
resolves the TypedValue for getThemeColor(Context, int) and returns both
typedValue.resourceId and typedValue.data (or expose a boolean/resource id),
then replace the single setBackgroundColor call with logic that, when
typedValue.resourceId != 0, calls setBackgroundResource(resourceId) on
getDecorView(), otherwise calls setBackgroundColor(typedValue.data); modify the
getThemeColor() implementation (or its replacement) to use
context.getTheme().resolveAttribute(...) and surface resourceId vs data
accordingly so drawable/color resources are handled correctly.

In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`:
- Around line 342-343: The Range header lookup in WebViewLocalServer currently
checks only "Range" and "range" via requestHeaders.get(...), which misses
mixed-case variants; update the logic that sets rangeString to perform a
case-insensitive key lookup against requestHeaders (e.g., iterate
requestHeaders.keySet() and use equalsIgnoreCase("Range") or normalize keys) so
any header like "RaNgE" is detected and range handling works; modify the code
around the requestHeaders and rangeString assignment in WebViewLocalServer to
use that case-insensitive check.

In `@android/package.json`:
- Around line 2-14: Remove all Git conflict markers (<<<<<<<, =======, >>>>>>>)
and merge the two conflicting manifest blocks into a single valid JSON object:
pick the desired values for the "name", "version", "description", "homepage",
and "author" keys (from the conflicting entries) so only one set of those
properties exists, fix any trailing commas, and ensure the overall JSON is
syntactically valid; repeat the same removal/merge for the second conflict block
that also touches those same keys so the entire package.json contains one
consistent set of fields.

In `@cli/package.json`:
- Around line 2-14: Remove the Git conflict markers (<<<<<<<, =======, >>>>>>>)
and resolve which package identity to keep in package.json by choosing and
keeping one set of keys (either the `@capacitor-plus/cli` block with "version":
"8.0.8", "description": "Capacitor+: ...", "homepage": "https://capgo.app/...",
"author": "Capgo Team ..." or the `@capacitor/cli` block with "version": "8.3.0",
"description": "Capacitor: ...", "homepage": "https://capacitorjs.com",
"author": "Ionic Team ..."), then ensure the final JSON contains a single "name"
key and valid comma/brace syntax (no leftover markers), save the file, and run
an install/build to verify package.json parses correctly.

In `@cli/src/index.ts`:
- Around line 30-38: getPackageManager currently treats any non-'cocoapods'
value as 'SPM', so typos silently provision the wrong setup; update
getPackageManager to explicitly accept 'cocoapods' and 'spm' (and handle the
existing bundler branch when ios.packageManager === 'bundler') and throw/reject
for any other packageManager values with a clear error message. Locate function
getPackageManager and: 1) keep the existing bundler return when packageManager
=== 'cocoapods' and config.ios.packageManager === 'bundler'; 2) return
'Cocoapods' for 'cocoapods' and 'SPM' for 'spm' only; 3) otherwise throw an
informative Error mentioning the invalid --packagemanager value so callers fail
fast.

In `@cli/src/tasks/run.ts`:
- Around line 113-115: The log message in the logger.info call inside run.ts has
a typo ("listing" should be "listening"); update the string passed to
logger.info (the template that references options.https, options.host, and
options.port) to use "listening" instead of "listing" so the message reads
"...App running with live reload listening for: ...". Ensure you modify the
logger.info invocation that constructs the URL using options.https,
options.host, and options.port.

In `@cli/src/util/spm.ts`:
- Around line 100-108: Resolve the Git conflict markers in generatePackageText
by removing the <<<<<<</=======/>>>>>>> lines and keeping the new SPM fields:
ensure packageTraits and swiftToolsVersion are read from
config.app.extConfig.experimental?.ios?.spm (assign packageTraits and
swiftToolsVersion as shown) and use the correct iOS helper function that matches
the import at the top (either keep getMajoriOSVersion or
getMajorMinoriOSVersion—make the call to iosVersion use the same function name
as imported). After merging, ensure packageSwiftText is built using the
swiftToolsVersion variable and that no conflict markers remain so
generatePackageText compiles.

In `@core/package.json`:
- Around line 2-14: The package.json contains unresolved Git conflict markers
(<<<<<<<, =======, >>>>>>>) around metadata fields (name, version, description,
homepage, author) which produces invalid JSON; open package.json, remove the
conflict markers and decide which side's values to keep (either the
`@capacitor-plus/core` entries or the upstream `@capacitor/core` entries), ensure
the final file contains a single valid set of keys (name, version, description,
homepage, author) with proper JSON syntax, and save/commit the resolved file so
npm/CI can parse it.

In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m`:
- Line 32: The method implementation for getArray in CAPBridgedJSTypes.m has a
stray semicolon before the opening brace; remove the semicolon from the
implementation signature of - (NSArray * _Nullable)getArray:(NSString *
_Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue so the method reads
as a normal Objective-C implementation (no semicolon before the {) to fix the
compilation error.

In `@ios/package.json`:
- Around line 2-14: The package.json contains unresolved git conflict markers
(<<<<<<<, =======, >>>>>>>) in the metadata block for fields like "name",
"version", "description", "homepage", and "author"; remove the conflict markers
and reconcile the two versions so the file is valid JSON (choose the intended
values for "name"/"version"/"description"/"homepage"/"author" or merge them),
ensure commas and quotes remain correct, and save a clean package.json before
running npm to avoid the EJSONPARSE error.

In `@lerna.json`:
- Around line 16-20: The lerna.json contains unresolved Git conflict markers
around the "version" field; remove the conflict markers (<<<<<<< HEAD, =======,
>>>>>>> upstream/main) and set a single valid JSON "version" value (e.g.,
"8.3.0" or whichever release you intend to keep) so the file is valid JSON and
tooling can parse it; update only the "version" entry and ensure the file has no
leftover merge markers.

In `@package.json`:
- Around line 35-55: The package.json contains unresolved Git conflict markers
around dependencies (<<<<<<<, =======, >>>>>>>) — remove these markers and merge
the conflicting entries into a single valid dependencies list: pick and keep the
intended versions for "@types/node", "eslint", "tar", and any other duplicated
keys (remove or consolidate "prettier-pretty-check" if not needed), ensure
proper JSON punctuation (commas/quotes) so the dependencies block is valid JSON,
and run a quick npm/yarn install or JSON lint to verify the file parses.

---

Outside diff comments:
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`:
- Around line 263-277: In setStyle, don't overwrite the incoming style variable
with getStyleForTheme() because currentStatusBarStyle and currentGestureBarStyle
must retain STYLE_DEFAULT to indicate theme-following; instead compute a
resolvedStyle (or resolvedAppearance boolean) from getStyleForTheme() when
calling windowInsetsControllerCompat.setAppearanceLightStatusBars(...) and
setAppearanceLightNavigationBars(...), but assign the original style (not the
resolved one) to currentStatusBarStyle and currentGestureBarStyle so
handleOnConfigurationChanged() can detect STYLE_DEFAULT. Use the method name
setStyle and the symbols STYLE_DEFAULT, STYLE_DARK, getStyleForTheme(),
currentStatusBarStyle, currentGestureBarStyle, BAR_STATUS_BAR, BAR_GESTURE_BAR,
and the WindowInsetsControllerCompat appearance methods to guide the change.

In `@android/CHANGELOG.md`:
- Around line 6-252: The android/CHANGELOG.md contains unresolved Git conflict
markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) with two competing
changelog blocks; open CHANGELOG.md, remove the conflict markers and the
duplicate/undesired section, and keep a single finalized changelog entry (either
the local [8.0.8] block or the upstream [8.3.0+] block) merging any needed lines
manually so the file contains one coherent changelog without markers.

In `@CHANGELOG.md`:
- Around line 6-523: The file contains unresolved git merge conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) and duplicated release blocks
(e.g., headings "## [8.0.8]" and "# [8.3.0]"); do not hand-edit the
changelog—remove all conflict markers and restore CHANGELOG.md to the clean
generated state by discarding the manual merge (checkout the file from the
target branch or revert to the pre-merge version) and then trigger the automated
changelog generation/CI workflow (the repo's changelog generation script or
release workflow) so the changelog is regenerated correctly.

In `@cli/CHANGELOG.md`:
- Around line 6-280: The file contains unresolved git conflict markers (<<<<<<<
HEAD, =======, >>>>>>> upstream/main) around two competing changelog blocks
(e.g., headings "## [8.0.8]" and "# [8.3.0]"); remove the conflict markers and
reconcile the two blocks into a single valid changelog: either keep the
upstream/main section (8.3.0... 8.2.0...) and append the local 8.0.8/8.0.x notes
without duplication, or merge their entries chronologically, ensure only one set
of headings per version, remove any duplicate entries, and save as valid
Markdown with no leftover conflict tokens.

In `@cli/src/tasks/run.ts`:
- Around line 99-101: In run.ts replace the duplicate await use so the call to
writeCordovaAndroidManifest(cordovaPlugins, config, platformName, true) uses a
single await; locate the line containing "await await
writeCordovaAndroidManifest(...)" and remove the extra await to become a single
awaited call (ensuring the function still returns a Promise and behavior is
unchanged).

In `@core/CHANGELOG.md`:
- Around line 6-159: The file contains raw git conflict markers (<<<<<<< HEAD,
=======, >>>>>>> upstream/main) and duplicated changelog sections (e.g., "##
[8.0.8]" vs "# [8.3.0]"); remove the entire unresolved conflict block and
produce a single canonical changelog history. Edit core/CHANGELOG.md to delete
the conflict markers and one of the duplicated variant blocks (choose the
intended upstream history to keep), ensure headings remain valid Markdown and
chronological order is preserved, and run a quick diff to confirm no <<<<<<<,
=======, or >>>>>>> tokens remain.

In `@ios/CHANGELOG.md`:
- Around line 6-225: The changelog contains unresolved git conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main); open ios/CHANGELOG.md, remove
the conflict markers and manually merge the two conflicting sections into a
single coherent changelog entry (choose and combine the intended release entries
from the HEAD and upstream/main blocks), ensuring only one final changelog block
remains (remove the duplicate headings and keep chronological order), then save
and commit the resolved file.

---

Nitpick comments:
In `@cli/src/ios/common.ts`:
- Around line 30-44: In getCommonChecks, avoid awaiting
config.ios.packageManager multiple times: await it once into a local const (e.g.
const packageManager = await config.ios.packageManager) and use packageManager
in the subsequent comparisons and conditional logic (replace repeated awaits in
getCommonChecks with that local variable while keeping existing checks like
checkBundler, checkCocoaPods, checkSwiftToolsVersion, and
checkPackageTraitsRequirements intact).

In `@ios/Capacitor/Capacitor/CapacitorBridge.swift`:
- Around line 96-99: Remove the obsolete temp-VC plumbing: delete the deprecated
properties tmpWindow and tmpVCAppeared and remove any observer
registration/handling and code paths that reference them (the observer
add/remove and the code around the tmp view-controller flow currently using
tmpWindow/tmpVCAppeared in CapacitorBridge). Replace the runtime flow that
relied on the temporary UIWindow/notification with the normal VC
presentation/completion path (or a direct completion callback) so no code
references tmpWindow or tmpVCAppeared (search for tmpWindow, tmpVCAppeared,
tmpViewControllerAppeared, and the observer add/remove logic and remove/replace
those usages).
🪄 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: ee3e6265-eb54-4b65-b839-ff3a7552532b

📥 Commits

Reviewing files that changed from the base of the PR and between cbf464f and 0a150fa.

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

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 | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

cat -n .github/workflows/publish-ios.yml

Repository: Cap-go/capacitor-plus

Length of output: 1062


Don't hardcode the publish checkout to main.

Lines 21-24 force this job to publish whatever is on main, even when the workflow is manually dispatched from another branch or called from a release/tag workflow. Since this step publishes to CocoaPods, that can push the wrong podspec version and source tree.

Suggested change
       - 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 ref: 'main' which forces publishing from main; update the
actions/checkout@v5 step to use the workflow's triggering ref instead of
hardcoding 'main' (replace the ref:'main' entry so it derives from the workflow
context or input, e.g., use the event/dispatch/PR branch ref or a workflow
input) so the job checks out the branch/tag that triggered the workflow; ensure
fetch-depth: 0 remains to allow tags and history for CocoaPods publishing.

Comment on lines +218 to +224
WindowInsetsCompat newInsets = new WindowInsetsCompat.Builder(insets)
.setInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout(), Insets.of(0, 0, 0, 0))
.build();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && hasViewportCover && insetHandlingEnabled) {
Insets safeAreaInsets = calcSafeAreaInsets(newInsets);
injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left);
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

Inject safe-area CSS from the original insets in the fallback path.

Line 219 zeroes systemBars | displayCutout, so calcSafeAreaInsets(newInsets) on Line 223 always collapses the CSS variables to 0. On the old-WebView fallback path, that wipes --safe-area-inset-* even when viewport-fit=cover is enabled.

Suggested change
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && hasViewportCover && insetHandlingEnabled) {
-                Insets safeAreaInsets = calcSafeAreaInsets(newInsets);
+                Insets safeAreaInsets = calcSafeAreaInsets(insets);
                 injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left);
             }
📝 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
WindowInsetsCompat newInsets = new WindowInsetsCompat.Builder(insets)
.setInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout(), Insets.of(0, 0, 0, 0))
.build();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && hasViewportCover && insetHandlingEnabled) {
Insets safeAreaInsets = calcSafeAreaInsets(newInsets);
injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left);
WindowInsetsCompat newInsets = new WindowInsetsCompat.Builder(insets)
.setInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout(), Insets.of(0, 0, 0, 0))
.build();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && hasViewportCover && insetHandlingEnabled) {
Insets safeAreaInsets = calcSafeAreaInsets(insets);
injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left);
}
🤖 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 218 - 224, The fallback path currently builds newInsets by zeroing
out systemBars and displayCutout (WindowInsetsCompat newInsets using
Insets.of(0,0,0,0)), then calls calcSafeAreaInsets(newInsets) which collapses
safe-area values to 0 and wipes --safe-area-inset-*; change the fallback to
compute and inject CSS using the original insets (the incoming insets variable)
instead of newInsets so calcSafeAreaInsets(insets) returns the real safe-area
values and injectSafeAreaCSS(...) restores correct CSS variables (refer to
WindowInsetsCompat newInsets, calcSafeAreaInsets, and injectSafeAreaCSS).

windowInsetsControllerCompat.setAppearanceLightNavigationBars(!style.equals(STYLE_DARK));
}

getActivity().getWindow().getDecorView().setBackgroundColor(getThemeColor(getContext(), android.R.attr.windowBackground));
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:

find . -type f -name "SystemBars.java" | head -20

Repository: Cap-go/capacitor-plus

Length of output: 138


🏁 Script executed:

cat -n android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java | sed -n '270,330p'

Repository: Cap-go/capacitor-plus

Length of output: 2918


🏁 Script executed:

cat -n android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java | grep -n "getThemeColor" | head -10

Repository: Cap-go/capacitor-plus

Length of output: 278


🏁 Script executed:

cat android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java | grep -n "getThemeColor"

Repository: Cap-go/capacitor-plus

Length of output: 264


🏁 Script executed:

cat android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java | wc -l

Repository: Cap-go/capacitor-plus

Length of output: 68


Fix windowBackground attribute resolution to handle drawable resources.

resolveAttribute() can return a resource ID in typedValue.resourceId when android.R.attr.windowBackground points to a drawable or color resource. The current code only checks typedValue.data, which is invalid for resource references and will apply the wrong background or fail to update properly after theme/configuration changes.

Replace getThemeColor() with a method that checks typedValue.resourceId first and uses setBackgroundResource() for resources or setBackgroundColor() for inline colors. This issue affects line 280 and the getThemeColor() method at lines 313-318.

Suggested change
-        getActivity().getWindow().getDecorView().setBackgroundColor(getThemeColor(getContext(), android.R.attr.windowBackground));
+        applyWindowBackground(getActivity().getWindow().getDecorView(), android.R.attr.windowBackground);
@@
-    public int getThemeColor(Context context, int attrRes) {
+    private void applyWindowBackground(View view, int attrRes) {
         TypedValue typedValue = new TypedValue();
-
-        Resources.Theme theme = context.getTheme();
-        theme.resolveAttribute(attrRes, typedValue, true);
-        return typedValue.data;
+        Resources.Theme theme = view.getContext().getTheme();
+        if (!theme.resolveAttribute(attrRes, 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` at
line 280, The call that always uses
getActivity().getWindow().getDecorView().setBackgroundColor(getThemeColor(getContext(),
android.R.attr.windowBackground)) is incorrect because
getThemeColor()/resolveAttribute can return a resource id for
android.R.attr.windowBackground; update getThemeColor or add a new helper that
resolves the TypedValue for getThemeColor(Context, int) and returns both
typedValue.resourceId and typedValue.data (or expose a boolean/resource id),
then replace the single setBackgroundColor call with logic that, when
typedValue.resourceId != 0, calls setBackgroundResource(resourceId) on
getDecorView(), otherwise calls setBackgroundColor(typedValue.data); modify the
getThemeColor() implementation (or its replacement) to use
context.getTheme().resolveAttribute(...) and surface resourceId vs data
accordingly so drawable/color resources are handled correctly.

Comment on lines +342 to +343
Map<String, String> requestHeaders = request.getRequestHeaders();
String rangeString = requestHeaders.get("Range") != null ? requestHeaders.get("Range") : requestHeaders.get("range");
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:

# First, locate the file
fd "WebViewLocalServer.java" android/

Repository: Cap-go/capacitor-plus

Length of output: 137


🏁 Script executed:

# Read the file around lines 342-343 to see the context
wc -l android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java

Repository: Cap-go/capacitor-plus

Length of output: 141


🏁 Script executed:

# Read lines around 342-343 with context
sed -n '330,360p' android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java | cat -n

Repository: Cap-go/capacitor-plus

Length of output: 1895


🏁 Script executed:

# Search for WebResourceRequest usage and documentation
rg "WebResourceRequest" android/capacitor/src/main/java/com/getcapacitor/ -A 3 -B 3 | head -40

Repository: Cap-go/capacitor-plus

Length of output: 4220


🏁 Script executed:

# Search for other uses of getRequestHeaders in the codebase
rg "getRequestHeaders" android/capacitor/src/main/java/ -B 2 -A 5

Repository: Cap-go/capacitor-plus

Length of output: 3095


🏁 Script executed:

# Get more context around the Accept header check
sed -n '290,330p' android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java | cat -n

Repository: Cap-go/capacitor-plus

Length of output: 1927


🏁 Script executed:

# Find the Accept header check line
rg "Accept.*equalsIgnoreCase" android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java -B 3 -A 3

Repository: Cap-go/capacitor-plus

Length of output: 47


🏁 Script executed:

# Search for Accept in the file
rg "Accept" android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java -B 2 -A 2

Repository: Cap-go/capacitor-plus

Length of output: 1135


Make the Range lookup fully case-insensitive.

Lines 342-343 only check exact keys "Range" and "range". The same file already uses equalsIgnoreCase() for the Accept header (confirming HTTP headers are case-insensitive), but this pattern is missing for the Range header. Mixed-case variants like "RaNgE" would bypass range request handling and regress partial responses.

🔧 Proposed fix
-        Map<String, String> requestHeaders = request.getRequestHeaders();
-        String rangeString = requestHeaders.get("Range") != null ? requestHeaders.get("Range") : requestHeaders.get("range");
+        String rangeString = null;
+        for (Map.Entry<String, String> entry : request.getRequestHeaders().entrySet()) {
+            if ("Range".equalsIgnoreCase(entry.getKey())) {
+                rangeString = entry.getValue();
+                break;
+            }
+        }
📝 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
Map<String, String> requestHeaders = request.getRequestHeaders();
String rangeString = requestHeaders.get("Range") != null ? requestHeaders.get("Range") : requestHeaders.get("range");
String rangeString = null;
for (Map.Entry<String, String> entry : request.getRequestHeaders().entrySet()) {
if ("Range".equalsIgnoreCase(entry.getKey())) {
rangeString = entry.getValue();
break;
}
}
🤖 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 Range header lookup in WebViewLocalServer currently
checks only "Range" and "range" via requestHeaders.get(...), which misses
mixed-case variants; update the logic that sets rangeString to perform a
case-insensitive key lookup against requestHeaders (e.g., iterate
requestHeaders.keySet() and use equalsIgnoreCase("Range") or normalize keys) so
any header like "RaNgE" is detected and range handling works; modify the code
around the requestHeaders and rangeString assignment in WebViewLocalServer to
use that case-insensitive check.

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.0",
"description": "Capacitor: Cross-platform apps with JavaScript and the web",
"homepage": "https://capacitorjs.com",
"author": "Ionic Team <hi@ionic.io> (https://ionic.io)",
>>>>>>> upstream/main
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Resolve both merge conflicts in this manifest.

The blocks at Lines 2-14 and 34-39 leave android/package.json in an invalid JSON state. That is enough to break npm install for the Android package before any Gradle verification can start.

Also applies to: 34-39

🧰 Tools
🪛 Biome (2.4.10)

[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


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

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-8: End of file expected

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-14: End of file expected

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character /

(parse)

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

In `@android/package.json` around lines 2 - 14, Remove all Git conflict markers
(<<<<<<<, =======, >>>>>>>) and merge the two conflicting manifest blocks into a
single valid JSON object: pick the desired values for the "name", "version",
"description", "homepage", and "author" keys (from the conflicting entries) so
only one set of those properties exists, fix any trailing commas, and ensure the
overall JSON is syntactically valid; repeat the same removal/merge for the
second conflict block that also touches those same keys so the entire
package.json contains one consistent set of fields.

Comment thread core/package.json
Comment on lines +2 to +14
<<<<<<< HEAD
"name": "@capacitor-plus/core",
"version": "8.0.8",
"description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web",
"homepage": "https://capgo.app/docs/plugins/capacitor-plus/",
"author": "Capgo Team <support@capgo.app> (https://capgo.app)",
=======
"name": "@capacitor/core",
"version": "8.3.0",
"description": "Capacitor: Cross-platform apps with JavaScript and the web",
"homepage": "https://capacitorjs.com",
"author": "Ionic Team <hi@ionic.io> (https://ionic.io)",
>>>>>>> upstream/main
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Resolve the merge markers before merging.

The conflict block at Lines 2-14 makes this file invalid JSON, and CI is already failing with EJSONPARSE. npm install will remain broken until one side is chosen and the markers are removed.

🧰 Tools
🪛 Biome (2.4.10)

[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


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

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-8: End of file expected

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-14: End of file expected

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character /

(parse)

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

In `@core/package.json` around lines 2 - 14, The package.json contains unresolved
Git conflict markers (<<<<<<<, =======, >>>>>>>) around metadata fields (name,
version, description, homepage, author) which produces invalid JSON; open
package.json, remove the conflict markers and decide which side's values to keep
(either the `@capacitor-plus/core` entries or the upstream `@capacitor/core`
entries), ensure the final file contains a single valid set of keys (name,
version, description, homepage, author) with proper JSON syntax, and save/commit
the resolved file so npm/CI can parse it.

return defaultValue;
}

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

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify there is no Objective-C method implementation signature with '; {'
rg -nP '^\s*-\s*\([^)]*\)\s*[^{]*;\s*\{' ios/Capacitor/Capacitor/CAPBridgedJSTypes.m
# Expected: no matches

Repository: Cap-go/capacitor-plus

Length of output: 174


Remove the stray semicolon in method implementation signature.

Objective-C method implementations cannot have a semicolon before the opening brace. This syntax error will prevent compilation.

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

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

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

In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m` at line 32, The method
implementation for getArray in CAPBridgedJSTypes.m has a stray semicolon before
the opening brace; remove the semicolon from the implementation signature of -
(NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray *
_Nullable)defaultValue so the method reads as a normal Objective-C
implementation (no semicolon before the {) to fix the compilation error.

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.0",
"description": "Capacitor: Cross-platform apps with JavaScript and the web",
"homepage": "https://capacitorjs.com",
"author": "Ionic Team <hi@ionic.io> (https://ionic.io)",
>>>>>>> upstream/main
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Resolve both conflict blocks before running npm again.

The markers at Lines 2-14 and 36-41 make this manifest invalid JSON, which is why the workflow is failing with EJSONPARSE. The iOS package cannot be installed or verified until these conflicts are resolved.

Also applies to: 36-41

🧰 Tools
🪛 Biome (2.4.10)

[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


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

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-8: End of file expected

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-14: End of file expected

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character /

(parse)

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

In `@ios/package.json` around lines 2 - 14, The package.json contains unresolved
git conflict markers (<<<<<<<, =======, >>>>>>>) in the metadata block for
fields like "name", "version", "description", "homepage", and "author"; remove
the conflict markers and reconcile the two versions so the file is valid JSON
(choose the intended values for
"name"/"version"/"description"/"homepage"/"author" or merge them), ensure commas
and quotes remain correct, and save a clean package.json before running npm to
avoid the EJSONPARSE error.

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

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Resolve merge markers in lerna.json immediately.

Line 16 introduces unresolved conflict markers, making the file invalid JSON and breaking tooling that parses lerna.json.

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

[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


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

(parse)


[error] 17-17: End of file expected

(parse)


[error] 17-17: End of file expected

(parse)


[error] 17-17: End of file expected

(parse)


[error] 17-18: End of file expected

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 19-19: End of file expected

(parse)


[error] 19-19: End of file expected

(parse)


[error] 19-19: End of file expected

(parse)


[error] 19-20: End of file expected

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character /

(parse)

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

In `@lerna.json` around lines 16 - 20, The lerna.json contains unresolved Git
conflict markers around the "version" field; remove the conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) and set a single valid JSON
"version" value (e.g., "8.3.0" or whichever release you intend to keep) so the
file is valid JSON and tooling can parse it; update only the "version" entry and
ensure the file has no leftover merge markers.

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 markers in this dependency block.

The root package.json is invalid JSON as committed, and CI is already failing with EJSONPARSE during npm install. None of the downstream build or test steps can run until this hunk is resolved.

🧰 Tools
🪛 Biome (2.4.10)

[error] 35-35: unexpected character <

(parse)


[error] 35-35: unexpected character <

(parse)


[error] 35-35: unexpected character <

(parse)


[error] 35-35: unexpected character <

(parse)


[error] 35-35: unexpected character <

(parse)


[error] 35-35: unexpected character <

(parse)


[error] 35-35: unexpected character <

(parse)


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

(parse)


[error] 36-36: End of file expected

(parse)


[error] 36-36: End of file expected

(parse)


[error] 36-36: End of file expected

(parse)


[error] 36-36: End of file expected

(parse)


[error] 37-37: End of file expected

(parse)


[error] 37-37: End of file expected

(parse)


[error] 37-37: End of file expected

(parse)


[error] 37-37: End of file expected

(parse)


[error] 38-38: End of file expected

(parse)


[error] 38-38: End of file expected

(parse)


[error] 38-38: End of file expected

(parse)


[error] 38-38: End of file expected

(parse)


[error] 39-39: End of file expected

(parse)


[error] 39-39: End of file expected

(parse)


[error] 39-39: End of file expected

(parse)


[error] 39-40: End of file expected

(parse)


[error] 40-40: unexpected character =

(parse)


[error] 40-40: unexpected character =

(parse)


[error] 40-40: unexpected character =

(parse)


[error] 40-40: unexpected character =

(parse)


[error] 40-40: unexpected character =

(parse)


[error] 40-40: unexpected character =

(parse)


[error] 40-40: unexpected character =

(parse)


[error] 41-41: End of file expected

(parse)


[error] 41-41: End of file expected

(parse)


[error] 41-41: End of file expected

(parse)


[error] 41-41: End of file expected

(parse)


[error] 42-42: End of file expected

(parse)


[error] 42-42: End of file expected

(parse)


[error] 42-42: End of file expected

(parse)


[error] 42-43: End of file expected

(parse)


[error] 43-43: unexpected character >

(parse)


[error] 43-43: unexpected character >

(parse)


[error] 43-43: unexpected character >

(parse)


[error] 43-43: unexpected character >

(parse)


[error] 43-43: unexpected character >

(parse)


[error] 43-43: unexpected character >

(parse)


[error] 43-43: unexpected character >

(parse)


[error] 43-43: unexpected character /

(parse)


[error] 44-44: End of file expected

(parse)


[error] 44-44: End of file expected

(parse)


[error] 44-44: End of file expected

(parse)


[error] 44-44: End of file expected

(parse)


[error] 45-45: End of file expected

(parse)


[error] 45-45: End of file expected

(parse)


[error] 45-45: End of file expected

(parse)


[error] 45-45: End of file expected

(parse)


[error] 46-46: End of file expected

(parse)


[error] 46-46: End of file expected

(parse)


[error] 46-46: End of file expected

(parse)


[error] 46-46: End of file expected

(parse)


[error] 47-47: End of file expected

(parse)


[error] 47-47: End of file expected

(parse)


[error] 47-47: End of file expected

(parse)


[error] 47-47: End of file expected

(parse)


[error] 48-48: End of file expected

(parse)


[error] 48-48: End of file expected

(parse)


[error] 48-48: End of file expected

(parse)


[error] 48-48: End of file expected

(parse)


[error] 49-49: End of file expected

(parse)


[error] 49-49: End of file expected

(parse)


[error] 49-49: End of file expected

(parse)


[error] 49-50: End of file expected

(parse)


[error] 50-50: unexpected character <

(parse)


[error] 50-50: unexpected character <

(parse)


[error] 50-50: unexpected character <

(parse)


[error] 50-50: unexpected character <

(parse)


[error] 50-50: unexpected character <

(parse)


[error] 50-50: unexpected character <

(parse)


[error] 50-50: unexpected character <

(parse)


[error] 51-51: End of file expected

(parse)


[error] 51-51: End of file expected

(parse)


[error] 51-51: End of file expected

(parse)


[error] 51-51: End of file expected

(parse)


[error] 52-52: End of file expected

(parse)


[error] 52-52: End of file expected

(parse)


[error] 52-52: End of file expected

(parse)


[error] 53-53: unexpected character =

(parse)


[error] 53-53: unexpected character =

(parse)


[error] 53-53: unexpected character =

(parse)


[error] 53-53: unexpected character =

(parse)


[error] 53-53: unexpected character =

(parse)


[error] 53-53: unexpected character =

(parse)


[error] 53-53: unexpected character =

(parse)


[error] 54-54: End of file expected

(parse)


[error] 54-54: End of file expected

(parse)


[error] 54-54: End of file expected

(parse)


[error] 55-55: unexpected character >

(parse)


[error] 55-55: unexpected character >

(parse)


[error] 55-55: unexpected character >

(parse)


[error] 55-55: unexpected character >

(parse)


[error] 55-55: unexpected character >

(parse)


[error] 55-55: unexpected character >

(parse)


[error] 55-55: unexpected character >

(parse)


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

(parse)


[error] 55-55: unexpected character /

(parse)


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

(parse)

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

In `@package.json` around lines 35 - 55, The package.json contains unresolved Git
conflict markers around dependencies (<<<<<<<, =======, >>>>>>>) — remove these
markers and merge the conflicting entries into a single valid dependencies list:
pick and keep the intended versions for "@types/node", "eslint", "tar", and any
other duplicated keys (remove or consolidate "prettier-pretty-check" if not
needed), ensure proper JSON punctuation (commas/quotes) so the dependencies
block is valid JSON, and run a quick npm/yarn install or JSON lint to verify the
file parses.

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.