Skip to content

Sync upstream and integrate GTK4/WebKitGTK 6 ports#12

Merged
OlympusLedgerOrg merged 51 commits into
devfrom
agent/sync-upstream-gtk4-2026-07-19
Jul 20, 2026
Merged

Sync upstream and integrate GTK4/WebKitGTK 6 ports#12
OlympusLedgerOrg merged 51 commits into
devfrom
agent/sync-upstream-gtk4-2026-07-19

Conversation

@OlympusLedgerOrg

@OlympusLedgerOrg OlympusLedgerOrg commented Jul 19, 2026

Copy link
Copy Markdown
Owner

Summary

  • merge tauri-apps/tauri:dev through 3f62c70d6 without rebasing or rewriting fork history
  • integrate the reviewed gtk4-webkit6-tao-wry staging work that never reached dev
  • vendor the GTK4 Muda, Tao, Tray Icon, and WebKitGTK 6 Wry stack, replay current upstream Tao/Wry fixes, and publish each port branch by fast-forward
  • fix quick-xml advisories without accepting audit exceptions: vendor the released, API-compatible wayland-scanner 0.31.10, apply Smithay's official xml10_content adapter from ec2d9328, and bump only quick-xml to 0.41 as in d07c4f91
  • retain released Wayland runtime crates so wayland-cursor, Smithay Client Toolkit, WGPU, and other released consumers remain compatible
  • restore Tao's required Window: Send + Sync contract and preserve Wry callback Send + Sync bounds across macOS/iOS construction
  • fix the Rust 1.92 Android iterator lint exposed by the full clippy matrix
  • update CI action majors and workflow hardening while keeping protected checks reportable
  • include Cargo lockfiles, release metadata, and GTK4/WebKitGTK 6 supply-chain notes

Why

The earlier vendor merge reached dev before the follow-up GTK4/WebKitGTK 6 staging commits landed. Merging current upstream exposed cross-platform contract mismatches in the reviewed Tao/Wry work and a vulnerable build dependency in the released Wayland scanner.

Pinning Smithay's full unreleased Wayland snapshot fixed quick-xml but also pulled intentional breaking API/code-generation changes. This PR instead vendors the compatible scanner release and applies only Smithay's two official quick-xml update changes. All runtime Wayland crates stay on compatible crates.io releases, and no quick-xml advisory is ignored.

All histories were preserved with additive commits and merge commits. No force push, rebase, or source reset was used.

Impact

Linux builds move from GTK3/WebKitGTK 4.1 to GTK4/WebKitGTK 6 and use the KSNI tray backend. Navigation, IPC, page-load, and document-title callbacks require Sync in addition to Send; this is recorded as a breaking change for tauri and tauri-runtime.

The four standalone port lockfiles now point to the final published sibling branch tips and resolve quick-xml 0.41.0.

Validation

  • exact Linux CI command: cargo clippy --target x86_64-unknown-linux-gnu --all-targets --all-features --locked -- -D warnings
  • native Linux standalone all-target/all-feature checks for Muda, Tray Icon, and Wry
  • native Linux Tao locked check plus Window/EventLoopProxy Send/Sync tests (4 passed)
  • Windows locked all-target/all-feature checks for all four ports
  • cargo test -p tauri-runtime-wry --all-features --lib --locked
  • cargo test -p tauri --all-features --lib --locked (60 passed)
  • cargo audit for root, Muda, Tao, Tray Icon, and Wry (0 vulnerabilities in all five)
  • cargo fmt --all -- --check
  • pnpm install --frozen-lockfile, formatting, ESLint, and TypeScript checks
  • actionlint
  • git diff --check and git fsck --connectivity-only --no-dangling

Summary by CodeRabbit

  • New Features
    • Added iOS webview controls to limit navigations to app-bound domains.
    • Bundler now shows human-readable bundle sizes in its “Finished N bundles” output.
    • Android project generation updated (Material 3 themes and migration to Kotlin Gradle compilerOptions DSL, including updated Android build guidance).
    • Expanded menu, accelerator, icon, and tray capabilities in the included functionality and ports.
  • Bug Fixes
    • WiX bundling now preserves resource target filenames.
    • tauri info no longer reports Rust-only plugins as missing npm packages.
    • Fixed a potential compilation issue related to differing debug-assertion settings across profiles.
  • Breaking Changes
    • Webview-related callbacks (navigation, IPC, page-load, document title) now require Send + Sync.

OlympusLedgerOrg and others added 30 commits July 7, 2026 17:52
feat(linux): integrate GTK4 WebKitGTK6 stack
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…15694)

Kotlin Gradle Plugin deprecated the string-based `kotlinOptions` DSL and
2.3+ rejects it with a hard error. Use the `compilerOptions` DSL with
`JvmTarget.JVM_1_8` instead, which is accepted on both 1.9.x and 2.x, so
projects can move to Kotlin 2.x without editing the vendored
`:tauri-android` scripts.
* Migrate to svelte ts for API example

* Clean up

* Use `$derived` `selectedWebview`

* Do the change in onchange instead of state effects

* Set initial x y and sizes

* revert ai slop on main.ts

* More cleanup

* Remove ConsoleMessage

* Remove View type

* license header

* Use `ViewProps`

* Use same button spacing through out

* Move theme example to top level theme switch

* Fix menu views

* More cleanups

* Final cleanup

* Move types to svelte files

* fallback to empty string not false
* fix(bundler): preserve mapped resource names in wix

* Refactor the entire `generate_resource_data`

* Add `ResourceFile::new`

* Use back the hashmap but with entry

* Remove `ResourceDirectory::name` and rely on `directories`

* Fix tests

* Fix git stage

* Add change file

* Make `target_name` optional

* Cleanup

---------

Co-authored-by: Tony <legendmastertony@gmail.com>
Co-authored-by: Tony <68118705+Legend-Master@users.noreply.github.com>
…pps#15711)

* fix: `referenced_by` compilation on different debug profiles

* Guess `ResolvedCommandReference` can't be `debug_assertions` only anymore

* no `const` or
`the destructor for this type cannot be evaluated in constant functions`

* Remove ToTokens guard for ResolvedCommandReference

* Rely on `default` and empty out the `ResolvedCommandReference`

* `ResolvedCommandReference` needs the same
* Migrate to svelte ts for API example

* Clean up

* Use `$derived` `selectedWebview`

* Do the change in onchange instead of state effects

* Set initial x y and sizes

* revert ai slop on main.ts

* More cleanup

* Remove ConsoleMessage

* Remove View type

* license header

* Use `ViewProps`

* Use same button spacing through out

* Move theme example to top level theme switch

* Fix menu views

* More cleanups

* Merge branch 'dev' into api-example-svelte-ts

* Final cleanup

* Move types to svelte files

* fallback to empty string not false

* Initial work

* Bump deps

* Make dragging with states work

* Fix sorting

* Move everything to `MenuBuilder.svelte`

* Add remove button

* Fix Menu and Tray

* Make menu items reactive

* Sync checked states

* Add placeholder to menu builder

* Set user-select to none

* Fix text in the console

* Rework tray page layout

* Close all menus on MenuBuilder unmounted

* Clean up menus properly

* Add initial text and icon on the menu builders

* Move MenuItems to MenuBuilder

* format

* Merge branch 'dev' into api-example-svelte-ts

* Merge branch 'api-example-svelte-ts' into menu-example-rework

* Re-create all the elements as a work around

* Reorder the menu items on builder changes

* On one tray for the tray page

* Update menus on add and remove

* Same for the tray

* Space and align checkboxes

* Merge remote-tracking branch 'upstream/dev' into menu-example-rework

* Clean up menus properly

* Merge branch 'dev' into menu-example-rework

* Remove duplicated webview in new command

* Merge branch 'dev' into menu-example-rework
* fix(ci): bump all setup-node action versions

* NAPI on node 22 as well

* remove covector node version lock
renovate Bot and others added 11 commits July 16, 2026 11:52
…i-apps#15729)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
…5644)

* feat(bundler): show bundle sizes in the finished output

Append a human-readable size to each bundle path in the "Finished N bundles
at:" log, so the sizes are visible right after `tauri build` instead of
having to look them up manually. Directory bundles (e.g. macOS `.app`) are
measured recursively.

Closes tauri-apps#15341

* chore: include tauri-cli in changefile

* refactor(bundler): use human_bytes crate for size formatting

* Also `@tauri-apps/cli`

* Change to use bytesize for 2 digit precisions
And fail instead of reporting partial sizes

---------

Co-authored-by: Tony <legendmastertony@gmail.com>
…pps#15730)

* Use `Theme.Material3.DayNight.NoActionBar` by default

* Fix insets on Android

* Add change file

* Revert back to margin-top: 0.5rem

* Align content start
* refactor: rename `extend_api` to `run_invoke_handler`

* Link docs

* unwrap_or_else
* clean up and docs

* Remove menu channel on drop

* Why was the mut gone

* Clone the channel out

* Keep `unreachable_code`

* Put it back to a block

* Move the cloned channel out so no nuances

* Add change file
This allows the unstyled user agent elements match the selected theme colors
* fix: menu regression from tauri-apps#15679

* change init order instead
…pps#13848)

* Draft: Add `WebviewBuilder::limit_navigations_to_app_bound_domains` only on iOS.

* removed cfg flag from new setters

* change version bump to minor

* fix clippy lint for limit_navigations_to_app_bound_domains

* add tauri.conf.json support, polish doc comments

* add back missing comma, autogenerate config files

* minor documentation formatting changes

* Fix limitNavigationsToAppBoundDomains config binding, edit documentation.

* Have the CLI automatically inject `localhost` into the `WKAppBoundDomains` array
in `Info.plist` when `limitNavigationsToAppBoundDomains` is enabled.

Update the `merge_plist` helper to merge arrays in place
while skipping duplicate entries.

* Extract all window domains for WKAppBoundDomains array

* refine docs for limit_navigations_to_app_bound_domains WindowConfig parameter

* Revert automatic insertion of WKAppBoundDomains, update documentation to match.

* have docs specify tauri-src/Info.ios.plist

* cli doesn't have changes anymore

* Combine ios blocks

* Remove duplicated builder call

* format

---------

Co-authored-by: Tony <68118705+Legend-Master@users.noreply.github.com>
Co-authored-by: Tony <legendmastertony@gmail.com>
# Conflicts:
#	.github/workflows/audit.yml
@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5b4067f4-e619-4bb5-888b-a302081cfdc6

📥 Commits

Reviewing files that changed from the base of the PR and between d764c7d and 8585b60.

📒 Files selected for processing (1)
  • ports/muda/docs/adr/0001-observable-key-accelerator-errors.md

📝 Walkthrough

Walkthrough

This PR migrates the Linux GUI stack from GTK3/WebKit2GTK to GTK4/WebKitGTK6 across runtime, bundler, and CLI crates; adds an iOS app-bound-domains navigation feature; introduces vendored muda, tao, tray-icon, wry, and wayland-scanner crates; modernizes CI actions and toolchains; fixes WiX resource naming and adds bundle size reporting; cleans up menu channel handling; and converts the example frontend to TypeScript.

Changes

GTK4/WebKit6 Runtime Migration and Core Features

Layer / File(s) Summary
Runtime GTK4/WebKit6 type migration
crates/tauri-runtime-wry/..., crates/tauri-runtime/..., crates/tauri/src/window/..., crates/tauri/src/webview/...
Runtime crates switch to gtk4/webkit6 deps, update transient_for/WebView type bounds, GDK4 work-area/resize logic, and require Send + Sync on IPC/navigation handlers.
App-bound-domains feature
crates/tauri-runtime/src/webview.rs, crates/tauri/src/webview/..., crates/tauri-utils/src/config.rs, schema files
Adds limit_navigations_to_app_bound_domains config field and builder methods, wired into iOS WKWebView.
Bundler size reporting and WiX fix
crates/tauri-bundler/...
Adds byte-size suffix to printed bundle paths and reworks WiX resource tree to support target name overrides.
CLI GTK4 detection and init updates
crates/tauri-cli/...
Renames WebKit detection helper, static Linux runtime deps, adds new port dependency wiring to tauri init.
Android Gradle/theme migration
crates/tauri-cli/templates/..., crates/tauri/mobile/..., examples/api/src-tauri/...
Switches Kotlin JVM target config and app theme to Material3.
Menu channel and plugin invoke cleanup
crates/tauri/src/menu/..., crates/tauri/src/plugin.rs, crates/tauri/src/manager/..., crates/tauri/src/app.rs
Removes JS menu-drop channel, renames plugin invoke dispatch, reorders plugin registration.
ResolvedCommandReference debug fix
crates/tauri-utils/src/acl/resolved.rs
Makes types exist unconditionally with debug-only fields via hidden constructors.

Estimated code review effort: 5 (Critical) | ~150 minutes

Vendored Port Crates

Layer / File(s) Summary
muda crate
ports/muda/...
Full vendored native-menu crate with GTK4/Windows/macOS platform implementations.
tray-icon crate
ports/tray-icon/...
Full vendored cross-platform tray crate built on muda.
tao port updates
ports/tao/...
Wayland-scanner patch, icon overflow fix, Send/Sync, Android dispatch refactor, GTK4 window internals.
wayland-scanner crate
vendor/wayland-scanner/...
Vendored proc-macro crate for Wayland protocol code generation.
wry patches
ports/wry/...
Send + Sync navigation delegate bounds, Android window handle changes.

CI, Tooling, and Frontend Modernization

Layer / File(s) Summary
CI Actions and dependency bumps
.github/workflows/*
Bumps checkout/setup-node/docker actions, switches to GTK4/WebKitGTK6 apt packages.
Workspace and license-header tooling
Cargo.toml, .scripts/ci/..., .prettierignore, package.json
Raises Rust version, adds patches/excludes, extends vendor ignores.
Supply-chain audit and changelog
supply-chain/config.toml, audits/..., .changes/*.md
Adds audit policies and release notes.
Example app TypeScript migration
examples/api/...
Converts frontend to TypeScript, reworks theming, Menu/Tray builders, and Window view.

Estimated code review effort: 4 (Complex) | ~90 minutes

Possibly related PRs

  • OlympusLedgerOrg/tauri#3: Shares core GTK4/WebKitGTK6 integration work, switching runtime/webview types from webkit2gtk/GTK3 to webkit/GTK4.
  • OlympusLedgerOrg/tauri#4: Both touch the same Linux GTK icon row-stride/overflow handling in ports/tao/src/platform_impl/linux/icon.rs.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: syncing upstream while integrating GTK4/WebKitGTK 6 port updates.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch agent/sync-upstream-gtk4-2026-07-19

Comment @coderabbitai help to get the list of available commands.

@socket-security

socket-security Bot commented Jul 19, 2026

Copy link
Copy Markdown

Warning

Review the following alerts detected in dependencies.

According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.

Action Severity Alert  (click "▶" to expand/collapse)
Warn High
Obfuscated code: cargo zerocopy is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: ?cargo/winit@0.30.13cargo/image@0.25.10cargo/eframe@0.31.1cargo/zerocopy@0.8.54

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore cargo/zerocopy@0.8.54. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm css-tree is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: pnpm-lock.yamlnpm/unocss@66.7.5npm/css-tree@3.2.1

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/css-tree@3.2.1. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

View full report

@OlympusLedgerOrg
OlympusLedgerOrg marked this pull request as ready for review July 19, 2026 18:48

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 17

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 (1)
crates/tauri-cli/templates/plugin/.github/workflows/clippy.yml (1)

1-1: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Plugin CI templates still install webkit2gtk-4.1 — should be updated for GTK4/WebKitGTK6 migration. The PR migrates the runtime from GTK3/WebKit2GTK 4.1 to GTK4/WebKitGTK6, but the plugin template workflows still install the old webkit2gtk-4.1 development package. Plugins built against the new Tauri stack will fail CI on Ubuntu because the required GTK4/WebKitGTK6 development headers are not installed.

  • crates/tauri-cli/templates/plugin/.github/workflows/clippy.yml#L48-52: Update the install webkit2gtk step to install the GTK4/WebKitGTK6 development packages (e.g., libwebkitgtk-6.0-dev, libgtk-4-dev) instead of webkit2gtk-4.1.
  • crates/tauri-cli/templates/plugin/.github/workflows/test.yml#L28-32: Same update needed — replace webkit2gtk-4.1 with the appropriate GTK4/WebKitGTK6 packages.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/tauri-cli/templates/plugin/.github/workflows/clippy.yml` at line 1,
Update the plugin workflow templates’ dependency-install steps in clippy.yml and
test.yml to remove webkit2gtk-4.1 and install the GTK4/WebKitGTK6 development
packages required by the migrated Tauri stack, including libwebkitgtk-6.0-dev
and libgtk-4-dev.
🟡 Minor comments (26)
.changes/tauri-info-skip-rust-only-js.md-6-6 (1)

6-6: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Clarify the reported behavior.

As written, this says tauri info correctly reports a nonexistent npm package as not installed. Describe the actual fix instead, for example: “Fix tauri info from reporting Rust-only plugins as having a missing npm package.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.changes/tauri-info-skip-rust-only-js.md at line 6, Update the changelog
entry to describe the actual fix: prevent `tauri info` from reporting Rust-only
plugins as having a missing npm package, rather than stating that nonexistent
npm packages are reported as not installed.
.changes/android-compileroptions-dsl.md-9-9 (1)

9-9: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Polish the affected release-note wording.

Please correct these grammatical and clarity issues:

  • .changes/android-compileroptions-dsl.md#L9: say “if your Gradle version is earlier.”
  • .changes/cleanup-js-menu-channel.md#L5: use “Remove the Channel used to send events to the JavaScript side when the menu is dropped.”
  • .changes/fix-wix-resource-target-name.md#L8: use “Fix the WiX bundler so it respects the resource’s target file name.”
  • .changes/resolved-command-reference-debug-assertion.md#L8: replace “can resulting” with “can result,” and clarify the affected build/runtime profiles.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.changes/android-compileroptions-dsl.md at line 9, Polish the release-note
wording at .changes/android-compileroptions-dsl.md:9 to say “if your Gradle
version is earlier”; at .changes/cleanup-js-menu-channel.md:5 to use “Remove the
`Channel` used to send events to the JavaScript side when the menu is dropped”;
at .changes/fix-wix-resource-target-name.md:8 to use “Fix the WiX bundler so it
respects the resource’s target file name”; and at
.changes/resolved-command-reference-debug-assertion.md:8 to replace “can
resulting” with “can result” and clarify the affected build/runtime profiles.
examples/api/src/views/Tray.svelte-117-131 (1)

117-131: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

menu resource leaks on every "Remove tray" → "Create tray" cycle.

The remove-tray handler closes/resets tray but never closes menu. create() unconditionally overwrites menu on the next click, so the previous Menu resource is never released. Menu.svelte's setMenu() closes prior resources before reassigning — this handler should do the same.

🔧 Proposed fix
       {`#if` tray}
         <button
           class="btn"
           onclick={() => {
             tray?.close()
             tray = undefined
+            menu?.close()
+            menu = undefined
           }}
           title="Remove the tray icon">Remove tray</button
         >
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@examples/api/src/views/Tray.svelte` around lines 117 - 131, Update the
“Remove tray” handler in the tray conditional to close and reset the existing
menu resource before closing and clearing tray, reusing the cleanup behavior
established by Menu.svelte’s setMenu(). Ensure each remove/create cycle releases
the prior menu instead of allowing create() to overwrite it.
examples/api/src/views/Tray.svelte-29-50 (1)

29-50: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Close the menu when removing the tray
Remove tray closes tray but leaves menu open; the next create() overwrites it and leaks the previous native menu handle.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@examples/api/src/views/Tray.svelte` around lines 29 - 50, The tray removal
flow must also close and clear the existing menu handle. Update the remove-tray
logic to call menu.close() and set menu to undefined alongside the existing tray
cleanup, preventing create() from overwriting a live native menu.
examples/api/src/views/WebRTC.svelte-38-40 (1)

38-40: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Message renders [object Object] and has a typo.

${constraints} interpolates an object as [object Object]; use JSON.stringify(constraints). Also "satisified" → "satisfied".

✏️ Proposed fix
       onMessage(
-        `The constraints ${constraints} can not be satisified by your device.`
+        `The constraints ${JSON.stringify(constraints)} can not be satisfied by your device.`
       )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@examples/api/src/views/WebRTC.svelte` around lines 38 - 40, Update the
onMessage call in WebRTC.svelte to serialize constraints with
JSON.stringify(constraints) instead of implicit object interpolation, and
correct “satisified” to “satisfied” in the message text.
examples/api/src/app.css-54-55 (1)

54-55: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Stylelint error will fail lint CI.

declaration-empty-line-before is flagged at Line 55. Add the expected empty line to keep the lint pipeline green.

💚 Proposed fix
   `#sidebar` {
     --translate-x: -18.75rem;
+
     transform: translateX(var(--translate-x));
   }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@examples/api/src/app.css` around lines 54 - 55, Add the required empty line
before the transform declaration in the relevant app.css rule, preserving the
existing --translate-x declaration and transform behavior while satisfying
Stylelint’s declaration-empty-line-before rule.

Source: Linters/SAST tools

crates/tauri/src/menu/plugin.rs-890-892 (1)

890-892: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Make menu-channel cleanup ownership-aware. MenuChannels is app-wide and keyed only by MenuId, while new overwrites existing entries with insert(id, handler). If explicit IDs can be reused across live menus, dropping one wrapper can remove the newer handler and break event routing for the remaining menu. Consider enforcing uniqueness or storing/removing the channel by resource ownership instead of bare MenuId.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/tauri/src/menu/plugin.rs` around lines 890 - 892, Make MenuChannels
cleanup ownership-aware in remove_menu_channel and the corresponding new
registration path: prevent a dropped menu from removing a newer handler
registered under the same MenuId. Track the owning menu/resource or otherwise
verify the stored handler belongs to the dropping wrapper before removal, while
preserving routing for the active menu.
.github/workflows/udeps.yml-53-53 (1)

53-53: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Expand udeps coverage for all vendored port crates.
ports/** only routes changes into the wry matrix entry, so edits under ports/muda, ports/tao, and ports/tray-icon skip udeps entirely. Wire vendor/wayland-scanner/** into the same coverage too, since those crates depend on it.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/udeps.yml at line 53, Update the udeps workflow
path-to-matrix routing around the existing ports/** entry so changes under
ports/muda, ports/tao, ports/tray-icon, and vendor/wayland-scanner are covered
by the appropriate udeps matrix entries, rather than only routing ports/**
through wry. Preserve existing coverage while ensuring each named vendored crate
triggers udeps.
.github/workflows/covector-version-or-publish.yml-73-75 (1)

73-75: 🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

Disable checkout credential persistence in these workflows.

Add persist-credentials: false to the listed actions/checkout steps unless a later step needs to push with the checkout token.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/covector-version-or-publish.yml around lines 73 - 75,
Disable checkout credential persistence for every listed actions/checkout step
by adding persist-credentials: false:
.github/workflows/covector-version-or-publish.yml lines 73-75 and 22-24,
.github/workflows/check-license-header.yml line 18,
.github/workflows/covector-status.yml lines 13-15, .github/workflows/docker.yml
lines 19-20 and 62-63, and .github/workflows/fmt.yml lines 15, 28, and 41. Do
not add it only where a later step requires the checkout token to push.

Source: Linters/SAST tools

ports/muda/.changes/config.json-8-11 (1)

8-11: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Prepublish deps still target GTK3. The crate now links gtk4 (see .changes/gtk4.md), but prepublish installs libgtk-3-dev. Since publish runs cargo publish --dry-run (line 24), which compiles the crate, the dry-run build would lack the GTK4 development headers.

🔧 Proposed fix
       "prepublish": [
         "sudo apt-get update",
-        "sudo apt-get install -y libgtk-3-dev libxdo-dev"
+        "sudo apt-get install -y libgtk-4-dev libxdo-dev"
       ],
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/muda/.changes/config.json` around lines 8 - 11, Update the prepublish
dependency list in config.json to install the GTK4 development package required
by the crate instead of libgtk-3-dev. Keep the existing libxdo-dev dependency
and command ordering unchanged so the publish dry-run has the required headers.
ports/muda/src/platform_impl/gtk/mod.rs-275-275 (1)

275-275: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use a pointer-sized key for GTK windows
window.as_ptr() as u32 truncates the pointer on 64-bit builds, so distinct windows can collide in self.instances and get the wrong menu state across init/show/hide/remove. Please switch these keys to a pointer-sized type (usize or equivalent) everywhere this cast is repeated.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/muda/src/platform_impl/gtk/mod.rs` at line 275, Replace the u32 GTK
window key derived from window.as_ptr() with a pointer-sized type such as usize,
and update all corresponding self.instances key declarations, lookups, inserts,
and removals across init/show/hide/remove flows to use the same type
consistently.
ports/muda/README.md-33-49 (1)

33-49: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Install instructions still reference GTK3 for a GTK4 port.

This crate is ported to GTK4/WebKitGTK6, but the dependency instructions tell users to install gtk3 / libgtk-3-dev / gtk3. Builders following this will pull the wrong dev packages. Please update to the GTK4 equivalents (e.g. gtk4, libgtk-4-dev).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/muda/README.md` around lines 33 - 49, Update the README dependency
installation commands for the GTK4/WebKitGTK6 port: replace GTK3 packages in the
Debian/Ubuntu and FreeBSD sections, including libgtk-3-dev and gtk3, with the
appropriate GTK4 development packages such as libgtk-4-dev and gtk4. Keep the
existing installation structure and other dependencies unchanged.
ports/muda/examples/windows-common-controls-v6/src/main.rs-224-233 (1)

224-233: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Linux GTK branch is still broken here.

ContextMenu exposes show_context_menu_for_gtk_window(...), not show_context_menu_for_gtk(...), and this file doesn’t import tao::platform::unix::WindowExtUnix for gtk_window(). Mirror the other examples and gate/comment out this path until the GTK4 API is wired up.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/muda/examples/windows-common-controls-v6/src/main.rs` around lines 224
- 233, Update the Linux/Unix GTK branch in the main window context-menu flow to
match the other examples: do not call the unavailable
ContextMenu::show_context_menu_for_gtk API, and gate or comment out this path
until GTK4 support is wired up, avoiding gtk_window() unless the required
WindowExtUnix integration is present.
ports/muda/src/lib.rs-390-398 (1)

390-398: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Doc comment mismatch: Windows-only method references NSView.

detach_menu_subclass_from_hwnd is #[cfg(target_os = "windows")], but its doc text ("The view must be a pointer to a valid NSView") appears copy-pasted from the macOS show_context_menu_for_nsview doc.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/muda/src/lib.rs` around lines 390 - 398, The documentation for the
Windows-only detach_menu_subclass_from_hwnd method incorrectly references
NSView. Replace that sentence with Windows-appropriate wording describing the
hwnd as a valid window handle, while preserving the existing safety requirement
and method behavior.
ports/muda/src/items/predefined.rs-6-6 (1)

6-6: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Same "0" → "inner" corruption repeated across the ported items/*.rs files.

All three files carry an identical SPDX header typo, and predefined.rs additionally shows the same corruption in test fixture strings — evidence this is one mechanical substitution bug from the porting process rather than three independent typos.

  • ports/muda/src/items/predefined.rs#L6-L6: fix Apache-2.innerApache-2.0 in the second SPDX header.
  • ports/muda/src/items/predefined.rs#L226-L243: fix "Version: 1.inner""Version: 1.0" in the test_about_metadata fixtures/assertions.
  • ports/muda/src/items/icon.rs#L6-L6: fix Apache-2.innerApache-2.0 in the second SPDX header.
  • ports/muda/src/items/submenu.rs#L6-L6: fix Apache-2.innerApache-2.0 in the second SPDX header.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/muda/src/items/predefined.rs` at line 6, The ported muda item files
contain mechanical “0” to “inner” substitutions. In
ports/muda/src/items/predefined.rs at lines 6 and 226-243, replace the corrupted
SPDX and test fixture/assertion strings with the correct “Apache-2.0” and
“Version: 1.0” values; make the same SPDX correction in
ports/muda/src/items/icon.rs at line 6 and ports/muda/src/items/submenu.rs at
line 6.
ports/muda/src/lib.rs-28-42 (1)

28-42: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Update the Linux install commands to GTK4 The crate depends on gtk4 on Linux, so these instructions should use pacman -S gtk4 xdotool and sudo apt install libgtk-4-dev libxdo-dev.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/muda/src/lib.rs` around lines 28 - 42, Update the Linux dependency
installation commands in the crate documentation to match the gtk4 dependency:
use gtk4 with pacman and libgtk-4-dev with apt, while retaining the existing
xdotool packages.
ports/muda/src/items/check.rs-5-7 (1)

5-7: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Corrupted SPDX identifier: Apache-2.inner should be Apache-2.0.

This is the only file in the batch with this typo; the matching header block in sibling files (e.g. builders/check.rs, error.rs, icon.rs) correctly reads Apache-2.0.

🐛 Proposed fix
 // Copyright 2022-2022 Tauri Programme within The Commons Conservancy
-// SPDX-License-Identifier: Apache-2.inner
+// SPDX-License-Identifier: Apache-2.0
 // SPDX-License-Identifier: MIT
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/muda/src/items/check.rs` around lines 5 - 7, Correct the SPDX license
identifier in the header of check.rs from Apache-2.inner to Apache-2.0, leaving
the surrounding copyright and MIT license lines unchanged.
ports/muda/src/builders/icon.rs-115-117 (1)

115-117: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

set_key_accelerator error is silently discarded in build.

The let _ = on line 116 discards the Result from set_key_accelerator. If the platform-specific accelerator assignment fails, the user gets a menu item without the accelerator and no error indication, despite having explicitly set one via accelerator() or key_accelerator().

Consider propagating the error or at minimum logging it, so accelerator failures aren't invisible.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/muda/src/builders/icon.rs` around lines 115 - 117, Update the key
accelerator handling in build so the Result from item.set_key_accelerator is not
silently discarded. Propagate the assignment error through the existing build
error path, preserving the configured accelerator behavior and making
platform-specific failures visible to the caller.
ports/tray-icon/README.md-43-43 (1)

43-43: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

FreeBSD instructions still reference gtk3 instead of gtk4.

This PR migrates the Linux stack to GTK4/WebKitGTK6. The Arch Linux (line 29) and Debian (line 35) sections correctly reference gtk4/libgtk-4-dev, but the FreeBSD section still installs gtk3. This should be gtk4 to match the migration.

📝 Proposed fix
- pkg install -y rust glib pkgconf gtk3
+ pkg install -y rust glib pkgconf gtk4
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/tray-icon/README.md` at line 43, Update the FreeBSD dependency
installation command in the README to install gtk4 instead of gtk3, keeping the
other packages and platform instructions unchanged.
ports/tray-icon/src/platform_impl/linux/icon.rs-20-20 (1)

20-20: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

is_multiple_of needs a lower-MSRV fallback
ports/tray-icon/Cargo.toml still pins rust-version = "1.73", and usize::is_multiple_of needs Rust 1.82+, so this won’t build on the declared MSRV. Use rgba.len() % 4 == 0 here unless the crate MSRV is raised first.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/tray-icon/src/platform_impl/linux/icon.rs` at line 20, Update the
condition near the Linux icon RGBA validation to use the modulo-based
multiple-of check instead of usize::is_multiple_of, preserving the existing
invalid-length branch while remaining compatible with the crate’s Rust 1.73
MSRV.
ports/tray-icon/src/platform_impl/gtk/mod.rs-146-163 (1)

146-163: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Test assertion hardcodes /tmp but temp_dir() may differ.

Line 163 asserts dir3 == PathBuf::from("/tmp/tray-icon"), but temp_icon_path falls back to std::env::temp_dir().join("tray-icon") when XDG_RUNTIME_DIR is unset. On Linux, std::env::temp_dir() returns $TMPDIR if set, which may not be /tmp. If TMPDIR is set in the CI environment, this test will fail.

Proposed fix
-    assert_eq!(dir3, PathBuf::from("/tmp/tray-icon"));
+    assert_eq!(dir3, std::env::temp_dir().join("tray-icon"));
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/tray-icon/src/platform_impl/gtk/mod.rs` around lines 146 - 163, Update
the final assertion in temp_icon_path_preference_order to compare dir3 with
std::env::temp_dir().join("tray-icon") instead of hardcoding /tmp, preserving
the expected fallback behavior when XDG_RUNTIME_DIR is unset.
ports/tray-icon/src/platform_impl/gtk/icon.rs-46-58 (1)

46-58: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Explicitly flush the BufWriter to avoid silent data loss.

The BufWriter is created as an unnamed temporary (&mut BufWriter::new(png)). When it's dropped at the end of the function, BufWriter::Drop calls flush() but silently discards errors. If the final flush fails (e.g., disk full), write_to_png returns Ok(()) but the PNG file is truncated. Restructure to use a named binding and flush explicitly.

Proposed fix
 pub fn write_to_png(&self, path: impl AsRef<Path>) -> crate::Result<()> {
     let png = File::create(path)?;
-    let w = &mut BufWriter::new(png);
-
-    let mut encoder = png::Encoder::new(w, self.width as _, self.height as _);
-    encoder.set_color(png::ColorType::Rgba);
-    encoder.set_depth(png::BitDepth::Eight);
-
-    let mut writer = encoder.write_header()?;
-    writer.write_image_data(&self.rgba)?;
-
-    Ok(())
+    let mut w = BufWriter::new(png);
+
+    {
+        let mut encoder = png::Encoder::new(&mut w, self.width as _, self.height as _);
+        encoder.set_color(png::ColorType::Rgba);
+        encoder.set_depth(png::BitDepth::Eight);
+
+        let mut writer = encoder.write_header()?;
+        writer.write_image_data(&self.rgba)?;
+    }
+
+    w.flush()?;
+    Ok(())
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/tray-icon/src/platform_impl/gtk/icon.rs` around lines 46 - 58, Update
write_to_png to store the BufWriter in a named mutable binding rather than
borrowing an unnamed temporary, then explicitly flush it after write_image_data
completes and propagate any flush error before returning Ok. Keep the existing
PNG encoding behavior unchanged.
ports/muda/src/menu.rs-5-7 (1)

5-7: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Corrupted SPDX identifier in the license header.

Line 6 reads Apache-2.inner instead of Apache-2.0 — likely collateral from an automated .0.inner refactor. This is an invalid SPDX id and can break SPDX/license-header checks. The same header in ports/muda/src/util.rs correctly uses Apache-2.0.

🔧 Proposed fix
 // Copyright 2022-2022 Tauri Programme within The Commons Conservancy
-// SPDX-License-Identifier: Apache-2.inner
+// SPDX-License-Identifier: Apache-2.0
 // SPDX-License-Identifier: MIT
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/muda/src/menu.rs` around lines 5 - 7, Correct the SPDX identifier in
the license header of ports/muda/src/menu.rs from Apache-2.inner to Apache-2.0,
matching the valid identifier used by the neighboring util.rs header.
ports/tray-icon/examples/winit.rs-134-140 (1)

134-140: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Replace the GTK 3-style main loop

gtk is already aliased to gtk4 on this target, but GTK 4 has no gtk::main(). Switch this example to the GTK 4 application/main-loop pattern, or it won't build on Linux/BSD.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/tray-icon/examples/winit.rs` around lines 134 - 140, Update the GTK
initialization thread around Application::new_tray_icon to use the GTK 4
application/main-loop pattern instead of the unavailable gtk::main() call.
Ensure the tray icon remains alive and the GTK 4 event loop is started through
the appropriate application mechanism.
crates/tauri-bundler/src/bundle.rs-306-319 (1)

306-319: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

bundle_size also sums directory entries, inflating reported size.

WalkDir::new(path) yields directory entries as well as files, and their metadata().len() (the directory's own inode footprint, not its contents) is added to total. For bundles with many nested subdirectories this measurably inflates the size shown in the "Finished" log line.

🩹 Proposed fix: only sum file entries
 fn bundle_size(path: &std::path::Path) -> crate::Result<u64> {
   let metadata = std::fs::symlink_metadata(path)?;
   if metadata.is_dir() {
     let mut total = 0;
     for entry in walkdir::WalkDir::new(path) {
-      total += entry?.metadata()?.len();
+      let entry = entry?;
+      if entry.file_type().is_file() {
+        total += entry.metadata()?.len();
+      }
     }
     Ok(total)
   } else {
     Ok(metadata.len())
   }
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/tauri-bundler/src/bundle.rs` around lines 306 - 319, Update
bundle_size to sum only file entries when recursively walking directories,
excluding directory entries from the total while preserving symlink and error
handling behavior for included files.
crates/tauri-cli/config.schema.json-617-621 (1)

617-621: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the documented iOS plist path.

Line 618 points users to tauri-src/Info.ios.plist. Verify the canonical project layout and update the source documentation and generated schema to use src-tauri/Info.ios.plist; otherwise users may place WKAppBoundDomains where Tauri will not load it.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/tauri-cli/config.schema.json` around lines 617 - 621, Update the
description for the limitNavigationsToAppBoundDomains schema property and its
source documentation to reference the canonical src-tauri/Info.ios.plist path
instead of tauri-src/Info.ios.plist, preserving the surrounding
WKAppBoundDomains guidance.
🧹 Nitpick comments (6)
.github/workflows/covector-version-or-publish.yml (1)

26-26: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Use a pinned Corepack installation consistently.

  • .github/workflows/covector-version-or-publish.yml#L26-L26: replace the unpinned global install with the repository’s pinned toolchain.
  • .github/workflows/covector-version-or-publish.yml#L76-L76: apply the same deterministic installation in the publish job.
  • .github/workflows/fmt.yml#L29-L29: avoid resolving a mutable npm package during formatting CI.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/covector-version-or-publish.yml at line 26, Replace the
unpinned Corepack installation at
.github/workflows/covector-version-or-publish.yml:26-26 with the repository’s
pinned toolchain, and apply the same deterministic installation at
.github/workflows/covector-version-or-publish.yml:76-76 and
.github/workflows/fmt.yml:29-29. Avoid resolving Corepack through a mutable
global npm package in all three workflow sites.

Source: Linters/SAST tools

.github/workflows/lint-js.yml (1)

22-22: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Make the Corepack bootstrap reproducible.

The same unpinned global installation appears in multiple workflows.

  • .github/workflows/lint-js.yml#L22-L22: pin Corepack or use the declared package-manager setup.
  • .github/workflows/lint-js.yml#L34-L34: apply the same pinned setup.
  • .github/workflows/publish-cli-js.yml#L80-L80: pin the global Corepack package.
  • .github/workflows/test-android.yml#L46-L46: pin the global Corepack package.
  • .github/workflows/test-cli-js.yml#L41-L41: pin the global Corepack package.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/lint-js.yml at line 22, Make Corepack bootstrapping
reproducible by pinning the globally installed Corepack version or reusing the
repository’s declared package-manager setup. Apply the same change at both sites
in .github/workflows/lint-js.yml (lines 22 and 34), plus
.github/workflows/publish-cli-js.yml (line 80),
.github/workflows/test-android.yml (line 46), and
.github/workflows/test-cli-js.yml (line 41).

Source: Linters/SAST tools

ports/muda/src/icon.rs (1)

116-140: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Test gap: PngEncodingError source passthrough isn't covered.

New tests only exercise ByteCountNotDivisibleBy4, DimensionsVsPixelCount, and OsError; the cfg-gated PngEncodingError branch (Lines 82-84, 103) added for Linux/BSD+gtk builds has no corresponding test.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/muda/src/icon.rs` around lines 116 - 140, Add a cfg-gated unit test in
the tests module for BadIcon::PngEncodingError, constructing it with a
representative encoding error and asserting source() returns Some. Match the
existing Linux/BSD+gtk configuration guards used by the variant and preserve the
current tests unchanged.
ports/tray-icon/.changes/config.json (1)

9-10: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Prepublish deps still target GTK3 after the GTK4 migration. This port moved to GTK4/WebKitGTK6 (the lib.rs docs now instruct libgtk-4-dev), but the covector prepublish step installs libgtk-3-dev and libayatana-appindicator3-dev. Since cargo publish builds the crate, these stale dev packages may not satisfy the gtk4 build during release.

♻️ Align prepublish deps with GTK4
       "prepublish": [
         "sudo apt-get update",
-        "sudo apt-get install -y libgtk-3-dev libxdo-dev libayatana-appindicator3-dev"
+        "sudo apt-get install -y libgtk-4-dev libxdo-dev libayatana-appindicator3-dev"
       ],

Confirm whether the ksni backend still needs appindicator here.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ports/tray-icon/.changes/config.json` around lines 9 - 10, Update the
prepublish dependency commands in the changes configuration to install the GTK4
development package required by the migrated port, replacing the stale GTK3
package. Verify whether the ksni backend still requires
libayatana-appindicator3-dev; remove it if no longer needed, otherwise retain it
alongside the GTK4 dependency.
crates/tauri-bundler/src/bundle/windows/msi/mod.rs (1)

162-204: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Non-deterministic directories iteration order in render_wix.

ResourceDirectory.directories is a HashMap<String, ResourceDirectory>; iterating it at line 184 to build the WiX XML means the generated main.wxs fragment's directory/component ordering will vary between builds of the same inputs (Rust's default HashMap uses a randomized hasher). Consider a BTreeMap (or sorting keys before iterating) for deterministic, reproducible build output.

♻️ Suggested fix
-  directories: HashMap<String, ResourceDirectory>,
+  directories: std::collections::BTreeMap<String, ResourceDirectory>,
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/tauri-bundler/src/bundle/windows/msi/mod.rs` around lines 162 - 204,
Make the directory traversal in render_wix deterministic by iterating
ResourceDirectory.directories in sorted key order, either by changing its map
type to BTreeMap or sorting the HashMap keys before rendering. Preserve the
existing recursive render_wix behavior and file ID collection order.
crates/tauri-cli/templates/mobile/android/app/build.gradle.kts (1)

59-62: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Align Java and Kotlin bytecode targets.

This template pins Kotlin to JVM 1.8 but does not set android.compileOptions or a Java toolchain. AGP/toolchain defaults can differ, while Kotlin validates JVM-target compatibility; generated apps may therefore vary or fail to build. Add Java 1.8 sourceCompatibility and targetCompatibility, matching crates/tauri-cli/templates/plugin/android/build.gradle.kts lines 28-30. (kotlinlang.org)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/tauri-cli/templates/mobile/android/app/build.gradle.kts` around lines
59 - 62, Add Android compileOptions to the template’s Gradle configuration
alongside the kotlin compilerOptions block, setting Java sourceCompatibility and
targetCompatibility to Java 1.8. Match the established configuration used by the
plugin Android build template so Java and Kotlin bytecode targets remain
aligned.

Source: MCP tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/check-change-tags.yml:
- Line 20: Add persist-credentials: false to every listed actions/checkout step:
.github/workflows/check-change-tags.yml:20-20,
.github/workflows/check-generated-files.yml:29-29, 48-48, and 68-68, and
.github/workflows/udeps.yml:35-35, 79-79, and 130-130. Do not alter checkout
steps that genuinely require credentials to push changes.

In @.github/workflows/check-generated-files.yml:
- Around line 49-50: Replace the unpinned global Corepack install before
actions/setup-node with a pinned pnpm/action-setup or exact Corepack version.
Ensure the pnpm shim is enabled before setup-node runs with cache: 'pnpm',
preserving the workflow’s existing setup order and behavior.

In @.github/workflows/covector-version-or-publish.yml:
- Line 112: Update the peter-evans/create-pull-request action reference in the
workflow to the specified immutable commit SHA, preserving the existing v8.1.1
version comment.

In @.github/workflows/lint-js.yml:
- Line 21: Disable checkout credential persistence by adding
persist-credentials: false to every actions/checkout step in
.github/workflows/lint-js.yml (lines 21-21 and 33-33),
.github/workflows/publish-cli-js.yml (79-79),
.github/workflows/publish-cli-rs.yml (48-48 and 103-103),
.github/workflows/test-android.yml (34-34), .github/workflows/test-cli-js.yml
(36-36), .github/workflows/test-cli-rs.yml (47-47), and
.github/workflows/test-core.yml (80-80).

In @.github/workflows/test-android.yml:
- Line 75: Update the workflow step that defines the `directory` variable to
consume an `NDK_PATH` environment variable instead of interpolating
`steps.setup-ndk.outputs.ndk-path` directly in the shell. Populate `NDK_PATH`
from that step output via the workflow step’s `env` configuration, while
preserving the existing `${prebuilt}/bin` path construction.

In @.github/workflows/test-cli-rs.yml:
- Line 17: Extend the path filters in .github/workflows/test-cli-rs.yml at lines
17-17 and .github/workflows/test-core.yml at lines 15-15 to include
vendor/wayland-scanner/** (or vendor/**), ensuring changes to the vendored
scanner trigger both CI workflows.

In `@crates/tauri-cli/templates/plugin/android/build.gradle.kts`:
- Around line 34-36: Close both Kotlin DSL blocks opened by the kotlin
configuration: add the missing closing braces after the jvmTarget assignment in
the kotlin block, ensuring the generated build.gradle.kts remains syntactically
valid.

In `@crates/tauri-runtime-wry/src/lib.rs`:
- Around line 3347-3349: Update the WindowMessage::GtkWindow handling and the
RawWindow::gtk_window contract consistently: either preserve the concrete
gtk::ApplicationWindow type by avoiding upcast_ref(), or change the field and
all dependent uses to accept gtk::Window. Ensure the value sent through
GtkWindow matches the declared type without relying on an incompatible
conversion.

In `@crates/tauri/src/app.rs`:
- Line 2386: Update the core-plugin registration flow around
register_core_plugins() and initialize_plugins() so each core plugin is
initialized exactly once. Prefer registering core plugins without triggering
immediate initialization, or make initialize_plugins() skip entries already
initialized, while preserving the existing user-plugin initialization ordering
and behavior.

In `@examples/api/src/views/WebRTC.svelte`:
- Around line 15-25: Update handleSuccess to assign the received stream to the
component’s mediaStream variable before exposing it through window.stream and
using it for playback. Preserve the existing cleanup path so onDestroy can call
getTracks() and stop every track when the view unmounts.

In `@examples/api/src/views/Window.svelte`:
- Around line 181-184: Update the minimize function to pass an arrow callback to
setTimeout that invokes selectedWebview.unminimize(), preserving the
selectedWebview context when the delayed method executes.

In `@ports/muda/.github/workflows/test.yml`:
- Around line 36-40: Update the install system deps step for the Ubuntu matrix
in the workflow: remove the redundant libgtk-3-dev package and replace
libwebkit2gtk-4.1-dev with the GTK4/WebKitGTK 6 development package required by
the local wry dependency and examples/wry.rs, while retaining the existing GTK4,
libxdo, and update commands.

In `@ports/muda/src/lib.rs`:
- Around line 461-480: Fix ContextMenu::as_submenu_unchecked to delegate to
self.as_submenu() rather than self.as_menu(), preserving its declared return
type and "Not a Submenu" panic behavior for non-Submenu contexts.

In `@ports/tao/src/platform_impl/linux/window.rs`:
- Around line 841-846: The unsafe Send and Sync guarantees for GTK4/Linux Window
are unsound because GTK reads and mutations bypass the event-loop channel.
Update Window and its affected methods, including set_focusable, the listed
getters, and raw_window_handle_* methods, to marshal every GTK access through
window_requests_tx with response channels for getters, or otherwise
narrow/remove the unsafe bounds to match actual safety;
ports/tao/tests/send_objects.rs lines 10-14 and 26-30 requires no direct change
and should not be treated as proof of thread safety.

In `@ports/tray-icon/.github/workflows/clippy-fmt.yml`:
- Around line 32-42: Update the Ubuntu dependency installation step in the
workflow to include libgtk-4-dev, ensuring cargo clippy --all-targets
--all-features can build the Linux gtk4 dev dependency while preserving the
existing package installations and clippy configuration.

In `@ports/tray-icon/.github/workflows/test.yml`:
- Around line 38-46: Update the Ubuntu dependency installation step in the
workflow to install libgtk-4-dev instead of libgtk-3-dev, while preserving the
existing libxdo-dev and libayatana-appindicator3-dev packages and the Rust
build/test steps.

In `@ports/tray-icon/src/platform_impl/gtk/icon.rs`:
- Line 22: Update the RGBA length validation around the is_multiple_of call to
remain compatible with the crate’s Rust 1.73 MSRV by replacing it with an
equivalent modulus check, unless the crate’s rust-version is intentionally
raised. Preserve the existing invalid-length handling.

---

Outside diff comments:
In `@crates/tauri-cli/templates/plugin/.github/workflows/clippy.yml`:
- Line 1: Update the plugin workflow templates’ dependency-install steps in
clippy.yml and test.yml to remove webkit2gtk-4.1 and install the GTK4/WebKitGTK6
development packages required by the migrated Tauri stack, including
libwebkitgtk-6.0-dev and libgtk-4-dev.

---

Minor comments:
In @.changes/android-compileroptions-dsl.md:
- Line 9: Polish the release-note wording at
.changes/android-compileroptions-dsl.md:9 to say “if your Gradle version is
earlier”; at .changes/cleanup-js-menu-channel.md:5 to use “Remove the `Channel`
used to send events to the JavaScript side when the menu is dropped”; at
.changes/fix-wix-resource-target-name.md:8 to use “Fix the WiX bundler so it
respects the resource’s target file name”; and at
.changes/resolved-command-reference-debug-assertion.md:8 to replace “can
resulting” with “can result” and clarify the affected build/runtime profiles.

In @.changes/tauri-info-skip-rust-only-js.md:
- Line 6: Update the changelog entry to describe the actual fix: prevent `tauri
info` from reporting Rust-only plugins as having a missing npm package, rather
than stating that nonexistent npm packages are reported as not installed.

In @.github/workflows/covector-version-or-publish.yml:
- Around line 73-75: Disable checkout credential persistence for every listed
actions/checkout step by adding persist-credentials: false:
.github/workflows/covector-version-or-publish.yml lines 73-75 and 22-24,
.github/workflows/check-license-header.yml line 18,
.github/workflows/covector-status.yml lines 13-15, .github/workflows/docker.yml
lines 19-20 and 62-63, and .github/workflows/fmt.yml lines 15, 28, and 41. Do
not add it only where a later step requires the checkout token to push.

In @.github/workflows/udeps.yml:
- Line 53: Update the udeps workflow path-to-matrix routing around the existing
ports/** entry so changes under ports/muda, ports/tao, ports/tray-icon, and
vendor/wayland-scanner are covered by the appropriate udeps matrix entries,
rather than only routing ports/** through wry. Preserve existing coverage while
ensuring each named vendored crate triggers udeps.

In `@crates/tauri-bundler/src/bundle.rs`:
- Around line 306-319: Update bundle_size to sum only file entries when
recursively walking directories, excluding directory entries from the total
while preserving symlink and error handling behavior for included files.

In `@crates/tauri-cli/config.schema.json`:
- Around line 617-621: Update the description for the
limitNavigationsToAppBoundDomains schema property and its source documentation
to reference the canonical src-tauri/Info.ios.plist path instead of
tauri-src/Info.ios.plist, preserving the surrounding WKAppBoundDomains guidance.

In `@crates/tauri/src/menu/plugin.rs`:
- Around line 890-892: Make MenuChannels cleanup ownership-aware in
remove_menu_channel and the corresponding new registration path: prevent a
dropped menu from removing a newer handler registered under the same MenuId.
Track the owning menu/resource or otherwise verify the stored handler belongs to
the dropping wrapper before removal, while preserving routing for the active
menu.

In `@examples/api/src/app.css`:
- Around line 54-55: Add the required empty line before the transform
declaration in the relevant app.css rule, preserving the existing --translate-x
declaration and transform behavior while satisfying Stylelint’s
declaration-empty-line-before rule.

In `@examples/api/src/views/Tray.svelte`:
- Around line 117-131: Update the “Remove tray” handler in the tray conditional
to close and reset the existing menu resource before closing and clearing tray,
reusing the cleanup behavior established by Menu.svelte’s setMenu(). Ensure each
remove/create cycle releases the prior menu instead of allowing create() to
overwrite it.
- Around line 29-50: The tray removal flow must also close and clear the
existing menu handle. Update the remove-tray logic to call menu.close() and set
menu to undefined alongside the existing tray cleanup, preventing create() from
overwriting a live native menu.

In `@examples/api/src/views/WebRTC.svelte`:
- Around line 38-40: Update the onMessage call in WebRTC.svelte to serialize
constraints with JSON.stringify(constraints) instead of implicit object
interpolation, and correct “satisified” to “satisfied” in the message text.

In `@ports/muda/.changes/config.json`:
- Around line 8-11: Update the prepublish dependency list in config.json to
install the GTK4 development package required by the crate instead of
libgtk-3-dev. Keep the existing libxdo-dev dependency and command ordering
unchanged so the publish dry-run has the required headers.

In `@ports/muda/examples/windows-common-controls-v6/src/main.rs`:
- Around line 224-233: Update the Linux/Unix GTK branch in the main window
context-menu flow to match the other examples: do not call the unavailable
ContextMenu::show_context_menu_for_gtk API, and gate or comment out this path
until GTK4 support is wired up, avoiding gtk_window() unless the required
WindowExtUnix integration is present.

In `@ports/muda/README.md`:
- Around line 33-49: Update the README dependency installation commands for the
GTK4/WebKitGTK6 port: replace GTK3 packages in the Debian/Ubuntu and FreeBSD
sections, including libgtk-3-dev and gtk3, with the appropriate GTK4 development
packages such as libgtk-4-dev and gtk4. Keep the existing installation structure
and other dependencies unchanged.

In `@ports/muda/src/builders/icon.rs`:
- Around line 115-117: Update the key accelerator handling in build so the
Result from item.set_key_accelerator is not silently discarded. Propagate the
assignment error through the existing build error path, preserving the
configured accelerator behavior and making platform-specific failures visible to
the caller.

In `@ports/muda/src/items/check.rs`:
- Around line 5-7: Correct the SPDX license identifier in the header of check.rs
from Apache-2.inner to Apache-2.0, leaving the surrounding copyright and MIT
license lines unchanged.

In `@ports/muda/src/items/predefined.rs`:
- Line 6: The ported muda item files contain mechanical “0” to “inner”
substitutions. In ports/muda/src/items/predefined.rs at lines 6 and 226-243,
replace the corrupted SPDX and test fixture/assertion strings with the correct
“Apache-2.0” and “Version: 1.0” values; make the same SPDX correction in
ports/muda/src/items/icon.rs at line 6 and ports/muda/src/items/submenu.rs at
line 6.

In `@ports/muda/src/lib.rs`:
- Around line 390-398: The documentation for the Windows-only
detach_menu_subclass_from_hwnd method incorrectly references NSView. Replace
that sentence with Windows-appropriate wording describing the hwnd as a valid
window handle, while preserving the existing safety requirement and method
behavior.
- Around line 28-42: Update the Linux dependency installation commands in the
crate documentation to match the gtk4 dependency: use gtk4 with pacman and
libgtk-4-dev with apt, while retaining the existing xdotool packages.

In `@ports/muda/src/menu.rs`:
- Around line 5-7: Correct the SPDX identifier in the license header of
ports/muda/src/menu.rs from Apache-2.inner to Apache-2.0, matching the valid
identifier used by the neighboring util.rs header.

In `@ports/muda/src/platform_impl/gtk/mod.rs`:
- Line 275: Replace the u32 GTK window key derived from window.as_ptr() with a
pointer-sized type such as usize, and update all corresponding self.instances
key declarations, lookups, inserts, and removals across init/show/hide/remove
flows to use the same type consistently.

In `@ports/tray-icon/examples/winit.rs`:
- Around line 134-140: Update the GTK initialization thread around
Application::new_tray_icon to use the GTK 4 application/main-loop pattern
instead of the unavailable gtk::main() call. Ensure the tray icon remains alive
and the GTK 4 event loop is started through the appropriate application
mechanism.

In `@ports/tray-icon/README.md`:
- Line 43: Update the FreeBSD dependency installation command in the README to
install gtk4 instead of gtk3, keeping the other packages and platform
instructions unchanged.

In `@ports/tray-icon/src/platform_impl/gtk/icon.rs`:
- Around line 46-58: Update write_to_png to store the BufWriter in a named
mutable binding rather than borrowing an unnamed temporary, then explicitly
flush it after write_image_data completes and propagate any flush error before
returning Ok. Keep the existing PNG encoding behavior unchanged.

In `@ports/tray-icon/src/platform_impl/gtk/mod.rs`:
- Around line 146-163: Update the final assertion in
temp_icon_path_preference_order to compare dir3 with
std::env::temp_dir().join("tray-icon") instead of hardcoding /tmp, preserving
the expected fallback behavior when XDG_RUNTIME_DIR is unset.

In `@ports/tray-icon/src/platform_impl/linux/icon.rs`:
- Line 20: Update the condition near the Linux icon RGBA validation to use the
modulo-based multiple-of check instead of usize::is_multiple_of, preserving the
existing invalid-length branch while remaining compatible with the crate’s Rust
1.73 MSRV.

---

Nitpick comments:
In @.github/workflows/covector-version-or-publish.yml:
- Line 26: Replace the unpinned Corepack installation at
.github/workflows/covector-version-or-publish.yml:26-26 with the repository’s
pinned toolchain, and apply the same deterministic installation at
.github/workflows/covector-version-or-publish.yml:76-76 and
.github/workflows/fmt.yml:29-29. Avoid resolving Corepack through a mutable
global npm package in all three workflow sites.

In @.github/workflows/lint-js.yml:
- Line 22: Make Corepack bootstrapping reproducible by pinning the globally
installed Corepack version or reusing the repository’s declared package-manager
setup. Apply the same change at both sites in .github/workflows/lint-js.yml
(lines 22 and 34), plus .github/workflows/publish-cli-js.yml (line 80),
.github/workflows/test-android.yml (line 46), and
.github/workflows/test-cli-js.yml (line 41).

In `@crates/tauri-bundler/src/bundle/windows/msi/mod.rs`:
- Around line 162-204: Make the directory traversal in render_wix deterministic
by iterating ResourceDirectory.directories in sorted key order, either by
changing its map type to BTreeMap or sorting the HashMap keys before rendering.
Preserve the existing recursive render_wix behavior and file ID collection
order.

In `@crates/tauri-cli/templates/mobile/android/app/build.gradle.kts`:
- Around line 59-62: Add Android compileOptions to the template’s Gradle
configuration alongside the kotlin compilerOptions block, setting Java
sourceCompatibility and targetCompatibility to Java 1.8. Match the established
configuration used by the plugin Android build template so Java and Kotlin
bytecode targets remain aligned.

In `@ports/muda/src/icon.rs`:
- Around line 116-140: Add a cfg-gated unit test in the tests module for
BadIcon::PngEncodingError, constructing it with a representative encoding error
and asserting source() returns Some. Match the existing Linux/BSD+gtk
configuration guards used by the variant and preserve the current tests
unchanged.

In `@ports/tray-icon/.changes/config.json`:
- Around line 9-10: Update the prepublish dependency commands in the changes
configuration to install the GTK4 development package required by the migrated
port, replacing the stale GTK3 package. Verify whether the ksni backend still
requires libayatana-appindicator3-dev; remove it if no longer needed, otherwise
retain it alongside the GTK4 dependency.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

Comment thread .github/workflows/check-change-tags.yml
Comment thread .github/workflows/check-generated-files.yml Outdated
Comment thread .github/workflows/covector-version-or-publish.yml Outdated
Comment thread .github/workflows/lint-js.yml
Comment thread .github/workflows/test-android.yml Outdated
Comment thread ports/muda/src/lib.rs
Comment thread ports/tao/src/platform_impl/linux/window.rs Outdated
Comment thread ports/tray-icon/.github/workflows/clippy-fmt.yml
Comment thread ports/tray-icon/.github/workflows/test.yml
Comment thread ports/tray-icon/src/platform_impl/gtk/icon.rs Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Nitpick comments (2)
.github/workflows/covector-version-or-publish.yml (2)

27-29: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Make Corepack provisioning reproducible and integrity-controlled across CI.

The changed sites all install Corepack through a global npm command outside a lockfile. Replace these with one repository/toolchain-managed or integrity-verified bootstrap, and update sibling jobs that still use unpinned Corepack.

  • .github/workflows/covector-version-or-publish.yml#L27-L29: replace the ad-hoc global install in run-integration-tests.
  • .github/workflows/covector-version-or-publish.yml#L80-L82: apply the same controlled bootstrap in version-or-publish.
  • .github/workflows/lint-js.yml#L24-L26: apply the controlled bootstrap in the ESLint job.
  • .github/workflows/lint-js.yml#L40-L42: apply the controlled bootstrap in the TypeScript job.
  • .github/workflows/publish-cli-js.yml#L82-L84: standardize the build job with its sibling test and publish jobs.
  • .github/workflows/test-android.yml#L48-L50: apply the controlled bootstrap before Android setup.
  • .github/workflows/test-cli-js.yml#L43-L45: apply the controlled bootstrap before CLI tests.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/covector-version-or-publish.yml around lines 27 - 29,
Replace the ad-hoc or unpinned Corepack installation and enablement with one
repository/toolchain-managed or integrity-verified bootstrap, preserving each
job’s existing setup flow. Apply this consistently in
.github/workflows/covector-version-or-publish.yml at lines 27-29 and 80-82,
.github/workflows/lint-js.yml at lines 24-26 and 40-42,
.github/workflows/publish-cli-js.yml at lines 82-84,
.github/workflows/test-android.yml at lines 48-50, and
.github/workflows/test-cli-js.yml at lines 43-45.

Source: Linters/SAST tools


30-32: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Pin the Node version in this job. setup-node here only sets the pnpm cache; add node-version (or a repo-wide Node version file) so integration tests don’t inherit the runner default.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/covector-version-or-publish.yml around lines 30 - 32,
Update the actions/setup-node step in the workflow to explicitly select the
repository’s supported Node.js version, using node-version or the established
repository-wide version file. Keep the existing pnpm cache configuration
unchanged so integration tests do not use the runner default.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/udeps.yml:
- Around line 145-149: Update the crate serialization used when writing
GITHUB_OUTPUT so it expands all elements of the crates Bash array rather than
only the first element. Preserve every crate appended by the matrix
conditionals, including entries from MUDA, TAO, TRAY_ICON, PORT_WRY, and
WAYLAND_SCANNER, while leaving the existing array construction unchanged.

In `@ports/muda/README.md`:
- Line 45: Update the FreeBSD dependency sentence in the README to use correct
grammar for multiple dependencies and clearly introduce the `pkg` installation
instructions.

In `@ports/tao/src/platform_impl/linux/window.rs`:
- Around line 339-359: The run_on_main_thread method must not panic when
WindowRequest::RunOnMainThread is dropped because the GTK window no longer
exists. Replace the response_rx.recv().expect(...) path with explicit
closed-channel handling, returning the API’s appropriate default, Option, or
Result value while preserving the direct current-thread execution path.

---

Nitpick comments:
In @.github/workflows/covector-version-or-publish.yml:
- Around line 27-29: Replace the ad-hoc or unpinned Corepack installation and
enablement with one repository/toolchain-managed or integrity-verified
bootstrap, preserving each job’s existing setup flow. Apply this consistently in
.github/workflows/covector-version-or-publish.yml at lines 27-29 and 80-82,
.github/workflows/lint-js.yml at lines 24-26 and 40-42,
.github/workflows/publish-cli-js.yml at lines 82-84,
.github/workflows/test-android.yml at lines 48-50, and
.github/workflows/test-cli-js.yml at lines 43-45.
- Around line 30-32: Update the actions/setup-node step in the workflow to
explicitly select the repository’s supported Node.js version, using node-version
or the established repository-wide version file. Keep the existing pnpm cache
configuration unchanged so integration tests do not use the runner default.
🪄 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 Plus

Run ID: 6ef1c672-b722-4758-a9bf-9a6424105b9e

📥 Commits

Reviewing files that changed from the base of the PR and between c98510c and 77f490d.

📒 Files selected for processing (63)
  • .changes/android-compileroptions-dsl.md
  • .changes/cleanup-js-menu-channel.md
  • .changes/fix-wix-resource-target-name.md
  • .changes/resolved-command-reference-debug-assertion.md
  • .changes/tauri-info-skip-rust-only-js.md
  • .github/workflows/check-change-tags.yml
  • .github/workflows/check-generated-files.yml
  • .github/workflows/check-license-header.yml
  • .github/workflows/covector-status.yml
  • .github/workflows/covector-version-or-publish.yml
  • .github/workflows/docker.yml
  • .github/workflows/fmt.yml
  • .github/workflows/lint-js.yml
  • .github/workflows/publish-cli-js.yml
  • .github/workflows/publish-cli-rs.yml
  • .github/workflows/test-android.yml
  • .github/workflows/test-cli-js.yml
  • .github/workflows/test-cli-rs.yml
  • .github/workflows/test-core.yml
  • .github/workflows/udeps.yml
  • crates/tauri-bundler/src/bundle.rs
  • crates/tauri-bundler/src/bundle/windows/msi/mod.rs
  • crates/tauri-cli/config.schema.json
  • crates/tauri-cli/templates/mobile/android/app/build.gradle.kts
  • crates/tauri-cli/templates/plugin/.github/workflows/clippy.yml
  • crates/tauri-cli/templates/plugin/.github/workflows/test.yml
  • crates/tauri-schema-generator/schemas/config.schema.json
  • crates/tauri-utils/src/config.rs
  • crates/tauri/src/app.rs
  • crates/tauri/src/menu/mod.rs
  • crates/tauri/src/menu/plugin.rs
  • crates/tauri/src/plugin.rs
  • examples/api/src/app.css
  • examples/api/src/views/Tray.svelte
  • examples/api/src/views/WebRTC.svelte
  • examples/api/src/views/Window.svelte
  • ports/muda/.changes/config.json
  • ports/muda/.github/workflows/test.yml
  • ports/muda/README.md
  • ports/muda/examples/windows-common-controls-v6/src/main.rs
  • ports/muda/examples/wry.rs
  • ports/muda/src/icon.rs
  • ports/muda/src/items/check.rs
  • ports/muda/src/items/icon.rs
  • ports/muda/src/items/predefined.rs
  • ports/muda/src/items/submenu.rs
  • ports/muda/src/lib.rs
  • ports/muda/src/menu.rs
  • ports/muda/src/platform_impl/gtk/mod.rs
  • ports/tao/src/platform/unix.rs
  • ports/tao/src/platform_impl/linux/event_loop.rs
  • ports/tao/src/platform_impl/linux/gtk_window/imp.rs
  • ports/tao/src/platform_impl/linux/gtk_window/mod.rs
  • ports/tao/src/platform_impl/linux/window.rs
  • ports/tray-icon/.changes/config.json
  • ports/tray-icon/.github/workflows/clippy-fmt.yml
  • ports/tray-icon/.github/workflows/test.yml
  • ports/tray-icon/README.md
  • ports/tray-icon/examples/egui.rs
  • ports/tray-icon/examples/winit.rs
  • ports/tray-icon/src/platform_impl/gtk/icon.rs
  • ports/tray-icon/src/platform_impl/gtk/mod.rs
  • ports/tray-icon/src/platform_impl/linux/icon.rs
🚧 Files skipped from review as they are similar to previous changes (43)
  • .changes/android-compileroptions-dsl.md
  • .github/workflows/check-license-header.yml
  • .changes/tauri-info-skip-rust-only-js.md
  • ports/tray-icon/.github/workflows/test.yml
  • ports/tray-icon/README.md
  • .github/workflows/test-cli-rs.yml
  • .changes/resolved-command-reference-debug-assertion.md
  • .github/workflows/check-change-tags.yml
  • .changes/fix-wix-resource-target-name.md
  • ports/tray-icon/.github/workflows/clippy-fmt.yml
  • .github/workflows/publish-cli-rs.yml
  • ports/muda/.github/workflows/test.yml
  • .changes/cleanup-js-menu-channel.md
  • .github/workflows/test-core.yml
  • .github/workflows/covector-status.yml
  • ports/tray-icon/.changes/config.json
  • ports/tray-icon/src/platform_impl/gtk/icon.rs
  • ports/muda/.changes/config.json
  • examples/api/src/app.css
  • crates/tauri-bundler/src/bundle.rs
  • ports/tray-icon/examples/egui.rs
  • crates/tauri-cli/config.schema.json
  • ports/muda/examples/windows-common-controls-v6/src/main.rs
  • ports/tray-icon/src/platform_impl/linux/icon.rs
  • examples/api/src/views/Tray.svelte
  • crates/tauri-utils/src/config.rs
  • crates/tauri-schema-generator/schemas/config.schema.json
  • ports/muda/src/items/submenu.rs
  • crates/tauri-cli/templates/mobile/android/app/build.gradle.kts
  • ports/tray-icon/src/platform_impl/gtk/mod.rs
  • ports/muda/src/items/predefined.rs
  • ports/muda/src/menu.rs
  • ports/muda/src/items/check.rs
  • ports/muda/src/icon.rs
  • crates/tauri/src/app.rs
  • crates/tauri-bundler/src/bundle/windows/msi/mod.rs
  • ports/muda/examples/wry.rs
  • ports/tray-icon/examples/winit.rs
  • ports/muda/src/items/icon.rs
  • examples/api/src/views/WebRTC.svelte
  • ports/muda/src/lib.rs
  • examples/api/src/views/Window.svelte
  • ports/muda/src/platform_impl/gtk/mod.rs

Comment thread .github/workflows/udeps.yml
Comment thread ports/muda/README.md Outdated
Comment thread ports/tao/src/platform_impl/linux/window.rs Outdated
@OlympusLedgerOrg
OlympusLedgerOrg merged commit dd63399 into dev Jul 20, 2026
45 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants