Feature request: interactive hook output type for TUI picker/selection

Resolved 💬 1 comment Opened Jun 1, 2026 by peternguyen-afk Closed Jul 5, 2026

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.

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗