Release Notes
Improved
-
Picker frees digit keys for filtering; preview tabs move to
Alt: In thewt switchpicker, plain digits now go to the filter, so a branch name with a number in it can be typed directly. Preview tabs jump withAlt-1–Alt-5or cycle withTab/Shift-Tab. (Breaking:1–5no longer switch preview tabs) (#3079) -
Squash templates use
commit_detailsinstead ofcommits: The squash commit-message template's{{ commits }}variable (commit subjects) is deprecated in favor of{{ commit_details }}, which renders as the bare subject when printed directly and also exposes.subjectand.body.wt config updatemigratescommitstocommit_detailsas a plain rename. (#2985) -
wt step eval -vlists template variables:wt step eval -vnow prints the available template variables on stderr in the gutter style, above the template-expansion view. That expansion (also shown bywt switch -v, hooks, aliases, andwt -v list) renders the template and its result as separate labeledsource/resultblocks rather than a shared gutter. The result still goes to stdout, so$(wt step eval …)is unchanged. Sinceevalmutates nothing and is experimental, its--dry-runflag (which dumped the raw variable context) is removed rather than deprecated. (#3078, #3099)
Fixed
-
Picker no longer freezes on the first keystroke: With many worktrees, typing the first character in the
wt switchpicker locked the UI for several seconds. The fuzzy matcher shares rayon's global thread pool with worktrunk's git collection, which floods it with blocking subprocess calls, so the matcher queued behind them. Collection and preview work now run on a dedicated pool, keeping the matcher responsive. (#3087, thanks @bendrucker; fixes #2926, thanks @mahume for reporting) -
Tab-completion covers all hook types:
wt hook <type> <Tab>completed configured command names for only seven of the ten hook types;pre-switch,post-switch, andpost-removereturned nothing. Completion now derives the type from the canonical hook list, so every type completes its command names. (#3070) -
Ctrl-C on a concurrent alias reports the right exit code: Interrupting
wt step <concurrent-alias>could report exit 143 (SIGTERM) instead of 130 (SIGINT), because a per-child SIGINT → SIGTERM → SIGKILL escalation could land a SIGTERM on a child during the grace window; the escalation also serialized across process groups, so repeated Ctrl-C could wait. wt now forwards the user's signal once per process group, so a cooperative child dies from the signal actually sent (130 on Ctrl-C); a second signal kills any survivor immediately. (#3075)
Documentation
- Per-worktree env vars: A Tips & Patterns section shows how to give each worktree its own environment variables with direnv or mise. (#3074)
Internal
- The commit-generation command is not rewritten to disk when its value is unchanged. (#3084)
Install worktrunk 0.59.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.59.0/worktrunk-installer.sh | sh && wt config shell installInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/max-sixty/worktrunk/releases/download/v0.59.0/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.59.0
| File | Platform | Checksum |
|---|---|---|
| worktrunk-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| worktrunk-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| worktrunk-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| worktrunk-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| worktrunk-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
Install via Cargo
cargo install worktrunk && wt config shell installInstall via Winget (Windows)
winget install max-sixty.worktrunk && git-wt config shell installInstall via AUR (Arch Linux)
paru worktrunk-bin && wt config shell install