v3.0.0
Milestone release. Headline: a reference plugin and workflow-friendly APIs that make wmux a foundation external tools build on, PowerShell 7 chosen as the default shell wherever it's installed (including Store builds), a batch of terminal UX (font zoom, configurable start directory, split CWD inheritance), and the close of the cross-workspace terminal read/write isolation gap. No breaking changes — this is a milestone version bump, not a wire-format or config break; existing sessions, profiles, and configs carry over untouched. All dogfood-verified on a live build before tagging.
Added
- Terminal starting directory + split CWD inheritance. New panes can inherit the active pane's working directory on split, with a global/per-profile setting for the default startup directory and a toggle for inheritance — a priority chain that leaves the main process and daemon untouched. (#177, resolves #173 / #174 / #175)
- Keyboard zoom for terminal font size.
Ctrl+=/Ctrl+-/Ctrl+0grow, shrink, and reset the terminal font, resolved from the physical key code so it's IME-safe, clamped to 12–24px. (#172, resolves #171) - Rename a workspace from the right-click menu. A Rename entry on the workspace context menu, reusing the existing inline-rename flow (same as double-click). (#184)
- Substrate reference plugin and restructured docs. A reference MCP plugin, Diátaxis-organized documentation, a drift fix, API codegen, and a performance characterization pass — closing the external-tooling API request and giving integrators a worked example to build against. (#165, closes #15)
Changed
- PowerShell 7 is preferred over Windows PowerShell 5.1 as the default shell wherever it's installed — including Microsoft Store builds exposed only through the WindowsApps App Execution Alias. The alias is both detected (via reparse-point resolution;
existsSyncalone misses the 85-byte symlink stub) and actually launchable (the stub can't be spawned directly by node-pty, so wmux resolves it to the real package target). Shell resolution is now single-sourced between the main process and the daemon, so the two can't drift. (#178, #180, #181, #186; resolves #176, #179, #183, #185)
Security
- Cross-workspace terminal read/write via spoofable workspace identity is closed. A token-holding external MCP client could spoof
WMUX_WORKSPACE_IDto a victim workspace and, naming that workspace's ptyId, read or write its terminal — the main-side ownership assert only verified that the ptyId belonged to the (attacker-supplied) workspaceId, not that the caller was entitled to that workspace. Part 1 gaveinput.readScreentheassertWorkspaceOwnsPtycheck its sibling handlers already had (it was the one terminal-IO handler that skipped it). Part 2 removed the spoofable identity the assert trusts: terminal tools (terminal_read/terminal_read_events/terminal_send/terminal_send_key) now resolve their workspace from verified PID-mapped identity only, never the env hint — a genuine external caller gets a dedicated claimed workspace, an explicit foreign ptyId fails closed, and a boot-reconcile grace keeps a first-party caller from being misclassified during a daemon respawn. (#164 + #188, resolves #163)
Fixed
- Prefix-mode Toggle Zoom now actually zooms. The tmux-style prefix Toggle Zoom toggled internal state but no rendering code read it, so the keystroke was consumed with no visible change. The zoomed pane is now rendered full-bleed (siblings hidden) and exactly restored on toggle-off, with split/close coherence and a ZOOM badge. (#187, resolves #182)
- Garbled glyphs clear without a manual resize. Panes could render corrupted glyphs until a border drag forced a repaint; wmux now repaints defensively. (#168, resolves #166)
- IME input no longer wipes the typed line. xterm's hidden IME textarea is cleared when idle, so a voice/IME input method (e.g. AutoGLM) no longer discards the already-typed line. (#170, resolves #167)
- Sidebar hide/expand controls mirror correctly when docked on the right. (#160)
- The
@electron/asarheader cache is dropped after the postPackage repack, so the packaged asar can't be stale. (#161) - Restored the bench B3 drop-tracking variables lost in an earlier refactor and refreshed the perf numbers. (#169)
Contributors
Thanks to the external contributors and reporters in this release:
- @matdac6 — workspace Rename context-menu entry (#184), first contribution.
- @zer0ken — PowerShell 7 default-shell fixes (#178, #181) and the issues behind the shell-resolution and CWD work (#176, #173 / #174 / #175, #183, #185).
- @Dzirik — Toggle Zoom bug report (#182).
- @arcqiufeng — terminal zoom shortcut report (#171).
- @zhenzoo — garbled-glyph (#166) and IME line-wipe (#167) reports.
- @alphabeen — external-tooling API request (#15).
What's Changed
- fix(sidebar): mirror the hide/expand controls when docked on the right by @openwong2kim in #160
- fix(build): drop the @electron/asar header cache after the postPackage repack by @openwong2kim in #161
- docs: PROTOCOL §4 enforcement status + issue #113 identity design (defer) by @openwong2kim in #162
- fix(security): assert workspace ownership on input.readScreen (#163 Part 1) by @openwong2kim in #164
- fix(terminal): defensive repaints for garbled glyph corruption (#166) by @openwong2kim in #168
- Close #15: substrate reference plugin, Diátaxis docs, perf characterization by @openwong2kim in #165
- Fix bench B3 crash from #165 and refresh perf numbers by @openwong2kim in #169
- fix(terminal): clear xterm's hidden IME textarea when idle by @openwong2kim in #170
- feat(terminal): keyboard zoom for terminal font size (Ctrl+= / Ctrl+- / Ctrl+0) by @openwong2kim in #172
- feat(terminal): configurable starting directory + split CWD inheritance (#173, #174, #175) by @openwong2kim in #177
- fix(pty): prefer PowerShell 7 over Windows PowerShell 5.1 as default shell by @zer0ken in #178
- fix(pty): detect AND launch Store-build PowerShell 7 App Execution Alias (#179) by @openwong2kim in #180
- fix(daemon): prefer PowerShell 7 over Windows PowerShell 5.1 in default-shell fallback by @zer0ken in #181
- refactor(shell): single-source shell resolution shared by main + daemon (#183, #185) by @openwong2kim in #186
- feat(workspace): add Rename to right-click context menu by @matdac6 in #184
- fix(pane): render prefix-mode Toggle Zoom (#182) by @openwong2kim in #187
- fix(mcp): route terminal IO through verified identity, not the env hint (#163 Part 2) by @openwong2kim in #188
New Contributors
Full Changelog: v2.18.0...v3.0.0