diff --git a/CODE_REVIEW.md b/CODE_REVIEW.md deleted file mode 100644 index cf2ea2a..0000000 --- a/CODE_REVIEW.md +++ /dev/null @@ -1,126 +0,0 @@ -# CC Switch(Electron → Tauri)代码走查与优化建议 - -- 目的:记录此次针对前后端(React/TypeScript + Tauri/Rust)的全面走查结论与可落地优化点。 -- 方法:从项目结构、主进程逻辑、前端状态与交互、持久化与文件操作、构建与配置一致性等维度逐项审查,输出问题清单与具体改动建议。 - -## 逻辑正确性 - -- 自动导入 default 的重复路径风险: - - 现状:Rust `setup` 内自动导入,前端在供应商为空时也会调用 `import_default_config`;若两端先后成功,可能对同一 `id: "default"` 重复写入(虽为覆写但无必要)。 - - 建议:`import_default_config` 命令中先检查 `providers` 是否已有 `default`,存在则直接 `Ok(true)` 返回。 -- 配置路径显示可能误导: - - 现状:前端用 `getClaudeCodeConfigPath` 显示“配置文件位置”,即使文件不存在也显示候选路径。 - - 建议:用 `getClaudeConfigStatus`(含 `exists`)替换,并在 UI 显示“未创建,切换或保存时自动创建”。 -- 打开外链健壮性: - - 现状:`open_external` 对缺少协议的 URL(如 `example.com`)可能失败。 - - 建议:Rust 端规范化,未以 `http://`/`https://` 开头则自动补 `https://`。 -- 复制主配置前的目录兜底: - - 现状:`switch_provider` 复制到主配置文件前未确保父目录存在(大多已存在,但存在边界风险)。 - - 建议:在复制前创建 `settings_path.parent()` 目录。 - -## 类型与健壮性 - -- 定时器类型: - - 现状:`useRef`;在浏览器环境 `setTimeout` 返回 `number`,类型不一致。 - - 建议:改为 `useRef | null>` 并统一 `clearTimeout`。 -- Provider 配置最小校验: - - 现状:仅校验是否为合法 JSON。 - - 建议:前端提交前检查 `env.ANTHROPIC_BASE_URL`、`env.ANTHROPIC_AUTH_TOKEN` 等关键字段类型;Rust 端 `add/update_provider` 可再做一层基础校验,返回友好错误。 -- 供应商文件名清洗: - - 现状:仅替换非法字符并小写化。 - - 建议: - - 空白替换为 `-`,连续 `-` 合并为单个。 - - 过长名称截断,降低跨平台文件系统问题概率。 - -## 用户体验 - -- “打开官网”语义与失败反馈: - - 现状:`` 伪链接;失败只 `console.error`。 - - 建议:使用按钮或 `role="button"`,失败时显示通知(沿用全局浮动通知组件)。 -- 通知淡出时长硬编码: - - 现状:JS 用 `300ms` 与 CSS 动画强绑定。 - - 建议:提取为常量或用动画结束事件,避免样式变更导致时间不一致。 -- 自动填充官网地址: - - 现状:`extractWebsiteUrl` 仅在匹配 `https://api.` 时去前缀,策略合理。 - - 建议:保留现状,并在 UI 旁提示“自动推断,可手动修改”。 - -## 前端结构与可维护性 - -- 自动导入策略统一: - - 现状:Rust 与前端均可能触发默认导入。 - - 建议:前端仅展示“导入当前 Claude Code 配置为 default”的按钮(或保留静默导入但配一次性提示);避免重复路径与认知负担。 -- 预设与 API Key 注入: - - 现状:选择预设后,输入 Key 会实时写入 `settingsConfig`。 - - 建议:在保存时再进行一次注入校验,UI 加只读提示“保存时写入”,避免误解已永久保存。 -- 打开配置目录按钮文案: - - 现状:固定为“打开”。 - - 建议:依据 `exists` 显示“打开配置目录”或“创建并打开配置目录”。 - -## Rust 侧结构与持久化 - -- 错误上下文: - - 现状:大多数错误已包含路径信息。 - - 建议:保持现状,确保关键 I/O 错误信息包含“目标路径 + 具体原因”。 -- 锁粒度: - - 现状:命令中修改后释放锁再保存,合理。 - - 建议:保持现状。 -- 日志: - - 现状:`tauri-plugin-log` 仅在 debug 下启用。 - - 建议:release 也输出 Warn 级别到 `~/.cc-switch/app.log`,便于用户反馈问题。 - -## 配置与构建 - -- 版本一致性: - - 现状:`package.json` 版本 `2.0.3`,`src-tauri/tauri.conf.json` 为 `3.0.0-beta.1`。 - - 建议:统一版本号,避免混淆。 -- 依赖清理: - - 现状:`@tauri-apps/plugin-shell` 未被使用。 - - 建议:移除无用依赖,保持最小化。 -- 产物目录: - - 现状:`dist/` 存在,本仓库 `.gitignore` 已忽略。 - - 建议:保持忽略,避免误提交产物。 - -## 建议的具体改动(示例) - -- 防重导入 default: - - 文件:`src-tauri/src/commands.rs` - - 位置:`import_default_config` 内加锁后 - - 变更:若 `manager.providers.contains_key("default")` 则直接返回 `Ok(true)`。 -- 复制主配置前确保目录存在: - - 文件:`src-tauri/src/provider.rs` - - 位置:`switch_provider` 在 `copy_file` 前 - - 变更:`create_dir_all(settings_path.parent())` 兜底。 -- 规范化外链 URL: - - 文件:`src-tauri/src/commands.rs` - - 位置:`open_external` - - 变更:非 `http(s)://` 开头自动补 `https://`。 -- 配置路径展示基于存在性: - - 文件:`src/App.tsx` - - 位置:配置路径加载逻辑 - - 变更:改用 `getClaudeConfigStatus`,结合 `exists` 决定展示文案与按钮态。 -- 定时器类型修正: - - 文件:`src/App.tsx` - - 位置:`timeoutRef` 定义处 - - 变更:`useRef | null>(null)`。 -- 文件名清洗增强: - - 文件:`src-tauri/src/config.rs` - - 位置:`sanitize_provider_name` - - 变更:空白替换为 `-`、连续 `-` 合并、过长截断。 - -## 可选优化 - -- 前端轻量校验:使用本地校验(或 zod)检查关键字段格式与类型,错误在表单内联展示。 -- 按钮可用态与提示:`ProviderList` 的三按钮增加 `title` 提示,失败提示复用浮动通知。 -- 日志落盘:release 模式按 Warn 级别落盘,便于排障。 - -## 结论与建议 - -- 当前代码结构清晰,核心逻辑(供应商 CRUD、文件持久化、切换备份)正确,能够可靠完成从 Electron 到 Tauri 的迁移目标。 -- 建议优先落地的改动: - - 防重导入 default; - - 定时器类型与外链规范化; - - 复制主配置前的目录兜底; - - 用 `getClaudeConfigStatus` 驱动配置路径 UI; - - 版本号统一与依赖清理。 -- 如需我直接按上述方案修改代码并提交,请告知优先级或指定改动范围。 - diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..9a8c130 Binary files /dev/null and b/icon.png differ diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png index e5a55c2..b74a562 100644 Binary files a/src-tauri/icons/128x128.png and b/src-tauri/icons/128x128.png differ diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png index 31c6223..259a97a 100644 Binary files a/src-tauri/icons/128x128@2x.png and b/src-tauri/icons/128x128@2x.png differ diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png index 11ec458..e1b26fe 100644 Binary files a/src-tauri/icons/32x32.png and b/src-tauri/icons/32x32.png differ diff --git a/src-tauri/icons/64x64.png b/src-tauri/icons/64x64.png index bac717b..9edca98 100644 Binary files a/src-tauri/icons/64x64.png and b/src-tauri/icons/64x64.png differ diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png index 7531b71..ce86ac2 100644 Binary files a/src-tauri/icons/Square107x107Logo.png and b/src-tauri/icons/Square107x107Logo.png differ diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png index 9fa6c66..97d2e09 100644 Binary files a/src-tauri/icons/Square142x142Logo.png and b/src-tauri/icons/Square142x142Logo.png differ diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png index eb37c72..ea72abf 100644 Binary files a/src-tauri/icons/Square150x150Logo.png and b/src-tauri/icons/Square150x150Logo.png differ diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png index 2124074..bdfcf5d 100644 Binary files a/src-tauri/icons/Square284x284Logo.png and b/src-tauri/icons/Square284x284Logo.png differ diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png index 603dcba..cce8eaf 100644 Binary files a/src-tauri/icons/Square30x30Logo.png and b/src-tauri/icons/Square30x30Logo.png differ diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png index a65751f..25bd166 100644 Binary files a/src-tauri/icons/Square310x310Logo.png and b/src-tauri/icons/Square310x310Logo.png differ diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png index ca155ba..2b58ac9 100644 Binary files a/src-tauri/icons/Square44x44Logo.png and b/src-tauri/icons/Square44x44Logo.png differ diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png index 7ef6777..ba44918 100644 Binary files a/src-tauri/icons/Square71x71Logo.png and b/src-tauri/icons/Square71x71Logo.png differ diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png index c59dbce..9a94184 100644 Binary files a/src-tauri/icons/Square89x89Logo.png and b/src-tauri/icons/Square89x89Logo.png differ diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png index 5cdeeec..8cade12 100644 Binary files a/src-tauri/icons/StoreLogo.png and b/src-tauri/icons/StoreLogo.png differ diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns index cbd860c..1914344 100644 Binary files a/src-tauri/icons/icon.icns and b/src-tauri/icons/icon.icns differ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png index 1d8adcd..9a8c130 100644 Binary files a/src-tauri/icons/icon.png and b/src-tauri/icons/icon.png differ