Skip to content

fix: worktree 接口在 git 不可用时返回原始 spawn git ENOENT,泄漏原始 git/fs 错误 #50

Description

@moose-lab

现象

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.tscatch 直接 return { error: (err as Error).message },把 worktree-managerexecFile("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-managergit() 包装里识别 ENOENT → 抛出友好错误("git not found — install git or add it to PATH");
  • worktree 路由的 catch 改为返回通用错误信息(记录详细日志到服务端,不外露原文);
  • 可加一条针对 git 缺失场景的单测(stub execFile 抛 ENOENT,断言友好信息)。

相关文件

来自 2026-06-13 三层验证。注:沙箱里 worktree 500 多由 PATH 缺 git 触发(环境问题),但 "原始错误透传 + 缺失提示不友好" 是真实代码侧可改进点。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions