Release Notes
Improved
-
Package installs complete branch and worktree names: A plain
brew install worktrunk(or other package install) now tab-completes branch and worktree names, not just subcommands and flags.wt config shell completions <shell>emits a dynamic registration that calls the binary at completion time (the maintainedclap_complete::envpath), matching whatgh,rustup, andkubectlship. (#3105, thanks @bendrucker) -
wt step relocatemoves dirty linked worktrees: Relocating a linked worktree with uncommitted or untracked changes no longer skips it.git worktree movecarries those files along, so the dirty-skip was a worktrunk policy rather than a git limitation. The main worktree still skips when dirty (without--commit), since its relocation falls back togit checkout, which refuses to switch over a dirty tree. (#3104, thanks @lunaynx for reporting) -
--dry-runpreviews print to stdout:wt hook <type>,wt step relocate,wt step prune,wt step copy-ignored, andwt config shell install/uninstallnow send their--dry-runpreview to stdout (the command's answer) while narration stays on stderr. This matcheswt list,git clean -n, andterraform plan, and keeps previews pageable and pipeable. (Breaking: scripts reading these previews from stderr should now read stdout) (#3085) -
Picker gutter distinguishes local and remote branches: With
--branchesand--remotes, thewt switchpicker marks each row's kind in the gutter:/for a local branch without a worktree and|for a remote branch, alongside the existing@/^/+worktree glyphs. (#3115) -
wt list --format=jsongains structuredrepometadata: JSON output addsrepo(the local checkout's primary remote) andci.repo(the repositoryci.urltargets, which differs for fork PRs) objects carryinghost/owner/name/provider; the existingrepo_urlandci.repo_urlstrings remain. The provider honors the configured[forge].platformon hosts that can't be auto-detected. (#3021, thanks @jeremy0dell) -
wt step eval --format=json:wt step evalgains a structured{name, template, result}JSON lane on stdout, the machine-readable analog of its-vview. Text mode is unchanged. (#3106) -
--format=claude-coderejected where it never applied:wt listandwt config state getaccepted--format=claude-codesilently and treated it astable; the value only ever meant anything onwt list statusline. Both now fail fast withinvalid value 'claude-code'. (Breaking:wt list --format=claude-codeandwt config state get --format=claude-codenow error) (#3116)
Fixed
-
cargo install worktrunkbuilds from crates.io: Installing from crates.io failed to compile withenvironment variable VERGEN_GIT_DESCRIBE not defined at compile time, because the package archive has no.gitfor the build script to read. The version lookup now falls back to the cargo package version when git-describe is unavailable. (#3124, fixes #3123, thanks @kerrickstaley for reporting) -
Tab-completion works in repos with no commits:
wt switch <TAB>andwt remove <TAB>returned nothing on a freshgit initrepo, because the unborn default branch has no entry underrefs/heads/. Completion now also draws on worktree branches, so the unbornmain(and anywt switch --createbranch on an empty repo) completes. (#3097, closes #3094) -
wt config state get ci-status --format=jsonhonors[forge].platform: On a self-hosted host the parser can't recognize (Gitea, Azure DevOps, GitHub Enterprise on a generic domain), this path reportedprovider: "unknown"whilewt list --format=jsonreported the configured provider. All structured-output paths now route the[forge].platformoverride through one accessor, so they stay consistent. (#3120)
Documentation
-
wt list --helpexample tables fit the terminal: The capturedwt listexample tables in--helpchop to terminal width with a dimmed ellipsis (matching realwt list) instead of word-wrapping and shearing their columns; hand-authored command examples still wrap. (#3125) -
/wt-switch-createcross-repo handling reworked: The Claude Code plugin command's skill reworks how it creates and enters a worktree in another repo, built around what the harness actually does (EnterWorktreere-roots within the current repo; acdreaches another repo when it's inadditionalDirectories). The procedure dropped from five steps to three. (#3118) -
Help-text and docs refinements:
--formathelp renders its values inline ([possible values: table, json]) instead of an expanded block;wt switchandwt step pushhelp got smaller clarifications; and web-doc terminal blocks no longer wrap command-only lines. (#3096, #3108, #3110, #3112, #3126)
Install worktrunk 0.60.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.60.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.60.0/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.60.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