Release Notes
Improved
-
Rate-limit pace segment in the Claude Code statusline:
wt list statusline --format=claude-codenow surfaces a yellow1.3×pace(10am–3pm)segment when Claude Code's reported five-hour or seven-day rate-limit window is on track to be hit before its reset. The segment uses a Bayesian forecast onP(final ≥ 100%)so early-window bursts (e.g., 5% used at 3% elapsed) don't trigger spurious warnings — only the worse-projected of the two windows is shown, and the segment is hidden entirely when both are safe. The clock format inside the parentheses honorsLC_ALL/LC_TIME/LANG:en_US/en_PH/en_CAget 12-hour (10am–3pm), everything else (including unset andC/POSIX) gets 24-hour (10:00–15:00). (#2899, #2911) -
wt step prunestreams removals and never prompts mid-scan: Prune now bundles integration, removability, and age checks into a single parallel pass and starts removing candidates as soon as they qualify, instead of batching the scan and acting at the end. Dirty / locked / primary worktrees drop out before the age check, so a young + dirty + integrated worktree no longer surfaces asSkipped (younger than 1d)— the(younger than X)message now fires only when the worktree would actually have been pruned. With--yes, every project command is auto-approved as before; without--yes, a candidate whose hooks include an unapproved project command is SKIPPED with(approval required)rather than aborting the scan with an inline prompt the streaming structure couldn't accommodate. The end-of-run hint enumerates the unapproved hook templates from the invoking worktree's config and emits one copy-pasteablewt -C <path> removeline per skipped candidate, annotating candidates whose own.config/wt.tomldiffers from the invoking worktree's. (#2908, #2910) -
wt step prunedefault--min-ageraised from 1h to 1d: A worktree just created from the default branch looks "merged" because its branch still points at the same commit; a one-day floor keeps an unattended prune from sweeping it up before its owner starts work. Explicit--min-age=0sor any other value is unchanged. (#2886) -
Legacy shell-wrapper deprecation warning: Users who upgrade
wtwithout restarting their shell still run the previous release's wrapper, which sets onlyWORKTRUNK_DIRECTIVE_FILEinstead of the new splitWORKTRUNK_DIRECTIVE_CD_FILE/WORKTRUNK_DIRECTIVE_EXEC_FILEpair. That fallback used to be silent;wtnow emits a one-shot per-process warning hinting atwt config shell install. bash, zsh, fish, and PowerShell pick up the new wrapper on the next shell restart; nushell is the one shell where users must rerunwt config shell install nubecause its wrapper is a static file. (#2880) -
-vvno longer floods stderr; raw subprocess sink renamed tosubprocess.log: A-vvinvocation used to spray ~15K lines of stderr per command, forcing a redirect to a file even thoughtrace.logalready mirrored most of it. The debug-levellog::*pipeline now writes to.git/wt/logs/trace.logat-vv; Info-level records (hook output, template expansions, theTracing to …pointer) stay on stderr at every verbosity level. The companion raw-subprocess-bytes file is renamed fromoutput.logtosubprocess.log— the prior name read as "stuffwtprinted" but actually held uncapped multi-MB subprocess bodies (git log -p, patch-id pipelines).RUST_LOGis now honored at every verbosity level:wt -vandwt -vvpreviously hardcoded Info / Debug and silently dropped anyRUST_LOGdirective (RUST_LOG=trace wt -vvwas capped at Debug,RUST_LOG=worktrunk=trace wt -vwas ignored); all three levels now flow through one builder shape withRUST_LOGlayered on top of the flag baseline. (#2892, #2901, #2913)
Fixed
- Data-safety across the worktree merge / remove / prune lifecycle: Five TOCTOU and scoping fixes.
wt mergeandwt removerevalidate cleanliness and branch integration afterpre-removehooks run, so a hook (or concurrent process) that dirties the worktree or advances the branch can no longer trash the directory or triggergit branch -Dagainst the stale pre-hook decision. The background-removal path does the same revalidation and fails closed for submodule worktrees on the fallback path instead of forcing.wt step pruneruns its rename-failure fallbackgit branch -dsynchronously under the write guard for non-current worktrees (no more race against live integration readers on.git/config), scopes hook approval to the worktrees it will actually remove (an unrelated unapproved hook can no longer abort a non-interactive prune), and prunes the stale metadata of detached worktrees whose directory was deleted outside Worktrunk. (#2870)
Documentation
-
-v/-vvhelp and FAQ: The-vhelp text is split out from its 150-character parenthetical, anddocs/content/faq.mdgains a "What does-v/-vvdo?" section with a three-level table. (#2913) -
Hook docs and
pre-startdocstring: Thepre_createfield docstring inHooksConfig(user-visible via generated JSON schema) read "Commands to execute before worktree creation";pre-startactually runs after worktree creation, blocking. Restored the correct wording. Thedocs/content/extending.mdoverview is reworked to read more cleanly: parallel three-paragraph intro for hooks / aliases / custom subcommands, fewer em-dashes, and the Reference section's table no longer duplicates content covered in prose. (#2879, #2912)
Internal
-
Migrated logging from
env_loggertotracing-subscriber: A layered subscriber routes records structurally by target and verbosity. Existinglog::*callers are bridged intotracingviatracing_log::LogTracer.[wt-trace]records emit as typed structured fields with a single formatter rendering the wire shape, so the grammar lives in one place instead of being duplicated across every emit site. -
UncommittedChangeserror renders dirty files in the canonical gutter, matchingConflictingChangesand the project'sformat_with_gutter()convention. (#2887)
Install worktrunk 0.54.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.54.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.54.0/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.54.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