Web command bar: overlay shell, session results, Enter attaches #149
No due date set.
Blocks
Depends on
#157 Sidebar search field opens the command bar on touch
naps62/maestro
#151 Web command bar: Tab drills into per-session actions
naps62/maestro
#150 Web command bar: > command sigil and ~ directory sigil
naps62/maestro
Reference: naps62/maestro#149
Reference in New Issue
Block a user
Build the web command bar itself: the overlay, the query input, the result
list, and the session half of the results.
ctrl-kopens it while the sidebar has focus. (Opening it over a focusedterminal is #I — this issue does not have to win that fight yet.)
last-focused field from #145.
ranges highlighted; results are grouped under a kind header, since commands
and directories join the same list in #G.
the hash router already share, so a split or a drag can't leave it
inconsistent.
ctrl-p/ctrl-nmove the highlight.?help overlay without being listed twice.
Follow
docs/COMMAND-BAR.mdfor the key model and the empty-query ordering,and
DESIGN.md's existing overlay tokens for the visuals — this is the samefamily of surface as the spawn modal and the help overlay, not a new one.
Non-goals: no sigils (#G), no session action page (#H), no terminal-focus
interception or leader escape hatch (#I), no touch entry point (#N).
Depends on: #145, #146, #148
Handoff from #148. The registry is in
web/src/commands.ts:COMMAND_SPECSis the list to feed the>sigil (each entry hasid,label,group,keys,scope),publishedCommands()returns the boundsubset in registry order, and
keyCaps(chord)turns a chord into the keycaps arow renders. Chord resolution already works, so
ctrl-a ctrl-kis a spec entryplus a
run()— no dispatcher work.The global key listener is still bubble phase.
docs/COMMAND-BAR.mdrequires
ctrl-kto be intercepted ahead of xterm, so this issue has to movethat listener to capture phase. #148 left it alone deliberately, because
switching phases would have changed existing behaviour.
Merged into
blitz/command-bar. Suite re-run on the integration branch: 356tests across 40 files, green, typecheck clean.
orderSessionsForBarimplements the empty-query ordering the way the contractstates it — dead after live regardless of recency, never-focused after focused,
created-descending as the last tie-break — and it doubles as the input order a
non-empty query inherits, which is what the matcher's stable last tie-break was
specified for. The two halves fit.
The capture-phase move is in, and it correctly stops short of the pane: the
listener still defers to
isTypingTarget, leaving Ctrl-K reaching xterm until#152 takes that over. Deferring rather than half-implementing it was the right
call.