Skip to content

[Feature] 权限模型:豁免系统临时目录写入,避免 Plan Mode 下反复询问 #326

Description

@cmp0xff

问题

Deep Code 经常需要向系统临时目录写草稿文件(如 /tmp/deepcode_issue_body.md/tmp/deepcode-pr-body.md)。

当前权限模型只有工作区内/外两个粒度:/tmp 被归为 write-out-cwd,与写入 ~/.ssh/etc 同级,没有针对临时目录的低风险豁免。由此产生两个问题:

  1. Plan Mode 下,PLAN_MODE_FORCE_ASK_SCOPES 会强制询问所有写操作(含 write-out-cwd),且 /tmp 不豁免 → 每次写临时文件都弹一次权限询问。
  2. 用户无法只放行临时目录:把 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions