[Bug] app:exit action not dispatched when bound to custom keybindings

Status Open
Reported on v2.1.267
Maintainer reply None cached
Activity 0 comments · opened Sep 22, 2026

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

[]

View original on GitHub ↗