diff --git a/package-lock.json b/package-lock.json index a6fc2cb2e..76debe317 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "proxycast", - "version": "0.17.4", + "version": "0.17.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "proxycast", - "version": "0.17.4", + "version": "0.17.8", "dependencies": { "@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-dropdown-menu": "^2.1.2", @@ -98,7 +98,6 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2666,7 +2665,6 @@ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -3051,7 +3049,6 @@ "integrity": "sha512-LPM2G3Syo1GLzXLGJAKdqoU35XvrWzGJ21/7sgZTUpbkBaOasTj8tjwn6w+hCkqaa1TfJ/w67rJSwYItlJ2mYw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -3069,7 +3066,6 @@ "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -3081,7 +3077,6 @@ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "devOptional": true, "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^18.0.0" } @@ -3121,7 +3116,6 @@ "integrity": "sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.49.0", "@typescript-eslint/types": "8.49.0", @@ -3444,7 +3438,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3663,7 +3656,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -4085,7 +4077,6 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -4727,7 +4718,6 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -5263,7 +5253,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -5486,7 +5475,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -5499,7 +5487,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -6010,7 +5997,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -6086,7 +6072,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6199,7 +6184,6 @@ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -6275,7 +6259,6 @@ "integrity": "sha512-E4t7DJ9pESL6E3I8nFjPa4xGUd3PmiWDLsDztS2qXSJWfHtbQnwAWylaBvSNY48I3vr8PTqIZlyK8TE3V3CA4Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.0.16", "@vitest/mocker": "4.0.16", @@ -6832,7 +6815,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -6846,7 +6828,6 @@ "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", diff --git a/package.json b/package.json index 0f79f4ea2..396fc3538 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "proxycast", "private": true, -"version": "0.17.8", + "version": "0.17.8", "type": "module", "repository": { "type": "git", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index cfbce5452..16111e583 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -3377,7 +3377,7 @@ dependencies = [ [[package]] name = "proxycast" -version = "0.17.7" +version = "0.17.8" dependencies = [ "anyhow", "async-stream", diff --git a/src-tauri/src/services/live_sync.rs b/src-tauri/src/services/live_sync.rs index 98c0e4eba..9e0584334 100644 --- a/src-tauri/src/services/live_sync.rs +++ b/src-tauri/src/services/live_sync.rs @@ -7,7 +7,7 @@ use std::path::PathBuf; pub fn get_app_config_path(app_type: &AppType) -> Option { let home = dirs::home_dir()?; match app_type { - AppType::Claude => Some(home.join(".claude").join("settings.json")), + AppType::Claude => Some(home.join(".claude.json")), AppType::Codex => Some(home.join(".codex")), AppType::Gemini => Some(home.join(".gemini")), AppType::ProxyCast => None, @@ -56,16 +56,12 @@ fn clean_claude_auth_conflict(settings: &mut Value) { } } -/// Sync Claude settings to ~/.claude/settings.json +/// Sync Claude settings to ~/.claude.json fn sync_claude_settings( provider: &Provider, ) -> Result<(), Box> { let home = dirs::home_dir().ok_or("Cannot find home directory")?; - let claude_dir = home.join(".claude"); - let config_path = claude_dir.join("settings.json"); - - // Create directory if not exists - std::fs::create_dir_all(&claude_dir)?; + let config_path = home.join(".claude.json"); // Read existing settings to preserve other fields let mut settings: Value = if config_path.exists() { @@ -201,7 +197,7 @@ pub fn read_live_settings( match app_type { AppType::Claude => { - let path = home.join(".claude").join("settings.json"); + let path = home.join(".claude.json"); if !path.exists() { return Err("Claude settings file not found".into()); } @@ -398,7 +394,7 @@ pub fn check_config_sync( fn get_config_last_modified(app_type: &AppType) -> Option { let home = dirs::home_dir()?; let path = match app_type { - AppType::Claude => home.join(".claude").join("settings.json"), + AppType::Claude => home.join(".claude.json"), AppType::Codex => home.join(".codex").join("auth.json"), AppType::Gemini => home.join(".gemini").join(".env"), AppType::ProxyCast => return None, diff --git a/src-tauri/src/services/mcp_sync.rs b/src-tauri/src/services/mcp_sync.rs index e3ce4ce61..057d1b73d 100644 --- a/src-tauri/src/services/mcp_sync.rs +++ b/src-tauri/src/services/mcp_sync.rs @@ -24,7 +24,7 @@ fn escape_toml_string(s: &str) -> String { pub fn get_mcp_config_path(app_type: &AppType) -> Option { let home = dirs::home_dir()?; match app_type { - AppType::Claude => Some(home.join(".claude").join("settings.json")), + AppType::Claude => Some(home.join(".claude.json")), AppType::Codex => Some(home.join(".codex").join("config.toml")), AppType::Gemini => Some(home.join(".gemini").join("settings.json")), AppType::ProxyCast => None, @@ -73,17 +73,13 @@ pub fn sync_mcp_to_app( } } -/// Sync MCP servers to Claude's settings.json -/// Claude uses the mcpServers field in ~/.claude/settings.json +/// Sync MCP servers to Claude's .claude.json +/// Claude uses the mcpServers field in ~/.claude.json fn sync_mcp_to_claude( servers: &[&McpServer], ) -> Result<(), Box> { let home = dirs::home_dir().ok_or("Cannot find home directory")?; - let claude_dir = home.join(".claude"); - let config_path = claude_dir.join("settings.json"); - - // Create directory if not exists - std::fs::create_dir_all(&claude_dir)?; + let config_path = home.join(".claude.json"); // Read existing settings let mut settings: Value = if config_path.exists() { @@ -259,7 +255,7 @@ pub fn remove_mcp_from_app( fn remove_mcp_from_claude(server_id: &str) -> Result<(), Box> { let home = dirs::home_dir().ok_or("Cannot find home directory")?; - let config_path = home.join(".claude").join("settings.json"); + let config_path = home.join(".claude.json"); if !config_path.exists() { return Ok(()); @@ -357,11 +353,11 @@ pub fn remove_mcp_from_all_apps( Ok(()) } -/// Import MCP servers from Claude's settings.json +/// Import MCP servers from Claude's .claude.json pub fn import_mcp_from_claude( ) -> Result, Box> { let home = dirs::home_dir().ok_or("Cannot find home directory")?; - let config_path = home.join(".claude").join("settings.json"); + let config_path = home.join(".claude.json"); if !config_path.exists() { return Ok(Vec::new()); diff --git a/src/components/clients/LiveConfigModal.tsx b/src/components/clients/LiveConfigModal.tsx index 2f60d4037..18e5ffcec 100644 --- a/src/components/clients/LiveConfigModal.tsx +++ b/src/components/clients/LiveConfigModal.tsx @@ -8,7 +8,7 @@ interface LiveConfigModalProps { } const configPaths: Record = { - claude: "~/.claude/settings.json", + claude: "~/.claude.json", codex: "~/.codex/auth.json & config.toml", gemini: "~/.gemini/.env & settings.json", proxycast: "", diff --git a/src/components/switch/LiveConfigModal.tsx b/src/components/switch/LiveConfigModal.tsx index 2f60d4037..18e5ffcec 100644 --- a/src/components/switch/LiveConfigModal.tsx +++ b/src/components/switch/LiveConfigModal.tsx @@ -8,7 +8,7 @@ interface LiveConfigModalProps { } const configPaths: Record = { - claude: "~/.claude/settings.json", + claude: "~/.claude.json", codex: "~/.codex/auth.json & config.toml", gemini: "~/.gemini/.env & settings.json", proxycast: "", diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 65f988dbd..be38f9f62 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -1,6 +1,15 @@ /// /// +// SVG 模块声明 - 支持 ?react 后缀导入为 React 组件 +declare module "*.svg?react" { + import * as React from "react"; + const ReactComponent: React.FunctionComponent< + React.SVGProps & { title?: string } + >; + export default ReactComponent; +} + // 全局类型声明 declare global { type NotificationPermission = "default" | "denied" | "granted";