Release Notes
Improved
-
wt listand thewt switchpicker settle faster in repos with many worktrees: rows fill from the top down, and on macOS withcore.fsmonitor=trueno daemon start is forked for a worktree whose daemon is already running. On a 50-worktree repo the picker's per-row work starts at 47ms, down from 120ms. (#4286, #4290, #4288, #4284) -
CI status skips branches that were never pushed:
wt list --full, the picker, and the statusline no longer query the forge for a local branch no remote has, so a repo with 239 local branches made 25ghcalls instead of 249. A PR opened from a branch another clone pushed shows once you fetch. GitLab looks up its project ID once per command, not per row. (#4289, #4216) -
Leaner Codex commit generation: the recommended Codex command moves to
gpt-6-lunawith reasoning off and unneeded Codex features disabled, so each message sends fewer input tokens. Accepting the first-run Codex prompt now also creates~/.codex/worktrunk-commit-instructions.txt, which the command reads. Docs (#4261) -
Releases ship a signed packslip: each GitHub release includes
packslip.sigstore.json, a manifest of the archives' digests, platforms, completions, and agent skills, signed by the release workflow so installers such as mise can verify downloads before unpacking. (#4301, thanks @jdx)
Fixed
-
A squash whose commit fails keeps the branch: when a git commit hook or signing stopped the commit in
wt mergeorwt step squash, the branch was left at the merge base with its changes staged, recoverable from the reflog. Now the branch is untouched. (Breaking: git commit hooks run on a detachedHEADduring a squash.) (#4206, thanks @Bennyjitsu for finding it in #4193) -
wt step diffwhen localmainlagsorigin/main: for a branch built on the newerorigin/main, the diff included the upstream commits in between. It now uses the same base aswt merge. (#4281, thanks @starlightromero, whose #3519 reported the same case forwt merge) -
Submodules with an
ignoresetting: whensubmodule.<name>.ignoreordiff.ignoreSubmoduleshid uncommitted changes inside a submodule,wt removeandwt step pruneread the worktree as clean and removed it along with them; they now keep it. Withignore=all,wt step commitand squashes now commit a staged submodule pointer instead of leaving it staged. (#4252, #4192, #4206, #4303, thanks @Duang777) -
Worktrees whose
.gitwas deleted but whose directory remains (macOS$TMPDIRcleanup can do this):wt remove <branch>failed, andwt step pruneskipped or errored on them. Both now unregister the worktree and leave its files; one with staged changes or an operation in progress is kept bywt step prune, and refused bywt removewithout--force. (#4228, #4226, #4302) -
wt merge --no-squashwith a stage mode that stages nothing: with--stage=noneand only unstaged changes,--stage=trackedand only untracked files, or only dirty submodule contents, it stopped at "Nothing to commit"; it now merges the branch's commits. (#4251, thanks @Duang777) -
Nushell 0.116: the first
wttab completion in each session printed aPositional completer input deprecatedwarning. The completer now takes Nushell's new input and still works on older versions. (#4297) -
Hook-log JSON's
branchfield:wt config state logs --format=jsonput the sanitized log directory name (feature-x-x2d) there; it now holdsfeature/x, ornullwhen no local branch owns the directory. (Breaking: filters on the sanitized form need updating.) (#4279) -
wt config show --fulloutside a git repository: it printed only agit rev-parsefailure; it now shows the user config and diagnostics. (#4255) -
Fixes for unusual git setups:
--no-ffmerges are signed whencommit.gpgSignis set without a value or only for one worktree; aftergit worktree repair,--separate-git-dirrepos put worktrees beside the work tree andwt removeworks (fixes #4235); removing an orphan worktree before its first commit no longer errors; with a custom merge driver, leaving the picker during a conflict check no longer strands.merge_file_*files (fixes #4273). (#4206, #4236, #4233, #4274, thanks @zengzheqing and @brndnmtthws for reporting) -
Fixes for unusual names and values: branch and remote names starting with
-; non-UTF-8 file names inwt step copy-ignored,promote,push, andmerge; a bare~inCLAUDE_CONFIG_DIR, or WindowsHOMEdiffering fromUSERPROFILE; post-remove hooks after a pre-remove hook breaks the user config; multilinewt config state varsvalues, whichvars listand{{ vars.* }}truncated andwt config state clearfailed on. (#4253, #4267, #4277, #4257, #4259, #4262, #4247, #4276, #4272, thanks @Duang777 and @hiro-nikaitou)
Documentation
-
Help and recipe corrections:
wt step squash --stage=noneand thewt step pruneskip list now describe what they do, and the "Database per worktree" and "Monitor hook logs" tips use commandswtaccepts. (#4268, #4279) -
The worktrunk skill's sub-Agent example runs hooks: it dropped
--no-hooks, sopre-startprovisioning runs in agent-spawned worktrees, with guidance on when to add it back. (#4219, thanks @passitalong)
Internal
-
Library API changes (Breaking library API):
LocalBranchgainspush_remote;GitErrorgainsStaleWorktreeHoldsWorkand arepairable_atfield onWorktreeMissing;Repository::capture_refs_with_ahead_behindis removed;git::parse_porcelain_zandRepository::changed_filesnow use bytes. (#4228, #4259, #4289, #4290) -
Agent guidance moved to
AGENTS.md, shared by Claude Code and Codex, and trimmed from 2,763 lines to 382. (#4245, #4246, #4287)
Install worktrunk 0.80.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.80.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.80.0/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.80.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