From 565c0e577337a0bf4ef28c478f27b3178555e31f Mon Sep 17 00:00:00 2001 From: Douwe Osinga Date: Sun, 17 May 2026 21:30:38 -0400 Subject: [PATCH] fix(cli): enable VT processing on Windows Console Host (#9248) Signed-off-by: Douwe Osinga Co-authored-by: Douwe Osinga --- crates/goose-cli/src/main.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/crates/goose-cli/src/main.rs b/crates/goose-cli/src/main.rs index 51a7eccafb..f3d2fffab5 100644 --- a/crates/goose-cli/src/main.rs +++ b/crates/goose-cli/src/main.rs @@ -1,6 +1,19 @@ use anyhow::Result; use goose_cli::cli::cli; +/// Enable ANSI/VT escape sequence processing on Windows Console Host. +/// +/// Without this, spinners and progress bars from cliclack/indicatif render as +/// repeated new lines instead of updating in place, because Windows Console Host +/// does not process ANSI escapes by default. +#[cfg(windows)] +fn enable_windows_vt_processing() { + // colors_supported() has the side effect of calling SetConsoleMode with + // ENABLE_VIRTUAL_TERMINAL_PROCESSING on the underlying console handle. + let _ = console::Term::stdout().features().colors_supported(); + let _ = console::Term::stderr().features().colors_supported(); +} + async fn run() -> Result<()> { if let Err(e) = goose_cli::logging::setup_logging(None) { eprintln!("Warning: Failed to initialize logging: {}", e); @@ -18,6 +31,9 @@ async fn run() -> Result<()> { } fn main() -> Result<()> { + #[cfg(windows)] + enable_windows_vt_processing(); + let handle = std::thread::Builder::new() .name("goose-cli-main".to_string()) .stack_size(8 * 1024 * 1024)