Releases: Lv-0/plumb
Release list
2.1.3
2.1.3
EN
Fixed: windows no longer get flung to a wrong screen's edge when activated right as the app is restoring them.
- Root cause of the Raycast reproduction: while Finder was still animating its window restore, the Accessibility read and the window-server bounds sampled different moments. That transient mismatch made the coordinate-space resolver pick a wrong space, the solver concluded "window not at target", and the tile write flung the window onto the main screen's edge where the interruption guard then locked it — off-screen, never centered or tiled.
- A tile write is now gated on an AX↔CG consistency check: the position solved via the detected space must match the window server's actual bounds (24px quality gate). Mid-transition reads skip the cycle instead of writing; a stable retry judges correctly, and a window already at its target is left alone.
- New windows now follow the mouse's screen: a window created on the wrong display (e.g. opening Finder from Raycast on the external display while Finder remembered a main-screen frame) is tiled on the display you were operating. Windows you placed yourself are unaffected. New setting
newWindowsFollowMouse(default on). - Off-screen windows whose center lies outside every display anchor to the mouse's screen instead of whichever display they barely overlap.
465 tests pass. Diagnosis and evidence: docs/fix-plan-finder-tile-misjudgment.md.
中文
修复:应用恢复窗口的瞬间激活它,窗口不再被抛到错误屏幕的边缘。
- Raycast 复现场景的根因:Finder 还在播放窗口恢复动画时,辅助功能读数与窗口服务器 bounds 采样自不同时刻。这一瞬时偏差让坐标空间推断选错空间,解算得出「窗口不在目标位」,随后的平铺写入把窗口抛到主屏边缘悬空处,又被中断保护锁死——不居中、不平铺。
- 现在平铺写入前必须通过 AX↔CG 一致性校验:按探测空间解算的位置须与窗口服务器真实 bounds 吻合(24px 质量门)。过渡态读数直接跳过本周期;窗口稳定后的重试判定正确,已就位的窗口不会被惊动。
- 新窗口跟随鼠标屏:窗口创建在错误屏幕时(如 Finder 记住了主屏 frame,而你在副屏用 Raycast 打开),平铺会落在你操作的屏幕。自行放置过的窗口不受影响。新增设置
newWindowsFollowMouse(默认开启)。 - 中心落在所有屏幕之外的悬空窗口改为锚定鼠标所在屏,不再按擦边重叠偏置。
465 项测试通过。诊断与证据:docs/fix-plan-finder-tile-misjudgment.md。
2.1.2
2.1.2
EN
Fixed: Finder windows no longer get stuck half-tiled.
- With two overlapping Finder windows, the tiling completion check could borrow an already-tiled sibling window's geometry, wrongly declare the window done and never retry. CG window evidence is now bound to the exact window (identity gate + size-delta gate for occluded windows that macOS drops from the CG list).
- Windows whose size writes are silently rejected by the app (macOS 26, e.g. some Finder states) now degrade to centered instead of being pinned half-tiled to the tile origin; later tile attempts short-circuit instead of replaying the move-fail-recenter loop.
- Off-screen / overhanging windows are pulled back to center, and same-app windows across multiple displays are each laid out with their own screen's context (coordinate-space ties now resolve to the canonical global top-left semantics).
- Same-pattern CGWindowList misuse fixed in the UI snapshot and self-test tooling.
462 tests pass. Plan and evidence: docs/fix-plan-finder-tile-misjudgment.md.
中文
修复:Finder 窗口不再卡在半平铺状态。
- 两个 Finder 窗口重叠时,平铺完成判定可能借用已平铺兄弟窗口的几何,误判完成且永不重试。CG 窗口证据现在绑定到确切窗口(身份门 + 被遮挡窗口剔除列表的尺寸差分门)。
- 被应用静默拒绝尺寸写入的窗口(macOS 26 的部分 Finder 状态)改为降级居中,而不是缺一块钉在平铺原点;后续平铺尝试直接短路,不再重演「滑过去—失败—拉回来」。
- 屏幕外/悬空窗口会被拉回居中;同一应用跨多屏的多窗口各自使用所在屏幕的上下文正确布局(坐标空间平票时回归全局 top-left 规范语义)。
- UI 截图与自测工具中的同款 CGWindowList 误用一并修复。
462 项测试通过。方案与证据:docs/fix-plan-finder-tile-misjudgment.md。
2.1.1
What's new / 本次更新
en
- Fixed windows that were moved across displays being laid out against the wrong screen after re-activation (reported as "NetEase Cloud Music's first positioning is inaccurate"): the tile/center target is now locked to the screen the window is actually on, using window-server (CG) evidence when AX readings are inconsistent.
- Fixed the Accessibility permission banner in Settings never appearing.
- Fixed the app list showing "no matching apps" while the catalog was still loading.
- The UI snapshot harness no longer touches the real settings store.
Validated with 430 unit tests plus a 5-hour live soak: 1000+ activation rounds across 25+ apps on a dual-display setup, 1053 tile locks, zero write failures, no memory growth.
zh
- 修复窗口跨显示器移动后重新激活时按错误屏幕排版的问题(即"网易云音乐第一次定位不准"):当 AX 读数与窗口服务器证据不一致时,改用 CG 证据锁定窗口实际所在屏幕,再在该屏上重新解析坐标空间。
- 修复设置界面的辅助功能权限引导横幅从不显示的问题。
- 修复应用目录尚在加载时列表误报"没有匹配的应用"的问题。
- UI 快照工具不再接触真实设置存储。
经过 430 项单元测试与 5 小时真机长跑验证:双显示器环境 25+ 应用、1000+ 轮激活循环、1053 次平铺锁定,零写入失败、无内存增长。
2.1.0
2.0.69
2.0.68
What's Changed
- Fix DMG mount tracking when two DMG volumes share the same name: mounts are now reference-counted per volume and unmount removes by mount-point identity, so installer-window handling stays reliable.
- Remove the obsolete "hide system apps in picker" setting and clean up its leftover UserDefaults mirror key.
- Debounce settings persistence while dragging sliders — UI stays live while disk writes are coalesced; pending changes flush immediately when the Settings window closes.
- Scan nested subfolders at any depth when listing installed apps for the tiling picker.
- Release safety test now matches the fail-closed curl invocations (
--http1.1 --fail-with-body) in the publish script.
Full Changelog: v2.0.67...v2.0.68
2.0.67
Plumb v2.0.67
English
Maintenance rebuild after validating single-instance window-layout stability.
No user-facing behavior changes are included in this release.
This release provides regenerated signed release artifacts following validation of the existing window-layout behavior.
Requires macOS 26 or later.
中文
维护性重构建:已完成单实例窗口布局稳定性验证。
本版本不包含面向用户的功能或行为变更。
本版本重新生成并签名发布构建产物,用于保持发布流程和更新链路的一致性。
需要 macOS 26 或更高版本。