From 1b62eb6bc2d2feb538ccbe7d26b57dc6706c0f09 Mon Sep 17 00:00:00 2001 From: lick <2188718831@qq.com> Date: Sun, 25 Oct 2026 03:31:57 -0700 Subject: [PATCH 1/2] =?UTF-8?q?fix(macos):=20=E8=BF=90=E8=A1=8C=20Node=20?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E6=97=B6=E8=A1=A5=E9=BD=90=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=20PATH=20(#1455)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 从 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 记录。 --- ...0-25-run-launch-path-for-node-launchers.md | 112 +++++++++++ .../Services/Java/RunExecutableResolver.swift | 21 +- .../Services/Java/RunLaunchEnvironment.swift | 70 +++++++ .../RunLaunchEnvironmentTests.swift | 189 ++++++++++++++++++ .../features/run-node-launch-path.json | 25 +++ 5 files changed, 412 insertions(+), 5 deletions(-) create mode 100644 .agents/notes/implemented/bug-fix/2026-10-25-run-launch-path-for-node-launchers.md create mode 100644 macos/Sources/Lithe/Services/Java/RunLaunchEnvironment.swift create mode 100644 macos/Tests/LitheTests/RunLaunchEnvironmentTests.swift create mode 100644 shared/platform-feature-matrix/features/run-node-launch-path.json diff --git a/.agents/notes/implemented/bug-fix/2026-10-25-run-launch-path-for-node-launchers.md b/.agents/notes/implemented/bug-fix/2026-10-25-run-launch-path-for-node-launchers.md new file mode 100644 index 0000000000..1c51a4bb83 --- /dev/null +++ b/.agents/notes/implemented/bug-fix/2026-10-25-run-launch-path-for-node-launchers.md @@ -0,0 +1,112 @@ +# Agent 笔记:从 Finder 启动的 Lithe 运行 Node 脚本时补齐启动 PATH + +状态:已实现 + +## 先说结论 + +从 Finder / Dock 启动的 Lithe 继承 launchd 的最小环境,`PATH` 只有 +`/usr/bin:/bin:/usr/sbin:/sbin`。Lithe 自己能通过 Homebrew、fnm、nvm 找到 +`pnpm`,但 `pnpm` 这类启动器用 `#!/usr/bin/env node` 找解释器,子进程按自己的 +`PATH` 找不到 `node`,于是 `pnpm run