use serde::{Deserialize, Serialize}; const BASH_RULES_MARKER: &str = ""; #[derive(Debug, Serialize, Deserialize)] pub struct BeastGlobalStatus { /// Beast 是否已安装(settings.manifest.json 中存在 beast-mode 记录) pub installed: bool, /// 当前是否处于狂暴模式(permissions.allow 包含 Bash(*)) pub active: bool, /// ~/.claude/CLAUDE.md 是否已含 Beast 注入的 bash 规则 pub has_bash_rules: bool, } fn claude_home_dir() -> Option { let home = std::env::var("USERPROFILE") .or_else(|_| std::env::var("HOME")) .ok()?; Some(std::path::Path::new(&home).join(".claude")) } /// 读取全局 Beast 安装状态(只读,不修改任何文件)。 #[tauri::command] pub async fn get_beast_global_status() -> Result { let claude_dir = match claude_home_dir() { Some(d) => d, None => { return Ok(BeastGlobalStatus { installed: false, active: false, has_bash_rules: false, }) } }; // 检查安装状态(manifest) let installed = { let manifest_path = claude_dir.join("settings.manifest.json"); if manifest_path.exists() { let content = std::fs::read_to_string(&manifest_path).unwrap_or_default(); let json: serde_json::Value = serde_json::from_str(&content) .unwrap_or(serde_json::Value::Object(Default::default())); json.get("beast-mode").is_some() } else { false } }; // 检查当前模式(settings.json 中 allow 是否包含 Bash(*)) let active = { let settings_path = claude_dir.join("settings.json"); if settings_path.exists() { let content = std::fs::read_to_string(&settings_path).unwrap_or_default(); let json: serde_json::Value = serde_json::from_str(&content) .unwrap_or(serde_json::Value::Object(Default::default())); json["permissions"]["allow"] .as_array() .map(|arr| arr.iter().any(|v| v.as_str() == Some("Bash(*)"))) .unwrap_or(false) } else { false } }; // 检查 bash 规则是否已注入 ~/.claude/CLAUDE.md let has_bash_rules = { let claude_md = claude_dir.join("CLAUDE.md"); if claude_md.exists() { let content = std::fs::read_to_string(&claude_md).unwrap_or_default(); content.contains(BASH_RULES_MARKER) } else { false } }; Ok(BeastGlobalStatus { installed, active, has_bash_rules, }) }