()
| 403 | } |
| 404 | |
| 405 | pub(crate) async fn handle_reinstall_command() -> tracedecay::errors::Result<()> { |
| 406 | let home = tracedecay::agents::home_dir().ok_or_else(|| { |
| 407 | tracedecay::errors::TraceDecayError::Config { |
| 408 | message: "could not determine home directory".to_string(), |
| 409 | } |
| 410 | })?; |
| 411 | let tracedecay_bin = tracedecay::agents::which_tracedecay().ok_or_else(|| { |
| 412 | tracedecay::errors::TraceDecayError::Config { |
| 413 | message: "tracedecay not found on PATH".to_string(), |
| 414 | } |
| 415 | })?; |
| 416 | let mut user_cfg = tracedecay::user_config::UserConfig::load(); |
| 417 | tracedecay::agents::migrate_installed_agents(&home, &mut user_cfg); |
| 418 | |
| 419 | if user_cfg.installed_agents.is_empty() { |
| 420 | eprintln!("No installed agents found. Run `tracedecay install` first."); |
| 421 | } else { |
| 422 | let agents = user_cfg.installed_agents.clone(); |
| 423 | eprintln!( |
| 424 | "Reinstalling {} agent(s): {}", |
| 425 | agents.len(), |
| 426 | agents.join(", ") |
| 427 | ); |
| 428 | let results = reinstall_agent_integrations(&agents, &home, &tracedecay_bin).await; |
| 429 | let failed: Vec<String> = results |
| 430 | .iter() |
| 431 | .filter_map(|(id, result)| result.as_ref().err().map(|_| id.clone())) |
| 432 | .collect(); |
| 433 | if !failed.is_empty() { |
| 434 | return Err(tracedecay::errors::TraceDecayError::Config { |
| 435 | message: format!("failed to reinstall agent(s): {}", failed.join(", ")), |
| 436 | }); |
| 437 | } |
| 438 | eprintln!("\x1b[32m✔\x1b[0m All agents reinstalled"); |
| 439 | user_cfg.last_installed_version = env!("CARGO_PKG_VERSION").to_string(); |
| 440 | user_cfg.save(); |
| 441 | } |
| 442 | Ok(()) |
| 443 | } |
| 444 | |
| 445 | /// Re-runs `install()` + `post_install()` for each tracked agent id, returning |
| 446 | /// only the ids that resolve to a real integration paired with their install |
no test coverage detected