Files
PathEditor/docs/superpowers/specs/2026-05-26-v4.1-bugfix-and-cleanup-design.md
T

72 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# v4.1 Bug 修复与代码清理 — 设计文档
**日期**: 2026-05-26
**分支**: v4.1
**状态**: 已确认
## 概述
修复代码审查中发现的 3 个 bug 和 7 个代码质量问题。
---
## Bug 修复
### B1. 非连续删除 undo 位置错误
**问题**: `deletePaths([0, 3])` 后 undo 将路径恢复到位置 0、1,而非 0、3。
**修复**: `OpRecord` 新增 `indices: number[]` 字段。DELETE 操作存储已排序的原始 indices。undo 时按 indices 逐个 `splice` 恢复。redo 时按 indices 从后往前删除。
边角情况:原有连续删除的逻辑不变,indices 为 `[1,2,3]` 时效果与 `index=1, count=3` 一致。
### B2. 备份时机错误
**问题**: `backup_registry` 接收前端传来的新值(即将写入的值)做备份,而非当前注册表中的真实值。且 backup 和 save 并发执行无顺序保证。
**修复**: `backup_registry` 不再接收 paths 参数,改为内部调用 `load_paths()` 读取注册表当前值后写入备份。前端调用简化为 `invoke('backup_registry')``split_path`/`join_path` 改为 `pub(crate)` 供 backup 模块复用。
### B3. 验证异常返回"有效"
**问题**: `PathTable.tsx` 中 IPC 调用 `validate_path` 失败时 catch 返回 `[p, true]`,不存在的路径被标为绿色。
**修复**: 验证缓存类型从 `Map<string, boolean>` 改为 `Map<string, 'valid' | 'invalid' | 'unknown'>`。IPC 异常时存 `'unknown'`,UI 渲染为默认色(不标绿也不标红)。
---
## 代码清理
### C1. 删除 AppError 死代码
删除 `src-tauri/src/error.rs`,移除 `lib.rs` 中的 `mod error`
理由:全部 IPC 命令使用 `Result<T, String>``AppError` 从未被使用且被 `#[allow(dead_code)]` 压制。
### C2. importPaths 重命名为 replacePaths
函数行为是全量替换列表而非追加,名字应诚实。
### C3. detectExportFormat 修正
返回类型从 `'json' | 'csv'` 改为 `'json' | 'csv' | 'txt'`。TXT 文件不再被归类为 JSON。
### C4. _markDirty 收窄可见性
从 AppState 接口移除 `_markDirty`,改为 store 闭包内的模块级私有函数。CRUD 方法通过闭包直接调用。
### C5. PATH 长度阈值统一
`default.json` 中的 `maxSystemLength`/`maxUserLength` 从 2048 改为 32767,与 Rust 端 `MAX_PATH_LEN` 一致。
---
## 优化
### O1. BOM 只在首行检查
`importFromCsv``importFromTxt` 中 BOM 检查移到循环外,仅处理第一行。
### O2. split_path 重复提醒
在 Rust `registry.rs` 和 TS `validation.ts``split_path` 函数处各加一行注释,提醒修改时同步两端。