OpenCode 通过 permission 配置控制 AI 是否可以执行特定操作——默认全部允许,可改为全部需要确认,也可以对不同工具设置不同级别。bash 命令支持按命令模式精细控制(如 git * 允许、rm * 禁止),文件操作支持按路径 glob 规则。可以按 agent 单独配置,与全局规则合并生效。

OpenCode 权限管理

OpenCode 使用 permission 配置决定 AI 是否可以自动执行某操作、需要你确认,还是直接拒绝。

默认情况下,除了 .env 文件读取外,所有操作都被允许。

版本说明v1.1.1 起,旧的 tools boolean 配置已废弃并合并到 permission。旧配置向后兼容仍可用。


三个动作

每条权限规则对应三个结果之一:

  • "allow" — 自动执行,无需确认
  • "ask" — 执行前弹出确认
  • "deny" — 拒绝执行

基本配置

全局设置(对所有工具生效):

{
  "$schema": "https://opencode.ai/config.json",
  "permission": "allow"
}

或者分工具设置:

{
  "$schema": "https://opencode.ai/config.json",
  "permission": {
    "*": "ask",
    "bash": "allow",
    "edit": "deny"
  }
}

"*" 是通配符,匹配所有未指定的工具。这里表示"默认需要确认,但 bash 自动允许、edit 直接拒绝"。


精细规则(对象语法)

大多数权限支持对象语法,根据工具的输入参数(如命令或文件路径)应用不同规则:

{
  "$schema": "https://opencode.ai/config.json",
  "permission": {
    "bash": {
      "*": "ask",
      "git *": "allow",
      "npm *": "allow",
      "rm *": "deny",
      "grep *": "allow"
    },
    "edit": {
      "*": "deny",
      "packages/web/src/content/docs/*.mdx": "allow"
    }
  }
}

规则按顺序匹配,最后一条匹配的规则优先。常见写法是先写 "*" 兜底,再写具体规则覆盖。

通配符规则

  • * — 匹配零个或多个任意字符
  • ? — 匹配恰好一个字符
  • 其他字符精确匹配

注意:bash 命令匹配的是"解析后的命令模式"。"grep *" 允许 grep pattern file.txt,但 "grep" 只匹配无参数的 grep 调用。

主目录展开

路径中支持 ~$HOME

  • ~/projects/*/Users/username/projects/*
  • $HOME/docs/Users/username/docs

外部目录访问

external_directory 权限控制工具是否可以访问工作目录以外的路径。默认值为 "ask"(即需要确认)。

允许访问特定外部目录:

{
  "$schema": "https://opencode.ai/config.json",
  "permission": {
    "external_directory": {
      "~/projects/personal/**": "allow"
    }
  }
}

被允许的外部目录继承工作目录的相同默认值。如果需要更细粒度控制(比如只允许读、不允许编辑):

{
  "permission": {
    "external_directory": {
      "~/projects/personal/**": "allow"
    },
    "edit": {
      "~/projects/personal/**": "deny"
    }
  }
}

可用权限列表

权限键 匹配对象 说明
read 文件路径 读取文件
edit 文件路径 所有文件修改(edit/write/apply_patch)
glob glob 模式 文件列表搜索
grep 正则表达式 文件内容搜索
bash 解析后的命令 执行 shell 命令
task subagent 类型 启动子 agent
skill skill 名称 加载 skill
lsp 运行 LSP 查询(目前不支持精细控制)
question AI 向用户提问
webfetch URL 抓取网页
websearch / codesearch 搜索词 网络/代码搜索
external_directory 目录路径 访问工作目录外的路径
doom_loop 同一工具调用重复 3 次时触发

默认值

未显式配置时,OpenCode 采用宽松默认值:

  • 大多数权限默认 "allow"
  • doom_loopexternal_directory 默认 "ask"
  • read 默认 "allow",但 .env 文件默认被拒绝:
{
  "permission": {
    "read": {
      "*": "allow",
      "*.env": "deny",
      "*.env.*": "deny",
      "*.env.example": "allow"
    }
  }
}

“Ask” 的三个选项

当 OpenCode 请求确认时,UI 提供三种选择:

  • Once(仅本次)— 只允许这一次请求
  • Always(本次会话始终允许)— 允许后续匹配该模式的请求(当前会话有效)
  • Reject(拒绝)— 拒绝该请求

Always 允许的模式由工具提供(例如 bash 会建议类似 git status* 的安全前缀)。


按 Agent 配置权限

可以为不同 agent 配置不同的权限规则。Agent 权限与全局配置合并,agent 规则优先级更高。

在 opencode.json 中配置

{
  "$schema": "https://opencode.ai/config.json",
  "permission": {
    "bash": {
      "*": "ask",
      "git *": "allow",
      "git commit *": "deny",
      "git push *": "deny",
      "grep *": "allow"
    }
  },
  "agent": {
    "build": {
      "permission": {
        "bash": {
          "*": "ask",
          "git *": "allow",
          "git commit *": "ask",
          "git push *": "deny",
          "grep *": "allow"
        }
      }
    }
  }
}

在 Markdown agent 文件中配置

---
description: Code review without edits
mode: subagent
permission:
  edit: deny
  bash: ask
  webfetch: deny
---

Only analyze code and suggest changes.

常见问题

Q: 想让 AI 可以随意读文件,但编辑前必须确认,怎么配置?

A:

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

Q: 如何只允许 AI 执行特定 git 命令,其他命令全部拒绝?

A:

{
  "permission": {
    "bash": {
      "*": "deny",
      "git status *": "allow",
      "git diff *": "allow",
      "git log *": "allow"
    }
  }
}

Q: doom_loop 是什么,什么时候会触发?

A: 当 AI 用完全相同的输入重复调用同一工具 3 次时触发,默认会弹出确认(防止无限循环)。通常说明 AI 卡住了,此时可以中断并告诉它换个思路。