Skip to content

feat(workspace): 支持目录索引排除并统一 Git 设置入口 - #1597

Merged
1lck merged 32 commits into
1lck:previewfrom
lin-coco:codex/958-workspace-index-exclusions
Nov 1, 2026
Merged

1lck merged 32 commits into
1lck:previewfrom
lin-coco:codex/958-workspace-index-exclusions

Conversation

@lin-coco

@lin-coco lin-coco commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

大型工作区中,Git 忽略或手动排除的目录仍参与扫描与索引。本 PR 由共享 Core 统一索引排除,减少无效扫描;目录继续可见、可编辑,Git Commit 候选保持由原生 Git 决定。

Closes #958

功能与边界

  • 两端“设置 › 版本控制 › Git”提供项目级自动排除;原生 check-ignore / ls-files 保护已跟踪内容,不改写 Git 忽略规则。
  • 手动祖先排除优先;取消排除保存包含例外,修改普通目录角色保留例外,取消 Git 自动排除保留当前角色。历史迁移独立于索引库存。
  • 库存、名称/内容/符号搜索、替换及 Agent 候选共用策略;嵌套根由最近所属根处理,目录浏览不会回填索引。
  • 工作区实例拥有独立租约与监听注册;后台工作区、多窗口、关闭后同根重开及迟到安装保留取消和清理边界。Git 规则变化统一失效,查询等待有效策略,过期结果拒绝发布。
  • LSP 冷启动与恢复遵循排除策略;保留 provider 原配置、在途文档关闭与打开顺序、编辑所有权和失败重试。Java 显式构建模块仍可能导入,语言服务配置送达不代表后台零扫描。
  • 远程/WSL 暂不支持索引排除,禁用相应动作并保留偏好;损坏配置不覆盖,错误通过共享中英文词条呈现。

本轮整合

  • 从最新 preview ef6e70c3c 整合原 PR 7eeb4b32,解决设置说明、共享契约、生成词条和实现冲突。
  • 保留 preview 的搜索缓存分来源构建槽位,同时保留索引策略版本、嵌套根剪枝及保存/watcher 更新过滤;补齐新增并发搜索测试的字段。
  • 将索引排除门禁接入已经拆分的 AppModel+LanguageServerRuntime.swift,保留新的激活令牌与取消保护,不恢复旧的重复启动实现。
  • 同步架构笔记与功能矩阵证据;测试断言、超时预算与 CI 跳过规则未放宽。

验证

当前整合提交:1a82ddfa480169c670991132781b05c2552e6b87。该提交的全部 Actions 检查已通过,PR 无合并冲突。

以下为本轮本机和云端补充验证,保留环境差异:

  • macOS 固定 Swift 6.3.3 / Xcode 26.6 编译通过;索引、工作区生命周期、Run、Git 观察等定向回归 318 项通过,Rust↔Swift/Git 桥接 9 项及 Git 执行集成 12 项通过。
  • Core 1,573 项单元/集成测试及逐项计时通过;相关前端 214 项在 macOS 和云端 Windows 分别通过,两端 TypeScript 检查通过,Windows 前端生产构建及原生 Debug 应用编译通过。
  • 云端 Windows Server 2022:项目层 48 通过/1 跳过,终端 37 通过;宿主 376 通过/3 跳过/1 断言失败/2 超时。6 项索引租约/刷新回归及 Run 进程树回归均通过。105 个源码和夹具哈希与本地整合版本一致。
  • 云端 Shared Rust 辅助宿主:Git Host 10 项、IDE Host 10 项通过,Agent Host 217 项通过/38 项跳过。额外的云端 Core 全量运行在同提交 Windows CI 全绿后主动停止,未将该未完成运行计为通过;其测试进程树已清理。
  • 云端宿主未全绿:current_process_private_working_set_is_available 返回零内存;first_launch_copies_durable_state_without_sharing_files_or_runtime_caches 与 wsl_repository_case_isolated_without_adopting_ambiguous_legacy_shelves 超预算。三项在云服务器单独复核仍复现;同一提交的 GitHub Windows runner 分别以 32ms、212ms、280ms 通过。这三处实现未被本 PR 修改,保留云端环境限制,不放宽断言或预算。
  • 冷 checkout 的 Agent 清理测试首次在内部编译缺失夹具并触及 15 秒预算;独立预构建夹具耗时 1分35秒,此后原用例按原预算 91ms 通过。生产逻辑未修改。
  • macOS 全套记录 4,217 项,4,212 通过、5 断言失败,并有一个已通过用例超预算。日期用例在 UTC 复核通过,VCS 超预算用例单独复核 1.3 秒通过;4 项未修改的原生窗口焦点测试在当前桌面仍失败,不把完整套件标为成功。
  • 共享契约、Core/Services/Windows 边界、三项 i18n、Agent Notes、矩阵及增量门禁、运行时包只读、CI 分类/复用与计时工具回归通过。
  • Windows A/B 工作区、多窗口和真实 LSP 恢复的产品界面验收仍未完成;两端功能矩阵保留 pending,自动化组件测试不替代人工界面验收。

原提交 7eeb4b32 的 Windows CI 失败任务重跑已成功:此前 Git patch 超时用例 4.652 秒通过,Core 记录 1,462 项,宿主记录 382 项。此记录只属于旧提交,不替代本轮整合后的 CI。

本轮报告位于本地 .artifacts/pr1597-finalize/ 与 .artifacts/test-stability/。历史功能讨论与审查记录保留在 PR 时间线。

@ghfind-review ghfind-review Bot added the review: medium ghfind author score; see https://ghfind.com label Oct 30, 2026
@lin-coco
lin-coco marked this pull request as ready for review October 30, 2026 05:20
@lithe-code-review

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

Copy link
Copy Markdown

Lithe Review

结论: ⛔ 有阻塞
范围: preview ← codex/958-workspace-index-exclusions · head: 7563ec7

Findings

  1. [P1] LSP 门禁错误截取附加根文件路径,导致语言服务无法连接
    windows/tauri/src/features/editor/lsp/lsp-client.ts:892

    • 实际影响:未排除的附加根文件也会在建立语言服务连接前失败。
    • 触发条件:文件不属于主根,而 useLspIntegration 仍将主根作为 scope.root 传入。
    • 复现步骤:打开主根 C:/main,附加 D:/added,打开 D:/added/src/main.go。这里按主根长度截取得到 /src/main.go,随后向 Core 提交 paths: ["/src"];validate_paths 拒绝该路径,异常使连接流程终止。base 中没有这段前置校验。
    • 来源:本次引入。
  2. [P2] 嵌套根的排除内容仍会从父根进入库存和搜索
    rust/lithe-core/src/project/indexing.rs:393

    • 实际影响:目录在树中显示已排除,其文件仍可出现在 Quick Open、Agent 候选和内容搜索中。
    • 触发条件:Windows 同时登记父根与嵌套根,两者的排除策略不同。
    • 复现步骤:登记 C:/main 和 C:/main/nested,仅在后者排除普通目录 archive。fffListFiles 分别扫描两根后合并;父根扫描递归进入 nested/archive,这里始终使用 context(root),不会读取嵌套根策略,因此文件从父根结果重新进入库存。searchFilesContent 同样分别查询两根。
    • 来源:本次引入;新增的最近根偏好归属尚未贯穿实际扫描链路。
  3. [P2] Windows 远程项目仍启用无效的索引设置
    windows/tauri/src/features/settings/components/workspace-indexing-settings.tsx:33

    • 实际影响:页面向本机 Core 提交远程路径并显示错误,同时允许保存不会生效的开关值。
    • 触发条件:当前根为 remote://… 或 wsl://…。
    • 复现步骤:打开此类项目后进入 Git 设置。偏好读取成功即设置 loaded=true,随后无条件调用 configureWorkspaceIndexing(root);调用失败仅更新错误,复选框仍可操作,因为禁用条件只检查根是否存在及偏好是否已读取。
    • 来源:本次引入。
  4. [P2] 新增设置校验错误直接显示硬编码英文
    windows/tauri/src/features/file-explorer/stores/workspace-indexing.ts:29

    • 实际影响:设置错误提示绕过共享 i18n,无法随应用语言翻译。
    • 触发条件:持久化设置是合法 JSON,但字段结构不符合要求。
    • 复现步骤:将当前项目的索引设置保存为 {},再打开 Git 设置。此处抛出的 Invalid indexing settings 经页面的 String(cause) 直接进入错误提示。
    • 来源:本次引入。

Scope Check

  • 关联 Issue:覆盖 [Feature] parse gitignore file #958 的目录索引与搜索方向;Issue 尚未确认树隐藏、插件 API 等场景是否属于最终需求,无法确认全部需求完成。
  • 已完成范围:共享策略、原生 Git 判断、两端设置与目录菜单、搜索及语言服务门禁、契约和决策笔记。
  • 未完成范围:上述 Windows 路径与能力边界问题;远程实际排除及语言服务后台扫描仍有限制。
  • 上游复用:使用 Git 判断忽略语义,并向语言服务叠加原生配置,职责方向合理。
  • 所有 Finding 均指向本次新增行为及其直接调用链,属于当前 PR 职责范围。

Suggestions

  1. 按文件所属的最近工作区根查询策略,并验证包含关系后计算相对路径;补充附加根和外部文件的 LSP 回归。
  2. 父根扫描应剪枝另行登记的嵌套根,让该子树只通过所属根生成库存和搜索结果;补充真实扫描链路测试。
  3. 对不支持的远程根禁用开关、显示本地化能力说明,并避免调用本机索引接口。
  4. 使用稳定错误分类,在呈现层通过共享 i18n 生成校验错误文案。
  5. 已提供 macOS 当前界面截图链接;请补充已有界面的修改前后对比及 Windows 界面截图。

Summary

共享 Core 与原生 Git 的复用合理,但 Windows 的根归属尚未贯穿库存和语言服务。Finding 1 应在合并前修复;其余为非阻塞建议。

Verification

  • 静态检查指定 fbb5e578…7563ec71 范围,重点追踪 Core 策略、扫描与缓存、LSP 配置及工作副本、两端生命周期、设置、菜单和相关测试;未读取生成资源正文。
  • 作者报告 Rust 57 项、Swift 79 项、前端 26+25 项定向测试及相关门禁通过;本次未复跑。
  • 提供的 Check Run 中,原生 Swift、Rust、Windows 测试为 skipped;平台 gate 成功不代表这些测试已执行。
  • 本次未运行任何代码、测试或应用,未访问网络。Windows 原生验证及固定 Swift 6.3.3/Xcode 26.6 验证仍缺失。
  • 上下文附有 5 张 macOS 截图链接;本次未访问图片,视觉效果未验证,仍需上述对照和 Windows 截图。

Fix attached-root LSP gates and reevaluate documents when workspace roots change. Carry request-local ownership through inventory, search, replacement and incremental index caches; preserve scoped search when unrelated roots are unavailable.

Disable unsupported remote indexing settings, localize settings failures, normalize both Java exclusion test expectations, and register regressions in Windows CI.
@lin-coco
lin-coco marked this pull request as draft October 30, 2026 08:00
@lin-coco
lin-coco marked this pull request as ready for review October 31, 2026 03:42
@lithe-code-review

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

Copy link
Copy Markdown

Lithe Review

结论: ❓ 审查未完成

任务: 441

审查状态:已由服务器取消

可以重新评论 @lithe review 召唤。维护者可通过任务编号查看服务器日志。

@lin-coco
lin-coco marked this pull request as draft October 31, 2026 03:52
将会话打开代次与资源投影代次分开,保留立即 Run 的等待意图及同根重开隔离。
避免无待确认 Java 决策时重复发布空值,并使设置与混合规则夹具等待真实生命周期边界。
为 Git 观察 CI 补齐逐项报告,按原始输出活性检测 Swift 停顿,保留既有断言与预算。
记录通过的 126 条受影响 Swift 及 116 条身份消费者验证。
@xiaoyumuxi

xiaoyumuxi commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator

补充一点:git 的忽略机制不应该影响默认的可见性,可见性请单独去进行设置中进行配置,但是 git 排除之后不应该可以在 commint 面板中显示,这个问题的逻辑可能是查询更新前查的是工作区
image
因为我们 git 不管理不代表工作区不显示,而且版本管理也不只有 git 一个方案,因此 git 只能影响自己方位的东西

@lin-coco

lin-coco commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor Author

git 不管理不代表工作区不显示

明白,这里确实需要把“Git 是否管理文件”“文件是否可见”和“是否参与索引”区分开,当前实现也是按这几个边界处理的。

补充说明一下这个 PR 的初衷:我之前用 PyCharm 打开大型工作区时,已经根据 .gitignore 排除了很多目录;同一个工作区用 Lithe 打开后,这些目录仍参与扫描和索引,导致索引范围明显扩大,也增加了卡顿。因此,这个功能希望复用项目已有的 Git 忽略规则,减少不必要的扫描、索引和分析开销,避免用户再手动维护一份重复的目录排除配置。

这里参考的是 JetBrains 的同类功能。其 Git 设置中有 “Automatically exclude ignored directories from the analysis”,官方源码也有将 Git 忽略目录加入项目排除目录的同步实现:

具体来说,当前设计中三个范围各自独立:

  • 索引排除:开启“根据 Git 忽略规则自动排除目录”后,相应目录不参与 Lithe 管理的索引和搜索。这是 IDE 提供的一项可配置策略,主要用于减少大型工作区中的无效索引。
  • 文件可见性:不会仅因为目录被 Git 忽略就将其从项目树隐藏。被排除索引的目录仍然可以展开浏览、直接打开文件;需要隐藏哪些路径,继续由独立的可见性设置处理。
  • Git 状态与 Commit 面板:继续以 Git 自身的状态为准,不根据项目树是否显示、是否参与索引来决定文件能否出现在 Commit 中。被 Git 忽略且未跟踪的文件默认不显示;已经被 Git 跟踪的文件,即使后来匹配 .gitignore,其变更仍应正常显示。

JetBrains 同样通过独立的 Show Excluded Files 选项控制排除目录是否显示,因此“目录仍可见”和“不参与索引”可以同时成立。官方说明

针对这些边界,已在当前提交 ea6fe922 的 macOS 真实 App 中,用独立临时仓库对照原生 Git 命令补做了验证:

  • Git 忽略目录仍可在项目树展开,但其中未跟踪文件不会进入内容搜索和 Commit 列表。
  • 仅被隐藏、没有被 Git 忽略的 local.json,仍会正常出现在 Commit 中。
  • 已跟踪的文件,即使匹配忽略规则或被隐藏,其修改仍正常出现在 Commit 中。
  • App 运行时新增、移除 Git 忽略规则,Commit 面板会自动更新,搜索范围也会随之重新计算。

所以,“Git 不管理不代表工作区不显示”这一点与本 PR 的目标是一致的。这里是把 Git 忽略规则作为 Lithe 索引排除策略的一个来源;文件可见性继续单独配置,其他版本控制工具也应保留各自的状态判断和规则边界。

@lin-coco lin-coco closed this Oct 31, 2026
@lin-coco lin-coco reopened this Oct 31, 2026
lin-coco and others added 4 commits October 31, 2026 16:41
* feat(plugins): 声明式语法高亮与运行标记(API-25/27/29)

- languages 2:插件语言可带 Monarch 语法和编辑器配置,Core 校验,纯语法插件免重启
- runMarkers 1:backend 2 插件函数回答可运行行,编辑器画运行按钮,点击经 commands/didRun 带 runMarker
- 契约、fixture、Agent Note、计划文档与功能矩阵同步更新;Windows 暂不支持

Refs 1lck#570

* feat(plugins): 独立编辑器高亮与动作扩展

- languages 2 提供静态语法和独立编辑配置,插件正则在可终止 worker 中运行\n- editor/registerActions 运行期注册文本动作,点击复用普通函数调用,不扩张 Run/LSP/Build/Debug 领域契约\n- 补齐文档版本、动作租约、取消与清理、独立工具后端启用及安全模式边界\n- 更新 Skill、审查规则与决策笔记,总结 1lck#1581/1lck#1558 的架构边界\n- 同步契约、fixtures、中英词条、功能矩阵与资源复用说明\n\nRefs 1lck#570\nReworks 1lck#1617

* docs(plugins): 明确 API-25 JSON 贡献的支持范围与局限

区分包内静态 JSON 贡献与尚未开放的运行期 Provider 注册、替换和释放;说明独立语义 Provider、新引擎适配及平台、SDK 和验收限制。同步计划、架构笔记、正式契约与功能矩阵。

* fix(plugins): 修复编辑器扩展审查中的生命周期与高亮问题

动作刷新立即确认调度并隔离非致命失败,整批收集共享八秒期限并在撤销时清理计时任务。

Core 保留校验后的 grammar 原始文本,worker 按源顺序解析 cases 并显式默认 root;配置-only 别名借用既有 tokenizer,重映射 token 语言身份以保留独立注释配置。

模块状态观察弱引用 runtime,补齐有界、确定性的 Swift/Rust/WebKit 回归与测试文档模型清理,同步契约、Agent Note 和功能矩阵。

验证:57 项 Swift、1459 项 Rust、39 项编辑器和 119 项真实 WebKit 测试通过;静态边界、i18n、只读 bundle、资源复用与矩阵门禁通过。未执行 Windows 原生构建或打包安装验收。

Refs 1lck#1617, 1lck#570
Retry current-workspace indexing cancellation without retiring another owner, publish only the latest complete inventory, and restore saved sessions once per workspace. Apply scoped search before caps and cursors, preserve dotted provider configuration siblings, and normalize Windows mark identity and localized read failures.
@lin-coco
lin-coco marked this pull request as ready for review October 31, 2026 11:37
@lithe-code-review

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

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← codex/958-workspace-index-exclusions · head: 32458764

Findings

  1. [P2] 内容搜索将索引设置错误码直接显示给用户
    windows/tauri/src/features/file-explorer/stores/workspace-indexing.ts:34

    • 实际影响:搜索失败时可能显示 Search failed: invalidSettings,绕过共享 i18n 中已有的 indexing.invalidSettings 文案。
    • 触发条件:工作区索引偏好存在但格式无效,例如内容为 {},随后执行全局内容搜索。
    • 复现步骤:将该工作区的 lithe.workspace-indexing.* 偏好设为 {},再在全局搜索中输入查询。新增的配置调用会抛出 IndexingSettingsError;其 message 是错误码,搜索错误处理将其拼入错误文本并交给界面直接显示。
    • 来源:本次引入。

Scope Check

  • 关联 Issue 或需求是否完成:关联 [Feature] parse gitignore file #958。Issue 描述宽泛;PR 将需求界定为可配置的索引排除,不改变目录可见性,也不提供插件 API。按该边界,PR 覆盖了 Git 忽略和手动排除策略及相关搜索、索引接入。
  • 已完成范围:共享 Core 策略、两端设置与目录操作、库存和搜索过滤、LSP 排除接入。
  • 未完成范围:PR 上下文明确 Windows 原生界面截图仍待补充;最终 head 的完整 Windows 测试未运行,完整 macOS CI 测试因 Draft 跳过。
  • 是否复用了已有上游能力,或对自研边界给出充分证据:Git 忽略判断使用原生 Git 能力;LSP 配置通过既有语言服务适配路径接入。未见另建 Git 或语言服务领域真源的迹象。
  • 每个 Finding 是否由本次变更引入或加剧:是,新增索引配置错误经内容搜索路径传播并显示。
  • 是否属于本次变更职责范围:是,新增的搜索配置失败路径和索引设置错误呈现属于本次改动。

Suggestions

  1. 保留稳定错误码,在搜索界面按错误类型映射到 shared/i18n 文案;不要把 Error.message 中的内部错误码直接渲染给用户。
  2. 补充 Windows 受影响界面的截图;对已有界面改动提供前后对比。当前上下文有 macOS 截图,但本次未查看图片,视觉效果未验证。

Summary

未发现需要阻塞合并的问题。主要索引排除路径与 PR 说明的边界一致;建议修复搜索错误的本地化呈现,并补齐 Windows 界面证据。

Verification

  • 静态检查固定范围 a1ed8f4...32458764,追踪 Windows 索引错误、内容搜索与错误展示调用链,并检查 Core 索引和 LSP 相关改动。
  • 作者提供的验证报告包含 Core、Swift 和 macOS 原生应用验证;这些结果未在本次审查中复跑。提供的最终 head 检查中,Remote Workspace CI 和 Agent Notes 成功,Windows 测试跳过,完整 macOS 测试因 Draft 跳过;部分 i18n 检查仍显示 queued。
  • 本次未运行代码、测试、i18n 检查或 scripts/macos/verify/verify-runtime-bundle-immutability.sh,也未访问网络或查看截图。
  • 仍缺 Windows 原生界面验证和最终 head 的完整 Windows、macOS 测试结果。

@lin-coco
lin-coco marked this pull request as draft October 31, 2026 12:04
@lin-coco
lin-coco marked this pull request as ready for review October 31, 2026 12:29
@lithe-code-review

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

Copy link
Copy Markdown

Lithe Review

结论: ❓ 审查未完成

任务: 446

审查状态:已由服务器取消

可以重新评论 @lithe review 召唤。维护者可通过任务编号查看服务器日志。

@lin-coco
lin-coco marked this pull request as draft October 31, 2026 12:50
@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

@lin-coco 修好了之后艾特我,我帮你 review 一下,bot 这几天好像有问题

@lin-coco
lin-coco marked this pull request as ready for review October 31, 2026 13:07
@lithe-code-review

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

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← codex/958-workspace-index-exclusions · head: d678b2d

Findings

  1. [P2] 为排除目录保留独立的本地历史迁移路径
    rust/lithe-core/src/project/files.rs:1295

    • 实际影响:已有本地历史的文件被排除索引后,在项目树中重命名或移动,历史仍绑定旧路径,新路径的文件历史变为空。
    • 触发条件:文件已有历史记录,其父目录被手动排除或由 Git 自动排除,随后执行项目树的重命名或移动操作。
    • 复现步骤:为 archive/notes.txt 保存历史,将 archive 标记为排除并等待刷新,再把目录重命名为 archive-old。新增剪枝使该文件退出 snapshot.files,继而退出 macOS 的 projectFiles。未修改的重命名逻辑仍在 WorkspaceFeatureModel.swift:842–847 从 projectFiles 构造 relocatedHistoryFiles,因此后面的历史迁移循环为空;移动逻辑的 historyFiles 也使用同一库存。此时查看 archive-old/notes.txt 的历史不会找到旧记录。
    • 来源:本次引入。base 中排除标记不裁剪该库存,原有历史迁移仍能获得这些文件;本次将库存改为索引候选后,尚未调整这一直接消费者。
  2. [P2] 目录标记解析仍绕过稳定错误分类
    windows/tauri/src/features/file-explorer/stores/workspace-indexing.ts:228

    • 实际影响:损坏的目录标记会让内容搜索直接显示 JavaScript 的原始解析错误;结构损坏但仍是合法 JSON 时,又可能被当作空标记安装,与项目树的校验结果不一致。
    • 触发条件:当前根的 lithe.workspace-directory-marks.* 存储值无法解析,或缺少合法的版本及 marks 结构。
    • 复现步骤:将该键的值设为 {,再执行内容搜索。此处直接调用 JSON.parse,抛出的 SyntaxError 不属于 IndexingSettingsError;use-content-search.ts:50–53 将其转换为原始 message,GlobalSearchError 随后直接显示,未使用共享的 indexing.invalidSettings 词条。若改为 {},这里会用空标记继续配置,而 readDirectoryMarks 会正确判为无效设置。
    • 来源:本次引入。新增搜索配置路径另行解析目录标记,没有复用本 PR 已提供的结构校验及类型化失败。

Scope Check

  • 关联需求:[Feature] parse gitignore file #958 的描述较宽。按 PR 及讨论明确的“本机目录索引排除、可见性独立、Git 状态独立”边界,已覆盖主要实现;未把插件解析 API 视为已完成能力。
  • 已完成范围:共享策略与租约、多根库存和搜索边界、两端设置及目录操作、语言服务工作副本门禁和原生配置叠加。
  • 未完成范围:上述历史迁移及目录标记解析边界;Windows 原生界面证据和最终 head 的完整 CI 结果仍未提供。
  • 上游复用:Git 忽略语义交给原生 Git,语言服务通过已有 provider 配置接入,未发现新增并行领域真源。
  • 两条 Finding 均由本次改动引入,属于新增库存语义及错误传播的直接影响范围。

Suggestions

  1. 本地历史记录及迁移不要依赖索引候选库存。按历史自身规则取得受影响文件或已有历史元数据,并补充“已有历史 → 排除 → 文件/目录重命名与移动 → 新路径仍可读取历史”的回归。
  2. 抽取并复用目录标记解析器,统一校验版本、结构和路径,将解析失败转换为 IndexingSettingsError("invalidSettings"),保留原始存储;补充损坏 JSON 和 {} 经真实内容搜索入口的回归。
  3. 补充 Windows 受影响界面的截图,以及已有界面的修改前后对比。上下文包含较早 macOS 提交的截图链接,本次未访问图片,视觉效果尚未验证。
  4. 补齐 d678b2df 对应的完整平台测试、i18n 和运行时包只读门禁结果,并注明实际 checkout;不要将正文中 bc57f7c9 或更早源码的结果标为本轮 head 已通过。

Summary

未发现需要阻塞合并的问题。共享 Core 策略、原生 Git 复用及显式工作区根边界总体一致;仍需修补索引库存对本地历史消费者的影响,以及目录标记错误分类遗漏。两项均为 P2 非阻塞建议。

Verification

  • 静态审查固定范围 a1ed8f4...d678b2df,从完整 105 文件清单进入,重点追踪 Core 策略、库存/缓存/搜索、LSP 配置与工作副本、两端工作区生命周期、设置、目录操作及相关测试和 CI 分组;按要求未读取生成资源正文。
  • 本地历史问题已对照 base,并追踪 macOS 库存赋值、重命名/移动列表、历史记录和迁移调用链;错误问题已追踪偏好解析、内容搜索失败转换和呈现组件。
  • 作者提供了多个历史源码版本的 Core、Swift、前端及原生验收报告;本轮未独立复核。可信上下文中,当前 head 的 Check Run 仍为 queued/in_progress,不能认定完整 CI 已通过。
  • 本次未修改文件,未运行仓库代码、测试、应用、i18n 检查或 scripts/macos/verify/verify-runtime-bundle-immutability.sh,未访问网络、批准 PR 或发布评论。
  • 最终 head 的固定 macOS 工具链、Windows 完整测试及原生界面验证仍是验证缺口。

@lin-coco
lin-coco marked this pull request as draft October 31, 2026 13:22
@lin-coco
lin-coco marked this pull request as ready for review October 31, 2026 13:44
@lithe-code-review

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

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← codex/958-workspace-index-exclusions · head: c892981

Findings

  1. [P2] 修改目录角色时应保留已保存的包含例外
    windows/tauri/src/features/file-explorer/stores/directory-marks.ts:172
    同类逻辑:macos/Sources/LitheWorkspaceModule/Application/WorkspaceFeatureModel.swift:656

    • 实际影响:用户已取消排除的目录会再次被 Git 规则排除,其文件重新退出索引和搜索。
    • 触发条件:自动排除已开启,目录匹配 Git 忽略规则,用户取消排除后再将其标记为源码、资源、模块或包。
    • 复现步骤:让 .gitignore 忽略 archive/,选择“取消排除”并确认搜索恢复,再将其标记为资源目录。两端都会因角色不是 plain 而删除 includedDirectories 中的例外,下一次配置恢复 Git 排除。
    • 来源:本次引入。新增逻辑将角色修改与包含例外删除绑定,违背了普通角色操作与索引排除独立的边界。
  2. [P2] 为后台工作区保留 Git 规则失效通知
    windows/tauri/src/features/file-system/services/file-watcher-listener.ts:154

    • 实际影响:返回后台工作区后,搜索可能继续使用过期的 Git 排除判断,导致应排除的内容仍可搜索,或恢复包含的内容仍然缺失。
    • 触发条件:同窗保留 A、B 两个工作区,在 B 活动期间从外部修改 A 的 Git 忽略规则。
    • 复现步骤:先在 A 搜索以建立目录判断缓存,切换到无关的 B,修改 A 的 .gitignore 并等待事件处理,再返回 A 搜索。新增 Git 回调只检查活动工作区;文件回调也会在找不到活动根时提前返回。A 的租约和缓存继续保留,而返回后的树及搜索配置均传入 refresh:false。Core 在 indexing.rs:130 复用相同策略,并在 :554 直接返回已缓存目录判断,因此重新扫描也不会重新询问 Git,直到另一次有效刷新发生。
    • 来源:本次引入。新增持久化排除判断缓存没有覆盖后台工作区的规则失效及恢复激活路径。
  3. [P2] 目录菜单应本地化新增的索引设置错误
    windows/tauri/src/features/file-explorer/stores/directory-marks.ts:146

    • 实际影响:目录标记失败时,提示直接显示 IndexingSettingsError: invalidSettings,没有使用已有的共享翻译。
    • 触发条件:目录标记数据有效,但当前根的索引偏好结构损坏。
    • 复现步骤:将 lithe.workspace-indexing.c:/workspace 保存为 {},随后在目录菜单选择一个角色。这里新增的 readIndexingSettings 抛出类型化错误,调用方 use-file-explorer-context-menu.tsx:880 却通过 String(error) 将内部错误码直接显示。
    • 来源:本次引入。base 的目录标记动作不读取该索引偏好;新增失败路径尚未适配既有错误呈现消费者。

Scope Check

  • 关联需求:[Feature] parse gitignore file #958 描述较宽;按 PR 及讨论明确的本机索引排除、文件可见性独立、Git 状态独立边界审查,主要实现已覆盖。
  • 已完成范围:共享策略与租约、多根库存和搜索过滤、两端设置及目录操作、语言服务配置与工作副本门禁;此前历史迁移和目录标记解析问题已补修。
  • 未完成范围:上述角色、后台缓存失效及目录动作错误呈现边界。远程/WSL 排除明确不在当前支持范围。
  • 上游复用:Git 忽略语义使用原生 Git;语言服务通过现有 provider 配置接入,未发现新增并行领域真源。
  • 三项 Finding 均由本次改动引入,属于新增行为及直接消费者的职责范围。

Suggestions

  1. 仅显式标记为排除时删除对应包含例外;其他角色修改保留例外,补充两端“取消排除 → 修改角色 → 仍参与索引”的回归。
  2. 将规则失效通知路由到所有匹配的存活工作区,或记录待刷新根并在重新激活后的查询前刷新;补充使用真实缓存的 A→B→A 回归。
  3. 在目录菜单错误呈现处将 IndexingSettingsError.code 映射到共享 i18n,保留原始存储,并覆盖中英文失败提示。
  4. 补充 Windows 受影响界面截图,以及已有界面修改的前后对比。
  5. 补齐 c892981e 对应的最终 CI 结果,注明实际 checkout 和复用来源,避免将较早提交的通过结果视为当前 head 已通过。

Summary

未发现需要阻塞合并的问题。共享 Core、原生 Git 及语言服务适配的职责总体一致;三项 P2 建议涉及偏好保留、缓存失效和错误本地化。

Verification

  • 从完整 110 文件清单进入,重点静态追踪 Core 策略、库存/搜索/缓存、LSP、两端生命周期、目录动作、设置、历史迁移,以及相关测试和 CI 注册;关键问题已对照固定 base。
  • 作者提供了多个较早提交的 Core、Swift、前端及 macOS 原生验证报告,本次未独立复跑。可信上下文中,当前 head 的检查仍为 queued/in_progress,不能认定完整 CI 已通过。
  • 本次未修改文件,未运行仓库代码、测试、应用、i18n 检查或运行时包只读验证脚本,未访问网络。
  • 上下文附有较早提交的 macOS 截图链接;本次未访问图片。Windows 截图及前后对比仍待补充,视觉效果尚未验证。

ZJUSCODE and others added 17 commits October 31, 2026 23:24
* fix(macos): 修复分支列表悬停长分支名时触控板无法滚动 (1lck#1621)

触控板手势绑定在开始时的窗口上。悬停扩展面板收到首个滚动事件就关闭,
导致同一手势的后续事件全部丢失。手势期间改为隐藏面板并继续转发给列表,
手势结束后再关闭。鼠标滚轮行为不变。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(matrix): 记录分支列表触控板滚动的验证要求 (1lck#1621)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(macos): 手指停顿时保留滚动手势,点击立即回收隐藏面板 (1lck#1621)

手势进行中的回收超时从 1 秒放宽到 10 秒,避免停顿后继续滚动时丢失手势。
隐藏面板收到点击时立即回收,并在功能矩阵补充对应验收步骤。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(macos): remove push dialog file request ordering race

---------

Co-authored-by: ZJUSCODE <ZengJun326@outlook.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Yao Jingxi <23722032@bjtu.edu.cn>
- 内存指示器只保留内存芯片图标,不再常驻显示“总计 / Lithe”数值;
  悬停提示仍给出总计、Lithe、LSP、服务内存,点击打开原有的托管内存详情,
  VoiceOver 读出“托管内存”和当前总计。
- 帧率只显示“60 FPS”文字,去掉速度表图标。
- 新增 18pt 的状态栏紧凑图标按钮样式,只读锁和内存图标改用它,
  不再沿用 28pt 工具窗口按钮留出的大块空白。
- 删除不再使用的 "Total %@" 词条并重新生成本地化资源。
- 更新 memory-monitor 功能矩阵的 macOS 证据与验收说明。
* fix(macos): virtualize background service exit selection (1lck#1627)

* fix(macos): keep background service accessibility selection live
* fix(agent): restore Codex history and add provider filtering

* fix(agent): honor manual archive collapse under provider filters
* feat(macos): 增加彩色 LSP 状态菜单与普通日志标签页

* fix(macos): LSP 入口常驻并仅由启用插件注入服务器

* fix(lsp): 等待重启关闭完成并保留局部索引重置状态
* feat(macos): 终端标签任意拖拽分屏并保留 PTY

- 终端标签改用 AppKit 拖拽会话与私有 pasteboard,避免 Monaco 接收文本拖放
- 工具窗终端可拖入编辑器边缘或空编辑器,编辑器终端可拖回工具窗
- 抽出 EditorGroupLayout.splitting 复用分屏几何,补充模型、拖拽与 PTY 测试

Refs 1lck#1622

* fix(macos): preserve terminal drop order and deduplicate split previews

- Limit the native tool-window drop overlay to the canvas so tab-strip
  before/after insertion remains available for terminals dragged from editors.
- Publish editor-group preview targets only when they change, including
  repeated clearing and drag lifecycle cleanup.
- Add focused native overlay geometry and preview publication regressions.
- Update the docking Agent Note and terminal capability matrix evidence and
  verification steps without claiming unperformed runtime verification.

Validation: six focused Swift tests passed on Swift 6.3.3 with macOS 26.5 SDK;
runtime bundle, architecture, i18n, Agent Notes and matrix static gates passed.
The exact PR-based push tree also passed the static gates.

Refs 1lck#1638

---------

Co-authored-by: Yao Jingxi <23722032@bjtu.edu.cn>
…rch (1lck#1642) [skip ci]

Use the selected project JDK in JDT configuration on both platforms. Give Windows applications independent cancellable sessions across Run, IDE API and Debug, with isolated failure output. Avoid blocking cold file/text search on content index warmup and improve macOS search sizing and result layout. Include shared fixtures, regression coverage and architecture notes.
* feat(plugins): 插件注入的工具链框架与 macOS 只读环境设置页 (1lck#1581)

按 1lck#1581 评审后的改写计划重做:宿主不认识任何工具,工具定义、版本管理器
(提供方)全部由插件声明;Core 只做校验和四层解析,不解析 mise 等管理器
的私有格式。

- 契约:新增 toolDefinitions 1、toolchainProviders 1,executableResolution
  增加 v2(只用于工具定义候选);同步 schema、README、toolchains.md、
  fixture 和 rust-core-api.md;proposals/toolchains/ 放完整方案草案
- Rust Core:新领域模块 rust/lithe-core/src/toolchain/(定义注册表、
  提供方答复校验、目录固定、固定/项目文件/全局/自动四层解析、版本匹配、
  扫描计划)和六个 toolchains.* 命令,全部只处理宿主快照,不启动进程、
  不扫描、不写文件
- macOS:设置 › 构建新增「运行环境」「环境来源」两页,内容来自已启用
  插件的声明和磁盘上的真实文件;未实现的添加、切换、保存、查询入口不显示
- 登录 Shell:新增只读 inspect,来源页显示读取状态、变量数、耗时和
  PATH 各目录来源;重新读取不改变本进程 PATH
- Debug 预览入口 --toolchain-settings-demo / --toolchain-sources-demo
- Agent Note、设置层级 Note、功能矩阵和中英词条同步

Refs 1lck#1514

* feat(plugins): 工具链安装同时支持声明式扫描与提供方查询 (1lck#1581)

工具的已安装版本有两条途径,可以只用其一或同时使用:
- 声明式扫描:工具定义的 discovery/homeLayouts/version 由宿主展开,不运行
  插件代码;可用的根和通配写法固定,新的安装形态交给提供方回答。
- 提供方查询:toolchainProviders 通过 toolchains/query 返回安装和要求。

- watchFiles 改为可选:不声明的提供方只报告安装,答复里带版本要求会被拒绝;
  定义工具的插件也可以作为自己工具的提供方。
- 自动层把两条途径合成一个候选集合:同一规范化目录只算一次,来源标注优先
  提供方、其次 host:system,只用于显示;不同目录同版本仍报冲突。
- discoveryPlan 对每个工具同时列出 scans 和 providers。
- macOS 环境来源页对只报告安装的提供方显示「只报告已安装的版本」。

同时修复评审的两个 P2:
- 符号链接安装在解码时已规范化,解析时却按原始路径查证据而误判 unsafePath;
  现在文件证据同时证明其规范化目标,证据互相矛盾时拒绝快照。
- 环境变量候选声明的 path 布局被忽略、总取第一个布局;现在按声明的布局选择。

* feat(plugins): macOS 设置页接入声明式扫描与版本探测 (1lck#1581)

- Core 新增 toolchains.candidates:列出一个工具的登录 Shell home 变量、扫描到的安装、跳过原因和自动层的选择;和 resolve 共用事实校验,宿主分两轮调用完成版本探测,工作区内的目录在探测前拒绝
- toolchains.discoveryPlan 增加 pathPrepend 模板和各平台适用的 home 变量
- 新增 MacToolchainDiscovery:按插件声明展开扫描,只探测 Core 返回的可执行文件;扫描根、条目、文件事实、安装数、探测数、并发和总时长都有上限,超出时给出诊断
- 运行环境页:全局卡片显示 home 变量和探测到的版本,PATH 命令标为版本未验证;自动卡片列出真实安装、选中项、同版本冲突和跳过数,路径显示扫描到的条目名
- 加载器只把登记在官方目录、并经内置或插件市场安装的插件标为官方来源
- 预览改用完整的样例清单,扫描本机真实安装
- 更新契约 toolchains.md、rust-core-api.md、Agent Note、功能矩阵和中英词条

* test(macos): 设置页声明顺序与构建分组保持一致 (1lck#1581)

运行环境、环境来源两页插在项目页和运行配置之间,使 SettingsCategory
声明顺序(搜索结果顺序)与侧栏构建分组顺序不一致,
settingsCategoryPlacesProjectAndRunBetweenKeymapAndTerminal 在 CI 失败。
把两页的 case 移到项目页之前,测试改为断言 Keymap 与 Terminal 之间
恰好是构建分组,且分组以项目页、运行配置结尾。

* feat(plugins): macOS 设置页接入工具链提供方查询 (1lck#1581)

- Core: lsp.toolchainRequest 与 litheToolchains 协商,原样回传回复交 toolchains.decodeReply
- Core: candidates 接受 providerInstallations 并保留提供方归属
- 修复别名链接 home 只有链接路径事实时被判 unsafePath(机器人 P2)
- macOS: 启动或复用插件后端查询,全局+逐目录独立 operationID/代次,超时与取消
- macOS: watchFiles 与回复 watch 变化整份重查,短时间事件合并
- 设置页显示提供方要求、版本与查询结果;文案走 shared/i18n
- 更新契约、功能矩阵与 Agent Note

* feat(plugins): 运行环境页每行生效来源改由 Core toolchains.resolve 决定 (1lck#1581)

- 每个查询过的目录、每个工具调用一次 toolchains.resolve,摘要、徽标和
  “第几层生效”都读它的结果,视图不再自己按固定 → 项目 → 全局 → 自动排序
- 解析与提供方查询共用同一份文件事实;同一轮查询的提供方共享代次,
  每次查询仍有独立 operationID
- 固定值交给 Core 校验:只有固定值的目录只解析它固定的工具(每次加载
  最多 256 个),固定的 home 经 toolchains.candidates 检查后探测,
  不会出现在自动检测列表;不可用时终止失败,不回落
- 未安装的项目要求记为 unmet 并退到下一层;Core 无法给出结果时给出诊断
- 已知限制写入提案 Note 并建 Issue:冲突选择与写入 1lck#1639、
  项目 wrapper 1lck#1640、PATH 命令 commandHomes 1lck#1641
- 新增文案走 shared/i18n 并重新生成

* fix(plugins): 加载途中 context 变化的回复不再显示项目要求 (1lck#1581)

- 同一目录一轮查询里,context 与本轮不一致的提供方回复不会进入 toolchains.resolve,
  但它的项目要求仍被写进页面的 requirements,导致页面显示的要求和 Core 的生效结果来自
  两个不同的 context;现在只记录进入本轮的回复的项目要求,全局要求和安装列表不变。
- 新增 aReplyUnderAChangedContextIsLeftOutOfItsDirectory 测试:两个提供方在加载途中拿到
  不同代次的 context,断言只有进入本轮的提供方要求被显示、Core 用它解析;修复前该测试失败。
- 测试夹具 providerSource 支持声明多个提供方,原有用例行为不变。
- Agent Note 更正“每个路径只读一次”的说法:查询阶段和解析阶段分两次读取事实,单次解析
  内部一致;并补充 context 变化时回复不进本轮的取舍。

* feat(plugins): 提供方超时或不可用交给 Core 记为 providerUnavailable,工具行区分未响应与不可用 (1lck#1581)

- Core 新增 toolchains.failureReply:查询超过 15 秒没有回复,或后端起不来、断开、没有协商这个提供方时,宿主用它生成标准错误回复(plugin.toolchain.timeout / plugin.toolchain.providerUnavailable),再交给 decodeReply,错误码映射只在 Core 维护一份
- toolchains.resolve 只为问过这个工具的查询记 providerUnavailable,并带上 cause 区分超时和不可用;修复一个提供方失败时把它没被问到的工具也记为缺失的问题
- macOS 接线层把 Core 的 requestTimeout 转成 MacToolchainDiscovery.QueryTimeout;取消不生成回复
- 这类回复照常进入目录轮次,下一层来源继续决定;提供方状态显示“15 秒内未响应”或后端原因
- 运行环境页工具行在结果旁写出“mise 未响应 / mise 不可用”,第 2 步在版本文件存在但提供方没回答时显示同样原因,不再显示“版本未查询”;固定值失效时不显示
- 新增中英词条三条;契约 toolchains.md、rust-core-api.md、Agent Note 与功能矩阵同步更新
- 测试:Rust 覆盖两种原因的回复往返、下一层决定、只记被问到的工具、非法输入拒绝;Swift 覆盖超时与后端停止两种提供方并存时的结果与状态

---------

Co-authored-by: Yao Jingxi <23722032@bjtu.edu.cn>
Co-authored-by: FxRayHughes <25192142+FxRayHughes@users.noreply.github.com>
@1lck
1lck merged commit 50b4ebe into 1lck:preview Nov 1, 2026
21 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.

6 participants