dev-manager-tauri/src-tauri/src/commands/claude_config.rs
2026-09-21 12:52:37 +09:00

82 lines
2.7 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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,
})
}