Repository navigation
Tags: ofek/worktrunk
Tags
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>
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>
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_
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_
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_
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>
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_
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_
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_
PreviousNext