feat(settings): add 'Apply to Claude Code extension' toggle
- Apply immediately on save (write or remove primaryApiKey) - Honor setting on provider switch (enabled: write for non-official, remove for official; disabled: no auto writes) - Remove per-provider Claude plugin buttons from ProviderList - Upsert primaryApiKey=any preserving other fields; respect override dir - Add zh/en i18n for the new setting
This commit is contained in:
@@ -3,9 +3,12 @@ use std::path::PathBuf;
|
||||
|
||||
const CLAUDE_DIR: &str = ".claude";
|
||||
const CLAUDE_CONFIG_FILE: &str = "config.json";
|
||||
const CLAUDE_CONFIG_PAYLOAD: &str = "{\n \"primaryApiKey\": \"any\"\n}\n";
|
||||
|
||||
fn claude_dir() -> Result<PathBuf, String> {
|
||||
// 优先使用设置中的覆盖目录
|
||||
if let Some(dir) = crate::settings::get_claude_override_dir() {
|
||||
return Ok(dir);
|
||||
}
|
||||
let home = dirs::home_dir().ok_or_else(|| "无法获取用户主目录".to_string())?;
|
||||
Ok(home.join(CLAUDE_DIR))
|
||||
}
|
||||
@@ -45,17 +48,37 @@ fn is_managed_config(content: &str) -> bool {
|
||||
}
|
||||
|
||||
pub fn write_claude_config() -> Result<bool, String> {
|
||||
// 增量写入:仅设置 primaryApiKey = "any",保留其它字段
|
||||
let path = claude_config_path()?;
|
||||
ensure_claude_dir_exists()?;
|
||||
let need_write = match read_claude_config()? {
|
||||
Some(existing) => existing != CLAUDE_CONFIG_PAYLOAD,
|
||||
None => true,
|
||||
|
||||
// 尝试读取并解析为对象
|
||||
let mut obj = match read_claude_config()? {
|
||||
Some(existing) => match serde_json::from_str::<serde_json::Value>(&existing) {
|
||||
Ok(serde_json::Value::Object(map)) => serde_json::Value::Object(map),
|
||||
_ => serde_json::json!({}),
|
||||
},
|
||||
None => serde_json::json!({}),
|
||||
};
|
||||
if need_write {
|
||||
fs::write(&path, CLAUDE_CONFIG_PAYLOAD)
|
||||
.map_err(|e| format!("写入 Claude 配置失败: {}", e))?;
|
||||
|
||||
let mut changed = false;
|
||||
if let Some(map) = obj.as_object_mut() {
|
||||
let cur = map.get("primaryApiKey").and_then(|v| v.as_str()).unwrap_or("");
|
||||
if cur != "any" {
|
||||
map.insert("primaryApiKey".to_string(), serde_json::Value::String("any".to_string()));
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if changed || !path.exists() {
|
||||
let serialized = serde_json::to_string_pretty(&obj)
|
||||
.map_err(|e| format!("序列化 Claude 配置失败: {}", e))?;
|
||||
fs::write(&path, format!("{}\n", serialized))
|
||||
.map_err(|e| format!("写入 Claude 配置失败: {}", e))?;
|
||||
Ok(true)
|
||||
} else {
|
||||
Ok(false)
|
||||
}
|
||||
Ok(need_write)
|
||||
}
|
||||
|
||||
pub fn clear_claude_config() -> Result<bool, String> {
|
||||
|
||||
Reference in New Issue
Block a user