Skip to content

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

OpenCode 权限管理

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

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

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


三个动作

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

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

基本配置

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

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

或者分工具设置:

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

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


精细规则(对象语法)

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

json
{
  "$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"(即需要确认)。

允许访问特定外部目录:

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

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

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

可用权限列表

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

默认值

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

  • 大多数权限默认 "allow"
  • doom_loopexternal_directory 默认 "ask"
  • read 默认 "allow",但 .env 文件默认被拒绝:
json
{
  "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 中配置

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 文件中配置

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

Only analyze code and suggest changes.

常见问题

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

A:

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

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

A:

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

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

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