Releases: schovi/git-treehouse
Release list
v0.12.0
New Features
Context Frames Below The Details Panel
State-driven context frames that drill into the selected row, laid out as two columns below the Worktrees panel: the left column stacks Details, Changes, and PR review; the right column is a Git context graph grown to match the left column's height. Side by side at 104 columns or wider, stacked otherwise.
- PR review frame: a roll-up of PR state, checks, and reviews, plus individual failing or running checks, change-request previews, and inline review threads. Each line is an OSC 8 hyperlink. Loaded lazily per selected row via
gh pr viewand a GraphQLreviewThreadsquery, and stays visible with a loading placeholder for open PRs. - Changes frame: a per-file churn summary for a worktree row, showing "no changes" when the worktree is clean.
- Git context frame: places the row's tip in its local history with colored ahead/behind arrows versus
mainand the remote, a two-rail diverged graph that folds back into the shared fork point, and the upstream woven in as real nodes. Renders for both worktree rows and branch-only rows (the branch tip ref stands in for HEAD; the graph loads lazily for the selected branch).
The Details panel is slimmer: neither worktree nor branch rows repeat Main / Commit / Remote / PR, since the paired frames now cover them.
Bug Fixes
- Merged PRs now render the purple merged glyph and drop the irrelevant CI glyph, matching the PR review frame.
- The
mainbranch no longer shows a PR. It is skipped when querying and when attaching, so an old or fork PR that shares the main branch's name no longer surfaces on the root row.
v0.11.0
New Features
Clean Up Merged Command
Added a palette-only batch command, Clean up merged. It scans all done rows regardless of the current filter or search: worktrees or branch-only rows merged into main, plus worktrees whose PR is merged or closed. It opens a confirmation dialog with counts for worktrees to remove and branches to delete, representative affected rows, and the exact commands that will run.
The batch stays conservative: worktree removal uses only git worktree remove (never --force), branch deletion uses only git branch -d (never -D). Only clean, unlocked, non-root, non-active worktrees are removed; dirty, locked, active, root, detached, prunable, and not-yet-loaded rows are ignored. Worktree branches are deleted only when merged into main, while PR merged/closed worktrees not merged into main are removed but keep their local branch. Approved before_delete hooks run once per removed worktree; a hook failure counts as that row's failure and skips its removal while the rest of the batch continues. Full success shows a summary; partial failure keeps a result dialog open with counts and reasons. When the batch deletes branch refs with known SHAs, the success message offers u to restore all deleted refs.
Bug Fixes
- Fixed the PR column staying silently empty on large repos. The single
gh pr listcall requestingstatusCheckRollupforced GitHub's GraphQL API to resolve CI for all 200 PRs, returning HTTP 504. The fetch is now split: a fast branch→PR mapping withoutstatusCheckRollup, and CI status fetched lazily per open PR. - Fixed the PR fetch being cancelled by a hard 2s timeout on large repos (listing 200 PRs takes ~4-5s). The timeout is now a named 15s constant.
- Fixed delete dialog errors overflowing the frame. Git delete failures now wrap across lines instead of hard-truncating, advisory git hint lines are dropped, the error block is capped, and the dialog body is clipped to the terminal height.
Improvements
- Cut initial PR latency on normal repos. When the local branch count is small (≤40), each branch is queried with
gh pr list --headin a parallel worker pool, so number, state, and CI all arrive together in ~1s instead of ~5s+. Above the threshold, the single list call with lazy CI is used to avoid a large request fan-out.
v0.10.0
New Features
Checkout PR into a worktree
A new palette-only Checkout PR command. Open the command palette (Ctrl+P) and run Checkout PR to open a centered picker that loads up to 200 pull requests via gh pr list --state all, sorted by most recently updated (open, draft, merged, and closed).
- Type to filter by PR number, title, URL, owner, head branch, or local branch name.
↑/↓ork/jmove the highlighted PR.Enterchecks out the PR into a worktree:- Existing non-prunable worktree for the branch → cd into it immediately.
- Existing local branch without a worktree →
git worktree add <path> <branch>using the normal path template, then the usual post-create steps. - New PR branch →
git fetch origin pull/<number>/head, thengit worktree add -b <branch> <path> FETCH_HEAD, then post-create steps. - On success the app cds into the worktree and exits.
- Same-repo PRs use
headRefName; fork PRs use<owner>/<headRefName>. oopens the highlighted PR in the browser (gh pr view <number> --web). If the input is a PR URL or number not in the list,Enter/oact on it directly.Esccloses the picker. There is no global keybinding for this flow.- Existing local branch reuse does not force-update the branch from the PR head.
Documentation
- Reorganized the behavior spec into
docs/architecture.mdplus per-feature docs underdocs/features/, replacing the singledocs/spec.md, and added a documentation policy.
v0.9.0
New Features
Repo-Scoped .worktree Configuration
A committed repo-level .worktree TOML schema for path template overrides, named-file copy behavior, and approved lifecycle hooks. Declarative settings apply immediately, while post_create and before_delete hooks run only after git-treehouse allow records the current hook hash in repo-local Git config. doctor now reports .worktree keys and hook approval state.
Filter Picker Modal
Tab now opens a filter picker modal instead of cycling filters in place (the palette entry is renamed from "Cycle filter" to "Open filter picker"). The modal lists every filter with its matching row count; empty filters are disabled (all is always available). Inside the picker, ↑/↓ (or k/j) move the selection, Tab jumps to the next enabled filter and Shift+Tab to the previous, Enter applies, and Esc closes.
Merged Worktree Filter
A merged filter in the cycle (all → modified → branches → merged → prunable → locked → detached) and a filter-merged palette command. It surfaces rows that are safe to clean up: clean worktrees whose branch is merged to main or whose PR is merged/closed, plus merged branch-only rows. The root repository and detached worktrees never match.
Restore Deleted Branches
After deleting a branch ref (from a branch-only row, or a combined worktree + branch delete), a green success offer appears for about 10 seconds: ✓ deleted <name> (<short-sha>) · u to restore. Pressing u recreates the ref with git branch <name> <sha>. Only the branch ref is restored, not worktree files or uncommitted changes. The offer is superseded by the next delete or refresh.
Copy PR URL Command
A palette-only command, "Copy PR URL" (copy-pull-request-url), copies the selected row's pull request URL to the clipboard with a copied PR URL: <url> confirmation. Rows without a PR flash no pull request URL for this row.
Improvements
- Responsive list columns now drop and shrink more gracefully on narrow terminals (in both the TUI and the
listsubcommand): size drops first, then commit truncates to the short SHA, then PR and age drop, while name, status, and remote always survive. The PR and size columns size dynamically to their content.
v0.8.0
New Features
Scrollbar for the worktree list
The worktree list now renders a scrollbar in a right-hand gutter when the rows overflow the visible height.
↑/↓arrows show when there is more content above or below- a
█thumb tracks the scroll position, with a│track elsewhere - the footer shows the current position as
start/total
The scrollbar only appears when the list is taller than the viewport, so short or narrow lists are unaffected.
v0.7.0
New Features
Local Branches in the List
The table can now show local branches that are not checked out by any worktree. Press b to toggle branch-only rows; the preference persists to config as show_branches (default false). The Tab filter cycle gains a branches state that surfaces branch-only rows even when the toggle is off.
show_branches = false # default: hide branch-only rows until `b` is pressedCreate a Worktree from an Existing Branch
Enter on a branch-only row opens a New worktree confirmation that uses your path_template, runs git worktree add <path> <branch>, and cds into the new worktree on success.
Checkout a Branch in the Root Worktree
c on a branch-only row checks the branch out in the root worktree, then cds into root. A clean root runs git switch -- <branch> directly. A dirty root opens a confirmation that blocks checkout until you enable stashing with s, which runs git stash push -u before switching. No force checkout or discard happens.
Branch-Only Delete
d on a branch-only row deletes just the local branch ref and never touches worktree files. Merged branches use safe git branch -d; unmerged branches require an explicit force delete with git branch -D.
Improvements
- Reworked row glyphs into a single name column with row-type icons (
⌂root,⊡worktree,⎇local branch) plus lifecycle suffixes (!locked,×prunable). The standalone marker column is gone. - The active worktree row is now bold, and row icons use softer accent colors.
yon a branch-only row copies the branch name; worktree rows still copy the absolute path.- The detail panel and footer adapt to branch-only rows with branch-specific metadata and actions.
Bug Fixes
- Fixed the delete flow feedback: deletion now shows in-progress spinner feedback, keeps the dialog open and shows the git error inline on failure, and ignores stale delete results.
v0.6.0
New Features
Command Help
git-treehouse help, git-treehouse help list, git-treehouse help init, and git-treehouse help doctor now print command-specific help. Root and subcommands also accept -h and --help.
Explicit Repository Selection
git-treehouse, git-treehouse list, and git-treehouse doctor can now load a repository or worktree path with --repo <path>, including ~ expansion.
git-treehouse list --json --repo ~/code/project-worktreeShell Integration Install Targets
The first-run installer now installs Fish, Nushell, and PowerShell integration into dedicated autoload or module files: ~/.config/fish/functions/gth.fish, ~/.config/nushell/autoload/gth.nu, and the GitTreehouse PowerShell module. Existing legacy profile installs are still detected.
Bug Fixes
- Tightened modal overlay spacing so background content above and below centered popups is preserved.
Documentation
- Added the project changelog.
v0.5.0
New Features
Faster TUI loading and enrichment
Git Treehouse now opens the app frame before slower metadata finishes loading. Local metadata, pull request status, and worktree size data fill in asynchronously so large repos feel less blocked.
Refresh feedback
Pressing r now runs git fetch --prune, keeps the current selection and visible rows stable, and shows refresh progress in the Worktrees title. Automatic refreshes stay quieter.
JSON size fields
git-treehouse list --json now includes git_size and full_size. The existing size field remains as a compatibility alias.
Improvements
- Reworked the help overlay with grouped shortcuts and marker, status, and PR legends.
- Cleaned up Details and Worktrees panel titles, border hints, and selected-row actions.
- Added an approved pull request indicator (
◆) and reduced PR-column flicker while GitHub data loads. - Changed
Escin list view to cancel or clear context. UseqorCtrl+Cto exit.
v0.4.1
v0.3.1
Changelog
- 79d5e82 feat: Refine worktree footer controls