82 lines
2.7 KiB
Rust
82 lines
2.7 KiB
Rust
use serde::{Deserialize, Serialize};
|
||
|
||
const BASH_RULES_MARKER: &str = "<!-- beast:bash-rules:start -->";
|
||
|
||
#[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<std::path::PathBuf> {
|
||
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<BeastGlobalStatus, String> {
|
||
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,
|
||
})
|
||
}
|