feat: make MCP config file follow Claude directory override
When users set a custom Claude configuration directory, the MCP config file (.claude.json) is now placed alongside the overridden directory instead of the default ~/.claude.json location. Changes: - Add path derivation logic to generate MCP path from override directory (e.g., /custom/.claude → /custom/.claude.json) - Implement automatic migration from legacy path on first access - Add comprehensive unit tests covering 4 edge cases - Update UI descriptions to clarify MCP file placement - Fix documentation: correct MCP config path from ~/.claude/mcp.json to ~/.claude.json Technical details: - New function: derive_mcp_path_from_override() extracts directory name and creates sibling .json file - Migration copies ~/.claude.json to new location if override is set - All MCP operations (read/write/sync) now use the derived path via user_config_path() unified entry point Breaking changes: None (backward compatible with default behavior)
This commit is contained in:
@@ -4,7 +4,7 @@ use std::env;
|
||||
use std::fs;
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
use crate::config::atomic_write;
|
||||
use crate::config::{atomic_write, get_claude_mcp_path, get_default_claude_mcp_path};
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
@@ -15,10 +15,49 @@ pub struct McpStatus {
|
||||
}
|
||||
|
||||
fn user_config_path() -> PathBuf {
|
||||
// 用户级 MCP 配置文件:~/.claude.json
|
||||
dirs::home_dir()
|
||||
.expect("无法获取用户主目录")
|
||||
.join(".claude.json")
|
||||
ensure_mcp_override_migrated();
|
||||
get_claude_mcp_path()
|
||||
}
|
||||
|
||||
fn ensure_mcp_override_migrated() {
|
||||
if crate::settings::get_claude_override_dir().is_none() {
|
||||
return;
|
||||
}
|
||||
|
||||
let new_path = get_claude_mcp_path();
|
||||
if new_path.exists() {
|
||||
return;
|
||||
}
|
||||
|
||||
let legacy_path = get_default_claude_mcp_path();
|
||||
if !legacy_path.exists() {
|
||||
return;
|
||||
}
|
||||
|
||||
if let Some(parent) = new_path.parent() {
|
||||
if let Err(err) = fs::create_dir_all(parent) {
|
||||
log::warn!("创建 MCP 目录失败: {}", err);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
match fs::copy(&legacy_path, &new_path) {
|
||||
Ok(_) => {
|
||||
log::info!(
|
||||
"已根据覆盖目录复制 MCP 配置: {} -> {}",
|
||||
legacy_path.display(),
|
||||
new_path.display()
|
||||
);
|
||||
}
|
||||
Err(err) => {
|
||||
log::warn!(
|
||||
"复制 MCP 配置失败: {} -> {}: {}",
|
||||
legacy_path.display(),
|
||||
new_path.display(),
|
||||
err
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn read_json_value(path: &Path) -> Result<Value, String> {
|
||||
|
||||
Reference in New Issue
Block a user