Разрешения
Управляйте тем, какие действия требуют подтверждения перед выполнением.
OpenCode использует конфигурацию permission, чтобы решить, должно ли заданное действие выполняться автоматически, запрашивать у вас подтверждение или быть заблокированным.
Начиная с v1.1.1, устаревшая булева конфигурация tools объявлена нежелательной и объединена с permission. Старая конфигурация tools по-прежнему поддерживается для обратной совместимости.
Действия
Каждое правило разрешения сводится к одному из:
"allow"— выполнять без подтверждения"ask"— запрашивать подтверждение"deny"— блокировать действие
Конфигурация
Вы можете задать разрешения глобально (с помощью *) и переопределить отдельные инструменты.
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"*": "ask",
"bash": "allow",
"edit": "deny"
}
}Вы также можете задать все разрешения сразу:
{
"$schema": "https://opencode.ai/config.json",
"permission": "allow"
}Детальные правила (объектный синтаксис)
Для большинства разрешений можно использовать объект, чтобы применять разные действия в зависимости от входных данных инструмента.
{
"$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"
}
}
}Правила вычисляются по совпадению с шаблоном, при этом побеждает последнее совпавшее правило. Распространённый приём — поставить общее правило "*" первым, а более конкретные правила — после него.
Подстановочные знаки
Шаблоны разрешений используют простое сопоставление с подстановочными знаками:
*соответствует нулю или более любых символов?соответствует ровно одному символу- Все остальные символы сопоставляются буквально
Раскрытие домашнего каталога
Вы можете использовать ~ или $HOME в начале шаблона для ссылки на ваш домашний каталог. Это особенно полезно для правил external_directory.
~/projects/*->/Users/username/projects/*$HOME/projects/*->/Users/username/projects/*~->/Users/username
Внешние каталоги
Используйте external_directory, чтобы разрешить вызовы инструментов, затрагивающие пути за пределами рабочего каталога, в котором был запущен OpenCode. Это применяется к любому инструменту, который принимает путь на вход (например, read, edit, glob, grep и многие команды bash).
Раскрытие домашнего каталога (например, ~/...) влияет только на то, как записан шаблон. Оно не делает внешний путь частью текущего рабочего пространства, поэтому пути за пределами рабочего каталога всё равно должны быть разрешены через external_directory.
Например, это разрешает доступ ко всему внутри ~/projects/personal/:
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"external_directory": {
"~/projects/personal/**": "allow"
}
}
}Любой разрешённый здесь каталог наследует те же значения по умолчанию, что и текущее рабочее пространство. Поскольку read по умолчанию имеет значение allow, чтение также разрешено для записей внутри external_directory, если не переопределено. Добавляйте явные правила, когда инструмент должен быть ограничен в этих путях, например блокируя правки, но сохраняя возможность чтения:
{
"$schema": "https://opencode.ai/config.json",
"permission": {
"external_directory": {
"~/projects/personal/**": "allow"
},
"edit": {
"~/projects/personal/**": "deny"
}
}
}Держите список сосредоточенным на доверенных путях и добавляйте дополнительные правила allow или deny по мере необходимости для других инструментов (например, bash).
Доступные разрешения
Разрешения OpenCode имеют ключи по имени инструмента, плюс пара защитных механизмов безопасности:
read— чтение файла (сопоставляется с путём к файлу)edit— все изменения файлов (охватываетedit,write,patch)glob— поиск файлов по шаблону (сопоставляется с glob-шаблоном)grep— поиск по содержимому (сопоставляется с regex-шаблоном)bash— выполнение команд оболочки (сопоставляется с разобранными командами, напримерgit status --porcelain)task— запуск субагентов (сопоставляется с типом субагента)skill— загрузка навыка (сопоставляется с именем навыка)lsp— выполнение запросов LSP (в настоящее время без детализации)question— задавание пользователю вопросов во время выполненияwebfetch— получение URL (сопоставляется с URL)websearch— веб-поиск (сопоставляется с запросом)external_directory— срабатывает, когда инструмент затрагивает пути за пределами рабочего каталога проектаdoom_loop— срабатывает, когда один и тот же вызов инструмента повторяется 3 раза с идентичными входными данными
Значения по умолчанию
Если вы ничего не указываете, OpenCode начинает с разрешающих значений по умолчанию:
- Большинство разрешений по умолчанию имеют значение
"allow". doom_loopиexternal_directoryпо умолчанию имеют значение"ask".readимеет значение"allow", но файлы.envпо умолчанию запрещены:
{
"permission": {
"read": {
"*": "allow",
"*.env": "deny",
"*.env.*": "deny",
"*.env.example": "allow"
}
}
}Что делает "Ask"
Когда OpenCode запрашивает подтверждение, интерфейс предлагает три исхода:
once— подтвердить только этот запросalways— подтверждать будущие запросы, соответствующие предложенным шаблонам (до конца текущей сессии OpenCode)reject— отклонить запрос
Набор шаблонов, которые подтвердил бы always, предоставляется инструментом (например, подтверждения bash обычно включают в белый список безопасный префикс команды, такой как git status*).
Агенты
Вы можете переопределять разрешения для каждого агента. Разрешения агента объединяются с глобальной конфигурацией, и правила агента имеют приоритет. Подробнее о разрешениях агентов.
Примечание: Обратитесь к разделу «Детальные правила (объектный синтаксис)» выше для более подробных примеров сопоставления с шаблонами.
{
"$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:
---
description: Code review without edits
mode: subagent
permission:
edit: deny
bash: ask
webfetch: deny
---
Only analyze code and suggest changes.Совет: Используйте сопоставление с шаблонами для команд с аргументами.
"grep *"разрешаетgrep pattern file.txt, тогда как одно лишь"grep"заблокирует это. Команды вродеgit statusработают для поведения по умолчанию, но требуют явного разрешения (например,"git status *") при передаче аргументов.