Skip to content

v3.0.0

Choose a tag to compare

@github-actions github-actions released this 10 Jun 10:11
· 88 commits to main since this release

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+0 grow, 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; existsSync alone 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_ID to 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 gave input.readScreen the assertWorkspaceOwnsPty check 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/asar header 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:

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