---
title: Разрешения
description: Контролируйте, какие действия требуют одобрения для выполнения.
---

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

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

---

## Действия

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

- `"allow"` — запуск без одобрения
- `"ask"` — запрос на одобрение
- `"deny"` — заблокировать действие

---

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

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

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

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

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

---

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

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

```json title="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`](#external-directories).

- `~/projects/*` -> `/Users/username/projects/*`
- `$HOME/projects/*` -> `/Users/username/projects/*`
- `~` -> `/Users/username`

### Внешние каталоги

Используйте `external_directory`, чтобы разрешить вызовы инструментов, затрагивающие пути за пределами рабочего каталога, в котором был запущен opencode. Это применимо к любому инструменту, который принимает путь в качестве входных данных (например, `read`, `edit`, `list`, `glob`, `grep` и многие команды `bash`).

Расширение дома (например, `~/...`) влияет только на запись шаблона. Он не делает внешний путь частью текущего рабочего пространства, поэтому пути за пределами рабочего каталога все равно должны быть разрешены через `external_directory`.

Например, это позволяет получить доступ ко всему, что находится под `~/projects/personal/`:

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

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

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

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

---

## Доступные разрешения

Разрешения opencode привязаны к имени инструмента, а также к нескольким мерам безопасности:

- `read` — чтение файла (соответствует пути к файлу)
- `edit` — все модификации файлов (охватывает `edit`, `write`, `patch`, `multiedit`)
- `glob` — подстановка файла (соответствует шаблону подстановки)
- `grep` — поиск по контенту (соответствует шаблону регулярного выражения)
- `list` — список файлов в каталоге (соответствует пути к каталогу)
- `bash` — запуск команд оболочки (соответствует проанализированным командам, например `git status --porcelain`)
- `task` — запуск субагентов (соответствует типу субагента)
- `skill` — загрузка навыка (соответствует названию навыка)
- `lsp` — выполнение запросов LSP (в настоящее время не детализированных)
- `todoread`, `todowrite` — чтение/обновление списка дел.
- `webfetch` — получение URL-адреса (соответствует URL-адресу)
- `websearch`, `codesearch` — поиск в сети/коде (соответствует запросу)
- `external_directory` — срабатывает, когда инструмент касается путей за пределами рабочего каталога проекта.
- `doom_loop` — срабатывает, когда один и тот же вызов инструмента повторяется 3 раза с одинаковым вводом.

---

## По умолчанию

Если вы ничего не укажете, opencode запустится с разрешенных значений по умолчанию:

- Большинство разрешений по умолчанию имеют значение `"allow"`.
- `doom_loop` и `external_directory` по умолчанию равны `"ask"`.
- `read` — это `"allow"`, но файлы `.env` по умолчанию запрещены:

```json title="opencode.json"
{
  "permission": {
    "read": {
      "*": "allow",
      "*.env": "deny",
      "*.env.*": "deny",
      "*.env.example": "allow"
    }
  }
}
```

---

## Что означает «Спросить»

Когда opencode запрашивает одобрение, пользовательский интерфейс предлагает три результата:

- `once` — утвердить только этот запрос
- `always` — одобрять будущие запросы, соответствующие предложенным шаблонам (до конца текущего сеанса opencode).
- `reject` — отклонить запрос

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

---

## Агенты

Вы можете переопределить разрешения для каждого агента. Разрешения агента объединяются с глобальной конфигурацией, и правила агента имеют приоритет. [Подробнее](/docs/agents#permissions) о разрешениях агента.

:::note
Более подробные примеры сопоставления с образцом см. в разделе [Детальные правила (синтаксис объекта)](#granular-rules-object-syntax) выше.
:::

```json title="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:

```markdown title="~/.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.
```

:::tip
Используйте сопоставление с образцом для команд с аргументами. `"grep *"` разрешает `grep pattern file.txt`, а сам `"grep"` блокирует его. Такие команды, как `git status`, работают по умолчанию, но требуют явного разрешения (например, `"git status *"`) при передаче аргументов.
:::
