chore: sync plus with upstream main (conflicts)#56
Conversation
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: 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>
Closes ionic-team#8367 Fixes regression introduced by ionic-team#8357
…onic-team#8391) Co-authored-by: Pedro Bilro <pedro.gustavo.bilro@outsystems.com>
…eam#8377) Co-authored-by: jcesarmobile <jcesarmobile@gmail.com>
…ic-team#8351) Co-authored-by: OS-pedrogustavobilro <pedro.gustavo.bilro@outsystems.com>
Co-authored-by: OS-ruimoreiramendes <rui.moreira.mendes@outsystems.com>
Co-authored-by: OS-ruimoreiramendes <rui.moreira.mendes@outsystems.com> Co-authored-by: Pedro Bilro <pedro.gustavo.bilro@outsystems.com>
📝 WalkthroughWalkthroughThis PR merges upstream Capacitor v8.3.1 changes into the fork, transitioning from Changes
Estimated code review effort🎯 5 (Critical) | ⏱️ 90+ minutes Possibly related issues
Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3bba479212
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
|
||
| export async function generatePackageText(config: Config, plugins: Plugin[]): Promise<string> { | ||
| const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name); | ||
| <<<<<<< HEAD |
There was a problem hiding this comment.
Remove merge markers from SPM package generation
The committed conflict markers in generatePackageText make cli/src/util/spm.ts invalid TypeScript, so any command path that compiles or imports this file will fail before execution (for example bun run build / tsc). This is a hard parse error, not a runtime edge case, and blocks all iOS SPM-related CLI flows until the merge is resolved.
Useful? React with 👍 / 👎.
| "@ionic/eslint-config": "^0.4.0", | ||
| "@ionic/prettier-config": "^4.0.0", | ||
| "@ionic/swiftlint-config": "^2.0.0", | ||
| <<<<<<< HEAD |
There was a problem hiding this comment.
Resolve conflict markers in package manifests
This commit leaves unresolved merge markers in JSON manifests, making them unparsable (starting here in root package.json, and similarly in lerna.json, cli/package.json, android/package.json, ios/package.json, and core/package.json). Package tooling that reads these files (bun install, npm, release/version scripts) will fail immediately with JSON parse errors, so the repository cannot be built or published until these conflicts are removed.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 19
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (5)
android/CHANGELOG.md (1)
6-260:⚠️ Potential issue | 🟠 MajorFinish resolving this changelog merge.
This section still contains conflict markers and two incompatible histories. Merging it as-is would publish contradictory release notes for the same slot and makes it clear the upstream sync was not fully resolved.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@android/CHANGELOG.md` around lines 6 - 260, The changelog contains unresolved git conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) and two different release histories (e.g., the "## [8.0.8]" block and the "## [8.3.1]" / "## [8.3.0]" blocks). Remove the conflict markers and reconcile the two histories by keeping the intended canonical history: either retain the local "## [8.0.8]" entries or replace them with the upstream "## [8.3.1]/8.3.0" section (or merge their entries into a single chronological release list), ensuring only one coherent set of release headings remains; verify headings like "## [8.0.8]" and "## [8.3.1]" are in proper order, remove duplicate/redundant entries, and save the file with no conflict markers before committing.core/CHANGELOG.md (1)
6-163:⚠️ Potential issue | 🟠 MajorResolve the conflicting release-history block.
This file still has raw merge markers and mixed fork/upstream entries at the top, so the changelog is currently self-contradictory rather than a single resolved history.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@core/CHANGELOG.md` around lines 6 - 163, The file contains unresolved git merge markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) mixing two changelog histories; open core/CHANGELOG.md, remove the conflict markers and the duplicated block you don't want, and produce a single coherent release-history section (either keep the HEAD block or the upstream/main block) ensuring headings (e.g., "## [8.0.8]" vs "## [8.3.1]") are not duplicated and the chronology is correct; save the cleaned file so the changelog is one continuous history with no raw merge markers.cli/CHANGELOG.md (1)
6-286:⚠️ Potential issue | 🟠 MajorResolve unresolved merge-conflict markers in the changelog.
Line 6 through Line 286 still contains
<<<<<<<,=======, and>>>>>>>, which means this merge was not fully resolved. Please remove markers and keep a single, coherent release history before merging.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/CHANGELOG.md` around lines 6 - 286, The changelog contains unresolved git conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main); remove these markers and merge the two blocks into one coherent release history, choosing the correct entries to keep (either the HEAD section or the upstream/main section) and deduplicate overlapping release entries (e.g., the 8.0.x vs 8.3.x sections), ensuring the file contains a single, consistent chronological changelog without any conflict markers.ios/CHANGELOG.md (1)
6-231:⚠️ Potential issue | 🟠 MajorRemove unresolved merge-conflict markers and consolidate iOS release history.
Line 6 through Line 231 still includes conflict markers (
<<<<<<<,=======,>>>>>>>). Please resolve to one final changelog stream; current state is an incomplete merge artifact.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@ios/CHANGELOG.md` around lines 6 - 231, The file contains Git merge conflict markers (<<<<<<<, =======, >>>>>>>) mixing two CHANGLEOG streams; remove all conflict markers and consolidate into a single coherent iOS changelog by keeping one timeline (e.g., the upstream/main stream starting with 8.3.1… or the HEAD stream starting with 8.0.8…) and merging any non-duplicated entries, ensuring no leftover <<<<<<<, =======, or >>>>>>> tokens remain and that headings (e.g., "## [8.3.1]..." and "## [8.0.8]...") appear only once in chronological order.CHANGELOG.md (1)
6-532:⚠️ Potential issue | 🔴 CriticalResolve merge markers and regenerate the changelog output.
Line 6, Line 457, and Line 532 still contain conflict markers (
<<<<<<<,=======,>>>>>>>), so this merge is incomplete and blocking.As per coding guidelines,
CHANGELOG.md: Do not manually editCHANGELOG.md; it is managed automatically by CI/CD.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@CHANGELOG.md` around lines 6 - 532, The changelog contains unresolved git merge conflict markers (<<<<<<<, =======, >>>>>>>) that must be removed; restore a clean autogenerated changelog instead of manual edits by discarding the conflicted file changes and re-running the changelog generation workflow/command used by CI (e.g., the repo's changelog/regeneration script or release workflow) so the file is regenerated without conflict markers; ensure you do not hand-edit the changelog and commit the regenerated output only.
🧹 Nitpick comments (1)
ios/Capacitor/Capacitor/CapacitorBridge.swift (1)
96-99: Consider removing the now-obsolete tmp window compatibility path.
tmpWindow/tmpVCAppearedare deprecated, but the observer lifecycle still references them (Line 226-228), andTmpViewControllerstill posts that notification. If no compatibility contract remains, this dead path should be removed to reduce maintenance surface.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@ios/Capacitor/Capacitor/CapacitorBridge.swift` around lines 96 - 99, Remove the deprecated temporary window compatibility path by deleting the unused symbols tmpWindow and tmpVCAppeared and removing any observer registration/removal and notification posting tied to that path: remove references to tmpVCAppeared in the observer lifecycle (the addObserver/removeObserver calls that reference tmpVCAppeared) and stop TmpViewController from posting Notification.Name("tmpViewControllerAppeared"); also search for any other uses of tmpWindow/tmpVCAppeared/TmpViewController notification behavior and delete or refactor them to the modern flow so no dead compatibility code remains.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.github/workflows/needs-reply.yml:
- Line 12: Replace the mutable action ref "imhoffd/needs-reply@v2" with an
immutable commit SHA to prevent silent upstream changes; locate the uses line
that references imhoffd/needs-reply (the string "uses: imhoffd/needs-reply@v2")
and update it to "uses: imhoffd/needs-reply@<full-commit-sha>" where
<full-commit-sha> is the SHA returned by the repository's commits API for the v2
ref.
In @.github/workflows/publish-ios.yml:
- Around line 21-24: The workflow is forcing actions/checkout@v5 to ref: 'main',
which overrides the triggering commit/tag and can publish from main instead of
the caller's ref; update the publish job's checkout step so it does not hardcode
ref: 'main' (remove the ref line or set it to the triggering ref such as
github.ref or github.sha) so actions/checkout@v5 checks out the actual event ref
that triggered the workflow.
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`:
- Around line 59-60: The currentStatusBarStyle and currentGestureBarStyle are
being stored with DEFAULT resolved to LIGHT/DARK, causing apps using DEFAULT to
stop reacting to theme changes; modify setStyle() and any assignment sites
(including where currentStatusBarStyle/currentGestureBarStyle are set and the
logic in the block around the other affected code paths) so that when the
incoming style equals STYLE_DEFAULT you persist STYLE_DEFAULT (do not map it to
STYLE_LIGHT or STYLE_DARK before storing), but still apply the resolved
LIGHT/DARK to the system UI; in other words, separate "appliedStyle" (resolve
DEFAULT to LIGHT/DARK for immediate application) from "persistedStyle" (store
the raw incoming value like STYLE_DEFAULT) so DEFAULT remains persisted and
theme changes will trigger recalculation.
- Around line 321-325: getWebViewMajorVersion() currently parses the WebView
version with Integer.valueOf(versionSegments[0]) and can throw
NumberFormatException; update this method to reuse the guarded parsing pattern
from Bridge.java by wrapping the version extraction in a try-catch, log the
exception using the same logger used in Bridge (or Platform/Bridge logging
helper) and return null on parse failure so callers are safe; reference
getWebViewMajorVersion and the existing extractWebViewMajorVersion() in
Bridge.java as the model for the try/catch + logging behavior.
In
`@android/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.java`:
- Around line 323-346: The extractBoundaryFromContentType function can return an
empty string when the header has "boundary=" which causes setRequestBody to skip
fallback generation; modify extractBoundaryFromContentType so after trimming and
stripping surrounding quotes it checks if the resulting boundary is empty and
returns null in that case (i.e., ensure extractBoundaryFromContentType returns
null for empty boundary values) so setRequestBody will fall back to generating a
valid boundary.
In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`:
- Line 343: The code in WebViewLocalServer that sets rangeString only checks
"Range" and "range", missing mixed-case headers; update the lookup for
requestHeaders to be case-insensitive (e.g., normalize header names to
lower-case or iterate keys to match ignoring case) so rangeString is populated
for any casing variant, using the existing requestHeaders map and the
rangeString variable in the request-handling method.
In `@android/package.json`:
- Around line 2-14: This package manifest contains unresolved git merge conflict
markers (<<<<<<<, =======, >>>>>>>) making it invalid JSON; open the
package.json, remove the conflict markers and pick the intended values for the
conflicting fields (name, version, description, homepage, author) so both blocks
are reconciled into one valid JSON object (also check and resolve the similar
conflict at the later block mentioned around lines 34-39), then run a JSON
lint/npm install to verify the file parses and CI EJSONPARSE will be resolved.
In `@cli/package.json`:
- Around line 2-14: Remove the Git merge markers and produce a valid JSON object
for package.json; choose and apply a single, internally consistent set of
metadata values for the keys "name", "version", "description", "homepage", and
"author" (do not mix the HEAD and upstream blocks), ensure the package "name"
matches the rest of the file (e.g., keep "@capacitor-plus/cli" if this repo is
Cap-go/capacitor-plus or switch all metadata to "@capacitor/cli" and the
upstream values), and validate the result with a JSON linter so npm install no
longer errors with EJSONPARSE.
In `@cli/src/declarations.ts`:
- Around line 533-536: Fix the typo in the user-facing documentation string that
begins with "Warning: Capacitor does not officially support Swift 6 yet." by
replacing "throughrouly" with the correct spelling "thoroughly" so the sentence
reads "make sure to thoroughly test your iOS app."; update the text in the same
comment block in cli/src/declarations.ts (look for the Swift 6 warning string)
to apply this correction.
In `@cli/src/index.ts`:
- Line 327: configWritable.ios.packageManager is being assigned the Promise
returned by the async function getPackageManager; change the assignment to await
getPackageManager(packagemanager?.toLowerCase()) so the resolved PackageManager
is stored, and ensure the enclosing function is declared async (or otherwise
handles await) so awaiting is valid; reference the assignment to
configWritable.ios.packageManager and the getPackageManager(...) call when
making the change.
In `@cli/src/ios/update.ts`:
- Around line 133-142: The availability check uses the hardcoded string 'pod'
but the code later invokes the configured podPath; change the precheck to call
isInstalled(podPath) so the install branch runs for custom pod executables;
update the conditional in the else-if that currently reads isInstalled('pod') to
use the const podPath (declared earlier) and keep the subsequent
runCommand(podPath, ['install', ...(deployment ? ['--deployment'] : [])], { cwd:
config.ios.nativeProjectDirAbs }) as-is.
In `@cli/src/util/spm.ts`:
- Around line 100-106: Resolve the unresolved git conflict by keeping the
upstream changes: replace the usage of getMajorMinoriOSVersion with
getMajoriOSVersion, add the packageTraits and swiftToolsVersion variables
(packageTraits = config.app.extConfig.experimental?.ios?.spm?.packageTraits ??
{} and swiftToolsVersion =
config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion ?? '5.9') in
place of the conflict block, and remove the conflict markers; also update the
import on the top of the file to import getMajoriOSVersion instead of
getMajorMinoriOSVersion so the new references compile and the downstream code
using swiftToolsVersion and packageTraits resolves correctly.
In `@core/package.json`:
- Around line 2-14: Remove the unresolved Git conflict markers (<<<<<<<,
=======, >>>>>>>) from core/package.json and produce a valid merged package.json
entry: decide whether the package name/version/description/homepage/author
should be the original Capacitor values or the Capacitor+ fork values, then keep
only the chosen block (no markers) and ensure proper JSON formatting and commas
(e.g., around "name", "version", "description", "homepage", "author") so the
manifest parses correctly; reference the conflicting markers <<<<<<< HEAD and
>>>>>>> upstream/main to locate the conflict.
In `@ios/Capacitor/Capacitor/CapacitorBridge.swift`:
- Around line 750-755: presentVC(_:animated:completion:),
dismissVC(animated:completion:), and the similar showAlertWith method must call
UIKit APIs only on the main thread; update each to dispatch
presentation/dismissal to the main queue (e.g., wrap the existing
self.viewController?.present(...)/dismiss(...) and alert presentation calls in
DispatchQueue.main.async or conditionally call directly if already on main) so
modal operations always run on the main thread and preserve the original
animated and completion parameters.
In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m`:
- Line 32: The method implementation for - (NSArray *
_Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray *
_Nullable)defaultValue currently contains an extra semicolon before the opening
brace; remove the stray semicolon so the implementation reads as a normal method
body (i.e., change the signature in CAPBridgedJSTypes.m for
getArray:defaultValue: to not include "; {" but simply "{").
In `@ios/Capacitor/Capacitor/Plugins/CapacitorUrlRequest.swift`:
- Around line 94-109: The extractBoundary(from:) function currently returns an
empty string for headers like "boundary=", which leads to malformed multipart
bodies; update extractBoundary(from:) to trim surrounding whitespace and quotes
from the extracted boundary and if the resulting string is empty (zero-length)
return nil so callers treat it as missing and can fall back to a generated
boundary or header override; ensure you handle both the quoted and unquoted
cases and reference the extractBoundary(from:) function in your change.
In `@ios/package.json`:
- Around line 2-14: The package.json contains unresolved merge markers (<<<<<<<
HEAD, =======, >>>>>>> upstream/main) splitting two variants of fields like
"name", "version", "description", "homepage", and "author"; remove the conflict
markers, pick the intended values for those fields (or merge them into a single
coherent set), and ensure the resulting JSON is valid (no trailing commas) for
the "name", "version", "description", "homepage", and "author" entries
referenced here; also apply the same fix for the duplicate/conflicting block
around lines 36-41 so the entire file parses correctly.
In `@lerna.json`:
- Around line 16-20: The repository contains unresolved Git merge conflict
markers (e.g., in lerna.json with the "version" field, multiple package.json
files, CHANGELOGs, and source files like cli/src/util/spm.ts); locate each file
with conflict markers (<<<<<<<, =======, >>>>>>>), decide the correct content
for each conflict (choose the appropriate version, merge changes, or synthesize
a correct combined form), remove the conflict markers, validate JSON and code
syntax (ensure lerna.json and package.json are valid JSON and that spm.ts
compiles), run repository-wide lint/tests to catch remaining issues, and commit
the resolved files with a clear merge-resolution message.
In `@package.json`:
- Around line 35-55: Resolve the merge-conflict markers in package.json by
removing the <<<<<<<, =======, and >>>>>>> lines and producing a valid
dependencies/devDependencies block; pick the intended versions and merge unique
packages so there are no duplicate keys—specifically reconcile "@types/node"
(choose either "18.18.6" or "^24.10.1"), "eslint" (pick one version), restore or
drop "@types/tar" and "eslint-plugin-import" as needed, and decide which "tar"
and "prettier-pretty-check" entries to keep; ensure the final JSON has a single
entry per package name and valid commas/braces so npm install/CI can run.
---
Outside diff comments:
In `@android/CHANGELOG.md`:
- Around line 6-260: The changelog contains unresolved git conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) and two different release
histories (e.g., the "## [8.0.8]" block and the "## [8.3.1]" / "## [8.3.0]"
blocks). Remove the conflict markers and reconcile the two histories by keeping
the intended canonical history: either retain the local "## [8.0.8]" entries or
replace them with the upstream "## [8.3.1]/8.3.0" section (or merge their
entries into a single chronological release list), ensuring only one coherent
set of release headings remains; verify headings like "## [8.0.8]" and "##
[8.3.1]" are in proper order, remove duplicate/redundant entries, and save the
file with no conflict markers before committing.
In `@CHANGELOG.md`:
- Around line 6-532: The changelog contains unresolved git merge conflict
markers (<<<<<<<, =======, >>>>>>>) that must be removed; restore a clean
autogenerated changelog instead of manual edits by discarding the conflicted
file changes and re-running the changelog generation workflow/command used by CI
(e.g., the repo's changelog/regeneration script or release workflow) so the file
is regenerated without conflict markers; ensure you do not hand-edit the
changelog and commit the regenerated output only.
In `@cli/CHANGELOG.md`:
- Around line 6-286: The changelog contains unresolved git conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main); remove these markers and merge
the two blocks into one coherent release history, choosing the correct entries
to keep (either the HEAD section or the upstream/main section) and deduplicate
overlapping release entries (e.g., the 8.0.x vs 8.3.x sections), ensuring the
file contains a single, consistent chronological changelog without any conflict
markers.
In `@core/CHANGELOG.md`:
- Around line 6-163: The file contains unresolved git merge markers (<<<<<<<
HEAD, =======, >>>>>>> upstream/main) mixing two changelog histories; open
core/CHANGELOG.md, remove the conflict markers and the duplicated block you
don't want, and produce a single coherent release-history section (either keep
the HEAD block or the upstream/main block) ensuring headings (e.g., "## [8.0.8]"
vs "## [8.3.1]") are not duplicated and the chronology is correct; save the
cleaned file so the changelog is one continuous history with no raw merge
markers.
In `@ios/CHANGELOG.md`:
- Around line 6-231: The file contains Git merge conflict markers (<<<<<<<,
=======, >>>>>>>) mixing two CHANGLEOG streams; remove all conflict markers and
consolidate into a single coherent iOS changelog by keeping one timeline (e.g.,
the upstream/main stream starting with 8.3.1… or the HEAD stream starting with
8.0.8…) and merging any non-duplicated entries, ensuring no leftover <<<<<<<,
=======, or >>>>>>> tokens remain and that headings (e.g., "## [8.3.1]..." and
"## [8.0.8]...") appear only once in chronological order.
---
Nitpick comments:
In `@ios/Capacitor/Capacitor/CapacitorBridge.swift`:
- Around line 96-99: Remove the deprecated temporary window compatibility path
by deleting the unused symbols tmpWindow and tmpVCAppeared and removing any
observer registration/removal and notification posting tied to that path: remove
references to tmpVCAppeared in the observer lifecycle (the
addObserver/removeObserver calls that reference tmpVCAppeared) and stop
TmpViewController from posting Notification.Name("tmpViewControllerAppeared");
also search for any other uses of tmpWindow/tmpVCAppeared/TmpViewController
notification behavior and delete or refactor them to the modern flow so no dead
compatibility code remains.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 1a4fc028-6581-422c-9cac-b175491e7eba
📒 Files selected for processing (54)
.github/ISSUE_TEMPLATE/config.yml.github/ISSUE_TEMPLATE/feature-request.yml.github/ionic-issue-bot.yml.github/workflows/needs-reply.yml.github/workflows/publish-ios.yml.github/workflows/test.ymlCHANGELOG.mdandroid/CHANGELOG.mdandroid/capacitor/src/main/assets/native-bridge.jsandroid/capacitor/src/main/java/com/getcapacitor/Bridge.javaandroid/capacitor/src/main/java/com/getcapacitor/BridgeActivity.javaandroid/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.javaandroid/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.javaandroid/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.javaandroid/package.jsoncli/CHANGELOG.mdcli/package.jsoncli/src/config.tscli/src/declarations.tscli/src/definitions.tscli/src/index.tscli/src/ios/build.tscli/src/ios/common.tscli/src/ios/doctor.tscli/src/ios/open.tscli/src/ios/run.tscli/src/ios/update.tscli/src/tasks/add.tscli/src/tasks/migrate-spm.tscli/src/tasks/migrate.tscli/src/tasks/run.tscli/src/tasks/sourcemaps.tscli/src/tasks/sync.tscli/src/tasks/update.tscli/src/util/livereload.tscli/src/util/spm.tscli/src/util/template.tscore/CHANGELOG.mdcore/native-bridge.tscore/package.jsoncore/src/core-plugins.tscore/system-bars.mdios-spm-template/App/CapApp-SPM/README.mdios/CHANGELOG.mdios/Capacitor/Capacitor/CAPBridgeProtocol.swiftios/Capacitor/Capacitor/CAPBridgedJSTypes.hios/Capacitor/Capacitor/CAPBridgedJSTypes.mios/Capacitor/Capacitor/CapacitorBridge.swiftios/Capacitor/Capacitor/Plugins/CapacitorUrlRequest.swiftios/Capacitor/Capacitor/assets/native-bridge.jsios/package.jsonlerna.jsonpackage.jsonscripts/pack-cli-assets.mjs
💤 Files with no reviewable changes (1)
- .github/ISSUE_TEMPLATE/feature-request.yml
| runs-on: ubuntu-latest | ||
| steps: | ||
| - name: Close old issues that need reply | ||
| uses: imhoffd/needs-reply@v2 |
There was a problem hiding this comment.
Pin third-party GitHub Action to an immutable commit SHA.
Line 12 uses imhoffd/needs-reply@v2 (mutable tag). Pinning to a full SHA avoids silent upstream drift in scheduled automation.
#!/bin/bash
# Read-only: resolve the current commit behind the v2 ref
gh api repos/imhoffd/needs-reply/commits/v2 --jq '.sha'Suggested hardening change
- - name: Close old issues that need reply
- uses: imhoffd/needs-reply@v2
+ - name: Close old issues that need reply
+ uses: imhoffd/needs-reply@<PINNED_COMMIT_SHA>🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.github/workflows/needs-reply.yml at line 12, Replace the mutable action ref
"imhoffd/needs-reply@v2" with an immutable commit SHA to prevent silent upstream
changes; locate the uses line that references imhoffd/needs-reply (the string
"uses: imhoffd/needs-reply@v2") and update it to "uses:
imhoffd/needs-reply@<full-commit-sha>" where <full-commit-sha> is the SHA
returned by the repository's commits API for the v2 ref.
| - uses: actions/checkout@v5 | ||
| with: | ||
| fetch-depth: 0 | ||
| ref: 'main' |
There was a problem hiding this comment.
Do not force checkout to main in publish job.
Line 24 overrides the triggering ref and may publish podspec changes from main instead of the caller’s commit/tag.
Suggested fix
- uses: actions/checkout@v5
with:
fetch-depth: 0
- ref: 'main'📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| ref: 'main' | |
| - uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.github/workflows/publish-ios.yml around lines 21 - 24, The workflow is
forcing actions/checkout@v5 to ref: 'main', which overrides the triggering
commit/tag and can publish from main instead of the caller's ref; update the
publish job's checkout step so it does not hardcode ref: 'main' (remove the ref
line or set it to the triggering ref such as github.ref or github.sha) so
actions/checkout@v5 checks out the actual event ref that triggered the workflow.
| private String currentStatusBarStyle = STYLE_DEFAULT; | ||
| private String currentGestureBarStyle = STYLE_DEFAULT; |
There was a problem hiding this comment.
Keep DEFAULT as the persisted style mode.
setStyle() resolves DEFAULT to LIGHT/DARK before storing it, so after the first run Lines 89-90 will keep reapplying that resolved value instead of recalculating from the new theme. Apps configured with DEFAULT will stop tracking dark/light mode changes after a configuration change.
♻️ Suggested fix
- private String currentStatusBarStyle = STYLE_DEFAULT;
- private String currentGestureBarStyle = STYLE_DEFAULT;
+ private String requestedStatusBarStyle = STYLE_DEFAULT;
+ private String requestedGestureBarStyle = STYLE_DEFAULT;
@@
- setStyle(currentGestureBarStyle, BAR_GESTURE_BAR);
- setStyle(currentStatusBarStyle, BAR_STATUS_BAR);
+ setStyle(requestedGestureBarStyle, BAR_GESTURE_BAR);
+ setStyle(requestedStatusBarStyle, BAR_STATUS_BAR);
@@
private void setStyle(String style, String bar) {
+ final String requestedStyle = style;
if (style.equals(STYLE_DEFAULT)) {
style = getStyleForTheme();
}
@@
- currentStatusBarStyle = style;
+ requestedStatusBarStyle = requestedStyle;
windowInsetsControllerCompat.setAppearanceLightStatusBars(!style.equals(STYLE_DARK));
}
@@
- currentGestureBarStyle = style;
+ requestedGestureBarStyle = requestedStyle;
windowInsetsControllerCompat.setAppearanceLightNavigationBars(!style.equals(STYLE_DARK));
}Also applies to: 89-90, 263-277
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`
around lines 59 - 60, The currentStatusBarStyle and currentGestureBarStyle are
being stored with DEFAULT resolved to LIGHT/DARK, causing apps using DEFAULT to
stop reacting to theme changes; modify setStyle() and any assignment sites
(including where currentStatusBarStyle/currentGestureBarStyle are set and the
logic in the block around the other affected code paths) so that when the
incoming style equals STYLE_DEFAULT you persist STYLE_DEFAULT (do not map it to
STYLE_LIGHT or STYLE_DARK before storing), but still apply the resolved
LIGHT/DARK to the system UI; in other words, separate "appliedStyle" (resolve
DEFAULT to LIGHT/DARK for immediate application) from "persistedStyle" (store
the raw incoming value like STYLE_DEFAULT) so DEFAULT remains persisted and
theme changes will trigger recalculation.
| private Integer getWebViewMajorVersion() { | ||
| PackageInfo info = WebViewCompat.getCurrentWebViewPackage(getContext()); | ||
| if (info != null && info.versionName != null) { | ||
| String[] versionSegments = info.versionName.split("\\."); | ||
| return Integer.valueOf(versionSegments[0]); |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Show the existing guarded WebView major-version parsing helper.
sed -n '375,385p' android/capacitor/src/main/java/com/getcapacitor/Bridge.java
# Show the new unguarded parsing site and nearby usages.
rg -n -C2 'getCurrentWebViewPackage|versionName\.split|Integer\.valueOf\(versionSegments\[0\]\)' android/capacitor/src/main/javaRepository: Cap-go/capacitor-plus
Length of output: 4276
Reuse the guarded WebView version parsing from Bridge.java.
The getWebViewMajorVersion() method at lines 321-325 parses the WebView version without exception handling. Integer.valueOf(versionSegments[0]) will throw NumberFormatException if the version string is malformed. The extractWebViewMajorVersion() method in Bridge.java wraps this parsing in a try-catch block with logging, providing a safe pattern already used elsewhere in the codebase.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`
around lines 321 - 325, getWebViewMajorVersion() currently parses the WebView
version with Integer.valueOf(versionSegments[0]) and can throw
NumberFormatException; update this method to reuse the guarded parsing pattern
from Bridge.java by wrapping the version extraction in a try-catch, log the
exception using the same logger used in Bridge (or Platform/Bridge logging
helper) and return null on parse failure so callers are safe; reference
getWebViewMajorVersion and the existing extractWebViewMajorVersion() in
Bridge.java as the model for the try/catch + logging behavior.
| public static String extractBoundaryFromContentType(String contentType) { | ||
| String boundaryPrefix = "boundary="; | ||
| int boundaryIndex = contentType.indexOf(boundaryPrefix); | ||
| if (boundaryIndex == -1) { | ||
| return null; | ||
| } | ||
|
|
||
| // Extract the substring starting right after "boundary=" | ||
| String boundary = contentType.substring(boundaryIndex + boundaryPrefix.length()); | ||
|
|
||
| // Find the end of the boundary value by looking for the next ";" | ||
| int endIndex = boundary.indexOf(";"); | ||
| if (endIndex != -1) { | ||
| boundary = boundary.substring(0, endIndex); | ||
| } | ||
|
|
||
| // Remove surrounding double quotes if present | ||
| boundary = boundary.trim(); | ||
| if (boundary.startsWith("\"") && boundary.endsWith("\"")) { | ||
| boundary = boundary.substring(1, boundary.length() - 1); | ||
| } | ||
|
|
||
| return boundary; | ||
| } |
There was a problem hiding this comment.
Return null for empty boundary values.
On Line 331-Line 345, extractBoundaryFromContentType returns empty string for boundary=. In setRequestBody (Line 229), that skips fallback generation and writes invalid multipart delimiters.
💡 Proposed fix
public static String extractBoundaryFromContentType(String contentType) {
+ if (contentType == null) {
+ return null;
+ }
String boundaryPrefix = "boundary=";
int boundaryIndex = contentType.indexOf(boundaryPrefix);
if (boundaryIndex == -1) {
return null;
}
@@
- if (boundary.startsWith("\"") && boundary.endsWith("\"")) {
+ if (boundary.startsWith("\"") && boundary.endsWith("\"") && boundary.length() >= 2) {
boundary = boundary.substring(1, boundary.length() - 1);
}
- return boundary;
+ return boundary.isEmpty() ? null : boundary;
}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In
`@android/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.java`
around lines 323 - 346, The extractBoundaryFromContentType function can return
an empty string when the header has "boundary=" which causes setRequestBody to
skip fallback generation; modify extractBoundaryFromContentType so after
trimming and stripping surrounding quotes it checks if the resulting boundary is
empty and returns null in that case (i.e., ensure extractBoundaryFromContentType
returns null for empty boundary values) so setRequestBody will fall back to
generating a valid boundary.
| return defaultValue; | ||
| } | ||
|
|
||
| - (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue; { |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Detect Objective-C method implementations that accidentally use '; {' in .m/.mm files.
# Expected: no matches after the fix.
rg -nP '^\s*[-+]\s*\([^)]+\)[^{;]*;\s*\{' -g '**/*.m' -g '**/*.mm'Repository: Cap-go/capacitor-plus
Length of output: 219
Remove trailing semicolon from method implementation.
The method declaration at line 32 has an invalid semicolon before the opening brace (; {). In Objective-C, method implementations must not include a semicolon before the method body, only method declarations do.
Fix
-- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue; {
+- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue {📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue; { | |
| - (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue { |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m` at line 32, The method
implementation for - (NSArray * _Nullable)getArray:(NSString * _Nonnull)key
defaultValue:(NSArray * _Nullable)defaultValue currently contains an extra
semicolon before the opening brace; remove the stray semicolon so the
implementation reads as a normal method body (i.e., change the signature in
CAPBridgedJSTypes.m for getArray:defaultValue: to not include "; {" but simply
"{").
| private func extractBoundary(from contentType: String) -> String? { | ||
| if let boundaryRange = contentType.range(of: "boundary=") { | ||
| var boundary = contentType[boundaryRange.upperBound...] | ||
| if let endRange = boundary.range(of: ";") { | ||
| boundary = boundary[..<endRange.lowerBound] | ||
| } | ||
|
|
||
| if boundary.hasPrefix("\"") && boundary.hasSuffix("\"") { | ||
| return String(boundary.dropFirst().dropLast()) | ||
| } else { | ||
| return String(boundary) | ||
| } | ||
| } | ||
|
|
||
| return nil | ||
| } |
There was a problem hiding this comment.
Handle empty extracted boundary as missing value.
On Line 95-Line 105, extractBoundary(from:) can return "" for headers like boundary=. That produces malformed multipart bodies instead of falling back to generated boundary/header override.
💡 Proposed fix
private func extractBoundary(from contentType: String) -> String? {
if let boundaryRange = contentType.range(of: "boundary=") {
var boundary = contentType[boundaryRange.upperBound...]
if let endRange = boundary.range(of: ";") {
boundary = boundary[..<endRange.lowerBound]
}
-
- if boundary.hasPrefix("\"") && boundary.hasSuffix("\"") {
- return String(boundary.dropFirst().dropLast())
- } else {
- return String(boundary)
- }
+
+ let trimmed = String(boundary).trimmingCharacters(in: .whitespacesAndNewlines)
+ let unquoted: String
+ if trimmed.hasPrefix("\""), trimmed.hasSuffix("\""), trimmed.count >= 2 {
+ unquoted = String(trimmed.dropFirst().dropLast())
+ } else {
+ unquoted = trimmed
+ }
+
+ return unquoted.isEmpty ? nil : unquoted
}
return nil
}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@ios/Capacitor/Capacitor/Plugins/CapacitorUrlRequest.swift` around lines 94 -
109, The extractBoundary(from:) function currently returns an empty string for
headers like "boundary=", which leads to malformed multipart bodies; update
extractBoundary(from:) to trim surrounding whitespace and quotes from the
extracted boundary and if the resulting string is empty (zero-length) return nil
so callers treat it as missing and can fall back to a generated boundary or
header override; ensure you handle both the quoted and unquoted cases and
reference the extractBoundary(from:) function in your change.
| <<<<<<< HEAD | ||
| "name": "@capacitor-plus/ios", | ||
| "version": "8.0.8", | ||
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| ======= | ||
| "name": "@capacitor/ios", | ||
| "version": "8.3.1", | ||
| "description": "Capacitor: Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capacitorjs.com", | ||
| "author": "Ionic Team <hi@ionic.io> (https://ionic.io)", | ||
| >>>>>>> upstream/main |
There was a problem hiding this comment.
This file still has unresolved merge conflicts.
The conflict markers make ios/package.json invalid JSON, so package installation and the iOS verify job cannot run. Please pick the intended values for both sections and remove the markers before this is merged.
Also applies to: 36-41
🧰 Tools
🪛 Biome (2.4.12)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: String values must be double quoted.
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-8: End of file expected
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-14: End of file expected
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@ios/package.json` around lines 2 - 14, The package.json contains unresolved
merge markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) splitting two
variants of fields like "name", "version", "description", "homepage", and
"author"; remove the conflict markers, pick the intended values for those fields
(or merge them into a single coherent set), and ensure the resulting JSON is
valid (no trailing commas) for the "name", "version", "description", "homepage",
and "author" entries referenced here; also apply the same fix for the
duplicate/conflicting block around lines 36-41 so the entire file parses
correctly.
| <<<<<<< HEAD | ||
| "version": "8.0.8", | ||
| ======= | ||
| "version": "8.3.1", | ||
| >>>>>>> upstream/main |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Expect no output once all merge conflicts are resolved.
rg -n '^(<<<<<<<|=======|>>>>>>>)'Repository: Cap-go/capacitor-plus
Length of output: 1607
Resolve all unresolved merge conflicts throughout the repository.
The lerna.json file contains raw conflict markers (lines 16-20) making it invalid JSON, but the merge conflict problem extends across the entire repository. Multiple package.json files, CHANGELOG files, and source files (cli/src/util/spm.ts) all contain unresolved conflict markers that must be resolved before any merging or release can proceed.
🧰 Tools
🪛 Biome (2.4.12)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: String values must be double quoted.
(parse)
[error] 17-17: End of file expected
(parse)
[error] 17-17: End of file expected
(parse)
[error] 17-17: End of file expected
(parse)
[error] 17-18: End of file expected
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 19-19: End of file expected
(parse)
[error] 19-19: End of file expected
(parse)
[error] 19-19: End of file expected
(parse)
[error] 19-20: End of file expected
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@lerna.json` around lines 16 - 20, The repository contains unresolved Git
merge conflict markers (e.g., in lerna.json with the "version" field, multiple
package.json files, CHANGELOGs, and source files like cli/src/util/spm.ts);
locate each file with conflict markers (<<<<<<<, =======, >>>>>>>), decide the
correct content for each conflict (choose the appropriate version, merge
changes, or synthesize a correct combined form), remove the conflict markers,
validate JSON and code syntax (ensure lerna.json and package.json are valid JSON
and that spm.ts compiles), run repository-wide lint/tests to catch remaining
issues, and commit the resolved files with a clear merge-resolution message.
| <<<<<<< 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 |
There was a problem hiding this comment.
Resolve merge conflicts in root package.json (current CI blocker).
Line 35 through Line 55 still contains merge conflict markers, which makes the root manifest invalid JSON and directly matches the EJSONPARSE pipeline failure. Resolve this block first to unblock install/test.
🧰 Tools
🪛 Biome (2.4.12)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: String values must be double quoted.
(parse)
[error] 36-36: End of file expected
(parse)
[error] 36-36: End of file expected
(parse)
[error] 36-36: End of file expected
(parse)
[error] 36-36: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 39-39: End of file expected
(parse)
[error] 39-39: End of file expected
(parse)
[error] 39-39: End of file expected
(parse)
[error] 39-40: End of file expected
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 41-41: End of file expected
(parse)
[error] 41-41: End of file expected
(parse)
[error] 41-41: End of file expected
(parse)
[error] 41-41: End of file expected
(parse)
[error] 42-42: End of file expected
(parse)
[error] 42-42: End of file expected
(parse)
[error] 42-42: End of file expected
(parse)
[error] 42-43: End of file expected
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character /
(parse)
[error] 44-44: End of file expected
(parse)
[error] 44-44: End of file expected
(parse)
[error] 44-44: End of file expected
(parse)
[error] 44-44: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 49-49: End of file expected
(parse)
[error] 49-49: End of file expected
(parse)
[error] 49-49: End of file expected
(parse)
[error] 49-50: End of file expected
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 54-54: End of file expected
(parse)
[error] 54-54: End of file expected
(parse)
[error] 54-54: End of file expected
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: String values must be double quoted.
(parse)
[error] 55-55: unexpected character /
(parse)
[error] 55-55: String values must be double quoted.
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@package.json` around lines 35 - 55, Resolve the merge-conflict markers in
package.json by removing the <<<<<<<, =======, and >>>>>>> lines and producing a
valid dependencies/devDependencies block; pick the intended versions and merge
unique packages so there are no duplicate keys—specifically reconcile
"@types/node" (choose either "18.18.6" or "^24.10.1"), "eslint" (pick one
version), restore or drop "@types/tar" and "eslint-plugin-import" as needed, and
decide which "tar" and "prettier-pretty-check" entries to keep; ensure the final
JSON has a single entry per package name and valid commas/braces so npm
install/CI can run.
Merge Conflict Resolution Required
The automatic sync of the
plusbranch with upstream main encountered merge conflicts.What happened
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
Bug Fixes
Chores