词元之母TOK.MOM - 平台充值汇率 1:1 即 1 人民币充值到账 1 美元,支持一个 Key 调用近 600+ 海内外模型,限时特价模型低至 1 折,欢迎上岸!
💡 一句话总结:通过权限配置控制 AI 能做什么、不能做 什么。

external_directory)| 模式 | 说明 |
|---|---|
allow | 允许执行,不询问 |
ask | 每次询问用户确认 |
deny | 禁止执行 |
opencode.json 中使用 permission(注意是单数):{
"$schema": "https://opencode.ai/config.json",
"permission": {
"*": "ask", // 默认所有操作需确认
"bash": "allow", // Bash 命令自动放行
"edit": "deny" // 禁止编辑文件
}
}{
"permission": "allow" // 所有操作自动放行
}{
"permission": {
"bash": {
"*": "ask", // 默认需确认
"git *": "allow", // git 命令放行
"npm *": "allow", // npm 命令放行
"rm *": "deny" // 禁止 rm 命令
},
"edit": {
"*": "deny", // 默认禁止编辑
"packages/web/src/content/docs/*.mdx": "allow" // 只允许编辑文档
}
}
}"*" 规则放在前面,更具体的规则放在后面。* 匹配零个或多个任意字符? 匹配正好一个字符| 权限 | 描述 | 匹配内容 |
|---|---|---|
read | 读取文件 | 文件路径 |
edit | 文件修改权限(涵盖 edit, write, patch, multiedit) | 文件路径 |
glob | 文件通配符搜索 | glob 模式 |
grep | 内容搜索 | 正则表达式模式 |
list | 列出目录文件 | 目录路径 |
bash | 运行 shell 命令 | 解析后的命令前缀 |
task | 启动子代理 | 子代理名称 |
skill | 加载技能 | 技能名称 |
lsp | 运行 LSP 查询 | 支持细粒度匹配 |
external_directory | 访问项目外路径 | 目录路径 |
📝 注: edit权限涵盖 write(创建新文件)、edit(修改文件)、patch(修补文件)、multiedit(批量编辑)四种工具操作。
allow/ask/deny,不支持对象语法:| 权限 | 描述 |
|---|---|
todoread | 读取待办列表 |
todowrite | 更新待办列表 |
webfetch | 获取 URL 内容(运行时会传递 URL 用于 always 批准) |
websearch | 网页搜索(运行时会传递查询用于 always 批准) |
codesearch | 代码搜索(运行时会传递查询用于 always 批准) |
doom_loop | 相同工具调用重复 3 次时触发 |
⚠️ 注意: plan_enter、plan_exit仅作为内置 Agent 的默认权限配置使用,用户在 opencode.json 中配置无效。question字段用户可以配置,但一般不需要修改。
来源: opencode/packages/opencode/src/config/config.ts:621-652
"allow"doom_loop 和 external_directory 默认为 "ask".env 文件默认需询问(ask),非直接拒绝:{
"permission": {
"read": {
"*": "allow",
"*.env": "deny",
"*.env.*": "deny",
"*.env.example": "allow" // 示例文件允许读取
}
}
}来源: opencode/packages/opencode/src/agent/agent.ts:46-57
| 工具/权限 | build | plan | general | explore |
|---|---|---|---|---|
| 文件读取 | ✅ | ✅ | ✅ | ✅ |
| 文件编辑 | ✅ | ❌(仅 .opencode/plans/*.md 允许) | ✅ | ❌ |
| Shell 命令 | ✅ | ✅ | ✅ | ✅ |
| 网页搜索/获取 | ✅ | ✅ | ✅ | ✅ |
| 代码搜索 | ✅ | ✅ | ✅ | ✅ |
| TODO 管理 | ✅ | ✅ | ❌ | ❌ |
| 提问工具 | ✅ | ✅ | ✅ | ❌ |
| 计划进入/退出 | ✅ | ✅ | ❌ | ❌ |
| 外部目录访问 | ⚠️(默认 ask) | ⚠️(ask,仅 .opencode/plans/* 允许) | ⚠️(默认 ask) | ⚠️(ask,仅 GLOB 允许) |
.opencode/plans/* 目录primaryprimary.opencode/plans/*.md 计划文件subagentsubagent"*": "deny"),仅允许 grep/glob/list/bash/read/webfetch/websearch/codesearch来源: opencode/packages/opencode/src/agent/agent.ts:92-155
external_directory 权限检查。| 工具 | 触发条件 |
|---|---|
read | 读取项目外的文件 |
edit | 编辑项目外的文件 |
write | 写入项目外的文件 |
patch | 修补项目外的文件 |
bash | 命令涉及项目外路径(如 cd ..、rm /tmp/file) |
.. 开头,说明文件在项目目录之外。{
"permission": {
"external_directory": "ask" // 默认值:对非 GLOB 路径每次询问用户确认
}
}// opencode.json
{
"permission": {
"external_directory": "allow"
}
}~/.config/ 等配置目录external_directory 支持对象语法,可以按路径配置:{
"permission": {
"external_directory": {
"*": "ask", // 默认需确认
"/tmp/*": "allow", // /tmp 目录允许
"/home/user/shared/*": "allow", // 共享目录允许
"/etc/*": "deny" // 系统配置禁止
}
}
}| 方式 | 配置位置 | 示例 |
|---|---|---|
| 全局配置 | ~/.config/opencode/opencode.json | "external_directory": "allow" |
| 项目配置 | 项目根目录/opencode.json | "external_directory": "allow" |
| 环境变量 | OPENCODE_PERMISSION | export OPENCODE_PERMISSION='{"external_directory": "allow"}' |
| Agent 级别 | agent.xxx.permission | 见下方示例 |
{
"agent": {
"file-manager": {
"description": "文件管理 Agent,可访问外部目录",
"permission": {
"external_directory": "allow"
}
},
"safe-agent": {
"description": "安全 Agent,禁止访问外部目录",
"permission": {
"external_directory": "deny"
}
}
}
}| 输入命令 | 解析后的匹配模式 |
|---|---|
git checkout main | git checkout |
npm install | npm install |
npm run dev | npm run dev |
docker compose up | docker compose up |
rm -rf node_modules | rm |
| 命令前缀 | Arity | 说明 |
|---|---|---|
git | 2 | 匹配 git <子命令> |
npm | 2 | 匹配 npm <子命令> |
npm run | 3 | 匹配 npm run <脚本名> |
docker | 2 | 匹配 docker <子命令> |
docker compose | 3 | 匹配 docker compose <子命令> |
rm | 1 | 只匹配 rm |
来源: opencode/packages/opencode/src/permission/arity.ts
{
"permission": {
"bash": {
"*": "ask",
"git status": "allow",
"git diff": "allow",
"git log*": "allow",
"npm run*": "allow",
"rm*": "deny" // 禁止所有删除操作
}
}
}| 选项 | 行为 |
|---|---|
once | 仅批准此次请求 |
always | 批准匹配建议模式的未来请求(当前会话) |
reject | 拒绝请求 |
always 如何工作always 时,OpenCode 会使用工具建议的安全模式来批准后续请求。git status --porcelain 时,建议的模式可能是 git status*,这样后续所有 git status 相关命令都会自动放行。{
"permission": {
"bash": {
"*": "ask",
"git status": "allow"
}
},
"agent": {
"deploy": {
"permission": {
"bash": {
"*": "ask",
"git status": "allow",
"git push": "allow" // 仅 deploy agent 可以 push
}
}
}
}
}注意:Agent 权限会与全局权限合并,Agent 中的规则优先。
tools 配置已被废弃,迁移到 permission:// ❌ 旧语法(已废弃,但仍向后兼容)
{
"tools": {
"bash": true,
"edit": false
}
}
// ✅ 新语法
{
"permission": {
"bash": "allow",
"edit": "deny"
}
}旧配置仍然可用,OpenCode 会自动转换为新格式。
{
"permission": {
"read": {
"*": "allow",
"*.env": "deny",
"*.env.*": "deny",
"*.key": "deny",
"*.pem": "deny",
"credentials/*": "deny"
}
}
}.env 和 .env.* 文件,但允许直接访问 .env.example(示例文件不含敏感信息)。{
"permission": {
"bash": {
"*": "ask",
"git *": "allow",
"npm *": "allow",
"rm -rf *": "deny",
"sudo *": "ask",
"chmod *": "ask"
}
}
}~/.config/opencode/opencode.json 中配置严格权限:{
"permission": {
"external_directory": "deny",
"bash": "ask",
"websearch": "deny",
"webfetch": "deny"
}
}.opencode/opencode.json 中配置宽松权限:{
"permission": {
"read": {
"*": "allow"
},
"edit": {
"src/*": "allow",
"test/*": "allow",
"*.md": "allow"
},
"external_directory": "allow"
}
}opencode.json 中的权限配置allow 规则覆盖默认permission(单数)而非 permissions(复数)| 现象 | 原因 | 解决 |
|---|---|---|
| 权限配置不生效 | 用了 permissions(复数) | 用 permission(单数) |
| 命令被意外拦截 | 规则顺 序问题 | 最后匹配的规则生效,把 * 放最前面 |
| 无法读取 .env | 默认被拒绝 | 显式添加 allow 规则 |
todowrite: {...} 报错 | 只支持简单语法 | 改为 todowrite: "allow" |
git push 被匹配为 git | 没有配置完整命令 | 配置 "git push": "allow" |
| Agent 权限不生效 | 嵌套层级错误 | 确保在 agent.名称.permission 下 |
| 访问外部文件总是弹确认 | external_directory 默认 ask | 设置 "external_directory": "allow" |
| 想禁止访问某些外部路径 | 需要细粒度控制 | 使用对象语法按路径配置 |
permission 配置(单数)write、patch、multiedit 工具使用 edit 权限always 的模式匹配行为external_directory)的配置方法下一课我们将学习主题与快捷键定制。