From 83ed0d42a477097c7d630eb88197d5ce92f6320e Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Wed, 11 Mar 2026 09:15:56 -0400 Subject: [PATCH] Add spinner to `arc doctor` for immediate feedback The command takes several seconds (especially with live probes) but previously showed no output until fully complete. Now a braille spinner animates while checks run. Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/crates/arc-cli/Cargo.toml | 1 + lib/crates/arc-cli/src/doctor.rs | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/lib/crates/arc-cli/Cargo.toml b/lib/crates/arc-cli/Cargo.toml index 04c702a4f..354db6dc5 100644 --- a/lib/crates/arc-cli/Cargo.toml +++ b/lib/crates/arc-cli/Cargo.toml @@ -26,6 +26,7 @@ arc-api = { path = "../arc-api", optional = true } arc-util = { path = "../arc-util" } clap.workspace = true console.workspace = true +indicatif.workspace = true daytona-sdk.workspace = true anyhow.workspace = true dotenvy.workspace = true diff --git a/lib/crates/arc-cli/src/doctor.rs b/lib/crates/arc-cli/src/doctor.rs index 5b1b025c2..45efda0ff 100644 --- a/lib/crates/arc-cli/src/doctor.rs +++ b/lib/crates/arc-cli/src/doctor.rs @@ -921,6 +921,15 @@ async fn probe_url(http: &reqwest::Client, url: &str) -> Result<(), String> { pub async fn run_doctor(verbose: bool, live: bool) -> i32 { let styles = Styles::detect_stdout(); + let spinner = indicatif::ProgressBar::new_spinner(); + spinner.set_style( + indicatif::ProgressStyle::with_template("{spinner:.cyan} {msg}") + .expect("valid template") + .tick_strings(&["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏", ""]), + ); + spinner.set_message("Running checks…"); + spinner.enable_steady_tick(std::time::Duration::from_millis(80)); + // Gather state let cli_config = arc_config::cli::load_cli_config(None).unwrap_or_default(); @@ -1128,6 +1137,8 @@ pub async fn run_doctor(verbose: bool, live: bool) -> i32 { checks, }; + spinner.finish_and_clear(); + let term_width = console::Term::stderr().size().1; print!( "{}",