claude_code_toolkit/cli/commands/
status.rs

1use crate::{
2  config::{ credentials::CredentialsManager, manager::ConfigurationManager },
3  error::*,
4  utils::systemd::SystemdManager,
5};
6use console::{ Emoji, style };
7
8static CHECKMARK: Emoji<'_, '_> = Emoji("✅ ", "");
9static CROSS: Emoji<'_, '_> = Emoji("❌ ", "");
10static WARNING: Emoji<'_, '_> = Emoji("⚠️ ", "");
11static INFO: Emoji<'_, '_> = Emoji("📊 ", "");
12
13pub async fn handle_status() -> Result<()> {
14  println!("{} {}", INFO, style("Claude Code Status").bold());
15  println!();
16
17  // Session info
18  println!("{}", style("Session Information:").bold());
19  match CredentialsManager::new() {
20    Ok(credentials_manager) =>
21      match credentials_manager.get_session_info().await {
22        Ok(session_info) => {
23          println!("  Subscription: {}", style(&session_info.subscription_type).cyan());
24
25          if session_info.is_expired {
26            println!("  Status: {}", style("Expired").red());
27          } else {
28            println!("  Status: {}", style("Active").green());
29            println!(
30              "  Time Remaining: {}",
31              style(CredentialsManager::format_time_remaining(session_info.time_remaining)).yellow()
32            );
33          }
34
35          let expires_at = chrono::DateTime
36            ::from_timestamp(session_info.expires_at / 1000, 0)
37            .unwrap_or_default()
38            .format("%Y-%m-%d %H:%M:%S UTC");
39          println!("  Expires At: {}", expires_at);
40        }
41        Err(e) => {
42          println!("  {}", style(format!("Error reading session: {}", e)).red());
43        }
44      }
45    Err(e) => {
46      println!("  {}", style(format!("Error initializing credentials manager: {}", e)).red());
47    }
48  }
49
50  println!();
51
52  // Daemon status
53  println!("{}", style("Daemon Status:").bold());
54  match SystemdManager::new() {
55    Ok(systemd_manager) =>
56      match systemd_manager.is_running().await {
57        Ok(is_running) => {
58          if is_running {
59            println!("  Status: {}Running", CHECKMARK);
60          } else {
61            println!("  Status: {}Stopped", CROSS);
62          }
63        }
64        Err(e) => {
65          println!("  Status: {}Error checking status: {}", WARNING, e);
66        }
67      }
68    Err(e) => {
69      println!("  Status: {}Error initializing systemd manager: {}", WARNING, e);
70    }
71  }
72
73  println!();
74
75  // Sync status
76  println!("{}", style("Sync Status:").bold());
77  match ConfigurationManager::new() {
78    Ok(config_manager) => {
79      match config_manager.load_state().await {
80        Ok(state) => {
81          if state.last_sync == 0 {
82            println!("  Last Sync: {}", style("Never").yellow());
83          } else {
84            let last_sync = chrono::DateTime
85              ::from_timestamp(state.last_sync, 0)
86              .unwrap_or_default()
87              .format("%Y-%m-%d %H:%M:%S UTC");
88            println!("  Last Sync: {}", last_sync);
89          }
90
91          if state.targets.is_empty() {
92            println!("  Targets: {}", style("None configured").yellow());
93          } else {
94            println!("  Targets: {} configured", state.targets.len());
95
96            // Show target status
97            for target in &state.targets {
98              let icon = match target.last_sync_status {
99                crate::types::SyncStatus::Success => CHECKMARK,
100                crate::types::SyncStatus::Failure => CROSS,
101              };
102              let target_name = format!("{}:{}", target.target_type, target.name);
103              println!("    {}{}", icon, target_name);
104
105              if let Some(ref error) = target.last_error {
106                println!("       {}", style(error).red());
107              }
108            }
109          }
110        }
111        Err(e) => {
112          println!("  {}", style(format!("Error reading sync state: {}", e)).red());
113        }
114      }
115    }
116    Err(e) => {
117      println!("  {}", style(format!("Error initializing config manager: {}", e)).red());
118    }
119  }
120
121  println!();
122
123  // Configuration
124  println!("{}", style("Configuration:").bold());
125  match ConfigurationManager::new() {
126    Ok(config_manager) =>
127      match config_manager.load_config().await {
128        Ok(config) => {
129          println!("  Config Path: {}", config_manager.config_path().display());
130          println!("  Organizations: {}", config.github.organizations.len());
131          println!("  Repositories: {}", config.github.repositories.len());
132          let total_targets = config.github.organizations.len() + config.github.repositories.len();
133          println!("  Total Targets: {}", total_targets);
134        }
135        Err(e) => {
136          println!("  {}", style(format!("Error reading config: {}", e)).red());
137        }
138      }
139    Err(e) => {
140      println!("  {}", style(format!("Error initializing config manager: {}", e)).red());
141    }
142  }
143
144  Ok(())
145}