Skip to content

feat(macos): 本地历史忽略规则(通配符/正则)、用量显示与清空 - #1615

Merged
xiaoyumuxi merged 8 commits into
previewfrom
feat/local-history-ignore-rules
Oct 31, 2026
Merged

xiaoyumuxi merged 8 commits into
previewfrom
feat/local-history-ignore-rules

Conversation

@xiaoyumuxi

@xiaoyumuxi xiaoyumuxi commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator

#1610(本地历史 100MB 上限)已合并,本 PR 已合入最新 preview 并改为以 preview 为 base。

改动点

Rust Core(project/history.rs、dispatcher、契约)

  • history.record 新增可选 ignoreRules { pathPatterns, pathRegexes }:命中通配符或正则(不区分大小写,单条 1MB 编译上限)的文件不记录历史;编译结果按规则做单条缓存。
  • 新增 history.ignorePreview:返回无效正则的行号与错误、生成目录基线排除列表(Pods、.idea 等),以及某路径命中的规则(hidden / baselineExcluded / pattern / regex)。
  • 新增 history.usage(已用字节 / 100MB 上限)和 history.clear(清空存储目录内容,目录本身保留)。
  • shared/contracts/rust-core-api.md 补三条命令与 ignoreRules 说明。

macOS

  • 设置 › 通用新增“本地历史”分组(LocalHistorySettingsControl):
    • 显示“已用 X / 100 MB”,可“清空项目历史…”,二次确认;没打开项目时提示打开项目。
    • 通配符 / 正则分段切换,多行编辑草稿;点“应用”才保存(去空行),打开页面不写设置。
    • 测试路径实时预览(200ms 防抖):显示会记录、被隐藏、只是不做初始快照、或被第几行规则忽略;无效正则逐行提示并跳过。
    • 展示“无初始快照”的生成目录胶囊。
  • AppSettings 新增 localHistoryIgnorePatterns / localHistoryIgnoreRegexes,恢复默认时清空;修改后只更新当前已激活的本地历史功能。
  • 本地历史模块端口、服务、FeatureModel 增加 usage / clear / ignorePreview;清空后同步重置列表与 diff。
  • 设置搜索词条、中英 i18n(21 条)、功能矩阵 history-snapshots 证据更新。

追加:内置项可删改、上限可调(6ca02c615)

  • 隐藏路径:去掉“内置 +19”胶囊,内置规则直接列在文本框开头;删掉一行即关闭该内置项,存为 !**/name/,后续版本新增的内置项仍会生效;再输入回来即恢复。
  • 不做初始副本(已在 a7ed4a1 中被并入通配符规则,见下):本地历史新增第三个分段,内置的 30 个文件夹同样列进文本框,可删可加,存为新增名或 !name(新设置 localHistoryBaselineExcludedDirectoryNames)。
  • 上限可调:“已用 X / [100 MB ±]”,步进 50 MB,范围 50–5000 MB,默认 100 MB(新设置 localHistoryStorageLimitMegabytes),改后在下次保存时按新上限淘汰;基线预算为上限一半。
  • 单位:用量按二进制单位显示,100 MiB 显示为 100 MB(原来是 104.9 MB)。
  • 测试路径:输入框前加“测试路径”标签,悬停说明用途。
  • Rust Core:
    • hiddenFilePatterns 的 ! 条目关闭对应规则,包括内置项。
    • workspace.filterChanges 接受 { paths, hiddenFilePatterns },仍兼容纯数组。
    • ignoreRules.baselineExcludedDirectoryNames 可用。
    • ignorePreview 接受 hiddenFilePatterns,返回字段改名为 builtInBaselineExcludedDirectoryNames。
    • history.record / history.usage 接受 storageLimitBytes,范围限定在 10 MiB–100 GiB。
  • macOS 文件监听把 ! 条目传给 filterChanges,被显示回来的内置目录的变化不再被过滤掉。
  • 新增 BuiltInRuleList(文本框行 ↔ 存储形式)及单测;i18n 新增/更新 6 条;契约文档与功能矩阵同步。
  • 验证:lithe-core 1411 个测试全过;test-macos.sh 跑本地历史、设置、文件可见性、项目树相关测试全过(含真实 Rust Core 集成:!Pods、!**/.git/、自定义上限);i18n、shared contracts、module/service boundaries、Rust comments/layout、矩阵 gate 均通过。

追加:上限可输入、测试路径对照 Git(07dbbecaa)

  • 上限步进器支持直接输入数值(回车或失焦提交,超出 50–5000 MB 自动限定,输错恢复原值);LitheSettingsStepper 新增可选 parse,其他调用处不受影响。
  • 测试路径加 ⓘ 说明;结果分两行:「本地历史:会记录 / 被第 N 行忽略…」和「Git:已忽略 / 未忽略」。Git 一行仅作对照,本地历史不跟随 .gitignore;没打开项目或不是 Git 仓库时不显示。
  • Rust:history.ignorePreview 接受 workspaceRoot,返回 gitIgnored,复用 git::ignored_paths(git check-ignore --stdin -z);工作区不存在只丢 Git 一行,不影响规则预览。新增 Rust 测试覆盖仓库内忽略/未忽略、非仓库为空。
  • 移除上一提交里已不用的悬停文案,新增 4 条 i18n。

追加:内置文件夹并入通配符、.lithe 默认隐藏、合入 preview(a7ed4a1d6)

  • 合入 preview:解决与 fix(local-history): 本地历史每个项目限制 100MB,基线跳过生成目录 #1610 的冲突(history.rs 保留存储锁、容量回收与本 PR 的可配置上限;i18n、功能矩阵合并)。补齐 preview 新增测试替身 BatchOperations 缺的 usage / clear / ignorePreview。
  • 去掉「不做初始副本」页签和设置 localHistoryBaselineExcludedDirectoryNames(未发布过,直接删除)。
  • 29 个依赖/缓存/构建输出文件夹改为内置通配符忽略规则 **/名称/(node_modules、.venv、target、Pods、.idea、.claude 等),在通配符文本框开头列出;删掉一行存为 !**/名称/(!名称 也认),后续版本新增的内置规则仍生效。
  • 行为变化:这些文件夹的基线和编辑都不再记录(原来只跳过基线);两端共用 Core 行为,Windows 同样生效。保存时清理被当前忽略规则命中的旧基线。基线仍另外跳过嵌套 Git 仓库。
  • 测试路径结果显示命中的具体规则:「被通配符规则 **/Pods/ 忽略」,替代原来的「被通配符第 N 行忽略」和「在 X 中:不做初始副本」。
  • Rust Core 接口:ignoreRules 去掉 baselineExcludedDirectoryNames;ignorePreview 返回 builtInIgnorePatterns;matched 的 pattern 改为携带规则文本 { kind: "pattern", pattern },去掉 baselineExcluded。
  • 隐藏路径默认加入 .lithe/**(类似 IDEA 的 .idea),删掉这一行即显示回来;文件监听里 .lithe 下的配置文件仍照常触发刷新。说明文案补充:无尾部斜杠的模式只隐藏文件(.lithe 隐藏名为 .lithe 的文件,不隐藏文件夹)。
  • i18n:删 4 条、新增 1 条、更新本地历史与隐藏路径说明;契约文档、功能矩阵同步。
  • 验证:lithe-core 本地历史 79 个测试、clippy/fmt;test-macos.sh 中 LocalHistoryIgnoreRulesTests、BuiltInRuleListTests、LocalHistoryModuleTests 及文件可见性相关测试通过;i18n、shared contracts、module/service boundaries、Rust Core comments/layout、矩阵 gate(对 origin/preview)、runtime bundle immutability 均通过。LitheCoreLogicTests 全量中有 7 个窗口/会话/保存相关测试本地挂起未完成,与本改动无直接关系,留给 CI 确认。

验证

  • cargo test(lithe-core 全量通过)、clippy 改动文件无新警告
  • scripts/macos/test/test-macos.sh --filter "LocalHistoryIgnoreRulesTests|LocalHistoryModuleTests|SettingsSearchVocabulary|AppSettings":42 个测试通过(新增真实 Rust Core 集成测试)
  • 最新提交:lithe-core 1412 个测试、test-macos.sh 本地历史相关测试、verify-runtime-bundle-immutability.sh 均通过
  • runtime bundle immutability、service/module boundaries、shared contracts、Rust Core comments/layout、i18n 检查、功能矩阵 change gate 均通过

- 每个项目上限 100MB(按 4KB 分配块计,占用量进程内缓存),其中项目基线最多 50MB
- 基线跳过 node_modules、.venv、target、.claude、.uv-cache 等生成目录和嵌套 Git 仓库
- 保存时清理过期条目和旧版本遗留的排除目录基线;超限按基线→编辑→标签由旧到新淘汰
- Rust Core:history.record 支持 ignoreRules(通配符 + 不区分大小写正则),新增
  history.ignorePreview / history.usage / history.clear
- 设置 › 通用 › 本地历史:显示 已用 X / 100 MB,可清空当前项目历史(二次确认);
  通配符/正则两种规则草稿编辑,测试路径实时预览命中规则,无效正则逐行提示,
  点“应用”才保存
- 补齐中英词条、契约文档、功能矩阵与集成测试
@ghfind-review ghfind-review Bot added the review: medium ghfind author score; see https://ghfind.com label Oct 31, 2026
- 隐藏路径、不做初始副本把内置项列进文本框,删掉一行即关闭该内置项(存为 !条目,后续版本新增的内置项仍生效)
- 本地历史新增「不做初始副本」分段;Rust Core 支持 baselineExcludedDirectoryNames 与 hiddenFilePatterns 的 ! 条目,workspace.filterChanges 接受对象载荷
- 每个项目的本地历史上限可在「已用」旁调整(50–5000 MB,默认 100 MB),Rust 接受 storageLimitBytes 并限定在 10 MiB–100 GiB,基线预算为上限一半
- 用量按二进制单位显示(100 MB 而非 104.9 MB);测试路径加标签与说明
- LitheSettingsStepper 新增可选 parse,支持在数值处直接输入(失焦或回车提交,超出范围自动限定);本地历史上限启用
- 测试路径加 ⓘ 说明用途;结果分两行:本地历史是否记录、Git 是否忽略(仅作对照,本地历史不跟随 .gitignore)
- history.ignorePreview 接受 workspaceRoot,返回 gitIgnored(复用 git check-ignore;无路径、工作区或仓库时为 null)
- 契约文档、功能矩阵、中英 i18n 同步
@xiaoyumuxi

Copy link
Copy Markdown
Collaborator Author
image

@xiaoyumuxi
xiaoyumuxi changed the base branch from fix/local-history-storage-cap to preview October 31, 2026 03:54
- 合并 preview(含 #1610 存储锁与容量回收),解决 history.rs、i18n、功能矩阵冲突
- 去掉「不做初始副本」页签与设置;29 个依赖/缓存/构建输出文件夹改为内置通配符
  忽略规则 `**/名称/`,在通配符文本框中列出,删掉一行保存为 `!**/名称/`
- 这些文件夹的基线和编辑都不再记录;保存时清理被当前规则命中的旧基线
- 测试路径结果显示命中的具体规则(「被通配符规则 %@ 忽略」)
- 隐藏路径默认加入 `.lithe/**`(类似 IDEA 的 .idea),说明补充无斜杠模式只隐藏文件
- 同步契约文档、功能矩阵、中英词条与测试
@xiaoyumuxi
xiaoyumuxi marked this pull request as ready for review October 31, 2026 04:33
@xiaoyumuxi xiaoyumuxi assigned Copilot and unassigned Copilot Oct 31, 2026
@lithe-code-review

lithe-code-review Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← feat/local-history-ignore-rules · head: a7ed4a1

Findings

  1. [P2] 单条历史通配符匹配会重新启用已关闭的隐藏规则
    rust/lithe-core/src/project/history.rs:662

    • 实际影响:文件可能被不匹配它的通配符错误排除,无法记录历史,预览也会报告错误的命中规则。这里的 VisibilityRules::new 会自动加入默认隐藏项,却没有收到用户关闭这些项的 ! 条目。
    • 触发条件:解除某个内置目录的隐藏和历史忽略,同时添加任意普通通配符。
    • 复现步骤:对 build/src/Main.java 调用预览,传入 hiddenFilePatterns=["!**/build/"]、ignoreRules.pathPatterns=["!**/build/","*.log"]。内置 build 已关闭,但匹配 *.log 时重新加入的隐藏目录仍会命中,返回 pattern: "*.log";相同配置下 history.record 也会跳过记录。
    • 来源:本次引入。
  2. [P2] 清空历史时需要同时隔离在途批量写入
    macos/Sources/LitheLocalHistoryModule/Application/ProjectHistoryFeatureModel.swift:121

    • 实际影响:清空成功后,清空前启动的任务仍能重新写入快照,导致历史和占用重新出现。
    • 触发条件:外部变更批次正在记录时执行清空。新增逻辑只取消 seedTask,没有停止 backgroundTasks 中的写入;LocalHistoryService.recordFiles 每个文件后都会让出执行权,允许清空插入批次中间。
    • 复现步骤:启动多文件 recordExternalChanges,在两次记录之间执行 clearHistory(),再让原批次继续。原任务未被取消,后续文件仍会写入刚清空的存储。
    • 来源:本次引入。
  3. [P2] 隐藏路径修改后应重新计算测试路径预览
    macos/Sources/Lithe/Views/App/LocalHistorySettingsControl.swift:198

    • 实际影响:预览继续显示旧结论,可能显示“会记录”,而实际保存已被隐藏规则排除。
    • 触发条件:保持测试路径和历史规则草稿不变,在同页修改并应用“隐藏路径”。draftRules 使用最新隐藏规则,但 previewKey 仅包含测试路径及两个草稿,任务不会重新启动。
    • 复现步骤:先预览 docs/readme.md,再在隐藏路径中添加并应用 docs/*.md。预览仍显示原结果,直到再次编辑测试路径或历史规则。
    • 来源:本次引入。

Scope Check

  • 未找到可验证的关联 Issue,未判断 Issue 完成度。
  • 已核对忽略规则、可编辑内置项、容量配置、用量与清空、Swift 接口、文件监听、共享契约及中英文词条。
  • Windows 暂无忽略规则和容量设置界面,功能矩阵已说明这一范围。
  • 实现复用了现有可见性匹配器、regex 和 Git 忽略查询;未新增语言或构建领域的并行真源。
  • 三项 Finding 均由本次改动引入,属于本次功能的直接职责。

Suggestions

  1. 复用仅匹配指定通配符的入口,避免自动注入隐藏默认项;补充“关闭两处内置项后再添加无关通配符”的回归测试。
  2. 为清空建立写入屏障:终止并等待旧任务,或用代次校验拒绝旧批次后续写入;补充受控并发测试。
  3. 将有效隐藏规则纳入预览任务标识,并覆盖应用隐藏规则后的自动刷新。
  4. 上下文已有一张截图链接;请补充既有隐藏路径界面的前后对比,并覆盖新增历史控件。

Summary

未发现需要阻塞合并的问题。职责分层基本沿用现有结构,但新增测试尚未覆盖上述规则组合、清空并发和预览失效场景。

Verification

  • 静态检查指定 base...head 的非生成变更及直接调用链,并通过 base 文件对照确认来源;两份生成的 Localizable.strings 未读取正文。
  • 作者报告 Rust Core 1412 个测试、相关 Swift 测试及 i18n、契约、边界、bundle 只读检查通过;本次未独立复验。
  • 提供的 head checks 中,Ubuntu i18n 成功,Rust、Swift 和 Windows 主测试为 skipped;平台 gate 成功不能证明这些测试已执行。
  • 本次未运行代码、测试或校验脚本,未访问网络、未读取截图。视觉效果和平台运行时行为尚未验证;作者另报告的 7 个 Swift 用例挂起仍待确认。

@xiaoyumuxi
xiaoyumuxi merged commit a1ed8f4 into preview Oct 31, 2026
13 of 18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: medium ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants