Skip to content

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

Draft
lin-coco wants to merge 6 commits into
1lck:previewfrom
lin-coco:codex/958-workspace-index-exclusions
Draft

lin-coco wants to merge 6 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 忽略或手动排除的目录此前仍会进入搜索库存;本次由共享 Core 统一执行索引排除,并将项目级开关统一到两端“设置 › 版本控制 › Git”。排除目录仍可浏览,文件仍可直接打开编辑。

Closes #958

功能与修复

  • 使用本机 Git 的 check-ignore 与 ls-files 判断目录排除并保护已跟踪内容;支持项目包含例外、手动父目录优先、策略版本失效和关闭后的迟到工作拒绝。不改写 .gitignore、Git 配置或项目构建配置;单个被忽略文件不会升级为目录排除。
  • 库存、文件名/内容/符号搜索、替换候选及 Agent 文件候选遵循同一策略;按需展开目录不会把排除文件回填库存。已排除目录的标记菜单只保留“取消排除”;普通目录保留六种角色,继承手动排除的子目录须从父目录恢复,取消后恢复原角色。
  • 两端开关统一位于 Git 程序/凭据设置之后,删除独立索引与项目环境重复入口。macOS 使用小型 switch,Windows 使用既有 Checkbox;开关绑定当前项目,无项目时禁用,不随 Git 全局/仓库范围或所选子仓库改变;沿用既有存储及默认开启值。
  • macOS 扫描期间修改策略会在发布库存前补扫;跨项目、同路径重开及关闭期间串行处理配置并回收过期安装,拒绝旧错误、快照及可见性刷新结果。Core 分离窗口释放句柄和扫描版本,watcher 刷新后仍可释放旧窗口持有的策略,旧窗口不能释放新策略;发送语言服务配置前先重算 Git 排除。
  • Java 初始化、配置查询、动态通知与重启保留插件原有导入排除,Go/Rust 原生覆盖保留上游配置。排除文件不自动建立工作副本;策略变化关闭已有工作副本并拒绝迟到诊断。修正两处新增 Java exclusion 测试的 Windows 路径期望,统一为实际原生配置使用的 /,保留目录自身、后代及所有配置通道的完整断言。
  • Windows 标记、角色、包含例外及 LSP 门禁均按文件所属的最近工作区根处理;先验证包含关系再计算相对路径,根外文件沿用原有打开流程。增删附加/嵌套根会清理并重新评估已打开的工作副本,迟到查询不能重建已关闭工作区;启动和取消保留原工作区 scope。
  • 多根库存、搜索、索引预热/更新与替换请求新增可选 workspaceRoots,省略时保持单根兼容。父根剪枝另行登记的嵌套根,由该根按自身策略扫描;边界进入缓存身份并用于保存/watcher 直更。移除嵌套根恢复父根扫描,失效的无关根不阻断有效根的限定搜索,缺失后代保留边界。根成员来自本次请求,避免其他窗口或退役策略改变结果;旧根集合的迟到结果不能发布。
  • Windows 所有配置根按生命周期释放;改名、删除及跨根移动迁移角色、排除与包含例外,保留各根 Git 开关;配额不足时逆序回滚,不广播部分结果。
  • 远程/WSL 索引排除尚未接入:两端明确提示不支持,禁用开关,Windows 不向本机 Core 提交远程根,项目树不提供无效排除动作或误导图标,保留已有偏好。设置解析、结构校验及存储失败按稳定分类使用共享中英文文案;损坏数据保持原样。
  • 同步共享契约、fixture、中英词条、搜索定位词、设置分类/索引决策笔记及功能矩阵。新增 LSP 根变更、多根扫描、失效根、远程能力与存储错误回归,接入现有 Windows 前端 CI 分组。

macOS 界面截图

以下五张截图采集于提交 7563ec71 的 macOS 原生验收,使用独立 Exclusion-Demo 项目及测试 Git 身份,覆盖 Git 设置入口、说明提示和目录菜单。Windows 原生界面截图仍待补充。

1. Git 设置入口与统一开关

通过 exclude 搜索定位到“版本控制 → Git”。自动排除位于 Git 程序与凭据区域之后,使用与“使用凭据助手”一致的小型 switch;截图中的 Git 姓名和邮箱均为测试值。

1. Git 设置入口与统一开关

2. 项目作用范围与语言服务限制

ⓘ 提示说明:开关只作用于当前项目,不受 Git 的全局/仓库配置范围影响;取消排除保存项目例外,不修改 Git 忽略规则。提示也保留 Java、Rust、Go 和 Python 等语言服务的实际支持边界。

2. 项目作用范围与语言服务限制

3. 普通目录保留六种标记

ordinary 未被排除,可选择普通、源码、资源、排除、模块和包六种角色。

3. 普通目录保留六种标记

4. Git 自动排除目录仅显示取消排除

示例 .gitignore 包含 ignored/。该目录仍显示在项目树中,标记子菜单只有“取消排除”,不会同时显示源码、资源等其他角色。取消后使用项目包含例外,不改写 .gitignore。

4. Git 自动排除目录仅显示取消排除

5. 子目录继承父目录的手动排除

manual-parent 已手动排除,child 继承排除,菜单也仅显示“取消排除”。需要恢复该子目录时,须先取消父目录排除,子目录的包含例外不能绕过手动父目录。

5. 子目录继承父目录的手动排除

本地验证

  • 已整合 preview 的 f3ee7114,本轮修复提交为 ba421e25。
  • Rust Core:1,371 项单元测试及 32 项集成测试通过;另对相关索引/LSP 22 项执行逐项计时,包含两项 Windows CI 失败断言对应测试。
  • Windows 前端:四个 CI 分组共 136 项在 macOS/Bun 下通过,42 项定向回归及 TypeScript 类型检查通过;已生成 HTML/JUnit 逐项报告。组件测试覆盖最近根、增删根关闭/恢复、过期结果、远程禁用、中英文错误及损坏设置保留。
  • 独立 Swift/C ABI 探针通过,覆盖基础响应、46 个语言 provider、文本编辑/snippet 和内置 LSP 桥接。
  • 测试稳定性、Rust 注释/格式、共享契约、i18n(含 35 项生成测试)、架构边界、程序包运行时只读、Windows 边界、Agent Notes 和功能矩阵门禁通过;CI 分类器及 19 项车道复用测试通过。
  • 既有 macOS 原生验收覆盖菜单、搜索恢复、开关/例外重启持久化及跨项目配置范围;Git 配置和忽略文件未变,开发包 757 文件清单与哈希不变。截图与这部分原生验收的提交为 7563ec71。

Windows CI

当前提交 ba421e25 的 Windows CI #41017649380 全部成功。

任务 结果
Windows 前端 通过
Windows Rust implementation 通过;含共享 Core、MCP stdio 协议和 Windows host
Windows 真实 JDT 通过;真实 Java 25 项目发现、构建与启动流程执行成功
Windows CI gate 通过

已下载并复核 Windows Rust 报告:2,043 项通过、42 项跳过、0 项失败。此前失败的 Java 配置往返断言和另一处路径断言均实际执行通过(49 ms / 27 ms);嵌套根扫描与失效根回归通过。真实 JDT 车道也执行通过这两处断言。Windows 前端日志确认根增删关闭/恢复工作副本、最近根门禁、旧根集合结果拒绝和损坏设置分类回归均通过。以上自动化结果不代替原生界面截图与手动交互验收。

范围与验证限制

  • 本机 Parallels 命令指向已不存在的应用,Windows 本地原生构建、交互及截图尚未完成;macOS/Bun 结果不代表 Windows 原生通过,原生自动化结果以上方当前 head CI 为准。
  • 整应用 Swift 验证因本机缺少 Metal Toolchain 中断;本机 Swift 为 6.4,固定 Swift 6.3.3 / Xcode 26.6 的验证仍待完成。独立桥接探针通过不替代整应用检查。
  • macOS 的 Windows host cargo check 仍遇到 project_window_registry.rs 的 Windows 专有 API 报错(E0433 / E0599),未观察到新增字段或签名错误。
  • 指定目录查找保持此前范围约定;远程实际索引排除未实现。
  • 语言服务拥有自己的后台扫描器:Java 已导入项目、构建系统显式模块仍可能保留;Go/Rust 配置送达不保证零目录访问,Python 项目配置可能覆盖服务设置。功能矩阵保持 partial / pending。

@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 截图。

arkleselect and others added 5 commits October 29, 2026 22:25
feat(macos): 补齐全局编辑器样式与 VS Code/IDEA 语法配色
fix(search): 修复搜索布局并支持文件名优先展示与滚动自动分页
* feat(macos):完善类方法跳转与悬停导航交互

* fix(macos): 稳定慢查询期间的 Command 悬停光标

* fix(editor): present Java files after initial import folding

* fix(editor): delay Command hover hints and cancel pending hints on leave

* fix(editor): show Command navigation feedback before semantic lookup

* fix(editor): exclude non-code tokens from Command navigation

* fix(editor): color Java comment delimiters as comments

* feat(macos): preserve navigation toggle implementation for integration

* fix(macos): unify welcome actions and clone remote panels

* feat(java-support): own optional class and method navigation lifecycle

* fix(navigation): sync plugin opt-out across projects and preserve other providers

* fix(i18n): preserve catalog ordering after preview merge

* test: align Java generator host capabilities and pin Git fixture branch

* fix(remote): resolve daemon startup before attaching concurrent clients

* fix(windows): provide the optional Java requirements snapshot

* feat(editor): 类方法跳转默认开启并新增 Java 关键字跳过查询设置

- 撤销插件级 classMethodNavigation / editorNavigation 开关(设置、策略表、校验和契约 fixture)。F12、Command 点击、悬停提示和 implementation 回退对所有语言默认生效,由宿主统一实现。
- 新增宿主设置“Java 关键字不查询定义”(设置 → 编辑器,默认开启):关键字位置不再发送定义查询,避免语言服务器对 static、switch 等关键字等待约 7 秒。
- Java 库类跳转优先读取本地 -sources.jar(~/.m2、~/.gradle 缓存),找不到时回退到 JDT LS 反编译。
- 删除已废弃的开关截图,新增关键字设置截图。

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

* fix(matrix): 移除已删除的 editor-navigation fixture 证据路径

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

* fix(navigation): 仅对 jar 内库类异步查找 sources jar

非 jar 的虚拟文档保持同步请求语言服务器,避免选择器接受目标后的源码请求被推迟;
合并 preview 并修复 Java 实现选择器相关回归测试。

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

* fix(navigation): 撤回 sources jar 快速路径并保留 this/super 构造器跳转

- 撤回本地 sources jar 快速路径:文本与 JDT 返回的坐标不一定对应,且 jar 文件名无法确认依赖身份,统一回到语言服务器虚拟文档。
- Java 关键字过滤不再包含 this 和 super,它们对应构造器调用,仍会发送定义查询。

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

* test(macos): align rollback symlink assertion with document errors

* test(git): 为子模块测试的 git submodule add 放宽超时

Windows runner 上 git submodule add 克隆子模块超过辅助函数写死的 10 秒,
进程被取消,导致 watch_context_resolves_a_submodule_git_directory_outside_its_workspace
失败。该测试的时间预算已在 test-stability-windows.ps1 中放宽到 30 秒,
这里把命令超时与预算保持一致,其余 git 命令仍使用 10 秒。

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

---------

Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
Co-authored-by: lick <2188718831@qq.com>
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

This branch has not been deployed

No deployments
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