You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Submodule worktree paths: Worktrees are now created in the correct location when running inside a git submodule. Previously, worktrees were created relative to the parent repo's .git/modules/ directory instead of the submodule's working directory. (#762, thanks @lajarre; #777, thanks @mhonsel for reporting)
Shell integration warnings: Warnings about shell integration now check if the current shell has integration configured, not whether any shell does. This fixes misleading "shell requires restart" messages when e.g. bash had integration but the user was running fish. (#772)
"Not found" error messages: Improved error message phrasing — "No branch named X" instead of "Branch X not found", "Branch X has no worktree" instead of "No worktree found for branch X". Context-appropriate hints now appear (e.g., wt remove no longer suggests --create). (#774)
Post-remove hook: New hook type runs after worktree removal. Template variables ({{ branch }}, {{ worktree_path }}, {{ commit }}) reference the removed worktree, enabling cleanup scripts for containers, servers, or other resources. (#757)
Graceful handling of missing worktree directories: wt remove now prunes stale git metadata when the worktree directory was deleted externally (e.g., rm -rf), making the command more idempotent. Fixes #724. (thanks @strangemonad for reporting)
Config validation warnings at load time: Unknown fields in config files (typos like [commit-gen] instead of [commit-generation]) now show warnings immediately instead of only in wt config show. (#758)
Fixed
Age column shows "future" on NixOS/direnv: wt list no longer uses SOURCE_DATE_EPOCH for time calculations, which NixOS and direnv commonly set to past timestamps for reproducible builds. Fixes #763. (thanks @ngotchac for reporting)
CI status with URL-based pushremote: CI detection now works when branch.<name>.pushremote is set to a URL directly (as gh pr checkout does) instead of a remote name. (#769)
GitLab nested groups in URL parsing: URLs like gitlab.com/group/subgroup/repo now correctly identify repo as the repository name instead of subgroup. This was a security fix — previously, approval bypass was possible across sibling repos in the same parent group. (#768)
GitLab CI status detection: Fixed multiple issues with glab CLI compatibility — MR lookup now uses two-step resolution, "manual" pipelines show as running instead of failed, and rate limit errors are handled properly. Fixes #764. (thanks @ngotchac for reporting)
Internal
Refactored accessor functions to use bare nouns per Rust convention. (#765)
Clarified target/integration naming across codebase. (#755)
Install worktrunk 0.18.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.18.0/worktrunk-installer.sh | sh
Per-project config overrides (Experimental): Override settings per-project in user config. Supports worktree-path, commit-generation, list, commit, and merge sections. Config precedence: CLI arg > project config > global config > default. Closes #596. (#749)
Search all remotes for branch existence: Branch existence checks and completions now search all remotes instead of just the primary remote, matching git's behavior. When a branch exists on multiple remotes, completions show all of them (e.g., feature ⇣ 2d origin, upstream). (#744)
CI detection for fork workflows: CI status detection now searches all remotes and uses gh config get git_protocol / glab config get git_protocol for fork URL protocol preference instead of inferring from existing remotes. (#753)
Fixed
Same-repo PR switching with stale refs: wt switch pr:N for same-repo PRs now fetches the branch before validation, fixing "Branch not found" errors when local refs were stale. (#742)
Project identifier collision for repos without remotes: Repos without remotes now use their full canonical path as the project identifier instead of just the directory name, preventing approval collisions between unrelated repos (e.g., ~/work/myproject vs ~/personal/myproject). Users with remoteless repos will need to re-approve commands. (#747)
Internal
Cross-platform path handling improvements using path-slash crate and Path::file_name(). (#750)
Renamed WorktrunkConfig to UserConfig internally. (#746)
Install worktrunk 0.17.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.17.0/worktrunk-installer.sh | sh
Background hook verbosity: Background hooks (post-start, post-switch) now show a single-line summary by default instead of per-hook output. Use -v to see detailed output with expanded commands. We're open to feedback on this change — let us know in #690. (thanks @clutchski for reporting)
Internal
Fixed dead Apple documentation link in copy-ignored rationale. (#743)
Install worktrunk 0.16.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.16.0/worktrunk-installer.sh | sh
Hook execution order: Hooks now run in the order defined in the config file. Previously, HashMap iteration randomized the order. Fixes #737. (thanks @ngotchac for reporting)
Install worktrunk 0.15.5
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.15.5/worktrunk-installer.sh | sh
Git progress for slow worktree creation: When git worktree add takes more than 400ms (common on large repos), worktrunk now shows a progress message and streams git's output instead of going silent. (#725)
Verbose template expansion output: -v now shows template expansion details: the template, expanded command, and any undefined variables with SemiStrict fallback behavior. (#712)
Shell integration hint for explicit path invocation: When running wt via explicit path (e.g., ./target/debug/wt) with shell integration configured, the warning now suggests running wt switch <branch> to use the shell-wrapped command. (#721)
Fixed
Unsafe upstream when creating branch from remote base: wt switch --create feature --base=origin/main no longer sets up tracking to origin/main, preventing accidental pushes to the base branch. Fixes #713. (thanks @kfirba)
Credential redaction in debug logs: URLs with embedded credentials (e.g., https://token@github.com/...) are now redacted in -vv debug output. (#718)
Hook preview shows template on expansion failure: wt hook show --expanded now displays both the error message and original template when expansion fails, instead of hiding the template. (#722)
Documentation
Homebrew install uses core tap: Install command updated from max-sixty/worktrunk/wt to worktrunk. (#716, thanks @chenrui333)
Hook docs reordered: post-start (background) is now the recommended default, with post-create for blocking dependencies. (#733)
Internal
Simplified GitHub/GitLab CI status detection. (#730)
Previous worktree gutter changed from - to + for visual consistency. (#699)
Install worktrunk 0.15.4
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.15.4/worktrunk-installer.sh | sh
--execute command display: Shows the expanded command in a gutter with path context instead of showing the raw template before expansion. (#708)
CRLF line endings in error display: Multiline errors with Windows (\r\n) or old Mac (\r) line endings now display correctly instead of falling through to single-line handling. (#707)
Documentation
Arch Linux install via AUR: Added installation instructions and shell integration command. (#709, #561, thanks @razor-x)
Install worktrunk 0.15.3
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.15.3/worktrunk-installer.sh | sh
wt config shell completions <shell>: Generate static shell completion scripts for package managers and custom installation. (#701, thanks @chenrui333)
Debug logging threshold: Now requires -vv instead of -v for debug logging and diagnostic file generation, freeing -v for future use. (#702)
Fixed
Fork PR fetching: wt switch pr:N now works when origin points to a fork by fetching PR refs from the upstream remote. Shows actionable error with git remote add command if upstream remote is missing. (#704)
Fork PR branch naming: Fork PR branches now use the original branch name (e.g., feature-fix) instead of owner/feature-fix, so git push works correctly. (#706)
Nested worktree detection: Current worktree indicator (@) now shows on the correct worktree when worktrees are nested (e.g., .worktrees/ layout inside repo). (#697)
Symlink path resolution: Worktree commands work correctly on systems with symlinks (e.g., macOS /var → /private/var). (#696)
Pre-remove hook failures: Shell no longer cd's to main worktree when pre-remove hooks fail, leaving user in their current location. (#692)
PowerShell completion robustness: Completion registration errors no longer break the shell wrapper function. (#674)
Documentation
Added missing orphan (∅) symbol and no_worktree state to JSON output documentation. (#687)
Clarified Unicode handling in shell detection. (#700)
Internal
Refactored large files into focused modules. (#688)
Consolidated integration reason computation into Repository method. (#689)
Added verbose level tracking infrastructure for future -v output. (#703)
PowerShell template uses WORKTRUNK_BIN for test isolation. (#674)
Install worktrunk 0.15.2
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.15.2/worktrunk-installer.sh | sh
wt config show diagnostics: When shell integration is not active, now shows how the command was invoked, the binary path (if different), and $SHELL environment variable. Helps diagnose setup issues. (#683)
Help pager follows git convention: -h never opens a pager, --help uses pager when available. Closes #583. (#651, thanks @razor-x)
Verbose mode logging: -v now logs command stdout/stderr and all spawned processes including background hooks, wt for-each commands, and shell probes. (#680)
Documentation
FAQ reordered: Questions now ordered by frequency and importance.
Internal
AUR package: Worktrunk now published to Arch Linux AUR on each release. (#585, thanks @razor-x)
Codecov Test Analytics: Integration tests now report to Codecov Test Analytics. (#682)
Install worktrunk 0.15.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.15.1/worktrunk-installer.sh | sh
wt switch pr:<number> syntax (experimental): Switch directly to a GitHub PR by number. Same-repo PRs delegate to normal switch flow; fork PRs fetch from refs/pull/N/head and configure pushRemote. (#673, closes #657, thanks @wladpaiva for requesting)
--force hint for dirty worktrees: When wt remove fails due to uncommitted changes, the hint now shows the full command: wt remove <branch> --force. (#671)
Documentation
Windows install guidance: Winget as recommended install (ships git-wt by default), plus the App Execution Aliases workaround to use wt directly. Closes #133. (thanks @ctolkien for reporting, @shanselman for the aliases tip, @Farley-Chen for #648)
Caddy subdomain routing pattern: Clean URLs like feature-auth.myproject.lvh.me via Caddy reverse proxy with dynamic route registration.
tmux session per worktree pattern: Dedicated tmux session with multi-pane layout per worktree.
Install worktrunk 0.15.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.15.0/worktrunk-installer.sh | sh