Feature request: interactive hook output type for TUI picker/selection
Summary
Currently, hooks run as non-interactive shell subprocesses and their stdout is captured as plain text context injected into Claude's conversation. There's no way for a hook to render an interactive UI element in the Claude Code TUI.
Use case
I have a SessionStart hook that reads memory files and outputs a list of active/actionable items (a personal todo list). Right now it prints a text box that I read and then verbally tell Claude which item to focus on. Ideally, the hook could render an interactive picker where I arrow up/down and press Enter to select — and the selection gets passed to Claude as context automatically.
Proposed solution
Add a new hook output type (alongside the existing systemMessage, additionalContext, etc.) that tells Claude Code to render an interactive selection prompt in the TUI:
\\\json\
{
"hookSpecificOutput": {
"hookEventName": "SessionStart",
"picker": {
"prompt": "What do you want to work on?",
"options": [
{ "label": "🟢 POC", "value": "Let's work on the POC" },
{ "label": "🟡 Regression", "value": "Let's work on the perf regression" }
],
"allowSkip": true
}
}
}
\\
The selected value would be injected as additionalContext (or as the first user message) so Claude knows what was picked.
Current workaround
Running fzf in a wrapper launch script before Claude starts. Works but requires an extra dependency and a custom launcher alias — the experience is disjointed compared to a native TUI element.
Why this matters
Hooks are powerful but currently one-directional (hook → context). An interactive output type would unlock a whole class of session-initialization workflows: project pickers, mode selectors, environment choosers, etc.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗