diff --git a/crates/turborepo-lib/src/run/mod.rs b/crates/turborepo-lib/src/run/mod.rs index 073dc728ea8e9..bb5937e66faf3 100644 --- a/crates/turborepo-lib/src/run/mod.rs +++ b/crates/turborepo-lib/src/run/mod.rs @@ -141,6 +141,10 @@ impl Run { } pub fn start_experimental_ui(&self) -> Option<(AppSender, JoinHandle>)> { + // Print prelude here as this needs to happen before the UI is started + if self.should_print_prelude { + self.print_run_prelude(); + } if !self.experimental_ui { return None; } @@ -153,9 +157,6 @@ impl Run { } pub async fn run(&mut self, experimental_ui_sender: Option) -> Result { - if self.should_print_prelude { - self.print_run_prelude(); - } if let Some(subscriber) = self.signal_handler.subscribe() { let run_cache = self.run_cache.clone(); tokio::spawn(async move { diff --git a/crates/turborepo-ui/src/tui/app.rs b/crates/turborepo-ui/src/tui/app.rs index d0ab438cda9cc..ce57ea9b078ee 100644 --- a/crates/turborepo-ui/src/tui/app.rs +++ b/crates/turborepo-ui/src/tui/app.rs @@ -1,5 +1,5 @@ use std::{ - io::{self, Stdout}, + io::{self, Stdout, Write}, time::{Duration, Instant}, }; @@ -160,6 +160,8 @@ fn poll(interact: bool, receiver: &AppReceiver, deadline: Instant) -> Option io::Result>> { crossterm::terminal::enable_raw_mode()?; let mut stdout = io::stdout(); + // Ensure all pending writes are flushed before we switch to alternative screen + stdout.flush()?; crossterm::execute!( stdout, crossterm::event::EnableMouseCapture,