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 merges upstream Capacitor changes alongside package manager refactoring, SystemBars enhancements, native bridge URL handling improvements, and GitHub workflow additions. Multiple files contain unresolved merge conflicts requiring resolution before integration. Changes
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes This PR contains multiple unresolved merge conflicts across package manifests and changelogs, substantial refactoring of package manager detection across CLI task files, complex SystemBars lifecycle and safe-area handling changes, native bridge URL handling enhancements, and structural changes to service configuration that span multiple files and subsystems. The heterogeneous nature of changes across native code (Java, Swift), TypeScript CLI tooling, and configuration requires careful review of each distinct subsystem while resolving conflicts. 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: b1e8ef8072
ℹ️ 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.
Resolve merge markers in SPM generator function
The merge conflict markers left in generatePackageText make cli/src/util/spm.ts invalid TypeScript, so the CLI cannot compile or run any command path that imports this module. This is a hard failure introduced by the sync commit and will block builds before runtime logic is even evaluated.
Useful? React with 👍 / 👎.
| @@ -1,9 +1,17 @@ | |||
| { | |||
| <<<<<<< HEAD | |||
There was a problem hiding this comment.
Remove conflict markers from CLI package manifest
The unresolved conflict marker at the top of cli/package.json makes the manifest invalid JSON, which prevents package manager/workspace tooling from parsing this package (install, build, publish, and scripts that read package metadata will fail). This blocks normal repository workflows immediately.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 16
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (8)
cli/src/tasks/sourcemaps.ts (1)
18-23:⚠️ Potential issue | 🟠 MajorAvoid deleting
.mapwhen no inline replacement occurred.At Line 23, the map is removed even if Line 18 didn’t actually replace anything (token mismatch/path variant). That can silently break sourcemaps.
💡 Suggested fix
- const result = bufFile.replace( - `sourceMappingURL=${file}.map`, - 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + bufMap, - ); - writeFileSync(targetFile, result); - unlinkSync(mapFile); + const sourceMapToken = `sourceMappingURL=${file}.map`; + const result = bufFile.replace( + sourceMapToken, + 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + bufMap, + ); + if (result !== bufFile) { + writeFileSync(targetFile, result); + unlinkSync(mapFile); + }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/tasks/sourcemaps.ts` around lines 18 - 23, The current code always deletes the .map file (unlinkSync(mapFile)) even if the inline replacement didn't occur; change the flow in the function handling bufFile/bufMap/targetFile/mapFile so that you perform the replacement (using the existing replace call or checking bufFile.includes(`sourceMappingURL=${file}.map`)) and only call unlinkSync(mapFile) when the replacement actually changed the content (e.g., result !== bufFile or contains match); keep writing the targetFile only when appropriate and avoid deleting mapFile on no-match.android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java (1)
264-277:⚠️ Potential issue | 🟠 MajorPreserve requested style value so
DEFAULTstays adaptive after configuration changes.On Line 264,
DEFAULTis resolved to a concrete style, and on Lines 271/276 that resolved value is persisted. Then Lines 89-90 reapply a fixed LIGHT/DARK style, soDEFAULTno longer follows theme changes.💡 Proposed fix
private void setStyle(String style, String bar) { - if (style.equals(STYLE_DEFAULT)) { - style = getStyleForTheme(); - } + String requestedStyle = style; + String resolvedStyle = STYLE_DEFAULT.equals(style) ? getStyleForTheme() : style; Window window = getActivity().getWindow(); WindowInsetsControllerCompat windowInsetsControllerCompat = WindowCompat.getInsetsController(window, window.getDecorView()); if (bar.isEmpty() || bar.equals(BAR_STATUS_BAR)) { - currentStatusBarStyle = style; - windowInsetsControllerCompat.setAppearanceLightStatusBars(!style.equals(STYLE_DARK)); + currentStatusBarStyle = requestedStyle; + windowInsetsControllerCompat.setAppearanceLightStatusBars(!resolvedStyle.equals(STYLE_DARK)); } if (bar.isEmpty() || bar.equals(BAR_GESTURE_BAR)) { - currentGestureBarStyle = style; - windowInsetsControllerCompat.setAppearanceLightNavigationBars(!style.equals(STYLE_DARK)); + currentGestureBarStyle = requestedStyle; + windowInsetsControllerCompat.setAppearanceLightNavigationBars(!resolvedStyle.equals(STYLE_DARK)); } getActivity().getWindow().getDecorView().setBackgroundColor(getThemeColor(getContext(), android.R.attr.windowBackground)); }Also applies to: 89-90
🤖 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 264 - 277, When applying a style, preserve the caller's requested value instead of persisting the resolved LIGHT/DARK: save the original parameter (e.g., requestedStyle = style), compute a resolvedStyle = requestedStyle.equals(STYLE_DEFAULT) ? getStyleForTheme() : requestedStyle, then call WindowInsetsControllerCompat.setAppearanceLightStatusBars/setAppearanceLightNavigationBars using resolvedStyle but store the requested value in the persistent fields (currentStatusBarStyle/currentGestureBarStyle). Also update the reapply logic (the code that currently forces LIGHT/DARK on config changes) to resolve STYLE_DEFAULT via getStyleForTheme() at reapply time rather than using the persisted resolved value.CHANGELOG.md (1)
6-523:⚠️ Potential issue | 🔴 CriticalResolve the merge conflict and stop manual edits in auto-managed changelog
Line 6 through Line 523 still contains unresolved conflict markers (
<<<<<<<,=======,>>>>>>>), which is a hard merge blocker. For this repo,CHANGELOG.mdshould be regenerated by CI/CD instead of manually merged; resolve by removing conflict markers and re-running the changelog automation path.As per coding guidelines, "Do not manually edit
CHANGELOG.md; it is managed automatically by CI/CD".🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@CHANGELOG.md` around lines 6 - 523, The CHANGELOG.md contains unresolved Git conflict markers (<<<<<<<, =======, >>>>>>>) between the two release blocks (e.g., the HEAD block starting with "## [8.0.8]" and the upstream block starting with "# [8.3.0]"), which blocks merges; remove the conflict markers and any accidental manual edits, restore the file to a clean state (no conflict markers or hand-edited changelog entries), and then trigger the repository's changelog automation/CI workflow to regenerate the file instead of committing manual changes—ensure you do not manually edit CHANGELOG.md going forward per the repo guideline.ios/CHANGELOG.md (1)
6-225:⚠️ Potential issue | 🔴 CriticalMerge conflict markers are still present (release blocker).
This changelog section is unresolved and contains both sides of the merge. Please resolve the block and remove conflict markers so markdown structure is valid and CI linting can pass reliably.
🤖 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 merge conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) mixing two release sections; remove the conflict markers and resolve the block so only the intended changelog text remains (either keep the HEAD section, the upstream/main section, or merge their entries into a single coherent section), ensuring a valid Markdown structure (one set of version headers like "## [8.x.x]..." and no leftover markers).android/CHANGELOG.md (1)
6-252:⚠️ Potential issue | 🔴 CriticalResolve merge conflict markers before merge (blocker).
This file still contains Git conflict markers and dual branch content, so the changelog is not in a resolved state and will continue to trigger markdown/lint/doc failures. Remove
<<<<<<<,=======,>>>>>>>and keep one coherent merged history.🤖 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 file contains unresolved Git conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) with duplicate changelog blocks (e.g., "## [8.0.8]" and "# [8.3.0]"); open CHANGELOG.md, remove the conflict markers and choose a single coherent history to keep (either the HEAD block or the upstream/main block, or merge their entries deterministically), ensure only one set of version headers remain and fix ordering/formatting so the markdown lints cleanly.core/CHANGELOG.md (1)
6-159:⚠️ Potential issue | 🔴 CriticalConflict markers in
core/CHANGELOG.mdmust be resolved.The file includes unresolved Git conflict markers and duplicated branch content. This should be cleaned up before merge to restore a valid changelog and eliminate downstream markdownlint noise.
🤖 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 CHANGELOG contains unresolved Git conflict markers (<<<<<<<, =======, >>>>>>>) and duplicated release sections (e.g., the "## [8.0.8]..." block and the "# [8.3.0]..." block); open core/CHANGELOG.md, remove the conflict markers and the unwanted duplicate content, reconcile the two sides into a single coherent changelog (choose which release set to keep or merge entries), preserve valid Markdown headings (e.g., release headers like "## [8.0.8]" or "# [8.3.0]") and commit the cleaned file so the file no longer contains <<<<<<<, =======, or >>>>>>> markers and retains a single chronological list of releases.cli/CHANGELOG.md (1)
6-280:⚠️ Potential issue | 🔴 CriticalUnresolved conflict block remains in changelog.
The file still includes
<<<<<<< HEAD/=======/>>>>>>> upstream/main. This is a merge blocker and must be manually resolved so the changelog has a single valid sequence of releases.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/CHANGELOG.md` around lines 6 - 280, The changelog contains an unresolved merge conflict with markers '<<<<<<< HEAD', '=======', and '>>>>>>> upstream/main' and duplicated release blocks (e.g., "## [8.0.8]" vs "# [8.3.0]"); remove the conflict markers and reconcile the two sections into a single, coherent release history (prefer the upstream/main sequence if that is the intended canonical changelog), deleting duplicate or stale entries such as the HEAD block, ensure only one valid sequence of release headers remains (e.g., keep the "8.3.0".. "8.1.0" blocks), and save so there are no remaining merge markers or malformed markdown.android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java (1)
342-361:⚠️ Potential issue | 🟠 MajorValidate
Rangebefore switching to partial-content mode.Any non-null
Rangevalue now drops into the 206 branch, but malformed values (bytes=,foo, multi-range headers, non-numeric bounds) will still hitparts[1]/Integer.parseInt(...)and throw unchecked exceptions here. Please guard for a single validbytes=start-endrange before returning partial content, and fall back to the normal response or a 416 when parsing fails.Suggested hardening
- if (rangeString != null) { + if (rangeString != null) { InputStream responseStream = new LollipopLazyInputStream(handler, request); String mimeType = getMimeType(path, responseStream); Map<String, String> tempResponseHeaders = handler.buildDefaultResponseHeaders(); int statusCode = 206; try { + if (!rangeString.startsWith("bytes=") || rangeString.contains(",")) { + return new WebResourceResponse( + mimeType, + handler.getEncoding(), + handler.getStatusCode(), + handler.getReasonPhrase(), + tempResponseHeaders, + responseStream + ); + } + int totalRange = responseStream.available(); - String[] parts = rangeString.split("="); - String[] streamParts = parts[1].split("-"); + String[] streamParts = rangeString.substring("bytes=".length()).split("-", 2); + if (streamParts.length == 0 || streamParts[0].isBlank()) { + statusCode = 416; + return new WebResourceResponse(mimeType, handler.getEncoding(), statusCode, "Range Not Satisfiable", tempResponseHeaders, responseStream); + } + String fromRange = streamParts[0]; int range = totalRange - 1; - if (streamParts.length > 1) { + if (streamParts.length > 1 && !streamParts[1].isBlank()) { range = Integer.parseInt(streamParts[1]); } tempResponseHeaders.put("Accept-Ranges", "bytes"); tempResponseHeaders.put("Content-Range", "bytes " + fromRange + "-" + range + "/" + totalRange); - } catch (IOException e) { - statusCode = 404; + } catch (IOException | NumberFormatException e) { + statusCode = 416; }🤖 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 - 361, The current logic treats any non-null rangeString as a valid byte-range and immediately parses parts[1], which throws on malformed values; update the Range handling around requestHeaders/rangeString (the branch that creates LollipopLazyInputStream, calls getMimeType and uses handler.buildDefaultResponseHeaders) to first validate the header matches a single "bytes=start-end" pattern (no multiple ranges), ensure start and end (when present) are numeric (allow open-ended like "bytes=500-" or "-500" if you want to support suffix ranges), and only then switch to 206 partial-content and set Accept-Ranges/Content-Range; if validation fails or parsing throws (e.g., NumberFormatException) fall back to sending the normal full response or return 416 (choose the project preference), and ensure any exceptions from parsing are caught and handled instead of propagating.
🧹 Nitpick comments (7)
.github/workflows/needs-reply.yml (2)
12-12: Consider pinning action to commit SHA for supply chain security.The workflow uses
imhoffd/needs-reply@v2, which references a mutable version tag. For better supply chain security and reproducibility, consider pinning to a specific commit SHA.🔒 Example of SHA pinning
- - name: Close old issues that need reply - uses: imhoffd/needs-reply@v2 + - name: Close old issues that need reply + uses: imhoffd/needs-reply@<commit-sha> # v2You can find the commit SHA for the v2 tag in the action's repository.
🤖 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 tag imhoffd/needs-reply@v2 with a pinned commit SHA; locate the workflow step that references imhoffd/needs-reply@v2 and change it to imhoffd/needs-reply@<commit-sha> (the full 40-char SHA for the v2 tag) so the action is fixed to a specific commit for supply-chain security and reproducibility.
8-8: Job name "build" is misleading.The job is named
buildbut it actually closes stale issues. Consider renaming to better reflect its purpose, such asclose-stale-issuesorneeds-reply-cleanup.♻️ Suggested rename
jobs: - build: + close-stale-issues: runs-on: ubuntu-latest🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.github/workflows/needs-reply.yml at line 8, Rename the misleading job key "build" to a descriptive name like "close-stale-issues" (e.g., change jobs.build -> jobs.close-stale-issues) and update any references to that job elsewhere in the workflow (for example any needs: build, if: conditions, or job badges) so they point to the new job key; ensure the job's name: field (if present) is also updated to match the new semantic name.cli/src/tasks/migrate-spm.ts (1)
16-16: Use strict equality (===) for consistency.The comparison uses
==instead of===. While functionally equivalent for string comparisons, strict equality is the convention used elsewhere in this codebase (e.g.,cli/src/ios/common.tsline 32-36).🔧 Suggested fix
- if ((await config.ios.packageManager) == 'SPM') { + if ((await config.ios.packageManager) === 'SPM') {🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/tasks/migrate-spm.ts` at line 16, Update the equality check to use strict equality: replace the loose comparison of config.ios.packageManager against 'SPM' with a strict === comparison (i.e., in the if condition that reads if ((await config.ios.packageManager) == 'SPM') change == to ===) to match the codebase convention used elsewhere.cli/src/tasks/update.ts (2)
48-62: Logic issue: checks array is replaced instead of accumulated.If multiple platforms are processed and multiple platforms require checks, the current logic replaces
checksentirely rather than accumulating. While this may work if only iOS adds checks currently, the pattern differs from the deprecatedupdateCheckswhich usespush().Consider using array spread or push to accumulate checks across platforms:
♻️ Proposed fix to accumulate checks
export async function addUpdateChecks(config: Config, platforms: string[]): Promise<CheckFunction[]> { - let checks: CheckFunction[] = []; + const checks: CheckFunction[] = []; for (const platformName of platforms) { if (platformName === config.ios.name) { - checks = await getCommonChecks(config); + checks.push(...(await getCommonChecks(config))); } else if (platformName === config.android.name) { continue; } else if (platformName === config.web.name) { continue; } else { throw `Platform ${platformName} is not valid.`; } } return checks; }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/tasks/update.ts` around lines 48 - 62, The addUpdateChecks function currently replaces the checks array (checks = await getCommonChecks(config)) when processing platforms (e.g., platformName === config.ios.name) instead of accumulating results; change this to append the checks returned by getCommonChecks to the existing checks array (use checks.push(...await getCommonChecks(config)) or checks = [...checks, ...(await getCommonChecks(config))]) so checks from multiple platforms are preserved; keep the existing platform branching (android/web/else) and apply the same accumulation pattern for any future branches that return check arrays.
57-59: Consider throwing an Error object instead of a plain string.Throwing a plain string loses stack trace information. While this matches the existing pattern in
updateChecks, consider using an Error for better debugging.♻️ Proposed fix
} else { - throw `Platform ${platformName} is not valid.`; + throw new Error(`Platform ${platformName} is not valid.`); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/tasks/update.ts` around lines 57 - 59, Replace the plain-string throw in the else branch with an Error object to preserve stack traces: change the throw `Platform ${platformName} is not valid.` to throw new Error(...) so that the error includes the same message but retains stack information; also align similar behavior with the existing updateChecks pattern if present (i.e., use Error objects consistently) and update any callers/tests that expect a string if necessary.cli/src/util/spm.ts (1)
206-221: Consider making this function synchronous.The function is declared
asyncbut contains no asynchronous operations. It could be a regular synchronous function. However, if this is for consistency with other check functions that may be async, this is acceptable.♻️ Proposed fix
-export async function checkSwiftToolsVersion(config: Config, version: string | undefined): Promise<string | null> { +export function checkSwiftToolsVersion(config: Config, version: string | undefined): string | null {🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/util/spm.ts` around lines 206 - 221, The function checkSwiftToolsVersion is declared async but has no await/async operations; make it a synchronous function by removing the async keyword and changing its return type from Promise<string | null> to string | null, keeping the same logic and the swiftToolsVersionRegex; update any call sites that currently await its result to handle a direct return (remove await or adapt accordingly) and adjust any tests or type annotations referencing Promise<string | null> to the new string | null signature.cli/src/index.ts (1)
30-38: Consider using a stricter type forpackageManagerparameter.The
anytype allows any value to be passed. Since this is meant to accept CLI input like'cocoapods'or'spm', consider usingstring | undefinedfor better type safety.♻️ Proposed fix
-async function getPackageManager(config: Config, packageManager: any): Promise<PackageManager> { +async function getPackageManager(config: Config, packageManager: string | undefined): Promise<PackageManager> {🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/index.ts` around lines 30 - 38, Change the loose any parameter on getPackageManager to a stricter type (e.g., packageManager: string | undefined) and update the function to handle CLI string input explicitly; in getPackageManager ensure you compare packageManager against the expected literal (like 'cocoapods' or 'spm'), normalize/case-fold the input if necessary, and return the correct PackageManager union (matching the existing PackageManager type) — for example returning 'bundler' when config.ios.packageManager === 'bundler', 'Cocoapods' for cocoapods, and 'SPM' otherwise.
🤖 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:
- Around line 1-21: Add an explicit permissions block to the workflow
(top-level, before jobs) to follow least-privilege; the action
imhoffd/needs-reply@v2 only needs permission to manage issues, so add a
permissions mapping granting issues: write (and no broader repo-wide
permissions). Ensure the permissions section is added alongside the existing
name/on keys and not inside a job or step so the workflow-level token scope is
limited to only what the needs-reply action requires.
In @.github/workflows/publish-ios.yml:
- Around line 27-30: The workflow currently calls the publish step by running
the script target native-podspec.sh publish without verifying prerequisites;
update the job to run preflight checks before invoking native-podspec.sh
publish: verify the COCOAPODS_TRUNK_TOKEN environment variable is set (fail fast
with a clear message if empty) and verify the current Git tag/version exists
(e.g., ensure git describe --exact-match or git tag -l for the expected tag
returns a match) so that native-podspec.sh publish only runs when token and tag
validations pass; keep these checks in the same job right before the run that
calls native-podspec.sh publish and surface clear failure messages when they
fail.
- Around line 21-24: The checkout step currently hardcodes ref: 'main'
(actions/checkout@v5) which forces publishing from main; remove that hardcoded
ref and instead use the triggering ref or a workflow input (e.g., replace ref:
'main' with a variable like '${{ github.ref }}' or '${{ inputs.ref || github.ref
}}' and add a workflow_call input "ref" if needed) so the workflow checks out
the actual revision that triggered the run rather than always main.
In `@android/package.json`:
- Around line 2-14: The package.json contains unresolved Git conflict markers
(<<<<<<< HEAD, =======, >>>>>>> upstream/main) around fields like "name",
"version", "description", "homepage", and "author"; remove the conflict markers
and decide which block to keep or merge values so the file is valid JSON (e.g.,
choose either the `@capacitor-plus/android` block or the `@capacitor/android` block
or combine fields appropriately), then ensure the final JSON has a single
"name"/"version"/"description"/"homepage"/"author" set and no leftover markers
so package-manager parsing succeeds.
In `@cli/package.json`:
- Around line 2-14: Resolve the merge conflict in package.json by removing the
Git conflict markers and choosing the intended package metadata for the CLI:
update the "name", "version", "description", "homepage", and "author" fields to
the single, correct values (ensure only one JSON object remains), validate the
resulting JSON is well-formed, and confirm the chosen identity (e.g., values for
"name" and "version") is intentional before committing; check the "name" and
"version" fields specifically to avoid accidentally publishing under the wrong
package identity.
In `@cli/src/declarations.ts`:
- Around line 512-564: Correct the typo in the JSDoc for the experimental iOS
SPM config: change "throughrouly" to "thoroughly" in the comment for
experimental.ios.spm.swiftToolsVersion (the JSDoc block that references
swiftToolsVersion under experimental -> ios -> spm). Keep the rest of the
wording and formatting intact.
In `@cli/src/index.ts`:
- Line 327: The assignment to configWritable.ios.packageManager uses
getPackageManager which is async, so await the call to assign the resolved
PackageManager value (i.e. change to await getPackageManager(...)); ensure the
surrounding function is marked async if it isn't already and preserve the
existing argument packagemanager?.toLowerCase() when awaiting the result so
configWritable.ios.packageManager receives the actual PackageManager instead of
a Promise.
In `@cli/src/tasks/run.ts`:
- Line 114: Update the status message string in cli/src/tasks/run.ts that builds
the live-reload startup message (the template using options.https, options.host,
and options.port) to correct the typo: change "listing for" to "listening for"
so the message reads "App running with live reload listening for: ...". Locate
the template string that contains `App running with live reload listing for:
${options.https ? 'https' : 'http'}...` and update the wording accordingly.
In `@cli/src/util/spm.ts`:
- Around line 100-106: Resolve the merge conflict by removing the Git markers
and combining both branches: keep the call to getMajorMinoriOSVersion(config)
(so the value remains major.minor for the later .includes('.') check) and also
add the variables introduced in upstream — packageTraits =
config.app.extConfig.experimental?.ios?.spm?.packageTraits ?? {} and
swiftToolsVersion =
config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion ?? '5.9' —
directly after that call; ensure there are no leftover <<<<<<<, =======, >>>>>>>
markers and that the existing import for getMajorMinoriOSVersion remains
unchanged.
In `@core/package.json`:
- Around line 2-14: Remove the Git conflict markers and choose a single,
deliberate set of package metadata for the top-level fields (resolve the values
for "name", "version", "description", "homepage", and "author" so the JSON is
valid); replace the entire conflicted block containing <<<<<<< HEAD, =======,
and >>>>>>> with the chosen values (e.g., keep either the "@capacitor-plus/core"
entry or the "@capacitor/core" entry) and ensure the resulting package.json
remains valid JSON (no conflict markers, proper commas and quotes).
In `@ios/Capacitor/Capacitor/CapacitorBridge.swift`:
- Around line 751-756: presentVC, dismissVC and showAlertWith call UIKit
presentation APIs from background threads; wrap their UI calls in
DispatchQueue.main.async and capture self weakly to ensure thread-safety and
avoid retain cycles. Locate the methods presentVC(_:animated:completion:),
dismissVC(animated:completion:) and showAlertWith(...) and replace direct calls
to self.viewController?.present/dismiss/present(alert...) with
DispatchQueue.main.async { [weak self] in self?.viewController?... } so all
UIKit interactions run on the main thread, matching the existing pattern used by
toJs() and other bridge methods.
In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m`:
- Line 32: The method implementation for getArray:defaultValue: in
CAPBridgedJSTypes.m has a stray semicolon before the opening brace; remove the
semicolon so the implementation signature reads as a normal Objective-C method
(i.e., change the line containing - (NSArray * _Nullable)getArray:(NSString *
_Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue { by deleting the
semicolon before the `{`).
In `@ios/package.json`:
- Around line 2-14: The package.json contains unresolved Git conflict markers
(<<<<<<<, =======, >>>>>>>) around the package metadata (fields like "name",
"version", "description", "homepage", "author") — remove the conflict markers
and keep the correct block (resolve which source to use: `@capacitor-plus/ios` vs
`@capacitor/ios` and the right version/metadata), ensure the JSON is valid (no
leftover markers) and apply the same fix for the second conflict region
referenced (lines around the 36-41 block).
In `@lerna.json`:
- Around line 16-20: Remove the Git conflict markers and resolve the duplicate
"version" entries in lerna.json by keeping a single valid "version" field (e.g.,
set "version" to the intended value such as "8.3.0") and deleting the <<<<<<<,
=======, and >>>>>>> lines; ensure the resulting JSON contains only one
"version" property and is valid JSON for the lerna tooling.
In `@package.json`:
- Around line 35-43: The root package.json currently contains unresolved Git
conflict markers causing invalid JSON; remove the conflict markers and reconcile
the duplicated dependency entries so package.json becomes valid JSON.
Specifically, pick the intended versions for the dependencies shown in the diff
(e.g., "@types/node", "@types/tar", "eslint", "eslint-plugin-import"), delete
the <<<<<<<, =======, and >>>>>>> blocks, and ensure a single entry per
dependency with a consistent version set, then validate the file (jsonlint or
npm/yarn) and run an install to confirm the EJSONPARSE CI failure is resolved.
- Around line 50-55: The merge removed the devDependency "prettier-pretty-check"
but left npm scripts (e.g. the "prettier" and "lint" scripts) referencing it;
restore consistency by either re-adding "prettier-pretty-check" to package.json
dependencies with the desired version (e.g. "^0.2.0") or update the scripts to
call a maintained alternative (e.g. "prettier --check" or your existing prettier
CLI). Locate package.json and update the dependency list (the section containing
"tar" and "prettier-pretty-check") and/or edit the "prettier" and "lint" script
entries so they reference the chosen tool name (ensure npm run prettier and npm
run lint work without JSON conflicts).
---
Outside diff comments:
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`:
- Around line 264-277: When applying a style, preserve the caller's requested
value instead of persisting the resolved LIGHT/DARK: save the original parameter
(e.g., requestedStyle = style), compute a resolvedStyle =
requestedStyle.equals(STYLE_DEFAULT) ? getStyleForTheme() : requestedStyle, then
call
WindowInsetsControllerCompat.setAppearanceLightStatusBars/setAppearanceLightNavigationBars
using resolvedStyle but store the requested value in the persistent fields
(currentStatusBarStyle/currentGestureBarStyle). Also update the reapply logic
(the code that currently forces LIGHT/DARK on config changes) to resolve
STYLE_DEFAULT via getStyleForTheme() at reapply time rather than using the
persisted resolved value.
In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`:
- Around line 342-361: The current logic treats any non-null rangeString as a
valid byte-range and immediately parses parts[1], which throws on malformed
values; update the Range handling around requestHeaders/rangeString (the branch
that creates LollipopLazyInputStream, calls getMimeType and uses
handler.buildDefaultResponseHeaders) to first validate the header matches a
single "bytes=start-end" pattern (no multiple ranges), ensure start and end
(when present) are numeric (allow open-ended like "bytes=500-" or "-500" if you
want to support suffix ranges), and only then switch to 206 partial-content and
set Accept-Ranges/Content-Range; if validation fails or parsing throws (e.g.,
NumberFormatException) fall back to sending the normal full response or return
416 (choose the project preference), and ensure any exceptions from parsing are
caught and handled instead of propagating.
In `@android/CHANGELOG.md`:
- Around line 6-252: The file contains unresolved Git conflict markers (<<<<<<<
HEAD, =======, >>>>>>> upstream/main) with duplicate changelog blocks (e.g., "##
[8.0.8]" and "# [8.3.0]"); open CHANGELOG.md, remove the conflict markers and
choose a single coherent history to keep (either the HEAD block or the
upstream/main block, or merge their entries deterministically), ensure only one
set of version headers remain and fix ordering/formatting so the markdown lints
cleanly.
In `@CHANGELOG.md`:
- Around line 6-523: The CHANGELOG.md contains unresolved Git conflict markers
(<<<<<<<, =======, >>>>>>>) between the two release blocks (e.g., the HEAD block
starting with "## [8.0.8]" and the upstream block starting with "# [8.3.0]"),
which blocks merges; remove the conflict markers and any accidental manual
edits, restore the file to a clean state (no conflict markers or hand-edited
changelog entries), and then trigger the repository's changelog automation/CI
workflow to regenerate the file instead of committing manual changes—ensure you
do not manually edit CHANGELOG.md going forward per the repo guideline.
In `@cli/CHANGELOG.md`:
- Around line 6-280: The changelog contains an unresolved merge conflict with
markers '<<<<<<< HEAD', '=======', and '>>>>>>> upstream/main' and duplicated
release blocks (e.g., "## [8.0.8]" vs "# [8.3.0]"); remove the conflict markers
and reconcile the two sections into a single, coherent release history (prefer
the upstream/main sequence if that is the intended canonical changelog),
deleting duplicate or stale entries such as the HEAD block, ensure only one
valid sequence of release headers remains (e.g., keep the "8.3.0".. "8.1.0"
blocks), and save so there are no remaining merge markers or malformed markdown.
In `@cli/src/tasks/sourcemaps.ts`:
- Around line 18-23: The current code always deletes the .map file
(unlinkSync(mapFile)) even if the inline replacement didn't occur; change the
flow in the function handling bufFile/bufMap/targetFile/mapFile so that you
perform the replacement (using the existing replace call or checking
bufFile.includes(`sourceMappingURL=${file}.map`)) and only call
unlinkSync(mapFile) when the replacement actually changed the content (e.g.,
result !== bufFile or contains match); keep writing the targetFile only when
appropriate and avoid deleting mapFile on no-match.
In `@core/CHANGELOG.md`:
- Around line 6-159: The CHANGELOG contains unresolved Git conflict markers
(<<<<<<<, =======, >>>>>>>) and duplicated release sections (e.g., the "##
[8.0.8]..." block and the "# [8.3.0]..." block); open core/CHANGELOG.md, remove
the conflict markers and the unwanted duplicate content, reconcile the two sides
into a single coherent changelog (choose which release set to keep or merge
entries), preserve valid Markdown headings (e.g., release headers like "##
[8.0.8]" or "# [8.3.0]") and commit the cleaned file so the file no longer
contains <<<<<<<, =======, or >>>>>>> markers and retains a single chronological
list of releases.
In `@ios/CHANGELOG.md`:
- Around line 6-225: The changelog contains unresolved git merge conflict
markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main) mixing two release
sections; remove the conflict markers and resolve the block so only the intended
changelog text remains (either keep the HEAD section, the upstream/main section,
or merge their entries into a single coherent section), ensuring a valid
Markdown structure (one set of version headers like "## [8.x.x]..." and no
leftover markers).
---
Nitpick comments:
In @.github/workflows/needs-reply.yml:
- Line 12: Replace the mutable tag imhoffd/needs-reply@v2 with a pinned commit
SHA; locate the workflow step that references imhoffd/needs-reply@v2 and change
it to imhoffd/needs-reply@<commit-sha> (the full 40-char SHA for the v2 tag) so
the action is fixed to a specific commit for supply-chain security and
reproducibility.
- Line 8: Rename the misleading job key "build" to a descriptive name like
"close-stale-issues" (e.g., change jobs.build -> jobs.close-stale-issues) and
update any references to that job elsewhere in the workflow (for example any
needs: build, if: conditions, or job badges) so they point to the new job key;
ensure the job's name: field (if present) is also updated to match the new
semantic name.
In `@cli/src/index.ts`:
- Around line 30-38: Change the loose any parameter on getPackageManager to a
stricter type (e.g., packageManager: string | undefined) and update the function
to handle CLI string input explicitly; in getPackageManager ensure you compare
packageManager against the expected literal (like 'cocoapods' or 'spm'),
normalize/case-fold the input if necessary, and return the correct
PackageManager union (matching the existing PackageManager type) — for example
returning 'bundler' when config.ios.packageManager === 'bundler', 'Cocoapods'
for cocoapods, and 'SPM' otherwise.
In `@cli/src/tasks/migrate-spm.ts`:
- Line 16: Update the equality check to use strict equality: replace the loose
comparison of config.ios.packageManager against 'SPM' with a strict ===
comparison (i.e., in the if condition that reads if ((await
config.ios.packageManager) == 'SPM') change == to ===) to match the codebase
convention used elsewhere.
In `@cli/src/tasks/update.ts`:
- Around line 48-62: The addUpdateChecks function currently replaces the checks
array (checks = await getCommonChecks(config)) when processing platforms (e.g.,
platformName === config.ios.name) instead of accumulating results; change this
to append the checks returned by getCommonChecks to the existing checks array
(use checks.push(...await getCommonChecks(config)) or checks = [...checks,
...(await getCommonChecks(config))]) so checks from multiple platforms are
preserved; keep the existing platform branching (android/web/else) and apply the
same accumulation pattern for any future branches that return check arrays.
- Around line 57-59: Replace the plain-string throw in the else branch with an
Error object to preserve stack traces: change the throw `Platform
${platformName} is not valid.` to throw new Error(...) so that the error
includes the same message but retains stack information; also align similar
behavior with the existing updateChecks pattern if present (i.e., use Error
objects consistently) and update any callers/tests that expect a string if
necessary.
In `@cli/src/util/spm.ts`:
- Around line 206-221: The function checkSwiftToolsVersion is declared async but
has no await/async operations; make it a synchronous function by removing the
async keyword and changing its return type from Promise<string | null> to string
| null, keeping the same logic and the swiftToolsVersionRegex; update any call
sites that currently await its result to handle a direct return (remove await or
adapt accordingly) and adjust any tests or type annotations referencing
Promise<string | null> to the new string | null signature.
🪄 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: 084f1f22-20f3-44c9-a26e-ad62800bda59
📒 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
| name: Close old issues that need reply | ||
|
|
||
| on: | ||
| schedule: | ||
| - cron: "0 0 * * *" | ||
|
|
||
| jobs: | ||
| build: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - name: Close old issues that need reply | ||
| uses: imhoffd/needs-reply@v2 | ||
| with: | ||
| repo-token: ${{ secrets.BOT_TOKEN }} | ||
| issue-label: 'needs reply' | ||
| days-before-close: 7 | ||
| close-message: | | ||
| It looks like this issue didn't get the information it needed, so I'll close it for now. If I made a mistake, sorry! I am just a bot. | ||
|
|
||
| Have a great day! | ||
| Ionitron 💙 |
There was a problem hiding this comment.
Add explicit permissions to limit token scope.
The workflow does not explicitly declare permissions, which means it inherits default repository-scoped permissions. For security best practices, workflows should use the principle of least privilege by declaring only the permissions they need.
🛡️ Proposed fix to add explicit permissions
name: Close old issues that need reply
on:
schedule:
- cron: "0 0 * * *"
+permissions:
+ issues: write
+
jobs:
build:📝 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.
| name: Close old issues that need reply | |
| on: | |
| schedule: | |
| - cron: "0 0 * * *" | |
| jobs: | |
| build: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Close old issues that need reply | |
| uses: imhoffd/needs-reply@v2 | |
| with: | |
| repo-token: ${{ secrets.BOT_TOKEN }} | |
| issue-label: 'needs reply' | |
| days-before-close: 7 | |
| close-message: | | |
| It looks like this issue didn't get the information it needed, so I'll close it for now. If I made a mistake, sorry! I am just a bot. | |
| Have a great day! | |
| Ionitron 💙 | |
| name: Close old issues that need reply | |
| on: | |
| schedule: | |
| - cron: "0 0 * * *" | |
| permissions: | |
| issues: write | |
| jobs: | |
| build: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Close old issues that need reply | |
| uses: imhoffd/needs-reply@v2 | |
| with: | |
| repo-token: ${{ secrets.BOT_TOKEN }} | |
| issue-label: 'needs reply' | |
| days-before-close: 7 | |
| close-message: | | |
| It looks like this issue didn't get the information it needed, so I'll close it for now. If I made a mistake, sorry! I am just a bot. | |
| Have a great day! | |
| Ionitron 💙 |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.github/workflows/needs-reply.yml around lines 1 - 21, Add an explicit
permissions block to the workflow (top-level, before jobs) to follow
least-privilege; the action imhoffd/needs-reply@v2 only needs permission to
manage issues, so add a permissions mapping granting issues: write (and no
broader repo-wide permissions). Ensure the permissions section is added
alongside the existing name/on keys and not inside a job or step so the
workflow-level token scope is limited to only what the needs-reply action
requires.
| - uses: actions/checkout@v5 | ||
| with: | ||
| fetch-depth: 0 | ||
| ref: 'main' |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Verify where reusable workflow is called and whether caller controls ref.
rg -n -C2 'uses:\s*\.\/\.github\/workflows\/publish-ios\.yml|ref:' .github/workflows
# Show the checkout block in this workflow.
nl -ba .github/workflows/publish-ios.yml | sed -n '18,30p'Repository: Cap-go/capacitor-plus
Length of output: 195
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Show the checkout block in the workflow directly
echo "=== publish-ios.yml checkout section (lines 18-30) ==="
sed -n '18,30p' .github/workflows/publish-ios.yml | cat -n
echo ""
echo "=== Full publish-ios.yml to see trigger and structure ==="
cat -n .github/workflows/publish-ios.yml
echo ""
echo "=== Check for workflow calls to publish-ios.yml ==="
rg -n 'publish-ios\.yml' .github/workflows/Repository: Cap-go/capacitor-plus
Length of output: 1730
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Check the publish script to understand what it does
echo "=== scripts/native-podspec.sh ==="
head -50 scripts/native-podspec.sh
echo ""
echo "=== Check all workflow files for any reference to publish ==="
find .github/workflows -name "*.yml" -o -name "*.yaml" | xargs grep -l "publish"
echo ""
echo "=== Check if workflow_call in publish-ios accepts any inputs/ref ==="
sed -n '1,10p' .github/workflows/publish-ios.ymlRepository: Cap-go/capacitor-plus
Length of output: 1075
Remove hardcoded main checkout to avoid publishing the wrong revision.
The workflow forces checkout of main regardless of what triggered it. When used as a reusable workflow (which it is, via workflow_call) or manually triggered, this prevents publishing from any other branch or tag. For a publish workflow pushing to CocoaPods' public registry, this is a critical issue—it can publish artifacts from main even when the intent is to release from a different ref.
🔧 Proposed fix
- uses: actions/checkout@v5
with:
fetch-depth: 0
- ref: 'main'🤖 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 hardcodes ref: 'main' (actions/checkout@v5) which forces publishing
from main; remove that hardcoded ref and instead use the triggering ref or a
workflow input (e.g., replace ref: 'main' with a variable like '${{ github.ref
}}' or '${{ inputs.ref || github.ref }}' and add a workflow_call input "ref" if
needed) so the workflow checks out the actual revision that triggered the run
rather than always main.
| - name: Deploy to Cocoapods | ||
| run: sh ./scripts/native-podspec.sh publish | ||
| env: | ||
| COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }} |
There was a problem hiding this comment.
Add publish preflight checks before pod trunk push.
Line 28 calls publish directly, but podspec version/tag prerequisites are not validated first. Add fast-fail checks for token presence and tag existence to prevent avoidable release failures.
🧪 Proposed preflight step
- name: Install Cocoapods
run: gem install cocoapods
+ - name: Preflight publish checks
+ run: |
+ set -euo pipefail
+ test -n "${COCOAPODS_TRUNK_TOKEN:-}" || { echo "COCOAPODS_TRUNK_TOKEN is missing"; exit 1; }
+ VERSION=$(node -p "require('./ios/package.json').version")
+ git rev-parse --verify "refs/tags/$VERSION" >/dev/null || { echo "Missing git tag: $VERSION"; exit 1; }
- name: Deploy to Cocoapods
run: sh ./scripts/native-podspec.sh publish
env:
COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }}🤖 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 27 - 30, The workflow
currently calls the publish step by running the script target native-podspec.sh
publish without verifying prerequisites; update the job to run preflight checks
before invoking native-podspec.sh publish: verify the COCOAPODS_TRUNK_TOKEN
environment variable is set (fail fast with a clear message if empty) and verify
the current Git tag/version exists (e.g., ensure git describe --exact-match or
git tag -l for the expected tag returns a match) so that native-podspec.sh
publish only runs when token and tag validations pass; keep these checks in the
same job right before the run that calls native-podspec.sh publish and surface
clear failure messages when they fail.
| <<<<<<< 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 the merge-conflict markers in the Android manifest.
Lines 2-14 and Lines 34-39 are still conflicted, which leaves this workspace manifest invalid JSON and blocks package-manager parsing before any Android build step can run.
Also applies to: 34-39
🧰 Tools
🪛 Biome (2.4.10)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: String values must be double quoted.
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-8: End of file expected
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-14: End of file expected
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@android/package.json` around lines 2 - 14, The package.json contains
unresolved Git conflict markers (<<<<<<< HEAD, =======, >>>>>>> upstream/main)
around fields like "name", "version", "description", "homepage", and "author";
remove the conflict markers and decide which block to keep or merge values so
the file is valid JSON (e.g., choose either the `@capacitor-plus/android` block or
the `@capacitor/android` block or combine fields appropriately), then ensure the
final JSON has a single "name"/"version"/"description"/"homepage"/"author" set
and no leftover markers so package-manager parsing succeeds.
| <<<<<<< HEAD | ||
| "name": "@capacitor-plus/cli", | ||
| "version": "8.0.8", | ||
| "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", | ||
| "author": "Capgo Team <support@capgo.app> (https://capgo.app)", | ||
| ======= | ||
| "name": "@capacitor/cli", | ||
| "version": "8.3.0", | ||
| "description": "Capacitor: Cross-platform apps with JavaScript and the web", | ||
| "homepage": "https://capacitorjs.com", | ||
| "author": "Ionic Team <hi@ionic.io> (https://ionic.io)", | ||
| >>>>>>> upstream/main |
There was a problem hiding this comment.
Resolve the CLI package metadata conflict before merge.
Lines 2-14 still contain merge markers, leaving the manifest invalid JSON. This also changes the published package identity, so it needs a single intentional resolution.
🧰 Tools
🪛 Biome (2.4.10)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: String values must be double quoted.
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-8: End of file expected
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-14: End of file expected
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@cli/package.json` around lines 2 - 14, Resolve the merge conflict in
package.json by removing the Git conflict markers and choosing the intended
package metadata for the CLI: update the "name", "version", "description",
"homepage", and "author" fields to the single, correct values (ensure only one
JSON object remains), validate the resulting JSON is well-formed, and confirm
the chosen identity (e.g., values for "name" and "version") is intentional
before committing; check the "name" and "version" fields specifically to avoid
accidentally publishing under the wrong package identity.
| 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
set -euo pipefail
# Verify there are no ObjC method implementations with an illegal "; {" pattern.
rg -nP --type-add 'objc:*.{m,mm}' --type=objc '\)\s*;\s*\{'Repository: Cap-go/capacitor-plus
Length of output: 47
🏁 Script executed:
# First, check if the file exists
test -f ios/Capacitor/Capacitor/CAPBridgedJSTypes.m && echo "File exists" || echo "File not found"
# Read the file around line 32 to see the actual content
if test -f ios/Capacitor/Capacitor/CAPBridgedJSTypes.m; then
sed -n '25,40p' ios/Capacitor/Capacitor/CAPBridgedJSTypes.m
fiRepository: Cap-go/capacitor-plus
Length of output: 673
Remove the stray semicolon from the Objective-C method implementation.
Line 32 contains ...defaultValue; {, which is invalid Objective-C syntax. Method implementations must not have a semicolon before the opening brace.
Proposed fix
-- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue; {
+- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue {🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m` at line 32, The method
implementation for getArray:defaultValue: in CAPBridgedJSTypes.m has a stray
semicolon before the opening brace; remove the semicolon so the implementation
signature reads as a normal Objective-C method (i.e., change the line containing
- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray *
_Nullable)defaultValue { by deleting the semicolon before the `{`).
| <<<<<<< 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 the leftover merge-conflict blocks before merging.
Lines 2-14 and Lines 36-41 still contain raw conflict markers, so this manifest is invalid JSON and will keep the workspace install/publish tooling from parsing the iOS package at all.
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 (<<<<<<<, =======, >>>>>>>) around the package metadata
(fields like "name", "version", "description", "homepage", "author") — remove
the conflict markers and keep the correct block (resolve which source to use:
`@capacitor-plus/ios` vs `@capacitor/ios` and the right version/metadata), ensure
the JSON is valid (no leftover markers) and apply the same fix for the second
conflict region referenced (lines around the 36-41 block).
| <<<<<<< HEAD | ||
| "version": "8.0.8", | ||
| ======= | ||
| "version": "8.3.0", | ||
| >>>>>>> upstream/main |
There was a problem hiding this comment.
Resolve leftover merge-conflict markers before merge
Line 16–20 still contains Git conflict markers, which makes lerna.json invalid JSON and will break release/version tooling.
Suggested fix
-<<<<<<< HEAD
- "version": "8.0.8",
-=======
"version": "8.3.0",
->>>>>>> upstream/main🧰 Tools
🪛 Biome (2.4.10)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: String values must be double quoted.
(parse)
[error] 17-17: End of file expected
(parse)
[error] 17-17: End of file expected
(parse)
[error] 17-17: End of file expected
(parse)
[error] 17-18: End of file expected
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 19-19: End of file expected
(parse)
[error] 19-19: End of file expected
(parse)
[error] 19-19: End of file expected
(parse)
[error] 19-20: End of file expected
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@lerna.json` around lines 16 - 20, Remove the Git conflict markers and resolve
the duplicate "version" entries in lerna.json by keeping a single valid
"version" field (e.g., set "version" to the intended value such as "8.3.0") and
deleting the <<<<<<<, =======, and >>>>>>> lines; ensure the resulting JSON
contains only one "version" property and is valid JSON for the lerna tooling.
| <<<<<<< 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 |
There was a problem hiding this comment.
Resolve the root manifest conflicts before anything else.
The raw conflict markers at Lines 35-43 and Lines 50-55 make the root package.json invalid JSON, which matches the current EJSONPARSE CI failure and blocks all workspace installs.
Also applies to: 50-55
🧰 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)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@package.json` around lines 35 - 43, The root package.json currently contains
unresolved Git conflict markers causing invalid JSON; remove the conflict
markers and reconcile the duplicated dependency entries so package.json becomes
valid JSON. Specifically, pick the intended versions for the dependencies shown
in the diff (e.g., "@types/node", "@types/tar", "eslint",
"eslint-plugin-import"), delete the <<<<<<<, =======, and >>>>>>> blocks, and
ensure a single entry per dependency with a consistent version set, then
validate the file (jsonlint or npm/yarn) and run an install to confirm the
EJSONPARSE CI failure is resolved.
| <<<<<<< HEAD | ||
| "tar": "^6.1.11", | ||
| "prettier-pretty-check": "^0.2.0" | ||
| ======= | ||
| "tar": "^7.5.3" | ||
| >>>>>>> upstream/main |
There was a problem hiding this comment.
Keep prettier-pretty-check or update the script in the same resolution.
Line 22 still invokes prettier-pretty-check, so resolving this block by taking only the upstream half will fix JSON parsing but break npm run prettier and npm run lint.
Suggested resolution for this block
- "tar": "^6.1.11",
- "prettier-pretty-check": "^0.2.0"
+ "tar": "^7.5.3",
+ "prettier-pretty-check": "^0.2.0"📝 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 | |
| "tar": "^6.1.11", | |
| "prettier-pretty-check": "^0.2.0" | |
| ======= | |
| "tar": "^7.5.3" | |
| >>>>>>> upstream/main | |
| "tar": "^7.5.3", | |
| "prettier-pretty-check": "^0.2.0" |
🧰 Tools
🪛 Biome (2.4.10)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 54-54: End of file expected
(parse)
[error] 54-54: End of file expected
(parse)
[error] 54-54: End of file expected
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: String values must be double quoted.
(parse)
[error] 55-55: unexpected character /
(parse)
[error] 55-55: String values must be double quoted.
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@package.json` around lines 50 - 55, The merge removed the devDependency
"prettier-pretty-check" but left npm scripts (e.g. the "prettier" and "lint"
scripts) referencing it; restore consistency by either re-adding
"prettier-pretty-check" to package.json dependencies with the desired version
(e.g. "^0.2.0") or update the scripts to call a maintained alternative (e.g.
"prettier --check" or your existing prettier CLI). Locate package.json and
update the dependency list (the section containing "tar" and
"prettier-pretty-check") and/or edit the "prettier" and "lint" script entries so
they reference the chosen tool name (ensure npm run prettier and npm run lint
work without JSON conflicts).
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
Bug Fixes
Chores