Release Notes
Improved
-
wt remove --foregroundshows a TTY progress spinner: Removing a worktree with a fatnode_modules(or any large trash payload) now prints⠼ Removing 7,272 files · 64.5 MiBto stderr while the unlink proceeds, with a matching(N files · X MiB)suffix on the success line. TTY-gated; pipes and the background path are byte-for-byte unchanged. Driven by the same machinery introduced forwt step copy-ignoredin #2413. (#2420) -
wt step copy-ignoredshows a TTY progress spinner: Large copies ofnode_modules,build/, ortarget/previously ran silently. A stderr-only spinner (⠼ Copying 7,272 files · 64.5 MiB) ticks while the copy proceeds, gated on TTY +verbosity == 0+ not--dry-run, with a 300ms startup delay so sub-second copies stay quiet. (#2413, thanks @tehdb for the suggestion) -
wt switch -c <new> --base <name>accepts a remote-only base:--base releases/4.x.xpreviously failed withNo branch, tag, or commit named "releases/4.x.x"when the branch existed only as a remote-tracking ref. The bare name now resolves through the single matching remote (the existing safety code still unsets the new branch's upstream so a straygit pushdoesn't target the base). Multi-remote and zero-remote cases pass through unchanged. (#2411, thanks @viicslen for reporting #2410) -
LLM
wt step commitsummaries surfaced inwt config state:wt config state getnow includes aSUMMARY CACHEtable (and JSON section) listing per-branch entries, andwt config state clearremoves them alongside markers/vars/CI status. Backed by a new content-addressed layout at.git/wt/cache/summary/{branch}/{hash}.jsonso a cache hit is a single file-existence check. (#2407)
Fixed
-
wt config state clearno longer reports "Cleared 0" when an I/O or config error actually occurred: Across markers, vars, previous-branch, default-branch, and CI-status (single + aggregate), elevenunwrap_or(false)/let _ = unset_config(...)swallows silently turned real failures into "nothing to clear" messages. Genuinegit config --unsetfailures andread_dir/remove_fileerrors now surface; the common "key didn't exist" exit-5 path stays silent. The sharedclear_*machinery for the on-disk caches is now consolidated inworktrunk::cache. (#2394, #2400) -
wt config state ci-status clear <branch>actually clears the cache file: The single-branch path was still callingunset_config("worktrunk.state.<branch>.ci-status")from before the cache moved to.git/wt/cache/ci-status/<branch>.json. The command always took the info branch and never touched the real cache;--allwas already correct. (#2392) -
wt config state get/clear ci-statusfororigin/foo-style branches when a same-named local branch exists: A local branch literally namedorigin/foowould shadow the remote-tracking ref —is_remoteresolved against the remote while the SHA used for cache keys came from the local branch, sogh/glabwas invoked for the remote while the cache tracked the local. A singlefor-each-refquery now sourcesis_remote, the short name, and the HEAD SHA from the same ref. Tags and raw SHAs passed via--branchnow returnBranchNotFoundinstead of being accepted as "local branches" with nonsensical CI lookups. (#2388)
Documentation
-
worktrunk.dev/llms.txtplus.mdcompanions for every page: Each docs page is now also served as clean markdown atworktrunk.dev/<page>.md, with anllms.txtindex per the llms.txt spec so LLM tools can find the docs without scraping HTML. (#2404) -
Static command-output blocks for the GIF-heavy docs pages:
merge,step,remove,hook, andllm-commitsnow include realistic colorized command-output blocks driven by insta snapshots, alongside (or instead of) the GIFs — so they stay in lockstep with whatwtactually prints. (#2405, thanks @drewnoakes for reporting #2403) -
Conda / Pixi installation listed in the install section: The README and worktrunk-page install table now mention the conda-forge package alongside Homebrew, Cargo, winget, and pacman. (#2425, thanks @noamgot for reporting #2424)
-
FAQ documents the new summary cache layout: The "What files does Worktrunk create?" inventory now includes the
.git/wt/cache/summary/{branch}/{hash}.jsonLLM-summary cache. (#2408)
Internal
-
Three on-disk caches unified onto a shared
worktrunk::cachemodule:sha_cache,ci_status, and the newsummarycache now share one implementation of torn-write semantics, error policy, LRU sweep, and clear mechanics. Thesummaries/directory is renamedsummary/to match the singular-operation convention used by every other kind (ci-status,is-ancestor, etc.); stalesummaries/dirs are harmless. (Breaking library API:Repository::clear_git_commands_cacheandRepository::git_commands_cache_countremoved;worktrunk::copy::copy_dir_recursivenow takes 4 parameters instead of 3 andworktrunk::copy::copy_leafnow returnsResult<Option<u64>>instead ofResult<bool>to thread the progress reporter.) (#2407, #2420) -
Repository::root()no longer caches the fallback path for callers outside any work tree, dropping the dedicatedprewarm_is_insidesentinel cache —worktree_roots.contains_key(path)is now a reliable "path is inside a work tree" signal. No external behavior change. (#2390) -
MSRV bumped from 1.93 to 1.94 following the latest stable − 1 policy. (#2423)
-
Claude Code plugin now uses the commit SHA for versioning: The static
version: 1.0.0in the plugin manifest hadn't moved despite ongoing changes to skills and hooks. Removing it lets Claude Code use the commit SHA, so every commit becomes an update for installed users. (#2402) -
Docs-sync pipeline simplification:
--help-pageplain/web paths unified behindPageMode(#2412); blank-line corruption in mixed$ cmd + outputblocks fixed at the root inconvert_dollar_console_to_terminaland theMARKER_OPEN_PREFIX/MARKER_CLOSEconstants extracted (#2417, #2418); three sync tests collapsed intotest_docs_are_in_syncand dead inner snapshot wrappers stripped (#2419); mirrored close form retired in favour of bare with atest_no_nested_auto_generated_markersinvariant guard (#2422); two more sync helpers aligned with the per-file error channel (#2427);write_trackedhelper extracted and 14 auto-generated outputs markedlinguist-generated=trueso PR diffs collapse them (#2409).running-tendskill leads bug-triage asks withwt -vv <command>so a single gist URL replaces multi-step diagnostic chains (#2415, thanks @viicslen for the feedback in #2410). -
CiBranchName::from_branch_reftakes&BranchRefinstead of(&str, bool), removing the historical "string from one source, bool from another" footgun. (#2391)
Install worktrunk 0.45.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.45.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.45.0/worktrunk-installer.ps1 | iex"; git-wt config shell installInstall prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.45.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