Skip to content
gwmgwmgwmv1.10.0

v0.6.0

Promotes v0.6.0-rc.1 to stable and bundles four additional feature PRs (#70, #72, #74, #76) merged on dev after the RC was cut. The RC’s gh-linking work and the four new TUI feature PRs ship together under 0.6.0.

  • Issue / PR linking (#68, closes #67) - first-class link between a worktree, its branch, and the GitHub issue / pull request it serves. Carried forward from v0.6.0-rc.1.
    • CLI - gwm link {issue|pr} <N> writes git config branch.<name>.gwm-issue / gwm-pr (local, per-branch, survives worktree moves). gwm unlink {issue|pr} removes the explicit override. gwm open {issue|pr} [--print-url] spawns the OS opener on the linked URL. gwm status [--json] shells out to gh issue view / gh pr view to fetch state, title, labels, and CI rollup; degrades gracefully to local-link-only output when gh is missing.
    • TUI - O opens the issue/PR menu, L runs a two-stage link prompt (target → digits), F refreshes the GitHub status (was R pre-#75 - rebound to free R for the new review launcher).
    • Auto-detect - branches following the <type>/#<N>-<slug> convention derive the issue number automatically.
  • TUI Details sidebar redesign (#69, PR #70) - the right pane is now four independent rounded-border subsections (Worktree / Issue / PR / Working Tree / Recent Commits) instead of one big Details block. Section titles live on the block borders so the inline Basic Settings: / Recent commits: / Working tree: content lines are gone. The outer Details frame is dropped to reclaim vertical space.
  • TUI Recent Commits panel - lazygit-style layout (#71, PR #72) - each commit occupies exactly one visual line (was wrapping onto two on long subjects), and the block fills the available height instead of showing a hardcoded 10 entries. Per-row format mirrors lazygit: <8-char hash> <author initials> <node> <subject>, where <node> is ○ for a normal commit and ◎ for a merge commit. Subjects are hard-clipped at the panel’s right edge; a right-aligned footer <viewport-bottom> of <total> lives at the bottom of the block. Default buffer is 300 commits (matches lazygit’s initial git log -300). Includes the full graph topology renderer - vertical pipes │, corners ╮ ╭ ╯ ╰, junctions ┴ ┬, horizontal strokes ─ - driven by a Rust port of lazygit’s pkg/gui/presentation/graph/ package; linear history collapses to a single ○-stack column, merges spawn fresh columns to the right, and the algorithm is width-deterministic on the commit list (independent of terminal width).
  • TUI sidebar lazygit-style facelift (#73, PR #74):
    • New Created row in the Worktree block showing the branch’s age in compact relative form (2d, 3w, 1M, …), colour-coded by freshness (green < 7d, yellow < 30d, dark gray otherwise).
    • Branch name is now coloured by BranchStatus - worst-state wins: dirty → red, ahead/behind → yellow, unpublished → magenta, synced → green, unknown → dark gray. Applies to both the sidebar header and the table BRANCH column.
    • Sidebar header line is now prefixed by a ● status dot whose colour tracks the linked PR / issue state (open=green, draft=gray, merged=magenta, closed=red); rebuilt fresh every frame so it follows live gh fetch state without invalidating the git-preview cache.
  • [tui.open] config section + OpenTarget dispatch for the o key (#73). mode accepts "shell" (default, lazygit-style $SHELL in the worktree), "editor" ($EDITOR <path>), or "finder" (pre-#73 OS file manager). shell_cmd / editor_cmd override the env var when set.
  • New y keybinding (#73) - yank the selected worktree’s path to the system clipboard (pbcopy / wl-copy / xclip / xsel / clip). Missing tool surfaces a clear status hint, no crash.
  • TUI configurable launchers for l (git_tui) and R (review) (#75, PR #76). Two new .gwm.toml sections - [git_tui] and [review] - drive the worktree-list l / R keybindings through a shared launcher pipeline (placeholder expansion {base} {head} {path} {diff}, shell-words split, optional fullscreen suspend-and-resume). [git_tui] defaults to lazygit -p {path} fullscreen so existing repos see zero behaviour change. [review] accepts either a free-form command = "<shell line>" or a tool = "<preset>" sugar (lumen, claude, codex, aider, gh). New branch.<n>.gwm-base key, set by gwm create, anchors the review base-resolution chain (upstream → gwm-base → [review].default_base → dev → main). The {diff} placeholder lazily materialises a tempfile holding git diff {base}..{head} - only when the template references it.
  • TUI keybind reshuffle (#75): f now refreshes the worktree list (was r, kept as alias for muscle memory); F refreshes the GitHub issue/PR status (was R pre-#75); the freed R triggers the new review launcher.
  • Default behaviour of o: open changes (#73). It used to spawn the OS file manager unconditionally; now it spawns $SHELL in the worktree by default. Opt back into the old behaviour with [tui.open] mode = "finder" in .gwm.toml.
  • gwm doctor now probes the configured [review] and [git_tui] binaries against $PATH (#75). A missing review tool surfaces as Warning (exit code 1), never Failed (2) - review is opt-in, so a CI pre-commit hook keeps passing when only the local launcher is unavailable.
  • TUI footer / help overlay updated to reflect the new o:open, y:yank, l:git_tui, R:review, f:refresh, F:gh bindings.
  • src/github.rs::trim_git_suffix (carried forward from v0.6.0-rc.1, originally PR #68 Copilot review) - https://github.com/owner/repo.git/ previously left .git in the parsed slug because the trailing / made strip_suffix(".git") fail. The fix normalises trailing slashes first, then strips the suffix.
  • src/tui/app.rs selection-change handling (#68 follow-up) - next / prev / first / last / filter typing / refresh now re-resolve the cached link & slug. The right-panel Issue/PR block previously showed stale data from the previously selected worktree.
  • src/tui/app.rs::refresh_github_status (#68 follow-up) - the status bar no longer claims "github status refreshed" when one or both gh fetches errored. The new report_github_refresh_status helper picks a precise message based on each side’s GitHubFetchState.
  • Commands: cheat-sheet from the Details sidebar (#69) - the 15-line keybindings list duplicated the ? help overlay and pushed the Issue / PR block off-screen on common terminal sizes. Press ? for the full key map.
  • skills/SKILL.md refresh - the bundled gwm Skill is updated to match the new 0.6.0 surface: configurable launchers ([git_tui] / [review]), [tui.open] dispatch modes, y: yank, the o / f / F / R rebind table, and the new sidebar layout. Also corrects the launcher concurrency wording (non-fullscreen launchers run synchronously, not “in the background” - aligned with the src/tui/mod.rs::run_launcher docstring caught by Copilot on PR #76).
  • User docs restructured into a docs/ tree (#77) - the previously-inline README reference (TUI keymap, sidebar, CLI surface, .gwm.toml schema, doctor, completions) is migrated into seven structured sections under docs/ (Getting Started, TUI, CLI, Configuration, Integrations, Development, Roadmap). Pages use Nuxt Content conventions (numeric prefixes for sidebar order, frontmatter title/description), so the tree is ready to drop straight into a future static-site build. The README is reduced to a 77-line landing page that links into docs/.
  • README.md - shrunk to a landing page (install matrix, 30-second tour, feature bullets, documentation map). The pre-v0.6 reference content moved into docs/.
  • Add serde_json = "1" for parsing gh CLI JSON output (carried forward from v0.6.0-rc.1).
  • Add shell-words and tempfile (#75) for launcher placeholder tokenisation and lazy {diff} materialisation.
  • Add which (#75) for $PATH probing of launcher binaries in gwm doctor.