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>
📝 WalkthroughWalkthroughThis pull request integrates an upstream merge that updates package versions from 8.0.8 to 8.3.0, refactors iOS build toolchain detection to support multiple package managers (SPM, Cocoapods, bundler), adds GitHub Actions workflows for issue automation and iOS publishing, introduces native bridge improvements for URL handling, and updates platform-specific code including SystemBars. The merge introduces unresolved conflict markers in changelog and package metadata files. Changes
Sequence Diagram(s)sequenceDiagram
participant CLI as Capacitor CLI
participant Config as Config Loader
participant PkgMgr as Package Manager Detector
participant iOS as iOS Platform
participant Validator as Validation System
CLI->>Config: Load configuration
Config->>PkgMgr: Determine iOS package manager
PkgMgr->>PkgMgr: Check for SPM (CapApp-SPM)
PkgMgr->>PkgMgr: Check COCOAPODS_PATH env
PkgMgr->>PkgMgr: Inspect Gemfile for bundler
PkgMgr->>Config: Return PackageManager
Config->>iOS: Update config.ios.packageManager
CLI->>Validator: Get common checks
Validator->>Validator: Query packageManager type
alt packageManager === 'SPM'
Validator->>Validator: Add SPM validators (swiftToolsVersion, traits)
else packageManager === 'bundler'
Validator->>Validator: Add bundler check
else packageManager === 'Cocoapods'
Validator->>Validator: Add CocoaPods check
end
Validator-->>CLI: Return platform checks
CLI->>iOS: Build/Run with determined manager
sequenceDiagram
participant Browser as Browser/WebView
participant App as Native App
participant Fetch as window.fetch
participant Proxy as Proxy Handler
participant Native as Native HTTP
Browser->>Fetch: fetch(resource)
Fetch->>Fetch: Check resource type
alt resource is URL
Fetch->>Proxy: createProxyUrl(resource.toString())
Proxy-->>Fetch: proxied URL string
Fetch->>Fetch: Wrap in new URL()
else resource is string
Fetch->>Proxy: createProxyUrl(resource)
Proxy-->>Fetch: proxied string
else resource is Request
Fetch->>Proxy: createProxyUrl from Request.url
Proxy-->>Fetch: proxied Request
end
Fetch->>Native: CapacitorWebFetch(proxied)
Native->>App: Execute native HTTP
App-->>Native: Response
Native-->>Fetch: Return result
Fetch-->>Browser: Promise<Response>
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 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: 0a150fa1b7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| "@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.
Remove merge markers from root package manifest
The commit leaves unresolved conflict markers (<<<<<<<, =======, >>>>>>>) inside package.json, which makes the file invalid JSON. Any install/build step that reads the root manifest (for example bun install/workspace tooling) will fail before running project code, so this blocks normal development and CI execution.
Useful? React with 👍 / 👎.
|
|
||
| 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.
There was a problem hiding this comment.
Actionable comments posted: 14
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (7)
CHANGELOG.md (1)
6-523:⚠️ Potential issue | 🔴 CriticalDo not hand-merge
CHANGELOG.md; remove conflict markers and regenerate via CI.Line 6 and Line 457 show unresolved merge markers and conflicting release-history blocks. This must be resolved by restoring a clean changelog state and letting the automated changelog process regenerate entries, not by manual merge edits.
Suggested cleanup direction
-<<<<<<< HEAD -...manual merged block... -======= -...manual merged block... ->>>>>>> upstream/main +# Keep only CI-generated changelog content (no conflict markers)As per coding guidelines,
CHANGELOG.md: Do not manually 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 - 523, The file contains unresolved git merge conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) and duplicated release blocks (e.g., headings "## [8.0.8]" and "# [8.3.0]"); do not hand-edit the changelog—remove all conflict markers and restore CHANGELOG.md to the clean generated state by discarding the manual merge (checkout the file from the target branch or revert to the pre-merge version) and then trigger the automated changelog generation/CI workflow (the repo's changelog generation script or release workflow) so the changelog is regenerated correctly.android/CHANGELOG.md (1)
6-252:⚠️ Potential issue | 🔴 CriticalResolve leftover merge conflict markers before merge
This file still contains unresolved Git conflict markers (
<<<<<<<,=======,>>>>>>>) and two competing changelog blocks. This must be resolved to a single finalized section before merging; otherwise the sync is incomplete and likely to break docs/lint/release workflows.Suggested fix pattern
-<<<<<<< HEAD -...left side... -======= -...right side... ->>>>>>> upstream/main +...single resolved changelog section...🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@android/CHANGELOG.md` around lines 6 - 252, The android/CHANGELOG.md contains unresolved Git conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) with two competing changelog blocks; open CHANGELOG.md, remove the conflict markers and the duplicate/undesired section, and keep a single finalized changelog entry (either the local [8.0.8] block or the upstream [8.3.0+] block) merging any needed lines manually so the file contains one coherent changelog without markers.core/CHANGELOG.md (1)
6-159:⚠️ Potential issue | 🔴 CriticalUnresolved conflict block must be removed
Line 6 through Line 159 still includes raw merge conflict markers and duplicated alternative changelog histories. Please resolve this block to one canonical history before merge.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@core/CHANGELOG.md` around lines 6 - 159, The file contains raw git conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) and duplicated changelog sections (e.g., "## [8.0.8]" vs "# [8.3.0]"); remove the entire unresolved conflict block and produce a single canonical changelog history. Edit core/CHANGELOG.md to delete the conflict markers and one of the duplicated variant blocks (choose the intended upstream history to keep), ensure headings remain valid Markdown and chronological order is preserved, and run a quick diff to confirm no <<<<<<<, =======, or >>>>>>> tokens remain.ios/CHANGELOG.md (1)
6-225:⚠️ Potential issue | 🔴 CriticalBlocker: unresolved merge conflict markers in changelog
The top section still contains
<<<<<<< HEAD/=======/>>>>>>> upstream/main. This needs manual conflict resolution to a single final changelog block before merging PR#41.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@ios/CHANGELOG.md` around lines 6 - 225, The changelog contains unresolved git conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main); open ios/CHANGELOG.md, remove the conflict markers and manually merge the two conflicting sections into a single coherent changelog entry (choose and combine the intended release entries from the HEAD and upstream/main blocks), ensuring only one final changelog block remains (remove the duplicate headings and keep chronological order), then save and commit the resolved file.cli/CHANGELOG.md (1)
6-280:⚠️ Potential issue | 🔴 CriticalFinalize conflicted changelog section
This segment still has unresolved merge markers and both sides of the conflict. Please keep the intended entries and remove conflict tokens so the file is valid Markdown/history again.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/CHANGELOG.md` around lines 6 - 280, The file contains unresolved git conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) around two competing changelog blocks (e.g., headings "## [8.0.8]" and "# [8.3.0]"); remove the conflict markers and reconcile the two blocks into a single valid changelog: either keep the upstream/main section (8.3.0... 8.2.0...) and append the local 8.0.8/8.0.x notes without duplication, or merge their entries chronologically, ensure only one set of headings per version, remove any duplicate entries, and save as valid Markdown with no leftover conflict tokens.android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java (1)
263-277:⚠️ Potential issue | 🟠 MajorPreserve
STYLE_DEFAULTwhen caching the current style.Lines 264-266 resolve
DEFAULTtoLIGHT/DARKbefore Lines 271 and 276 store it. After that,handleOnConfigurationChanged()can no longer tell whether the caller asked for a fixed style or theme-following behavior, so a bar configured withDEFAULTstops adapting when the system theme changes.Suggested change
private void setStyle(String style, String bar) { + String requestedStyle = style; if (style.equals(STYLE_DEFAULT)) { style = getStyleForTheme(); } @@ if (bar.isEmpty() || bar.equals(BAR_STATUS_BAR)) { - currentStatusBarStyle = style; + currentStatusBarStyle = requestedStyle; windowInsetsControllerCompat.setAppearanceLightStatusBars(!style.equals(STYLE_DARK)); } if (bar.isEmpty() || bar.equals(BAR_GESTURE_BAR)) { - currentGestureBarStyle = style; + currentGestureBarStyle = requestedStyle; windowInsetsControllerCompat.setAppearanceLightNavigationBars(!style.equals(STYLE_DARK)); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java` around lines 263 - 277, In setStyle, don't overwrite the incoming style variable with getStyleForTheme() because currentStatusBarStyle and currentGestureBarStyle must retain STYLE_DEFAULT to indicate theme-following; instead compute a resolvedStyle (or resolvedAppearance boolean) from getStyleForTheme() when calling windowInsetsControllerCompat.setAppearanceLightStatusBars(...) and setAppearanceLightNavigationBars(...), but assign the original style (not the resolved one) to currentStatusBarStyle and currentGestureBarStyle so handleOnConfigurationChanged() can detect STYLE_DEFAULT. Use the method name setStyle and the symbols STYLE_DEFAULT, STYLE_DARK, getStyleForTheme(), currentStatusBarStyle, currentGestureBarStyle, BAR_STATUS_BAR, BAR_GESTURE_BAR, and the WindowInsetsControllerCompat appearance methods to guide the change.cli/src/tasks/run.ts (1)
99-101:⚠️ Potential issue | 🟡 MinorRemove duplicate
awaitkeyword.There's a double
awaitthat is unnecessary and could mask issues if the function signature changes.🐛 Proposed fix
if (platformName === config.android.name) { - await await writeCordovaAndroidManifest(cordovaPlugins, config, platformName, true); + await writeCordovaAndroidManifest(cordovaPlugins, config, platformName, true); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/tasks/run.ts` around lines 99 - 101, In run.ts replace the duplicate await use so the call to writeCordovaAndroidManifest(cordovaPlugins, config, platformName, true) uses a single await; locate the line containing "await await writeCordovaAndroidManifest(...)" and remove the extra await to become a single awaited call (ensuring the function still returns a Promise and behavior is unchanged).
🧹 Nitpick comments (2)
ios/Capacitor/Capacitor/CapacitorBridge.swift (1)
96-99: Obsolete symbols are still wired into runtime flow; finish the cleanup.
tmpWindow/tmpVCAppearedare marked obsolete, but this file still uses them (Line 226 to Line 228). Consider removing the observer path and related temp-VC plumbing in the same cleanup to avoid dead/deprecated internals lingering.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@ios/Capacitor/Capacitor/CapacitorBridge.swift` around lines 96 - 99, Remove the obsolete temp-VC plumbing: delete the deprecated properties tmpWindow and tmpVCAppeared and remove any observer registration/handling and code paths that reference them (the observer add/remove and the code around the tmp view-controller flow currently using tmpWindow/tmpVCAppeared in CapacitorBridge). Replace the runtime flow that relied on the temporary UIWindow/notification with the normal VC presentation/completion path (or a direct completion callback) so no code references tmpWindow or tmpVCAppeared (search for tmpWindow, tmpVCAppeared, tmpViewControllerAppeared, and the observer add/remove logic and remove/replace those usages).cli/src/ios/common.ts (1)
30-44: Consider caching the awaitedpackageManagervalue.The function awaits
config.ios.packageManagermultiple times (lines 32, 34, 36). While functionally correct (the underlying promise is cached), extracting it once improves readability.♻️ Optional refactor
export async function getCommonChecks(config: Config): Promise<CheckFunction[]> { const checks: CheckFunction[] = []; - if ((await config.ios.packageManager) === 'bundler') { + const packageManager = await config.ios.packageManager; + if (packageManager === 'bundler') { checks.push(() => checkBundler(config)); - } else if ((await config.ios.packageManager) === 'Cocoapods') { + } else if (packageManager === 'Cocoapods') { checks.push(() => checkCocoaPods(config)); - } else if ((await config.ios.packageManager) === 'SPM') { + } else if (packageManager === 'SPM') { const swiftToolsVersion = config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion; if (swiftToolsVersion) { checks.push(() => checkSwiftToolsVersion(config, swiftToolsVersion)); } checks.push(() => checkPackageTraitsRequirements(config)); } return checks; }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/ios/common.ts` around lines 30 - 44, In getCommonChecks, avoid awaiting config.ios.packageManager multiple times: await it once into a local const (e.g. const packageManager = await config.ios.packageManager) and use packageManager in the subsequent comparisons and conditional logic (replace repeated awaits in getCommonChecks with that local variable while keeping existing checks like checkBundler, checkCocoaPods, checkSwiftToolsVersion, and checkPackageTraitsRequirements intact).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.github/workflows/publish-ios.yml:
- Around line 21-24: The checkout step currently pins ref: 'main' which forces
publishing from main; update the actions/checkout@v5 step to use the workflow's
triggering ref instead of hardcoding 'main' (replace the ref:'main' entry so it
derives from the workflow context or input, e.g., use the event/dispatch/PR
branch ref or a workflow input) so the job checks out the branch/tag that
triggered the workflow; ensure fetch-depth: 0 remains to allow tags and history
for CocoaPods publishing.
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`:
- Around line 218-224: The fallback path currently builds newInsets by zeroing
out systemBars and displayCutout (WindowInsetsCompat newInsets using
Insets.of(0,0,0,0)), then calls calcSafeAreaInsets(newInsets) which collapses
safe-area values to 0 and wipes --safe-area-inset-*; change the fallback to
compute and inject CSS using the original insets (the incoming insets variable)
instead of newInsets so calcSafeAreaInsets(insets) returns the real safe-area
values and injectSafeAreaCSS(...) restores correct CSS variables (refer to
WindowInsetsCompat newInsets, calcSafeAreaInsets, and injectSafeAreaCSS).
- Line 280: The call that always uses
getActivity().getWindow().getDecorView().setBackgroundColor(getThemeColor(getContext(),
android.R.attr.windowBackground)) is incorrect because
getThemeColor()/resolveAttribute can return a resource id for
android.R.attr.windowBackground; update getThemeColor or add a new helper that
resolves the TypedValue for getThemeColor(Context, int) and returns both
typedValue.resourceId and typedValue.data (or expose a boolean/resource id),
then replace the single setBackgroundColor call with logic that, when
typedValue.resourceId != 0, calls setBackgroundResource(resourceId) on
getDecorView(), otherwise calls setBackgroundColor(typedValue.data); modify the
getThemeColor() implementation (or its replacement) to use
context.getTheme().resolveAttribute(...) and surface resourceId vs data
accordingly so drawable/color resources are handled correctly.
In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`:
- Around line 342-343: The Range header lookup in WebViewLocalServer currently
checks only "Range" and "range" via requestHeaders.get(...), which misses
mixed-case variants; update the logic that sets rangeString to perform a
case-insensitive key lookup against requestHeaders (e.g., iterate
requestHeaders.keySet() and use equalsIgnoreCase("Range") or normalize keys) so
any header like "RaNgE" is detected and range handling works; modify the code
around the requestHeaders and rangeString assignment in WebViewLocalServer to
use that case-insensitive check.
In `@android/package.json`:
- Around line 2-14: Remove all Git conflict markers (<<<<<<<, =======, >>>>>>>)
and merge the two conflicting manifest blocks into a single valid JSON object:
pick the desired values for the "name", "version", "description", "homepage",
and "author" keys (from the conflicting entries) so only one set of those
properties exists, fix any trailing commas, and ensure the overall JSON is
syntactically valid; repeat the same removal/merge for the second conflict block
that also touches those same keys so the entire package.json contains one
consistent set of fields.
In `@cli/package.json`:
- Around line 2-14: Remove the Git conflict markers (<<<<<<<, =======, >>>>>>>)
and resolve which package identity to keep in package.json by choosing and
keeping one set of keys (either the `@capacitor-plus/cli` block with "version":
"8.0.8", "description": "Capacitor+: ...", "homepage": "https://capgo.app/...",
"author": "Capgo Team ..." or the `@capacitor/cli` block with "version": "8.3.0",
"description": "Capacitor: ...", "homepage": "https://capacitorjs.com",
"author": "Ionic Team ..."), then ensure the final JSON contains a single "name"
key and valid comma/brace syntax (no leftover markers), save the file, and run
an install/build to verify package.json parses correctly.
In `@cli/src/index.ts`:
- Around line 30-38: getPackageManager currently treats any non-'cocoapods'
value as 'SPM', so typos silently provision the wrong setup; update
getPackageManager to explicitly accept 'cocoapods' and 'spm' (and handle the
existing bundler branch when ios.packageManager === 'bundler') and throw/reject
for any other packageManager values with a clear error message. Locate function
getPackageManager and: 1) keep the existing bundler return when packageManager
=== 'cocoapods' and config.ios.packageManager === 'bundler'; 2) return
'Cocoapods' for 'cocoapods' and 'SPM' for 'spm' only; 3) otherwise throw an
informative Error mentioning the invalid --packagemanager value so callers fail
fast.
In `@cli/src/tasks/run.ts`:
- Around line 113-115: The log message in the logger.info call inside run.ts has
a typo ("listing" should be "listening"); update the string passed to
logger.info (the template that references options.https, options.host, and
options.port) to use "listening" instead of "listing" so the message reads
"...App running with live reload listening for: ...". Ensure you modify the
logger.info invocation that constructs the URL using options.https,
options.host, and options.port.
In `@cli/src/util/spm.ts`:
- Around line 100-108: Resolve the Git conflict markers in generatePackageText
by removing the <<<<<<</=======/>>>>>>> lines and keeping the new SPM fields:
ensure packageTraits and swiftToolsVersion are read from
config.app.extConfig.experimental?.ios?.spm (assign packageTraits and
swiftToolsVersion as shown) and use the correct iOS helper function that matches
the import at the top (either keep getMajoriOSVersion or
getMajorMinoriOSVersion—make the call to iosVersion use the same function name
as imported). After merging, ensure packageSwiftText is built using the
swiftToolsVersion variable and that no conflict markers remain so
generatePackageText compiles.
In `@core/package.json`:
- Around line 2-14: The package.json contains unresolved Git conflict markers
(<<<<<<<, =======, >>>>>>>) around metadata fields (name, version, description,
homepage, author) which produces invalid JSON; open package.json, remove the
conflict markers and decide which side's values to keep (either the
`@capacitor-plus/core` entries or the upstream `@capacitor/core` entries), ensure
the final file contains a single valid set of keys (name, version, description,
homepage, author) with proper JSON syntax, and save/commit the resolved file so
npm/CI can parse it.
In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m`:
- Line 32: The method implementation for getArray in CAPBridgedJSTypes.m has a
stray semicolon before the opening brace; remove the semicolon from the
implementation signature of - (NSArray * _Nullable)getArray:(NSString *
_Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue so the method reads
as a normal Objective-C implementation (no semicolon before the {) to fix the
compilation error.
In `@ios/package.json`:
- Around line 2-14: The package.json contains unresolved git conflict markers
(<<<<<<<, =======, >>>>>>>) in the metadata block for fields like "name",
"version", "description", "homepage", and "author"; remove the conflict markers
and reconcile the two versions so the file is valid JSON (choose the intended
values for "name"/"version"/"description"/"homepage"/"author" or merge them),
ensure commas and quotes remain correct, and save a clean package.json before
running npm to avoid the EJSONPARSE error.
In `@lerna.json`:
- Around line 16-20: The lerna.json contains unresolved Git conflict markers
around the "version" field; remove the conflict markers (<<<<<<< HEAD, =======,
>>>>>>> upstream/main) and set a single valid JSON "version" value (e.g.,
"8.3.0" or whichever release you intend to keep) so the file is valid JSON and
tooling can parse it; update only the "version" entry and ensure the file has no
leftover merge markers.
In `@package.json`:
- Around line 35-55: The package.json contains unresolved Git conflict markers
around dependencies (<<<<<<<, =======, >>>>>>>) — remove these markers and merge
the conflicting entries into a single valid dependencies list: pick and keep the
intended versions for "@types/node", "eslint", "tar", and any other duplicated
keys (remove or consolidate "prettier-pretty-check" if not needed), ensure
proper JSON punctuation (commas/quotes) so the dependencies block is valid JSON,
and run a quick npm/yarn install or JSON lint to verify the file parses.
---
Outside diff comments:
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`:
- Around line 263-277: In setStyle, don't overwrite the incoming style variable
with getStyleForTheme() because currentStatusBarStyle and currentGestureBarStyle
must retain STYLE_DEFAULT to indicate theme-following; instead compute a
resolvedStyle (or resolvedAppearance boolean) from getStyleForTheme() when
calling windowInsetsControllerCompat.setAppearanceLightStatusBars(...) and
setAppearanceLightNavigationBars(...), but assign the original style (not the
resolved one) to currentStatusBarStyle and currentGestureBarStyle so
handleOnConfigurationChanged() can detect STYLE_DEFAULT. Use the method name
setStyle and the symbols STYLE_DEFAULT, STYLE_DARK, getStyleForTheme(),
currentStatusBarStyle, currentGestureBarStyle, BAR_STATUS_BAR, BAR_GESTURE_BAR,
and the WindowInsetsControllerCompat appearance methods to guide the change.
In `@android/CHANGELOG.md`:
- Around line 6-252: The android/CHANGELOG.md contains unresolved Git conflict
markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) with two competing
changelog blocks; open CHANGELOG.md, remove the conflict markers and the
duplicate/undesired section, and keep a single finalized changelog entry (either
the local [8.0.8] block or the upstream [8.3.0+] block) merging any needed lines
manually so the file contains one coherent changelog without markers.
In `@CHANGELOG.md`:
- Around line 6-523: The file contains unresolved git merge conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) and duplicated release blocks
(e.g., headings "## [8.0.8]" and "# [8.3.0]"); do not hand-edit the
changelog—remove all conflict markers and restore CHANGELOG.md to the clean
generated state by discarding the manual merge (checkout the file from the
target branch or revert to the pre-merge version) and then trigger the automated
changelog generation/CI workflow (the repo's changelog generation script or
release workflow) so the changelog is regenerated correctly.
In `@cli/CHANGELOG.md`:
- Around line 6-280: The file contains unresolved git conflict markers (<<<<<<<
HEAD, =======, >>>>>>> upstream/main) around two competing changelog blocks
(e.g., headings "## [8.0.8]" and "# [8.3.0]"); remove the conflict markers and
reconcile the two blocks into a single valid changelog: either keep the
upstream/main section (8.3.0... 8.2.0...) and append the local 8.0.8/8.0.x notes
without duplication, or merge their entries chronologically, ensure only one set
of headings per version, remove any duplicate entries, and save as valid
Markdown with no leftover conflict tokens.
In `@cli/src/tasks/run.ts`:
- Around line 99-101: In run.ts replace the duplicate await use so the call to
writeCordovaAndroidManifest(cordovaPlugins, config, platformName, true) uses a
single await; locate the line containing "await await
writeCordovaAndroidManifest(...)" and remove the extra await to become a single
awaited call (ensuring the function still returns a Promise and behavior is
unchanged).
In `@core/CHANGELOG.md`:
- Around line 6-159: The file contains raw git conflict markers (<<<<<<< HEAD,
=======, >>>>>>> upstream/main) and duplicated changelog sections (e.g., "##
[8.0.8]" vs "# [8.3.0]"); remove the entire unresolved conflict block and
produce a single canonical changelog history. Edit core/CHANGELOG.md to delete
the conflict markers and one of the duplicated variant blocks (choose the
intended upstream history to keep), ensure headings remain valid Markdown and
chronological order is preserved, and run a quick diff to confirm no <<<<<<<,
=======, or >>>>>>> tokens remain.
In `@ios/CHANGELOG.md`:
- Around line 6-225: The changelog contains unresolved git conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main); open ios/CHANGELOG.md, remove
the conflict markers and manually merge the two conflicting sections into a
single coherent changelog entry (choose and combine the intended release entries
from the HEAD and upstream/main blocks), ensuring only one final changelog block
remains (remove the duplicate headings and keep chronological order), then save
and commit the resolved file.
---
Nitpick comments:
In `@cli/src/ios/common.ts`:
- Around line 30-44: In getCommonChecks, avoid awaiting
config.ios.packageManager multiple times: await it once into a local const (e.g.
const packageManager = await config.ios.packageManager) and use packageManager
in the subsequent comparisons and conditional logic (replace repeated awaits in
getCommonChecks with that local variable while keeping existing checks like
checkBundler, checkCocoaPods, checkSwiftToolsVersion, and
checkPackageTraitsRequirements intact).
In `@ios/Capacitor/Capacitor/CapacitorBridge.swift`:
- Around line 96-99: Remove the obsolete temp-VC plumbing: delete the deprecated
properties tmpWindow and tmpVCAppeared and remove any observer
registration/handling and code paths that reference them (the observer
add/remove and the code around the tmp view-controller flow currently using
tmpWindow/tmpVCAppeared in CapacitorBridge). Replace the runtime flow that
relied on the temporary UIWindow/notification with the normal VC
presentation/completion path (or a direct completion callback) so no code
references tmpWindow or tmpVCAppeared (search for tmpWindow, tmpVCAppeared,
tmpViewControllerAppeared, and the observer add/remove logic and remove/replace
those usages).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: ee3e6265-eb54-4b65-b839-ff3a7552532b
📒 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.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/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/assets/native-bridge.jsios/package.jsonlerna.jsonpackage.jsonscripts/pack-cli-assets.mjs
💤 Files with no reviewable changes (1)
- .github/ISSUE_TEMPLATE/feature-request.yml
| - uses: actions/checkout@v5 | ||
| with: | ||
| fetch-depth: 0 | ||
| ref: 'main' |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
cat -n .github/workflows/publish-ios.ymlRepository: Cap-go/capacitor-plus
Length of output: 1062
Don't hardcode the publish checkout to main.
Lines 21-24 force this job to publish whatever is on main, even when the workflow is manually dispatched from another branch or called from a release/tag workflow. Since this step publishes to CocoaPods, that can push the wrong podspec version and source tree.
Suggested change
- uses: actions/checkout@v5
with:
fetch-depth: 0
- ref: 'main'📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| ref: 'main' | |
| - uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.github/workflows/publish-ios.yml around lines 21 - 24, The checkout step
currently pins ref: 'main' which forces publishing from main; update the
actions/checkout@v5 step to use the workflow's triggering ref instead of
hardcoding 'main' (replace the ref:'main' entry so it derives from the workflow
context or input, e.g., use the event/dispatch/PR branch ref or a workflow
input) so the job checks out the branch/tag that triggered the workflow; ensure
fetch-depth: 0 remains to allow tags and history for CocoaPods publishing.
| WindowInsetsCompat newInsets = new WindowInsetsCompat.Builder(insets) | ||
| .setInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout(), Insets.of(0, 0, 0, 0)) | ||
| .build(); | ||
|
|
||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && hasViewportCover && insetHandlingEnabled) { | ||
| Insets safeAreaInsets = calcSafeAreaInsets(newInsets); | ||
| injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); |
There was a problem hiding this comment.
Inject safe-area CSS from the original insets in the fallback path.
Line 219 zeroes systemBars | displayCutout, so calcSafeAreaInsets(newInsets) on Line 223 always collapses the CSS variables to 0. On the old-WebView fallback path, that wipes --safe-area-inset-* even when viewport-fit=cover is enabled.
Suggested change
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && hasViewportCover && insetHandlingEnabled) {
- Insets safeAreaInsets = calcSafeAreaInsets(newInsets);
+ Insets safeAreaInsets = calcSafeAreaInsets(insets);
injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left);
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| WindowInsetsCompat newInsets = new WindowInsetsCompat.Builder(insets) | |
| .setInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout(), Insets.of(0, 0, 0, 0)) | |
| .build(); | |
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && hasViewportCover && insetHandlingEnabled) { | |
| Insets safeAreaInsets = calcSafeAreaInsets(newInsets); | |
| injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); | |
| WindowInsetsCompat newInsets = new WindowInsetsCompat.Builder(insets) | |
| .setInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout(), Insets.of(0, 0, 0, 0)) | |
| .build(); | |
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && hasViewportCover && insetHandlingEnabled) { | |
| Insets safeAreaInsets = calcSafeAreaInsets(insets); | |
| injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`
around lines 218 - 224, The fallback path currently builds newInsets by zeroing
out systemBars and displayCutout (WindowInsetsCompat newInsets using
Insets.of(0,0,0,0)), then calls calcSafeAreaInsets(newInsets) which collapses
safe-area values to 0 and wipes --safe-area-inset-*; change the fallback to
compute and inject CSS using the original insets (the incoming insets variable)
instead of newInsets so calcSafeAreaInsets(insets) returns the real safe-area
values and injectSafeAreaCSS(...) restores correct CSS variables (refer to
WindowInsetsCompat newInsets, calcSafeAreaInsets, and injectSafeAreaCSS).
| windowInsetsControllerCompat.setAppearanceLightNavigationBars(!style.equals(STYLE_DARK)); | ||
| } | ||
|
|
||
| getActivity().getWindow().getDecorView().setBackgroundColor(getThemeColor(getContext(), android.R.attr.windowBackground)); |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
find . -type f -name "SystemBars.java" | head -20Repository: Cap-go/capacitor-plus
Length of output: 138
🏁 Script executed:
cat -n android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java | sed -n '270,330p'Repository: Cap-go/capacitor-plus
Length of output: 2918
🏁 Script executed:
cat -n android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java | grep -n "getThemeColor" | head -10Repository: Cap-go/capacitor-plus
Length of output: 278
🏁 Script executed:
cat android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java | grep -n "getThemeColor"Repository: Cap-go/capacitor-plus
Length of output: 264
🏁 Script executed:
cat android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java | wc -lRepository: Cap-go/capacitor-plus
Length of output: 68
Fix windowBackground attribute resolution to handle drawable resources.
resolveAttribute() can return a resource ID in typedValue.resourceId when android.R.attr.windowBackground points to a drawable or color resource. The current code only checks typedValue.data, which is invalid for resource references and will apply the wrong background or fail to update properly after theme/configuration changes.
Replace getThemeColor() with a method that checks typedValue.resourceId first and uses setBackgroundResource() for resources or setBackgroundColor() for inline colors. This issue affects line 280 and the getThemeColor() method at lines 313-318.
Suggested change
- getActivity().getWindow().getDecorView().setBackgroundColor(getThemeColor(getContext(), android.R.attr.windowBackground));
+ applyWindowBackground(getActivity().getWindow().getDecorView(), android.R.attr.windowBackground);
@@
- public int getThemeColor(Context context, int attrRes) {
+ private void applyWindowBackground(View view, int attrRes) {
TypedValue typedValue = new TypedValue();
-
- Resources.Theme theme = context.getTheme();
- theme.resolveAttribute(attrRes, typedValue, true);
- return typedValue.data;
+ Resources.Theme theme = view.getContext().getTheme();
+ if (!theme.resolveAttribute(attrRes, typedValue, true)) {
+ return;
+ }
+ if (typedValue.resourceId != 0) {
+ view.setBackgroundResource(typedValue.resourceId);
+ } else {
+ view.setBackgroundColor(typedValue.data);
+ }
}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java` at
line 280, The call that always uses
getActivity().getWindow().getDecorView().setBackgroundColor(getThemeColor(getContext(),
android.R.attr.windowBackground)) is incorrect because
getThemeColor()/resolveAttribute can return a resource id for
android.R.attr.windowBackground; update getThemeColor or add a new helper that
resolves the TypedValue for getThemeColor(Context, int) and returns both
typedValue.resourceId and typedValue.data (or expose a boolean/resource id),
then replace the single setBackgroundColor call with logic that, when
typedValue.resourceId != 0, calls setBackgroundResource(resourceId) on
getDecorView(), otherwise calls setBackgroundColor(typedValue.data); modify the
getThemeColor() implementation (or its replacement) to use
context.getTheme().resolveAttribute(...) and surface resourceId vs data
accordingly so drawable/color resources are handled correctly.
| Map<String, String> requestHeaders = request.getRequestHeaders(); | ||
| String rangeString = requestHeaders.get("Range") != null ? requestHeaders.get("Range") : requestHeaders.get("range"); |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, locate the file
fd "WebViewLocalServer.java" android/Repository: Cap-go/capacitor-plus
Length of output: 137
🏁 Script executed:
# Read the file around lines 342-343 to see the context
wc -l android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.javaRepository: Cap-go/capacitor-plus
Length of output: 141
🏁 Script executed:
# Read lines around 342-343 with context
sed -n '330,360p' android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java | cat -nRepository: Cap-go/capacitor-plus
Length of output: 1895
🏁 Script executed:
# Search for WebResourceRequest usage and documentation
rg "WebResourceRequest" android/capacitor/src/main/java/com/getcapacitor/ -A 3 -B 3 | head -40Repository: Cap-go/capacitor-plus
Length of output: 4220
🏁 Script executed:
# Search for other uses of getRequestHeaders in the codebase
rg "getRequestHeaders" android/capacitor/src/main/java/ -B 2 -A 5Repository: Cap-go/capacitor-plus
Length of output: 3095
🏁 Script executed:
# Get more context around the Accept header check
sed -n '290,330p' android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java | cat -nRepository: Cap-go/capacitor-plus
Length of output: 1927
🏁 Script executed:
# Find the Accept header check line
rg "Accept.*equalsIgnoreCase" android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java -B 3 -A 3Repository: Cap-go/capacitor-plus
Length of output: 47
🏁 Script executed:
# Search for Accept in the file
rg "Accept" android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java -B 2 -A 2Repository: Cap-go/capacitor-plus
Length of output: 1135
Make the Range lookup fully case-insensitive.
Lines 342-343 only check exact keys "Range" and "range". The same file already uses equalsIgnoreCase() for the Accept header (confirming HTTP headers are case-insensitive), but this pattern is missing for the Range header. Mixed-case variants like "RaNgE" would bypass range request handling and regress partial responses.
🔧 Proposed fix
- Map<String, String> requestHeaders = request.getRequestHeaders();
- String rangeString = requestHeaders.get("Range") != null ? requestHeaders.get("Range") : requestHeaders.get("range");
+ String rangeString = null;
+ for (Map.Entry<String, String> entry : request.getRequestHeaders().entrySet()) {
+ if ("Range".equalsIgnoreCase(entry.getKey())) {
+ rangeString = entry.getValue();
+ break;
+ }
+ }📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| Map<String, String> requestHeaders = request.getRequestHeaders(); | |
| String rangeString = requestHeaders.get("Range") != null ? requestHeaders.get("Range") : requestHeaders.get("range"); | |
| String rangeString = null; | |
| for (Map.Entry<String, String> entry : request.getRequestHeaders().entrySet()) { | |
| if ("Range".equalsIgnoreCase(entry.getKey())) { | |
| rangeString = entry.getValue(); | |
| break; | |
| } | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`
around lines 342 - 343, The Range header lookup in WebViewLocalServer currently
checks only "Range" and "range" via requestHeaders.get(...), which misses
mixed-case variants; update the logic that sets rangeString to perform a
case-insensitive key lookup against requestHeaders (e.g., iterate
requestHeaders.keySet() and use equalsIgnoreCase("Range") or normalize keys) so
any header like "RaNgE" is detected and range handling works; modify the code
around the requestHeaders and rangeString assignment in WebViewLocalServer to
use that case-insensitive check.
| <<<<<<< 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 |
There was a problem hiding this comment.
Resolve both merge conflicts in this manifest.
The blocks at Lines 2-14 and 34-39 leave android/package.json in an invalid JSON state. That is enough to break npm install for the Android package before any Gradle verification can start.
Also applies to: 34-39
🧰 Tools
🪛 Biome (2.4.10)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: String values must be double quoted.
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-8: End of file expected
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-14: End of file expected
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@android/package.json` around lines 2 - 14, Remove all Git conflict markers
(<<<<<<<, =======, >>>>>>>) and merge the two conflicting manifest blocks into a
single valid JSON object: pick the desired values for the "name", "version",
"description", "homepage", and "author" keys (from the conflicting entries) so
only one set of those properties exists, fix any trailing commas, and ensure the
overall JSON is syntactically valid; repeat the same removal/merge for the
second conflict block that also touches those same keys so the entire
package.json contains one consistent set of fields.
| <<<<<<< HEAD | ||
| "name": "@capacitor-plus/core", | ||
| "version": "8.0.8", | ||
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| ======= | ||
| "name": "@capacitor/core", | ||
| "version": "8.3.0", | ||
| "description": "Capacitor: Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capacitorjs.com", | ||
| "author": "Ionic Team <hi@ionic.io> (https://ionic.io)", | ||
| >>>>>>> upstream/main |
There was a problem hiding this comment.
Resolve the merge markers before merging.
The conflict block at Lines 2-14 makes this file invalid JSON, and CI is already failing with EJSONPARSE. npm install will remain broken until one side is chosen and the markers are removed.
🧰 Tools
🪛 Biome (2.4.10)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: String values must be double quoted.
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-8: End of file expected
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-14: End of file expected
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@core/package.json` around lines 2 - 14, The package.json contains unresolved
Git conflict markers (<<<<<<<, =======, >>>>>>>) around metadata fields (name,
version, description, homepage, author) which produces invalid JSON; open
package.json, remove the conflict markers and decide which side's values to keep
(either the `@capacitor-plus/core` entries or the upstream `@capacitor/core`
entries), ensure the final file contains a single valid set of keys (name,
version, description, homepage, author) with proper JSON syntax, and save/commit
the resolved file so npm/CI can parse it.
| return defaultValue; | ||
| } | ||
|
|
||
| - (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue; { |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Verify there is no Objective-C method implementation signature with '; {'
rg -nP '^\s*-\s*\([^)]*\)\s*[^{]*;\s*\{' ios/Capacitor/Capacitor/CAPBridgedJSTypes.m
# Expected: no matchesRepository: Cap-go/capacitor-plus
Length of output: 174
Remove the stray semicolon in method implementation signature.
Objective-C method implementations cannot have a semicolon before the opening brace. This syntax error will prevent compilation.
🐛 Proposed fix
-- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue; {
+- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue {📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue; { | |
| - (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue { |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m` at line 32, The method
implementation for getArray in CAPBridgedJSTypes.m has a stray semicolon before
the opening brace; remove the semicolon from the implementation signature of -
(NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray *
_Nullable)defaultValue so the method reads as a normal Objective-C
implementation (no semicolon before the {) to fix the compilation error.
| <<<<<<< 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 |
There was a problem hiding this comment.
Resolve both conflict blocks before running npm again.
The markers at Lines 2-14 and 36-41 make this manifest invalid JSON, which is why the workflow is failing with EJSONPARSE. The iOS package cannot be installed or verified until these conflicts are resolved.
Also applies to: 36-41
🧰 Tools
🪛 Biome (2.4.10)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: String values must be double quoted.
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-8: End of file expected
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-14: End of file expected
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@ios/package.json` around lines 2 - 14, The package.json contains unresolved
git conflict markers (<<<<<<<, =======, >>>>>>>) in the metadata block for
fields like "name", "version", "description", "homepage", and "author"; remove
the conflict markers and reconcile the two versions so the file is valid JSON
(choose the intended values for
"name"/"version"/"description"/"homepage"/"author" or merge them), ensure commas
and quotes remain correct, and save a clean package.json before running npm to
avoid the EJSONPARSE error.
| <<<<<<< HEAD | ||
| "version": "8.0.8", | ||
| ======= | ||
| "version": "8.3.0", | ||
| >>>>>>> upstream/main |
There was a problem hiding this comment.
Resolve merge markers in lerna.json immediately.
Line 16 introduces unresolved conflict markers, making the file invalid JSON and breaking tooling that parses lerna.json.
Suggested fix
-<<<<<<< HEAD
- "version": "8.0.8",
-=======
"version": "8.3.0",
->>>>>>> upstream/main📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <<<<<<< HEAD | |
| "version": "8.0.8", | |
| ======= | |
| "version": "8.3.0", | |
| >>>>>>> upstream/main | |
| "version": "8.3.0", |
🧰 Tools
🪛 Biome (2.4.10)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: String values must be double quoted.
(parse)
[error] 17-17: End of file expected
(parse)
[error] 17-17: End of file expected
(parse)
[error] 17-17: End of file expected
(parse)
[error] 17-18: End of file expected
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 19-19: End of file expected
(parse)
[error] 19-19: End of file expected
(parse)
[error] 19-19: End of file expected
(parse)
[error] 19-20: End of file expected
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@lerna.json` around lines 16 - 20, The lerna.json contains unresolved Git
conflict markers around the "version" field; remove the conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) and set a single valid JSON
"version" value (e.g., "8.3.0" or whichever release you intend to keep) so the
file is valid JSON and tooling can parse it; update only the "version" entry and
ensure the file has no leftover merge markers.
| <<<<<<< 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 the leftover merge markers in this dependency block.
The root package.json is invalid JSON as committed, and CI is already failing with EJSONPARSE during npm install. None of the downstream build or test steps can run until this hunk is resolved.
🧰 Tools
🪛 Biome (2.4.10)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: String values must be double quoted.
(parse)
[error] 36-36: End of file expected
(parse)
[error] 36-36: End of file expected
(parse)
[error] 36-36: End of file expected
(parse)
[error] 36-36: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 39-39: End of file expected
(parse)
[error] 39-39: End of file expected
(parse)
[error] 39-39: End of file expected
(parse)
[error] 39-40: End of file expected
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 41-41: End of file expected
(parse)
[error] 41-41: End of file expected
(parse)
[error] 41-41: End of file expected
(parse)
[error] 41-41: End of file expected
(parse)
[error] 42-42: End of file expected
(parse)
[error] 42-42: End of file expected
(parse)
[error] 42-42: End of file expected
(parse)
[error] 42-43: End of file expected
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character /
(parse)
[error] 44-44: End of file expected
(parse)
[error] 44-44: End of file expected
(parse)
[error] 44-44: End of file expected
(parse)
[error] 44-44: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 49-49: End of file expected
(parse)
[error] 49-49: End of file expected
(parse)
[error] 49-49: End of file expected
(parse)
[error] 49-50: End of file expected
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 54-54: End of file expected
(parse)
[error] 54-54: End of file expected
(parse)
[error] 54-54: End of file expected
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: String values must be double quoted.
(parse)
[error] 55-55: unexpected character /
(parse)
[error] 55-55: String values must be double quoted.
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@package.json` around lines 35 - 55, The package.json contains unresolved Git
conflict markers around dependencies (<<<<<<<, =======, >>>>>>>) — remove these
markers and merge the conflicting entries into a single valid dependencies list:
pick and keep the intended versions for "@types/node", "eslint", "tar", and any
other duplicated keys (remove or consolidate "prettier-pretty-check" if not
needed), ensure proper JSON punctuation (commas/quotes) so the dependencies
block is valid JSON, and run a quick npm/yarn install or JSON lint to verify the
file parses.
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
Release Notes
New Features
show()andhide()options parameters optional.Bug Fixes
Chores