Repository navigation
worktrunk 0.49.0 - #281864
Merged
Merged
worktrunk 0.49.0#281864
Conversation
bevanjkay
approved these changes
May 10, 2026
Contributor
|
🤖 An automated task has requested bottles to be published to this PR. Caution Please do not push to this PR branch before the bottle commits have been pushed, as this results in a state that is difficult to recover from. If you need to resolve a merge conflict, please use a merge commit. Do not force-push to this PR branch. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Created by
brew bumpCreated with
brew bump-formula-pr.Details
release notes
New
codename(n)template filter: Produces deterministic friendly names from any input string —codename(1)returns a noun,codename(2)returnsadjective-noun, higher counts add more adjectives. The pool is large enough (~1.26M combinations forcodename(2)) that the result usually stands alone as a worktree leaf, e.g.worktree-path = "{{ repo_path }}/../{{ repo }}.{{ branch | codename(2) }}". (#2641, thanks @endigma)Picker preview disk cache: The
wt switchpicker now caches Log, BranchDiff, and UpstreamDiff previews to disk under.git/wt/cache/picker-preview/, keyed by SHA + width, so repeat invocations skip thegit log/git diffsubprocesses they already paid for. The Log cache splits SHA-deterministic raw output from the dim/bright styling that depends onmain's position, and a background refresh worker rewrites stale entries after every disk hit so the next visit sees up-to-date ref decorations. State integration bundles the new cache with the existing git-commands cache forwt config state get/state clear --all. (#2628, #2646)Picker fans out fewer
git rev-parsecalls:compute_branch_diff_previewpreviously forkedgit rev-parse <default_branch>once per item to key its disk cache. A newRepository::default_branch_sha()reads the SHA from the already-cached branch inventory, collapsing N redundant subprocesses down to one. (#2658)"X has uncommitted changes" errors now list the dirty files:
GitError::UncommittedChangescarries the porcelain lines fromgit statusand the renderer prints them between the title and hint, so users hitting the error onwt remove,wt mergecleanup,wt step promote, orwt merge --no-commitsee exactly what's blocking without re-runninggit status. No new git subprocesses —is_dirty()was already runninggit status --porcelainand discarding the output. (Breaking:GitError::UncommittedChangesgained adirty_files: Vec<String>field.) (#2653)Fixed
wt switchintegrates withcdaliases like zoxide: Previously the shell wrapper invoked thecdshell function directly, so users withcdaliased to__zoxide_zor similar sawzoxide: no match foundwhen switching to a fresh worktree. The bash and zsh wrappers now usebuiltin cdto bypass the alias. Fixes #2643. (#2644, thanks @xkumiyu for reporting)Empty hook tables no longer panic during
wt switch --create: A config like[post-start]with no entries below it would crash the backgroundHookAnnouncerpath. The config layer now treats an empty hook table as zero steps. Fixes #2634. (#2635, thanks @topit for reporting)Repositoryaccessors no longer leak the process CWD:Repository::current_worktree()resolved against the global CWD instead of the Repository's own discovery path, so callers usingRepository::at(p)(output handlers, picker, recovery, tests) silently got aWorkingTreeat the process CWD rather than atp. Five sibling sites had the same bug —project_config_path,project_config,require_current_branch,resolve_worktree_name("@"),resolve_worktree("@"). Fixed at the helper itself, replacing PR #2625's per-site workaround. (#2652)WorkingTree::is_linkedtolerates non-git CWDs: When wt's process CWD was outside any git repo (e.g. the Nix build sandbox),infer_default_branch_locallywould error out trying to callis_linkedon a non-git path. The check now returnsfalseinstead. Fixes #2624. (#2625, thanks @DArtagan for reporting)Picker no longer overlays warnings on the active TUI: Warnings emitted by
collect::collect(stale default branch, batch-fetch failure, drain timeout) used to print to stderr from a background thread while skim's TUI owned the terminal, corrupting the rendered frame and leaving fragments visible after the user picked. Warnings now stash through the picker and drain to stderr after skim releases the terminal. The drain-timeout warning is also subcommand-agnostic instead of hardcodingwt list. (#2627)Picker clears its frame on exit in inline mode: On some Linux terminals the picker's rows remained visible after pressing Enter because skim emitted an unmatched
rmcup(alternate-screen toggle) instead of an explicit erase. Setting skim'sno_clear_startoption forces the explicit erase path. (#2626)Failed
git logno longer poisons the picker's preview disk cache: When the underlyinggit logsubprocess errored, the picker still wrote the error string into the preview cache, so the next read served the stale failure instead of retrying. The write is now skipped on failure. (#2651)wt step prunesays "removing branch" for branch-only candidates: The error context wrapping everytry_removecall was hardcoded to "removing worktree for X", which misled users when prune was actually removing an orphan branch with no worktree attached. (#2619)Claude Code Windows integration uses a cross-platform wrapper: The plugin's
wtinvocation collided with Windows Terminal's built-inwt.exealias, opening Windows Terminal windows instead of running the wt CLI. A newwt.shwrapper script tries the standard Worktrunk binary names (wt,git-wt) and dispatches to the right one across pwsh, Git Bash, and WSL. (#1754, thanks @lucaspimentel)wt config plugins opencode installwrites to~/.config/opencode/on macOS: The install path fell through todirs::config_dir(), which resolves to~/Library/Application Support/opencode/on macOS — but that's OpenCode's managed settings directory; user plugins belong under~/.config/opencode/. The path now follows OpenCode's documented precedence:$OPENCODE_CONFIG_DIR > $XDG_CONFIG_HOME/opencode > ~/.config/opencode. Linux behavior is unchanged. Fixes #2654. (#2655, thanks @gwenwindflower for reporting)Documentation
pre-*hooks must be used instead ofpost-*. (#1907, thanks @alvistar)Internal
nightlyworkflow triggered by anightlyPR label, keeping the PR-blocking suite faster. (#2630, #2636, #2645, #2647, #2648)cargo-affectednow uploads itsreport.jsonas a build artifact for downstream tooling. (#2621)wt_command()defaults to an isolated tempdir so tests no longer inherit the process CWD, and thecurrent_or_recovertest was decoupled from the inherited CWD. (#2642, #2649)Install worktrunk 0.49.0
Install prebuilt binaries via shell script
Install prebuilt binaries via powershell script
Install prebuilt binaries via Homebrew
brew install worktrunk && wt config shell installDownload worktrunk 0.49.0
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 installView the full release notes at https://github.com/max-sixty/worktrunk/releases/tag/v0.49.0.