Release Notes
Improved
-
Hook template variables consolidated: Bare variables (
branch,worktree_path,commit) now consistently point to the Active worktree — the destination for switch/create, the source for merge/remove. New directional variables ({{ base }},{{ base_worktree_path }},{{ target_worktree_path }},{{ cwd }}) give hooks explicit access to both sides of two-worktree operations. (Breaking:{{ worktree_path }}changed in pre-switch for existing worktrees and in post-merge — use{{ cwd }}or{{ base_worktree_path }}for the previous behavior.) Docs (#1655, #1660, #1663) -
Bare repo worktree-path prompt: When a bare repo lives at a hidden path like
.gitor.bare,wt switchnow detects that worktrees would get awkward names (e.g.,project/.git.feature) and offers to configure aworktree-pathoverride. Non-interactive environments show the config to add manually. (#1656, thanks @seakayone for reporting #1279) -
Shell completion for step aliases: Tab-completing
wt step <TAB>now shows configured aliases alongside built-in step commands, with--dry-run,--yes, and--varflags. (#1641) -
wt listreclaims space from redundant columns: When the Path column carries no useful information (all worktree paths are predictable from branch names), its space is reclaimed for Summary and Message. (#1634) -
Syntax highlighting for alias dry-run:
wt step <alias> --dry-runnow uses bash syntax highlighting, matching hook dry-run output. (#1635)
Fixed
-
wt listhang from fsmonitor daemon: On macOS with builtin fsmonitor,wt listcould hang at the "(loading...)" stage becausegit fsmonitor--daemon startinherited pipe file descriptors and held them open indefinitely. (#1648) -
Post-remove hooks ran at wrong directory: Post-remove hooks executed at the user's cwd (which could be the worktree being removed) instead of the primary worktree. (#1645)
-
Picker showed loading indicator for unavailable data: The interactive picker used
⋯(loading) for fields that would never arrive; now uses·(unavailable). (#1651) -
wt hook --dry-runmissing directional variables: Hook dry-run and--show --expandedoutput was missingbase,target, andtarget_worktree_pathvariables for switch, create, and remove hooks. (#1669)
Documentation
-
Bare repository layout guide and
worktree-pathexample in config docs. (#1664) -
Migration guide for template variable changes in hook docs. (#1666)
Internal
-
Renamed internal
selectmodule topicker. (#1650) -
Consolidated merge/remove removal validation. (#1625)
Install worktrunk 0.31.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.31.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.31.0/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.31.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