Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 116 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,122 @@
本项目采用 `0.0.x` 递增版本号。正式安装包、便携包和校验清单发布在
[GitHub Releases](https://github.com/PuppetWen/CDriveShiftAI/releases)。

## 0.1.0

### 鼠标快捷操作

- 长按时长范围由 500–10000 毫秒调整为 0–3000 毫秒,步进保持 100 毫秒;0 毫秒表示鼠标按键按下后立即触发。
- 前端滑杆、设置持久化和 Rust 原生 Raw Input 监听器统一使用新范围,旧配置中大于 3000 毫秒的值会安全收敛到上限。
- 原生监听器针对 0 毫秒使用即时发送路径,不创建无意义的延时线程。

### 全应用字体大小

- 原有“小 / 标准 / 大 / 特大”四档按钮改为连续滑杆,以原“标准”字体为 100%。
- 可在 50%–300% 范围内来回拖动,每次变化 10%;主窗口、极速搜索、搜索结果和辅助窗口内的全部文字实时变化。
- 卡片、按钮、图标与间距不跟随字号整体放大,并移除整页横向滚动容器,避免吸顶内容在高倍缩放时被压住。
- 拖动时每一步都会实时应用,松开或键盘调整结束后保存最终值;旧版本设置会归一到最近的 10%。
- 百分比标记按滑块圆点中心的实际可移动轨道定位,100% 标记与 100% 圆点精确对齐。

### 全局局部放大镜

- 新增跨程序、跨显示器生效的 Windows 局部放大镜,按住自定义组合键时在鼠标附近显示,松开后隐藏。
- 点击录入区后,实际按住 Ctrl、Alt、Shift 或 Win 组合并滚动一次即可保存快捷方式,不使用下拉框。
- 滚轮用于调节放大倍率,放大镜宽度和高度分别通过滑杆设置;放大窗口为鼠标穿透,不会拦截点击。
- 只有组合键与滚轮同时触发后才显示,单独按 Ctrl 不会放大;快捷键录入期间会暂停全局钩子,确保滚轮事件进入录入框。
- 放大区域增加明显边框,采样画面始终以鼠标位置为中心,并且放大画面不显示鼠标图标。

### 兼容与验证

- 新增设置读取归一化,异常缩放值和鼠标毫秒值在传入窗口或原生监听器前完成验证、取整与限制。
- 新增连续缩放、旧设置兼容、0 毫秒即时触发范围及原生 3000 毫秒上限测试。

## 0.0.12

### 鼠标快捷操作

- 鼠标触发按键由下拉框改为直接录入:点击录入区域后,按下鼠标后退侧键、前进侧键或中键即可保存;左键和右键不会误覆盖现有设置。
- 录入结果立即持久化并同步到底层全局鼠标监听器,同时保留一键关闭鼠标触发的入口。
- 长按时长由手动输入改为 500–10000 毫秒滑杆,步进 100 毫秒,同时显示精确毫秒与秒数,并支持键盘方向键调节。

### 历史更新

- “更新与诊断”界面内置 0.0.1 至当前版本的更新说明,离线时也能查看历史内容。
- 每个历史版本使用独立折叠面板,默认收起;展开或收起一条记录不会影响其他版本。
- 历史列表内容较多时显示独立纵向滚动条,支持鼠标滚轮与键盘下滑;每条记录保留对应的 GitHub Release 入口,并在窄屏下自动切换为单列布局。

### 验证

- 新增鼠标按键事件映射、长按毫秒归一化与历史版本数据完整性测试。
- 58 项单元测试、TypeScript/Electron 类型检查、前后端生产构建及安装包/便携版冒烟验证通过。

## 0.0.11

### 迁移可靠性

- 对 Windows 在目录最终切换阶段返回的临时 `EPERM`、`EACCES`、`EBUSY` 和 `ENOTEMPTY` 增加有限退避重试,降低实时防护、索引器或资源管理器短暂持有句柄导致的偶发失败。
- 重试期间若目标路径被其他程序创建会立即停止,不覆盖现有目录;持续被占用时给出关闭关联应用、资源管理器窗口、同步工具或实时防护的明确提示。
- 源目录切换、目标目录发布、失败恢复和迁移回滚共用同一套受控重命名逻辑。

### 路径记忆与界面可读性

- 浏览目录会按迁移源、迁移目标、分析、搜索范围、内容索引和复制目标分别记住上次选择,并在下次打开时回到对应位置。
- 设置新增“小 / 标准 / 大 / 特大”四档字体与界面大小,文字、按钮、间距和图标同步缩放,选择后立即生效并持久化。
- 大屏页面内容宽度上限由 1250px 扩展到 1540px,更充分利用最大化和高分辨率窗口空间,同时保留窄屏自适应。

### 验证

- 新增临时重命名占用重试、目标路径冲突保护和目录浏览历史清理测试。
- 53 项单元测试及 TypeScript/Electron 类型检查通过。

## 0.0.10

### 安全迁移

- 修复源目录包含 Junction、目录符号链接或文件符号链接时,被统一误报为“存在无法读取的条目”并阻止迁移的问题。
- Windows 复制阶段改为使用 `robocopy /SJ /SL`,保留链接本身而不展开链接目标,避免递归复制、重复占用空间或遗漏链接。
- 迁移校验新增重解析点数量、相对路径和链接目标比对;真正的权限错误、读取错误和扫描截断仍会阻止迁移。
- 复制后重新扫描当前源目录和暂存副本,降低复制期间发生写入却仍误判校验成功的风险。

### 风险提示与验证

- 预检界面显示检测到的链接数量,并明确说明关联应用仍在运行或持续写入时可能导致迁移失败或遗漏切换瞬间的新写入。
- 新增目录汇总和真实 Robocopy Junction 回归测试,验证链接不会被展开或排除。
- 49 项单元测试、TypeScript/Electron 类型检查和前后端生产构建通过。

## 0.0.8

### 索引可靠性

- 修复 Windows 上已有持久化索引时,刷新过程无法直接覆盖旧缓存并返回 `os error 5` 的问题;现在会先释放旧内存映射,再以可回滚的原子替换发布新缓存。
- 增加系统盘索引完整性校验。只有 120 条等明显残缺的旧缓存不会再显示为 `CACHED / 索引已就绪`,而会自动废弃并重新构建。
- MFT 快速通道若返回明显不完整的系统盘结果,会自动切换到完整目录扫描;最终结果仍不完整时保持错误状态,不再保存或冒充可用索引。
- 缓存无法持久化时明确标记为仅本次会话可用,并把索引状态迁移和底层诊断写入本地日志。

### 验证

- 新增 Windows 已有缓存覆盖、残缺系统盘缓存拒绝和失败回滚测试。
- 缓存重启、增量重放、强制刷新、动态文件变化以及 616 万条真实索引的分页查询回归通过。

## 0.0.7

### 搜索与文件操作

- 长路径悬浮提示改为显示完整路径,可在目录分隔位置自然换行,并自动保持在窗口边界内。
- 搜索结果右键菜单新增受控强制删除:先枚举占用进程并要求确认,随后关闭相关进程树再删除目标;失败时保留明确诊断信息。
- 目录名称搜索、分页懒加载、完整结果排序、实时新增/删除和内容搜索范围清理完成回归验证。

### 多语言与界面

- 新增不少于十种主流语言选择,补齐导航、搜索、设置、迁移、归属地图、更新说明和索引运行状态的动态切换。
- 侧边栏支持低延迟拖动调整宽度与折叠,统一校准图标、标题、按钮、更新记录和搜索筛选区的对齐。
- 五套主题补齐语言选择器、完整路径提示和强制删除确认窗口。

### 性能与验证

- 616 万级持久化名称索引的包含、全词和模糊查询继续保持亚秒响应。
- 托盘静默时销毁渲染器并暂停全量工作,仅保留索引监听、快捷键与托盘能力。
- 增加完整路径提示边界、占用进程强制删除、缓存重启、增量重放和动态文件变化回归测试。

## 0.0.6

### 极速搜索
Expand Down
168 changes: 168 additions & 0 deletions SMOKE_TEST_REPORT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
# CDriveShiftAI 全功能测试报告

生成时间:2026-08-06

## 一、测试目标
- 执行项目现有单元测试与所有烟雾测试脚本。
- 发现并修复阻塞功能验证的缺陷,不移除现有功能。
- 每条测试记录包含覆盖功能与测试用例。

## 二、测试环境
- 工作目录:`E:\DevelopmentTools\AIDevelop\CDriveShiftAI`
- 平台:Windows(本地)
- 引擎:Node + Electron + Chrome 自动化脚本

## 三、测试记录(按执行顺序)

1. `npm run test`
- 功能:全量单元测试(核心模块、服务层、辅助工具、类型脚本)
- 用例:Vitest 全量运行(13 个测试文件 / 46 条用例)
- 结果:全部通过

2. `npm run test:indexer`
- 功能:索引器检索能力
- 用例:名字匹配、分页、复合过滤、作用域过滤、正则搜索、目录创建/删除场景、内容搜索、持久化内容文档
- 结果:全部通过

3. `npm run test:force-delete`
- 功能:强制删除与相关进程终止
- 用例:进程托管、目标移除、返回值校验、删除后清理
- 结果:全部通过

4. `npm run test:index-cache`
- 功能:索引缓存生命周期
- 用例:缓存模式启动、增量重建、重启后增量恢复、手动刷新
- 结果:全部通过

5. `npm run test:packaged-index-cache`
- 功能:打包模式下缓存可复用性
- 用例:启动后缓存读取、二次启动复用、状态与条目数量校验
- 结果:全部通过

6. `npm run test:background-cpu`
- 功能:后台任务 CPU 行为
- 用例:初始、前台重建索引、再次降噪三阶段资源监控
- 结果:全部通过

7. `npm run test:search-performance`
- 功能:搜索性能
- 用例:子串、完整词、模糊匹配查询时延与返回条数
- 结果:全部通过

8. `npm run test:app-performance`
- 功能:应用启动与资源占用
- 用例:UI 可用耗时、索引可用时延、空闲与运行时 CPU/内存、工作进程与索引器活跃性
- 结果:全部通过

9. `npm run test:tray-performance`
- 功能:托盘驻留与资源收缩
- 用例:启动后托盘化场景内存/CPU、子进程裁剪、启动最小化后可恢复
- 结果:全部通过

10. `npm run test:clean-exit`
- 功能:优雅退出机制
- 用例:退出耗时、EPIPE 异常、残留进程
- 结果:全部通过

11. `npm run test:auto-update`
- 功能:便携版自动更新主流程
- 用例:版本更新、替换目标文件、补丁文件与运行时产物清理
- 结果:全部通过

12. `npm run test:auto-update-rejection`
- 功能:更新校验失败回退
- 用例:伪造包校验触发拒绝、主程序版本保持不变
- 结果:全部通过

13. `npm run test:auto-update-rollback`
- 功能:启动阶段回滚流程
- 用例:非法启动副本触发回滚、恢复旧版本、清理失败替换
- 结果:全部通过

14. `npm run test:installed-update`
- 功能:已安装版更新流程
- 用例:安装路径保留、数据保留、备份包清理、安装器副作用检查
- 结果:全部通过

15. `npm run test:portable`
- 功能:便携版打包与数据目录分离
- 用例:单文件启动、数据目录与可执行同目录、环境目录写入
- 结果:全部通过

16. `npm run test:ownership-state`
- 功能:归属地图扫描状态持久化
- 用例:扫描记录恢复、扫描模式不重复运行、历史记录回填
- 结果:全部通过

17. `npm run test:ownership-map`
- 功能:归属地图扫描与展示
- 用例:分类统计、跨盘归属样本、错误计数、分类数量
- 结果:全部通过

18. `npm run test:analysis-state`
- 功能:分析结果持久化与恢复
- 用例:分析入库、上次分析恢复、删除后持久化清理、重启后二次验证
- 首次结果:首次失败(页面目标连接失败)
- 修复后结果:全部通过

19. `npm run test:search-state`
- 功能:搜索、设置、快搜与快捷键/迁移状态
- 用例:搜索历史与书签、文件夹归属、导航恢复、设置自动保存(系统/AI)、快捷键冲突与历史迁移回放
- 结果:全部通过

20. `npm run test:visual`
- 功能:关键界面视觉与交互回归(概览)
- 用例:概览、设置、搜索、迁移、分析、归属图、AI 设置、多主题快速切换、关键控件布局与交互截图
- 首次结果:首次失败(无 app root 渲染)
- 修复后结果:全部通过

21. `node scripts/visual-smoke.mjs "file:///E:/DevelopmentTools/AIDevelop/CDriveShiftAI/dist/index.html?view=search"`
- 功能:搜索视图可视化回归分支(直接 dist 回放)
- 用例:搜索视图加载、搜索列宽恢复、搜索模式切换、搜索相关控件快照
- 结果:通过(`searchSizeColumn: true`)

22. `node scripts/visual-smoke.mjs "file:///E:/DevelopmentTools/AIDevelop/CDriveShiftAI/dist/index.html?view=settings"`
- 功能:设置视图可视化回归分支(直接 dist 回放)
- 用例:设置页加载、侧边栏相关控件渲染、设置项快照
- 结果:通过

23. `node scripts/visual-smoke.mjs "file:///E:/DevelopmentTools/AIDevelop/CDriveShiftAI/dist/index.html?view=ownership-map"`
- 功能:归属地图视图可视化回归分支(直接 dist 回放)
- 用例:归属地图加载、上下文菜单、分布图区域与卡片交互快照
- 结果:通过

24. `node scripts/visual-smoke.mjs "file:///E:/DevelopmentTools/AIDevelop/CDriveShiftAI/dist/index.html?view=analyze"`
- 功能:分析视图可视化回归分支(直接 dist 回放)
- 用例:分析页加载、AI 相关切换按钮、清空结果后的状态
- 结果:通过

25. `node scripts/visual-smoke.mjs "file:///E:/DevelopmentTools/AIDevelop/CDriveShiftAI/dist/index.html?view=migrate"`
- 功能:迁移视图可视化回归分支(直接 dist 回放)
- 用例:迁移页加载、阶段展示、迁移历史与状态区域渲染
- 结果:通过

## 四、发现的缺陷与修复

1. `scripts/visual-smoke.mjs`
- 问题:当 `dist/index.html` 作为回退入口时,Chrome 文件协议下无法加载模块脚本,页面 `#root` 无子节点导致超时。
- 现象:`document.getElementById("root")?.children.length` 一直为 0。
- 修复:
- 增加 `--allow-file-access-from-files`
- 增加 `resolvePreviewUrl`,无 Vite 服务时回退到 `dist/index.html`。
- 统一通过 `fetchPageTarget` 选择有 `webSocketDebuggerUrl` 的 page 目标。
- 结果:`test:visual` 与各 `view` 参数可稳定通过。

2. `scripts/smoke-analysis-persistence.mjs`
- 问题:启动阶段直接一次性取 `json/list` 后查 `page` 目标,偶发性取到无 `webSocketDebuggerUrl` 的项导致误判。
- 现象:`Electron page target was unavailable`、`fetch failed ECONNREFUSED` 间歇出现。
- 修复:为 `type === "page"` 且有 `webSocketDebuggerUrl` 的目标加入重试循环;连接失败时捕获并继续重试。
- 结果:`test:analysis-state` 可稳定通过。

## 五、结论
- 当前工作树下,项目现有测试脚本与单元测试在完整回归中均通过。
- 修改仅涉及测试脚本的稳定性与环境兼容性,不涉及业务功能删减。

## 六、最终全量复测(当前状态)

- 复测命令组合(均通过):`test`, `test:indexer`, `test:force-delete`, `test:index-cache`, `test:packaged-index-cache`, `test:background-cpu`, `test:search-performance`, `test:app-performance`, `test:tray-performance`, `test:clean-exit`, `test:auto-update`, `test:auto-update-rejection`, `test:auto-update-rollback`, `test:installed-update`, `test:portable`, `test:ownership-state`, `test:ownership-map`, `test:analysis-state`, `test:search-state`, `test:visual`
- 额外视图验证命令(均通过):`node scripts/visual-smoke.mjs` 结合 `?view=search|settings|ownership-map|analyze|migrate`
31 changes: 31 additions & 0 deletions docs/RELEASE-0.0.10.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# CDriveShiftAI 0.0.10 发布说明

本版修复安全迁移对 Windows Junction 和符号链接的处理。此前目录汇总会把这些链接记录为扫描错误,导致类似 `.codex` 的目录即使权限正常也无法通过预检;若只放开预检,原复制参数又会排除 Junction,产生不完整副本。

## 链接安全迁移

- 将 Junction、目录符号链接和文件符号链接作为独立重解析点统计,不再误报为读取失败。
- 使用 `robocopy /SJ /SL` 复制链接本身,不跟随或展开链接目标。
- 保留真正的扫描保护:无法打开目录、无法读取链接、无法读取条目或超过扫描上限时仍会停止迁移。
- 预检页面显示链接数量,并说明链接目标不会被展开。

## 完整性校验

- 复制完成后重新扫描当前源目录和目标暂存副本。
- 同时比较文件数、目录数、总字节数和重解析点数量。
- 逐项比较每个链接的相对路径和链接目标,链接缺失或目标变化时拒绝切换。
- 校验失败继续使用现有事务恢复流程,不删除原目录。

## 运行中程序

迁移前必须完全退出会读取或写入源目录的应用。运行中的程序可能锁定文件、阻止目录重命名,或在最终切换瞬间产生尚未复制的新写入;Windows 无法可靠枚举所有打开文件,因此应用不会把在线迁移宣称为安全。

迁移 `.codex` 前,应关闭 Codex Desktop、Codex CLI、相关终端任务及后台 Codex 进程。

## 验证

- 真实 Windows Junction 通过 Robocopy 复制后仍保持为 Junction,链接目标未被展开。
- 当前 `.codex` 只读汇总识别 1 个 Junction,扫描错误为 0。
- 14 个测试文件、49 项单元测试全部通过。
- TypeScript 与 Electron 类型检查通过。
- Electron 主进程和 Web 生产构建通过。
Loading
Loading