From ec1cb60b24cca5377a4c720dbfe8abb06a6e5292 Mon Sep 17 00:00:00 2001 From: imtiazNDMA Date: Wed, 27 May 2026 20:58:19 +0500 Subject: [PATCH] fix(tui): prevent spinner garbage in non-TTY environments The plugin install spinner from @clack/prompts outputs ANSI escape sequences unconditionally. When stdout is not a TTY (CI, subprocess, piped output), \r and CSI sequences appear as garbage. Added a TTY-aware spinner wrapper that falls back to plain console.log/console.error when stdout is not a terminal. Fixes #27908 --- packages/opencode/src/cli/cmd/plug.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/cli/cmd/plug.ts b/packages/opencode/src/cli/cmd/plug.ts index 1529e9b71df3..a5eafa942d6f 100644 --- a/packages/opencode/src/cli/cmd/plug.ts +++ b/packages/opencode/src/cli/cmd/plug.ts @@ -17,6 +17,17 @@ type Spin = { stop: (msg: string, code?: number) => void } +function ttySpinner(): Spin { + if (process.stdout.isTTY) return spinner() + return { + start: (msg: string) => console.log(msg), + stop: (msg: string, code?: number) => { + if (code) console.error(msg) + else console.log(msg) + }, + } +} + export type PlugDeps = { spinner: () => Spin log: { @@ -45,7 +56,7 @@ export type PlugCtx = { } const defaultPlugDeps: PlugDeps = { - spinner: () => spinner(), + spinner: () => ttySpinner(), log: { error: (msg) => log.error(msg), info: (msg) => log.info(msg),