Skip to content

feat(herdr): add the missing Herdr TUI keys to Herdr Desktop - #108

Merged
barbatdev merged 2 commits into
mainfrom
feat/herdr-desktop-tui-gaps
Oct 31, 2026
Merged

barbatdev merged 2 commits into
mainfrom
feat/herdr-desktop-tui-gaps

Conversation

@barbatdev

Copy link
Copy Markdown
Owner

Why

#100 brought the Herdr TUI Ctrl+A prefix keys to Herdr Desktop. Three of them still had no Desktop equivalent: the workspace picker, detach, and focusing an agent by number.

What

  • Ctrl+A w → mod.open:picker (Herdr's space/tab picker).
  • Ctrl+A q → app.hide. Desktop has no detach; terminals keep running in herdr-core, so hiding the window is the closest equivalent.
  • Ctrl+A Ctrl+1..9 → refactoria-spaces.agent-N. The refactoria-spaces mod now listens for agent-N key commands. It numbers spaces the way its sidebar shows them (this computer first, then machines by name, worktrees under their repo) and focuses the agent in space N that needs you most (blocked > done > working > idle, then most recent change). A space without agents is just shown.
  • docs/keymaps.md updated; only pane cycling, pane rename and resize mode remain unmapped.

Verification

  • herdr-app check passes for the mod, and the open windows reloaded keys.json with errors: [].
  • All three bindings were tested live in Herdr Desktop 0.1.10.

🤖 Generated with Claude Code

https://claude.ai/code/session_01A9D7phtHFYfszv6WKeXbiU

Ctrl+A w opens the space/tab picker, Ctrl+A q hides the window, and
Ctrl+A Ctrl+1..9 goes to the agent of the Nth space in sidebar order
(the one that needs you most), handled by the refactoria-spaces mod.
@barbatdev

Copy link
Copy Markdown
Owner Author

Fleet review (glm)

Lens: requirements + adversarial. The three missing TUI keys from #100 are added correctly: ctrl-a w -> mod.open:picker, ctrl-a q -> app.hide, and ctrl-a ctrl-1..9 -> refactoria-spaces.agent-N, with docs/keymaps.md updated consistently with the code. Verified against the repo: the status vocabulary in pickAgent (blocked/done/working/idle with a ?? 0 fallback) matches refactoria-agents' RANK convention, the y.seq - x.seq tie-break matches line 225 of refactoria-agents, run("pane.focus", {pane: a.pane}) is the established invocation for agents from this list, and this.ordered() / r.w.machine exist in the head file. No new keybinding collides with existing ctrl-a sequences in keys.json. Out-of-scope nits are unhandled rejection in the command loop, a possible numbering drift between spaceOrder() and the sidebar's machine grouping, and multi-instance behavior of the key listener; none has a concrete failure scenario with the evidence available.

Suggestion (1)

  • cx.notify() fires on every command, matching or not (herdr/desktop/mods/refactoria-spaces/main.js:116): cx.notify() runs unconditionally after every nextCommand() await. If nextCommand() surfaces the app's whole command stream rather than only commands addressed to this mod, every unrelated keystroke forces a Spaces re-render. Notifying only when the regex matched would keep the cost local to the feature.

Question (3)

  • Command loop has no rejection handling (herdr/desktop/mods/refactoria-spaces/main.js:113): listenKeys() runs for (;;) { const m = ...exec(await nextCommand()); ... } with no try/catch. If nextCommand() ever rejects (transport hiccup, teardown while the window closes, mod reload), the await throws, the spawn dies silently, and all nine Ctrl+A Ctrl+N keys stop working for the rest of the window's life with no visible error. What is the contract of nextCommand(): can it reject, and is the spawn cancelled when the view is dropped (or does the loop leak and keep calling this.focusAgent on a dropped view)?
  • spaceOrder() machine set can diverge from what the sidebar renders (herdr/desktop/mods/refactoria-spaces/main.js:125): The render path (line 313) builds its remote machine groups from the union of rows' machines AND this.machines names (known machines, including ones currently away or loading, still get a sidebar header via the layout/state checks at 315-317). spaceOrder() derives its machine list only from rows' r.w.machine. A known machine with zero visible rows shows a group in the sidebar but occupies no slot in spaceOrder(). If a user counts sidebar groups (headers included) to decide which number to press, the target space drifts. Does the intended numbering count only spaces, or the sidebar's visual positions including empty machine headers?
  • Per-instance key listener with multiple windows (herdr/desktop/mods/refactoria-spaces/main.js:112): Each Spaces instance calls listenKeys() in its constructor, starting its own nextCommand() loop. If Herdr Desktop instantiates this mod view once per window, a single Ctrl+A Ctrl+N press would be observed by every window's loop and each would call focusAgent(), fighting over pane.focus. Is the mod view instantiated once per window or once per app, and does nextCommand() deliver each command to all listeners or just one?

Verdict: ready to merge

@barbatdev

Copy link
Copy Markdown
Owner Author

Fleet review (deepseek)

Lens: evidence + test design. The three additions (Ctrl+A w, Ctrl+A q, Ctrl+A Ctrl+1..9) are small and mostly consistent with what the repo already does: mod.open:picker is the same command cmd-p already uses (herdr/desktop/keys.json:59), app.hide is the same command cmd-h uses, pane.focus and space.select are the commands the spaces/agents mods already run, and URGENCY in the new pickAgent keeps the same relative order as RANK in the agents mod (blocked > done > working > idle). The blocking problem is the numbering: the new Ctrl+A Ctrl+1..9 resolves N against row position in the rendered list, while the collapsed sidebar labels each space with its index in spaces(), so the number on screen and the space the shortcut jumps to disagree whenever the two orders diverge (any remote machine, or a worktree listed before its main checkout). The PR's evidence for the rest is a live manual check plus herdr-app check; neither is reproducible from the diff, and the reordering cases above are exactly the ones a single-machine live test would not exercise.

Blocking (1)

  • Ctrl+A Ctrl+N jumps to a different space than the number the sidebar shows (herdr/desktop/mods/refactoria-spaces/main.js:130): focusAgent resolves N through spaceOrder(), which returns rows in the order the list renders them: this computer first, then machines by name, worktrees under their main checkout (spaceOrder at main.js:123-127 over ordered() at main.js:289-307). The sidebar's visible numbers come from somewhere else: compact() renders String(i + 1) (main.js:444) where i is the space's index in spaces() (ordered() builds rows with sp.map((w, i) => ({ w, i, ... }), main.js:293). Any reordering performed by grouped()/ordered() therefore desynchronises the printed number from the space the shortcut targets. The PR body and docs/keymaps.md claim the keys number spaces the way the sidebar shows them, so the two must agree.
    • Failure scenario: Sidebar dragged narrow (< 160 px, so compact() draws) with two spaces: space A created first on machine vps, space B created second locally. spaces() is [A, B], so compact() labels A "1" and B "2"; grouped()/spaceOrder() put local first, so spaceOrder() is [B, A]. Pressing Ctrl+A Ctrl+1 focuses B (local) while the row labelled 1 is A (vps). The same happens with a worktree space created before its main checkout's space: ordered() re-emits main first and the worktree after it, so the label and the jump disagree. A folded machine group adds a third case: its spaces are not rendered at all but still occupy ordinal slots in spaceOrder().

Suggestion (2)

  • Missing verification conditions for the new bindings (herdr/desktop/mods/refactoria-spaces/main.js:129): The stated evidence is herdr-app check plus errors: [] plus one live pass. Those cover load and schema, not the ordering and fallback rules this diff introduces. Test conditions worth recording (manually, since the repo has no JS harness for mods): (1) only local spaces, expanded sidebar — Ctrl+A Ctrl+N follows row order; (2) one remote machine present — local rows come first, then machines by name, and the ordinal matches the row; (3) a worktree space created before its main checkout — main first, worktree nested under it; (4) a folded machine group — confirm whether its spaces still occupy ordinals; (5) N larger than the number of spaces — nothing happens (focusAgent returns early); (6) a space with no agents — space.select selects it; (7) every space's agents contain more agents than fit 1..9 — ordinals beyond 9 are unreachable by design; (8) two blocked agents in one space — the more recent seq wins. Expected outcome for (1)-(3) is the same space the sidebar numbers, which is the blocking finding above.
  • Document that bare Ctrl+1..9 and Ctrl+A Ctrl+1..9 use different numbering (docs/keymaps.md:50): keys.json already maps bare ctrl-1..9 to space.select:1..9 (herdr/desktop/keys.json:92-100), and the new bindings add ctrl-a ctrl-1..9 to refactoria-spaces.agent-N. The Desktop row (docs/keymaps.md:50) lists Ctrl+1..9 for agent focus without noting that Ctrl+1..9 alone also selects a space, so a reader cannot tell the two apart or that they may not agree on which space is number N. One clause naming both forms and their numbering would close that gap.

Question (2)

  • pickAgent ignores the Agents panel's held-done rule (herdr/desktop/mods/refactoria-spaces/main.js:42): pickAgent sorts on the agent's current status only (URGENCY at main.js:41-44). The Agents panel does not: refactoria-agents/main.js:117-129 keeps a done agent at done rank after you open it (hold()/rank()), so the panel still lists it as Done until you leave it. With pickAgent, that same agent becomes idle the moment it is focused and drops to the lowest rank, so the shortcut leaves the agent the panel still shows as the most urgent. Is the shortcut meant to match the panel's ordering, or deliberately to track live status only?
  • nextCommand() contract is unverifiable from the repo (herdr/desktop/mods/refactoria-spaces/main.js:115): nextCommand is imported at main.js:8 and used only in this new loop (main.js:112-120); no other mod in the repo consumes it and no doc in the tree describes it, so its two properties the code depends on cannot be checked from the diff: that it blocks while idle (the for (;;) awaits it, so a non-blocking resolution would spin the render task), and that it yields the command id without the mod prefix (the regex /^agent-([1-9])$/ would not match refactoria-spaces.agent-1). The PR's verification is a live run on Desktop 0.1.10, which covers this today but is not reproducible from the PR. Can you state the contract you relied on?

Verdict: not ready

@barbatdev

Copy link
Copy Markdown
Owner Author

Fleet review (qwen38)

Lens: evidence. The PR adds the three missing Herdr TUI prefix keys (space picker, detach-as-hide, focus agent by number) with keys.json bindings, a nextCommand listener in the refactoria-spaces mod, and updated docs. I grounded the diff against the head source: agents do expose seq/pane/status/space (refactoria-agents/main.js:225,294 use the same fields and the same recency tie-break), so pickAgent's data access is sound, and the picker/hide bindings reuse commands the app already ships. The first-line verdicts disagree at this head, so I audited the disagreement independently: I confirmed the numbering defect at main.js:444/293/123-127 and am reporting it as blocking. The remaining verification claims (herdr-app check, live test of all three bindings) are assertion-only and not reproducible from the repo, and the live test evidently did not exercise the remote-machine or collapsed-sidebar cases where the numbering diverges.

Blocking (1)

  • Ctrl+A Ctrl+N jumps to a different space than the number the sidebar shows (herdr/desktop/mods/refactoria-spaces/main.js:124): The PR claims the new keys number spaces 'the way its sidebar shows them (this computer first, then machines by name, worktrees under their repo)', but spaceOrder() (main.js:123-127 over ordered() at 289-307) and the numbers the sidebar actually draws are different orderings. The only visible numbers are drawn by compact() at main.js:444 as String(i + 1), where i is each space's index in spaces() (assigned in ordered() at main.js:293 via sp.map((w, i) => ...)); rows are then regrouped local-first, remotes sorted, worktrees nested, but the label keeps the pre-sort index. So whenever ordered()/spaceOrder() re-emits a row at a position different from its spaces() index — any remote machine, any worktree listed before its main checkout — the shortcut targets a space whose printed number is not N. A folded machine group adds a variant: its spaces are not rendered yet still consume ordinals in spaceOrder().
    • Failure scenario: Two spaces: A on remote machine 'vps' created first (spaces() index 0), B local created second (index 1). The collapsed sidebar labels A '1' and B '2'. spaceOrder() puts local first, so it is [B, A]; pressing Ctrl+A Ctrl+1 focuses B's agent while the row labeled 1 is A. Same divergence with a worktree space created before its main checkout's space: ordered() nests the worktree after main, but the worktree keeps its smaller printed number.

Suggestion (2)

  • nextCommand loop has no error handling; a rejection kills all nine bindings silently (herdr/desktop/mods/refactoria-spaces/main.js:114): The for(;;) loop in listenKeys awaits nextCommand inside the spawned task with no try/catch. If the call ever throws or rejects (API change, teardown race), the task exits, there is no retry, and Ctrl+A Ctrl+1..9 stop working with no visible symptom until the window reloads. Unlike the cx.timer callbacks in this view, which fire independently each tick, this is a single point of failure for the feature; wrapping the loop body in try/catch or respawning on error keeps the failure loud instead of silent.
  • Verification evidence for the three new bindings is assertion-only (docs/keymaps.md:50): The criteria feat(herdr): bring Herdr TUI prefix keys to Herdr Desktop #100 leaves open (workspace picker, detach equivalent, focus agent 1-9) are each closed by two claims — herdr-app check passing and 'tested live in Herdr Desktop 0.1.10' — neither reproducible from the repo: no test, script, or recorded observation exists, and the live pass clearly did not cover the multi-machine or collapsed-sidebar cases where the blocking finding above appears. Recording in the PR (or docs/herdr-workflow.md) which key sequences were pressed on which layout and what was seen would turn the claims into evidence the next reviewer can weigh.

Question (1)

  • agent-N matching assumes nextCommand delivers commands with the mod prefix stripped (herdr/desktop/mods/refactoria-spaces/main.js:115): keys.json dispatches refactoria-spaces.agent-1..9, but the listener regex is /^agent-([1-9])$/, which only matches if herdr hands nextCommand the part after the mod name. Nothing else in this repo consumes nextCommand (I grepped every mod at the head SHA) and no doc in the tree states the convention, so the entire focus-agent feature rests on the unreproducible live-test claim. Can you confirm the prefix-stripping contract is documented herdr behavior? A one-line comment on the regex stating the convention would give the next reader the same footing.

Verdict: not ready

@barbatdev

Copy link
Copy Markdown
Owner Author

Fleet review (mimo)

Lens: requirements. The diff satisfies issue #100's acceptance criteria as extended by this PR: herdr/desktop/keys.json (head) contains every prefix key the issue lists, parses as valid JSON with no duplicate chords, and adds ctrl-a w -> mod.open:picker, ctrl-a q -> app.hide, ctrl-a ctrl-1..9 -> refactoria-spaces.agent-N without removing any existing binding; install.sh still links keys.json (line 32); docs/keymaps.md:50-51 now documents the three new chords and its 'not mapped' row (pane cycling, pane rename, resize mode) exactly matches the TUI keys still without Desktop equivalents. Consistency checks pass: the keys.json commands match the mod's /^agent-([1-9])$/ listener, spaceOrder() (main.js:123) reproduces the sidebar's grouped() ordering (same ordered() source, same [null, ...machine].sort() grouping, machines with no spaces contribute no rows in either), pickAgent's blocked > done > working > idle ranking with seq tie-break matches the PR description and the pre-existing refactoria-agents pattern (main.js rank sort uses the same y.seq - x.seq), and space.select/pane.focus/mod.open:picker/app.hide are all pre-existing commands with established call shapes. No blocking defects found: no concrete failure scenario contradicts an acceptance criterion. Open items are two questions (folded-machine numbering ambiguity in the docs' 'sidebar order' claim; unverifiable nextCommand() error semantics) and one suggestion (verification of the ranking/numbering claims rests entirely on manual live testing).

Suggestion (1)

  • Ranking and numbering claims have no automated coverage, only manual live testing (herdr/desktop/mods/refactoria-spaces/main.js:42): The two load-bearing behavioral claims of this PR - pickAgent (main.js:42) selecting the agent that 'needs you most' (blocked > done > working > idle, then most recent change) and spaceOrder() numbering spaces the way the sidebar shows them - are pure functions of list input, yet the repository has no automated coverage for the JS mods (scripts/test_refactoria_herdr.py only exercises TOML profile handling). The PR's verification section reports live testing of the three chords, which proves the bindings fire but is unlikely to have exercised the cross-machine numbering or the ranking choice (e.g., a blocked agent competing with a working agent in the same space). Not required for merge; noted so the evidence behind these claims is explicit.

Question (2)

  • 'Sidebar order' for Ctrl+A Ctrl+1..9 is undefined when a machine header is folded (docs/keymaps.md:50): docs/keymaps.md:50 promises Ctrl+A Ctrl+1..9 goes to 'the agent of space 1-9 in sidebar order', but spaceOrder() (herdr/desktop/mods/refactoria-spaces/main.js:123) numbers every space of ordered() grouped by machine, independent of folding, while the sidebar renderer grouped() (main.js:348) skips the space rows of a folded machine ('...(folded ? [] : ...)'), and folding persists in localStorage ('machines.folded'). The PR body defines a fold-independent scheme (this computer first, then machines by name, worktrees under their repo), which the code implements, so the behavior may well be intended - but the doc phrase 'sidebar order' reads as the currently visible rows. Please confirm which numbering is the requirement so the doc and behavior state the same thing: canonical order (fold-independent) or visible-row order (fold-dependent).
  • nextCommand() rejection and mod-scoping semantics cannot be verified from this repository (herdr/desktop/mods/refactoria-spaces/main.js:115): listenKeys (main.js:113-119) awaits nextCommand() inside an unguarded 'for (;;)' spawned loop: if the promise ever rejects, the async body throws, the loop terminates, and Ctrl+A Ctrl+1..9 stops working silently for the rest of the session while keys.json still shows the bindings as active. nextCommand has no other usage anywhere in the repository (code search over the default branch returns nothing) and the imported 'herdr' module comes from the external Herdr Desktop runtime, so neither its rejection behavior nor whether its command stream is mod-scoped can be confirmed from the diff; the PR's Verification section only states the three bindings were tested live (happy path). Question: can nextCommand() reject during a normal session (mod reload, window state change), and if it does - or if the stream is shared across mods - what keeps the agent-N bindings alive or exclusive?

Verdict: ready to merge

@barbatdev

Copy link
Copy Markdown
Owner Author

Fleet review (glmflash)

Lens: adversarial. The three missing TUI prefix keys from issue #100 are present in keys.json (w -> mod.open:picker, q -> app.hide, ctrl-1..9 -> refactoria-spaces.agent-N) and documented in docs/keymaps.md. I verified against the sibling mod that agents() items carry seq and use the same four statuses, so pickAgent's comparator is sound, and the spaceOrder() grouping (local first, then machines sorted, worktrees nested via ordered()) matches the expanded sidebar layout in grouped(). The remaining findings are edge-behavior questions around numbering parity in the collapsed sidebar and the unguarded nextCommand loop; none has a blocking failure scenario on the linked issue's criteria.

Suggestion (2)

  • pickAgent ranks an already-seen 'done' agent above a working one (herdr/desktop/mods/refactoria-spaces/main.js:41): URGENCY puts done at 2 regardless of whether any screen has already looked at it, while the sidebar's own waiting logic (spaceWaits) treats a seen 'done' as no longer needing attention. Jumping into space N can land on a done agent the user already dismissed instead of the one currently working.
  • Folded machines still consume numbering slots (herdr/desktop/mods/refactoria-spaces/main.js:123): spaceOrder() counts every row regardless of this.folded, so spaces under a folded machine header are invisible but still occupy their Ctrl+A Ctrl+N slot. The user cannot see which numbers are assigned to hidden spaces.

Question (3)

  • nextCommand loop has no error handling; one rejection kills the bindings silently (herdr/desktop/mods/refactoria-spaces/main.js:113): listenKeys spawns an infinite for(;;) loop whose only exit is a thrown exception. If await nextCommand() ever rejects (transport hiccup, window teardown ordering, API error), the spawned task dies and refactoria-spaces.agent-N stops responding for the rest of the session with no visible symptom, while the keys.json binding still exists. Every other long-lived loop in this file (readSeen, watch, refreshGit) is wrapped in try/catch or guarded.
  • Numbering parity claim does not hold for the collapsed sidebar's own badges (herdr/desktop/mods/refactoria-spaces/main.js:123): The PR states focusAgent numbers spaces 'the way its sidebar shows them'. The expanded view (grouped) does match spaceOrder: local first, then machines sorted. But the collapsed sidebar (compact, line 444) renders the badge String(i + 1) using the row's index in ordered(), which is not regrouped by machine — so when remote spaces interleave with local ones in spaces() order, the visible badge numbers disagree with the Ctrl+A Ctrl+N numbering.
  • pane.focus on an agent in a remote-machine space (herdr/desktop/mods/refactoria-spaces/main.js:133): Every existing selection path in this file uses space.select for remote rows; focusAgent instead runs pane.focus with best.pane. If panes on another machine are not addressable by the local pane.focus command (the sidebar never assumes they are), focusing the best agent of a remote space would no-op instead of showing the space.

Verdict: ready to merge

@barbatdev
barbatdev merged commit 3f7a27d into main Oct 31, 2026
1 check passed
@barbatdev
barbatdev deleted the feat/herdr-desktop-tui-gaps branch October 31, 2026 15:59
@barbatdev

Copy link
Copy Markdown
Owner Author

Correction for #109 is ready in #111 (commit b12ba28). This PR was already merged, so the fix is on a new branch. Compact labels and shortcuts now share visible machine/worktree ordering, folded groups consume no ordinal, and drag source indices remain unchanged. Seven Node regression tests, Herdr merge/asset checks, and CI Smoke checks pass. Native Desktop validation is unavailable in this workspace.

@barbatdev

Copy link
Copy Markdown
Owner Author

Post-merge QA (glm)

Lens: requirements + adversarial. Adds the three missing Herdr TUI prefix keys to Herdr Desktop: Ctrl+A w (picker), Ctrl+A q (app.hide), and Ctrl+A Ctrl+1..9 routed to refactoria-spaces agent-N commands. The mod numbers spaces exactly as documented (local machine first, then machines sorted by name) and picks the agent that needs attention most via a urgency/seq sort, falling back to space.select when a space has no agents, matching the PR's stated behavior. docs/keymaps.md is updated coherently, leaving only pane cycling, rename, and resize mode unmapped. keys.json syntax is valid and the bindings follow the existing ctrl-a pattern.

Question (2)

  • Key listener loop has no error handling around nextCommand() (herdr/desktop/mods/refactoria-spaces/main.js:111): listenKeys runs an unguarded 'for(;;) { await nextCommand(); }' inside cx.spawn. If nextCommand ever rejects (view disposal, window teardown, mod reload), the promise chain dies and all nine Ctrl+A Ctrl+N bindings stop working silently until the window is restarted. The PR verification tested the bindings live but does not cover the loop's behavior across mod reloads or window close.
  • focusAgent assumes the chosen agent still has a pane (herdr/desktop/mods/refactoria-spaces/main.js:128): pickAgent sorts the space's agents and focusAgent passes best.pane to pane.focus. If an agent record exists but its pane was closed (stale agent entry), the command receives pane: undefined and the behavior is unverified. The no-agent fallback to space.select covers the empty case but not the agent-without-pane case.

Verdict: clean

@barbatdev

Copy link
Copy Markdown
Owner Author

Post-merge QA (deepseek)

Lens: evidence + test design. I checked the three assumptions the new bindings rest on: ordered() returns {w, i, g} rows filtered by shown, so spaceOrder() numbers spaces in the same order the sidebar renders them; agents do carry a numeric seq (refactoria-agents sorts by y.seq), so pickAgent's tie-break is meaningful; and nextCommand is referenced by no other file in the repository, so the listener loop does not steal commands from sibling mods. The binding table, the mod and the docs agree on ctrl-a ctrl-1..9. What is missing is repeated evidence: the repo has no test for herdr mods, and the remote-agent focus path was not exercised.

Suggestion (1)

  • pickAgent ordering has no automated test although it is a pure exported function (herdr/desktop/mods/refactoria-spaces/main.js:41): export function pickAgent(list) is the whole decision behind Ctrl+A Ctrl+N: urgency first (blocked > done > working > idle), then the newest seq, then null. It is pure and takes a list, so it can be tested without a Herdr window, but the only evidence recorded is 'All three bindings were tested live in Herdr Desktop 0.1.10'. Live checks do not survive a refactor of URGENCY or of the comparator. Conditions worth covering: an empty list returns null; a blocked agent wins over a done one; two agents with the same status resolve to the higher seq; an agent with an unknown status falls to idle rather than to the top.

Question (1)

  • Focusing an agent in a space that belongs to another machine is not covered by the evidence (herdr/desktop/mods/refactoria-spaces/main.js:153): focusAgent calls run("pane.focus", { pane: best.pane }) and falls back to space.select only when the space has no agent at all. A space on a remote machine has agents, so the pane path is taken. Does pane.focus reach a pane that belongs to another machine's window, or does the command simply do nothing there? The live verification was local, so I cannot tell from the PR. If it is a no-op, Ctrl+A Ctrl+N looks broken on exactly the spaces this sidebar is built to show.

Verdict: clean

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant