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 changes and performs a significant migration from Capacitor+ (Capgo) to Capacitor (Ionic), bumping the version from 8.0.8 to 8.3.0. Key changes include refactoring iOS package manager detection into config-driven promises, enhancing native bridge implementations to handle URL instances, improving SystemBars plugin functionality, adding iOS SPM publishing workflow, and extending test timeouts. Multiple files contain unresolved Git merge conflict markers. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 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: 9af7b02a68
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| @@ -1,9 +1,17 @@ | |||
| { | |||
| <<<<<<< HEAD | |||
There was a problem hiding this comment.
Remove merge markers from package manifests
This commit leaves conflict markers in JSON manifests (for example here, and similarly in android/package.json, core/package.json, ios/package.json, and the root package.json), which makes them invalid JSON and causes package-manager/tooling commands to fail before any build or test step can run. In practice, bun install, workspace script execution, and release automation will all fail as soon as these files are parsed.
Useful? React with 👍 / 👎.
|
|
||
| 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 conflict markers in SPM generator source
Unresolved merge markers were committed into this TypeScript file, which makes the CLI source syntactically invalid and prevents the CLI package from compiling. Any workflow that builds or runs the CLI (including iOS/SPM-related commands) will fail until this section is properly merged and the duplicated branch logic is resolved.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 15
Note
Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (6)
cli/src/tasks/sourcemaps.ts (1)
15-23:⚠️ Potential issue | 🟠 MajorPrevent accidental
.mapdeletion when no inline replacement occursAt Line 15 (with the new
.csssupport), Lines 18–23 still delete${file}.mapeven ifsourceMappingURL=${file}.mapis not found. That can leave broken sourcemap references (now for CSS too). Only write/unlink when a replacement actually happens.Suggested fix
if ((extname(file) === '.js' || extname(file) === '.css') && existsSync(mapFile)) { const bufMap = readFileSync(mapFile).toString('base64'); const bufFile = readFileSync(targetFile, 'utf8'); + const sourceMapRef = `sourceMappingURL=${file}.map`; + if (!bufFile.includes(sourceMapRef)) { + return; + } const result = bufFile.replace( - `sourceMappingURL=${file}.map`, + sourceMapRef, 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + bufMap, ); writeFileSync(targetFile, result); unlinkSync(mapFile); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/tasks/sourcemaps.ts` around lines 15 - 23, The current logic reads mapFile and targetFile, performs a .replace and always writes targetFile and unlinks mapFile even if the original sourceMappingURL wasn't present; change this to only write and unlink when a replacement actually occurred — e.g., check if target content (read via readFileSync into bufFile) includes the exact token `sourceMappingURL=${file}.map` or compare the replaced result to bufFile, and only call writeFileSync(targetFile, result) and unlinkSync(mapFile) when a real replacement happened; the relevant symbols to update are extname, existsSync, readFileSync, writeFileSync, unlinkSync and the replacement logic in the block handling `.js` and `.css`.CHANGELOG.md (1)
6-523:⚠️ Potential issue | 🟠 MajorDon't hand-merge the changelog.
This block still has conflict markers, and
CHANGELOG.mdshould not be resolved by manually stitching the two histories together. Please remove the conflicted/manual edit from the PR and let the release automation regenerate the changelog once the version metadata is clean. As per coding guidelines,CHANGELOG.md: Do not manually 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 CHANGELOG.md contains unresolved merge conflict markers (e.g. "<<<<<<< HEAD", "=======", ">>>>>>> upstream/main") and a hand-merged changelog block; remove the manual edits and conflict markers entirely and restore the file to the state produced by the release automation (undo the manual merge of the two histories), ensure version metadata in package manifests is clean so CI can regenerate CHANGELOG.md, and re-run or let CI regenerate the changelog instead of committing a hand-edited CHANGELOG.md.android/CHANGELOG.md (1)
6-252:⚠️ Potential issue | 🟠 MajorResolve this changelog merge hunk instead of taking one side verbatim.
Lines 6-252 still contain Git conflict markers, and the two sides carry different release history (
8.0.8on the plus branch vs upstream8.1.0-8.3.0). Merging this as-is corrupts the published changelog, while choosing either side blindly drops the other branch’s entries.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@android/CHANGELOG.md` around lines 6 - 252, The changelog contains unresolved git conflict markers (<<<<<<< HEAD / >>>>>>> upstream/main) mixing two release histories (e.g., versions 8.0.8 on the plus branch and 8.1.0–8.3.0 from upstream); remove the conflict markers and produce a single coherent changelog by merging both sides: combine all unique release entries (preserve commits, PR/issue references and dates), deduplicate overlapping entries, order releases chronologically or by semantic version (newest first), and ensure headers like "## [8.x.x] ..." are formatted consistently and no content is lost.ios/CHANGELOG.md (1)
6-225:⚠️ Potential issue | 🟠 MajorThis top-of-file merge conflict still needs manual reconciliation.
Lines 6-225 contain both the plus-branch
8.0.8history and upstream8.0.1-8.3.0history separated by Git markers. Shipping this file as-is is broken, and resolving it by picking a single side will discard the other branch’s release notes.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@ios/CHANGELOG.md` around lines 6 - 225, The file contains an unresolved git merge conflict with markers <<<<<<< HEAD, =======, >>>>>>> upstream/main mixing two release histories (e.g., entries for 8.0.8…8.0.3 and 8.3.0/8.2.0/8.1.0); remove the conflict markers and manually reconcile the two sides by producing a single coherent changelog: choose whether to merge both histories (chronologically combine entries, deduplicate repeated sections like "## [8.0.x]" and keep all commit/PR lines) or pick one branch’s history, then delete the markers and any duplicated headings (e.g., 8.0.8 vs 8.3.0) so the top-of-file contains a valid, continuous changelog without git conflict markers.cli/CHANGELOG.md (1)
6-280:⚠️ Potential issue | 🟠 MajorFinish the merge here; the changelog history is currently split in two.
Lines 6-280 are still an unresolved conflict between the plus-branch entries and upstream
8.0.1-8.3.0entries. This should be merged into one coherent history before release; otherwise the file either ships with conflict markers or loses one side’s release notes.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/CHANGELOG.md` around lines 6 - 280, The changelog contains an unresolved git merge conflict (markers <<<<<<< HEAD and >>>>>>> upstream/main) between the plus-branch entries starting with [8.0.8] and the upstream history starting with [8.3.0]; remove the conflict markers and merge the two histories into a single, chronological changelog preserving both sets of release sections (e.g., keep entries for [8.3.0], [8.2.0], [8.1.0], [8.0.8], [8.0.7], etc.), ensure headings and dates are correct and non-duplicative, and verify the final file has no remaining conflict markers.core/CHANGELOG.md (1)
6-159:⚠️ Potential issue | 🟠 MajorResolve this changelog conflict block before merging.
The
<<<<<<</=======/>>>>>>>markers leave the file in a conflicted state, and the inserted release headings use#under the top-level# Change Log, which breaks the heading hierarchy until this block is merged cleanly. Pick the final release entries and normalize the version headings as part of the resolution.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@core/CHANGELOG.md` around lines 6 - 159, Remove the Git conflict markers (<<<<<<<, =======, >>>>>>>) and merge the two conflicting blocks by selecting the correct final release entries (choose between the "## [8.0.8]..." block and the "# [8.3.0]..." block), deduplicate overlapping release notes (e.g., entries starting with "## [8.0.8]" / "# [8.3.0]"), and normalize headings so they are subordinate to the top-level "# Change Log" (use "##" for release versions like "## [8.3.0]" or "## [8.0.8]"), preserving all relevant changelog content and links while removing leftover conflict markers such as "<<<<<<< HEAD" and ">>>>>>> upstream/main".
🟡 Minor comments (6)
android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java-131-142 (1)
131-142:⚠️ Potential issue | 🟡 MinorMalformed Javadoc HTML tags.
The closing
</p>tag on line 137 appears to be a stray tag with no matching opening<p>. This creates malformed Javadoc.📝 Proposed fix
/** * `@deprecated` This method may return incorrect headers in concurrent range requests. * <p> * Use {`@link` `#buildDefaultResponseHeaders`()} instead, which returns a copy of the map. * </p> - * This method will be removed in a future major version of Capacitor. - * </p> + * <p> + * This method will be removed in a future major version of Capacitor. + * </p> */🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java` around lines 131 - 142, The Javadoc for getResponseHeaders() contains a stray closing </p> tag causing malformed HTML; edit the Javadoc for the getResponseHeaders() method to remove the unmatched </p> (or properly pair it by adding a matching opening <p>), ensure the description references buildDefaultResponseHeaders() and responseHeaders clearly, and keep the `@deprecated` block valid so the comment compiles and renders correctly..github/workflows/needs-reply.yml-11-16 (1)
11-16:⚠️ Potential issue | 🟡 MinorUse
${{ secrets.GITHUB_TOKEN }}instead of${{ secrets.BOT_TOKEN }}.The
imhoffd/needs-reply@v2action is valid, but the workflow uses a non-standard custom secretBOT_TOKEN. The action documentation recommends using the built-in${{ secrets.GITHUB_TOKEN }}, which is automatically available in all GitHub Actions workflows and doesn't require separate repository configuration.Current code
- name: Close old issues that need reply uses: imhoffd/needs-reply@v2 with: repo-token: ${{ secrets.BOT_TOKEN }} issue-label: 'needs reply' days-before-close: 7🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.github/workflows/needs-reply.yml around lines 11 - 16, Replace the custom secret used by the needs-reply action: in the workflow step named "Close old issues that need reply" (the step that uses imhoffd/needs-reply@v2), change the input key repo-token from ${{ secrets.BOT_TOKEN }} to the built-in ${{ secrets.GITHUB_TOKEN }} so the action uses the standard GitHub Actions token without requiring a custom secret.core/src/core-plugins.ts-113-113 (1)
113-113:⚠️ Potential issue | 🟡 MinorNormalize the
expiresattribute case-insensitively.Line 113 only strips lowercase
expires=from the input. Ifoptions.expirescontainsExpires=(uppercase E), the resulting cookie header becomesexpires=Expires=..., which browsers will fail to parse and treat as a session cookie instead of persistent. Use a case-insensitive, start-anchored regex to strip the prefix consistently.Suggested change
- const expires = options.expires ? `; expires=${options.expires.replace('expires=', '')}` : ''; + const expiresValue = options.expires?.trim().replace(/^expires=/i, ''); + const expires = expiresValue ? `; expires=${expiresValue}` : '';🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@core/src/core-plugins.ts` at line 113, The current normalization for the cookie expires attribute only strips a lowercase "expires=" and leaves "Expires=" intact, so update the logic that builds the expires string (variable expires that uses options.expires) to remove a leading "expires=" prefix in a case-insensitive, start-anchored way (e.g., replace(/^expires=/i, '') on options.expires) before concatenating so the header never contains a duplicated prefix; also trim the result to be safe.cli/src/declarations.ts-533-535 (1)
533-535:⚠️ Potential issue | 🟡 MinorFix the typo in the new Swift tools warning.
Line 535 says
throughrouly; it should bethoroughly.Suggested fix
- * If you need to set this property to 6.0 or higher, make sure to throughrouly test your iOS app. + * If you need to set this property to 6.0 or higher, make sure to thoroughly test your iOS app.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/declarations.ts` around lines 533 - 535, Fix the typo in the Swift tools warning comment: locate the comment block that begins with "Warning: Capacitor does not officially support Swift 6 yet." (near the Swift tools/version property documentation) and change the misspelled word "throughrouly" to "thoroughly" so the sentence reads "If you need to set this property to 6.0 or higher, make sure to thoroughly test your iOS app."cli/src/index.ts-30-37 (1)
30-37:⚠️ Potential issue | 🟡 MinorReject unknown package-manager values instead of silently falling back to SPM.
Any non-
cocoapodsinput here becomesSPM, including typos. That makesadd ios --packagemanager ...do the wrong thing without telling the user. Fail fast on unsupported values.Suggested fix
-async function getPackageManager(config: Config, packageManager: any): Promise<PackageManager> { +async function getPackageManager(config: Config, packageManager?: string): Promise<PackageManager> { if (packageManager === 'cocoapods') { if ((await config.ios.packageManager) === 'bundler') { return 'bundler'; } return 'Cocoapods'; } - return 'SPM'; + if (packageManager == null || packageManager === 'spm') { + return 'SPM'; + } + fatal(`Unsupported iOS package manager: ${c.input(packageManager)}`); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/index.ts` around lines 30 - 37, The getPackageManager function currently maps any non-'cocoapods' input to 'SPM' which hides typos; change getPackageManager to explicitly accept only known values: if packageManager === 'cocoapods' use config.ios.packageManager === 'bundler' ? 'bundler' : 'Cocoapods', if packageManager === 'spm' return 'SPM', otherwise throw a clear error (e.g. throw new Error(`Unsupported package manager: ${packageManager}`)) so callers fail fast; reference getPackageManager and config.ios.packageManager when implementing the validation and error path.cli/src/util/spm.ts-223-249 (1)
223-249:⚠️ Potential issue | 🟡 MinorAvoid cascading errors for malformed
swiftToolsVersion.
checkSwiftToolsVersion()already reports bad formats, but this function parses non-numeric segments as0and then emits a second misleading “6.1 or higher” error whenpackageTraitsare present. Bail out when the version string is invalid so users only get the real failure.Suggested fix
const versionParts = swiftToolsVersion.split('.').map((part) => parseInt(part, 10)); + if (versionParts.some((part) => Number.isNaN(part))) { + return null; + } const major = versionParts[0] || 0; const minor = versionParts[1] || 0;🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cli/src/util/spm.ts` around lines 223 - 249, The function checkPackageTraitsRequirements currently parses swiftToolsVersion itself and can produce a secondary “6.1 or higher” error for malformed versions; instead, call the existing checkSwiftToolsVersion(swiftToolsVersion) validator early (after reading swiftToolsVersion and packageTraits) and if checkSwiftToolsVersion returns a non-null error, bail out (return null) so only the primary format error is reported; keep the existing numeric version check only for well-formed versions when checkSwiftToolsVersion passes.
🧹 Nitpick comments (3)
ios/Capacitor/Capacitor/CapacitorBridge.swift (1)
96-99:obsoletesymbols are still wired into runtime lifecycle code.Line 96 and Line 99 mark
tmpWindow/tmpVCAppearedobsolete, but init still registerstmpVCAppearedat Line 226 and mutatestmpWindowat Line 227. Consider fully removing this deprecated path to avoid carrying dead presentation state.♻️ Suggested cleanup
- `@available`(*, deprecated, message: "obsolete") - var tmpWindow: UIWindow? - `@available`(*, deprecated, message: "obsolete") - static let tmpVCAppeared = Notification(name: Notification.Name(rawValue: "tmpViewControllerAppeared")) @@ - observers.append(NotificationCenter.default.addObserver(forName: type(of: self).tmpVCAppeared.name, object: .none, queue: .none) { [weak self] _ in - self?.tmpWindow = nil - })🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@ios/Capacitor/Capacitor/CapacitorBridge.swift` around lines 96 - 99, Remove the obsolete runtime presentation path by deleting the deprecated symbols tmpWindow and tmpVCAppeared and removing their use in the initializer: stop registering the tmpVCAppeared Notification and stop mutating tmpWindow in init of CapacitorBridge; instead rely on the current presentation lifecycle (remove addObserver/postNotification and any tmpWindow assignment/reads), and ensure no remaining references to tmpWindow or tmpVCAppeared exist (update or delete any helper methods that referenced tmpWindow/tmpVCAppeared such that lifecycle behavior is preserved through the modern APIs).android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java (1)
342-343: Minor: avoid double map lookup for Range header.The current code calls
requestHeaders.get("Range")twice when the header exists. This can be simplified.♻️ Suggested improvement
Map<String, String> requestHeaders = request.getRequestHeaders(); - String rangeString = requestHeaders.get("Range") != null ? requestHeaders.get("Range") : requestHeaders.get("range"); + String rangeString = requestHeaders.get("Range"); + if (rangeString == null) { + rangeString = requestHeaders.get("range"); + }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java` around lines 342 - 343, The code in WebViewLocalServer.java does a double map lookup when populating rangeString from request.getRequestHeaders(); fix by retrieving the map once (already in requestHeaders) and then performing a single lookup: get the "Range" value into a temporary (or use Map.getOrDefault by calling requestHeaders.getOrDefault("Range", requestHeaders.get("range"))) or assign requestHeaders.get("Range") to rangeString and only if null assign requestHeaders.get("range"); update the logic that sets rangeString accordingly to avoid calling requestHeaders.get("Range") twice..github/workflows/needs-reply.yml (1)
1-9: Consider renaming the job for clarity.The job name
buildis misleading since this workflow closes stale issues rather than building anything. Consider a more descriptive name likeclose-stale-issuesorneeds-reply-cleanup.📝 Proposed job name improvement
jobs: - build: + close-stale-issues: runs-on: ubuntu-latest🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.github/workflows/needs-reply.yml around lines 1 - 9, Rename the misleading job identifier "build" to a descriptive name such as "close-stale-issues" (or "needs-reply-cleanup") in the workflow file so the job intent matches the workflow title; update the job key used under "jobs:" (currently "build") to the new identifier and ensure any internal references to that job name (if present) are updated accordingly so the workflow remains valid.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.github/workflows/publish-ios.yml:
- Around line 21-24: The checkout step currently hard-codes ref: 'main', which
forces publishing main regardless of trigger; update the actions/checkout@v5
step (the ref: 'main' setting) to accept the intended ref from the workflow
inputs or to use the runtime revision (e.g. ${{ github.sha }}) so the
checked-out revision matches the caller or manual workflow_dispatch trigger—add
an input (e.g. publish_ref) to the reusable workflow and substitute that input
or github.sha for the ref value in the actions/checkout step.
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java`:
- Line 280: The call to setBackgroundColor is passing a drawable resource id
because getThemeColor(getContext(), android.R.attr.windowBackground) reads
TypedValue.data without checking type; update the code in SystemBars to detect
attribute type in getThemeColor (or add a new helper) and either (1) resolve a
color-specific attribute (e.g., use a color attr like
android.R.attr.colorBackground or android.R.attr.windowBackgroundColor) and
fetch the actual color, or (2) if the attribute is a reference/type drawable,
resolve the drawable with ContextCompat.getDrawable/getResources().getDrawable
and call getDecorView().setBackground(drawable) instead of setBackgroundColor;
adjust references to getThemeColor(...) and the call to
getActivity().getWindow().getDecorView().setBackgroundColor(...) accordingly so
only a true color int is passed to setBackgroundColor.
In `@android/package.json`:
- Around line 2-14: The package.json contains Git conflict markers and duplicate
fields (e.g., "name", "version", "description", "homepage", "author") causing
invalid JSON; remove the conflict markers (<<<<<<<, =======, >>>>>>>) and choose
a single coherent set of metadata values for those keys so only one "name",
"version", "description", "homepage", and "author" remain, then ensure JSON
syntax is valid (commas/quotes) and update any dependent peer-dependency blocks
referenced in the same file (lines ~34-39) to match the chosen metadata set.
In `@cli/package.json`:
- Around line 2-14: The package.json currently contains unresolved Git conflict
markers between two package identities; remove the conflict markers and choose
which identity to keep by selecting the desired values for "name", "version",
"description", "homepage", and "author" (either the Capacitor+ values or the
upstream Capacitor values), ensure the final file is valid JSON (no <<<<<<<,
=======, >>>>>>> lines) and that all commas/quotes are correct, and then run npm
install to verify parsing; update the chosen "name" and accompanying metadata
consistently so the package identity is intentional and valid.
In `@cli/src/config.ts`:
- Around line 469-475: The code currently uses isInstalled('bundle') to decide
the package manager even when gem 'cocoapods' is present; instead, if
cocoapodsInGemfile (the RegExp test result) is true you should unconditionally
return 'bundler' so downstream checkBundler() can detect and surface a missing
Bundler dependency; remove the isInstalled('bundle') condition from the branch
that returns 'bundler' (leave the alternative return 'Cocoapods' only when
gemfile does not contain cocoapods).
In `@cli/src/ios/update.ts`:
- Around line 133-140: The availability check uses the literal 'pod' instead of
the configured podPath, so if config.ios.podPath points to a custom executable
CocoaPods will be incorrectly skipped; change the isInstalled check to test the
resolved podPath (await config.ios.podPath or podPath variable) rather than the
hardcoded 'pod' so the branch that calls runCommand(podPath, ['install', ...])
runs when the configured binary is present; update the call site that currently
calls isInstalled('pod') to isInstalled(podPath) and keep using
runCommand(podPath, ...) and the existing deployment flag handling.
In `@cli/src/tasks/migrate-spm.ts`:
- Around line 19-26: The migration is skipping SPM validation because
getCommonChecks(config) runs while config still reports the old package manager;
set the in-memory config's iOS packageManager to 'SPM' before running
getCommonChecks so SPM checks are applied. Concretely, cast config to
Writable<Config> (like configWritable), assign configWritable.ios.packageManager
= Promise.resolve('SPM') immediately before calling check(await
getCommonChecks(config)), then proceed with extractSPMPackageDirectory,
runCocoapodsDeintegrate, removeCocoapodsFiles, addInfoPlistDebugIfNeeded and the
existing update call.
In `@cli/src/tasks/run.ts`:
- Around line 46-48: The current check in run.ts skips setting a default port
when HTTPS is enabled, causing live-reload URLs to omit :3000; change the logic
to set options.port = '3000' whenever options.port is falsy (do not gate on
options.https) so the URL construction in run.ts (around the host/port assembly)
and cli/src/util/livereload.ts always see a defined port for live-reload; update
the code path that currently checks "!options.https && !options.port" to simply
check "!options.port" (and ensure any code that relies on options.port uses it
as a string).
In `@cli/src/util/spm.ts`:
- Around line 100-108: This file contains unresolved Git merge markers around
the SPM package setup; remove the conflict markers and reconcile the two
variants so the code compiles. Replace the entire conflict block with the
intended version that defines iosVersion (use getMajoriOSVersion or
getMajorMinoriOSVersion consistently), and include the new SPM variables
packageTraits and swiftToolsVersion (and their default values) before building
packageSwiftText; ensure references to iosVersion, packageTraits,
swiftToolsVersion, and packageSwiftText are all declared exactly once and the
merge markers (<<<<<<<, =======, >>>>>>>) are deleted.
In `@core/package.json`:
- Around line 2-14: The package.json is left with unresolved git conflict
markers around the manifest fields; remove the conflict markers (<<<<<<<,
=======, >>>>>>>) and choose a single authoritative set of values for the JSON
keys "name", "version", "description", "homepage", and "author" so the file
becomes valid JSON and matches the intended package identity across the repo;
ensure the chosen "name" value (either "@capacitor-plus/core" or
"@capacitor/core") is propagated consistently with the rest of the manifest and
package references, then run a JSON lint or npm install to verify the file
parses.
In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m`:
- Line 32: The method implementation for getArray:defaultValue: contains a stray
semicolon before the opening brace which breaks Objective-C syntax; open the
implementation for - (NSArray * _Nullable)getArray:(NSString * _Nonnull)key
defaultValue:(NSArray * _Nullable)defaultValue and remove the extraneous
semicolon so the signature is immediately followed by the {, keeping the rest of
the method body unchanged.
In `@ios/package.json`:
- Around line 2-14: The package.json contains unresolved git conflict markers
(<<<<<<< HEAD / >>>>>>> upstream/main) that make the file invalid JSON; open
package.json, remove the conflict markers and choose a consistent set of fields
(e.g., decide final values for "name", "version", "description", "homepage",
"author" and the conflicting peerDependencies around lines 36-41), then save a
single valid JSON object (no markers) so npm can parse it; ensure the chosen
"name"/"version"/peerDependencies align with your intended package (either
`@capacitor-plus/ios` or `@capacitor/ios`) and run a quick JSON lint or npm install
to verify.
In `@lerna.json`:
- Around line 16-20: Remove the Git conflict markers and restore a single valid
"version" entry in lerna.json; replace the conflict block containing <<<<<<<
HEAD / ======= / >>>>>>> upstream/main with a single JSON property "version":
"8.3.0" (or whichever canonical release version you intend) so the file is valid
JSON and Lerna can read the repository version; ensure only one "version" key
remains and the surrounding JSON stays syntactically correct.
In `@package.json`:
- Around line 50-55: The prettier npm script currently invokes the package
"prettier-pretty-check" but the dependency was removed in the merge; either
restore the devDependency "prettier-pretty-check" in package.json or change the
"prettier" script to use the standard "prettier --check" command. Locate the
"prettier" script in package.json and either add "prettier-pretty-check":
"^0.2.0" back under devDependencies or replace the script value to "prettier
--check" so the script and dependencies stay consistent.
- Around line 35-55: Resolve the merge conflict in package.json by removing the
Git conflict markers (<<<<<<<, =======, >>>>>>>) and producing a valid
dependencies/devDependencies block; decide which versions to keep for the
conflicting entries (e.g., `@types/node`, eslint, tar, and whether to include
`@types/tar` and prettier-pretty-check) and update the JSON so keys are unique and
properly comma-separated, ensuring package.json parses (no leftover conflict
markers, valid JSON syntax) and that entries like "@types/node", "eslint",
"tar", "@types/tar", and "prettier-pretty-check" appear exactly once with the
chosen version strings.
---
Outside diff comments:
In `@android/CHANGELOG.md`:
- Around line 6-252: The changelog contains unresolved git conflict markers
(<<<<<<< HEAD / >>>>>>> upstream/main) mixing two release histories (e.g.,
versions 8.0.8 on the plus branch and 8.1.0–8.3.0 from upstream); remove the
conflict markers and produce a single coherent changelog by merging both sides:
combine all unique release entries (preserve commits, PR/issue references and
dates), deduplicate overlapping entries, order releases chronologically or by
semantic version (newest first), and ensure headers like "## [8.x.x] ..." are
formatted consistently and no content is lost.
In `@CHANGELOG.md`:
- Around line 6-523: The CHANGELOG.md contains unresolved merge conflict markers
(e.g. "<<<<<<< HEAD", "=======", ">>>>>>> upstream/main") and a hand-merged
changelog block; remove the manual edits and conflict markers entirely and
restore the file to the state produced by the release automation (undo the
manual merge of the two histories), ensure version metadata in package manifests
is clean so CI can regenerate CHANGELOG.md, and re-run or let CI regenerate the
changelog instead of committing a hand-edited CHANGELOG.md.
In `@cli/CHANGELOG.md`:
- Around line 6-280: The changelog contains an unresolved git merge conflict
(markers <<<<<<< HEAD and >>>>>>> upstream/main) between the plus-branch entries
starting with [8.0.8] and the upstream history starting with [8.3.0]; remove the
conflict markers and merge the two histories into a single, chronological
changelog preserving both sets of release sections (e.g., keep entries for
[8.3.0], [8.2.0], [8.1.0], [8.0.8], [8.0.7], etc.), ensure headings and dates
are correct and non-duplicative, and verify the final file has no remaining
conflict markers.
In `@cli/src/tasks/sourcemaps.ts`:
- Around line 15-23: The current logic reads mapFile and targetFile, performs a
.replace and always writes targetFile and unlinks mapFile even if the original
sourceMappingURL wasn't present; change this to only write and unlink when a
replacement actually occurred — e.g., check if target content (read via
readFileSync into bufFile) includes the exact token
`sourceMappingURL=${file}.map` or compare the replaced result to bufFile, and
only call writeFileSync(targetFile, result) and unlinkSync(mapFile) when a real
replacement happened; the relevant symbols to update are extname, existsSync,
readFileSync, writeFileSync, unlinkSync and the replacement logic in the block
handling `.js` and `.css`.
In `@core/CHANGELOG.md`:
- Around line 6-159: Remove the Git conflict markers (<<<<<<<, =======, >>>>>>>)
and merge the two conflicting blocks by selecting the correct final release
entries (choose between the "## [8.0.8]..." block and the "# [8.3.0]..." block),
deduplicate overlapping release notes (e.g., entries starting with "## [8.0.8]"
/ "# [8.3.0]"), and normalize headings so they are subordinate to the top-level
"# Change Log" (use "##" for release versions like "## [8.3.0]" or "##
[8.0.8]"), preserving all relevant changelog content and links while removing
leftover conflict markers such as "<<<<<<< HEAD" and ">>>>>>> upstream/main".
In `@ios/CHANGELOG.md`:
- Around line 6-225: The file contains an unresolved git merge conflict with
markers <<<<<<< HEAD, =======, >>>>>>> upstream/main mixing two release
histories (e.g., entries for 8.0.8…8.0.3 and 8.3.0/8.2.0/8.1.0); remove the
conflict markers and manually reconcile the two sides by producing a single
coherent changelog: choose whether to merge both histories (chronologically
combine entries, deduplicate repeated sections like "## [8.0.x]" and keep all
commit/PR lines) or pick one branch’s history, then delete the markers and any
duplicated headings (e.g., 8.0.8 vs 8.3.0) so the top-of-file contains a valid,
continuous changelog without git conflict markers.
---
Minor comments:
In @.github/workflows/needs-reply.yml:
- Around line 11-16: Replace the custom secret used by the needs-reply action:
in the workflow step named "Close old issues that need reply" (the step that
uses imhoffd/needs-reply@v2), change the input key repo-token from ${{
secrets.BOT_TOKEN }} to the built-in ${{ secrets.GITHUB_TOKEN }} so the action
uses the standard GitHub Actions token without requiring a custom secret.
In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`:
- Around line 131-142: The Javadoc for getResponseHeaders() contains a stray
closing </p> tag causing malformed HTML; edit the Javadoc for the
getResponseHeaders() method to remove the unmatched </p> (or properly pair it by
adding a matching opening <p>), ensure the description references
buildDefaultResponseHeaders() and responseHeaders clearly, and keep the
`@deprecated` block valid so the comment compiles and renders correctly.
In `@cli/src/declarations.ts`:
- Around line 533-535: Fix the typo in the Swift tools warning comment: locate
the comment block that begins with "Warning: Capacitor does not officially
support Swift 6 yet." (near the Swift tools/version property documentation) and
change the misspelled word "throughrouly" to "thoroughly" so the sentence reads
"If you need to set this property to 6.0 or higher, make sure to thoroughly test
your iOS app."
In `@cli/src/index.ts`:
- Around line 30-37: The getPackageManager function currently maps any
non-'cocoapods' input to 'SPM' which hides typos; change getPackageManager to
explicitly accept only known values: if packageManager === 'cocoapods' use
config.ios.packageManager === 'bundler' ? 'bundler' : 'Cocoapods', if
packageManager === 'spm' return 'SPM', otherwise throw a clear error (e.g. throw
new Error(`Unsupported package manager: ${packageManager}`)) so callers fail
fast; reference getPackageManager and config.ios.packageManager when
implementing the validation and error path.
In `@cli/src/util/spm.ts`:
- Around line 223-249: The function checkPackageTraitsRequirements currently
parses swiftToolsVersion itself and can produce a secondary “6.1 or higher”
error for malformed versions; instead, call the existing
checkSwiftToolsVersion(swiftToolsVersion) validator early (after reading
swiftToolsVersion and packageTraits) and if checkSwiftToolsVersion returns a
non-null error, bail out (return null) so only the primary format error is
reported; keep the existing numeric version check only for well-formed versions
when checkSwiftToolsVersion passes.
In `@core/src/core-plugins.ts`:
- Line 113: The current normalization for the cookie expires attribute only
strips a lowercase "expires=" and leaves "Expires=" intact, so update the logic
that builds the expires string (variable expires that uses options.expires) to
remove a leading "expires=" prefix in a case-insensitive, start-anchored way
(e.g., replace(/^expires=/i, '') on options.expires) before concatenating so the
header never contains a duplicated prefix; also trim the result to be safe.
---
Nitpick comments:
In @.github/workflows/needs-reply.yml:
- Around line 1-9: Rename the misleading job identifier "build" to a descriptive
name such as "close-stale-issues" (or "needs-reply-cleanup") in the workflow
file so the job intent matches the workflow title; update the job key used under
"jobs:" (currently "build") to the new identifier and ensure any internal
references to that job name (if present) are updated accordingly so the workflow
remains valid.
In `@android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java`:
- Around line 342-343: The code in WebViewLocalServer.java does a double map
lookup when populating rangeString from request.getRequestHeaders(); fix by
retrieving the map once (already in requestHeaders) and then performing a single
lookup: get the "Range" value into a temporary (or use Map.getOrDefault by
calling requestHeaders.getOrDefault("Range", requestHeaders.get("range"))) or
assign requestHeaders.get("Range") to rangeString and only if null assign
requestHeaders.get("range"); update the logic that sets rangeString accordingly
to avoid calling requestHeaders.get("Range") twice.
In `@ios/Capacitor/Capacitor/CapacitorBridge.swift`:
- Around line 96-99: Remove the obsolete runtime presentation path by deleting
the deprecated symbols tmpWindow and tmpVCAppeared and removing their use in the
initializer: stop registering the tmpVCAppeared Notification and stop mutating
tmpWindow in init of CapacitorBridge; instead rely on the current presentation
lifecycle (remove addObserver/postNotification and any tmpWindow
assignment/reads), and ensure no remaining references to tmpWindow or
tmpVCAppeared exist (update or delete any helper methods that referenced
tmpWindow/tmpVCAppeared such that lifecycle behavior is preserved through the
modern APIs).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 3731ee7b-2368-4333-8de4-4c06571f811d
📒 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.yml | head -50Repository: Cap-go/capacitor-plus
Length of output: 1062
🏁 Script executed:
rg "publish-ios" .github/workflows/ --type yamlRepository: Cap-go/capacitor-plus
Length of output: 113
🏁 Script executed:
rg "uses:.*publish-ios|\.\.\/publish-ios" .github/workflows/ --type yamlRepository: Cap-go/capacitor-plus
Length of output: 190
🏁 Script executed:
rg "uses:.*publish-ios" .github/workflows/ --type yamlRepository: Cap-go/capacitor-plus
Length of output: 47
🏁 Script executed:
rg "publish-ios" .github/ -t yamlRepository: Cap-go/capacitor-plus
Length of output: 113
🏁 Script executed:
fd -e yml -e yaml .github/workflows/ | xargs grep -l "uses:" | head -5Repository: Cap-go/capacitor-plus
Length of output: 442
🏁 Script executed:
fd . '.github/workflows' -e yml -e yaml | xargs grep -l "uses:"Repository: Cap-go/capacitor-plus
Length of output: 381
🏁 Script executed:
fd . '.github/workflows' -e yml -e yaml | xargs grep "publish-ios"Repository: Cap-go/capacitor-plus
Length of output: 113
🌐 Web query:
GitHub Actions workflow_call reusable workflow checkout ref hard-coded main behavior
💡 Result:
In GitHub Actions, when using the actions/checkout action without specifying a ref in a reusable workflow triggered by workflow_call, it defaults to checking out the repository's default branch (typically main or master), rather than the branch or ref from the caller workflow's event context. This occurs because the github context in the called reusable workflow may not preserve the exact triggering ref from the caller, particularly for events like pull requests where github.ref resolves to refs/heads/main (the base branch). The actions/checkout action uses the github context to determine the ref when none is provided explicitly: if it's not the triggering repository's event ref, it falls back to the default branch. This behavior is documented in the actions/checkout README and action.yml: "When checking out the repository that triggered a workflow, this defaults to the reference or SHA for that event. Otherwise, uses the default branch." In reusable workflows, the context inheritance leads to the "otherwise" case, causing checkout of main. The issue persists as of 2026 (Issue #1418 in actions/checkout remains open), affecting versions like v3, v4, and v6. Workarounds: - Explicitly pass the ref as an input to the reusable workflow from the caller, e.g.: Caller: jobs: call-reusable: uses: ./.github/workflows/reusable.yml with: ref: ${{ github.ref_name }} Reusable (define input): on: workflow_call: inputs: ref: type: string jobs: build: steps: - uses: actions/checkout@v4 with: ref: ${{ inputs.ref }} - Use ${{ github.sha }} for the commit SHA (works across contexts). - For PRs: ref: ${{ github.head_ref || github.ref_name }} or ref: ${{ github.event.pull_request.head.sha }}. Official docs confirm github context is associated with the caller workflow, but practical behavior shows ref mismatch in called workflows (GitHub Issue #1418, multiple confirmations up to 2025).
Citations:
- 1: when used as part of a reusable workflow the default behaviour is always to checkout "main" branch actions/checkout#1418
- 2: https://github.com/actions/checkout
- 3: https://github.com/actions/checkout/
- 4: https://github.com/actions/checkout/blob/v4/README.md
- 5: https://github.com/actions/checkout/blob/v4/action.yml
- 6: https://docs.github.com/en/actions/reference/contexts-reference
Don't hard-code ref: 'main' in the publish checkout.
This workflow is reusable and accepts manual triggers via workflow_dispatch. Hard-coding ref: 'main' at line 24 forces the checkout to main regardless of the triggering ref, so a manual publish from another branch/tag will ship the wrong code. Either pass the ref explicitly as an input parameter from the caller, or use ${{ github.sha }} to ensure the correct revision is published.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.github/workflows/publish-ios.yml around lines 21 - 24, The checkout step
currently hard-codes ref: 'main', which forces publishing main regardless of
trigger; update the actions/checkout@v5 step (the ref: 'main' setting) to accept
the intended ref from the workflow inputs or to use the runtime revision (e.g.
${{ github.sha }}) so the checked-out revision matches the caller or manual
workflow_dispatch trigger—add an input (e.g. publish_ref) to the reusable
workflow and substitute that input or github.sha for the ref value in the
actions/checkout step.
| windowInsetsControllerCompat.setAppearanceLightNavigationBars(!style.equals(STYLE_DARK)); | ||
| } | ||
|
|
||
| getActivity().getWindow().getDecorView().setBackgroundColor(getThemeColor(getContext(), android.R.attr.windowBackground)); |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
find . -type f -name "SystemBars.java" -path "*/android/**"Repository: Cap-go/capacitor-plus
Length of output: 138
🏁 Script executed:
wc -l ./android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.javaRepository: Cap-go/capacitor-plus
Length of output: 142
🏁 Script executed:
sed -n '275,285p' ./android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.javaRepository: Cap-go/capacitor-plus
Length of output: 658
🏁 Script executed:
sed -n '308,325p' ./android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.javaRepository: Cap-go/capacitor-plus
Length of output: 712
🏁 Script executed:
grep -n "getThemeColor" ./android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java | head -20Repository: Cap-go/capacitor-plus
Length of output: 264
🏁 Script executed:
sed -n '310,325p' ./android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.javaRepository: Cap-go/capacitor-plus
Length of output: 670
🏁 Script executed:
grep -n "getThemeColor" ./android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.javaRepository: Cap-go/capacitor-plus
Length of output: 264
🏁 Script executed:
grep -B2 -A2 "getThemeColor" ./android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.javaRepository: Cap-go/capacitor-plus
Length of output: 335
🏁 Script executed:
grep -n "setBackgroundColor\|windowBackground" ./android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.javaRepository: Cap-go/capacitor-plus
Length of output: 199
🌐 Web query:
android.R.attr.windowBackground drawable color attribute type
💡 Result:
The android.R.attr.windowBackground attribute is a reference to a drawable resource that sets the background of the window. It accepts drawable resources, which can include color drawables (solid colors), but its defined type is a drawable reference, not strictly a color.
Citations:
- 1: https://developer.android.com/reference/android/R.attr
- 2: https://android.googlesource.com/platform/frameworks/base/+/2888524e03896831f487e5dee63f18f1c33c0115/core/res/res/values/attrs.xml
- 3: https://stackoverflow.com/questions/12375766/how-to-get-background-color-from-current-theme-programmatically
- 4: https://developer.android.com/guide/topics/resources/drawable-resource
windowBackground attribute resolves to a drawable resource, not a color int. Use a color-only attribute or handle drawable resolution.
The getThemeColor() method returns typedValue.data without checking the attribute type. When android.R.attr.windowBackground resolves to a drawable resource (common in themed apps), passing its resource ID to setBackgroundColor() produces incorrect results—the color is set to an arbitrary resource ID rather than the intended background. Either resolve a color-specific attribute (like android.R.attr.windowBackgroundColor) or handle drawable resources explicitly.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java` at
line 280, The call to setBackgroundColor is passing a drawable resource id
because getThemeColor(getContext(), android.R.attr.windowBackground) reads
TypedValue.data without checking type; update the code in SystemBars to detect
attribute type in getThemeColor (or add a new helper) and either (1) resolve a
color-specific attribute (e.g., use a color attr like
android.R.attr.colorBackground or android.R.attr.windowBackgroundColor) and
fetch the actual color, or (2) if the attribute is a reference/type drawable,
resolve the drawable with ContextCompat.getDrawable/getResources().getDrawable
and call getDecorView().setBackground(drawable) instead of setBackgroundColor;
adjust references to getThemeColor(...) and the call to
getActivity().getWindow().getDecorView().setBackgroundColor(...) accordingly so
only a true color int is passed to setBackgroundColor.
| <<<<<<< 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; this file is currently invalid JSON.
This manifest still contains Git conflict markers, so package parsing fails before the Android verification script can even run. Remove the markers and keep a single coherent metadata/peer-dependency definition here.
Also applies to: 34-39
🧰 Tools
🪛 Biome (2.4.10)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: String values must be double quoted.
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-8: End of file expected
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-14: End of file expected
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@android/package.json` around lines 2 - 14, The package.json contains Git
conflict markers and duplicate fields (e.g., "name", "version", "description",
"homepage", "author") causing invalid JSON; remove the conflict markers
(<<<<<<<, =======, >>>>>>>) and choose a single coherent set of metadata values
for those keys so only one "name", "version", "description", "homepage", and
"author" remain, then ensure JSON syntax is valid (commas/quotes) and update any
dependent peer-dependency blocks referenced in the same file (lines ~34-39) to
match the chosen metadata set.
| <<<<<<< 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 merge block and choose one package identity.
This file is still invalid JSON, so npm install cannot run. Also, the two sides of the conflict change the published package identity in opposite directions, so the resolution needs to be intentional rather than just deleting markers.
🧰 Tools
🪛 Biome (2.4.10)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: String values must be double quoted.
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-8: End of file expected
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-14: End of file expected
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@cli/package.json` around lines 2 - 14, The package.json currently contains
unresolved Git conflict markers between two package identities; remove the
conflict markers and choose which identity to keep by selecting the desired
values for "name", "version", "description", "homepage", and "author" (either
the Capacitor+ values or the upstream Capacitor values), ensure the final file
is valid JSON (no <<<<<<<, =======, >>>>>>> lines) and that all commas/quotes
are correct, and then run npm install to verify parsing; update the chosen
"name" and accompanying metadata consistently so the package identity is
intentional and valid.
| const cocoapodsInGemfile = new RegExp(/gem\s+['"]cocoapods/).test(gemfileText); | ||
|
|
||
| if (cocoapodsInGemfile) { | ||
| return 'bundle exec pod'; | ||
| if (cocoapodsInGemfile && (await isInstalled('bundle'))) { | ||
| return 'bundler'; | ||
| } else { | ||
| return 'pod'; | ||
| return 'Cocoapods'; | ||
| } |
There was a problem hiding this comment.
Don’t use local bundle availability to infer the project’s package manager.
A repo with gem 'cocoapods' in its Gemfile is still Bundler-managed even on a clean machine where bundle is not installed yet. Returning 'Cocoapods' here means downstream code will skip checkBundler() and run pod directly instead of surfacing the missing Bundler prerequisite.
Suggested fix
- if (cocoapodsInGemfile && (await isInstalled('bundle'))) {
+ if (cocoapodsInGemfile) {
return 'bundler';
} else {
return 'Cocoapods';
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| const cocoapodsInGemfile = new RegExp(/gem\s+['"]cocoapods/).test(gemfileText); | |
| if (cocoapodsInGemfile) { | |
| return 'bundle exec pod'; | |
| if (cocoapodsInGemfile && (await isInstalled('bundle'))) { | |
| return 'bundler'; | |
| } else { | |
| return 'pod'; | |
| return 'Cocoapods'; | |
| } | |
| const cocoapodsInGemfile = new RegExp(/gem\s+['"]cocoapods/).test(gemfileText); | |
| if (cocoapodsInGemfile) { | |
| return 'bundler'; | |
| } else { | |
| return 'Cocoapods'; | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@cli/src/config.ts` around lines 469 - 475, The code currently uses
isInstalled('bundle') to decide the package manager even when gem 'cocoapods' is
present; instead, if cocoapodsInGemfile (the RegExp test result) is true you
should unconditionally return 'bundler' so downstream checkBundler() can detect
and surface a missing Bundler dependency; remove the isInstalled('bundle')
condition from the branch that returns 'bundler' (leave the alternative return
'Cocoapods' only when gemfile does not contain cocoapods).
| return defaultValue; | ||
| } | ||
|
|
||
| - (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue; { |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Verify no Objective-C method implementations contain a semicolon before the opening brace.
# Expected result: no matches.
rg -nP '^\s*-\s*\([^)]*\)\s*[^;{]+;\s*\{' --iglob '*.m'Repository: Cap-go/capacitor-plus
Length of output: 218
Remove the stray semicolon in method implementation (compile blocker).
Line 32 has invalid Objective-C syntax: the method implementation includes ; before {, which will fail compilation.
Proposed fix
-- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue; {
+- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue {📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue; { | |
| - (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue { |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@ios/Capacitor/Capacitor/CAPBridgedJSTypes.m` at line 32, The method
implementation for getArray:defaultValue: contains a stray semicolon before the
opening brace which breaks Objective-C syntax; open the implementation for -
(NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray *
_Nullable)defaultValue and remove the extraneous semicolon so the signature is
immediately followed by the {, keeping the rest of the method body unchanged.
| <<<<<<< 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 merge conflict; this file is currently invalid JSON.
npm install is already failing with EJSONPARSE because the conflict markers split both the package metadata and peerDependencies. Remove the markers and keep one consistent package identity/version/peer-dependency set before merging.
Also applies to: 36-41
🧰 Tools
🪛 Biome (2.4.10)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: unexpected character <
(parse)
[error] 2-2: String values must be double quoted.
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 3-3: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 4-4: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 5-5: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 6-6: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-7: End of file expected
(parse)
[error] 7-8: End of file expected
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 8-8: unexpected character =
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 9-9: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 10-10: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 11-11: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 12-12: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-13: End of file expected
(parse)
[error] 13-14: End of file expected
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character >
(parse)
[error] 14-14: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@ios/package.json` around lines 2 - 14, The package.json contains unresolved
git conflict markers (<<<<<<< HEAD / >>>>>>> upstream/main) that make the file
invalid JSON; open package.json, remove the conflict markers and choose a
consistent set of fields (e.g., decide final values for "name", "version",
"description", "homepage", "author" and the conflicting peerDependencies around
lines 36-41), then save a single valid JSON object (no markers) so npm can parse
it; ensure the chosen "name"/"version"/peerDependencies align with your intended
package (either `@capacitor-plus/ios` or `@capacitor/ios`) and run a quick JSON lint
or npm install to verify.
| <<<<<<< HEAD | ||
| "version": "8.0.8", | ||
| ======= | ||
| "version": "8.3.0", | ||
| >>>>>>> upstream/main |
There was a problem hiding this comment.
Resolve the leftover merge block.
Lines 16-20 still contain Git conflict markers, so lerna.json is invalid JSON and Lerna cannot read the repository version from it.
Suggested fix
-<<<<<<< HEAD
- "version": "8.0.8",
-=======
- "version": "8.3.0",
->>>>>>> upstream/main
+ "version": "<resolved-version>",🧰 Tools
🪛 Biome (2.4.10)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: unexpected character <
(parse)
[error] 16-16: String values must be double quoted.
(parse)
[error] 17-17: End of file expected
(parse)
[error] 17-17: End of file expected
(parse)
[error] 17-17: End of file expected
(parse)
[error] 17-18: End of file expected
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 18-18: unexpected character =
(parse)
[error] 19-19: End of file expected
(parse)
[error] 19-19: End of file expected
(parse)
[error] 19-19: End of file expected
(parse)
[error] 19-20: End of file expected
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character >
(parse)
[error] 20-20: unexpected character /
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@lerna.json` around lines 16 - 20, Remove the Git conflict markers and restore
a single valid "version" entry in lerna.json; replace the conflict block
containing <<<<<<< HEAD / ======= / >>>>>>> upstream/main with a single JSON
property "version": "8.3.0" (or whichever canonical release version you intend)
so the file is valid JSON and Lerna can read the repository version; ensure only
one "version" key remains and the surrounding JSON stays syntactically correct.
| <<<<<<< 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.
package.json is still conflicted and won't parse.
The merge markers in Lines 35-55 make the root manifest invalid JSON. That matches the current CI failure (npm install → EJSONPARSE), so nothing downstream can run until this block is resolved.
Suggested fix
-<<<<<<< HEAD
- "@types/node": "^24.10.1",
- "@types/tar": "^6.1.2",
- "eslint": "^8.57.1",
- "eslint-plugin-import": "^2.31.0",
-=======
- "@types/node": "18.18.6",
- "eslint": "^8.57.0",
->>>>>>> upstream/main
+ "@types/node": "<resolved-version>",
+ "@types/tar": "<keep-or-remove-intentionally>",
+ "eslint": "<resolved-version>",
+ "eslint-plugin-import": "<keep-or-remove-intentionally>",
...
-<<<<<<< HEAD
- "tar": "^6.1.11",
- "prettier-pretty-check": "^0.2.0"
-=======
- "tar": "^7.5.3"
->>>>>>> upstream/main
+ "tar": "<resolved-version>",
+ "prettier-pretty-check": "<keep-or-remove-intentionally>"🧰 Tools
🪛 Biome (2.4.10)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: unexpected character <
(parse)
[error] 35-35: String values must be double quoted.
(parse)
[error] 36-36: End of file expected
(parse)
[error] 36-36: End of file expected
(parse)
[error] 36-36: End of file expected
(parse)
[error] 36-36: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 37-37: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 38-38: End of file expected
(parse)
[error] 39-39: End of file expected
(parse)
[error] 39-39: End of file expected
(parse)
[error] 39-39: End of file expected
(parse)
[error] 39-40: End of file expected
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 40-40: unexpected character =
(parse)
[error] 41-41: End of file expected
(parse)
[error] 41-41: End of file expected
(parse)
[error] 41-41: End of file expected
(parse)
[error] 41-41: End of file expected
(parse)
[error] 42-42: End of file expected
(parse)
[error] 42-42: End of file expected
(parse)
[error] 42-42: End of file expected
(parse)
[error] 42-43: End of file expected
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character >
(parse)
[error] 43-43: unexpected character /
(parse)
[error] 44-44: End of file expected
(parse)
[error] 44-44: End of file expected
(parse)
[error] 44-44: End of file expected
(parse)
[error] 44-44: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 45-45: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 46-46: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 47-47: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 48-48: End of file expected
(parse)
[error] 49-49: End of file expected
(parse)
[error] 49-49: End of file expected
(parse)
[error] 49-49: End of file expected
(parse)
[error] 49-50: End of file expected
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 54-54: End of file expected
(parse)
[error] 54-54: End of file expected
(parse)
[error] 54-54: End of file expected
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: String values must be double quoted.
(parse)
[error] 55-55: unexpected character /
(parse)
[error] 55-55: String values must be double quoted.
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@package.json` around lines 35 - 55, Resolve the merge conflict in
package.json by removing the Git conflict markers (<<<<<<<, =======, >>>>>>>)
and producing a valid dependencies/devDependencies block; decide which versions
to keep for the conflicting entries (e.g., `@types/node`, eslint, tar, and whether
to include `@types/tar` and prettier-pretty-check) and update the JSON so keys are
unique and properly comma-separated, ensuring package.json parses (no leftover
conflict markers, valid JSON syntax) and that entries like "@types/node",
"eslint", "tar", "@types/tar", and "prettier-pretty-check" appear exactly once
with the chosen version strings.
| <<<<<<< HEAD | ||
| "tar": "^6.1.11", | ||
| "prettier-pretty-check": "^0.2.0" | ||
| ======= | ||
| "tar": "^7.5.3" | ||
| >>>>>>> upstream/main |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -e
echo "Checking root script usage:"
rg -n '"prettier"\s*:\s*".*prettier-pretty-check' package.json
echo
echo "Checking whether the dependency is still declared:"
rg -n '"prettier-pretty-check"\s*:' package.jsonRepository: Cap-go/capacitor-plus
Length of output: 294
Don't drop prettier-pretty-check unless Line 22 is updated too.
Line 22 defines a script that calls prettier-pretty-check, which is currently declared as a devDependency on line 52. If you take the upstream/main resolution (removing the dependency), the npm run prettier command will fail. Either keep the devDependency or switch the script to plain prettier --check.
🧰 Tools
🪛 Biome (2.4.10)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 50-50: unexpected character <
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 51-51: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 52-52: End of file expected
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 53-53: unexpected character =
(parse)
[error] 54-54: End of file expected
(parse)
[error] 54-54: End of file expected
(parse)
[error] 54-54: End of file expected
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: unexpected character >
(parse)
[error] 55-55: String values must be double quoted.
(parse)
[error] 55-55: unexpected character /
(parse)
[error] 55-55: String values must be double quoted.
(parse)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@package.json` around lines 50 - 55, The prettier npm script currently invokes
the package "prettier-pretty-check" but the dependency was removed in the merge;
either restore the devDependency "prettier-pretty-check" in package.json or
change the "prettier" script to use the standard "prettier --check" command.
Locate the "prettier" script in package.json and either add
"prettier-pretty-check": "^0.2.0" back under devDependencies or replace the
script value to "prettier --check" so the script and dependencies stay
consistent.
Merge Conflict Resolution Required
The automatic sync of the
plusbranch with upstream main encountered merge conflicts.What happened
Action needed: Review the branch and resolve any remaining concerns before merging.
This PR was created automatically by the Capacitor+ sync workflow
Summary by CodeRabbit
New Features
Bug Fixes
Chores