Skip to content

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

Open
riderx wants to merge 43 commits intoplusfrom
sync/plus-upstream-20260411-053055
Open

chore: sync plus with upstream main (conflicts)#42
riderx wants to merge 43 commits intoplusfrom
sync/plus-upstream-20260411-053055

Conversation

@riderx
Copy link
Copy Markdown
Member

@riderx riderx commented Apr 11, 2026

Merge Conflict Resolution Required

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

What happened

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

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


This PR was created automatically by the Capacitor+ sync workflow

Summary by CodeRabbit

  • New Features

    • Added Swift Package Manager configuration support with customizable tools version and package traits.
    • Added HTTPS support for live reload configuration.
    • Added CSS sourcemap inlining capability.
    • Enhanced system bars safe-area handling with keyboard visibility detection.
  • Bug Fixes

    • Improved safety with null checks on Android platform.
    • Fixed fetch handling for URL instances on Android and iOS.
    • Corrected cookie expiration attribute handling.
    • Fixed system bars style persistence during device configuration changes.
  • Chores

    • Updated to version 8.3.0.
    • Transitioned package identity to official Capacitor organization.

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

📝 Walkthrough

Walkthrough

This pull request merges upstream changes and performs a significant migration from Capacitor+ (Capgo) to Capacitor (Ionic), bumping the version from 8.0.8 to 8.3.0. Key changes include refactoring iOS package manager detection into config-driven promises, enhancing native bridge implementations to handle URL instances, improving SystemBars plugin functionality, adding iOS SPM publishing workflow, and extending test timeouts. Multiple files contain unresolved Git merge conflict markers.

Changes

Cohort / File(s) Summary
Merge Conflicts & Version Updates
CHANGELOG.md, android/CHANGELOG.md, ios/CHANGELOG.md, core/CHANGELOG.md, cli/CHANGELOG.md, lerna.json, package.json
Multiple changelog files contain unresolved merge conflict markers integrating upstream release sections (8.3.0, 8.2.0, 8.1.0, 8.0.2, 8.0.1). Version bumped from 8.0.8 to 8.3.0 in lerna.json. Dev dependency versions updated in package.json.
Package Metadata Migration
android/package.json, ios/package.json, core/package.json, cli/package.json
Package names and metadata migrated from @capacitor-plus/* (Capgo) to @capacitor/* (Ionic). Versions updated to 8.3.0. Homepage, author, and description changed. Peer dependencies adjusted. Merge conflict markers present requiring resolution.
Package Manager Refactoring
cli/src/config.ts, cli/src/definitions.ts, cli/src/ios/build.ts, cli/src/ios/common.ts, cli/src/ios/open.ts, cli/src/ios/run.ts, cli/src/ios/update.ts
Package manager detection refactored from runtime checks to config-driven Promise<PackageManager> approach. Introduced determineCocoapodPath() and determinePackageManager() functions. Updated all iOS build/open/run/update commands to use config.ios.packageManager directly instead of calling checkPackageManager().
Native Bridge URL Handling
core/native-bridge.ts, android/capacitor/src/main/assets/native-bridge.js, ios/Capacitor/Capacitor/assets/native-bridge.js
Enhanced patched window.fetch implementations across platforms to recognize and proxy URL instances in addition to string and Request resources. Proxied URLs are reconstructed and forwarded to platform-specific fetch handlers.
Android Native Implementation
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
Bridge.java now extracts protocol/authority from parsed URL for localUrl. BridgeActivity adds null-safety checks for bridge in lifecycle methods. WebViewLocalServer introduces buildDefaultResponseHeaders() method and deprecates getResponseHeaders(), updates Range request handling with local variable caching, and supports case-insensitive header matching.
SystemBars Plugin Enhancement
android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java, core/src/core-plugins.ts, core/system-bars.md
SystemBars plugin refactored to track and reapply bar styles across configuration changes. Safe-area handling migrated from insets-based to CSS variable injection. Window insets listener reworked with IME visibility detection and WebView version-aware branching. Method signatures updated to make options parameters optional. Documentation clarified for insetsHandling: 'disable' meaning.
iOS Swift Protocol & Type Updates
ios/Capacitor/Capacitor/CAPBridgeProtocol.swift, ios/Capacitor/Capacitor/CAPBridgedJSTypes.h, ios/Capacitor/Capacitor/CAPBridgedJSTypes.m, ios/Capacitor/Capacitor/CapacitorBridge.swift
Deprecated presentVC and dismissVC methods in CAPBridgeProtocol with guidance to use direct view controller methods. Added getArray:defaultValue: method to BridgedJSValueContainer. Deprecated tmpWindow and tmpVCAppeared in CapacitorBridge and removed temporary window presentation logic.
SPM & Configuration Support
cli/src/declarations.ts, cli/src/index.ts, cli/src/util/spm.ts, cli/src/tasks/add.ts, cli/src/tasks/migrate-spm.ts, cli/src/tasks/migrate.ts, cli/src/tasks/update.ts
Added experimental iOS SPM configuration support including swiftToolsVersion and packageTraits. New validation functions checkSwiftToolsVersion() and checkPackageTraitsRequirements(). Refactored task check functions to be async. Updated SPM package generation to use configurable swift tools version and plugin traits. Modified package.json to support tar v7.x.
CLI Command & Task Updates
cli/src/tasks/run.ts, cli/src/tasks/sourcemaps.ts, cli/src/tasks/sync.ts, cli/src/util/livereload.ts, cli/src/util/template.ts
Added https option to RunCommandOptions and updated live-reload URL construction to support optional HTTPS and conditional port inclusion. Extended source-map inlining to .css files in addition to .js. Updated tar import to use named extract export. Modified sync command to await async update checks.
GitHub Workflows
.github/ISSUE_TEMPLATE/config.yml, .github/ISSUE_TEMPLATE/feature-request.yml, .github/ionic-issue-bot.yml, .github/workflows/needs-reply.yml, .github/workflows/publish-ios.yml, .github/workflows/test.yml
Added Feature Request contact link in issue config. Removed feature-request.yml template (migrated to external link). Updated issue-bot deadline from 15 to 7 days. Added new "Close old issues that need reply" workflow. Added iOS library publishing workflow with Cocoapods integration. Extended test job timeouts from 30 to 60 minutes and added iOS simulator/platform setup steps.
Documentation & Templates
ios-spm-template/App/CapApp-SPM/README.md
Updated template documentation wording from "SPM is used" to "package is used".

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Poem

🐰 Hopping through merges with delight,
From Capgo's path to Ionic's light,
Package managers dance and align,
Swift tools bloom and workflows shine,
Eight-three-zero brings the way,
Conflicts resolved—hip hip hooray! 🌟

🚥 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)' directly describes the primary intent of the PR—syncing with upstream while noting the presence of merge conflicts.

✏️ 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-20260411-053055

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: 9af7b02a68

ℹ️ About Codex in GitHub

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

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

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

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

Comment thread cli/package.json
@@ -1,9 +1,17 @@
{
<<<<<<< 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 package manifests

This commit leaves conflict markers in JSON manifests (for example here, and similarly in android/package.json, core/package.json, ios/package.json, and the root package.json), which makes them invalid JSON and causes package-manager/tooling commands to fail before any build or test step can run. In practice, bun install, workspace script execution, and release automation will all fail as soon as these files are parsed.

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 conflict markers in SPM generator source

Unresolved merge markers were committed into this TypeScript file, which makes the CLI source syntactically invalid and prevents the CLI package from compiling. Any workflow that builds or runs the CLI (including iOS/SPM-related commands) will fail until this section is properly merged and the duplicated branch logic is resolved.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 15

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

Caution

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

⚠️ Outside diff range comments (6)
cli/src/tasks/sourcemaps.ts (1)

15-23: ⚠️ Potential issue | 🟠 Major

Prevent accidental .map deletion when no inline replacement occurs

At Line 15 (with the new .css support), Lines 18–23 still delete ${file}.map even if sourceMappingURL=${file}.map is not found. That can leave broken sourcemap references (now for CSS too). Only write/unlink when a replacement actually happens.

Suggested fix
       if ((extname(file) === '.js' || extname(file) === '.css') && existsSync(mapFile)) {
         const bufMap = readFileSync(mapFile).toString('base64');
         const bufFile = readFileSync(targetFile, 'utf8');
+        const sourceMapRef = `sourceMappingURL=${file}.map`;
+        if (!bufFile.includes(sourceMapRef)) {
+          return;
+        }
         const result = bufFile.replace(
-          `sourceMappingURL=${file}.map`,
+          sourceMapRef,
           'sourceMappingURL=data:application/json;charset=utf-8;base64,' + bufMap,
         );
         writeFileSync(targetFile, result);
         unlinkSync(mapFile);
       }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@cli/src/tasks/sourcemaps.ts` around lines 15 - 23, The current logic reads
mapFile and targetFile, performs a .replace and always writes targetFile and
unlinks mapFile even if the original sourceMappingURL wasn't present; change
this to only write and unlink when a replacement actually occurred — e.g., check
if target content (read via readFileSync into bufFile) includes the exact token
`sourceMappingURL=${file}.map` or compare the replaced result to bufFile, and
only call writeFileSync(targetFile, result) and unlinkSync(mapFile) when a real
replacement happened; the relevant symbols to update are extname, existsSync,
readFileSync, writeFileSync, unlinkSync and the replacement logic in the block
handling `.js` and `.css`.
CHANGELOG.md (1)

6-523: ⚠️ Potential issue | 🟠 Major

Don't hand-merge the changelog.

This block still has conflict markers, and CHANGELOG.md should not be resolved by manually stitching the two histories together. Please remove the conflicted/manual edit from the PR and let the release automation regenerate the changelog once the version metadata is clean. 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 CHANGELOG.md contains unresolved
merge conflict markers (e.g. "<<<<<<< HEAD", "=======", ">>>>>>> upstream/main")
and a hand-merged changelog block; remove the manual edits and conflict markers
entirely and restore the file to the state produced by the release automation
(undo the manual merge of the two histories), ensure version metadata in package
manifests is clean so CI can regenerate CHANGELOG.md, and re-run or let CI
regenerate the changelog instead of committing a hand-edited CHANGELOG.md.
android/CHANGELOG.md (1)

6-252: ⚠️ Potential issue | 🟠 Major

Resolve this changelog merge hunk instead of taking one side verbatim.

Lines 6-252 still contain Git conflict markers, and the two sides carry different release history (8.0.8 on the plus branch vs upstream 8.1.0-8.3.0). Merging this as-is corrupts the published changelog, while choosing either side blindly drops the other branch’s entries.

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

In `@android/CHANGELOG.md` around lines 6 - 252, The changelog contains unresolved
git conflict markers (<<<<<<< HEAD / >>>>>>> upstream/main) mixing two release
histories (e.g., versions 8.0.8 on the plus branch and 8.1.0–8.3.0 from
upstream); remove the conflict markers and produce a single coherent changelog
by merging both sides: combine all unique release entries (preserve commits,
PR/issue references and dates), deduplicate overlapping entries, order releases
chronologically or by semantic version (newest first), and ensure headers like
"## [8.x.x] ..." are formatted consistently and no content is lost.
ios/CHANGELOG.md (1)

6-225: ⚠️ Potential issue | 🟠 Major

This top-of-file merge conflict still needs manual reconciliation.

Lines 6-225 contain both the plus-branch 8.0.8 history and upstream 8.0.1-8.3.0 history separated by Git markers. Shipping this file as-is is broken, and resolving it by picking a single side will discard the other branch’s release notes.

🤖 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 file contains an unresolved git
merge conflict with markers <<<<<<< HEAD, =======, >>>>>>> upstream/main mixing
two release histories (e.g., entries for 8.0.8…8.0.3 and 8.3.0/8.2.0/8.1.0);
remove the conflict markers and manually reconcile the two sides by producing a
single coherent changelog: choose whether to merge both histories
(chronologically combine entries, deduplicate repeated sections like "##
[8.0.x]" and keep all commit/PR lines) or pick one branch’s history, then delete
the markers and any duplicated headings (e.g., 8.0.8 vs 8.3.0) so the
top-of-file contains a valid, continuous changelog without git conflict markers.
cli/CHANGELOG.md (1)

6-280: ⚠️ Potential issue | 🟠 Major

Finish the merge here; the changelog history is currently split in two.

Lines 6-280 are still an unresolved conflict between the plus-branch entries and upstream 8.0.1-8.3.0 entries. This should be merged into one coherent history before release; otherwise the file either ships with conflict markers or loses one side’s release notes.

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

In `@cli/CHANGELOG.md` around lines 6 - 280, The changelog contains an unresolved
git merge conflict (markers <<<<<<< HEAD and >>>>>>> upstream/main) between the
plus-branch entries starting with [8.0.8] and the upstream history starting with
[8.3.0]; remove the conflict markers and merge the two histories into a single,
chronological changelog preserving both sets of release sections (e.g., keep
entries for [8.3.0], [8.2.0], [8.1.0], [8.0.8], [8.0.7], etc.), ensure headings
and dates are correct and non-duplicative, and verify the final file has no
remaining conflict markers.
core/CHANGELOG.md (1)

6-159: ⚠️ Potential issue | 🟠 Major

Resolve this changelog conflict block before merging.

The <<<<<<< / ======= / >>>>>>> markers leave the file in a conflicted state, and the inserted release headings use # under the top-level # Change Log, which breaks the heading hierarchy until this block is merged cleanly. Pick the final release entries and normalize the version headings as part of the resolution.

🤖 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, Remove the Git conflict markers
(<<<<<<<, =======, >>>>>>>) and merge the two conflicting blocks by selecting
the correct final release entries (choose between the "## [8.0.8]..." block and
the "# [8.3.0]..." block), deduplicate overlapping release notes (e.g., entries
starting with "## [8.0.8]" / "# [8.3.0]"), and normalize headings so they are
subordinate to the top-level "# Change Log" (use "##" for release versions like
"## [8.3.0]" or "## [8.0.8]"), preserving all relevant changelog content and
links while removing leftover conflict markers such as "<<<<<<< HEAD" and
">>>>>>> upstream/main".
🟡 Minor comments (6)
android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java-131-142 (1)

131-142: ⚠️ Potential issue | 🟡 Minor

Malformed Javadoc HTML tags.

The closing </p> tag on line 137 appears to be a stray tag with no matching opening <p>. This creates malformed Javadoc.

📝 Proposed fix
     /**
      * `@deprecated` This method may return incorrect headers in concurrent range requests.
      * <p>
      * Use {`@link` `#buildDefaultResponseHeaders`()} instead, which returns a copy of the map.
      * </p>
-     * This method will be removed in a future major version of Capacitor.
-     * </p>
+     * <p>
+     * This method will be removed in a future major version of Capacitor.
+     * </p>
      */
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`
around lines 131 - 142, The Javadoc for getResponseHeaders() contains a stray
closing </p> tag causing malformed HTML; edit the Javadoc for the
getResponseHeaders() method to remove the unmatched </p> (or properly pair it by
adding a matching opening <p>), ensure the description references
buildDefaultResponseHeaders() and responseHeaders clearly, and keep the
`@deprecated` block valid so the comment compiles and renders correctly.
.github/workflows/needs-reply.yml-11-16 (1)

11-16: ⚠️ Potential issue | 🟡 Minor

Use ${{ secrets.GITHUB_TOKEN }} instead of ${{ secrets.BOT_TOKEN }}.

The imhoffd/needs-reply@v2 action is valid, but the workflow uses a non-standard custom secret BOT_TOKEN. The action documentation recommends using the built-in ${{ secrets.GITHUB_TOKEN }}, which is automatically available in all GitHub Actions workflows and doesn't require separate repository configuration.

Current code
      - name: Close old issues that need reply
        uses: imhoffd/needs-reply@v2
        with:
          repo-token: ${{ secrets.BOT_TOKEN }}
          issue-label: 'needs reply'
          days-before-close: 7
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/needs-reply.yml around lines 11 - 16, Replace the custom
secret used by the needs-reply action: in the workflow step named "Close old
issues that need reply" (the step that uses imhoffd/needs-reply@v2), change the
input key repo-token from ${{ secrets.BOT_TOKEN }} to the built-in ${{
secrets.GITHUB_TOKEN }} so the action uses the standard GitHub Actions token
without requiring a custom secret.
core/src/core-plugins.ts-113-113 (1)

113-113: ⚠️ Potential issue | 🟡 Minor

Normalize the expires attribute case-insensitively.

Line 113 only strips lowercase expires= from the input. If options.expires contains Expires= (uppercase E), the resulting cookie header becomes expires=Expires=..., which browsers will fail to parse and treat as a session cookie instead of persistent. Use a case-insensitive, start-anchored regex to strip the prefix consistently.

Suggested change
-      const expires = options.expires ? `; expires=${options.expires.replace('expires=', '')}` : '';
+      const expiresValue = options.expires?.trim().replace(/^expires=/i, '');
+      const expires = expiresValue ? `; expires=${expiresValue}` : '';
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@core/src/core-plugins.ts` at line 113, The current normalization for the
cookie expires attribute only strips a lowercase "expires=" and leaves
"Expires=" intact, so update the logic that builds the expires string (variable
expires that uses options.expires) to remove a leading "expires=" prefix in a
case-insensitive, start-anchored way (e.g., replace(/^expires=/i, '') on
options.expires) before concatenating so the header never contains a duplicated
prefix; also trim the result to be safe.
cli/src/declarations.ts-533-535 (1)

533-535: ⚠️ Potential issue | 🟡 Minor

Fix the typo in the new Swift tools warning.

Line 535 says throughrouly; it should be thoroughly.

Suggested fix
-         * If you need to set this property to 6.0 or higher, make sure to throughrouly test your iOS app.
+         * If you need to set this property to 6.0 or higher, make sure to thoroughly test your iOS app.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@cli/src/declarations.ts` around lines 533 - 535, Fix the typo in the Swift
tools warning comment: locate the comment block that begins with "Warning:
Capacitor does not officially support Swift 6 yet." (near the Swift
tools/version property documentation) and change the misspelled word
"throughrouly" to "thoroughly" so the sentence reads "If you need to set this
property to 6.0 or higher, make sure to thoroughly test your iOS app."
cli/src/index.ts-30-37 (1)

30-37: ⚠️ Potential issue | 🟡 Minor

Reject unknown package-manager values instead of silently falling back to SPM.

Any non-cocoapods input here becomes SPM, including typos. That makes add ios --packagemanager ... do the wrong thing without telling the user. Fail fast on unsupported values.

Suggested fix
-async function getPackageManager(config: Config, packageManager: any): Promise<PackageManager> {
+async function getPackageManager(config: Config, packageManager?: string): Promise<PackageManager> {
   if (packageManager === 'cocoapods') {
     if ((await config.ios.packageManager) === 'bundler') {
       return 'bundler';
     }
     return 'Cocoapods';
   }
-  return 'SPM';
+  if (packageManager == null || packageManager === 'spm') {
+    return 'SPM';
+  }
+  fatal(`Unsupported iOS package manager: ${c.input(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 30 - 37, The getPackageManager function
currently maps any non-'cocoapods' input to 'SPM' which hides typos; change
getPackageManager to explicitly accept only known values: if packageManager ===
'cocoapods' use config.ios.packageManager === 'bundler' ? 'bundler' :
'Cocoapods', if packageManager === 'spm' return 'SPM', otherwise throw a clear
error (e.g. throw new Error(`Unsupported package manager: ${packageManager}`))
so callers fail fast; reference getPackageManager and config.ios.packageManager
when implementing the validation and error path.
cli/src/util/spm.ts-223-249 (1)

223-249: ⚠️ Potential issue | 🟡 Minor

Avoid cascading errors for malformed swiftToolsVersion.

checkSwiftToolsVersion() already reports bad formats, but this function parses non-numeric segments as 0 and then emits a second misleading “6.1 or higher” error when packageTraits are present. Bail out when the version string is invalid so users only get the real failure.

Suggested fix
   const versionParts = swiftToolsVersion.split('.').map((part) => parseInt(part, 10));
+  if (versionParts.some((part) => Number.isNaN(part))) {
+    return null;
+  }
   const major = versionParts[0] || 0;
   const minor = versionParts[1] || 0;
🤖 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 223 - 249, The function
checkPackageTraitsRequirements currently parses swiftToolsVersion itself and can
produce a secondary “6.1 or higher” error for malformed versions; instead, call
the existing checkSwiftToolsVersion(swiftToolsVersion) validator early (after
reading swiftToolsVersion and packageTraits) and if checkSwiftToolsVersion
returns a non-null error, bail out (return null) so only the primary format
error is reported; keep the existing numeric version check only for well-formed
versions when checkSwiftToolsVersion passes.
🧹 Nitpick comments (3)
ios/Capacitor/Capacitor/CapacitorBridge.swift (1)

96-99: obsolete symbols are still wired into runtime lifecycle code.

Line 96 and Line 99 mark tmpWindow/tmpVCAppeared obsolete, but init still registers tmpVCAppeared at Line 226 and mutates tmpWindow at Line 227. Consider fully removing this deprecated path to avoid carrying dead presentation state.

♻️ Suggested cleanup
-    `@available`(*, deprecated, message: "obsolete")
-    var tmpWindow: UIWindow?
-    `@available`(*, deprecated, message: "obsolete")
-    static let tmpVCAppeared = Notification(name: Notification.Name(rawValue: "tmpViewControllerAppeared"))
@@
-        observers.append(NotificationCenter.default.addObserver(forName: type(of: self).tmpVCAppeared.name, object: .none, queue: .none) { [weak self] _ in
-            self?.tmpWindow = nil
-        })
🤖 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 runtime presentation path by deleting the deprecated symbols
tmpWindow and tmpVCAppeared and removing their use in the initializer: stop
registering the tmpVCAppeared Notification and stop mutating tmpWindow in init
of CapacitorBridge; instead rely on the current presentation lifecycle (remove
addObserver/postNotification and any tmpWindow assignment/reads), and ensure no
remaining references to tmpWindow or tmpVCAppeared exist (update or delete any
helper methods that referenced tmpWindow/tmpVCAppeared such that lifecycle
behavior is preserved through the modern APIs).
android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java (1)

342-343: Minor: avoid double map lookup for Range header.

The current code calls requestHeaders.get("Range") twice when the header exists. This can be simplified.

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

In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`
around lines 342 - 343, The code in WebViewLocalServer.java does a double map
lookup when populating rangeString from request.getRequestHeaders(); fix by
retrieving the map once (already in requestHeaders) and then performing a single
lookup: get the "Range" value into a temporary (or use Map.getOrDefault by
calling requestHeaders.getOrDefault("Range", requestHeaders.get("range"))) or
assign requestHeaders.get("Range") to rangeString and only if null assign
requestHeaders.get("range"); update the logic that sets rangeString accordingly
to avoid calling requestHeaders.get("Range") twice.
.github/workflows/needs-reply.yml (1)

1-9: Consider renaming the job for clarity.

The job name build is misleading since this workflow closes stale issues rather than building anything. Consider a more descriptive name like close-stale-issues or needs-reply-cleanup.

📝 Proposed job name improvement
 jobs:
-  build:
+  close-stale-issues:
     runs-on: ubuntu-latest
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/needs-reply.yml around lines 1 - 9, Rename the misleading
job identifier "build" to a descriptive name such as "close-stale-issues" (or
"needs-reply-cleanup") in the workflow file so the job intent matches the
workflow title; update the job key used under "jobs:" (currently "build") to the
new identifier and ensure any internal references to that job name (if present)
are updated accordingly so the workflow remains valid.
🤖 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 hard-codes ref: 'main', which
forces publishing main regardless of trigger; update the actions/checkout@v5
step (the ref: 'main' setting) to accept the intended ref from the workflow
inputs or to use the runtime revision (e.g. ${{ github.sha }}) so the
checked-out revision matches the caller or manual workflow_dispatch trigger—add
an input (e.g. publish_ref) to the reusable workflow and substitute that input
or github.sha for the ref value in the actions/checkout step.

In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`:
- Line 280: The call to setBackgroundColor is passing a drawable resource id
because getThemeColor(getContext(), android.R.attr.windowBackground) reads
TypedValue.data without checking type; update the code in SystemBars to detect
attribute type in getThemeColor (or add a new helper) and either (1) resolve a
color-specific attribute (e.g., use a color attr like
android.R.attr.colorBackground or android.R.attr.windowBackgroundColor) and
fetch the actual color, or (2) if the attribute is a reference/type drawable,
resolve the drawable with ContextCompat.getDrawable/getResources().getDrawable
and call getDecorView().setBackground(drawable) instead of setBackgroundColor;
adjust references to getThemeColor(...) and the call to
getActivity().getWindow().getDecorView().setBackgroundColor(...) accordingly so
only a true color int is passed to setBackgroundColor.

In `@android/package.json`:
- Around line 2-14: The package.json contains Git conflict markers and duplicate
fields (e.g., "name", "version", "description", "homepage", "author") causing
invalid JSON; remove the conflict markers (<<<<<<<, =======, >>>>>>>) and choose
a single coherent set of metadata values for those keys so only one "name",
"version", "description", "homepage", and "author" remain, then ensure JSON
syntax is valid (commas/quotes) and update any dependent peer-dependency blocks
referenced in the same file (lines ~34-39) to match the chosen metadata set.

In `@cli/package.json`:
- Around line 2-14: The package.json currently contains unresolved Git conflict
markers between two package identities; remove the conflict markers and choose
which identity to keep by selecting the desired values for "name", "version",
"description", "homepage", and "author" (either the Capacitor+ values or the
upstream Capacitor values), ensure the final file is valid JSON (no <<<<<<<,
=======, >>>>>>> lines) and that all commas/quotes are correct, and then run npm
install to verify parsing; update the chosen "name" and accompanying metadata
consistently so the package identity is intentional and valid.

In `@cli/src/config.ts`:
- Around line 469-475: The code currently uses isInstalled('bundle') to decide
the package manager even when gem 'cocoapods' is present; instead, if
cocoapodsInGemfile (the RegExp test result) is true you should unconditionally
return 'bundler' so downstream checkBundler() can detect and surface a missing
Bundler dependency; remove the isInstalled('bundle') condition from the branch
that returns 'bundler' (leave the alternative return 'Cocoapods' only when
gemfile does not contain cocoapods).

In `@cli/src/ios/update.ts`:
- Around line 133-140: The availability check uses the literal 'pod' instead of
the configured podPath, so if config.ios.podPath points to a custom executable
CocoaPods will be incorrectly skipped; change the isInstalled check to test the
resolved podPath (await config.ios.podPath or podPath variable) rather than the
hardcoded 'pod' so the branch that calls runCommand(podPath, ['install', ...])
runs when the configured binary is present; update the call site that currently
calls isInstalled('pod') to isInstalled(podPath) and keep using
runCommand(podPath, ...) and the existing deployment flag handling.

In `@cli/src/tasks/migrate-spm.ts`:
- Around line 19-26: The migration is skipping SPM validation because
getCommonChecks(config) runs while config still reports the old package manager;
set the in-memory config's iOS packageManager to 'SPM' before running
getCommonChecks so SPM checks are applied. Concretely, cast config to
Writable<Config> (like configWritable), assign configWritable.ios.packageManager
= Promise.resolve('SPM') immediately before calling check(await
getCommonChecks(config)), then proceed with extractSPMPackageDirectory,
runCocoapodsDeintegrate, removeCocoapodsFiles, addInfoPlistDebugIfNeeded and the
existing update call.

In `@cli/src/tasks/run.ts`:
- Around line 46-48: The current check in run.ts skips setting a default port
when HTTPS is enabled, causing live-reload URLs to omit :3000; change the logic
to set options.port = '3000' whenever options.port is falsy (do not gate on
options.https) so the URL construction in run.ts (around the host/port assembly)
and cli/src/util/livereload.ts always see a defined port for live-reload; update
the code path that currently checks "!options.https && !options.port" to simply
check "!options.port" (and ensure any code that relies on options.port uses it
as a string).

In `@cli/src/util/spm.ts`:
- Around line 100-108: This file contains unresolved Git merge markers around
the SPM package setup; remove the conflict markers and reconcile the two
variants so the code compiles. Replace the entire conflict block with the
intended version that defines iosVersion (use getMajoriOSVersion or
getMajorMinoriOSVersion consistently), and include the new SPM variables
packageTraits and swiftToolsVersion (and their default values) before building
packageSwiftText; ensure references to iosVersion, packageTraits,
swiftToolsVersion, and packageSwiftText are all declared exactly once and the
merge markers (<<<<<<<, =======, >>>>>>>) are deleted.

In `@core/package.json`:
- Around line 2-14: The package.json is left with unresolved git conflict
markers around the manifest fields; remove the conflict markers (<<<<<<<,
=======, >>>>>>>) and choose a single authoritative set of values for the JSON
keys "name", "version", "description", "homepage", and "author" so the file
becomes valid JSON and matches the intended package identity across the repo;
ensure the chosen "name" value (either "@capacitor-plus/core" or
"@capacitor/core") is propagated consistently with the rest of the manifest and
package references, then run a JSON lint or npm install to verify the file
parses.

In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m`:
- Line 32: The method implementation for getArray:defaultValue: contains a stray
semicolon before the opening brace which breaks Objective-C syntax; open the
implementation for - (NSArray * _Nullable)getArray:(NSString * _Nonnull)key
defaultValue:(NSArray * _Nullable)defaultValue and remove the extraneous
semicolon so the signature is immediately followed by the {, keeping the rest of
the method body unchanged.

In `@ios/package.json`:
- Around line 2-14: The package.json contains unresolved git conflict markers
(<<<<<<< HEAD / >>>>>>> upstream/main) that make the file invalid JSON; open
package.json, remove the conflict markers and choose a consistent set of fields
(e.g., decide final values for "name", "version", "description", "homepage",
"author" and the conflicting peerDependencies around lines 36-41), then save a
single valid JSON object (no markers) so npm can parse it; ensure the chosen
"name"/"version"/peerDependencies align with your intended package (either
`@capacitor-plus/ios` or `@capacitor/ios`) and run a quick JSON lint or npm install
to verify.

In `@lerna.json`:
- Around line 16-20: Remove the Git conflict markers and restore a single valid
"version" entry in lerna.json; replace the conflict block containing <<<<<<<
HEAD / ======= / >>>>>>> upstream/main with a single JSON property "version":
"8.3.0" (or whichever canonical release version you intend) so the file is valid
JSON and Lerna can read the repository version; ensure only one "version" key
remains and the surrounding JSON stays syntactically correct.

In `@package.json`:
- Around line 50-55: The prettier npm script currently invokes the package
"prettier-pretty-check" but the dependency was removed in the merge; either
restore the devDependency "prettier-pretty-check" in package.json or change the
"prettier" script to use the standard "prettier --check" command. Locate the
"prettier" script in package.json and either add "prettier-pretty-check":
"^0.2.0" back under devDependencies or replace the script value to "prettier
--check" so the script and dependencies stay consistent.
- Around line 35-55: Resolve the merge conflict in package.json by removing the
Git conflict markers (<<<<<<<, =======, >>>>>>>) and producing a valid
dependencies/devDependencies block; decide which versions to keep for the
conflicting entries (e.g., `@types/node`, eslint, tar, and whether to include
`@types/tar` and prettier-pretty-check) and update the JSON so keys are unique and
properly comma-separated, ensuring package.json parses (no leftover conflict
markers, valid JSON syntax) and that entries like "@types/node", "eslint",
"tar", "@types/tar", and "prettier-pretty-check" appear exactly once with the
chosen version strings.

---

Outside diff comments:
In `@android/CHANGELOG.md`:
- Around line 6-252: The changelog contains unresolved git conflict markers
(<<<<<<< HEAD / >>>>>>> upstream/main) mixing two release histories (e.g.,
versions 8.0.8 on the plus branch and 8.1.0–8.3.0 from upstream); remove the
conflict markers and produce a single coherent changelog by merging both sides:
combine all unique release entries (preserve commits, PR/issue references and
dates), deduplicate overlapping entries, order releases chronologically or by
semantic version (newest first), and ensure headers like "## [8.x.x] ..." are
formatted consistently and no content is lost.

In `@CHANGELOG.md`:
- Around line 6-523: The CHANGELOG.md contains unresolved merge conflict markers
(e.g. "<<<<<<< HEAD", "=======", ">>>>>>> upstream/main") and a hand-merged
changelog block; remove the manual edits and conflict markers entirely and
restore the file to the state produced by the release automation (undo the
manual merge of the two histories), ensure version metadata in package manifests
is clean so CI can regenerate CHANGELOG.md, and re-run or let CI regenerate the
changelog instead of committing a hand-edited CHANGELOG.md.

In `@cli/CHANGELOG.md`:
- Around line 6-280: The changelog contains an unresolved git merge conflict
(markers <<<<<<< HEAD and >>>>>>> upstream/main) between the plus-branch entries
starting with [8.0.8] and the upstream history starting with [8.3.0]; remove the
conflict markers and merge the two histories into a single, chronological
changelog preserving both sets of release sections (e.g., keep entries for
[8.3.0], [8.2.0], [8.1.0], [8.0.8], [8.0.7], etc.), ensure headings and dates
are correct and non-duplicative, and verify the final file has no remaining
conflict markers.

In `@cli/src/tasks/sourcemaps.ts`:
- Around line 15-23: The current logic reads mapFile and targetFile, performs a
.replace and always writes targetFile and unlinks mapFile even if the original
sourceMappingURL wasn't present; change this to only write and unlink when a
replacement actually occurred — e.g., check if target content (read via
readFileSync into bufFile) includes the exact token
`sourceMappingURL=${file}.map` or compare the replaced result to bufFile, and
only call writeFileSync(targetFile, result) and unlinkSync(mapFile) when a real
replacement happened; the relevant symbols to update are extname, existsSync,
readFileSync, writeFileSync, unlinkSync and the replacement logic in the block
handling `.js` and `.css`.

In `@core/CHANGELOG.md`:
- Around line 6-159: Remove the Git conflict markers (<<<<<<<, =======, >>>>>>>)
and merge the two conflicting blocks by selecting the correct final release
entries (choose between the "## [8.0.8]..." block and the "# [8.3.0]..." block),
deduplicate overlapping release notes (e.g., entries starting with "## [8.0.8]"
/ "# [8.3.0]"), and normalize headings so they are subordinate to the top-level
"# Change Log" (use "##" for release versions like "## [8.3.0]" or "##
[8.0.8]"), preserving all relevant changelog content and links while removing
leftover conflict markers such as "<<<<<<< HEAD" and ">>>>>>> upstream/main".

In `@ios/CHANGELOG.md`:
- Around line 6-225: The file contains an unresolved git merge conflict with
markers <<<<<<< HEAD, =======, >>>>>>> upstream/main mixing two release
histories (e.g., entries for 8.0.8…8.0.3 and 8.3.0/8.2.0/8.1.0); remove the
conflict markers and manually reconcile the two sides by producing a single
coherent changelog: choose whether to merge both histories (chronologically
combine entries, deduplicate repeated sections like "## [8.0.x]" and keep all
commit/PR lines) or pick one branch’s history, then delete the markers and any
duplicated headings (e.g., 8.0.8 vs 8.3.0) so the top-of-file contains a valid,
continuous changelog without git conflict markers.

---

Minor comments:
In @.github/workflows/needs-reply.yml:
- Around line 11-16: Replace the custom secret used by the needs-reply action:
in the workflow step named "Close old issues that need reply" (the step that
uses imhoffd/needs-reply@v2), change the input key repo-token from ${{
secrets.BOT_TOKEN }} to the built-in ${{ secrets.GITHUB_TOKEN }} so the action
uses the standard GitHub Actions token without requiring a custom secret.

In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`:
- Around line 131-142: The Javadoc for getResponseHeaders() contains a stray
closing </p> tag causing malformed HTML; edit the Javadoc for the
getResponseHeaders() method to remove the unmatched </p> (or properly pair it by
adding a matching opening <p>), ensure the description references
buildDefaultResponseHeaders() and responseHeaders clearly, and keep the
`@deprecated` block valid so the comment compiles and renders correctly.

In `@cli/src/declarations.ts`:
- Around line 533-535: Fix the typo in the Swift tools warning comment: locate
the comment block that begins with "Warning: Capacitor does not officially
support Swift 6 yet." (near the Swift tools/version property documentation) and
change the misspelled word "throughrouly" to "thoroughly" so the sentence reads
"If you need to set this property to 6.0 or higher, make sure to thoroughly test
your iOS app."

In `@cli/src/index.ts`:
- Around line 30-37: The getPackageManager function currently maps any
non-'cocoapods' input to 'SPM' which hides typos; change getPackageManager to
explicitly accept only known values: if packageManager === 'cocoapods' use
config.ios.packageManager === 'bundler' ? 'bundler' : 'Cocoapods', if
packageManager === 'spm' return 'SPM', otherwise throw a clear error (e.g. throw
new Error(`Unsupported package manager: ${packageManager}`)) so callers fail
fast; reference getPackageManager and config.ios.packageManager when
implementing the validation and error path.

In `@cli/src/util/spm.ts`:
- Around line 223-249: The function checkPackageTraitsRequirements currently
parses swiftToolsVersion itself and can produce a secondary “6.1 or higher”
error for malformed versions; instead, call the existing
checkSwiftToolsVersion(swiftToolsVersion) validator early (after reading
swiftToolsVersion and packageTraits) and if checkSwiftToolsVersion returns a
non-null error, bail out (return null) so only the primary format error is
reported; keep the existing numeric version check only for well-formed versions
when checkSwiftToolsVersion passes.

In `@core/src/core-plugins.ts`:
- Line 113: The current normalization for the cookie expires attribute only
strips a lowercase "expires=" and leaves "Expires=" intact, so update the logic
that builds the expires string (variable expires that uses options.expires) to
remove a leading "expires=" prefix in a case-insensitive, start-anchored way
(e.g., replace(/^expires=/i, '') on options.expires) before concatenating so the
header never contains a duplicated prefix; also trim the result to be safe.

---

Nitpick comments:
In @.github/workflows/needs-reply.yml:
- Around line 1-9: Rename the misleading job identifier "build" to a descriptive
name such as "close-stale-issues" (or "needs-reply-cleanup") in the workflow
file so the job intent matches the workflow title; update the job key used under
"jobs:" (currently "build") to the new identifier and ensure any internal
references to that job name (if present) are updated accordingly so the workflow
remains valid.

In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`:
- Around line 342-343: The code in WebViewLocalServer.java does a double map
lookup when populating rangeString from request.getRequestHeaders(); fix by
retrieving the map once (already in requestHeaders) and then performing a single
lookup: get the "Range" value into a temporary (or use Map.getOrDefault by
calling requestHeaders.getOrDefault("Range", requestHeaders.get("range"))) or
assign requestHeaders.get("Range") to rangeString and only if null assign
requestHeaders.get("range"); update the logic that sets rangeString accordingly
to avoid calling requestHeaders.get("Range") twice.

In `@ios/Capacitor/Capacitor/CapacitorBridge.swift`:
- Around line 96-99: Remove the obsolete runtime presentation path by deleting
the deprecated symbols tmpWindow and tmpVCAppeared and removing their use in the
initializer: stop registering the tmpVCAppeared Notification and stop mutating
tmpWindow in init of CapacitorBridge; instead rely on the current presentation
lifecycle (remove addObserver/postNotification and any tmpWindow
assignment/reads), and ensure no remaining references to tmpWindow or
tmpVCAppeared exist (update or delete any helper methods that referenced
tmpWindow/tmpVCAppeared such that lifecycle behavior is preserved through the
modern APIs).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 3731ee7b-2368-4333-8de4-4c06571f811d

📥 Commits

Reviewing files that changed from the base of the PR and between cbf464f and 9af7b02.

📒 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 | head -50

Repository: Cap-go/capacitor-plus

Length of output: 1062


🏁 Script executed:

rg "publish-ios" .github/workflows/ --type yaml

Repository: Cap-go/capacitor-plus

Length of output: 113


🏁 Script executed:

rg "uses:.*publish-ios|\.\.\/publish-ios" .github/workflows/ --type yaml

Repository: Cap-go/capacitor-plus

Length of output: 190


🏁 Script executed:

rg "uses:.*publish-ios" .github/workflows/ --type yaml

Repository: Cap-go/capacitor-plus

Length of output: 47


🏁 Script executed:

rg "publish-ios" .github/ -t yaml

Repository: Cap-go/capacitor-plus

Length of output: 113


🏁 Script executed:

fd -e yml -e yaml .github/workflows/ | xargs grep -l "uses:" | head -5

Repository: Cap-go/capacitor-plus

Length of output: 442


🏁 Script executed:

fd . '.github/workflows' -e yml -e yaml | xargs grep -l "uses:"

Repository: Cap-go/capacitor-plus

Length of output: 381


🏁 Script executed:

fd . '.github/workflows' -e yml -e yaml | xargs grep "publish-ios"

Repository: Cap-go/capacitor-plus

Length of output: 113


🌐 Web query:

GitHub Actions workflow_call reusable workflow checkout ref hard-coded main behavior

💡 Result:

In GitHub Actions, when using the actions/checkout action without specifying a ref in a reusable workflow triggered by workflow_call, it defaults to checking out the repository's default branch (typically main or master), rather than the branch or ref from the caller workflow's event context. This occurs because the github context in the called reusable workflow may not preserve the exact triggering ref from the caller, particularly for events like pull requests where github.ref resolves to refs/heads/main (the base branch). The actions/checkout action uses the github context to determine the ref when none is provided explicitly: if it's not the triggering repository's event ref, it falls back to the default branch. This behavior is documented in the actions/checkout README and action.yml: "When checking out the repository that triggered a workflow, this defaults to the reference or SHA for that event. Otherwise, uses the default branch." In reusable workflows, the context inheritance leads to the "otherwise" case, causing checkout of main. The issue persists as of 2026 (Issue #1418 in actions/checkout remains open), affecting versions like v3, v4, and v6. Workarounds: - Explicitly pass the ref as an input to the reusable workflow from the caller, e.g.: Caller: jobs: call-reusable: uses: ./.github/workflows/reusable.yml with: ref: ${{ github.ref_name }} Reusable (define input): on: workflow_call: inputs: ref: type: string jobs: build: steps: - uses: actions/checkout@v4 with: ref: ${{ inputs.ref }} - Use ${{ github.sha }} for the commit SHA (works across contexts). - For PRs: ref: ${{ github.head_ref || github.ref_name }} or ref: ${{ github.event.pull_request.head.sha }}. Official docs confirm github context is associated with the caller workflow, but practical behavior shows ref mismatch in called workflows (GitHub Issue #1418, multiple confirmations up to 2025).

Citations:


Don't hard-code ref: 'main' in the publish checkout.

This workflow is reusable and accepts manual triggers via workflow_dispatch. Hard-coding ref: 'main' at line 24 forces the checkout to main regardless of the triggering ref, so a manual publish from another branch/tag will ship the wrong code. Either pass the ref explicitly as an input parameter from the caller, or use ${{ github.sha }} to ensure the correct revision is published.

🤖 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 hard-codes ref: 'main', which forces publishing main regardless of
trigger; update the actions/checkout@v5 step (the ref: 'main' setting) to accept
the intended ref from the workflow inputs or to use the runtime revision (e.g.
${{ github.sha }}) so the checked-out revision matches the caller or manual
workflow_dispatch trigger—add an input (e.g. publish_ref) to the reusable
workflow and substitute that input or github.sha for the ref value in the
actions/checkout step.

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" -path "*/android/**"

Repository: Cap-go/capacitor-plus

Length of output: 138


🏁 Script executed:

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

Repository: Cap-go/capacitor-plus

Length of output: 142


🏁 Script executed:

sed -n '275,285p' ./android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java

Repository: Cap-go/capacitor-plus

Length of output: 658


🏁 Script executed:

sed -n '308,325p' ./android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java

Repository: Cap-go/capacitor-plus

Length of output: 712


🏁 Script executed:

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

Repository: Cap-go/capacitor-plus

Length of output: 264


🏁 Script executed:

sed -n '310,325p' ./android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java

Repository: Cap-go/capacitor-plus

Length of output: 670


🏁 Script executed:

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

Repository: Cap-go/capacitor-plus

Length of output: 264


🏁 Script executed:

grep -B2 -A2 "getThemeColor" ./android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java

Repository: Cap-go/capacitor-plus

Length of output: 335


🏁 Script executed:

grep -n "setBackgroundColor\|windowBackground" ./android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java

Repository: Cap-go/capacitor-plus

Length of output: 199


🌐 Web query:

android.R.attr.windowBackground drawable color attribute type

💡 Result:

The android.R.attr.windowBackground attribute is a reference to a drawable resource that sets the background of the window. It accepts drawable resources, which can include color drawables (solid colors), but its defined type is a drawable reference, not strictly a color.

Citations:


windowBackground attribute resolves to a drawable resource, not a color int. Use a color-only attribute or handle drawable resolution.

The getThemeColor() method returns typedValue.data without checking the attribute type. When android.R.attr.windowBackground resolves to a drawable resource (common in themed apps), passing its resource ID to setBackgroundColor() produces incorrect results—the color is set to an arbitrary resource ID rather than the intended background. Either resolve a color-specific attribute (like android.R.attr.windowBackgroundColor) or handle drawable resources explicitly.

🤖 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 to setBackgroundColor is passing a drawable resource id
because getThemeColor(getContext(), android.R.attr.windowBackground) reads
TypedValue.data without checking type; update the code in SystemBars to detect
attribute type in getThemeColor (or add a new helper) and either (1) resolve a
color-specific attribute (e.g., use a color attr like
android.R.attr.colorBackground or android.R.attr.windowBackgroundColor) and
fetch the actual color, or (2) if the attribute is a reference/type drawable,
resolve the drawable with ContextCompat.getDrawable/getResources().getDrawable
and call getDecorView().setBackground(drawable) instead of setBackgroundColor;
adjust references to getThemeColor(...) and the call to
getActivity().getWindow().getDecorView().setBackgroundColor(...) accordingly so
only a true color int is passed to setBackgroundColor.

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 the merge conflict; this file is currently invalid JSON.

This manifest still contains Git conflict markers, so package parsing fails before the Android verification script can even run. Remove the markers and keep a single coherent metadata/peer-dependency definition here.

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, The package.json contains Git
conflict markers and duplicate fields (e.g., "name", "version", "description",
"homepage", "author") causing invalid JSON; remove the conflict markers
(<<<<<<<, =======, >>>>>>>) and choose a single coherent set of metadata values
for those keys so only one "name", "version", "description", "homepage", and
"author" remain, then ensure JSON syntax is valid (commas/quotes) and update any
dependent peer-dependency blocks referenced in the same file (lines ~34-39) to
match the chosen metadata set.

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

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Resolve the merge block and choose one package identity.

This file is still invalid JSON, so npm install cannot run. Also, the two sides of the conflict change the published package identity in opposite directions, so the resolution needs to be intentional rather than just deleting markers.

🧰 Tools
🪛 Biome (2.4.10)

[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


[error] 2-2: unexpected character <

(parse)


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

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 3-3: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 4-4: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 5-5: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 6-6: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-7: End of file expected

(parse)


[error] 7-8: End of file expected

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 8-8: unexpected character =

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 9-9: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 10-10: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 11-11: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 12-12: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-13: End of file expected

(parse)


[error] 13-14: End of file expected

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character >

(parse)


[error] 14-14: unexpected character /

(parse)

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

In `@cli/package.json` around lines 2 - 14, The package.json currently contains
unresolved Git conflict markers between two package identities; remove the
conflict markers and choose which identity to keep by selecting the desired
values for "name", "version", "description", "homepage", and "author" (either
the Capacitor+ values or the upstream Capacitor values), ensure the final file
is valid JSON (no <<<<<<<, =======, >>>>>>> lines) and that all commas/quotes
are correct, and then run npm install to verify parsing; update the chosen
"name" and accompanying metadata consistently so the package identity is
intentional and valid.

Comment thread cli/src/config.ts
Comment on lines 469 to 475
const cocoapodsInGemfile = new RegExp(/gem\s+['"]cocoapods/).test(gemfileText);

if (cocoapodsInGemfile) {
return 'bundle exec pod';
if (cocoapodsInGemfile && (await isInstalled('bundle'))) {
return 'bundler';
} else {
return 'pod';
return 'Cocoapods';
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Don’t use local bundle availability to infer the project’s package manager.

A repo with gem 'cocoapods' in its Gemfile is still Bundler-managed even on a clean machine where bundle is not installed yet. Returning 'Cocoapods' here means downstream code will skip checkBundler() and run pod directly instead of surfacing the missing Bundler prerequisite.

Suggested fix
-    if (cocoapodsInGemfile && (await isInstalled('bundle'))) {
+    if (cocoapodsInGemfile) {
       return 'bundler';
     } else {
       return 'Cocoapods';
     }
📝 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
const cocoapodsInGemfile = new RegExp(/gem\s+['"]cocoapods/).test(gemfileText);
if (cocoapodsInGemfile) {
return 'bundle exec pod';
if (cocoapodsInGemfile && (await isInstalled('bundle'))) {
return 'bundler';
} else {
return 'pod';
return 'Cocoapods';
}
const cocoapodsInGemfile = new RegExp(/gem\s+['"]cocoapods/).test(gemfileText);
if (cocoapodsInGemfile) {
return 'bundler';
} else {
return 'Cocoapods';
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@cli/src/config.ts` around lines 469 - 475, The code currently uses
isInstalled('bundle') to decide the package manager even when gem 'cocoapods' is
present; instead, if cocoapodsInGemfile (the RegExp test result) is true you
should unconditionally return 'bundler' so downstream checkBundler() can detect
and surface a missing Bundler dependency; remove the isInstalled('bundle')
condition from the branch that returns 'bundler' (leave the alternative return
'Cocoapods' only when gemfile does not contain cocoapods).

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 no Objective-C method implementations contain a semicolon before the opening brace.
# Expected result: no matches.
rg -nP '^\s*-\s*\([^)]*\)\s*[^;{]+;\s*\{' --iglob '*.m'

Repository: Cap-go/capacitor-plus

Length of output: 218


Remove the stray semicolon in method implementation (compile blocker).

Line 32 has invalid Objective-C syntax: the method implementation includes ; before {, which will fail 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:defaultValue: contains a stray semicolon before the
opening brace which breaks Objective-C syntax; open the implementation for -
(NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray *
_Nullable)defaultValue and remove the extraneous semicolon so the signature is
immediately followed by the {, keeping the rest of the method body unchanged.

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 the merge conflict; this file is currently invalid JSON.

npm install is already failing with EJSONPARSE because the conflict markers split both the package metadata and peerDependencies. Remove the markers and keep one consistent package identity/version/peer-dependency set before merging.

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 (<<<<<<< HEAD / >>>>>>> upstream/main) that make the file
invalid JSON; open package.json, remove the conflict markers and choose a
consistent set of fields (e.g., decide final values for "name", "version",
"description", "homepage", "author" and the conflicting peerDependencies around
lines 36-41), then save a single valid JSON object (no markers) so npm can parse
it; ensure the chosen "name"/"version"/peerDependencies align with your intended
package (either `@capacitor-plus/ios` or `@capacitor/ios`) and run a quick JSON lint
or npm install to verify.

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 the leftover merge block.

Lines 16-20 still contain Git conflict markers, so lerna.json is invalid JSON and Lerna cannot read the repository version from it.

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

[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


[error] 16-16: unexpected character <

(parse)


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

(parse)


[error] 17-17: End of file expected

(parse)


[error] 17-17: End of file expected

(parse)


[error] 17-17: End of file expected

(parse)


[error] 17-18: End of file expected

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 18-18: unexpected character =

(parse)


[error] 19-19: End of file expected

(parse)


[error] 19-19: End of file expected

(parse)


[error] 19-19: End of file expected

(parse)


[error] 19-20: End of file expected

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character >

(parse)


[error] 20-20: unexpected character /

(parse)

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

In `@lerna.json` around lines 16 - 20, Remove the Git conflict markers and restore
a single valid "version" entry in lerna.json; replace the conflict block
containing <<<<<<< HEAD / ======= / >>>>>>> upstream/main with a single JSON
property "version": "8.3.0" (or whichever canonical release version you intend)
so the file is valid JSON and Lerna can read the repository version; ensure only
one "version" key remains and the surrounding JSON stays syntactically correct.

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 is still conflicted and won't parse.

The merge markers in Lines 35-55 make the root manifest invalid JSON. That matches the current CI failure (npm installEJSONPARSE), so nothing downstream can run until this block is resolved.

Suggested fix
-<<<<<<< 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
+    "@types/node": "<resolved-version>",
+    "@types/tar": "<keep-or-remove-intentionally>",
+    "eslint": "<resolved-version>",
+    "eslint-plugin-import": "<keep-or-remove-intentionally>",
...
-<<<<<<< HEAD
-    "tar": "^6.1.11",
-    "prettier-pretty-check": "^0.2.0"
-=======
-    "tar": "^7.5.3"
->>>>>>> upstream/main
+    "tar": "<resolved-version>",
+    "prettier-pretty-check": "<keep-or-remove-intentionally>"
🧰 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, Resolve the merge conflict in
package.json by removing the Git conflict markers (<<<<<<<, =======, >>>>>>>)
and producing a valid dependencies/devDependencies block; decide which versions
to keep for the conflicting entries (e.g., `@types/node`, eslint, tar, and whether
to include `@types/tar` and prettier-pretty-check) and update the JSON so keys are
unique and properly comma-separated, ensuring package.json parses (no leftover
conflict markers, valid JSON syntax) and that entries like "@types/node",
"eslint", "tar", "@types/tar", and "prettier-pretty-check" appear exactly once
with the chosen version strings.

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -e
echo "Checking root script usage:"
rg -n '"prettier"\s*:\s*".*prettier-pretty-check' package.json

echo
echo "Checking whether the dependency is still declared:"
rg -n '"prettier-pretty-check"\s*:' package.json

Repository: Cap-go/capacitor-plus

Length of output: 294


Don't drop prettier-pretty-check unless Line 22 is updated too.

Line 22 defines a script that calls prettier-pretty-check, which is currently declared as a devDependency on line 52. If you take the upstream/main resolution (removing the dependency), the npm run prettier command will fail. Either keep the devDependency or switch the script to plain prettier --check.

🧰 Tools
🪛 Biome (2.4.10)

[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 prettier npm script currently invokes
the package "prettier-pretty-check" but the dependency was removed in the merge;
either restore the devDependency "prettier-pretty-check" in package.json or
change the "prettier" script to use the standard "prettier --check" command.
Locate the "prettier" script in package.json and either add
"prettier-pretty-check": "^0.2.0" back under devDependencies or replace the
script value to "prettier --check" so the script and dependencies stay
consistent.

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.