Appearance
OpenCode 通过 permission 配置控制 AI 是否可以执行特定操作——默认全部允许,可改为全部需要确认,也可以对不同工具设置不同级别。bash 命令支持按命令模式精细控制(如 git * 允许、rm * 禁止),文件操作支持按路径 glob 规则。可以按 agent 单独配置,与全局规则合并生效。
OpenCode 权限管理
OpenCode 使用 permission 配置决定 AI 是否可以自动执行某操作、需要你确认,还是直接拒绝。
默认情况下,除了 .env 文件读取外,所有操作都被允许。
版本说明:
v1.1.1起,旧的toolsboolean 配置已废弃并合并到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) |
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_loop和external_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 卡住了,此时可以中断并告诉它换个思路。