Releases
v0.8.7
Compare
Sorry, something went wrong.
No results found
[0.8.7] - 2026-09-17
0.8.7 工程与体验小修(发布前收尾)
CI 时区盲区防护 :新增非 UTC 时区前端测试变体 job(windows-latest 切美东时区跑 vitest)——PR #1 暴露 CI 运行器固定 UTC,西偏移时区缺陷线上永不触发;共享 fixture「任意宿主时区双端一致」约定自此有 CI 守护。
软件视图预留空态 :文件页软件视图(kind:software,数据待 0.8.8 软件单元识别)空结果时显示「软件单元即将上线」说明(中英双语),不再误报「没有匹配的文件」。
ROADMAP 状态重建 :FTS5 全文启用评估从「后续规划(未排期)」正式归入 v0.8.9 决策门制(0.8.6 评估原文「目标 0.8.6 阶段二或 0.8.7」已滑档,消除无归属漂移);v0.8.8 可靠性加固补「运行期添加监控目录的监视器注册同样异步化」(当前同步递归注册在大目录下阻塞命令数秒,与启动阻塞同源);0.8.7 状态行补记收官后修复并入情况。ARCHITECTURE 工程约定新增「时区无关的日期语义」(纯日期串语义钉死本地当天,双端口径对齐)。
0.8.7 缺陷修复(Fixed,PR #1 )
自然日差时区缺陷 :calendarDaysUntil / overdueDays 对纯日期串(YYYY-MM-DD)经 new Date 按 ES 规范以 UTC 午夜解析,宿主时区为西偏移(如 UTC-4)时日期回退一天——共享 fixture 用例 due_at=2026-08-06, expected=0 实得 -1(CI 的 UTC 机器不触发,本地审计暴露)。新增 parseDueLocal:纯日期串补本地正午解析,与后端 parse_due_date 的「纯日期=当天」口径对齐,跨语言契约 fixture 在任意宿主时区下双端一致。
FileList 行渲染缺 key :非虚拟路径(<ul> 直排)的 FileRow 无 key,触发 React「unique key」警告;补 key={file.path}(稳定唯一,虚拟滚动路径由 VirtualRows 自行包裹不受影响)。
dev 依赖漏洞清零 :npm audit fix(@vitest/mocker moderate ×2 路径遍历 / nanoid high 零尺寸死循环),仅 patch 级 lockfile 变更,不进产品产物。
0.8.7 归档安全与自动归档强化(功能)
归档根安全评估 (core/archive_guard.rs,规则真源):三级判定——系统目录树(Windows / Program Files / ProgramData)与软件存盘区(AppData 三分支整树)及盘根为 blocked (后端直接拒绝);用户根与桌面 / 文档 / 下载等核心目录本身为 warn (前端二次确认);其余及上述目录的子目录 为 safe(「文档下新建专用子目录」即推荐形态)。判定矩阵入 fixtures/archive-guard-cases.json。
拦截策略:settings_io 单入口仅在本次显式修改 archive_root 时执行 blocked 拒绝(结构化错误码 archive_guard.blocked|<reason>)——存量违规配置(如盘根)不锁死其他设置字段的写入,用户主动换位置时才被拦下并引导。
归档设置弹窗:输入 / 浏览后防抖实时评估并分级告警(blocked 禁用保存、warn 弹危险确认);新增「推荐位置」候选(后端 recommended_archive_roots,用户目录下专用子目录);后端拦截错误以结构化码兜底。
自动归档严肃化 :开启方向需危险确认弹层(后果说明:新文件自动移入档案库、跨盘/占用失败保留原位),关闭方向直接生效;开启态按钮 amber 化 + 警示图标;设置页归档行「已开启」改 amber 徽章;文件页自动归档横幅升为 warn 色。
托盘移除自动归档菜单项 :开关只保留在设置弹窗内(带确认),消除「单击托盘即开启、零确认」的危险入口;旧菜单缓存点击兜底唤起主窗口。
首启向导 3→4 步 :新增第③步「选择归档位置」——推荐候选 + 原生浏览 + 实时安全评估 + 「暂不启用归档」四选一,必须做出选择才能进入下一步 ;选择经增量设置命令落盘。localStorage 标记升级 v2,已完成 v1 的老用户不强制重跑。
0.8.7 阶段二(units 统一索引)
schema v8 :files 表迁移为统一单元表 units(kind: file | project | software + project_kind 扩展列),索引重建为 idx_units_*,FTS 表同步改名;迁移含数据保全测试(标签 / 归档墓碑 / 旧表移除 / 新列可写)。
kind: 搜索语法 :合法值 file / project / software(未知回落普通文本,同 cat: 模式);契约用例入 fixtures/query-grammar-cases.json;前端自动补全新增「按内容类型」关键词与三个值候选。
项目单元入库 :新增 infra/project_sync.rs 把 discover_projects 发现结果派生写入 units(kind=project),移除的项目单元标记 deleted;发现逻辑仍是唯一真源,units 只作查询派生层。同步时机:启动延迟服务(后台)与监控 / 项目目录变更后。
课程挂钩 :Course 增别名字段(serde default 兼容旧数据),课程编辑表单增别名输入(逗号分隔);新命令 course_overview 返回相关文件(课程标签命中)与相关项目(项目名 / 路径按课程名或别名命中);课程详情弹层展示「相关文件与项目」。
文件页四视图 :全部 / 文件 / 项目 / 软件 tabs(kind: token 注入查询,前端只生成不解释);默认「文件」视图保持既有行为零回归,软件视图为阶段三预留(数据就绪即显)。
0.8.7 架构小修(缺口收口与错误码最小切片)
架构核查(五提交治理后复查)发现的 4 个残留缺口收口:前端 updateSettings 参数类型收窄为 Partial<Omit<Settings, "watched_dirs" | "project_dirs" | "version">>(编译期拦截不可写字段,与后端 SettingsPatch 白名单对称);useSettings flush 失败回填挂起补丁(乐观态不再与后端静默分叉,下次事件冲刷 / commit 吸收时重试,附测试);schemes.rs 模块注释中已删除的 set_settings 引用改为 update_settings;QueryPage.total=-1 哨兵语义补入前端类型注释(0.8.8 以 totalKnown/hasMore 替代)。
错误码注册表最小切片落地:scheme_store 需要前端分支处理的错误改 code|message 结构化前缀(scheme.duplicate / scheme.limit / scheme.not_found);新增 lib/errors.ts(errorCode / errorMessage,code 形状校验防误判)并测试;SchemeDialog 的错误文案子串匹配(includes("已存在")——违反「前端禁止解析后端文本」边界口诀)退役,改按 code 映射 i18n、无 code 透传 message。
清理本地工具产物目录(.mimosa/、src-tauri/.mimosa/、scripts/smoke-summary.log,均已被 .gitignore 覆盖,不入库)。
0.8.7 帮助文档补漏(cat: 语法同步)
补齐 cat: 迁移时遗漏的帮助入口:搜索语法表(文件页「?」弹层与帮助中心「搜索语法」专区共用的单一来源)新增 cat 条目,type 条目措辞钉死为「按扩展名精确筛选」(消除「文件类型」歧义旧词——正是当初语义错位的源头);任务指南「搜索语法技巧」文章补分类筛选示例并调整摘要;「搜索与整理文件」文章「按类型筛选」统一为「按分类」;帮助搜索关键词补 cat / 分类 / category(中英双语同步,i18n 成对与文案质量门禁全绿)。
0.8.7 前后端职责单一化治理(架构)
三路全库审计(前端状态所有权 / 双端规则重复 / 后端命令面),报告与分期见 docs/reports/0.8.7-single-source-audit.md;边界口诀立规入 ARCHITECTURE:状态与业务规则归后端唯一源、交互与展示归前端、跨端常量用 fixture 锁死、前端禁止解析后端文本 / 持有后端状态副本 / 整对象覆盖写。
阶段一(设置状态 bug 类根治) :SettingsPatch 增量命令替代整对象 set_settings(watched_dirs/project_dirs 移出补丁强制走专用命令);新增 infra/settings_io.rs 写入单入口——互斥串行化命令 / 托盘 / 归档 journal 全部写路径,写后统一刷新缓存并广播 settings-changed(载荷为变更字段名);归档/撤销项目改为移动成功后重读设置,缩小竞态窗口;前端 useSettings 只发增量补丁(commit 吸收挂起补丁防丢字段)、设置事件先冲刷挂起再拉真源(修托盘事件覆盖未落盘修改)、刷新失败重试+日志、新增 mergeLocal(纯本地回显)与 syncFromBackend;SettingsPage 六处整对象写改增量、reset 只同步内存。
阶段二(双端漂移真相契约化) :修复分类筛选语义错位历史 bug——新增 cat:/category: 前缀(类别按标签匹配,未知回落文本),chips 与自动补全迁移,type: 钉死精确扩展名语义;ArchiveOutcome 透出真实 source→dest 映射(顺带修复 plan_file_target 盘根双斜杠边界 bug);删除前端目录校验镜像 pathValidation.ts(规则唯一源归后端);新增 query 语法 / 归档目标 / 生效分类映射 / 学业周次四个契约 fixture 双端同跑;app-contracts.json 扩容 IDE 白名单 / 项目类型 / 标签 key 规则并双端断言,FILE_STATES 补后端单向门禁。
落盘 :阶段三(命令面收紧:哨兵字段显式化、监控目录端点合并、apply_scheme 原子命令等)与阶段四(错误码注册表迁移细节)并入 ROADMAP v0.8.8;搜索系统升级(FTS5 全文 / 语法手册 / 分面 / 相关性)入「后续规划」,本轮 cat: + 语法契约为最小前置。
0.8.7 修复(监控目录丢失与归档失败反馈)
修复严重 bug:设置页监控目录列表与全局设置是两份平行状态(添加 / 移除目录只写本地列表、不回写全局 settings),任何「全量替换」式保存(保存归档设置、语言 / 主题切换等)都会用页面加载时的旧快照覆盖 watched_dirs——运行期添加的监控目录在保存后「隐形」(设置页看不到、重启也不回来),但索引文件仍留在文件列表;被移除的目录则会在下次保存时复活。现收敛为单一数据源:列表直接派生自全局 settings,添加 / 移除目录走合并更新;补「添加目录后保存归档设置不丢目录」回归测试。
归档失败横幅可读性重构:此前任一文件失败就在红色横幅塞入原始错误串(后端以完整路径开头),路径挤占导致具体原因不可见。现结构化分层——部分成功用警示色、全部失败用错误色,标题给出失败计数,首个失败显示文件名(悬浮 Tooltip 完整路径)+ 独立原因(跨磁盘 / 文件占用等),其余失败数量另行说明;splitPathError / pathBasename 纯函数入库并测试。
ROADMAP v0.8.8 新增「文件页隐藏系统与组件内部文件」单一设置项规划(桌面小组件缓存 / 软件组件 / 项目程序内部文件,展示层过滤不删数据,复用软件组件识别与忽略规则基建)。
0.8.7 界面优化(归档目的地展示)
归档目的地统一「档案库」友好名(en 为 Library):确认弹层、设置页归档行、项目归档确认不再平铺完整路径,目的地渲染为下划线链接(新共享组件 components/RevealLink.tsx——Tooltip 悬浮显完整路径、点击在资源管理器定位、根未创建等失败静默;品牌链接文本样式立规入 ARCHITECTURE)。
归档确认弹层结构化:删除「根 + 3 条完整目标路径」的字符串拼接(其 \n 在 <p> 中从未换行、三条路径粘成一团),改为简洁导语 + 档案库链接 + 前 3 个待归档文件名(悬浮显单文件完整目标路径);超出 3 个提供「查看全部」完整列表视图(同弹窗切换视图、加宽、内部滚动、可返回,footer 归档/取消常驻,重开弹层自动复位);筛选模式补齐目的地展示。
修复归档预览路径混合分隔符(archivePreview 以 / 拼 Windows 根产生 D:\Arc/document/a.pdf):lib/fileUtils.ts 新增 resolveArchiveDir / joinArchivePath / archiveDestPath 纯函数(统一 / 规范 + 剥除根尾部多余分隔符),文件归档与项目归档共用。
「归档当前筛选」在 COUNT 治理(筛选态 total=-1)下不再显示「(-1)」:按钮与确认弹层退化为无计数文案(archiveFilteredPlain / archiveConfirmNoCount 等)。
设置页归档行摘要 ReactNode 化;归档设置弹窗「最近归档」样本目标只显示文件名(悬浮显完整路径);自动归档提示与归档说明文案「归档根」改「档案库」表述。
微调(反馈收口):移除监控目录确认弹层不再把完整路径插值进句子(长路径产生难看横向滚动条)——路径独立成截断行、悬浮 Tooltip 显全路径,ConfirmDialog 说明文字补 break-words 兜底其余插值弹层;监控目录列表长路径补省略号(内层 min-w-0);归档确认弹层文件行加盒底样式与说明文字形成视觉分层;归档根输入框旁新增「浏览…」按钮,接入既有原生目录选择器(openDirectoryDialog,与监控目录添加同源),取消选择不动手输路径。
修复 CI clippy 1.98 新 lint chunks_exact_to_as_chunks 构建失败:mft / ntfs UTF-16 解析改用 as_chunks::<2>()(语义等价,本地 rustup 1.98.1 复现红→修复转绿)。
0.8.7 阶段一(契约与界面地基)
契约单点化:新增 fixtures/app-contracts.json 跨语言契约真源(应用级事件名 / 文件状态 / 类别清单);Rust core/events.rs 事件常量段、TS lib/events.ts 镜像与双端 fixture 一致性测试;全部 emit/listen 改用常量;check-arch / check-rust-arch 新增裸事件名字面量防漂移门禁(正反用例自测)。
FileState 收口:TS FILE_STATES 联合类型替代内联串联合(FileRecord.state / 筛选选项收口),Rust 监听回调经 FileState::Indexed 枚举比较,不再裸串。
类别视觉注册表:lib/categoryDefs.ts 统一「图标 + 圆底配色」(resolveCategoryKey / resolveCategoryVisual,未知回退 other),FileTypeIcon 变薄为纯渲染,FilterIcon / 归档预览迁移,删除三处平行硬编码;Rust Category::ALL 与 fixture 一致性断言。
图标消费模型统一(上半):theme/icons.ts 成为全库唯一 lucide 入口(v1.3 皮肤替换断点),37 处直连导入全部迁移;check-arch 新增 lucide 直连门禁(白名单仅 theme/icons.ts);构建对比 tree-shaking 无回退(首包 gzip 104.68 → 104.81 kB)。
监听热路径修复:ArchiveService::is_active()(三态单测),监听回调删除每次批次的 load_settings 磁盘读,改经 managed_state::refresh 推送的内存缓存;设置写路径(设置保存/恢复默认/托盘切换/启动装配)全覆盖,切换即生效。
文件页拆解:pages/FilePage.tsx 收敛为页面壳(951 → 432 行);features/files/ 新增 model 纯逻辑、FileRow / FileList / FileToolbar / FileBanners / ArchiveConfirmDialog 五组件与 useFileArchive 归档状态机;FileRow 以「记录 + 展示派生」为 props,供阶段二四视图与 v0.9.4 命令面板复用;FilePage.test 断言零删除全绿,真实应用 9 组深/浅 × 中/英前后矩阵截图对比无回归(docs/reports/assets/0.8.7-phase1/)。
修复 tray_menu 种子测试日期漂移(临期判断基准对齐运行日,此前随日期推移必然失败)。
You can’t perform that action at this time.