Overview
The command palette is an overlay modeled on charm.sh + sahilm/fuzzy. It indexes the full CmdEntry registry defined in internal/tui/command.go, runs commands through the same subprocess bridge the panels use, and streams output back inline. Anything you can do from a panel, you can also do from the palette — the registry is the single source of truth.
Opening the palette
| Key | Where |
|---|---|
Ctrl+K | Anywhere |
: | Anywhere |
Ctrl+K is the conventional binding; : exists because operators with muscle memory from editors and k9s reach for it first. Both open the same overlay.
Layout
┌─ Command palette ────────────────────────────────────────────────┐
│ > setup guardr │
├──────────────────────────────────────────────────────────────────┤
│ ▸ setup guardrail Configure LLM guardrail setup │
│ setup guardrail --mode Flip mode (observe/action) setup │
│ setup guardrail --disable Disable the guardrail setup │
└──────────────────────────────────────────────────────────────────┘
The input line echoes what you typed; the result list shows TUIName (left), Description (center), Category (right). Fuzzy matching is case-insensitive and orders by match score.
Registry categories
| Category | Example entries |
|---|---|
setup | init, setup skill-scanner, setup guardrail, setup splunk, setup provider add |
scan | scan skill, scan skill --all, scan mcp, scan plugin, scan aibom, scan code |
enforce | block skill, allow skill, quarantine skill, set mcp, disable plugin |
keys | keys list, keys set, keys fill-missing, keys check |
policy | policy test, policy reload, policy edit |
audit | audit query, audit export, audit stats |
gateway | gateway start, gateway stop, gateway restart, gateway status |
misc | doctor, status, alerts, upgrade |
See internal/tui/command.go for the full list (200+ entries). Duplicate TUI names are caught by command_test.go.
Executing a command
- Type enough characters to disambiguate.
- Press
enteron the highlighted match. - If the entry has
NeedsArg=true, you're prompted for the argument withArgHintas placeholder text. - The palette closes; output streams inline in the panel's command output region.
For long-running commands (scans, setups), the output region expands and Ctrl+C cancels the subprocess without killing the TUI.
Arg-taking entries
A subset of entries expects a positional argument — the palette prompts for it after enter:
| Entry | Arg hint |
|---|---|
scan skill | <skill-name> |
scan mcp | <url> |
scan plugin | <plugin-name> |
scan code | <path> |
block skill / unblock skill / ... | <skill-name> |
keys set | <ENV_NAME> |
Arg resolution uses whatever is selected in the panel when relevant — e.g. invoking block skill from the Skills panel pre-fills the argument with the selected row's name.
Why a palette exists alongside panels
Panels are optimized for browsing-and-acting-on-lists. The palette is optimized for "I know what I want to do". They share the subprocess bridge, so:
- A palette run with
scan skill --alland ascan-allaction chosen from the Skills panel run the exact same CLI invocation. - Audit logs see both as
scan.skill.allevents. - CI pipelines that invoke the CLI directly produce identical audit rows.
This three-way parity — palette, panel, CLI — is tested in cli_parity_test.go.
Closing the palette
| Key | Behavior |
|---|---|
esc | Close without running |
enter | Close after running (unless the entry keeps the palette open) |
Ctrl+C | Close the palette (global Ctrl+C still quits the TUI if the palette is already closed) |