Разрешения
Разрешения решают, может ли агент выполнить действие над ресурсом: команду оболочки, правку файла, загрузку навыка и так далее.
Правила
Заголовок раздела «Правила»Правило — три строки: action, resource, effect. Типовой случай —
спрашивать перед командами оболочки, разрешить рутинный git и навсегда
запретить пуши:
{ "permissions": [ { "action": "shell", "resource": "*", "effect": "ask" }, { "action": "shell", "resource": "git status *", "effect": "allow" }, { "action": "shell", "resource": "git diff *", "effect": "allow" }, { "action": "shell", "resource": "git push *", "effect": "deny" } ]}| Поле | Значение |
|---|---|
action |
действие инструмента или разрешения |
resource |
путь, команда, URL, запрос, id навыка или агента |
effect |
allow, deny или ask |
| Эффект | Результат |
|---|---|
allow |
выполнить без вопроса |
deny |
заблокировать |
ask |
спросить пользователя |
Если ни одно правило не подошло — считается ask. Побеждает последнее
подходящее правило, поэтому общие правила стоят раньше исключений.
Совпадение
Заголовок раздела «Совпадение»Действия и ресурсы сравниваются целиком, с простыми масками: * — любое
количество символов, включая /; ? — ровно один символ; остальное — как
есть. Обратные слэши нормализуются в прямые, на Windows сравнение не
учитывает регистр.
{ "permissions": [ { "action": "edit", "resource": "packages/docs/*.mdx", "effect": "allow" } ]}Маска команды, оканчивающаяся на *, покрывает и команду без аргументов:
git status * подходит и для git status, и для git status --short.
Одна операция может проверять несколько ресурсов (например, патч трогает
несколько файлов): любой deny блокирует операцию, иначе любой ask
спрашивает, иначе операция разрешена.
Действия
Заголовок раздела «Действия»| Действие | Ресурс |
|---|---|
read |
путь файла |
edit |
путь для инструментов edit, write, patch |
glob |
запрошенный glob-шаблон |
grep |
запрошенное регулярное выражение |
shell |
строка команды (составная команда даёт несколько проверок) |
subagent |
id агента |
skill |
id навыка |
question |
* |
webfetch |
запрошенный URL |
websearch |
поисковый запрос |
external_directory |
граница каталога вне проекта (обычно /* на конце) |
<сервер>_<инструмент> |
* — инструмент MCP-сервера |
opencode_list_mcp_resources |
имя MCP-сервера |
opencode_read_mcp_resource |
<сервер>:<uri> |
execute |
*; запрет убирает Code Mode и доступные только через него инструменты |
Для read, edit и external_directory значения ~, ~/, $HOME,
$HOME/ раскрываются при загрузке конфигурации; ресурсы shell остаются
текстом команды и не раскрываются.
Каталоги вне проекта
Заголовок раздела «Каталоги вне проекта»Путь вне рабочей папки и её git-рабочей копии сначала проверяется по
external_directory, затем по правилам read/edit. По умолчанию доступ
вне проекта разрешён без вопроса; чтобы спрашивать перед любым таким
доступом:
{ "permissions": [ { "action": "external_directory", "resource": "*", "effect": "ask" } ]}Узкие правила после него могут разрешать или запрещать конкретные каталоги:
{ "permissions": [ { "action": "external_directory", "resource": "~/projects/reference/*", "effect": "allow" }, { "action": "read", "resource": "~/projects/reference/*", "effect": "allow" }, { "action": "edit", "resource": "~/projects/reference/*", "effect": "deny" } ]}Значения по умолчанию
Заголовок раздела «Значения по умолчанию»Каждый агент начинает с базовой политики: всё разрешено, но чтение *.env
и *.env.* — с вопросом (.env.example разрешён). Поверх неё добавляются
правила агентов: build разрешает вопросы, plan запрещает правки, кроме
файлов плана, general запрещает вопросы и запуск субагентов, explore
запрещает всё, кроме shell, чтения, glob и grep, веб-запросов и
веб-поиска и внешних каталогов; чтение .env он спрашивает.
Глобальные правила применяются раньше правил агента, а правила агента дописываются в конец — они уточняют общие, а не заменяют их. Субагент пользуется своими разрешениями, а не подмножеством родительских.
Подтверждения
Заголовок раздела «Подтверждения»Когда правило даёт ask, клиент предлагает выбор:
| Выбор | Ответ | Результат |
|---|---|---|
| Allow once («Разрешить») | once |
разрешить только этот запрос |
| Allow always («Разрешать всегда») | always |
разрешить и сохранить предложенные шаблоны инструмента для проекта |
| Reject («Запретить») | reject |
отклонить этот и все остальные запросы разрешений в сессии |
Сохранённые подтверждения — это устойчивые правила allow с областью
проекта: они никогда не перекрывают настроенный deny. Шаблон выбирает
инструмент: для оболочки — префикс команды (git status *), для навыков и
субагентов — их id, другие предлагают *. Пересматривайте широкие
подтверждения и убирайте ненужные.
В неинтерактивных запусках (zubrcode run, CI) спрашивать не у кого:
используйте --auto (разрешить всё, что не запрещено явно) либо заранее
пропишите правила в opencode.json. Настроенные deny действуют всегда.
Политики поверх разрешений
Заголовок раздела «Политики поверх разрешений»Политика может жёстко запретить проверку разрешений — она
превращает allow и ask в deny и никогда ничего не разрешает:
{ "policies": [{ "action": "tool.use", "resource": "shell:sudo *", "effect": "deny" }]}