Goal
Add a reusable Raycast-style command palette / launcher to @kud/ink-ui, with Cockpit as the first consumer and the component designed to work across other Ink apps.
Why
Cockpit and the other TUIs increasingly have more actions than should live in persistent key hints. A global command launcher would provide one discoverable surface for navigation and actions without adding more one-off shortcuts to each screen.
The interaction should feel like the familiar Cmd+K command palette pattern: open an overlay, type to filter commands, move through results, and execute one.
Scope to explore
- reusable
CommandPalette / launcher primitive in @kud/ink-ui
- host-provided command registry rather than hard-coded domain actions
- searchable/fuzzy filtering by label, aliases and possibly keywords
- keyboard navigation using the existing
@kud/ink-ui keyboard contracts
- grouped commands where useful (navigation, item actions, app actions, etc.)
- optional shortcut hints displayed beside commands
- clean overlay semantics: opening the launcher pushes one layer;
esc closes exactly that layer
- support commands that navigate within the current TUI as well as commands that return an intent for the host to execute after Ink releases the terminal
- first integration target: Cockpit
Keyboard question
The UX concept is Cmd+K, but the actual terminal binding should be treated as a host/configuration concern rather than baked into the component. Investigate which chord is reliably exposed by the terminal/Ink environment and allow consumers to choose the trigger.
Design constraints
- follow the existing
@kud/ink-ui keyboard ownership rules; avoid competing useInput handlers
- reuse existing
TextInput, list cursor/selectable primitives, overlays/panels and design tokens rather than hand-rolling equivalents
- the component should be domain-agnostic; Cockpit supplies its commands
- keep the launcher fast enough to feel instantaneous and useful as the normal way to reach less-common actions
First Cockpit commands to consider
Examples only, not a fixed API:
- switch view / section
- refresh
- open selected item in browser
- open selected item / drill in
- create or jump to a ticket-related action where supported
- invoke extension-provided actions
- help / discover available commands
Done when
@kud/ink-ui exposes a reusable launcher/command-palette API
- its focus/back behaviour follows the existing app-key contract
- filtering and keyboard execution are covered by tests
- Cockpit can mount it with its own command registry without duplicating launcher UI/keyboard logic
- the chosen trigger strategy is documented, including any terminal limitation around the
Cmd+K pattern
Goal
Add a reusable Raycast-style command palette / launcher to
@kud/ink-ui, with Cockpit as the first consumer and the component designed to work across other Ink apps.Why
Cockpit and the other TUIs increasingly have more actions than should live in persistent key hints. A global command launcher would provide one discoverable surface for navigation and actions without adding more one-off shortcuts to each screen.
The interaction should feel like the familiar
Cmd+Kcommand palette pattern: open an overlay, type to filter commands, move through results, and execute one.Scope to explore
CommandPalette/ launcher primitive in@kud/ink-ui@kud/ink-uikeyboard contractsesccloses exactly that layerKeyboard question
The UX concept is
Cmd+K, but the actual terminal binding should be treated as a host/configuration concern rather than baked into the component. Investigate which chord is reliably exposed by the terminal/Ink environment and allow consumers to choose the trigger.Design constraints
@kud/ink-uikeyboard ownership rules; avoid competinguseInputhandlersTextInput, list cursor/selectable primitives, overlays/panels and design tokens rather than hand-rolling equivalentsFirst Cockpit commands to consider
Examples only, not a fixed API:
Done when
@kud/ink-uiexposes a reusable launcher/command-palette APICmd+Kpattern