Skip to content
gwmgwmgwmv1.10.0

v1.4.0

The ? overlay is now the complete manual. The headline of this line is help-overlay completeness (#453): every modal context - from the create form to the CI checks overlay - gets its own documented section, each verb resolved live against the user’s actual bindings, and a per-section completeness guard makes it impossible for a future modal verb to land undocumented. The review loop that hardened it went further than documentation: it pinned down a reserved-typing contract across every input sub-mode, so a key a text input legitimately consumes can no longer be bound to a modal verb (the config is rejected up front with a precise error instead of shipping a binding that types instead of firing).

The second theme closes the TUI-polish trio opened after the v1.3.0 agent work: a CI checks overlay (#436) drills into the linked PR’s per-check rollup, the Working Tree pane scrolls (#437) so large change sets stay reachable, and the sidebar heights turn responsive (#438) through a pure layout solver that guarantees every visible section a usable floor on short terminals.

  • Complete help overlay + which-key re-audit (#453, PR #456). The ? help overlay now documents every key context: one section per modal overlay (Create Form, Delete Worktree, Browse Links, Link Prompt, Command Palette, Exec Profiles, Clean Reclaim, Agent Sessions, CI Checks, Command Logs, Settings and its value editor, Bootstrap Report, the PTY escape hatch, and the overlay’s own navigation), each verb resolved live against [tui.keys.modal.<context>] so rebinds show through. The gwm switch picker’s help hides every section its modals cannot reach. A per-section completeness guard extends the #334 one to every ModalAction - a modal verb can no longer land undocumented. The statusline which-key was re-audited at the same time: exec and agents joined the worktrees footer’s act-on-worktree family, while clean / mux / macros stay overlay-only (the footer is a teaser, ? is the manual).
  • Reserved-typing contract on every input sub-mode (#453, PR #456). Hardened through the review loop: in the command palette, the link number prompt, the create form’s text fields and the Settings value editor, the input’s legitimate keys (printables, digits, Backspace) route to the field before the modal resolution - and a config that would bind a modal verb onto one of those keys is refused at load time with a precise error, instead of shipping a binding that types instead of firing (or an overlay with no exit left). Ctrl/Alt-modified strokes stay bindable everywhere; an unbound modified Backspace still erases; kitty-style shifted uppercase never counts as palette typing; AltGr characters that resolve to nothing are reinjected as input.
  • CI checks overlay (#436, PR #455). C (rebindable ci_checks) - or c while the status pane holds the focus, the same contextual dispatch as the j / k sidebar scroll - lists every statusCheckRollup entry of the linked PR: one row per check with the state icon coloured like the sidebar CI indicator, j / k to move, Enter to open the check’s details URL in the browser, / to filter, f to re-fetch the PR and refresh the rows in place, Esc to close (verbs rebindable under [tui.keys.modal.ci_checks]). Each row carries a right-aligned muted detail column with the owning workflow and the run duration (elapsed time with an ellipsis while the check is in flight), and the PR line’s CI indicator ends with the resolved key that opens the overlay (… CI passing 10/10 [c]). The per-check name, URL, workflow and timestamps are now kept when the rollup is classified, additively on PrStatus.
  • Responsive sidebar heights (#438, PR #454). The Agents, Working Tree and Recent Commits sections now share the column through a pure layout solver: natural heights while everything fits (Recent Commits absorbs the slack, as before), and on a short terminal every visible scrollable section keeps a guaranteed floor (7 lines for Working Tree, border plus 5 content rows; 5 lines for Recent Commits, border plus 3) with the remaining height split proportionally to content size - the non-scrollable Agents pane always keeps its full (bounded) height so its +N more indicator can never be clipped away. Empty sections keep their collapse behaviour; overflowing content stays reachable through the existing section scrolls, and an overflowing Working Tree paints a scrollbar on its inner right edge.
  • Working Tree scroll (#437, PR #452). With the status pane focused, J / K (rebindable as wt_scroll_down / wt_scroll_up under [tui.keys]) move an independent scroll offset over the file tree, clamped against the viewport the layout actually granted the section - on a large change set the entries beyond the pane height were simply unreachable before. The offset resets on worktree navigation and on the commits ↔ stashes mode toggle, mirroring the Recent Commits scroll contract.
  • A project logo. docs/_assets/logo.svg (dark) and docs/_assets/logo-light.svg (light) draw what the tool operates on - a trunk, a root node and two worktree nodes - on a 24 grid with square corners, in the palette the rest of the project already uses. It heads the README title through the same <picture> dark/light swap as the promo banner, and the banner now carries it beside the wordmark.
  • No workflow checkout persists the auto-injected token any more (#433, PR #451). The read-only checkouts of ci.yml (all six) and pre-release.yml (both) now set persist-credentials: false, extending the release.yml split from #429 to every workflow. The invariant is pinned per file by a YAML-parsing test, with a stricter rule than release.yml: these workflows never push, so no checkout may pass a token at all.
  • The winget-publish job (#448, PR #449). WINGET_TOKEN was never provisioned, so the guard step painted a red “publish kbrdn1.gwm to winget” job on every stable release run, and the channel is blocked upstream anyway: the initial manifest PR (microsoft/winget-pkgs#403295) sits on Needs-CLA and komac update can only update a package that already exists. winget joins the AUR, Nixpkgs and aqua as a channel fed by hand; the manual komac update recipe lives in CONTRIBUTING, and the job’s absence is pinned by a test.