Skip to content

Tags: ofek/worktrunk

Tags

v0.65.0

Toggle v0.65.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
Release v0.65.0 (max-sixty#3351)

Release v0.65.0. Version bump plus the 0.65.0 changelog section.

**User-facing changes in this release:**

- **Picker `alt-x` flashes why a worktree wasn't removed** (max-sixty#3336,
max-sixty#3350) — the keep/failure reason now appears in the picker header
instead of only draining to stderr on exit.
- **`-vv` diagnostics consolidate on `diagnostic.md`, led by the
performance profile** (max-sixty#3329). This entry's bullet was previously
misfiled under the already-released `0.63.0` section (the PR merged
after `0.64.0` was tagged); this release moves it into `0.65.0`, where
the change actually ships, and drops a misleading "removed
`profile.txt`" clause for a file that never existed.
- **`wt remove` preserves your subdirectory position** (max-sixty#3344, closes
max-sixty#3343, thanks @caillou for reporting).

**Also included:** a fix to the release skill's reporter-finding grep —
`sort -un` on `#`-prefixed lines collapsed the whole issue-reference
list to a single entry (every line sorts as numeric 0), which nearly
dropped @caillou's credit. Now sorts on the numeric field after `#`.

The nightly cross-platform suite (full-tests linux/macos/windows,
feature-powerset, release-target, nix-flake, minimal-versions) passed
green on the cut-from tip before this PR was opened.

> _This was written by Claude Code on behalf of max_

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

v0.64.0

Toggle v0.64.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
Release v0.64.0 (max-sixty#3338)

Release v0.64.0. Folds the version bump (`Cargo.toml`, `Cargo.lock`) and
the `CHANGELOG.md` section into one commit.

A small release on top of v0.63.0: a new per-branch git-config template
namespace for `wt list` custom columns, a warm-cache `wt list` speedup,
and a few correctness/safety fixes.

**Improved**: a `{{ git.branch.* }}` template namespace lets custom
columns read a branch's own git config (`branch.<name>.jira`, the
git-native `description`) without re-storing via `wt config state vars
set` (thanks @cazador481 for the request); warm-cache `wt list` re-runs
are ~36% faster after removing redundant per-row git forks (commit→tree
priming, a persistent merge-base cache, and seeded worktree paths).

**Fixed**: refs that look like flags can no longer inject git options
(`--end-of-options` / `--` fencing across diff previews, diffstats, and
branch removal); `wt list statusline` renders untruncated when
`COLUMNS=0` instead of collapsing to an empty line; the watchdog "still
waiting" line uses the hint symbol (`↳`).

The release-process data-loss surface review (four independent finders
over the full `v0.63.0..HEAD` diff) found no data-loss risk introduced.
The one candidate — a new persistent merge-base cache that feeds the
branch-deletion safety verdict — was adjudicated acceptable: the
verdict's direct input (`has-added-changes`) was already a
content-addressed, SHA-keyed persistent cache before this release, so
the merge-base cache extends an accepted pattern rather than introducing
a new risk class.

> _This was written by Claude Code on behalf of max_

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

v0.63.0

Toggle v0.63.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
docs(changelog): finish the 0.63.0 entry (max-sixty#3301/max-sixty#3305/

max-sixty#3306/max-sixty#3286) (max-sixty#3309)

Completes the 0.63.0 changelog for everything that landed on `main`
during the release PR's CI windows:

- Documents [max-sixty#3301](max-sixty#3301)
(picker default view keeps collect order),
[max-sixty#3305](max-sixty#3305) (picker
branch-diff preview/summary use the upstream-aware base), and
[max-sixty#3306](max-sixty#3306) (picker
comment previews render fenced code blocks cleanly).
- Relocates the
[max-sixty#3286](max-sixty#3286) statusline
entry, which max-sixty#3286's own commit added under the already-released
**0.62.0** section (its branch predated the 0.63.0 section), up to
**0.63.0** where it ships.

> _This was written by Claude Code on behalf of max_

v0.62.0

Toggle v0.62.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
Release v0.62.0 (max-sixty#3263)

Release v0.62.0 — minor bump (`cargo semver-checks` reports a breaking
library-API change — `ListConfig.columns` added a public field, which
requires at least a minor pre-1.0 — plus many new features).

### Highlights

- **`wt switch --prs`** — browse open PRs/MRs in the interactive picker,
with a live CI/review column and `pr` / `comments` / `log` preview tabs
([max-sixty#3128](max-sixty#3128)).
[Docs](https://worktrunk.dev/switch/)
- **Interactive picker now runs on Windows**
([max-sixty#3217](max-sixty#3217)).
- **`main…±` diff column shows by default** in `wt list`; `--full` now
adds only the off-machine columns (CI status, LLM summaries)
([max-sixty#3236](max-sixty#3236)).
- **`[list] columns`** selects and orders the columns `wt list` renders
([max-sixty#3141](max-sixty#3141)).
- **`wt config state logs profile`** performance profiler
([max-sixty#3184](max-sixty#3184)).
- Picker keyboard shortcuts (copy / open / refresh) and the `Alt-x`
removal rework, fish completion-recursion fixes, `CLAUDE_CONFIG_DIR`
support, and more.

**Breaking:** in the picker, remove moved from `Alt-r` to `Alt-x`
(`Alt-r` now refreshes).

Two "Still waiting" entries
([max-sixty#3178](max-sixty#3178),
[max-sixty#3183](max-sixty#3183)) were moved
here from 0.61.0 — they landed after the v0.61.0 tag, so they ship in
0.62.0.

The changelog also documents the `Alt-x` removal rework
([max-sixty#3262](max-sixty#3262)); the tag
will be placed on the `main` tip that includes both this release commit
and max-sixty#3262.

Full notes in the `CHANGELOG.md` diff. Data-loss surface review of the
cumulative diff in progress; the keyword pass came back clean (the new
`Alt-x` removal uses safe variants — `SafeDelete`, no force,
approval-gated).

> _This was written by Claude Code on behalf of max_

v0.61.0

Toggle v0.61.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
Release v0.61.0 (max-sixty#3151)

v0.60.0

Toggle v0.60.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
Release v0.60.0 (max-sixty#3127)

Release v0.60.0 (minor bump from 0.59.0).

Minor because semver-checks flagged a breaking library-API change and
five new features landed since v0.59.0. The data-loss surface review (4
independent finders) cleared the one change that touches it (relocating
dirty linked worktrees, max-sixty#3104).

### Improved
- Package installs now complete branch/worktree names via dynamic
registration (max-sixty#3105, thanks @bendrucker)
- `wt step relocate` moves dirty linked worktrees (max-sixty#3104, thanks
@lunaynx for reporting)
- `--dry-run` previews print to stdout (max-sixty#3085)
- Picker gutter distinguishes local (`/`) and remote (`|`) branches
(max-sixty#3115)
- `wt list --format=json` gains structured `repo`/`ci.repo` metadata
(max-sixty#3021, thanks @jeremy0dell)
- `wt step eval --format=json` (max-sixty#3106)
- `--format=claude-code` rejected on `wt list` / `wt config state get`
(max-sixty#3116)

### Fixed
- `cargo install worktrunk` builds from crates.io again (max-sixty#3124, fixes
max-sixty#3123, thanks @kerrickstaley for reporting)
- Tab-completion works in repos with no commits (max-sixty#3097, closes max-sixty#3094)
- `wt config state get ci-status --format=json` honors
`[forge].platform` (max-sixty#3120)

### Documentation
- `wt list --help` example tables fit the terminal (max-sixty#3125)
- `/wt-switch-create` cross-repo handling reworked (max-sixty#3118)
- Help-text and web-doc refinements (max-sixty#3096, max-sixty#3108, max-sixty#3110, max-sixty#3112, max-sixty#3126)

Full notes in `CHANGELOG.md`.

> _This was written by Claude Code on behalf of max_

v0.59.0

Toggle v0.59.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
Release v0.59.0 (max-sixty#3100)

Release v0.59.0 (minor). The bump is minor because two
backward-incompatible behavior changes ship: in the `wt switch` picker,
`1`–`5` no longer switch preview tabs (digits now filter; tabs move to
`Alt-1`–`Alt-5` / `Tab`); and `wt step eval --dry-run` is removed in
favor of `-v`. `cargo semver-checks` reports no library API breakage.

### Highlights

- **Improved**: picker frees digit keys for filtering (preview tabs to
`Alt`); squash templates use `commit_details` instead of the deprecated
`commits`; `wt step eval -v` lists template variables.
- **Fixed**: picker no longer freezes on the first keystroke with many
worktrees (max-sixty#3087, thanks @bendrucker; fixes max-sixty#2926, thanks @mahume for
reporting); tab-completion covers all hook types; Ctrl-C on a concurrent
alias reports the right exit code.

See `CHANGELOG.md` for the full set.

### Bundled test fix

This PR also carries one non-release commit: `test(ci_status): cover '?'
worker-thread label in snapshot filter`. The
`test_list_full_with_invalid_configured_platform` snapshot filter only
normalized `[a-zA-Z]` worker-thread labels, but `label_for_thread_index`
emits `?` for thread IDs above 52. On high-core machines the rayon pools
span enough threads to hit that, so the gate failed locally (CI's low
core count never triggers it). The filter now covers the full label
alphabet. Test-only; not in the changelog.

> _This was written by Claude Code on behalf of max_

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

v0.58.0

Toggle v0.58.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
Release v0.58.0 (max-sixty#3067)

Release v0.58.0.

Highlights since v0.57.0:

- **Table-form `pre-*` hooks run concurrently** (max-sixty#3052) — completes the
cut-over announced in v0.37.0. Breaking for configs relying on serial
ordering; pipeline form (`[[pre-merge]]`) stays serial.
- **CI column shows the PR/MR number and review state** (max-sixty#3041, max-sixty#3044) —
`wt list --full` and the statusline show the open PR/MR reference
colored by CI status, with review state folded in.
- **Hooks/aliases share one lazy template model** (max-sixty#3042, max-sixty#3047) —
templates render per-step; `{{ vars.* }}` reads fresh.
- **`wt config state cache`** (max-sixty#3027) — consolidates regenerable caches;
`state clear` now confirms first.
- Statusline rate-limit display, `/wt-switch-create` optional branch
name, plugin worktree-hook hardening, and a batch of config-deprecation
and snapshot-determinism fixes.

Full notes in `CHANGELOG.md`.

The release tag is pushed to the squash-merge commit after this lands;
`release.yaml` then publishes to crates.io, Homebrew, and winget.

> _This was written by Claude Code on behalf of max_

v0.57.0

Toggle v0.57.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
Release v0.57.0 (max-sixty#3022)

v0.57.0.

`cargo semver-checks` reports breaking library API changes: the squash
refactor (max-sixty#2983) renamed `Repository::commit_subjects` to
`commit_message_details`, and the new `GitError::UnbornDefaultBranch`
variant (max-sixty#2990) shifts the discriminants of the exhaustive `GitError`
enum. Neither is intentional public API, but together they force a minor
bump pre-1.0.

## CHANGELOG

### Improved

- **`wt step diff --branch`**: `wt step diff` gained a `-b`/`--branch`
flag, mirroring `wt step commit`, so the diff can target another
worktree's branch without leaving the current one. The branch must have
a checked-out worktree.
([max-sixty#2995](max-sixty#2995))

- **Squash templates can use commit bodies**: The squash commit-message
template gains an experimental `{{ commit_details }}` variable — a list
of `{ subject, body }` objects for the commits being squashed —
alongside the existing `{{ commits }}` (now documented as the commit
subjects). Templates can incorporate full commit bodies, not just
subject lines.
([max-sixty#2983](max-sixty#2983), thanks
@florianilch)

- **Recommended Claude Code commit command drops the `CLAUDECODE=`
prefix**: Claude Code removed the nested-session check that rejected
`claude -p` launched from inside another session, so the workaround is
gone. The recommended `[commit.generation]` command shown by `wt config
create` no longer carries a leading `CLAUDECODE=`, and `wt` no longer
strips `CLAUDECODE` from the environment before running
commit-generation commands.
([max-sixty#2979](max-sixty#2979))

### Fixed

- **Nushell wrapper installs where Nushell actually autoloads it**: `wt
config shell install nu` wrote `wt.nu` to
`$nu.default-config-dir/vendor/autoload`, which Nushell never autoloads
— on Linux the wrapper was written but silently never loaded, so `wt`
was never wrapped (it happened to work on macOS/Windows by coincidence
of path layout). It now installs to `$nu.vendor-autoload-dirs | last`,
and install/uninstall clean up any worktrunk wrapper stranded at the old
location. ([max-sixty#2992](max-sixty#2992),
thanks @nnutter for reporting)

- **Claude Code hooks work for Fish shell users**: The plugin's hook
commands used `${CLAUDE_PLUGIN_ROOT}` brace syntax, which Fish doesn't
expand; they now use `$CLAUDE_PLUGIN_ROOT`, so the activity and
worktree-lifecycle hooks fire correctly under Fish.
([max-sixty#2962](max-sixty#2962), thanks @amw)

- **Pager no longer wedges the terminal on Ctrl-C (Windows)**:
Interrupting the `--help` pager (`less`) with Ctrl-C on Windows could
leave the terminal in a broken state; `less` now quits cleanly on
interrupt. ([max-sixty#2969](max-sixty#2969),
thanks @ofek for reporting)

- **Clearer error when the default branch has no commits**: In a freshly
initialized repo whose default branch is unborn,
`merge`/`rebase`/`squash`/`push` (and the diff report) failed with
`Default branch main does not exist locally` plus a misleading hint to
reset the cached value. They now report that the branch has no commits
yet, without the wrong cache-reset suggestion.
([max-sixty#2990](max-sixty#2990))

- **`diagnostic.md` uploads as a gist again**: The `-vv` diagnostic
report inlined raw NUL bytes from NUL-separated git output, so `gh gist
create` rejected it as a binary file. Control bytes in the subprocess
preview are now escaped.
([max-sixty#2991](max-sixty#2991))

- **`wt list` tolerates a missing index file**: A repo with no
`<gitdir>/index` (nothing ever staged) made the temp-index probe fail; a
missing index is now treated as an empty one, matching git's own
behavior. ([max-sixty#2884](max-sixty#2884))

- **Inline code renders in `--help` section headings**: Terminal
`--help` showed literal backticks in headings authored with inline code
(e.g. the `wt config state logs` heading `Command log
(`commands.jsonl`)`). Headings now reduce inline code to plain text
under the heading's uniform style. The `--stage`/`--dry-run` subsection
headings in `wt step commit`/`squash` were also renamed to sentence case
("Staging", "Dry run").
([max-sixty#3003](max-sixty#3003))

### Documentation

- **`wt switch` docs give forge PR/MR URLs equal billing with
`pr:`/`mr:`**: The switch docs now present the full forge-URL form
alongside the `pr:N` shortcut.
([max-sixty#2970](max-sixty#2970))

- **New FAQ entry on moving uncommitted changes to a new worktree**.
([max-sixty#3002](max-sixty#3002))

### Internal

- **Bare-repo prompt opt-out stored as a hint**:
`worktrunk.skip-bare-repo-prompt` moved under the `worktrunk.hints.`
namespace, so it now lists under `wt config state hints` and clears with
`wt config state clear` (previously a top-level key that escaped both).
Clean cutover: users who already opted out are re-prompted once on their
next `wt switch --create` in a dotted-name bare repo.
([max-sixty#3001](max-sixty#3001))

> _This was written by Claude Code on behalf of max_

v0.56.0

Toggle v0.56.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
Release v0.56.0 (max-sixty#2967)

v0.56.0.

`cargo semver-checks` reports a breaking library API change: the config-deprecation refactor (max-sixty#2946) replaced the public `Deprecations` struct with a `Vec<DeprecationKind>` alias, removing the struct shape. Not intentional public API, but it forces a minor bump pre-1.0.

## CHANGELOG

### Improved

- **`wt list` JSON output includes `repo_url`**: Each item now carries `repo_url`, the repository's web URL derived from the primary remote (absent when there's no parseable forge remote). It's the local checkout's repo — distinct from `ci.repo_url`, which is the repo a PR/MR targets. ([max-sixty#2941](max-sixty#2941), thanks @bendrucker)

### Fixed

- **Bare-repo prompts**: Two UX fixes. `wt config create --project` run in a bare repo with no linked worktrees now explains the next step (`wt switch <branch>` first, then create from inside the worktree) instead of failing with a generic "no worktree found". And the bare-repo worktree-path prompt no longer fires for symbolic identifiers (`-`, `@`, `^`, `pr:`/`mr:`), where the example paths would be misleading — it waits for the next switch to a concrete branch name. ([max-sixty#2951](max-sixty#2951), thanks @ammachado)

- **Context gauge spacing in the Claude Code statusline**: The context-gauge moon emoji rendered flush against the percent (`🌕42%`). Most terminals draw the emoji double-width and bleed it into the next cell, so the moon collided with the digits; it now carries a trailing space (`🌕 42%`). ([max-sixty#2944](max-sixty#2944))

- **Console storm on Windows**: Detached background hook processes were created with `DETACHED_PROCESS`, which could flash a burst of console windows. They now use `CREATE_NO_WINDOW` and spawn fully hidden. ([max-sixty#2959](max-sixty#2959), thanks @nathanbabcock)

### Documentation

- **Codex commit-generation model bumped to `gpt-5.4-mini`**: The recommended `[commit.generation]` command for Codex — shown by `wt config create` and in the LLM-commits docs — now uses `gpt-5.4-mini` (was `gpt-5.1-codex-mini`). ([max-sixty#2949](max-sixty#2949))

### Internal

- **Config-deprecation layer refactor**: The deprecation detector now returns a `Vec<DeprecationKind>` instead of a struct of per-field flags, and the per-section config-table walks collapse into two combinators. Behavior-neutral — warning text and migration output are byte-for-byte unchanged. ([max-sixty#2946](max-sixty#2946))

> _This was written by Claude Code on behalf of max_