[BUG] tui: "fullscreen" leaks OSC11/DA1 terminal query-replies to stdout — corrupts piped output and pager navigation
Environment
- Claude Code:
2.1.203 - OS: macOS
26.5.2(build25F84) - Reproduced in: iTerm2, Terminal.app, cmux
- Relevant setting:
"tui": "fullscreen"in~/.claude/settings.json
Summary
With "tui": "fullscreen" set, claude plugin marketplace list (and likely other commands) emits terminal query-reply escape sequences — OSC 11 (background-color report) and DA1 (primary device-attributes report, ESC [ ? … c) — onto stdout. These replies belong on the controlling TTY only and must never appear in the data stream.
Steps to reproduce
- Set
"tui": "fullscreen"in~/.claude/settings.json. - Run
claude plugin marketplace listdirectly → stray escape characters render on screen (iTerm2). - Run
claude plugin marketplace list | bat(or| more,| cat) → the pager's TTY is stuck in canonical mode: arrow keys emit junk, space doesn't scroll,qdoesn't quit; only Enter reacts. - Run
claude doctorwithout a real TTY (e.g. piped) → hangs indefinitely with no output (required SIGKILL).
Expected
Terminal query-replies (OSC11 / DA1) stay on the controlling TTY and are never written to stdout, regardless of the tui renderer. Piped output is clean text.
Actual
The escape sequences are written to stdout. In a pipe this corrupts the downstream program's TTY state; direct in iTerm2 they render as stray characters.
Root cause (narrowed by bisection)
"tui": "fullscreen" is the trigger. Removing the key (default renderer) fully resolves all three symptoms. Two other non-default settings present in the same file — "teammateMode": "tmux" and "remoteControlAtStartup": true — were tested and excluded as non-causal.
Workaround
Remove "tui": "fullscreen" from ~/.claude/settings.json (reloads on next startup).
Possibly related
#72455 (fullscreen renderer corrupting the system clipboard) may share the same fullscreen-renderer escape-handling root, though the symptom differs.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗