winget install --id max-sixty.worktrunk
About worktrunk
worktrunk (wt) is a Git worktree manager designed for trunk-based development workflows. It simplifies creating, switching between, and managing Git worktrees, making it easy to work on multiple features or branches simultaneously without the overhead of stashing or switching branches in a single working directory.
What's new in v0.72.0
Release Notes Improved - wt merge and wt step push leave the target worktree's uncommitted changes in place: Both commands used to move a dirty target worktree's changes aside with an autostash (git stash push -u) and restore them after the push, because the fast-forward's receive.denyCurrentBranch=updateInstead refuses any dirty worktree at all. That design entered refs/stash — a repo-global namespace any process can mutate — and restored staged changes as unstaged. Both strategies now advance the target through one path: a compare-and-swap update-ref, then update-index --refresh plus read-tree -m -u in the target worktree (git's documented lenient push-to-checkout policy), with a CAS rollback if the sync can't apply, so branch and worktree move together or not at all. Uncommitted changes at paths the push doesn't touch never move — unstaged edits stay unstaged, staged entries stay staged, untracked files stay put, and refs/stash is never involved. The upfront check that names a conflicting file also reads --porcelain -uall now, so an untracked file inside an untracked directory is caught and named rather than slipping past a collapsed dir/ entry. (Breaking: the fast-forward path no longer runs a git push, so pre-push and the receive-side hooks — pre-receive, update, post-receive, post-update, and any push-to-checkout — no longer fire. A git merge run in the target wouldn't run them either, which is the line the module spec draws, and the new sync reimplements the lenient policy push-to-checkout documents rather than invoking the hook. Separately, a sync that can't apply n...
Version history
| Version | Updated | Notes |
|---|---|---|
| v0.72.0 | Unknown | Release Notes Improved - wt merge and wt step push leave the target worktree's uncommitted changes in place: Both commands used to move a dirty target worktree's changes aside with an autostash (git stash push -u) and re... |
| v0.71.0 | Unknown | Release Notes Improved - Forge hosts are classified by exact DNS label: Host detection matched the bare substring, so github anywhere in a hostname selected the GitHub provider — evil-github.com and dev.azure.com.attacke... |
| v0.70.0 | Unknown | Release Notes Improved - wt step prune removes worktrees far faster: Each removal ran a serial chain of ~17 git subprocesses under the scan write lock, re-preparing a plan the scan had already computed and re-stating the... |
| v0.69.2 | Unknown | Release Notes Improved - wt remove resolves every fsmonitor daemon in one lsof call: The end-of-command sweep forked one lsof per git fsmonitor--daemon on the machine — with core.fsmonitor enabled globally that is one da... |
| v0.69.1 | Unknown | Release Notes Improved - wt switch statusline dims the dev-server URL until its port answers: The Claude Code statusline's dev-server URL now dims until something answers on its port, matching the wt list cell it already... |
| v0.69.0 | Unknown | Release Notes Improved - wt switch statusline links in Claude Code: The Claude Code statusline suppressed OSC 8 hyperlinks, so its CI segment printed colored but inert and its dev-server URL printed in full. Claude Code... |
| v0.68.0 | Unknown | Release Notes Improved - wt switch preview tabs fill on demand: Navigating to a preview tab (e.g. alt-3, the branch diff) could show "Loading…" for ~10 seconds in a large repo while the tab waited its turn in the backgro... |
| v0.67.0 | Unknown | Release Notes Improved - Experimental --reap flag for wt remove: wt remove --reap terminates processes still running in the worktree (a post-start dev server, a file watcher, a language server) before removing it, freein... |
| v0.66.0 | Unknown | Release Notes Improved - Opt-in JSON schema 2 for wt list: wt list --format=json and wt list statusline --format=json can now emit a v2 schema, selected via the [list] json-schema config key. Schema 2 wraps the rows in a... |
| v0.65.0 | Unknown | Release Notes Improved - Picker alt-x flashes why a worktree wasn't removed: When alt-x in the wt switch picker keeps a row instead of removing it, the reason now flashes in the picker header for a beat, rather than only... |
| v0.64.0 | Unknown | Release Notes Improved - {{ git.branch.* }} template namespace for custom columns: wt list custom columns can now read a branch's own git config via {{ git.branch.<key> }} — both convention keys you set yourself (branch.... |
| v0.63.0 | Unknown | Release Notes Improved - [list] columns can force a column on past --full: Listing a column now overrides the --full / [list] summary presets — columns = ["branch", "ci"] shows the CI column without --full. Hard data-sou... |
| v0.62.0 | Unknown | Release Notes Improved - Browse open PRs/MRs in the wt switch picker, with live CI: The picker now streams a live CI/review-status column per row — priming from the local cache, then fetching live (it previously showed o... |
| v0.61.0 | Unknown | Release Notes Improved - wt list custom columns: Each [list.custom-columns.<Header>] entry in user config adds a column to wt list (and the wt switch picker), rendered per row as a minijinja template over branch, worktre... |
| v0.60.0 | Unknown | 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 conf... |
| v0.59.0 | Unknown | Release Notes Improved - Picker frees digit keys for filtering; preview tabs move to Alt: In the wt switch picker, plain digits now go to the filter, so a branch name with a number in it can be typed directly. Preview ta... |
| v0.58.0 | Unknown | Release Notes Improved - Table-form pre-* hooks run concurrently: A multi-entry table hook ([pre-merge] with several keys) now runs its commands concurrently, completing the cut-over announced in v0.37.0: every hook type... |
| v0.57.0 | Unknown | Release Notes Improved - wt step diff --branch: wt step diff gained a -b/--branch flag, mirroring wt step commit, so the diff can target another worktree's branch without leaving the current one. The branch must have a c... |
| v0.56.0 | Unknown | Release Notes Improved - wt list JSON output includes repo_url: Each item now carries repo_url, the repository's web URL derived from the primary remote (absent when there's no parseable forge remote). It's the local che... |
| v0.55.0 | Unknown | Release Notes Improved - wt switch accepts forge PR/MR URLs: wt switch https://github.com/owner/repo/pull/123 now resolves the same way as wt switch pr:123, and the URL form works anywhere a pr:N / mr:N shortcut does (po... |