github max-sixty/worktrunk v0.31.0
0.31.0

9 hours ago

Release Notes

Improved

  • Hook template variables consolidated: Bare variables (branch, worktree_path, commit) now consistently point to the Active worktree — the destination for switch/create, the source for merge/remove. New directional variables ({{ base }}, {{ base_worktree_path }}, {{ target_worktree_path }}, {{ cwd }}) give hooks explicit access to both sides of two-worktree operations. (Breaking: {{ worktree_path }} changed in pre-switch for existing worktrees and in post-merge — use {{ cwd }} or {{ base_worktree_path }} for the previous behavior.) Docs (#1655, #1660, #1663)

  • Bare repo worktree-path prompt: When a bare repo lives at a hidden path like .git or .bare, wt switch now detects that worktrees would get awkward names (e.g., project/.git.feature) and offers to configure a worktree-path override. Non-interactive environments show the config to add manually. (#1656, thanks @seakayone for reporting #1279)

  • Shell completion for step aliases: Tab-completing wt step <TAB> now shows configured aliases alongside built-in step commands, with --dry-run, --yes, and --var flags. (#1641)

  • wt list reclaims space from redundant columns: When the Path column carries no useful information (all worktree paths are predictable from branch names), its space is reclaimed for Summary and Message. (#1634)

  • Syntax highlighting for alias dry-run: wt step <alias> --dry-run now uses bash syntax highlighting, matching hook dry-run output. (#1635)

Fixed

  • wt list hang from fsmonitor daemon: On macOS with builtin fsmonitor, wt list could hang at the "(loading...)" stage because git fsmonitor--daemon start inherited pipe file descriptors and held them open indefinitely. (#1648)

  • Post-remove hooks ran at wrong directory: Post-remove hooks executed at the user's cwd (which could be the worktree being removed) instead of the primary worktree. (#1645)

  • Picker showed loading indicator for unavailable data: The interactive picker used (loading) for fields that would never arrive; now uses · (unavailable). (#1651)

  • wt hook --dry-run missing directional variables: Hook dry-run and --show --expanded output was missing base, target, and target_worktree_path variables for switch, create, and remove hooks. (#1669)

Documentation

  • Bare repository layout guide and worktree-path example in config docs. (#1664)

  • Migration guide for template variable changes in hook docs. (#1666)

Internal

  • Renamed internal select module to picker. (#1650)

  • Consolidated merge/remove removal validation. (#1625)

Install worktrunk 0.31.0

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.31.0/worktrunk-installer.sh | sh && wt config shell install

Install prebuilt binaries via powershell script

powershell -ExecutionPolicy Bypass -c "irm https://github.com/max-sixty/worktrunk/releases/download/v0.31.0/worktrunk-installer.ps1 | iex"; git-wt config shell install

Install prebuilt binaries via Homebrew

brew install worktrunk && wt config shell install

Download worktrunk 0.31.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 install

Install via Winget (Windows)

winget install max-sixty.worktrunk && git-wt config shell install

Install via AUR (Arch Linux)

paru worktrunk-bin && wt config shell install

Don't miss a new worktrunk release

NewReleases is sending notifications on new releases.