问题
Deep Code 经常需要向系统临时目录写草稿文件(如 /tmp/deepcode_issue_body.md、/tmp/deepcode-pr-body.md)。
当前权限模型只有工作区内/外两个粒度:/tmp 被归为 write-out-cwd,与写入 ~/.ssh、/etc 同级,没有针对临时目录的低风险豁免。由此产生两个问题:
- Plan Mode 下,
PLAN_MODE_FORCE_ASK_SCOPES 会强制询问所有写操作(含 write-out-cwd),且 /tmp 不豁免 → 每次写临时文件都弹一次权限询问。
- 用户无法只放行临时目录:把
write-out-cwd 加入 permissions.allow 会同时放行工作区外任意路径的写入,风险过大;而且 Plan Mode 的强制询问也不受 allow 覆盖。
期望
- 方案 A(推荐):权限模型识别系统临时目录(
os.tmpdir()、/tmp、Windows %TEMP%),将其中写入视为低风险:普通模式默认放行,Plan Mode 下也不再强制询问。
- 方案 B(更通用):支持路径级权限规则,例如
permissions.allowPaths: [{ "path": "/tmp/**", "scopes": ["write-out-cwd"] }],允许只放行特定目录。
详细说明与建议(点击展开)
现状
describeToolPermissionRequest(packages/core/src/common/permissions.ts)中,write/edit 只要路径不在 projectRoot 内就标记为 write-out-cwd,没有临时目录分支。
- Plan Mode 在 packages/core/src/session.ts 中定义
PLAN_MODE_FORCE_ASK_SCOPES = ["write-in-cwd", "write-out-cwd", "delete-in-cwd", "delete-out-cwd", "mutate-git-log"],写操作一律强制询问,allow 列表无法覆盖。
建议实现
- 新增
isPathInTempDir(filePath) 判断(基于 os.tmpdir() 与平台常见临时目录),对临时目录内写入返回低风险标记或直接不计入 write-out-cwd。
- 或引入
permissions.pathRules / allowPaths,在 evaluatePermissionScopes 前先做路径匹配,优先级高于 scope 判定。
- Plan Mode 的
getAllowedForcedAskScopes 中跳过已豁免路径对应的 scope。
边界
- 不改变
write-out-cwd 对其它路径的语义。
- 豁免范围仅限系统临时目录;用户自定义目录仍按现有规则处理。
- 只影响权限询问,不改变工具本身行为。
Co-authored-by: deepseek-v4-pro noreply@deepseek.com
问题
Deep Code 经常需要向系统临时目录写草稿文件(如
/tmp/deepcode_issue_body.md、/tmp/deepcode-pr-body.md)。当前权限模型只有工作区内/外两个粒度:
/tmp被归为write-out-cwd,与写入~/.ssh、/etc同级,没有针对临时目录的低风险豁免。由此产生两个问题:PLAN_MODE_FORCE_ASK_SCOPES会强制询问所有写操作(含write-out-cwd),且/tmp不豁免 → 每次写临时文件都弹一次权限询问。write-out-cwd加入permissions.allow会同时放行工作区外任意路径的写入,风险过大;而且 Plan Mode 的强制询问也不受allow覆盖。期望
os.tmpdir()、/tmp、Windows%TEMP%),将其中写入视为低风险:普通模式默认放行,Plan Mode 下也不再强制询问。permissions.allowPaths: [{ "path": "/tmp/**", "scopes": ["write-out-cwd"] }],允许只放行特定目录。详细说明与建议(点击展开)
现状
describeToolPermissionRequest(packages/core/src/common/permissions.ts)中,write/edit只要路径不在 projectRoot 内就标记为write-out-cwd,没有临时目录分支。PLAN_MODE_FORCE_ASK_SCOPES = ["write-in-cwd", "write-out-cwd", "delete-in-cwd", "delete-out-cwd", "mutate-git-log"],写操作一律强制询问,allow列表无法覆盖。建议实现
isPathInTempDir(filePath)判断(基于os.tmpdir()与平台常见临时目录),对临时目录内写入返回低风险标记或直接不计入write-out-cwd。permissions.pathRules/allowPaths,在evaluatePermissionScopes前先做路径匹配,优先级高于 scope 判定。getAllowedForcedAskScopes中跳过已豁免路径对应的 scope。边界
write-out-cwd对其它路径的语义。Co-authored-by: deepseek-v4-pro noreply@deepseek.com