Added
- A line-coverage gate.
bash bin/coverage.shreports per-file coverage and fails under 90%,
and CI enforces it on every pull request. It is a separate job frombin/check.sh, which stays
fast. Coverage went from 78.5% to 90.1%, and closing that gap found and pinned several behaviours
that were previously untested.
Fixed
- Concurrent panes no longer lose recency or archive state. Recording an open and archiving a
saved review each read their file, changed it, and wrote the whole thing back as separate steps,
so two panes acting at the same moment silently erased each other's change. Both are now a single
locked transaction, as starring already was. Every durable file also gets a unique temporary
sibling instead of one fixed name shared by every writer, which could leave a truncated file
behind. Settings and zen chrome gain the same atomic replace while keeping their existing
permissions.
Changed
-
One prefix concept, everywhere. Which prefix a key wore used to depend on where it grew up:
ctrl-sstarred a command but sent a repo to an agent,alt-ssorted in Projects but opened
Settings in the Central Menu,alt-uupdated the plugin in Projects and used a Node version in
the fnm manager, opening a workspace wasalt-where /ctrl-wthere / barewin Normal, and
the changelog answered to three different letters. Now the prefix names the kind of work, and
never the mode you are in:ctrl-<key>acts on the selected row — open it, update it, remove it, copy it, send it,
star it.alt-<key>changes the view or the app — preview, sort, clone, changelog, settings, plugin
update. It is also the heavier form of actrlverb on the same letter, such as Ports'
ctrl-xTERM andalt-xKILL.enterruns the row's primary action, withctrl-enter/alt-enteras its variants.
Every one of those chords now means the same thing in both Projects modes and on every
picker. Normal mode adds bare aliases —tvowp— always on the same letter as the
chord they shorten, and motion keeps the idiom of its mode (readline while typing, Vim while
navigating).The
spaceleader is gone. Space can only be a leader in Normal — while typing it is a
character you meant — so every verb living there was forced to change prefix with the mode, which
was the inconsistency itself.space u/space x/space c/space l/space ,/
space Uare now simplyctrl-r/ctrl-x/alt-l/alt-h/alt-,/alt-u, in both
modes.What moved, in full: open in a tab
ctrl-t→ctrl-e(Projects and AI Agents), because
herdr consumes its prefix before a pane sees the key: a binding that is somebody's prefix never
arrives at all, andctrl-tis the usual prefix for anyone carrying tmux muscle memory while
ctrl-bis herdr's own default. The open group avoids both, and nothing here may bindctrl-b
any more. Normal's bare alias follows the letter, so it ise. Then: starctrl-b→ctrl-s; send to an agentctrl-s→ctrl-a
(Projects and the Git saved-review lists); open in a workspacealt-w→ctrl-w(Projects
and AI Agents; Ports already used it); clonealt-enter→alt-l; changelogalt-c→
alt-h; delete wordctrl-w→alt-backspace, which also revives it in the Ports picker
wherectrl-whad silently killed it; and in Node Versions,alt-uuse →ctrl-enter,
alt-iinstall →alt-enter,alt-ddefault →ctrl-d,alt-xuninstall →ctrl-x.
Commands, Zen, the Git menu and the Central Menu are unchanged.Old habits are a config block away — see Remapping in
docs/keybindings.md. A Projects
override now binds into both modes at once, so it cannot reintroduce the split, and the footer
and?cheatsheet render whatever you bind. -
The Central Menu and Node Versions can be rebound. They were the only two pickers with no
[keys.*]table, so their keys were the ones nobody could move.[keys.menu]and[keys.fnm]
now work like every other picker's. -
The empty Starred tab in Commands names the key you actually have. It printed a fixed
ctrl-seven after[keys.commands] starwas remapped, sending you to a key that no longer
starred anything. -
A shift bit your terminal adds no longer loses the action. Projects weighed only ctrl and alt
when resolving a key; every other picker compared the modifier bits exactly. So one press had two
answers depending on which surface read it —shift-enterran the selected row in Projects and
did nothing in Commands, Ports, Agents, Zen, the Menu or Node Versions, and a chord arriving with
a stray shift bit missed itsctrl-action outright. Both halves now decide the same way. -
A picker action that collides with a reserved chord is now caught at build time. The shared
picker answersalt-,,alt-j,alt-k,tabandshift-tabbefore consulting a picker's own
actions, so an action declared on one of those was silently swallowed — the way Ports'ctrl-w
had quietly killed delete-word for that picker alone. Those chords are one table now, and a test
every picker runs refuses an action that claims one, takesctrl-c/ctrl-u, uses a bare letter
(which would make that character untypeable), prints a cap that is not the key it listens for, or
binds a shared action to a chord it does not carry elsewhere. -
A modified chord can no longer trigger a Git menu mnemonic. The menu matched
awhether or
not ctrl was held, soctrl-apressed one view too early would have started an all-files review
— a minutes-long read — rather than doing nothing. -
Projects and the Commands, Ports, Agents and Menu pickers scroll and filter faster. Every
visible and off-screen row was rebuilt from scratch on each frame; rows now reuse the text they
already have. Star lookups, tab counts, the name ordering, and field filters no longer redo work
per keystroke. A burst of wheel or held-key input is drawn once instead of once per event. -
Projects opens faster on machines with many repositories. Repositories with no linked
worktrees are recognised from disk instead of costing agitprocess each, the two Herdr
catalogue queries run at the same time, and a repository Inspector gathers its branch, status,
last commit, and file tree concurrently. -
Pickers with nothing loading no longer wake twenty times a second. Commands, Agents, the
Menu, and the Zen picker now idle until you press something, matching Projects and Git. -
Released binaries are built for speed rather than build time. Published archives now use a
fully optimised profile; building from a linked checkout stays as quick as it was.