Serendipity
|
39a95cc50d
|
fix: CI 切换到 MSVC 工具链、添加 eslint.config.js
- Rust: windows-latest 默认 MSVC,无需额外安装 GNU/MinGW
- ESLint: 添加 eslint flat config(js + tseslint + react-hooks)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-27 00:58:30 +08:00 |
|
Serendipity
|
44fdc2eec6
|
fix: release 改用 gh release create、ci 添加 permissions: contents: read
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-27 00:54:07 +08:00 |
|
Serendipity
|
6dc32dca93
|
ci: 添加 CI workflow — push 自动检查 TypeScript + Rust
前端: tsc --noEmit + ESLint + Vitest (ubuntu)
Rust: cargo check + clippy + test (windows + GNU toolchain)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-27 00:52:13 +08:00 |
|
Serendipity
|
a2b66d087f
|
ci: 添加 Release workflow — tag 推送自动构建 NSIS 安装包并发布
tag v* 触发 npx tauri build,NSIS 安装包上传到 GitHub Release
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-27 00:52:12 +08:00 |
|
Serendipity
|
8c1655d25c
|
docs: 添加 v4.2 CI/CD 流水线设计文档
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-27 00:50:33 +08:00 |
|
Serendipity
|
63c8ed424b
|
docs: 添加 v4.1 bug 修复与代码清理的设计文档和实现计划
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
v4.1.1
|
2026-05-26 22:48:07 +08:00 |
|
Serendipity
|
605105da09
|
test: 移除 _markDirty 测试(函数已私有化,行为由 CRUD 测试间接覆盖)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 22:48:03 +08:00 |
|
Serendipity
|
68f4617bda
|
fix: PathTable — 环境变量展开限流20并发、消除useEffect双重触发、类型断言改为常量
- expand useEffect 增加 .slice(0, 20) 批次限制,避免大量路径时并发过高
- validatedRef / expandedRef 替代 validationCache.has / expandedCache.has 过滤,
从 useEffect 依赖数组中移除缓存 state,消除双重触发
- ValidationState 类型提升到模块层级,新增 DEFAULT_VALIDATION_STATE 常量
替代硬编码类型断言
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 22:43:03 +08:00 |
|
Serendipity
|
c30855fa70
|
refactor: backup.rs — use 语句移至文件顶部,注册表路径复用常量
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 22:42:15 +08:00 |
|
Serendipity
|
652280c2dd
|
fix: AppShell 拖拽路径用 TauriFile 接口替代 as any
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 22:41:40 +08:00 |
|
Serendipity
|
2db872c661
|
docs: undo/redo 添加注释说明为何内联计算 isModified
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 22:41:38 +08:00 |
|
Serendipity
|
1ce3ebfd9e
|
refactor: 代码清理 — 删除 AppError、重命名 replacePaths、修正 detectExportFormat、统一 PATH 长度、优化 BOM 检查、添加同步注释
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 22:14:13 +08:00 |
|
Serendipity
|
613fb51fd7
|
fix: 验证 IPC 异常时返回 unknown 状态,不再错误标记为有效路径
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 22:09:23 +08:00 |
|
Serendipity
|
be375ed3ad
|
fix: backup_registry 调用加 await,避免与 save 竞态导致备份到新值
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 22:08:05 +08:00 |
|
Serendipity
|
804e02004d
|
fix: backup_registry 改为内部读取注册表当前值,不再依赖前端传入数据
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 22:04:16 +08:00 |
|
Serendipity
|
2775a3a588
|
fix: 非连续删除 undo 恢复到错误位置 — OpRecord 新增 indices 精确记录原始位置
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 21:57:21 +08:00 |
|
Serendipity
|
26ab52483a
|
fix: 修复安装包缺少 WebView2Loader.dll 的问题
在 bundle.resources 中显式包含 WebView2Loader.dll,
GNU 工具链下 NSIS 打包器未自动检测此依赖。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 19:10:45 +08:00 |
|
Serendipity
|
775a570d31
|
feat: 导入改用原生对话框、新增 app-store 单元测试、修复窗口滚动
- handleImport 从 DOM <input> hack 改为 @tauri-apps/plugin-dialog 原生文件选择
- 新增 Rust read_text_file 命令读取文件内容,零外部依赖
- 新增 tests/unit/app-store.test.ts,25 个测试覆盖 CRUD/undo-redo/loadPaths/savePaths
- 修复 AppShell overflow-hidden 导致无法滚动窗口的问题
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 19:01:56 +08:00 |
|
Serendipity
|
41008e9282
|
chore: 从仓库移除 CLAUDE.md 和 .claude/ 内部配置文件
这些是 Claude Code 工具的内部配置文件,对开源项目用户无意义。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
v4.1.0
v4.0.0
|
2026-05-26 08:27:16 +08:00 |
|
Serendipity
|
732b2aabaa
|
docs: 重写 README.md 为开源项目风格
- 添加 badges(版本/Tauri/React/Rust/测试数)
- 按功能模块分组(路径管理/验证/撤销/导入导出/安全/界面)
- 补充安装章节(Releases + 源码构建)
- 补充贡献指南(开发环境、代码规范)
- 完整项目结构和快捷键表
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 08:22:35 +08:00 |
|
Serendipity
|
19bdb3078a
|
docs: 重写 CLAUDE.md 反映最新项目状态
- 更新架构图(移除已删除的 string-list.ts,补充 Modal/buttons/ErrorBoundary)
- 新增数据模型章节(不可变 string[] + snapshot 比较 isModified)
- 新增撤销/重做 API 说明
- 新增错误处理章节(前端 + Rust 完整覆盖表)
- 补充 TypeScript strict 模式、Rust SAFETY 注释等质量约束
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 08:20:15 +08:00 |
|
Serendipity
|
bdbb399ddc
|
refactor: 清理 LOW 问题 — 样式去重、死代码删除、命名修正
- 抽取 buttons.ts 共享按钮样式,消除 3 个组件的重复定义
- store 删除未调用的 canUndo/canRedo 方法
- importFromContent 变量 ext→lower 修正确性
- CSV 导出修复 BOM 重复(exportToCsv 自带 BOM)
- Rust error.rs 添加 allow(dead_code) 消除编译警告
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 08:13:17 +08:00 |
|
Serendipity
|
d28861ff9c
|
refactor: 抽取 Modal 组件、支持 JSON/CSV 导出、清理冗余代码
- 新增 Modal 组件,消除 3 个 Dialog 中重复的遮罩层/Escape/stopPropagation 代码
- PathEditDialog/HelpDialog/ImportDialog 改用 Modal 包裹
- handleExport 支持 JSON/CSV 两种格式(CSV 导出代码之前存在但从未接线)
- App.tsx 移除冗余的 initDarkMode 后重复设 store 的逻辑
- ErrorBoundary 添加 componentDidCatch 日志和 console.error
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 00:51:32 +08:00 |
|
Serendipity
|
b159407773
|
fix: 最终审查修复 — 数据安全、功能缺失、状态管理
Rust:
- save_paths 添加 Windows PATH 32767 字符上限检查防静默截断
- backup_registry 回退路径统一为 backup_base_dir() 三级链
Store:
- 新增 isSaving 并发守卫防止重复保存
- 保存失败详情通过 Promise.allSettled.reason 展示
- isModified 改为与上次保存快照比较(undo/redo 后准确反映状态)
- 批删除合并为单条撤销记录(N 次删除 → 1 次 Ctrl+Z 恢复)
- 保存失败/备份失败使用 i18n 键(消除硬编码中文)
UI:
- 拖拽添加改用 webkitGetAsEntry().isDirectory 校验文件夹
- Ctrl+F 快捷键聚焦搜索框
- handleClean 使用 is_valid_path_format(替代不完整的 inline 函数)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 00:48:43 +08:00 |
|
Serendipity
|
e6a2416271
|
refactor: AppShell 拆分 + savePaths 并行化
- 抽取 useAppActions hook(~160行),AppShell 从 306 行精简至 105 行
- AppShell 现在只负责布局和渲染,操作逻辑全部可单独测试
- savePaths 改为 Promise.allSettled 并行保存 + 并行备份
- useKeyboard 通过 hook 内部集成,不再暴露给 AppShell
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 00:36:59 +08:00 |
|
Serendipity
|
3a21891f84
|
feat: 原生对话框、ErrorBoundary、配置生效、交互打磨
- handleBrowse 改用 @tauri-apps/plugin-dialog 原生目录选择
- handleImport 清理临时 DOM 元素(add input.remove())
- config/default.json 实际导入生效(maxHistory、path 长度限制)
- app-store.ts 长度检查改用配置值
- 删除 AppShell 中与 store 重复的长度检查
- 新增 ErrorBoundary 组件避免单异常白屏
- StatusBar 加载失败时显示重试按钮
- 取消按钮检查 isModified 未保存提示
- lib.rs 注册 tauri-plugin-dialog
- tsconfig 添加 resolveJsonModule
- CLAUDE.md 添加 cargo test 运行时说明
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 00:33:57 +08:00 |
|
Serendipity
|
bfd114d80f
|
refactor: 全面代码质量提升 — StringList→string[], strict 模式, 死代码清理
架构重构:
- StringList 类替换为不可变 string[](消除 dataVersion hack,Zustand 自然检测变化)
- UndoRedoManager.undo/redo 返回新数组而非原地修改
- 删除 dataVersion 字段和 _bumpVersion()
- 启用 TypeScript strict 模式
死代码清理:
- 删除 string-list.ts, string-list.test.ts, use-path-validation.ts
- Rust AppError 保留供未来使用
功能修复:
- importFromJson 添加 try/catch
- handleClean 使用真实格式验证替代 () => true
- savePaths 保存前调用 backup_registry,处理部分保存失败
- importFromJson 校验非 object 类型输入
i18n 完善:
- MergePreview/StatusBar 硬编码中文 → t() 调用
- 新增 merge.* 和 status.* 翻译键
Rust 改进:
- registry.rs 抽取 load_paths/save_paths 通用函数,消除重复
- registry 新增 6 个单元测试(split/join/roundtrip)
- backup.rs 时间戳加毫秒防覆盖,回退路径改为 home_dir
元数据:
- package.json 名称→patheditor, 版本→4.0.0
- 新增 CHANGELOG.md
- 移除 UndoRedoButtons 废弃注释
- tsconfig 添加 strict:true
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 00:26:27 +08:00 |
|
Serendipity
|
2ceec54790
|
fix: 全面审查修复 14 个 bug,新增 Rust 单元测试
CRITICAL:
- PathTable/MergePreview 操作后不重新渲染(加 dataVersion 版本号机制)
- moveUp/moveDown 后 selectedIndices 过时(更新到新位置)
HIGH:
- ImportDialog 显示 "true" 而非路径数量(改为 number 类型)
- F1 快捷键无效果(添加 onHelp 回调)
- useKeyboard 每次渲染重复注册事件(改用 ref 模式)
- batch delete 撤销顺序错误(拆分为独立记录)
- importPaths 存储数组引用而非副本
- StringList.all 暴露内部数组(改为返回副本)
- expand_env_vars 静默吞 API 错误(加 log::warn)
- join_path 写入前未修剪路径(加 trim 避免注册表污染)
MEDIUM:
- handleClean 总传 () => true 不验证无效路径
- HelpDialog/ImportDialog 缺 Escape 关闭
- initDarkMode 不同步 Zustand store
- 多处硬编码中文改为 i18n.t()
- Rust unsafe 块补全 SAFETY 注释
新增 Rust 测试: system.rs 4 个单元测试
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-25 23:14:26 +08:00 |
|
Serendipity
|
b1acb3690c
|
feat: 路径验证颜色编码、环境变量 tooltip、长度检查、拖拽添加
- PathTable 异步调用 Rust validate_path 实现红/橙色编码
- 含 %VAR% 的路径悬浮显示展开后的 tooltip
- 保存前检查 PATH 长度(系统2048/用户2048/合并8191),超限弹框确认
- 支持拖放文件夹到列表区域添加路径
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-25 19:24:13 +08:00 |
|
Serendipity
|
8967fe34e5
|
fix: 修复编辑对话框空白及双击编辑无效的问题
- PathEditDialog 添加 useEffect 在打开时同步 initialValue
- AppShell 添加 path-dblclick 事件监听,双击路径行打开编辑
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-25 18:40:53 +08:00 |
|
Serendipity
|
48129a8908
|
feat: 重写为 Tauri + React + TypeScript (v4.0)
完全移除旧 C+IUP 代码,改用 Tauri 2.x + React 19 + TypeScript + Rust 技术栈重写。
功能与 v3.1 完全等价:
- React 前端:Tailwind CSS 4、Zustand 状态管理、i18next 国际化
- Rust 后端:winreg 注册表读写、Win32 API FFI 调用
- 核心逻辑:StringList、UndoRedoManager、PathManager、Import/Export
- 深色模式、中英文切换、键盘快捷键、合并预览
- 66 个 Vitest 单元测试
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-25 18:33:04 +08:00 |
|
Serendipity
|
cdcfd8e0a7
|
feat: CSV 导入导出、导入撤销支持及多项 bug 修复
功能:
- 新增 CSV 格式导入导出支持(含 BOM 处理、引号转义、智能标题行检测)
- 导入操作支持撤销/重做
- 保存时 PATH 长度检查与警告
- 深色模式状态持久化(darkmode.txt)
- 提取 get_current_target/push_record 为共享函数,消除控制器层重复代码
- 新增 string_list_insert_at,修复撤销删除时的索引恢复
- 新增 undo_redo、error_code、import_export 单元测试
Bug 修复:
- 修复备份目录对话框和失败原因的硬编码中文字符串
- 提取 get_exe_dir 到 os_env 消除 i18n.c/ui_utils.c 重复定义
- 修复导入撤销 old_sys/old_user 内存管理(push 后置 NULL 防止重复释放)
- 修复 CSV 导出转义与导入解析不一致(移除反斜杠转义,依赖 CSV 引号机制)
- 修正 PATH 长度 8191 限制描述为 "command line safe limit"
|
2026-05-03 01:52:06 +08:00 |
|
Serendipity
|
720ebb535d
|
feat(ui): 添加深色模式支持
- 新增深色/浅色模式切换按钮,位于主窗口底部
- 在配置文件中定义主题颜色(浅色/深色背景、列表背景、前景色)
- 更新 UI 工具函数以支持动态主题切换,包括列表斑马纹适配
- 添加翻译条目(Dark Mode/Light Mode)并更新编译脚本
- 修改主窗口创建逻辑,集成主题切换回调
- 调整列表背景色属性从 BACKCOLOR 改为 BGCOLOR 以保持一致性
|
2026-05-02 01:32:56 +08:00 |
|
Serendipity
|
3df2988915
|
feat(merge): 添加合并预览 Tab 页
- 新增第三个 Tab「合并预览」,只读展示系统+用户 PATH 完整列表
- 选项卡切换时自动刷新合并列表
- 支持无效/重复路径高亮
- 新增中英文翻译
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-01 23:54:53 +08:00 |
|
Serendipity
|
c5c5517ded
|
feat(multi-select): 支持列表多选及批量删除
- 列表控件启用 MULTIPLE=YES 属性
- btn_del_cb 支持批量删除:解析分号分隔的多选索引,从大到小删除
- 批量删除推送一条合并的 undo record,支持一步撤销
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-01 23:49:44 +08:00 |
|
Serendipity
|
485d16a180
|
feat(tooltip): 添加环境变量展开预览悬停提示
- 新增 expand_env_vars 函数,调用 ExpandEnvironmentStringsA 展开 %VAR%
- sync_string_list_to_ui 中对含 % 的路径设置 ITEMTIP 属性
- 鼠标悬停时显示展开后的完整路径
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-01 23:45:58 +08:00 |
|
Serendipity
|
e5d24389b4
|
feat(shortcuts): 添加全局快捷键 Ctrl+N/S/F
- Ctrl+N: 新建路径
- Ctrl+S: 保存(确定)
- Ctrl+F: 聚焦搜索框
- 对话框级 K_ANY 回调,列表级 K_ANY 保持 Ctrl+Z/Y/DEL
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-01 23:17:14 +08:00 |
|
Serendipity
|
5bb0ac66cf
|
docs: 添加全局快捷键设计文档
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-01 23:16:05 +08:00 |
|
Serendipity
|
ec0ca5a3f6
|
fix(undo): 修复撤销按钮状态不刷新及空指针防护
- 将 refresh_undo_redo_buttons 提升为公共函数(声明在 callbacks_internal.h,实现在 callbacks.c)
- 在所有 push_record 的操作回调末尾调用 refresh_undo_redo_buttons,确保按钮状态实时更新
- 修复 redo() 中 OP_CLEAN/OP_IMPORT 的 new_paths 空指针风险
- 移除 undo_redo.c 中废弃的 apply_record 函数
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-01 23:12:42 +08:00 |
|
Serendipity
|
bbcfc25aea
|
feat(undo): 重新编译 .mo 翻译文件以包含撤销/重做文本
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-01 23:04:24 +08:00 |
|
Serendipity
|
a8002aeba4
|
feat(undo): 添加撤销/重做的中英文翻译
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-01 23:00:47 +08:00 |
|
Serendipity
|
aac4cc4b54
|
feat(undo): 在 Lua 配置中添加撤销/重做按钮文本
|
2026-05-01 22:54:20 +08:00 |
|
Serendipity
|
c8d9b32c70
|
feat(undo): 在 UI 中添加撤销/重做按钮并集成布局
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-01 22:53:18 +08:00 |
|
Serendipity
|
f9628f6e8c
|
feat(undo): 实现撤销/重做按钮回调及 Ctrl+Z/Y 快捷键
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-01 22:50:39 +08:00 |
|
Serendipity
|
e0af409ef5
|
feat(undo): 声明撤销/重做按钮回调函数
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-01 22:48:14 +08:00 |
|
Serendipity
|
256e793ee4
|
feat(undo): 添加撤销/重做按钮的 UI 常量
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-01 22:47:14 +08:00 |
|
Serendipity
|
8bd8c0a0aa
|
docs: 添加撤销/重做 UI 集成的实现计划
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-01 22:45:06 +08:00 |
|
Serendipity
|
1f48551199
|
feat: 实现撤销/重做功能和CSV导出支持
- 添加撤销/重做管理器,支持添加、删除、编辑、移动等操作的撤销/重做
- 在应用上下文中集成撤销/重做管理器,最大支持50条历史记录
- 为所有基本操作(新建、编辑、删除、上移、下移、清理)添加撤销记录
- 扩展导出功能,支持CSV格式导出(除原有JSON格式外)
- 添加路径格式验证函数,确保导入数据的有效性
- 更新UI文件对话框过滤器以包含CSV格式选项
|
2026-05-01 22:42:56 +08:00 |
|
Serendipity
|
06e4c15b5c
|
docs: 添加撤销/重做 UI 集成设计文档
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-01 22:39:39 +08:00 |
|
Serendipity
|
32e6bb262b
|
feat(test): 添加单元测试框架并完善国际化支持
- 新增 CMake 测试框架配置,支持 safe_string、string_ext 和 path_manager 模块的单元测试
- 实现 Windows API Mock 机制,便于测试编码转换函数
- 添加 error_code 模块的字符串表示函数,支持英文错误日志
- 在 UI 回调函数中集成国际化翻译,覆盖新建、编辑、导入导出等操作提示
- 扩展 string_list 功能,新增重复路径检查函数
- 更新翻译文件,同步所有用户界面的中英文文本
|
2026-04-30 11:38:34 +08:00 |
|