现象
当 git 不在服务进程 PATH 上(或未安装)时,worktree 接口直接把底层异常原文回传:
GET /api/worktrees → 500 {"error":"spawn git ENOENT"}
集成验证中复现:同一构建在 PATH 含 git 时 GET /api/worktrees 返回 200;PATH 不含 git 时返回 500 + 上述原始报文。
根因
src/app/api/worktrees/route.ts 的 catch 直接 return { error: (err as Error).message },把 worktree-manager 里 execFile("git", …) 抛出的原始 spawn git ENOENT(以及任意 git/fs 报错)透传给客户端。
这正是 REVIEW-2026-06-10 Phase 1 列出的 "Generic error responses(stop echoing raw git/fs/python messages)" 收尾项 —— 输入校验(CR-5)已落地,但 worktree 路由的错误响应仍是原始透传。
影响
- 可用性:git 未安装/不在 PATH 时,用户看到的是
spawn git ENOENT 这种无从下手的报错,而不是 "未检测到 git,请安装或加入 PATH" 之类可操作提示。
- 信息泄漏:路由变为跨源可读后(中间件已限制,但仍属最小披露原则),原始 git/fs 路径与错误不应直接外露。
建议
- 在
worktree-manager 的 git() 包装里识别 ENOENT → 抛出友好错误("git not found — install git or add it to PATH");
- worktree 路由的
catch 改为返回通用错误信息(记录详细日志到服务端,不外露原文);
- 可加一条针对 git 缺失场景的单测(stub
execFile 抛 ENOENT,断言友好信息)。
相关文件
来自 2026-06-13 三层验证。注:沙箱里 worktree 500 多由 PATH 缺 git 触发(环境问题),但 "原始错误透传 + 缺失提示不友好" 是真实代码侧可改进点。
现象
当
git不在服务进程 PATH 上(或未安装)时,worktree 接口直接把底层异常原文回传:集成验证中复现:同一构建在 PATH 含 git 时
GET /api/worktrees返回 200;PATH 不含 git 时返回 500 + 上述原始报文。根因
src/app/api/worktrees/route.ts的catch直接return { error: (err as Error).message },把worktree-manager里execFile("git", …)抛出的原始spawn git ENOENT(以及任意 git/fs 报错)透传给客户端。这正是 REVIEW-2026-06-10 Phase 1 列出的 "Generic error responses(stop echoing raw git/fs/python messages)" 收尾项 —— 输入校验(CR-5)已落地,但 worktree 路由的错误响应仍是原始透传。
影响
spawn git ENOENT这种无从下手的报错,而不是 "未检测到 git,请安装或加入 PATH" 之类可操作提示。建议
worktree-manager的git()包装里识别ENOENT→ 抛出友好错误("git not found — install git or add it to PATH");catch改为返回通用错误信息(记录详细日志到服务端,不外露原文);execFile抛 ENOENT,断言友好信息)。相关文件
src/app/api/worktrees/route.ts—catch原文透传(GET 约 :26、POST 同理)src/core/worktree-manager.ts—git()execFile 包装