Release Notes
Improved
-
Per-branch custom variables: New
wt config state vars set/get/list/clearcommands store custom key-value pairs per branch, accessible as{{ vars.key }}in hook templates andwt step eval. Variables persist in git config and appear inwt list --format=json. (#1006) -
Lazy template expansion in pipelines: Pipeline steps now expand
{{ vars.* }}at execution time rather than at pipeline construction, so variables set by step N are available in step N+1. (#1840) -
wt config plugins claudecommands: Newinstall,uninstall, andinstall-statuslinesubcommands manage Claude Code integration.installregisters the worktrunk plugin via the Claude marketplace,install-statuslineconfigures the Claude Code status line, andwt config showsuggests these commands instead of raw CLI instructions. (#1830, #1834) -
[forge]config section: New explicit[forge]section withplatformandhostnamefields for SSH host aliases and non-standard remotes.ci.platformis deprecated with automatic migration. (#1826) -
Forge detection with
url.insteadOf: Forge platform detection now falls back to the effective URL (after giturl.insteadOfrewrites), fixing CI status, PR/MR detection, and push-remote features for users with SSH aliases or corporate mirrors. (#1771, thanks @amodelaweb; thanks @roytouw for reporting #1790) -
--branchflag forwt step commit: Commit to a specific branch without switching to it — useful in automation and scripts. (#1750) -
Last fetch time in branch-not-found hint: When
wt switchcan't find a branch, the hint now shows when the remote was last fetched (e.g., "last fetched 3h ago") to help identify stale local refs. (#1877) -
Config field renames:
merge.no-ff→merge.ffandswitch.no-cd→switch.cd, using positive-sense naming. Old names continue to work with deprecation warnings and automatic migration viawt config update. (#1856, #1860) -
Syntax highlighting for template blocks: Documentation site now renders
{{ }}template expressions with syntax highlighting. (#1792) -
Hide Claude Code section when CLI unavailable:
wt config showno longer displays the Claude Code integration section if theclaudeCLI is not found. (#1827)
Fixed
-
Copy-ignored too many open files:
wt step copy-ignoredcould exhaust file descriptors on large trees. Now reuses a single thread pool across all copy operations. Fixes #1865. (#1864, thanks @fspeirs) -
Squash-merged branch detection with merge-tree conflicts:
wt step pruneandwt listfailed to detect squash-merged branches when the default branch modified the same files. Now uses patch-id matching as fallback. Fixes #1818. (#1820, thanks @tthyer for reporting) -
Background removal blocked for 1 second:
wt removeblocked unnecessarily due to incorrect shell operator precedence in the background process spawn. (#1858) -
Fish shell getcwd error in Zellij: Removing a worktree while using fish in Zellij produced "error retrieving current directory" messages. (#1787)
-
Alias detection false positive on path substrings:
wt config showincorrectly flagged unrelated aliases when the alias target path contained "wt" as a substring. Fixes #1772. (#1773, thanks @nicolasff for reporting) -
Branch names with dots in vars: Vars parsing incorrectly split branch names containing dots (e.g.,
release.1.0) as nested config keys. (#1837) -
Lazy pipeline vars expansion in background hooks: Background hook execution failed with lazy vars expansion due to raw string quoting and overly strict template validation. (#1855)
-
GitLab MR remote tracking:
wt switch mr:Ncould reuse branches tracking the correct merge-request ref but on the wrong remote. (#1817) -
Fork CI and integration target detection: Fixed CI check-runs querying the wrong repo for forks, branch tracking checking only merge config, and diverged local branches missing remote merges. (#1812)
-
Placeholder directory on non-current worktree removal:
wt removecreated unnecessary empty placeholder directories and slept for 1 second when removing worktrees other than the current one. (#1868, #1874) -
Merge-tree errors silently swallowed:
git merge-treefailures (invalid refs, corrupt repos) were treated as conflicts instead of propagating, triggering expensive patch-id fallback unnecessarily. (#1896) -
Deprecated key in wrong config file: A deprecated section key (e.g.,
[commit-generation]) in the wrong config file (e.g., project config) was silently filtered. Now warns "Key X belongs in Y config as Z". (#1899) -
Config migration mutex panic: Replaced unsafe
unwrap()with error propagation in config deprecation migration. (#1887) -
Hook show outside git repo:
wt hook shownow provides a clear error message when run outside a git repository. (#1809, thanks @noirbizarre)
Documentation
-
Help text rewritten for
switch,merge,hook, andremovecommands. (#1782, #1783, #1785, #1765, #1764) -
Hook documentation restructured: types reordered by paired events, pipeline ordering rewritten with progressive examples, approval prompt shown in color. (#1763, #1756, #1766)
-
Hooks documented in user config reference. (#1845)
-
Deprecated
post-createremoved from documentation. (#1776) -
Arch Linux official package added to installation instructions. (#1872, thanks @ctrl-q)
-
README template syntax fixed. Fixes #1851. (#1852, thanks @IlyaSemenov for reporting)
Internal
-
Config deprecation consolidated from two layers to one pre-deserialization TOML migration. (#1879, #1880, #1876)
-
Benchmark infrastructure extracted into
wt-perfcrate. (#1878) -
wt removeapproval path reuses already-loaded repo/config (~50ms savings). (#1875)
Deprecated
| Old | New | Action |
|---|---|---|
[ci] section
| [forge] section
| wt config update migrates; wt config show warns
|
no-ff in [merge]
| ff (reversed)
| wt config update migrates; wt config show warns
|
no-cd in [switch]
| cd (reversed)
| wt config update migrates; wt config show warns
|
All deprecated fields continue to work. Run wt config update to migrate, or wt config show for details.
Install worktrunk 0.34.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.34.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.34.0/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.34.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