← 文档中心

权限

使用

权限决定了 AI 在动手前要不要先问你。合理的权限配置是”敢放手让 AI 干活”的前提。

三种动作

动作行为
allow直接执行,不询问
ask执行前弹出确认,可选择”仅此一次”或”始终允许”
deny拒绝执行,且不弹窗

deny 的工具不会出现在给模型的工具清单里,因此模型根本不会尝试调用它。

配置语法

简写形式

直接给一个动作,等价于对该权限的所有目标生效:

{
  "permission": {
    "read": "allow",
    "edit": "ask",
    "webfetch": "deny"
  }
}

按目标细分

用对象把 glob 模式映射到动作:

{
  "permission": {
    "edit": "ask",
    "bash": {
      "*": "ask",
      "git *": "allow",
      "npm test": "allow",
      "rm *": "deny"
    }
  }
}

模式书写要点:

  • * 匹配任意字符,作为兜底规则
  • 具体规则优先于通配规则 —— DuoDuoCode 会把带 * 的权限名排在前面,匹配时取最后一条命中的规则,所以 bash: { "*": "ask", "git *": "allow" }git 命令会被放行
  • 路径支持 ~/$HOME 展开,例如 "~/secrets/*": "deny"
  • 多个会话级”始终允许”的选择会累积到本次会话的放行清单中,重启后失效

可用权限项

权限项控制范围
read读取文件
edit修改文件。同时覆盖写入与打补丁两种改法
bash执行 shell 命令
grep文本搜索
glob文件名匹配
list列目录
webfetch抓取网页
todowrite维护待办清单
task派生子任务
skill加载技能
symbol_search单文件符号查询
graph_query知识图谱查询
lspLSP 诊断、跳转、补全
code_comment写入代码注释
search_modifications查询文件改动(快照检索)
plan_enter / plan_exit进入 / 退出计划模式
plan_confirm确认计划
question向用户提问
doom_loop检测到循环空转时的保护性提示
external_directory访问项目目录之外的路径

edit 一个权限同时管理 editwriteapply_patch 三种改法,不需要分别配置。

内置默认值

build Agent 开箱即用的策略是”读取自由、写入确认”:

{
  "*": "allow",
  "doom_loop": "ask",
  "edit": { "*": "ask" },
  "read": {
    "*": "allow",
    "*.env": "ask",
    "*.env.*": "ask",
    "*.env.example": "allow"
  }
}

注意 .env 系列文件默认需要确认——读取密钥文件会弹窗,而 .env.example 不视为敏感文件。

只读类 Agent(如 explore)会把 "*" 设为 deny,再逐个放行只读工具。这个约束是结构性的:即使用户配置写了 {"permission": {"*": "allow"}},只读 Agent 依然不能写文件。

会话内的临时放行

弹窗确认时选择”始终允许”,该规则会写入本次会话的放行清单:

  • 只影响当前会话,重启后清空
  • 若放行的是项目外的目录,DuoDuoCode 会同步把该路径加入运行时的路径白名单,否则底层安全策略仍会拦截

环境变量

DUODUO_PERMISSION='{"edit":"allow"}' duoduocode

可用于 CI 等无人值守场景临时放宽权限。

推荐配置

保守(默认上手)

{
  "permission": {
    "edit": "ask",
    "bash": "ask"
  }
}

信任常用命令,其余仍确认

{
  "permission": {
    "read": "allow",
    "edit": "ask",
    "bash": {
      "*": "ask",
      "git *": "allow",
      "npm run *": "allow",
      "pnpm *": "allow",
      "cargo test*": "allow"
    }
  }
}

无人值守 / CI

{
  "permission": {
    "*": "allow",
    "bash": { "*": "allow", "rm -rf *": "deny", "sudo *": "deny" }
  }
}

把危险命令显式 deny 掉,比依赖模型判断可靠得多。

相关