### Problem to solve / 要解决的问题 工具定义可以声明 `command` 候选,也就是在 `PATH` 上按命令名查找(例如 `java`、`mvn`)。Core 的 `toolchains.resolve` 只在输入里有 `commandHomes[命令名]` 时,才检查并选择这个候选。契约(`shared/contracts/plugins/v1/toolchains.md`)还规定,`commandHomes` 必须来自原生的登录 Shell 适配器,不能按命令名猜测。 macOS 运行环境设置页(PR #1581)目前没有这个来源,不传 `commandHomes`,所以 `PATH` 上的命令永远不会被 Core 选中。作为替代,Core 在所有层都跳过时,页面把加载器在 `PATH` 上找到的第一个命令显示成“版本未验证”的兜底。这条命令没有经过 Core 的路径安全检查,也没有运行版本探测。 影响: - 有些工具只在 `PATH` 上:没有设置 home 变量,插件的扫描规则也没覆盖到。这类工具在页面上只能显示“版本未验证”,看不到版本。 - 将来启动流程如果提供了 `commandHomes`,实际选择会和页面显示的不一致。 ### Proposed solution / 建议方案 1. **登录 Shell 适配器提供原始事实。** 读取环境时,按已启用定义声明的命令名,在登录 Shell 的 `PATH` 中定位可执行文件,并给出规范路径(解析链接后的真实路径)。 2. **由 Core 推导 home。** Core 按定义的 `executableLayouts`,从规范路径反推 home,作为 `commandHomes` 参与解析,并照常做路径安全检查和版本探测。推导规则放在 Rust Core,宿主不按工具名特判。 3. **页面改为显示 Core 的结果。** 去掉现在的“版本未验证”兜底,改为显示 Core 对命令候选的结果:已选中并带版本,或者 Core 给出的跳过原因。 4. **如需改契约,同步插件文档仓库。** 如果推导方式要改 `commandHomes` 的契约含义或新增字段,修改 `shared/contracts/plugins/v1/` 后,合并时同步到 lithe-plugin-docs。 验收方式:用临时目录模拟以下情况: - `PATH` 上的命令及其链接; - 布局匹配和不匹配; - 命令落在工作区内(必须被拒绝); - 版本探测成功和失败。 测试不读取开发者本机的 `PATH`,也不运行本机工具。 ### Target platform / 目标平台 macOS ### Area / 模块 Settings / 设置 ### Priority / 优先级 P2 / 后续考虑:目前不着急,可安排到后续版本 ### Alternatives considered / 已考虑的替代方案 - **宿主按命令名猜 home**(例如把 `/x/bin/java` 的上两级当作 home)。不采用。契约禁止,而且不同工具的布局不同,猜错就会导出错误的 home 变量。 - **保持现状,只显示“版本未验证”。** 这是当前做法,不会误导用户以为已经校验过,但只靠 `PATH` 安装的工具永远拿不到版本,页面和将来的启动结果也可能不一致。 ### Additional context / 补充信息 - 相关:PR #1581(Core 解析接入设置页)。 - 代码位置: - `rust/lithe-core/src/toolchain/resolution.rs`:`command` 候选读取 `commandHomes`; - `macos/Sources/Lithe/Platform/MacOS/Runtime/MacToolchainSettingsLoader.swift`:在 `PATH` 上找第一个命令作为兜底; - `macos/Sources/Lithe/Views/App/ToolchainEnvironmentSettingsView.swift`:Core 跳过时显示兜底。 - 决策记录:`.agents/notes/proposed/architecture/2026-10-31-plugin-injected-toolchains.md` 中“macOS 设置页的解析取舍”一节,已把这一点记为已知限制。 - 依据:源码阅读,不是发布包复现。Windows 运行环境页尚未接入,本 Issue 只针对 macOS。 ### Checklist / 提交前检查 - [x] I searched existing issues for duplicates. / 我已搜索现有 Issue,确认没有重复建议。
Activity
feat(plugins): 运行环境页每行生效来源改由 Core toolchains.resolve 决定 (1lck#1581)
feat(plugins): 插件注入的工具链框架与 macOS 只读环境设置页 (#1581)
feat(workspace): 支持目录索引排除并统一 Git 设置入口 (#1597)