Skip to content

fix(macos): 运行 Node 脚本时补齐启动 PATH (#1455) - #1492

Merged
1lck merged 2 commits into
previewfrom
fix/1455-run-node-path
Oct 25, 2026
Merged

1lck merged 2 commits into
previewfrom
fix/1455-run-node-path

Conversation

@1lck

@1lck 1lck commented Oct 25, 2026

Copy link
Copy Markdown
Owner

关联 Issue

Fixes #1455

问题

从 Finder / Dock 启动的 Lithe 继承 launchd 的最小 PATH(/usr/bin:/bin:/usr/sbin:/sbin)。Lithe 通过 Homebrew、fnm、nvm 探测能找到 pnpm,但 pnpm 这类启动器用 #!/usr/bin/env node 查找解释器,子进程按自己的 PATH 找不到 node,于是点运行后立刻报 env: node: No such file or directory。

代码链路:MacRuntimeLocator.environment() 返回 ProcessInfo.processInfo.environment → ProjectRuntimeService.processEnvironment(overrides:) 只叠加 override → RunExecutableResolver 原样交给 Process.start。发现结果从未进入子进程环境。

改动点

  1. 新增 RunLaunchEnvironment(macos/Sources/Lithe/Services/Java/RunLaunchEnvironment.swift)
    • 启动前把「发现到的 node 解释器目录」和「解析出的可执行文件目录」前置到子进程 PATH;原有 PATH 顺序保留,按小写去重。
    • 安全边界:source == .project 的 node 不注入;可执行文件位于项目根内(mvnw / gradlew)时其目录也不注入,避免仓库文件劫持后续系统命令;与 languageToolProcessEnvironment 的既有规则一致。
    • 与 Windows prepend_runtime_paths 的启动环境语义对齐。
  2. 接入唯一解析入口(RunExecutableResolver.resolve):.toolchain 和 .command 共用同一条环境组合路径,主进程与预启动步骤都覆盖;终端、调试适配器、语言服务器不经过这里,行为不变。
  3. 测试(RunLaunchEnvironmentTests,6 例):最小 PATH 补齐、项目内 node 排除、项目 wrapper 排除、去重与顺序、缺失 PATH、resolver 对 .command 的实际接线。
  4. 记录:新增 Agent Note(2026-10-25-run-launch-path-for-node-launchers.md)与特性矩阵 run-node-launch-path 行。

验证

命令 结果
./.agents/skills/write-stable-tests/scripts/verify-test-stability.sh 通过
.../test-stability-macos.sh -- --filter RunLaunchEnvironmentTests 6/6
.../test-stability-macos.sh -- --filter RunConfigurationIntegrationTests 128/128
./scripts/verify-service-boundaries.sh 通过
./scripts/verify-agent-notes.sh 153 篇通过
./scripts/verify-platform-feature-matrix.sh 207 个能力点通过
./scripts/verify-platform-feature-matrix-change.sh origin/preview <snapshot> capability records changed

已知限制

  • 本机全量 ./scripts/test-macos.sh 并行运行时有大量 12s 级计时门失败(Editor documents、Search Everywhere、Agent service 等),抽样单独重跑均通过;未做基线对照,也未跑串行全量套件。
  • 未在真实发行包上做 GUI 端到端复验(打开 pnpm 项目点运行),因此矩阵验证状态保持 pending。

从 Finder 启动的 Lithe 只继承 launchd 的最小 PATH,pnpm/npm/yarn/tsx 的
#!/usr/bin/env node 找不到解释器,运行 package.json 脚本直接报
env: node: No such file or directory。

- RunLaunchEnvironment:启动前把发现到的 node 目录和解析出的可执行文件目录
  前置到子进程 PATH,按小写去重;项目内 node 与项目根目录不注入,避免仓库
  文件劫持后续系统命令。
- RunExecutableResolver:.toolchain 与 .command 共用同一条环境组合路径,
  覆盖主进程和预启动步骤。
- RunLaunchEnvironmentTests:6 个用例覆盖补齐、项目内排除、wrapper 排除、
  去重与顺序、缺失 PATH、resolver 实际接线。
- 新增 Agent Note 与平台特性矩阵 run-node-launch-path 记录。
@ghfind-review ghfind-review Bot added the review: high ghfind author score; see https://ghfind.com label Oct 25, 2026
- 启动 PATH 改为追加:原有条目(含运行配置显式 PATH)保持优先级,自动发现
  的 node 与启动器目录追加在后;Finder 启动时 PATH 本就没有 node,追加同样生效。
- 新增「显式 PATH 保持优先级」与 .toolchain("project-node") 接线测试,共 8 例。
- 修正 Agent Note 与特性矩阵中「两端都排除项目目录」「与 Windows 一致」的不准确
  表述,补充 fnm multishell 等发现范围限制与 Windows 排序差异。
@1lck
1lck marked this pull request as ready for review October 25, 2026 11:12
@1lck
1lck merged commit 243f2a7 into preview Oct 25, 2026
20 of 21 checks passed
@lithe-code-review

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

Copy link
Copy Markdown

Lithe Review

结论: ❓ 审查未完成

任务: 347

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant