Skip to content

0.77.0

Latest

Choose a tag to compare

@github-actions github-actions released this 08 Sep 22:12
0683ad8

Release Notes

Improved

  • wt list sizes and aligns its columns to the terminal width: one long branch name no longer sizes the Branch column for every row — it caps at 32 characters and elides, so a narrow terminal keeps its other columns instead of degenerating into a branch list. Remote⇅ stops holding blank space open in a repo with no remote, and alignment now follows the value type. --format=json still carries the whole name. (#3998)

  • wt list names what it hid and marks detached worktrees: the summary reads hidden: Path, Commit instead of counting columns, a detached worktree shows rather than borrowing , and a prunable row leaves its cells blank instead of showing loading dots that never resolve. (#3998)

  • wt list --format=json gains a marker field and stops reporting detached twice: the branch marker set by wt config state marker is now readable without parsing it out of symbols, and state no longer reports a detached worktree as branch_worktree_mismatch — the sibling detached boolean carries it. (#3998)

  • wt list --format=json now defaults to schema 2: callers get the envelope with repository metadata and orthogonal per-item facts without configuring [list] json-schema. wt list statusline --format=json follows the same key. Set json-schema = 1 to retain the original bare-array format. (Breaking.) (#4038)

  • wt config show fails on a broken config: it exits 1 on an unreadable or invalid config, an invalid [list] columns, or an invalid approvals.toml. Unknown keys and deprecations stay warnings and still exit 0. A new APPROVALS section counts project commands awaiting approval. (Breaking: it always exited 0 before.) (#3999)

  • Config migration output names its destination: wt config update --output <path> writes the migration artifact to that file instead of applying it in place, and --output=- writes it to stdout. Output mode includes project config when run from a linked worktree. (Breaking: --print was removed.) (#4021)

  • Pi joins the agent integrations: wt config plugins pi install writes an activity hook to ~/.omp/agent/hooks/pre/worktrunk.ts, so Pi sessions show 🤖/💬 markers in wt list like Claude Code, Codex, OpenCode, and Gemini. $PI_CONFIG_DIR, $PI_CODING_AGENT_DIR, and named $OMP_PROFILE/$PI_PROFILE profiles are honored. Docs (#3594, thanks @adity982, and @ortonomy for the request)

  • wt config plugins codex install installs the plugin too: it previously registered the marketplace and left you to run /plugins in Codex yourself. Uninstall follows for both Codex and Claude Code, removing the plugin and then the marketplace, so the two commands are inverses. (Breaking: Codex uninstall previously left an installed plugin alone; Claude uninstall now also removes the marketplace.) (#4019)

  • wt step copy-ignored says whether it reflinked or copied: the summary now reads (reflinked, no extra disk), (full copy), or a partial count, so the same 29.5 GB line distinguishes a free copy from one that actually wrote the bytes. --format=json gains reflinked and written. (#4025)

  • wt config update removes keys its destination cannot hold: migrating [select] or [commit-generation] drops keys the new section has no field for, reporting each one. Otherwise the key landed at a path the user never typed and warned on every command, with no way to clear it. (#3994)

Fixed

  • A failed wt switch pr:<n> against a fork no longer deletes a branch it didn't create: the rollback force-deleted the branch on any setup error, including the one case where the branch wasn't its own — a pre-switch hook or a concurrent session claiming the name in the window after the forge answered. Branch and worktree are now created in one git worktree add -b, which writes nothing when the name is taken. (#3984)

  • Codex on Windows: the activity hooks no longer fail on every event: each hook led with a bare bash, which cmd.exe resolves to the WSL launcher rather than Git Bash, so every event raised a Hook failed banner. Hooks now run wt.sh through a shim that finds Git Bash by path. (#4008, fixes #4007, thanks @McNultyyy for reporting and diagnosing)

  • Templates leave branch unset in a detached worktree: aliases and hooks rendered {{ branch }} as the literal HEAD, which git resolves, so an unguarded template ran against the wrong ref — the reported case ended in git push origin --delete HEAD, which git refused. base and target follow. (Breaking: an unguarded {{ branch }} now errors.) (#4010, fixes #4009)

  • The OpenCode plugin loads under OpenCode 2: OpenCode 2's loader dropped the old bare-function export silently, so activity markers stopped appearing. The plugin now exports one object carrying both the v2 setup and v1 server entry points, and spawns wt through node:child_process rather than the Bun shell. Re-run wt config plugins opencode install to pick it up; the one file covers OpenCode 2 and OpenCode 1.16 or later. (#4018, thanks @pragmaticivan for the request)

  • wt step commit --branch builds its prompt from the worktree being committed: prompt-building git plumbing ran in the invoking worktree, so with nothing staged there the generated message described none of the changes it committed. wt step relocate --commit had the same bug, and --dry-run/--show-prompt now preview the worktree --branch names. (#3996)

  • LLM commit messages keep diffs for quoted paths: a file whose name git quotes in the diff --git header — any non-ASCII name under the default core.quotePath — had its whole diff section dropped from the prompt once the diff exceeded the 100 KB budget. (#4041)

  • An unparsable user config is reported, not a panic: wt config show --format=json and --full, plus wt step prune, relocate, eval, and for-each, panicked on a debug build and printed a bare ✗ Command failed on a release one. They now report ✗ Failed to load config with the parser's caret diagram. (#4002)

  • wt switch --execute names the directory the program actually starts in: the Executing (--execute) @ … header rendered the worktree the background hooks run in, not the program's own directory — which differs under --no-cd or a switch from a subdirectory. The path is omitted when the shell already stands there. (#4043, fixes #4042, thanks @yajo for reporting)

  • wt config plugins claude|codex uninstall is safe to re-run: removing an already-absent marketplace reported a failure, and a Claude uninstall that removed the plugin and then failed left the marketplace with no way to clear it. Both now finish a half-done uninstall and succeed when there is nothing left to remove. (#4033, #4034)

  • wt config state marker set and clear no-op outside a git repository: they exited 1 with a git error, so an agent plugin running outside a repository printed one every turn (the hook's || true kept the session going). (#3981, thanks @mahirhir)

  • wt list produces output in a bare repo with no worktrees: it printed nothing at all and exited 0. It now reports ○ No worktrees with a hint, --branches lists the branches, and --format json emits the envelope with an empty items. (#3992)

  • wt list warns when it can't parse the project config rather than ignoring it silently; the listing still succeeds. (#3993)

  • Relayed command output no longer prints ahead of the delayed-stream progress line, and delayed-stream output routes through anstream so color is stripped consistently when redirected. (#4037, #3995)

  • A hook filter that matches nothing names the unconfigured source, rather than reporting no match without saying which source was empty. (#3997)

Documentation

  • wt hook says that post-* hooks from the two sources run concurrently, so dependent commands belong in one source; wt merge records that post-commit can't run when the merge removes the worktree it anchors on. (#4020, #4026)

  • wt step help pages describe what the commands actually do: wt step prune says it removes branches as well as worktrees, wt step copy-ignored documents --from/--to, wt step commit documents --branch, and both it and squash document their hooks and no-LLM fallback messages. (#3997)

  • The FAQ lists the files Worktrunk writes outside its own config: OpenCode's plugin, Pi's hook, and the Claude Code settings.json statusline entry, alongside the existing inventory of what Worktrunk creates and deletes. The Claude and Codex plugin installs write nothing themselves. (#4036)

  • wt step copy-ignored documents its disk-space benefit per filesystem, and the bare-repo worktree-path example names the bare repo's own location. (#4022, #4006)

  • Terminal examples on the docs site fit a desktop window rather than overflowing. (#4039)