Repository navigation
feat(build): Provider 请求携带 refresh 与宿主解析的构建工具 (#1351) - #1382
Merged
Merged
Conversation
- Core: build.modelPlan / build.dependencyPlan 对 provider 来源接受可选 refresh 与 tool.executable,只在设置时写入 params;tool.executable 必须是绝对路径;command 来源忽略两者,不带参数时计划不变 - macOS: BuildSystemService 区分首次加载与重新加载(BuildLoadReason), Provider 计划先由 MacBuildToolResolver 解析 invocation 的可执行文件再 带上路径,解析失败只在 Build Output 记录并省略 tool - 工具窗口刷新/Reload/Retry、依赖 Reload/Retry、网页 build.refresh 视为 refresh;首次加载模型与首次展开依赖不带 - 同步插件契约 README、rust-core-api、build-plans fixture、Node SDK 类型、Agent Note 与平台功能矩阵
xiaoyumuxi
marked this pull request as ready for review
October 20, 2026 15:53
Lithe Review结论: 未发现需要阻塞合并的问题。 Scope Check
Suggestions
Summary新增字段保持可选,Core 统一校验并生成 Provider 参数,command 来源保持原路径。职责边界、契约和测试覆盖与改动相符;主要验证缺口是真实后端联调与界面证据。 Verification
|
17 of 24 tasks
1lck
added a commit
that referenced
this pull request
Oct 21, 2026
* (MacOS)对齐全局搜索的 IDEA 样式、名称匹配与只读预览 (#1352) * fix(search): 对齐全局搜索并完善只读预览生命周期 * 修复搜索预览所有权和高亮并添加搜索排除设置 按使用方释放预览及待加载请求,避免关闭搜索破坏 Problems 和替换面板。只读预览复用 Monaco 原生无焦点查找;Git 忽略查询传递用户指定可执行文件。 新增搜索专用路径通配符配置,统一全局、侧栏搜索和项目替换,保持树及监听可见。修复 Windows 换行文件名 fixture 和 Swift 顶栏悬浮提示断言范围,并补充共享缓存及真实 WebKit 回归。 * 修复搜索作用域隔离、目录剪枝及缓存淘汰并对齐分支图标 仅全局搜索显式启用生成目录名称;Agent 文件补全始终采用项目可见性,不受搜索排除设置影响。目录规则在扫描入口剪枝,并覆盖直接增量路径。 排除配置变化走搜索专用失效通路,保留不可跳过的失效屏障并限制每根目录的缓存版本数量。补充目录枚举、32 次配置切换和旧索引释放回归。欢迎页分支使用 IDEA New UI 映射的原始 16pt 明暗资源,不修改项目操作。 * 调整全局搜索排除规则入口与交互并对齐项目列表布局 将排除规则移至双 Shift 漏斗面板,独立记忆启用状态,隔离侧栏搜索、项目替换和 Agent 补全。使用独立规则编辑弹窗和主题色应用按钮,统一多行输入焦点边框、原生自动聚焦及空白点击保留选区。 规则行背景包含独立编辑按钮,保留 IDEA 小按钮交互;对齐欢迎页项目图标、标题、路径和分支间距。补充原生深浅主题回归、作用域测试、决策说明和功能矩阵。 * 修复搜索目录枚举容错与预览文档释放 跳过不可访问或已消失的后代目录并保留相对路径诊断,继续传播根目录错误和取消,避免生成目录阻断正常源码及正文搜索。 搜索预览按路径和请求标识释放持有,覆盖切换文件、清空结果与收起预览,保留其他使用方和未保存内容,防止旧请求误清新预览。补充共享加载、连续导航及真实权限回归,同步契约、决策说明和功能矩阵。 * 修复搜索路径回退、按来源索引及辅助功能打开 恢复无斜杠查询的相对路径回退,保持 basename 优先且不绘制错误文件名片段,覆盖 src、Foo、src/Foo 和 Agent 补全。 通过既有分类上限按来源构建索引,Actions 本地匹配,Text 跳过名称索引,Files 与 Agent 仅请求名称,并移除模块激活时的正文预热。补充 2000 个生成文件的冷索引构建和驻留数量回归。 为预览结果添加独立的默认及命名 Open 辅助功能动作,保留鼠标单击预览、双击打开和键盘激活。同步共享 fixture、契约、决策说明和功能矩阵;134 项 Swift、26 项 Rust 回归通过。 * 修复 Unicode 文件名的大小写匹配与 UTF-16 高亮回退 --------- Co-authored-by: Xiaoyumuxi <23722032@bjtu.edu.cn> * feat(windows): Git Log 与项目菜单交互对齐 IDEA 的系列优化 (#1169) * feat(windows): 对齐 IDEA 的 Git Log 新建分支弹窗 - 右键分支“新建分支”改为专用弹窗,标题“从 {引用} 创建分支”,左上角使用应用 logo - 去掉 Checkout / Overwrite 选项,创建后固定检出新分支 - 初始名称沿用 IDEA 规则(远程分支去掉远程前缀),打开即全选 - 输入时清理非法字符(移植 GitRefNameValidator),空格转连字符并保持光标 - 点击创建后才校验空名称、HEAD、与远程分支/本地分支目录冲突、重名,错误显示在输入框下方 - 按钮顺序对齐 IDEA:创建(实心主色)在前,取消(描边)在后 - AppDialog 新增可选 iconNode 以显示自定义标题图标 - 更新 git-branches-remotes 功能矩阵条目 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * feat(windows): 右键菜单定位、删除分支恢复与提示对齐 IDEA - 所有右键菜单对齐 IDEA(Swing JPopupMenu):左上角落在点击点,放不下时 整体平移回窗口内,不再翻到光标上方或左侧;子菜单首行与父行对齐,右侧 放不下时翻到左侧,纵向只平移。覆盖 Base UI 的 ContextMenu 和自绘 Dropdown 的点位菜单,并去掉侧边栏项目点和更新菜单的自定义弹出方向。 - Git Log 删除本地分支不再弹确认框,直接删除;右下角弹出 IDEA 样式的通知 (信息图标、粗体“已删除分支:”加分支名、蓝色“恢复”文字链接、右上角关闭), 点击恢复在被删提交上重建分支且不切换,原上游仍在时恢复跟踪。Core 拒绝删除 (未完全合并、被工作树占用等)时显示 Git 给出的原因。 - 新增 ui/idea-notification 通知卡片,仅用于这类带操作的通知,不改全局 toast。 - 创建分支和 Checkout 成功后不再弹提示,失败时仍显示错误原因。 - 更新平台功能矩阵的验证说明和证据路径,验证状态保持 pending。 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * feat(windows): 失效最近项目可移除,对齐 IDEA 的 Reopen Project - 点击路径已不存在或不再是文件夹的最近项目时,弹出确认框, 可选择“从列表中移除”,取消则保留并标记为缺失;原先只弹 toast, 用户无法清理失效条目 - 标题栏项目菜单的最近项目行新增移除按钮(悬浮显示,选中后按 Delete/Backspace 同样移除),缺失项目头像和文字灰显且按钮常驻; 按钮与菜单项并列放置,点击只移除,不会打开项目或关闭菜单 - 新增 recent-folders.store 测试,覆盖确认移除、取消保留并标记缺失、 路径不是文件夹三种情况 - 更新 workspace-open-switch 功能矩阵的 Windows 证据与验证步骤 * feat(windows): 项目下拉不再置灰当前项目并去掉勾选标记 - 当前项目行去掉 bg-selected 灰底和右侧勾选图标,保留 aria-current - 项目切换期间仅禁用其他行,当前项目行保持可用,点击仍为无操作 * feat(windows): Git Log 文本筛选按 Enter 搜索,新增可持久化的 Branch 筛选 对照 IDEA VcsLogClassicFilterUi / BranchFilterPopupComponent。 - 文本筛选框缩短为固定宽度,输入只改草稿,按 Enter 才搜索;清除立即生效, 输入法组词期间的 Enter 不触发 - 文本筛选右侧新增 Branch 下拉:可搜索,按 Local/各远程分组(不含 Tags), 选中后显示 × 一键回到 All - 所选分支按仓库保存(selectedReferenceByRepository),重新打开项目时恢复; 分支已被删除时回退为 All,并只在加载完成后落盘 - 控制器在同一仓库内因 load 变化重跑时保留当前选择 - 通用 Dropdown 打开时把滚轮应用到自身滚动容器,修复鼠标在菜单中部时 有时滚不动 - 项目下拉:没有最近项目时隐藏 Recent Projects 整块 - 补充测试,更新功能矩阵 git-history 与 Windows Git Graph Agent Note * fix(windows): 修复 Git Log 跨仓库筛选串扰与新建分支前缀冲突校验 审查反馈的两个 P2 修复: - use-git-log-controller 在更新 stateRepoPathRef 前先保存旧仓库路径再比较, 切换仓库时改用新仓库自己的恢复筛选(preferredReference),不再沿用上一 仓库的已选分支去加载并回退 All,外层持久化 effect 也不会在 ready 后把 旧仓库的选择写到新仓库的存储键上;同仓库内 load 身份变化(如语言切换) 仍保留用户当前选择 - validateNewBranchName 补齐反方向的 ref 命名空间冲突:候选名的任一 "/" 前缀已是本地完整分支时(如已有 feature 分支时输入 feature/a)在输入框 下方直接报错,不再等 Git 创建失败才暴露;新增 clashesWithBranchPrefix 错误码与中英文案 - 回归测试覆盖 A→B、A→B→A、B 无持久化筛选、恢复的分支已删除回退 All、 同仓库语言变更保留选择,以及分支名目录/前缀两个方向的冲突;两组测试 均已在修复前代码上验证会失败 * fix(windows): 修复评审提出的四项 P2:测试真实定时器、分组菜单键盘高亮、误删翻译键与 CI 注册 - git-commit-table.toolbar 测试用可控 requestAnimationFrame 队列替换 50ms 真实 setTimeout,显式 flush 帧推进滚轮绑定,通过 typescript-real-timer 稳定性门禁 - Dropdown 把键盘全局索引换算为各分组的局部行号传给 MenuItemsList(translateKeyboardFocus, 跳过禁用行),Branch 分组菜单方向键/End/Home 现在有高亮、会滚动到目标,Enter 激活的 行与高亮行一致;平铺 items 路径沿用同一换算消除禁用行错位。dropdown.test 新增跨组 导航、禁用行跳过、scrollIntoView 与 Enter 激活的回归用例 - 恢复中英文 git.log.branchCreated 翻译键,文件树 New Branch 成功提示不再显示原始键名 - 六个新增测试文件接入 Windows CI:toolbar/创建分支弹窗/分支名/分支分组进入 $graphTests 随机分组,recent-folders 并入 file-system lane(原 file-watcher 报告更名), dropdown 与 idea-notification 新增 ui-controls lane - 附带修复 git-log-branch-actions 测试泄漏:GitLogToolWindow ready 后写入的 selectedReferenceByRepository 未恢复,随机顺序下污染 git-log-preferences.store 测试(seed=1 可复现,即 CI gate 此前失败的原因);afterEach 现按快照恢复该 store 验证:graph 分组 20 文件 seed 1/3/7 全过(122×3);受影响 10 文件 51 pass; tsc --noEmit;verify-test-stability(全量与 CI base/head 两种模式); test-stability-windows.ps1 -Scope Frontend(最慢 49ms); verify-platform-feature-matrix-change.sh 与 verify-platform-feature-matrix.sh(156 capabilities)。 * fix(windows): 恢复分支时提示上游跟踪失败的部分成功状态 删除本地分支后的“恢复”先重建分支,再恢复上游跟踪。此前第二步的 失败被静默吞掉,用户只会看到“已恢复分支”,无法知道跟踪配置没有 恢复,后续 Pull/Push 可能要求重新配置上游。 - 重建失败仍显示恢复失败;重建成功但 setBranchUpstream 失败时改为 橙色警告,明确“分支已恢复,但上游跟踪恢复失败”,并附带 Git 原因 - 两种部分成功都不再误报为整体失败,仍刷新历史 - 新增中英文文案与回归用例:覆盖删除、点击恢复、跟踪写入失败, 断言不显示成功/失败 toast,且历史刷新只发生一次 - 清理 rebase 合并时 Git Log 图谱 Agent Note 残留的冲突标记 --------- Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> * fix(plugins): 插件市场显示索引中的远程 SVG/PNG 图标 (#1378) * fix(plugins): show remote SVG/PNG icons from the marketplace index SwiftUI AsyncImage cannot decode SVG, so every index icon fell back to the default plug glyph. Download index icons through the marketplace transport, validate them with the same static-SVG/PNG gate used for package icons, and cache the result per URL in the feature model. * fix(plugins): retry and invalidate marketplace icons, add initials fallback - Move index icon state into PluginMarketplaceIconStore. Views read bytes for the entry they currently show, so a late request for a plugin the user has left can no longer paint its icon next to another plugin. - Share concurrent requests per URL; remember only rejections that retrying cannot fix (PluginMarketplaceIconRejected: bad URL, 4xx except 408/429, oversized, invalid format). Network errors, timeouts and 5xx are retried. - Refreshing sources invalidates icons, since Core allows branch refs: shown icons stay until new bytes arrive and pre-refresh results are dropped. - Compare the icon host case-insensitively, like Core. - Cache decoded NSImages in the view layer so rows do not re-decode SVG. - Plugins without a usable icon show an IDEA-style initials avatar reusing ProjectAvatarBadge: two Latin letters or one CJK character, colored by plugin ID. Installed plugins missing from every index use their manifest name. - Update the Agent Note and feature matrix; correct the "pins a commit" and "nothing written to disk" claims. * feat(plugins): 官方 Java 插件后端 SDK(#1351) (#1379) * feat(plugins): 官方 Java 插件后端 SDK(#1351) - sdk/java:零依赖、Java 8 起可用的插件后端 SDK,与 Node SDK 同一套契约、规则和错误语义 (分帧、litheBuild/litheFunctions 协商、取消、进程清理、状态存储) - sdk/java/examples/sample-build:Java 示例插件,与 Node 示例跑同一套 Core 端到端场景 - Core:运行时启动计划的版本探测复用构建运行时参数(java 用 -version),修复 Java 8 后端被判为不可用 - CI:Rust Core lane 跑 Java SDK 测试与端到端(Java 8 运行时、JDK 21 编译) - 新增 sdk-java-v* 标签发布工作流,产出 JAR 与 .sha256 * fix(plugins): Java SDK 按调用用进程组清理工具,隔离取消监听器异常 - macOS/Linux 上每个工具经系统 perl setpgrp+exec 成为进程组组长,Java 8/9+ 行为一致: 取消时整组 TERM→KILL,工具正常退出后立即结束组内遗留的后台进程,不影响并发调用。 - PERL5OPT 不传给 perl、在 exec 前还给工具;启动失败仍抛 IOException。 - Windows 或无 perl 时退回 ProcessHandle,工具退出后也清理仍可达的子孙。 - Cancellation 逐个隔离监听器异常;调用收尾放在 finally,保证请求一定回复。 - 新增回归测试,并更新 README 与 Agent Note 的进程边界说明。 * feat(build): Provider 请求携带 refresh 与宿主解析的构建工具 (#1351) (#1382) - Core: build.modelPlan / build.dependencyPlan 对 provider 来源接受可选 refresh 与 tool.executable,只在设置时写入 params;tool.executable 必须是绝对路径;command 来源忽略两者,不带参数时计划不变 - macOS: BuildSystemService 区分首次加载与重新加载(BuildLoadReason), Provider 计划先由 MacBuildToolResolver 解析 invocation 的可执行文件再 带上路径,解析失败只在 Build Output 记录并省略 tool - 工具窗口刷新/Reload/Retry、依赖 Reload/Retry、网页 build.refresh 视为 refresh;首次加载模型与首次展开依赖不带 - 同步插件契约 README、rust-core-api、build-plans fixture、Node SDK 类型、Agent Note 与平台功能矩阵 * fix(ci): allow Java SDK release in canonical repository (#1384) * fix(macos): 启动时被打断的模块激活不再弹出取消通知 (#1386) * fix(macos): 启动时被打断的模块激活不再弹出取消通知 启动期间模块图会重建,正在进行的激活因此被取消,抛出 CancellationError。 各模块协调器和 Agent 会话激活把它当作失败弹成通知。新增 Error.isCancellation 统一判断,取消不再提示,真正的错误照常提示;同步更新 workbench-notifications 能力记录。 * fix(macos): 语言服务器与运行扩展激活被取消时不再报失败 review 发现启动路径还有遗漏:文档打开触发的 LSP 激活被模块图重建打断时, markActivationFailed 会弹出“Could not start … language server”通知,并把取消 记成启动失败、触发后续重试。现在 markActivationFailed 直接忽略取消。 同样过滤语言运行扩展激活和向 Agent 会话附加文件时的取消。 * fix(macos): 不再需要的语言服务器激活失败不再提示 语言服务器激活失败只在它仍处于被要求激活的状态时提示:工作区里已关闭该 语言服务器、工作区已切换,或触发激活的文档已关闭时,过期的失败既不弹通知, 也不记为需要重试的启动失败。与激活成功路径已有的检查保持一致。 * perf(macos): 优化项目树展开并对齐 IDEA 交互与图标 (#1375) * perf(macos): streamline project tree expansion and IDEA presentation * fix(macos): preserve readable tree rows when chain probes are omitted * feat(windows): 终端支持扩展键盘序列,Shift+Enter 可在 TUI 中换行 (#1362) * fix(windows): 按发行版实际 automount root 转换 WSL 路径 [P2] WSL 盘符转换固定假设 /mnt — 已修。此前判断「需要 spawn wsl.exe 且本机无发行版可验证」是错的:`wsl.conf` 位于发行版内,Windows 可以 通过 UNC 共享直接读取,不需要启动外壳或子进程。 后端(host.rs): - `parse_wsl_automount_root` 解析 wsl.conf 的 `[automount] root` (INI 格式,支持引号、大小写、注释、`root = /` 的根挂载); - `wsl_automount_root` 命令按 `\wsl.localhost\<distro>` 与 `\wsl$\<distro>` 依次尝试读取;发行版名先做校验,拒绝包含分隔符、 冒号、`..` 或控制字符的输入,避免拼进 UNC 路径时逃逸共享; - 任何读取或解析失败都回退到文档默认值 `/mnt`,不阻塞粘贴。 前端: - `windowsPathToWslPath` / `pathToWslPath` 增加 automountRoot 参数, 空字符串表示盘符直接挂在 `/` 下(`C:\x` → `/c/x`); - 新增 `resolveWslAutomountRoot`,按发行版缓存(wsl.conf 只在编辑并重启 WSL 后变化),失败不缓存; - 终端四个入口(粘贴、显式粘贴、应用内拖放、外部拖放)先解析挂载根, 再格式化路径。 验证:Rust 5 个解析用例(默认值、读取、根挂载、引号大小写注释、 跨 section 不误取)全通过;前端 77 个单元测试通过,新增 「使用发行版上报的挂载根」「容忍尾部斜杠」「缺省回退默认」三个用例; 两套 CI 门禁本地实跑 40 项与 77 项全通过;tsc --noEmit、lint 0/0、 verify-test-stability、verify-windows-boundaries 通过。 说明:本机 `wsl.exe` 存在但未安装任何发行版,UNC 读取路径只验证了 「不存在时回退默认」,真实发行版下的读取待实机确认。 * feat(windows): 终端随应用分发 console host,恢复扩展键盘序列 Windows 10 的系统 conhost 不转发 kitty 与 modifyOtherKeys 键盘协议,因此 Shift+Enter 发出 CSI 13;2u 后被丢弃,kimi 一类 TUI 无法换行。Lithe 的发送侧 一直是对的,断点在 console host。 改为随应用分发 Windows Terminal 发布的 ConPTY 组件: - third_party/conpty/manifest.json 固定 NuGet 包 Microsoft.Windows.Console.ConPTY 1.25.2609.30003 的版本、下载地址与 x64/arm64 的 conpty.dll、OpenConsole.exe 校验值,MIT 许可与 LICENSE 一并保留; - scripts/prepare-conpty.ps1 下载并校验包,再按架构解出两个文件到 .artifacts/conpty/,写入 .lithe-conpty.json 身份戳;-BestEffort 供 dev 链路在 离线时降级为警告; - build.rs 把这两个文件复制到可执行文件同目录,portable-pty 以裸文件名加载 conpty.dll 时优先命中该目录;LITHE_REQUIRE_CONPTY=1 让打包构建在缺失时失败; - tauri.conf.json 的 bundle resources 把两者放进安装目录根,并让 dev 的 beforeDevCommand 先准备它们; - build-windows.ps1 / package-windows.ps1 按 RustTarget 选择平台并在打包前准备; - 复用清单注册 conpty 下载缓存,verify-download-cache.mjs 增加对应校验, 只接受 manifest 指定版本的那一个归档。 实测(x86_64-pc-windows-msvc):用 ConPTY 起一个请求 kitty 协议的子进程, 系统 conhost 下只收到 DA1 应答、收不到 CSI 13;2u;换成本组件的 conpty.dll 与 OpenConsole.exe 后完整收到 1b 5b 31 33 3b 32 75。dev 启动已确认先执行准备脚本 并把文件放进宿主 target 目录。 打包体积增加 1,208,984 字节(conpty.dll 119,608 + OpenConsole.exe 1,089,376)。 影响范围不止 Shift+Enter:所有终端会话的 console host 都由系统件换成本组件, 启动序列、光标处理、resize 与长输入路径都随之改变,需按新增功能矩阵行的验证 步骤做完整回归。真实产品交互验收仍为 pending。 * fix(windows): 回应程序的键盘协议协商,只在协商后发送扩展按键 上一提交让 console host 能转发 CSI 13;2u,但程序要先收到能力协商的答复 才会启用增强按键。xterm.js 把 CSI ? u 的 u 当作「恢复光标」的终结字节, 从不答复,因此 kimi 仍走旧键路径。 - 新增 terminal-keyboard-protocol:在原始输出里识别 CSI ?、>、<、= 与 u 组成的 kitty 协商序列,按栈维护当前 flags 并答复 CSI ? <flags> u。 只上报 Lithe 真能兑现的 disambiguate 位,程序 push 更高位时不虚报, 避免它期待永远不会出现的按键。 - use-terminal-connection 在把输出交给 xterm 之前喂给该解析器,答复通过 同一条 PTY 写入通道发回程序;会话重置时清空状态。 同时修掉一处被暴露出来的旧缺陷:terminal-keyboard 无条件发送 CSI 13;<modifier>u,对没有协商的程序(PowerShell、cmd 提示符)等于把 ESC 之后的残留字节当文本打出来,命令行出现 [13;2u。改为仅在 extendedKeyboardActive 时才使用该编码,否则交给终端自身的回车编码。 验证: - 23 个键盘相关单元测试通过,含「协商后发 CSI u」「未协商回落到 passthrough」「kimi 的 push 后 query 得到 CSI ? 1 u」「查询跨 read 拆分」 与「不虚报超出能力的 flags」。 - 完整前端套件基线/修复后两轮对比,失败集合完全一致(各 317),新增 0。 - tsc --noEmit、lint 0/0、verify-test-stability、功能矩阵(174 项)通过。 - 已实测:kimi 内 Shift+Enter 可换行;未协商的 PowerShell 不再打印残留字节。 * fix(windows): dev 启动在 ConPTY 准备失败时降级,并补缓存校验测试 回应 review 的两条建议。 [P2] beforeDevCommand 未启用回退:脚本提供了 -BestEffort,但开发启动没传, 干净且离线的工作树会因下载失败而无法启动。补上开关;打包流程仍保持 LITHE_REQUIRE_CONPTY=1,缺少资源时继续失败。 [P2] ConPTY 缓存校验缺测试:在 test-verify-download-cache.mjs 增加三段 断言——只保留清单指定的包并清掉旧版本、哈希不匹配时删除、以及 reuse-worktree-resources 的 conpty 路由与注册表条目存在。该块放在既有 Bun 用例之前,因为它不依赖 Bun。 校验器行为已用等价脚本独立验证三种情形:保留正确包并拒绝旧版本、 清除哈希不匹配的包、恢复后重新接受。 注:test-verify-download-cache.mjs 在本机整体仍失败,原因是既有的 Bun 用例用 `#!/bin/sh` 垫片模拟 bun,Windows 上不生效,与本次改动无关。 * fix(windows): 修正 ConPTY 资源声明时机与键盘协议/挂载根边界 回应 review 的四条 Finding,均为本次引入。 [P1] 默认资源声明使缺少 ConPTY 的干净构建直接失败 build.rs 先执行 tauri_build::build(),Tauri 处理 resources 里的固定路径时 文件缺失即 panic,早于后面的可选 staging 检查;Windows Rust CI 也没有调用 准备脚本。把这两个文件从 tauri.conf.json 的默认 resources 移到 tauri.jdtls.conf.json(打包专用,与 JDTLS/JDK 同一机制),默认开发与 Cargo 构建不再依赖它们。 [P2] 分片恰好停在 CSI 后时序列丢失 parseKittySequence 在 start >= buffer.length 时读到 undefined,被当作无关 序列丢弃。改为返回 incomplete 让调用方等待后续字节,并补「chunk 停在 ESC [」「push 跨分片」两条回归测试。 [P2] 宣告 disambiguation 位却只编码 Enter legacy 终端里 Tab 与 Ctrl+I 同为 0x09、Enter 与 Ctrl+M 同为 0x0D、 Escape 与 Ctrl+[ 同为 0x1B,程序无法区分。既然答复里宣告了该位,这些 别名组合也改为 codepoint 形式(CSI 105;5u / 109;5u / 91;5u);无修饰的 Tab/Enter/Escape 保持原有字节,shell 行为不变。补三条测试覆盖编码与 未协商时不编码。 [P2] 非 WSL shell 也触发挂载根查询 resolveAutomountRootForShell 对每个 shell id 都切掉固定四个字符, "powershell" 变成发行版名 "rshell" 并触发 UNC 读取,普通粘贴也要等它。 改为先判断 wsl: 前缀(大小写不敏感),其它 shell 直接返回默认值。 wsl_automount_root 同时改为 async + spawn_blocking,把 UNC 读取移出 异步运行时工作线程,避免界面等待无响应分布式的文件访问。 新增 wsl-automount-root.test.ts 覆盖七种非 WSL shell、空值、裸 wsl 前缀 与大小写。 验证:88 个相关单元测试通过;完整前端套件基线/修复后两轮对比,失败集合 完全一致(各 340),新增 0;tsc --noEmit、lint 0/0、cargo check、 verify-test-stability、verify-windows-boundaries、功能矩阵(178 项)通过。 * fix(windows): 按屏幕隔离键盘协议状态,兑现 Escape 编码并给挂载根查询加上界 上一轮评审的四条 P2 建议,逐条处理: 1. 协商消歧位后仍需编码 Escape。裸 0x1B 与所有 CSI/OSC 序列的前缀同形,正是 该位要消除的歧义,因此协商后 Escape 走 CSI 27 u(带修饰时 CSI 27;<mod>u)。 无修饰的 Tab 与 Enter 仍保持原字节:shell 依赖它们。 2. 键盘协议状态按屏幕缓冲区分开。程序在备用屏启用协议、退出后回到主屏,主屏 并未协商过,共享一份 flags 会让主屏对 CSI ? u 回一个它用不了的模式。现在 47/1047/1049 进屏时清空备用屏状态(程序崩溃未 pop 也不会泄漏给下一个程序), 离屏后回到主屏自己的状态。解析器同时识别这些屏幕切换模式。 3. 挂载根查询加有界回退。新增 automountRootNeededForPaths:只有 Windows 盘符 路径才需要挂载根,Linux 形式、协议路径和相对名直接跳过宿主查询,普通文本 粘贴不再等 UNC 读取。真正的查询有 2s 上界,超时按默认值继续;同一发行版的 并发查询只发一次,超时不缓存以便下次拿到真值。 4. ConPTY 许可随二进制分发。prepare-conpty.ps1 把 third_party/conpty/LICENSE.txt 复制为 ConPTY-LICENSE.txt,build.rs 与打包资源一并 stage,package-windows.ps1 在缺该文件时直接失败,不再出现只发 DLL/EXE 不带 MIT 声明的情况。 顺带把功能矩阵里指向 tauri.conf.json 的证据更正为 tauri.jdtls.conf.json 与 prepare-conpty.ps1,资源声明已在前一次提交移出默认配置。 验证: - 相关单测 90 个通过(键盘 14、协议 20、WSL 挂载根 14、文件拖放 42); - 完整前端套件基线/改动后各 361 失败,失败集合一致,新增 0;测试数 2684→2701, 增量为本次新增用例; - tsc --noEmit 干净;lint 0 error,改动文件无 warning; - cargo check 通过;移走 .artifacts/conpty 后仍通过且只给预期警告,降级路径未回退; - prepare-conpty.ps1 实跑,ConPTY-LICENSE.txt 已落到 .artifacts/conpty 与 exe 同目录; - verify-windows-boundaries、功能矩阵(178 项)、verify-test-stability 通过。 * fix(windows): 分离挂载根读取生命周期,给流式解析加上界并处理终端复位 上一轮评审的三条 P2,逐条处理: 1. 挂载根读取的生命周期与调用方超时分开。之前 `race` 的 `finally` 会删掉进行中 记录、缓存写入又落在已失败的 race 之后,结果超时后就丢失复用关系:迟到答 案进不了缓存,下一次粘贴重新发起 UNC 读取。若每次读取都超过 2s,自定义挂 载根会持续回退 `/mnt`,插入的路径指不到东西。 现在 `readAutomountRoot` 记录按自身生命周期管理:只有宿主真正结束后才移除, 成功即写入缓存(即使所有调用方都已放弃等待);等待上界只作用于调用方。 补「迟到成功仍进缓存且不重复读取」「超时后可复用仍在进行的读取」「失败不缓存」。 2. 未终结序列的缓冲与解析成本加上界。之前 `pending` 无上限,且每个分片都从头 重扫,长串数字会持续放大内存并造成累计二次方扫描,位置还在终端输出回调里。 新增 MAX_PENDING_SEQUENCE(32 字节,远大于最长被跟踪序列)、参数位数上限 (4)与参数个数上限(4);超限即丢弃并恢复扫描,不影响后续真实交换。 3. 收到 RIS(`ESC c`)时清除协议状态。xterm 会在 RIS 清掉自己所有模式,解析器 却不跟着清,导致终端复位后按键仍被编码成扩展序列。`feed` 现在逐字节扫描 ESC, 识别 `ESC c` 后清空两屏 flags、栈与屏幕标记;ESC 与 `c` 分处两个分片也成立。 顺带把「末尾单个 ESC 需保留」的判断改为基于扫描位置,避免 reset 与 CSI 混在一 个分片时漏看。 验证: - 协议单测 28 个通过(含 8 个新用例:缓冲区上限、参数上限、RIS 各形态); - WSL 挂载根 16 个通过(含迟到成功、超时复用、失败不缓存); - 穷举校验:`CSI ? 1049 h` + push + query 与 RIS 场景在**每个分片位置**结果一致; - 完整前端套件基线/改动后各 361 失败,失败集合一致,新增 0;测试数 2701→2711; - tsc --noEmit 干净;lint 0 error,改动文件无 warning; - verify-windows-boundaries、功能矩阵(178 项)、verify-test-stability 通过。 * fix(windows): 让 WSL 挂载根查询通过终端能力,而不是被关闭的 wsl 能力 评审指出的这条是真的功能缺陷,不只是测试写法问题: `capabilityForCommand` 把 `wsl_` 前缀一律归到 `wsl` 能力,而 `backend-capabilities.ts` 里 `wsl: false`,于是 `wsl_automount_root` 在发出 IPC 之前就被拒(`待开发: wsl (...)`),解析器永远走 catch 回退 `/mnt`。配置了 `[automount] root = /` 的发行版,插入 `C:\work\a.txt` 得到 `/mnt/c/work/a.txt`,这个路径在发行版里不存在。 问题定位:把路径放进 WSL 提示符属于终端行为,不是 WSL 管理能力。 读 `/etc/wsl.conf` 只决定 Windows 盘符挂在哪里,执行插入的是终端后端, 所以这条命令归 `terminal`(Windows 上为 true)。其余未实现的 `wsl_` 命令继续保持 `wsl` 能力限制,不受影响。 测试也一并纠正:解析器测试之前 mock 了整个 `@/platform/tauri-core` wrapper,恰好绕过了出问题的那一层,所以 16 个用例全绿却掩盖了缺陷。 Bun 的模块注册表在测试文件间共享,改 mock 底层 `@tauri-apps/api/core` 又会依赖文件加载顺序(实测会让 10 个用例随机失败),因此: - 解析器测试保留 wrapper mock,专注缓存/超时/路径判定; - 能力路由断言放进 `tauri-core.test.ts`(该文件自己注册原生 mock), 直接断言 `wsl_automount_root` 能到宿主、`wsl_list_distributions` 仍被 `wsl` 能力拒绝。 已验证修复有效性:撤掉 `tauri-core.ts` 改动后,这两个新断言失败; 恢复后通过。 验证: - `tauri-core.test.ts` + 解析器测试 30 个通过,两个文件同跑仍稳定; - 完整前端套件失败集合与基线**逐条比对完全一致**(340 = 340),新增 0; - tsc --noEmit 干净;lint 0 error,改动文件无新增 warning; - verify-windows-boundaries、功能矩阵(178 项)、verify-test-stability 通过。 * fix(windows): 协商后按协议编码 Alt+Backspace,并让宿主区分读取失败与默认值 上一轮评审的两条 P2: 1. Alt+Backspace 在协商后仍被编码成 Ctrl+W。disambiguation 位宣告后, 旧映射把 Alt+Backspace 发成 0x17 —— 与 Ctrl+W 完全相同的字节,TUI 无法 区分,绑在两者上的操作会被错误触发。现在协商后按协议发 `CSI 127;3u`。 无修饰 Backspace 保持 0x7f(shell 与 readline 的逐字符删除依赖它), Ctrl+W 也保持原控制字节;未协商时 Alt+Backspace 仍走旧映射。 顺带把 codepoint 编码抽成 `encodeCodepoint`,与 Escape 共用同一套修饰位 计算,避免两处各写一遍。 2. 宿主把「读取失败」伪装成「默认值」。`wsl_automount_root` 之前在两条 UNC 都读不到时返回 `"/mnt"`,前端无从分辨,于是把错误值缓存整个前端生命周期: 即使读取恢复,配置自定义 root 的发行版仍持续插入错误路径。 改为返回 `Option<String>`:`None` 表示没有任何 wsl.conf 被读到, `Some` 表示读到并解析完毕(`Some("")` 就是 `root = /`)。 前端只在拿到字符串时写缓存,`null` 视为「没学到东西」,下次仍会重查。 验证: - 键盘 19 个通过(新增 3 条:协商后 Alt+Backspace 编码、plain Backspace 与 Ctrl+W 不受影响、未协商时保持旧映射); - WSL 解析器 18 个通过(新增 2 条:`null` 不缓存且恢复后重查、`""` 作为 `root = /` 的正常答案会被缓存); - Rust 宿主 6 个通过,含新增的分发名逃逸拒绝用例; - 完整前端套件失败集合与基线**逐条比对完全一致**(340 = 340),新增 0; - tsc --noEmit 干净;lint 0 error,warning 数与改动前一致(65); - verify-windows-boundaries、功能矩阵(178 项)、verify-test-stability 通过。 * docs(windows): 记录终端键盘能力在 Windows 上的实测进展 在 dev 实例上复核了 Shift+Enter 的基础行为,把已确认和未确认的边界分开写清楚: 已确认 —— lithe-windows 的模块列表里 conpty.dll 来自构建输出目录(build.rs staging 的那份,非系统 conhost);同目录的 OpenConsole.exe 以 --headless 运行并 挂着 powershell.exe;在该 PowerShell 会话中按 Shift+Enter 行为正常,命令行不再 出现 [13;2u 字面量。 仍未确认 —— cmd / Git Bash / WSL 三种 shell、Tab 补全与 Ctrl+C、resize、超长 命令粘贴(7000 字符回退路径)、Vim/less 全屏 TUI、删除两个文件后的降级路径。 因此 verificationStatus 保持 pending:该状态要求按整行验证方式完成运行时验证, 只覆盖其中一项就标 verified 会与 metadata.json 的定义冲突。矩阵校验通过(178 项)。 --------- Co-authored-by: Lichenkang <2188718831@qq.com> * fix(agent): 修复多项目入口、历史活动时间与加载延迟 (#1355) * fix(macos): route tool window clicks to the active project * fix(agent): use conversation activity time for Codex history * fix(agent): stream history pages and reuse recent session lists * fix(agent): invalidate active history after completed turns --------- Co-authored-by: Lichenkang <2188718831@qq.com> * fix(windows): align MCP open window owner field (#1388) (#1392) * fix(settings): clarify project-local toolchain scope (#817) (#1393) * fix(windows): unify folder terminal entry and retain hidden fullscreen sessions (#1394) * fix(windows): open folder terminals in the shared bottom panel (#793) * fix(windows): retain fullscreen terminal listeners while hidden * fix(macos): make background service exit selection readable and bounded (#1344) (#1398) * feat(macos): 在行号右键菜单中开启和隐藏 Git Blame (#1397) * feat(macos): add Git Blame actions to line-number context menu (#451) * fix(macos): coordinate Blame and breakpoint context menus (#1397) * fix(macos): route Control-click through the line-number menu * feat(windows): 文件树、编辑器与提交视图的 IDEA 细节对齐 (#1390) * fix(editor): 关闭中文全角标点的易混淆字符高亮提示 Monaco 默认开启 unicodeHighlight.ambiguousCharacters,中文行内的全角括号 等标点会被标记为易混淆字符并提示 "could be confused with the ASCII character";该提示中的 Adjust settings 链接在嵌入 Monaco 的场景下没有 可跳转的设置页。全角标点在中文文案中是正常输入而非误敲,关闭该默认高亮。 同步新增 editor-unicode-confusable-highlight 功能矩阵条目(双端 implemented / 待验证),不可见字符检测等其他 Unicode 高亮行为保持不变。 * feat(windows): 移除文件树自动跟随编辑器页签跳转 编辑器切换文件页签时,项目树不再自动展开并滚动定位到当前文件。原行为由 默认开启的 autoRevealActiveFileInFileTree 设置控制,本次彻底移除: - useFileExplorerSync 删除 autoRevealActiveFile 入参与自动定位副作用, 仅保留卸载时使在途定位请求失效的守卫 - 移除设置项 autoRevealActiveFileInFileTree(类型、默认值、设置页行、 树面板下拉开关)并加入 RETIRED_SETTINGS_KEYS,旧安装的持久化值会被清理 - 移除 settings.files.autoReveal 中英文案 - 工具栏"定位当前文件"手动按钮与选择高亮同步保持不变 - reveal 测试改为纯手动定位用例并新增"切换活动文件不得滚动树"回归, 删除自动跟随测试;migrations 增加退役键用例 - 同步更新 2026-10-05 项目树 Agent Note 与 file-explorer 功能矩阵条目 * fix(windows): Windows 编辑器关闭易混淆字符高亮提示 4adb73a6f 只改了共享 frontend/editor 的 workbench(macOS WebKit 入口), Windows 产品使用独立的 monaco-editor.tsx 创建编辑器,提示仍然存在。 本次在两处 create 选项中加入 unicodeHighlight.ambiguousCharacters: false, 并更新 editor-unicode-confusable-highlight 矩阵条目的 Windows 证据路径。 * feat(windows): 编辑器滚动条对齐文件树的细圆头样式 Monaco 编辑器滚动条原为默认 14px 方角滑块,与文件树等应用内滚动条 (约 5px 可见圆头滑块、11px 轨道)视觉不一致: - EDITOR_CONSTANTS 新增 SCROLLBAR_TRACK_SIZE(11),两处编辑器 create 的 scrollbar 选项设置 vertical/horizontalScrollbarSize - monaco-editor.css 用透明边框 + background-clip: content-box 把滑块 收细为约 5px 并加 --app-scrollbar-radius 圆头,与 scrollbars.css 的 应用级滚动条同款;颜色沿用主题已映射的 --app-scrollbar-thumb 系列 - 覆盖主编辑器、Notebook 代码单元与提交差异预览(共用 .monaco-editor-shell) - 新增 editor-scrollbar-style 功能矩阵条目(Windows implemented, macOS 为共享滚动条体系 platform-specific) * feat(windows): 提交文件树排序对齐 intellij-community 提交面板与 Git Log 提交详情的文件树原先用 localeCompare 按字典序排序 (如 file10 排在 file2 前、大小写顺序随系统区域设置变化),与 IDEA 提交对话框的规则不一致。按 intellij-community 的 TreeModelBuilder 对齐: - 新增 natural-file-name-compare.ts,忠实移植 FileNameComparator (= NaturalComparator ignoreCase + likeFileNames 语义):数字按数值 自然排序、忽略大小写、忽略大小写相等时再按大小写敏感复比决断、 '-' 与 '_' 等价(IDEA-80435)、含格鲁吉亚字母大小写折叠与 空格/'#' 区间的传递性修正 - 目录节点先于文件节点(对应 IDEA 排序权重 5 < 6/7,原行为一致) - buildPathTree 新增可选 compareNames 参数,默认保持 localeCompare; git-status-model(提交面板)与 git-commit-file-tree(提交详情, 含首项预览的 firstLeaf 顺序)传入对齐比较器 - 项目树、文件导航等其他 buildPathTree 消费方排序不变 - 新增 7 个比较器/集成测试;同步更新 git-local-changelists 矩阵 条目与 2026-10-16 提交面板同步边界 Agent Note * fix(windows): 提交详情 diff 正文与中央分隔线保留 1px 间距 Git Log 提交详情的双栏独立 Monaco diff 中,两侧编辑器 lineNumbers/ glyphMargin 关闭且 lineDecorationsWidth 为 0,正文首列从编辑器 x=0 开始,直接贴着中央列 tearline 竖线(::before/::after 1px 边线)。 - independent-commit-diff-surface 的编辑器 lineDecorationsWidth 由 0 改为 1,文字与边线保留 1px 间距;两侧同值,水平滚动同步与连接带 几何不变,编辑器盒模型仍与中央区域共享整数布局边界 - 同步更新 2026-10-04 提交差异预览 Note(原记录"代码边界紧邻中央 区域")与 git-history 功能矩阵条目 - independent-commit-diff-surface.test.ts 18 项、typecheck 通过 * fix(editor): 补齐易混淆字符高亮关闭面并统一滚动条几何 代码审核发现的两个一致性问题: - unicodeHighlight.ambiguousCharacters 此前只在 monaco-editor.tsx 两处 create 与共享 workbench.ts 关闭,Notebook 代码单元、Git Log 提交详情 双栏 diff 与共享 diff-review(Windows 统一 diff 视图与 macOS diff 预览)仍会对中文全角标点弹出 "could be confused with the ASCII character" 提示;本次在剩余三个编辑器创建点补齐关闭,矩阵条目的 证据与验证范围同步覆盖 Notebook 与提交差异视图 - 细圆头滚动条样式只在 monaco-editor.tsx 设置 11px 轨道,但 CSS 作用于 .monaco-editor-shell 下全部 Monaco 滑块:Notebook 单元横向轨道仍为 默认 14px(可见滑块 8px),提交差异预览的高特异度规则还覆盖了其自有 1px 边框滑块设计,拆分视图滑块被压至约 2px。本次给 Notebook 补 SCROLLBAR_TRACK_SIZE 轨道尺寸,CSS 作用域排除 .commit-file-diff-preview, 差异预览恢复自有滑块与变更标记轨道设计,矩阵验证文本同步修正 - independent-commit-diff-surface.test 新增双栏关闭易混淆高亮的回归断言 * docs(matrix): 编辑器滚动条与易混淆高亮 Windows 侧实机验证通过 真实 WebView2 深浅主题下核对:主编辑器与 Notebook 代码单元滚动条 5px 圆头滑块、11px 轨道且与文件树一致;含全角标点的文档悬停不再 出现易混淆字符提示(编辑器/Notebook/提交差异视图)。两个条目的 Windows verificationStatus 升级为 verified,macOS 侧保持 pending。 file-explorer、git-history、git-local-changelists 的 pending 覆盖 长期积累的完整验证流程,不随本次局部验证整体翻转。 * fix(macos): 终端画布按预乘语义清屏,修复亮色白边 (#1359) Metal 合成缓冲要求清屏色为预乘值。终端画布把编辑器底色以 alpha 0 交给 SwiftTerm,清屏后得到「有效 RGB + 零 alpha」,文字混合后画布 alpha 等于覆盖度,合成器再叠加一次底层颜色,亮色背景上字缘过曝成白框、正文发浅。 - 无壁纸:画布改为不透明编辑器底色,view 与 Metal renderer 的 `isOpaque` 同步为 true - 有壁纸:清屏色改为预乘合法的透明 `(0,0,0,0)`,保留壁纸透出 - OSC 11 应答与清屏色一致:无壁纸报告编辑器底色,有壁纸报告黑色 - 单测覆盖壁纸、无壁纸、状态切换与 OSC 11 契约 - 新增 terminal-canvas-compositing 能力记录,说明画布透明度与 OSC 11 应答取舍 * feat(windows): make diff block rollback honor discard confirmation (#1329) * feat(windows): make diff block rollback honor discard confirmation Interaction rule change for both block rollback arrow entries: with "Confirm Before Discard" enabled, the hunk rollback now asks once before discarding; with the setting disabled it applies immediately as before. The hook-level confirmation covers the preview surface and the Monaco gutter controls, which both funnel through the same review rollback. The confirmation is bound to what it was opened against: at most one pending dialog (repeat clicks are ignored), and after confirmation the captured snapshot reference is re-checked - a refreshed or switched target (new snapshot, file, or repository) abandons the write and asks the user to operate again on what is now shown instead of rolling back content nobody confirmed. The previous direct-apply behavior was the deliberate product rule recorded in the 2026-10-04 note; this change aligns block rollback with the file and repository level discard protection, updates the setting's description in both locales, and revises the decision note in place. Tests cover confirm-apply, cancel, setting-off immediate apply, dialog- open snapshot refresh, and repeat clicks. * fix(windows): bind rollback confirmation to model state and cover monaco Review fixes for the block rollback confirmation change: - the confirmation identity now reads the review service's model state instead of a render-phase ref: publish() refreshes the service state before React rerenders, so a same-batch refresh plus confirm could pass the stale ref check and discard unconfirmed content. The hook binds the owner reference and the model-level snapshot, and re-checks both after the dialog - the plain Monaco diff hunk actions funnel through the same gate: operations gain an optional confirmDiscard probe supplied by the component (setting check, single pending dialog, shared copy), the action runner consults it before discarding, and an instance disposed while the dialog was open never writes. Callers without the probe keep applying directly - the platform capability matrix records the confirmation semantics and its evidence; the decision note describes the model-level identity and the monaco disposal guard - tests cover cancel, confirm-through, dialog-open disposal, and gate-less callers at the action level; the reviewer's controlled race reproduction passes * fix(windows): localize the rollback dialog and formalize the race test Review follow-ups for the block rollback confirmation: - the monaco confirmation reads the translator through a synchronized ref, so a dialog opened after switching the interface language uses the current locale without rebuilding the hunk-action owner - the controlled same-batch refresh-and-confirm reproduction moves from the ignored .artifacts folder into the tracked suite (use-commit-diff-review-confirmation-race.test.tsx) and joins the Windows CI timing group - the capability matrix entries drop the obsolete 'direct rollback even with confirmation' acceptance wording in favor of the new rule, with the change dated in the note history * fix: surface stale rollback to the UI and deduplicate the race test - the hook-level stale return now sets error: 'stale' on the state, which the preview surface already renders as a user-facing notice; previously the confirmed rollback silently did nothing when the target changed during the dialog - the confirmation race test merges into the main hook test file, removing the 330-line duplicate setup and the separate CI entry * fix: keep a switched target clear of the stale rollback notice A confirmation opened for one file used to publish the stale error onto whatever file the review had switched to by the time it was confirmed. Only the same owner with a refreshed snapshot still shows the notice; a switched owner drops the confirmation silently. The channel test now renders the hook inside LocaleProvider with discard confirmation off, matching the merged hook's localization and default-on confirmation. * fix(macos): 设置窗口 OK/Cancel 偶发失效 (#1399) ## 背景 - 共享设置窗口的关闭回调依赖 `settingsBindingID` 校验;该值此前不发布,视图可能持有过期 binding,OK/Cancel 因此静默失效而标题栏关闭不受影响。 - 设置窗口的 NSWindow 引用只在 `SettingsWindowAccessor` 的一次异步回调里赋值;回调落在视图挂载到窗口之前时 `performClose` 拿不到窗口且没有重试。 ## 改动 - `settingsBindingID` 改为 `@Published`,每次重绑定都刷新可见设置窗口捕获的 binding - `SettingsWindow` 恢复捕获本次打开的 binding 用于关闭校验,过期回调不得关闭新打开的设置窗口 - `SettingsWindowProbe` 在 `viewDidMoveToWindow` 时重新赋值窗口引用并配置 chrome,消除一次性赋值竞态 ## 验证 - `LitheCoreLogicTests`:旧 binding 拒绝关闭、当前 binding 允许关闭(237 tests / 4 suites 通过) - 平台能力矩阵门禁通过 Co-authored-by: Lichenkang <2188718831@qq.com> * docs: update README WeChat group QR code (#1400) * feat(settings): 按设计稿重做 macOS 设置界面,支持插件注册设置页 (#1395) * docs(design): add plugin settings UI mockup Reference mockup for the macOS settings window redesign: sidebar groups, card sections, info tips, value pills, and plugin-contributed pages. * feat(settings): rebuild macOS settings UI with plugin-registered pages - Restyle the settings window after docs/design/plugin-settings.html: sidebar groups, card sections, info tips, value pills, banners. - Plugins register settings pages through plugin.json (page, section, scope, effect, settingActions); the host only provides generic registration points and controls, no per-tool pages or buttons. - Settings v2: project/global/default layering resolved by Rust Core, project values stored in <project>/.lithe/plugin-settings.json, "immediate" settings pushed via workspace/configuration. - Plugin detail view with tabs; Java Support moves to plugin API 3 and places its language server settings on the Java language page. - Merge Git settings into one page; add workbench background preview. - Remove per-frame GeometryReader rebuilds and card shadows that made window resizing stutter. - Move explanatory text on all settings pages behind info tips and record the rule in the develop-lithe skill. * fix(settings): close plugin settings review findings * fix(settings): harden project settings file and align settings UI rules - Refuse a project settings file that is undecodable instead of overwriting or deleting the team's shared values; refuse symlinks at .lithe or at plugin-settings.json itself, dangling or not; cache the parsed document by modification date and size. - Match Rust Core value checks: Cc-only control characters and Windows absolute paths (C:\ / C:/). - Text and integer fields for immediate/reload settings commit on Return or focus loss instead of on every keystroke. - Restore Defaults clears only the layer each row edits. - Settings sidebar uses litheSelectionRow; Features caption moves into an info tip; Settings tab count includes setting actions. - Tests for damaged-file refusal, symlink refusal and Rust-aligned checks. --------- Co-authored-by: arkleselect <166632698+arkleselect@users.noreply.github.com> Co-authored-by: Xiaoyumuxi <23722032@bjtu.edu.cn> Co-authored-by: 若水 <frankw.wang@qq.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> Co-authored-by: waani <kuun993@163.com> Co-authored-by: muchen <145200703+Mucheen@users.noreply.github.com> Co-authored-by: 十二翼堕落天使 <61737634+icefery@users.noreply.github.com> Co-authored-by: Y.Hill <3046829330@qq.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
背景
Issue #1351:Maven 面板每次打开项目都重新跑 Maven 解析依赖。插件仓库的 PR C(Lithe-IDEA/lithe-plugin-maven#3)把插件改成常驻 Java 后端,并保存持久快照
maven-snapshot.json。快照要用对,后端需要宿主告诉它两件它自己不知道的事:mvn。本 PR 在宿主侧补上这两个可选参数。按协议约定,双方都忽略不认识的字段,所以不升协议版本,老 Provider 不受影响。本 PR 只依赖
preview,不依赖 #1379(官方 Java SDK)。改动
Rust Core(
rust/lithe-core/src/build/plans.rs)OutputPlanRequest新增可选字段refresh: bool和tool: { executable }。build.modelPlan/build.dependencyPlan走 provider 来源时,refresh为true才写进provider.params.refresh;宿主给了tool才写进provider.params.tool。不带这两个参数时,计划和之前完全一样。tool.executable必须是绝对路径,不能为空,首尾不能有空白,也不能含控制字符;不满足时返回plugin.build.invalidSelection。macOS 宿主
LitheCoreContracts:新增BuildLoadReason(initial/refresh)和BuildProviderHints;BuildSystemPlanning.modelPlan/dependencyPlan增加providerHints参数。RustBuildSystemOperations:把 hints 编码成 Core 请求里的refresh/tool。BuildSystemService:loadModel/loadDependencies增加reason参数,默认.initial。outputPlan:先向 Core 要一次计划,确认是 provider 请求后,再按该构建系统的 invocation 用MacBuildToolResolver解析可执行文件(项目 wrapper、MAVEN_HOME等环境变量、PATH、用户覆盖),带上路径重新计划。command 来源不会因此多解析一次工具。tool,模型加载不会因此失败。取消照常向上抛出。captureOutput上方一行重复的过时注释。refresh:工具窗口刷新按钮、"构建文件已变化"横幅的 Reload、模型失败后的 Retry、依赖节点的 Reload / Retry、插件网页的build.refresh(文档定义就是重新加载)。refresh:首次点"Load Project Model"、首次展开依赖、网页首次读取依赖。BuildSystemsFeatureModel、PluginWebBuildAccess的签名同步更新。契约与文档
shared/contracts/plugins/v1/README.md:"Build providers"参数表新增refresh、tool两行和说明。shared/contracts/rust-core-api.md:build.modelPlan/build.dependencyPlan的请求和 params 说明。shared/contracts/plugins/v1/fixtures/build-plans.json新增 5 个用例:refresh: false时不写字段;sdk/node/src/index.d.ts:BuildRequestParams增加refresh?、tool?。2026-10-17-build-system-plugin-contract.md:补充决策、被否方案和验证。build-provider-refresh-and-tool:macOS 为 implemented / pending;Windows 还没有插件后端宿主,为 missing / not-applicable。测试
build_plans_match_the_contract_goldens覆盖上面 5 个新 golden;原有 provider 和 command golden 不变,说明不带参数时与现状一致。BuildSystemServiceTests:providerModelLoadCarriesTheResolvedToolWithoutRefreshproviderReloadsAskForARefreshproviderLoadsWithoutTheToolWhenResolutionFailscommandModelLoadsDoNotResolveAProviderToolMacBuildProviderSessionsTests.providerHintsReachTheProcessUnchanged:params 原样到达进程。PluginWebBridgeTests.pageRefreshReloadsTheModel:网页的build.refresh算作重新加载。RustBuildSystemOperationsTests.providerPlansCarryTheReloadReasonAndTheResolvedTool:用真实 Core 验证桥接。本地验证
cargo test -p lithe-core:全部通过(lib 1051 项和集成测试)。./scripts/test-macos.sh --filter 'BuildSystemServiceTests|MacBuildProviderSessionsTests|PluginWebBridgeTests|RustBuildSystemOperationsTests':通过。write-stable-tests的计时入口:7 个新用例全部有耗时记录,最慢 32 ms。verify-test-stability.shverify-rust-core-comments.shverify-shared-contracts.shverify-service-boundaries.shverify-agent-notes.shverify-platform-feature-matrix.shverify-platform-feature-matrix-change.sh origin/preview HEAD