759af7fa5f
On a forced interactive:true mount over a non-TTY stdout, vue emitted cursor hide/show escapes where Ink emits none — Ink routes render()/done() cursor writes through cli-cursor, which short-circuits `if (!stream.isTTY) return`, and its only mount-time hide is alt-screen-only (alt-screen itself requires a TTY). Gate the non-alt-screen cursor writes on stream.isTTY: log-update's hideCursor/ showCursor (used by render()/done() and the incremental writer) and render.ts's bare mount-hide + teardown-show. The alternate-screen cursor writes are left as-is (already gated behind alternateScreen, which requires isTTY). log-update's sync() direct hide is deliberately NOT gated — Ink writes it directly, not via cli-cursor. Locked by a non-TTY interactive mount test asserting no \x1b[?25l/\x1b[?25h; the real-TTY hide-on-mount/show-on-teardown path stays covered by cursor.test.tsx. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>