[Bug] app:exit action not dispatched when bound to custom keybindings
Bug Description
app:exit does not fire when bound to a custom key — ctrl+d remains the only exit
Repro: add to ~/.claude/keybindings.json:
{ "context": "Global", "bindings": { "ctrl+q": "app:exit" } }
Restart, press ctrl+q.
Expected: session exits, as with ctrl+d.
Actual: nothing happens.
The problem is the action, not the key:
- Binding loads clean: "KeybindingSetup initialized with 372 bindings, 0 warnings".
No warning for ctrl+q or app:exit.
- Same key bound to app:toggleTranscript works immediately, so the keystroke
reaches dispatch and the Global context is active.
- Chord form ctrl+x ctrl+q -> app:exit also does nothing, which rules out
single control-byte decoding.
- The validator itself lists app:exit as valid ("Valid "app:" actions:
app:interrupt, app:exit, app:toggleTodos, ...").
Ruled out: terminal interception (no ctrl+q binding in Windows Terminal or its
defaults), flow control (shell is TCC, no termios), and launcher plumbing
(spawned with UseShellExecute=false, no stdin redirection; a different harness
over the identical path has ctrl+q working).
If app:exit is intentionally not bindable, the validator should reject it with
an error instead of accepting it silently, and it should be dropped from the
valid-actions list.
Environment Info
- Platform: win32
- Terminal: windows-terminal
- Version: 2.1.267
- Feedback ID: 1fa81655-dc9e-4b1c-8f75-af59e568b701
Errors
[]