From 2ef40113352aba6f71541a74fbb6ba0359a4e83e Mon Sep 17 00:00:00 2001 From: robcholz <84130577+robcholz@users.noreply.github.com> Date: Sat, 7 Feb 2026 18:15:34 -0500 Subject: [PATCH] refactor: now make cli more consistent --- docs/tasks.md | 3 +- src/bin/vibebox-cli.rs | 68 +++++++++++++++++++++++++++++------ src/bin/vibebox-supervisor.rs | 28 +++++++++++---- src/instance.rs | 12 +++++-- 4 files changed, 89 insertions(+), 22 deletions(-) diff --git a/docs/tasks.md b/docs/tasks.md index 544d4c0..c4a632b 100644 --- a/docs/tasks.md +++ b/docs/tasks.md @@ -48,7 +48,8 @@ 3. [x] add an actual config file. 4. [x] set up the cli. 9. [ ] fix ui overlap, and consistency issue. -10. [ ] intensive integration test. +10. [ ] `clean_cache` to cleanup the cache. +11. [ ] intensive integration test. ## Publish diff --git a/src/bin/vibebox-cli.rs b/src/bin/vibebox-cli.rs index 24d97c6..fce07fd 100644 --- a/src/bin/vibebox-cli.rs +++ b/src/bin/vibebox-cli.rs @@ -11,7 +11,8 @@ use color_eyre::Result; use dialoguer::Confirm; use time::OffsetDateTime; use time::format_description::well_known::Rfc3339; -use tracing_subscriber::EnvFilter; +use tracing_subscriber::filter::LevelFilter; +use tracing_subscriber::{EnvFilter, fmt, prelude::*}; use vibebox::tui::{AppState, VmInfo}; use vibebox::{ @@ -39,11 +40,11 @@ enum Command { } fn main() -> Result<()> { - init_tracing(); color_eyre::install()?; + let cwd = env::current_dir().map_err(|err| color_eyre::eyre::eyre!(err.to_string()))?; + init_tracing(&cwd); let cli = Cli::parse(); - let cwd = env::current_dir().map_err(|err| color_eyre::eyre::eyre!(err.to_string()))?; tracing::info!(cwd = %cwd.display(), "starting vibebox cli"); if let Some(command) = cli.command { return handle_command(command, &cwd, cli.config.as_deref()); @@ -249,13 +250,58 @@ fn format_last_active(value: Option<&str>) -> String { format!("{} day{} ago", days, if days == 1 { "" } else { "s" }) } -fn init_tracing() { +fn init_tracing(cwd: &Path) { let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); - let ansi = std::io::stderr().is_terminal() && env::var("VIBEBOX_LOG_NO_COLOR").is_err(); - let _ = tracing_subscriber::fmt() - .with_env_filter(filter) - .with_target(false) - .with_ansi(ansi) - .with_writer(std::io::stderr) - .try_init(); + let stderr_is_tty = std::io::stderr().is_terminal(); + let ansi = stderr_is_tty && env::var("VIBEBOX_LOG_NO_COLOR").is_err(); + let file = instance::ensure_instance_dir(cwd) + .ok() + .and_then(|instance_dir| { + let log_path = instance_dir.join("cli.log"); + std::fs::OpenOptions::new() + .create(true) + .write(true) + .truncate(true) + .open(log_path) + .ok() + }); + + if stderr_is_tty { + let stderr_layer = fmt::layer() + .with_target(false) + .with_ansi(ansi) + .without_time() + .with_writer(std::io::stderr) + .with_filter(LevelFilter::INFO); + let subscriber = tracing_subscriber::registry() + .with(filter) + .with(stderr_layer); + if let Some(file) = file { + let file_layer = fmt::layer() + .with_target(false) + .with_ansi(false) + .with_writer(file); + let _ = subscriber.with(file_layer).try_init(); + } else { + let _ = subscriber.try_init(); + } + } else { + let stderr_layer = fmt::layer() + .with_target(false) + .with_ansi(ansi) + .with_writer(std::io::stderr) + .with_filter(LevelFilter::INFO); + let subscriber = tracing_subscriber::registry() + .with(filter) + .with(stderr_layer); + if let Some(file) = file { + let file_layer = fmt::layer() + .with_target(false) + .with_ansi(false) + .with_writer(file); + let _ = subscriber.with(file_layer).try_init(); + } else { + let _ = subscriber.try_init(); + } + } } diff --git a/src/bin/vibebox-supervisor.rs b/src/bin/vibebox-supervisor.rs index 25464c1..396c0ce 100644 --- a/src/bin/vibebox-supervisor.rs +++ b/src/bin/vibebox-supervisor.rs @@ -5,6 +5,9 @@ use std::{ use color_eyre::Result; use tracing_subscriber::EnvFilter; +use tracing_subscriber::filter::LevelFilter; +use tracing_subscriber::fmt; +use tracing_subscriber::prelude::*; use vibebox::{config, instance, vm, vm_manager}; @@ -40,11 +43,22 @@ fn main() -> Result<()> { fn init_tracing() { let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); - let ansi = std::io::stderr().is_terminal() && env::var("VIBEBOX_LOG_NO_COLOR").is_err(); - let _ = tracing_subscriber::fmt() - .with_env_filter(filter) - .with_target(false) - .with_ansi(ansi) - .with_writer(io::stderr) - .try_init(); + let stderr_is_tty = std::io::stderr().is_terminal(); + let ansi = stderr_is_tty && env::var("VIBEBOX_LOG_NO_COLOR").is_err(); + if stderr_is_tty { + let stderr_layer = fmt::layer() + .with_target(false) + .with_ansi(ansi) + .without_time() + .with_writer(io::stderr) + .with_filter(LevelFilter::INFO); + let _ = tracing_subscriber::registry().with(stderr_layer).try_init(); + } else { + let stderr_layer = fmt::layer() + .with_target(false) + .with_ansi(ansi) + .with_writer(io::stderr) + .with_filter(filter); + let _ = tracing_subscriber::registry().with(stderr_layer).try_init(); + } } diff --git a/src/instance.rs b/src/instance.rs index 8dc137f..3d91b3a 100644 --- a/src/instance.rs +++ b/src/instance.rs @@ -72,7 +72,6 @@ pub fn run_with_ssh(manager_conn: UnixStream) -> Result<(), Box Result<(), Box> { let start = Instant::now(); let mut next_log_at = start + Duration::from_secs(10); - tracing::debug!("waiting for vm ipv4"); + tracing::info!("waiting for vm ipv4"); + let mut once_hint = false; loop { let config = load_or_create_instance_config(instance_dir)?; if config.vm_ipv4.is_some() { @@ -258,7 +258,13 @@ fn wait_for_vm_ipv4( } if Instant::now() >= next_log_at { let waited = start.elapsed(); - tracing::debug!("still waiting for vm ipv4, {}s elapsed", waited.as_secs(),); + if waited.as_secs() > 15 && !once_hint { + tracing::info!( + "if vibebox is just initialized in this directory, it might take up to 1 minutes depending on your machine, and then you can enjoy the speed vibecoding! go pack!" + ); + once_hint = true; + } + tracing::info!("still waiting for vm ipv4, {}s elapsed", waited.as_secs(),); next_log_at += Duration::from_secs(10); } thread::sleep(Duration::from_millis(200));