Русский
Документация
Разрешения

Разрешения

Управляйте тем, какие действия требуют подтверждения перед выполнением.

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

Начиная с v1.1.1, устаревшая булева конфигурация tools объявлена нежелательной и объединена с permission. Старая конфигурация tools по-прежнему поддерживается для обратной совместимости.


Действия

Каждое правило разрешения сводится к одному из:

  • "allow" — выполнять без подтверждения
  • "ask" — запрашивать подтверждение
  • "deny" — блокировать действие

Конфигурация

Вы можете задать разрешения глобально (с помощью *) и переопределить отдельные инструменты.

opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "permission": {
    "*": "ask",
    "bash": "allow",
    "edit": "deny"
  }
}

Вы также можете задать все разрешения сразу:

opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "permission": "allow"
}

Детальные правила (объектный синтаксис)

Для большинства разрешений можно использовать объект, чтобы применять разные действия в зависимости от входных данных инструмента.

opencode.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"
    }
  }
}

Правила вычисляются по совпадению с шаблоном, при этом побеждает последнее совпавшее правило. Распространённый приём — поставить общее правило "*" первым, а более конкретные правила — после него.

Подстановочные знаки

Шаблоны разрешений используют простое сопоставление с подстановочными знаками:

  • * соответствует нулю или более любых символов
  • ? соответствует ровно одному символу
  • Все остальные символы сопоставляются буквально

Раскрытие домашнего каталога

Вы можете использовать ~ или $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/:

opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "permission": {
    "external_directory": {
      "~/projects/personal/**": "allow"
    }
  }
}

Любой разрешённый здесь каталог наследует те же значения по умолчанию, что и текущее рабочее пространство. Поскольку read по умолчанию имеет значение allow, чтение также разрешено для записей внутри external_directory, если не переопределено. Добавляйте явные правила, когда инструмент должен быть ограничен в этих путях, например блокируя правки, но сохраняя возможность чтения:

opencode.json
{
  "$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 по умолчанию запрещены:
opencode.json
{
  "permission": {
    "read": {
      "*": "allow",
      "*.env": "deny",
      "*.env.*": "deny",
      "*.env.example": "allow"
    }
  }
}

Что делает "Ask"

Когда OpenCode запрашивает подтверждение, интерфейс предлагает три исхода:

  • once — подтвердить только этот запрос
  • always — подтверждать будущие запросы, соответствующие предложенным шаблонам (до конца текущей сессии OpenCode)
  • reject — отклонить запрос

Набор шаблонов, которые подтвердил бы always, предоставляется инструментом (например, подтверждения bash обычно включают в белый список безопасный префикс команды, такой как git status*).


Агенты

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

Примечание: Обратитесь к разделу «Детальные правила (объектный синтаксис)» выше для более подробных примеров сопоставления с шаблонами.

opencode.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:

~/.config/opencode/agents/review.md
---
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 *") при передаче аргументов.