v0.52.0
max-sixty/worktrunkv0.52.0May 19, 2026by github-actions[bot]
Upgrading?
Release notes summary
This release introduces a new experimental `[experimental]` operation called `wt step tether` to manage process groups and signals. It also adds support for the Gemini CLI extension and fixes race conditions in project hooks and Windows file locking.
Key Highlights
- New `wt step tether` command for process group management
- Gemini CLI extension support for activity tracking
- Project hooks are frozen at the approval gate
- Fixed `wt merge` commit-append gating
- Fixed Windows `.git/config` race condition in `wt step prune`
New Features
- `wt step tether` command
Full Release Notes
## Release Notes ### Improved - **`wt step tether`**: New `[experimental]` operation that runs a command in its own process group and kills the whole group when the command exits or its worktree is removed (a 250ms portable poll — `killpg` on Unix, `taskkill /T /F` on Windows). A single `post-start` hook (`wt step tether -- npm run dev`) replaces the usual `post-start`-to-launch / `pre-remove`-to-stop pair, and unlike `pre-remove` it also cleans up after a `git worktree remove`, an `rm -rf`, or a crashed hook — the leak path that eventually saturates macOS `fseventsd`. Arguments after `--` run directly with no shell, matching `wt step for-each`. ([#2785](https://github.com/max-sixty/worktrunk/pull/2785)) - **Gemini CLI extension**: Worktrunk now ships a Gemini CLI extension for `wt list` activity tracking, installable with `gemini extensions install max-sixty/worktrunk`. The extension's manifest, hooks, and skills resolve at the repo root, so the GitHub-name install path works without a local clone. ([#2803](https://github.com/max-sixty/worktrunk/pull/2803), [#2807](https://github.com/max-sixty/worktrunk/pull/2807), thanks @rafavital for the request in [#2763](https://github.com/max-sixty/worktrunk/issues/2763)) ### Fixed - **Project hooks are frozen at the approval gate**: A project-defined `pre-*`/`post-*` hook command was selected from `.config/wt.toml` twice — once to build the approval prompt, once at execution — and the operation itself mutates state between the two reads (a merge moves the target ref, an auto-rebase rewrites the feature config, a removal scrubs the worktree, `git worktree add` materializes a `--create` worktree). The second read could select a command the user never approved; on a freshly cloned repo that is unapproved code execution. The gate now freezes the command set into an immutable plan that the executor consumes verbatim, so post-operation hooks can never run an unapproved command. Behavior is otherwise unchanged, and `wt merge --no-hooks` (or a declined/empty plan) now returns before loading approvals, so a malformed `approvals.toml` no longer aborts a command that had nothing to authorize. ([#2806](https://github.com/max-sixty/worktrunk/pull/2806)) - **Declining the `wt merge` commit-append no longer skips hooks**: When a project's `pre-merge`/`post-merge` hooks were already approved, `wt merge` bundled the commit-message append into the same prompt; declining the lone append prompt skipped every hook for that run even though the user only meant to skip the append. The append is now gated on its own path (the same one `wt step commit`/`wt step squash` use), so declining it drops only the append. On a fresh repo where both the hooks and the append are unapproved this is now two prompts instead of one bundled prompt. Decline messages are also canonicalized across `merge`, `remove`, `prune`, and `switch` (`Commands declined, … without hooks`). ([#2802](https://github.com/max-sixty/worktrunk/pull/2802)) - **Windows `wt step prune` `.git/config` race**: `wt step prune` could intermittently fail on Windows with `unable to access '.git/config': Permission denied` — its parallel branch-integration checks read `.git/config` while an inline `git branch -D` rewrote it via git's lockfile rename, which on Windows briefly blocks concurrent readers. Branch-integration reads are now excluded from overlapping the `git branch -D` that rewrites config. ([#2808](https://github.com/max-sixty/worktrunk/pull/2808)) ## Install worktrunk 0.52.0 ### Install prebuilt binaries via shell script ```sh curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-sixty/worktrunk/releases/download/v0.52.0/worktrunk-installer.sh | sh && wt config shell install ``` ### Install prebuilt binaries via powershell script ```sh powershell -ExecutionPolicy Bypass -c "irm https://github.com/max-sixty/worktrunk/releases/download/v0.52.0/worktrunk-installer.ps1 | iex"; git-wt config shell install ``` ### Install prebuilt binaries via Homebrew ```sh brew install worktrunk && wt config shell install ``` ## Download worktrunk 0.52.0 | File | Platform | Checksum | |--------|----------|----------| | [worktrunk-aarch64-apple-darwin.tar.xz](https://github.com/max-sixty/worktrunk/releases/download/v0.52.0/worktrunk-aarch64-apple-darwin.tar.xz) | Apple Silicon macOS | [checksum](https://github.com/max-sixty/worktrunk/releases/download/v0.52.0/worktrunk-aarch64-apple-darwin.tar.xz.sha256) | | [worktrunk-x86_64-apple-darwin.tar.xz](https://github.com/max-sixty/worktrunk/releases/download/v0.52.0/worktrunk-x86_64-apple-darwin.tar.xz) | Intel macOS | [checksum](https://github.com/max-sixty/worktrunk/releases/download/v0.52.0/worktrunk-x86_64-apple-darwin.tar.xz.sha256) | | [worktrunk-x86_64-pc-windows-msvc.zip](https://github.com/max-sixty/worktrunk/releases/download/v0.52.0/worktrunk-x86_64-pc-windows-msvc.zip) | x64 Windows | [checksum](https://github.com/max-sixty/worktrunk/releases/download/v0.52.0/worktrunk-x86_64-pc-windows-msvc.zip.sha256) | | [worktrunk-aarch64-unknown-linux-musl.tar.xz](https://github.com/max-sixty/worktrunk/releases/download/v0.52.0/worktrunk-aarch64-unknown-linux-musl.tar.xz) | ARM64 MUSL Linux | [checksum](https://github.com/max-sixty/worktrunk/releases/download/v0.52.0/worktrunk-aarch64-unknown-linux-musl.tar.xz.sha256) | | [worktrunk-x86_64-unknown-linux-musl.tar.xz](https://github.com/max-sixty/worktrunk/releases/download/v0.52.0/worktrunk-x86_64-unknown-linux-musl.tar.xz) | x64 MUSL Linux | [checksum](https://github.com/max-sixty/worktrunk/releases/download/v0.52.0/worktrunk-x86_64-unknown-linux-musl.tar.xz.sha256) | ### Install via Cargo ```sh cargo install worktrunk && wt config shell install ``` ### Install via Winget (Windows) ```sh winget install max-sixty.worktrunk && git-wt config shell install ``` ### Install via AUR (Arch Linux) ```sh paru worktrunk-bin && wt config shell install ```
Related Repositories
A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io
An open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.
Build smaller, faster, and more secure desktop and mobile applications with a web frontend.
π RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.
Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one