Repository navigation
Fix portable plugin preferences backup coverage - #505
Merged
ggbond268 merged 8 commits intoOct 27, 2026
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem and result
Exporting preferences from Dev and importing them into another MacTools installation loses settings such as modifier dragging and centered window guides. This restores portable plugin configuration and shows what was included, excluded, unavailable, or failed.
Closes #503.
Changes
Older archives cannot recover omitted settings. Install updated builds and export a fresh backup to transfer them.
Verification
Validated head:
9b9fe63a.make -j1 ci: 3,067 XCTest passed, 234 script tests passed, and the frozen PluginKit v7 binary compatibility client passed. Six on-demand desktop checks were skipped: four existing Window Switcher focus/search checks, backup acceptance, and the mounted Input Remapping editor check.make validate-changelogandgit diff --checkpassed.scripts/testing/preferences-backup/run.shacceptance on the unchanged Window Layouts, export UI, and Right Click paths: actual modifier movement and centered-guide snapping on an owned test window, relaunch persistence, denied-permission preservation, native keyboard/accessibility checks, and same-window Right Click filter refresh fromtxttomdfor the same application UUID.Desktop evidence used synthetic preferences and temporary app identities. The latest audio checks use injected routers/monitors; real audio hardware, native notification authorization dialogs/banner delivery, and live services were not exercised. The updated import warning was checked in the localized resources and compiled, without new native screenshots.
Review status
Ready for review following the maintainer's explicit decision to defer the low-frequency Window Layouts editor finding. The completed independent review covers the full cumulative 263-file PR at
9b9fe63a. Three fresh independent reviewers used an immutable snapshot without prior review reports or implementation rationale. All initial reports were captured before targeted reconciliation. The four earlier findings have fixes and passing focused/native validation.Deferred finding (P2): focused Window Layouts name submission overwrites restored geometry. The maintainer accepted deferring this narrow overlap case and proceeding to review; it remains unfixed. At
WindowLayoutsStore.swift:147–149, a same-UUID cloud import publishes changed command definitions. The mounted editor'ssynchronizeDraftIfNeeded(WindowCustomCommandSettingsView.swift:536–541) skips changes while its name field is focused; Return/blur then commits the entire stale command at lines 524–532. This overwrites successfully imported dimensions/anchor and can restore the previous local Run Link permission flag. Preserve current saved fields when accepting a name edit, or reconcile restoration even while the field is focused. The case requires focus to remain through restoration; changed identities or navigation unmounts avoid it.A disposable native diagnostic reproduced the actual mounted state and real host cloud-import path: width 80% → imported 30% with external invocation disabled → name submission → width 80% and the old external-invocation flag restored. The diagnostic deliberately asserts this incorrect outcome: 1 passed, 0 failed or skipped. Stores, hotkeys and executor were synthetic; no real windows moved, live cloud, Keychain, or user assets were used. Observation hooks/tests were archived outside the repository and removed afterward. Source, index, immutable snapshot and unrelated local plan remain unchanged. No fixes were made during the read-only review.
UI evidence
Entry points: Settings → General → Preferences Backup; plugin settings for AI Assistant/Translator prompt inclusion, Launch Control note inclusion, and unavailable Right Click applications.
The completed export UI was captured and inspected locally in English, Simplified Chinese, German, and Arabic. The unavailable-application explanation and live editor refresh were also verified. Native before/after Input Remapping editor captures were also inspected locally. The screenshots below use synthetic settings. They cover light and dark appearances. The sequence below combines four actual native screenshots at two seconds per frame to show scrolling and expansion; it is a captured interaction sequence, not a real-time video. Export UI/Right Click captures predate the latest fixes on unchanged production paths; Input Remapping captures compare the stale editor with the repaired behavior.
Export coverage: English, Chinese, German, Arabic
Unavailable app explanation and Input Remapping before/after
Before: after a cloud-restored mapping and local toggle, the stale editor wrote Back over Forward.

After: Forward remains after the toggle.

Dark appearance and native interaction sequence
Checklist