From 41008e9282d75eed4a84fbc6d858a92c18766e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=88=AA=E5=AE=87?= <3364451258@qq.com> Date: Tue, 26 May 2026 08:27:16 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E4=BB=8E=E4=BB=93=E5=BA=93=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=20CLAUDE.md=20=E5=92=8C=20.claude/=20=E5=86=85?= =?UTF-8?q?=E9=83=A8=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 这些是 Claude Code 工具的内部配置文件,对开源项目用户无意义。 Co-Authored-By: Claude Opus 4.7 --- .claude/settings.local.json | 28 ------- .gitignore | 3 +- CLAUDE.md | 161 ------------------------------------ 3 files changed, 2 insertions(+), 190 deletions(-) delete mode 100644 .claude/settings.local.json delete mode 100644 CLAUDE.md diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index 7f64afa..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(cmake --build build)", - "Bash(npm --version)", - "Bash(npm create *)", - "Bash(npm install *)", - "Bash(npx tauri *)", - "Bash(rm -f src/App.css src/index.css)", - "Bash(rm -rf src/assets)", - "Bash(npm run *)", - "Bash(npx tsc *)", - "Bash(npx vite *)", - "Bash(cargo check *)", - "Bash(rustup show *)", - "Bash(rustup toolchain *)", - "Bash(npx vitest *)", - "Bash(cargo build *)", - "Bash(where link.exe)", - "Bash(dir \"C:\\\\Program Files\\\\Microsoft Visual Studio\")", - "Bash(dir \"C:\\\\Program Files \\(x86\\)\\\\Microsoft Visual Studio\")", - "Bash(rustup override *)", - "Bash(dir *)", - "Bash(cargo clean *)", - "Bash(\"D:/settings/Language/Rust/mingw64/bin/gcc.exe\" --version)" - ] - } -} diff --git a/.gitignore b/.gitignore index 01512bb..4ca8507 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,5 @@ dist-ssr *.njsproj *.sln *.sw? -.claude/worktrees/ +.claude/ +CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index e307a36..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,161 +0,0 @@ -# CLAUDE.md - -## 项目概述 - -PathEditor v4.0 — Windows 系统环境变量 (PATH) 编辑器,使用 Tauri 2.x + React 19 + TypeScript + Rust 构建。 - -## 构建命令 - -```bash -# 安装前端依赖 -npm install - -# 开发模式(热更新) -npx tauri dev - -# 仅前端(浏览器预览,无注册表功能) -npm run dev - -# 前端测试 -npm test -npm run test:watch - -# Rust 后端检查 -cd src-tauri && cargo check - -# Rust 后端测试(需要 MinGW bin 在 PATH) -cd src-tauri && cargo test - -# 生产构建 -npm run build - -# 完整构建(生成 NSIS 安装包) -npx tauri build -``` - -## 架构 - -前后端分离,通过 Tauri IPC 通信。核心原则:**纯逻辑放前端 `core/`,只有注册表/系统操作用 Rust 后端**。 - -``` -src/ # React 前端 (TypeScript strict 模式) -├── core/ # 纯逻辑 — 零 React/零 Tauri 依赖 -│ ├── undo-redo.ts # 撤销/重做管理器(8 种操作类型,不可变 string[]) -│ ├── path-manager.ts # 路径分析、清理(纯函数,不可变) -│ ├── import-export.ts # JSON/CSV/TXT 导入导出 -│ └── validation.ts # 路径格式验证、split/join -├── store/ # Zustand 状态管理 -│ ├── app-store.ts # 主状态(路径、撤销、CRUD、加载/保存、isSaving 守卫、snapshot 比较) -│ └── theme-store.ts # 深色/浅色模式(localStorage 持久化) -├── components/ -│ ├── layout/ # AppShell、TitleBar、StatusBar、ErrorBoundary -│ ├── path-list/ # PathTable(异步验证、颜色编码、tooltip)、MergePreview -│ ├── toolbar/ # ToolBar、ActionButtons、UndoRedoButtons、SearchInput -│ ├── dialogs/ # PathEditDialog、HelpDialog、ImportDialog -│ └── ui/ # Modal(共享遮罩层)、buttons(共享样式) -├── hooks/ -│ ├── use-app-actions.ts # CRUD/导入导出/键盘/双击操作集中管理 -│ ├── use-keyboard.ts # 全局快捷键(ref 模式避免重复注册) -│ └── use-path-validation.ts # 路径验证 hook(空壳,验证逻辑在 PathTable 内联) -├── i18n/ -│ ├── index.ts # i18next 初始化 -│ └── locales/ # zh-CN.json / en.json -└── config/ - └── default.json # 撤销上限、PATH 长度限制 - -src-tauri/ # Tauri Rust 后端 -├── src/ -│ ├── commands/ -│ │ ├── registry.rs # 注册表读写(通用 load/save 函数 + 6 个单元测试) -│ │ ├── system.rs # check_admin、validate_path、expand_env_vars、broadcast(+ 4 个测试) -│ │ └── backup.rs # backup_registry、get_appdata_dir(共享 backup_base_dir) -│ ├── error.rs # AppError 结构体(保留供未来迁移) -│ └── lib.rs # 注册所有 IPC commands + tauri-plugin-dialog -├── Cargo.toml # winreg + dirs + chrono -└── tauri.conf.json - -tests/unit/ # Vitest 前端单元测试(4 文件 45 个测试) -``` - -## 数据模型 - -所有路径数据在前端用 **不可变 `string[]`** 存储。每次 CRUD 操作创建新数组通过 `set()` 写入 Zustand,Zustand 通过引用比较自动触发重渲染。 - -```typescript -// app-store.ts 核心模式 -addPath: (path, target) => { - const newList = [...list, path]; // 不可变:创建新数组 - state.undoRedo.push({ ... }); // 记录撤销 - set({ sysPaths: newList }); // Zustand 检测到新引用 → 重渲染 -}, -``` - -`isModified` 通过与上次保存时的快照比较判断,而非简单设 `true`/`false`: -```typescript -_markDirty: () => { - const { _savedSys, _savedUser, sysPaths, userPaths } = get(); - set({ isModified: !(arraysEqual(sysPaths, _savedSys) && arraysEqual(userPaths, _savedUser)) }); -}, -``` - -## IPC 接口(Rust → Frontend) - -| Command | 参数 | 返回值 | 功能 | -|---------|------|--------|------| -| `load_system_paths` | — | `Result, String>` | 从 HKLM 注册表读取系统 PATH | -| `load_user_paths` | — | `Result, String>` | 从 HKCU 注册表读取用户 PATH | -| `save_system_paths` | `paths: Vec` | `Result<(), String>` | 保存系统 PATH(含 32767 字符上限检查) | -| `save_user_paths` | `paths: Vec` | `Result<(), String>` | 保存用户 PATH | -| `check_admin` | — | `bool` | 通过尝试 KEY_WRITE 检测管理员权限 | -| `validate_path` | `path: &str` | `bool` | 检查目录是否存在(含 `%` 自动返回 true) | -| `expand_env_vars` | `path: &str` | `String` | 展开 `%VAR%` 环境变量(API 失败时返回原始路径 + `log::warn`) | -| `broadcast_env_change` | — | `()` | 广播 `WM_SETTINGCHANGE` 通知其他进程 | -| `backup_registry` | `custom_dir, sysPaths, userPaths` | `Result` | 备份 PATH 到时间戳文件 | -| `get_appdata_dir` | — | `String` | 获取备份目录路径 | - -## 撤销/重做 - -`UndoRedoManager` 类(`src/core/undo-redo.ts`),8 种操作类型,最多 50 步历史。 - -核心 API:`undo/redo` 接收 `string[]`,返回新 `[string[], string[]] | null`。 - -```typescript -class UndoRedoManager { - push(record: OpRecord): void; - undo(sys: string[], user: string[]): [string[], string[]] | null; - redo(sys: string[], user: string[]): [string[], string[]] | null; - canUndo(): boolean; - canRedo(): boolean; -} -``` - -## 错误处理 - -### 前端 - -| 场景 | 处理 | -|------|------| -| IPC 调用失败 | `Promise.allSettled` 精确报告哪个 hive 保存失败 | -| JSON 文件损坏 | `importFromJson` try/catch,返回空结果 | -| 保存并发双击 | `isSaving` 守卫,第二次调用直接 return | -| 备份创建失败 | `.catch()` 显示 warning_backup,保存继续 | -| 渲染异常 | ErrorBoundary 捕获 + console.error + 重试按钮 | -| 取消按钮误点 | 检查 `isModified`,弹出确认框 | -| 拖拽非文件夹 | `webkitGetAsEntry().isDirectory` 过滤 | - -### Rust 后端 - -- 注册表操作:全部返回 `Result`,中文错误消息 -- FFI 调用:失败时 `log::warn` + 返回安全回退值 -- PATH 长度:写入前检查 32767 字符上限 -- SAFETY 注释:所有 `unsafe` 块均有文档 - -## 关键约束 - -- **TypeScript**:`strict: true`,零编译错误 -- **Rust 工具链**:`stable-x86_64-pc-windows-gnu`(项目已设 override) -- **MinGW 兼容**:`.cargo/config.toml` 添加 `-lmcfgthread`(GCC 15.2.0 运行时) -- **crate-type**:移除 `cdylib` 避免 DLL 导出序数溢出 -- **运行权限**:需要管理员权限才能编辑系统 PATH,非管理员自动进入只读模式 -- **Rust 测试**:`cargo test` 需要 MinGW bin 在 PATH 中(`libmcfgthread-2.dll`),开发模式建议 `npx tauri dev` -- **构建产物**:NSIS 安装包,约 8MB