claude_code_toolkit/cli/commands/
status.rs1use 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 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 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 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 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 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}