Releases: max-sixty/worktrunk
0.36.0
Release Notes
Improved
-
Git-style external subcommands:
wt foonow runswt-foofrom PATH whenfoois not a built-in, mirroringgit foo→git-foo. Third-party tools can be installed and invoked aswt <name>without touching this repo. Unrecognized commands show a git-style error with typo suggestions. Docs (#2054, thanks @pablospe for the suggestion in #2053) -
{{ owner }}template variable: Expands to the GitHub/GitLab repository owner, useful for constructing URLs or paths in hook templates andworktree-path. (#2051, thanks @greggdonovan) -
Typed env-var config overrides:
WORKTRUNK__LIST__TIMEOUT_MS=30and other typed overrides now work correctly. Previously, string-typed env values silently failed deserialization, wiping all user config and falling back to defaults. (#2062) -
Config error attribution: Config load errors now identify the source — file errors show TOML line/column pointers, env-var errors list the offending
WORKTRUNK_*variable. Previously all failures showed a generic message. (#2068) -
Per-symbol atomic status rendering: The Status column in
wt listand thewt switchpicker now renders each symbol independently — unresolved gates show⋯at their position instead of fabricating defaults when the collect deadline expires. (#2067) -
Hook error messages: Malformed hook command config now lists the three accepted forms (string, named table, pipeline list) with a pointer to
wt hook --help, instead of an opaque serde error. (#2042) -
Stale trash cleanup:
wt removenow sweeps orphaned.git/wt/trashentries older than 24 hours after each removal, reclaiming space from interrupted background removals. (#2039)
Changed
-
wt hook <type>exits successfully when no hooks are configured: Previously errored; now prints a warning and exits 0, so scripts and CI can invokewt hookunconditionally. (#2056) -
Hook output log layout: Log files moved from flat
.git/wt/logs/{name}.logto nested{branch}/{source}/{hook-type}/{name}.log. Per-branch listing/clearing is now O(that branch).logs get --format=jsonpaths changed to relative. Legacy flat files are swept automatically. (#2041)
Fixed
-
wt config showfalse "Not configured": When the shell init line lives in a sourced file (common with dotfile managers),config showno longer reports "Not configured" — it checks whether integration is actually active at runtime. Fixes #1306. (#2066, thanks @wouter-intveld for reporting) -
Remove-then-switch hint: The hint for shadowed remote branches now uses
--foregroundso the chainedwt remove && wt switchactually works (background removal left a placeholder directory blocking the switch). (#2040) -
Conflict detection unified: The
wt switchpicker andwt listnow both run both conflict probes (commit-level and working-tree). Previously the picker skipped the cheaper probe, leaving the fallback unreachable for clean worktrees;wt listnon-full skipped the working-tree probe, missing conflicts from interrupted rebases. (#2064)
Documentation
- Surfaced vars & aliases on homepage and tips-patterns, cross-linked state keys to dedicated docs, tightened hook links. (#2035, #2036, #2037, #2038)
Internal
- Subcommand ordering aligned to documented policies (pipeline order for step, CRUD for state actions). (#2043, #2044)
Install worktrunk 0.36.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.36.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.36.0/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.36.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 install0.35.3
Release Notes
Improved
-
wt step prunestreams removals inline: Removals and "Skipped" messages now print as each integration check completes, overlapping with still-running checks — previously there was a visible gap of silence while all parallel checks finished before any output appeared. (#2015) -
Fewer redundant
git worktree listcalls in prune and multi-remove:prepare_worktree_removal()now accepts a pre-fetched worktree list, eliminating N+1 subprocess calls when removing many worktrees. (#2025)
Fixed
-
Picker preview UI lag: The picker's preview cache now stores pager-rendered output, so cache hits skip the pager subprocess entirely. Previously, scrolling past an item with a large diff froze the UI briefly on every re-render because the pager ran on every call. (#2021)
-
Template error hint underlining: The "Available variables" hint in template expansion errors now underlines each variable name individually instead of wrapping the entire comma-separated list in a single underline span. (#2028)
Documentation
-
Cross-linked vars references: The vars feature is documented in the hook template variables table,
wt config state varspage, and tips-patterns recipes — these now link to each other so readers can navigate between "how to set" and "how to use in templates". (#2034) -
Clearer project config intro: Improved the project config introduction and template variable heading in
wt confighelp text. (#2032)
Install worktrunk 0.35.3
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.35.3/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.35.3/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.35.3
| 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 install0.35.2
Release Notes
Improved
-
Multiple NAME filters for hook subcommands:
wt hook pre-merge --yes insta doctest docruns a subset of hooks in one command, instead of chaining separate invocations. (#2013) -
Branch context in batch removal hooks: During prune or multi-remove, hook announcement messages now include the branch name (
Running post-remove for **branch-name**: project:cleanup), disambiguating which worktree triggered each hook. (#2014)
Fixed
- Bare repo false positive when
core.bareis unset: Repos cloned by Eclipse/EGit (and other tools that don't writecore.bare) were incorrectly detected as bare. Replacedgit rev-parse --is-bare-repositorywithgit config --type=bool core.bare. Fixes #1939. (#1976, thanks @daniel-iwan-datacore for reporting)
Install worktrunk 0.35.2
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.35.2/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.35.2/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.35.2
| 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 install0.35.1
Release Notes
Fixed
-
PR lookup on forks respects
gh repo set-default:wt switch pr:Nnow checks the gh-configured default repo when origin points to a fork, instead of always querying the fork's repo (which returns 404). The error message is also context-aware based on the configured default. Fixes #2002. (#2004, thanks @JustinPierce for reporting) -
JSON output stability:
config show --format=jsonlog file sort is now deterministic (filename tiebreaker for identical timestamps).step for-each --format=jsonincludes a consistenterrorfield on all failure variants. (#2001)
Internal
- Continued
TestRepoconsolidation:bare()constructor,at(path)constructor, removed lifetime guard field. (#2000, #2005, #2007)
Install worktrunk 0.35.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.35.1/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.35.1/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.35.1
| 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 install0.35.0
Release Notes
Improved
-
--no-verifydeprecated in favor of--no-hooks: All commands (switch,remove,merge,step commit,step squash) now use--no-hooks.--no-verifyremains as a hidden alias with a deprecation warning. (#1932) -
JSON output:
--format=jsononconfig show,config statesubcommands,switch,remove,merge,step prune, andstep for-each. (#1969, #1959) -
Per-command hook log files: Each background hook command writes to its own log file instead of sharing a pipeline log. Combined hook announcements (e.g., post-remove + post-switch) display on a single status line. (#1934, #1980)
-
Prune and list performance:
step prunestreams integration checks and removes candidates in parallel (~3x faster on repos with many branches). Multiple caching layers (integration target,git_dir,rev_parse_tree,resolve_preferring_branch) reduce redundantgit rev-parsecalls duringwt list. (#1950, #1957, #1966, #1948, #1943) -
Itemized
state clearoutput:wt config state clearshows per-category counts and cleans up stale trash from incomplete worktree removals. (#1961, #1960) -
Hook pipeline summary: Serial steps separated by
;instead of→, repeated unnamed sources collapsed into counted form (user ×2), and named steps showsource:nameprefix. (#1994) -
Copy-pasteable help text:
--helpoutput strips$prompts from code examples for direct copy-paste in the terminal. (#1992) -
Better PR lookup errors:
wt switch pr:N404 errors now include the repository name and suggestgh repo set-defaultfor fork workflows. Fixes #1925. (#1927, thanks @JustinPierce for reporting) -
Claude Code worktree hooks: WorktreeCreate and WorktreeRemove hooks for the Claude Code plugin. (#1959)
Fixed
-
File permissions lost on copy-ignored:
wt step copy-ignorednow preserves execute bits when copying files via reflink. Fixes #1936. (#1937, thanks @RileyMathews for reporting) -
Git alias breaks
wt: RelativeGIT_DIR/GIT_WORK_TREEpaths inherited from git aliases now normalized to absolute paths at startup. Fixes #1914. (#1915, thanks @yasuhiroki for reporting) -
Diagnostic files in state logs:
verbose.loganddiagnostic.mdnow properly categorized inwt config state logsoutput. (#1981) -
Integration target in removal display: Background removal now shows
origin/main(effective target) instead ofmainwhen the remote is ahead. (#1993) -
Worktree-path hint suppression: The "customize worktree locations" hint no longer appears when project-specific
worktree-pathis configured. (#1941) -
State logs formatting: Missing newline between log sections in
wt config state logsoutput. (#1968) -
Claude Code WorktreeCreate hook: Fixed jq filter using wrong input field. (#1964)
-
OpenCode unicode escaping: Fixed broken emoji markers depending on Bun version. (#1935, thanks @noirbizarre)
Documentation
- Clarified plugin install command. (#1906, thanks @suyua9)
- Fixed inaccurate logs documentation. (#1986)
Internal
- Consolidated
TestRepointo singlesrc/testingmodule, shared across lib and bin unit tests. (#1944, #1963, #1971, #1991) - Simplified dispatch, timeout, and copy pool internals. (#1949, #1930, #1931)
Install worktrunk 0.35.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.35.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.35.0/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.35.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 install0.34.2
Release Notes
Improved
-
OpenCode integration: Activity tracking plugin shows agent status (
🤖working,💬waiting) inwt list, withwt config plugins opencode install/uninstallfor management. Also adds OpenCode as an LLM commit generation backend. (#1807, thanks @noirbizarre) -
Lower priority for copy-ignored:
wt step copy-ignorednow runs at the lowest OS scheduling priority (renice -n 19), yielding CPU to interactive foreground tasks on large trees. (#1916) -
Diff stats performance: Switched from
--numstat(one line per file) to--shortstat(single summary line), reducing diff output from O(files) to O(1) per worktree. (#1917)
Fixed
-
Remote detection with
includeIfconfig:primary_remote()failed when non-remote git config keys (likeincludeIf.hasconfig:remote.*.url) matched the remote regex. (#1908, thanks @nirvdrum) -
Background hook execution: Fixed three issues — list-form configs lost serial/concurrent semantics in post-merge/post-remove hooks, pipeline
hook_namecontext leaked across steps, and lazy template expansion was broken for name-filtered hooks (e.g.,wt hook post-start db). (#1910) -
Copy-ignored parallelism: The outer loop in
wt step copy-ignoredran on the global rayon pool instead of the dedicated copy pool, effectively serializing top-level entries. Now runs entirely on the 4-thread copy pool. (#1913) -
Windows stack overflow in copy-ignored: Copy pool worker threads used platform default stack size (~2 MiB on Windows), causing overflow with 200+ directories. Now uses explicit 8 MiB stack size across all platforms. (#1911)
-
Nix flake build: Fixed
flake.nixfiltering out thedev/directory, which broke builds after OpenCode integration addedinclude_str!("../../../dev/opencode-plugin.ts"). (#1924, thanks @mariuskimmina)
Internal
- Unified background hook execution into a single pipeline-based path, removing ~260 lines of dual-path branching. (#1912)
- Replaced deprecated
codecov/test-results-actionwithcodecov/codecov-action. (#1918) - Bumped AUR deploy action to v4.1.2 (fixes argument order with Arch Linux's updated
runuser). (#1909)
Install worktrunk 0.34.2
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.34.2/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.34.2/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.34.2
| 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 install0.34.1
Release Notes
Improved
step pruneperformance: Integration checks now run in parallel, dramatically reducing prune time for repos with many branches (3+ minutes → seconds with 100+ branches). Fixes #1888. (#1890, thanks @ortonomy for reporting)
Fixed
-
CPU saturation during copy operations: Restored a dedicated 4-thread copy pool that was accidentally removed in v0.34.0, preventing ~1000% CPU usage on copy-heavy operations like
step copy-ignored. (#1905) -
Background pipeline template variables: When
wt switch --createfires both post-switch and post-start hooks, pipeline steps were incorrectly accumulated into a single background process, causing{{ hook_type }}to expand to the wrong value. Each hook type now spawns its own pipeline. (#1904)
Internal
- Extracted shared
classify_unknown_keyto deduplicate config warning logic. (#1902)
Install worktrunk 0.34.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.34.1/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.34.1/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.34.1
| 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 install0.34.0
Release Notes
Improved
-
Per-branch custom variables: New
wt config state vars set/get/list/clearcommands store custom key-value pairs per branch, accessible as{{ vars.key }}in hook templates andwt step eval. Variables persist in git config and appear inwt list --format=json. (#1006) -
Lazy template expansion in pipelines: Pipeline steps now expand
{{ vars.* }}at execution time rather than at pipeline construction, so variables set by step N are available in step N+1. (#1840) -
wt config plugins claudecommands: Newinstall,uninstall, andinstall-statuslinesubcommands manage Claude Code integration.installregisters the worktrunk plugin via the Claude marketplace,install-statuslineconfigures the Claude Code status line, andwt config showsuggests these commands instead of raw CLI instructions. (#1830, #1834) -
[forge]config section: New explicit[forge]section withplatformandhostnamefields for SSH host aliases and non-standard remotes.ci.platformis deprecated with automatic migration. (#1826) -
Forge detection with
url.insteadOf: Forge platform detection now falls back to the effective URL (after giturl.insteadOfrewrites), fixing CI status, PR/MR detection, and push-remote features for users with SSH aliases or corporate mirrors. (#1771, thanks @amodelaweb; thanks @roytouw for reporting #1790) -
--branchflag forwt step commit: Commit to a specific branch without switching to it — useful in automation and scripts. (#1750) -
Last fetch time in branch-not-found hint: When
wt switchcan't find a branch, the hint now shows when the remote was last fetched (e.g., "last fetched 3h ago") to help identify stale local refs. (#1877) -
Config field renames:
merge.no-ff→merge.ffandswitch.no-cd→switch.cd, using positive-sense naming. Old names continue to work with deprecation warnings and automatic migration viawt config update. (#1856, #1860) -
Syntax highlighting for template blocks: Documentation site now renders
{{ }}template expressions with syntax highlighting. (#1792) -
Hide Claude Code section when CLI unavailable:
wt config showno longer displays the Claude Code integration section if theclaudeCLI is not found. (#1827)
Fixed
-
Copy-ignored too many open files:
wt step copy-ignoredcould exhaust file descriptors on large trees. Now reuses a single thread pool across all copy operations. Fixes #1865. (#1864, thanks @fspeirs) -
Squash-merged branch detection with merge-tree conflicts:
wt step pruneandwt listfailed to detect squash-merged branches when the default branch modified the same files. Now uses patch-id matching as fallback. Fixes #1818. (#1820, thanks @tthyer for reporting) -
Background removal blocked for 1 second:
wt removeblocked unnecessarily due to incorrect shell operator precedence in the background process spawn. (#1858) -
Fish shell getcwd error in Zellij: Removing a worktree while using fish in Zellij produced "error retrieving current directory" messages. (#1787)
-
Alias detection false positive on path substrings:
wt config showincorrectly flagged unrelated aliases when the alias target path contained "wt" as a substring. Fixes #1772. (#1773, thanks @nicolasff for reporting) -
Branch names with dots in vars: Vars parsing incorrectly split branch names containing dots (e.g.,
release.1.0) as nested config keys. (#1837) -
Lazy pipeline vars expansion in background hooks: Background hook execution failed with lazy vars expansion due to raw string quoting and overly strict template validation. (#1855)
-
GitLab MR remote tracking:
wt switch mr:Ncould reuse branches tracking the correct merge-request ref but on the wrong remote. (#1817) -
Fork CI and integration target detection: Fixed CI check-runs querying the wrong repo for forks, branch tracking checking only merge config, and diverged local branches missing remote merges. (#1812)
-
Placeholder directory on non-current worktree removal:
wt removecreated unnecessary empty placeholder directories and slept for 1 second when removing worktrees other than the current one. (#1868, #1874) -
Merge-tree errors silently swallowed:
git merge-treefailures (invalid refs, corrupt repos) were treated as conflicts instead of propagating, triggering expensive patch-id fallback unnecessarily. (#1896) -
Deprecated key in wrong config file: A deprecated section key (e.g.,
[commit-generation]) in the wrong config file (e.g., project config) was silently filtered. Now warns "Key X belongs in Y config as Z". (#1899) -
Config migration mutex panic: Replaced unsafe
unwrap()with error propagation in config deprecation migration. (#1887) -
Hook show outside git repo:
wt hook shownow provides a clear error message when run outside a git repository. (#1809, thanks @noirbizarre)
Documentation
-
Help text rewritten for
switch,merge,hook, andremovecommands. (#1782, #1783, #1785, #1765, #1764) -
Hook documentation restructured: types reordered by paired events, pipeline ordering rewritten with progressive examples, approval prompt shown in color. (#1763, #1756, #1766)
-
Hooks documented in user config reference. (#1845)
-
Deprecated
post-createremoved from documentation. (#1776) -
Arch Linux official package added to installation instructions. (#1872, thanks @ctrl-q)
-
README template syntax fixed. Fixes #1851. (#1852, thanks @IlyaSemenov for reporting)
Internal
-
Config deprecation consolidated from two layers to one pre-deserialization TOML migration. (#1879, #1880, #1876)
-
Benchmark infrastructure extracted into
wt-perfcrate. (#1878) -
wt removeapproval path reuses already-loaded repo/config (~50ms savings). (#1875)
Deprecated
| Old | New | Action |
|---|---|---|
[ci] section |
[forge] section |
wt config update migrates; wt config show warns |
no-ff in [merge] |
ff (reversed) |
wt config update migrates; wt config show warns |
no-cd in [switch] |
cd (reversed) |
wt config update migrates; wt config show warns |
All deprecated fields continue to work. Run wt config update to migrate, or wt config show for details.
Install worktrunk 0.34.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.34.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.34.0/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.34.0
| File | Platform | Checksum |
|---|---|---|
| worktrunk-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| worktrunk-x86_64-apple-darwin.tar.xz | In... |
0.33.0
Release Notes
Improved
-
Hook execution pipelines: Post-* hooks support TOML array syntax for serial dependencies — steps execute in order, with maps within steps running concurrently.
post-start = [{ install = "npm install" }, { build = "npm run build", lint = "npm run lint" }]runs install first, then build and lint in parallel. Docs (#1713) -
Copy-ignored exclude patterns:
wt step copy-ignorednow skips built-in VCS metadata and tool-state directories (.bzr/,.conductor/,.entire/,.hg/,.jj/,.pi/,.pijul/,.sl/,.svn/,.worktrees/) by default. Additional excludes are configurable via[step.copy-ignored] exclude = [...]in user or project config. (#1667, thanks @shunkakinoki for #1653) -
Copy-ignored parallelized:
wt step copy-ignoreddirectory walks run in parallel with a dedicated 4-thread pool, improving performance on multi-core systems. (#1721) -
Alias append semantics: Aliases now use append semantics across all config layers, matching hook merge behavior. Within user config, per-project aliases append to global aliases on collision (global first). Across configs, project-config aliases also run alongside user aliases (user first, then project with approval) — previously the user version silently suppressed the project version. (#1724, #1727)
-
Agent skill discovery: The website now serves
.well-known/agent-skills/for web-based skill discovery by AI agents. (#1751)
Fixed
-
Picker alt-r skipped remove hooks: Removing a worktree via
alt-rin the picker bypassed pre-remove and post-remove hooks. Pre-remove hooks now run synchronously (non-zero exit aborts removal), and post-remove hooks spawn in the background. (#1710) -
False positive shell integration warning:
wt config showreported "Found wt in ... but not detected as integration" for Nushell and Fish wrapper files that ARE the integration. Fixes #1735. (#1736, thanks @saschabratton) -
Bare repo config path ignored:
wt hook approvals addand other config commands failed to find.config/wt.tomlin bare repositories because they looked relative to the current worktree instead of the primary worktree. Fixes #1744. (#1745, thanks @jrdncstr)
Documentation
-
Help text for
wt stepsubcommands cleaned up — redundant openers removed. (#1737) -
Experimental badge placement fixed in generated documentation. (#1742, #1729, #1734, #1746)
Internal
-
Copy-ignored built-in exclude constants consolidated. (#1738)
-
Cmd::env()acceptsAsRef<OsStr>for direct path compatibility. (#1723) -
Picker width survey snapshots for layout testing at various terminal sizes. (#1613)
Install worktrunk 0.33.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.33.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.33.0/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.33.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 install0.32.0
Release Notes
Improved
-
Hooks rationalized: Every lifecycle event now has a symmetric
pre-(blocking) /post-(background) pair. This required one rename:post-create→pre-start, reflecting that it runs beforepost-startas a blocking dependency step. A newpost-commithook fires in the background after commits (including squash commits during merge).post-mergeis now background instead of blocking, consistent with all otherpost-*hooks. Configs usingpost-createget a deprecation warning on anywtcommand; runwt config updateto rename automatically. The old name continues to work during the deprecation period. Docs (#1679, closes #1670, thanks @ortonomy for reporting #1571) -
Detached worktree support: Detached HEAD worktrees can now be removed via
wt remove /path/to/worktreeand switched to viawt switch /path/to/worktree. The interactive picker also handles detached worktrees for both operations. (#1665, #1680, thanks @mjakl for reporting #1661) -
In-place worktree removal in picker: Press
alt-rin thewt switchpicker to remove the selected worktree without leaving the picker. Currently hidden from picker legend and help text pending a cursor-reset issue (#1695). (#1677, #1696) -
Smarter column dropping in
wt list: Low-priority columns (Message, Time, Commit) are now dropped when Summary needs more space, using graduated thresholds based on priority distance. Extends the no-data column dropping from v0.31.0. (#1678)
Fixed
-
Bare repo project config ignored:
.config/wt.tomlplaced in the primary worktree of a bare repository was not found when running commands from the bare repo root directory. Config is now loaded from the primary worktree as fallback, and accidental config in the bare repo root itself is skipped. Fixes #1691. (#1692, #1697, thanks @seakayone) -
pre-starthook failure was non-blocking:pre-startwas the onlypre-*hook that warned on failure instead of aborting. Allpre-*hooks now consistently use FailFast. (Breaking:pre-starthook failures that previously only warned now abort the operation.) (#1708) -
Spurious mismatch warning for detached worktree switches: Switching to a detached worktree by path produced a "Branch-worktree mismatch" warning because the directory name was treated as a branch name. (#1686)
-
Detached worktree switch output showed redundant path: Output now shows "detached worktree" instead of repeating the directory name (which duplicated the path after
@). (#1685) -
Picker alt-r removal fixes: Picker removals now validate the worktree synchronously before removing it from the list, perform the actual git removal on a background thread to prevent UI freezing, and correctly handle detached worktrees. (#1699, #1702, #1717)
Documentation
- Changelog and migration guide for hook rationalization. (#1693)