Перейти к содержимому

Разрешения

Разрешения решают, может ли агент выполнить действие над ресурсом: команду оболочки, правку файла, загрузку навыка и так далее.

Правило — три строки: 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" }]
}