Режимы прав
Каждое подтверждение «да, выполни команду» — это секунда вашего внимания. После десятого подтверждения вы уже не читаете, а кликаете. Режимы прав и правила разрешений существуют, чтобы убрать лишние вопросы, не отдавая контроль над тем, что действительно опасно. В этом уроке разберём, какие режимы есть, как они переключаются, как писать правила в settings.json и в каких условиях допустимо отключить проверки совсем.
Что важно понять сначала
Правила разрешений применяет Claude Code, а не модель. Инструкция в CLAUDE.md «не делай git push» влияет на то, что Claude попытается сделать. Правило deny для Bash(git push *) влияет на то, что Claude Code позволит. Первое — просьба, второе — механизм. Для всего, что нельзя допустить, используйте механизм.
Второе: режим задаёт базовый уровень, правила накладываются сверху. Запрещающие правила действуют в любом режиме, включая полный обход проверок.
Режимы
В настройках режим «спрашивать обо всём» называется default, в интерфейсе — Manual. Остальные режимы отличаются тем, что выполняется без вопроса.
| Режим | Что выполняется без вопроса | Для чего |
|---|---|---|
default (Manual) |
Только чтение файлов и встроенный набор безопасных команд | Незнакомый код, чувствительная работа |
acceptEdits |
Плюс правки файлов и файловые команды: mkdir, touch, mv, cp, rm, sed — только внутри рабочей папки |
Реализация по утверждённому плану |
plan |
Чтение и исследование; правки исходников заблокированы до утверждения плана | Исследование перед изменениями |
auto |
Почти всё; отдельная модель-классификатор проверяет действия и блокирует подозрительные | Длинные задачи с фоновым контролем |
dontAsk |
Только то, что явно разрешено правилами; всё остальное отклоняется без вопроса | CI и скрипты с жёстким списком |
bypassPermissions |
Всё | Только изолированные контейнеры и виртуалки |
Даже в bypassPermissions не одобряются автоматически: инструменты с явным правилом ask, инструменты, требующие ответа человека, и удаление критичных путей вроде корня или домашней папки.
Про auto стоит сказать отдельно. На планах Pro, Max и Team это стартовый режим для интерактивных сессий: действия проверяет классификатор, а не вы, и он останавливает то, что похоже на выход за рамки задачи или обращение к незнакомой инфраструктуре. Организация может отключить этот режим настройкой disableAutoMode.
Как переключать
По ходу сессии — Shift+Tab. Цикл: default → acceptEdits → plan → снова default. Если сессия стартовала в auto, первое нажатие переводит в default. Режим bypassPermissions появляется в цикле только если сессия запущена с соответствующим флагом; dontAsk в цикле не бывает вовсе. Текущий режим виден в строке статуса.
При запуске — флаг --permission-mode:
claude --permission-mode plan
claude --permission-mode acceptEdits
claude -p "исправь ошибки линтера" --permission-mode dontAsk --allowedTools "Bash(pnpm lint *)" "Edit"--dangerously-skip-permissions — то же, что --permission-mode bypassPermissions.
По умолчанию — permissions.defaultMode в файле настроек:
{
"permissions": {
"defaultMode": "plan"
}
}Где именно задавать, имеет значение. Значения auto и bypassPermissions из проектных файлов .claude/settings.json и .claude/settings.local.json не действуют — только из пользовательского ~/.claude/settings.json или из управляемых настроек организации. Остальные режимы можно задавать где угодно. Сделать plan стартовым для проекта, где новые люди часто ломают код, — нормальная практика.
Правила: allow, deny, ask
Правила лежат в settings.json в ключе permissions:
{
"permissions": {
"allow": [
"Bash(pnpm run *)",
"Bash(pnpm test *)",
"Bash(git commit *)",
"Read(./docs/**)"
],
"deny": [
"Bash(git push *)",
"Read(./.env)",
"Read(./.env.*)",
"Edit(./src/generated/**)"
],
"ask": [
"Bash(pnpm publish *)"
]
}
}Приоритет строгий: deny побеждает всё, ask побеждает allow. Широкое deny вроде Bash(aws *) блокирует и то, что разрешено узким allow — исключения из запрета сделать нельзя.
Синтаксис правила — имя инструмента и шаблон в скобках:
Bash(pnpm run *)— любая команда, начинающаяся сpnpm run. Пробел перед*важен:Bash(ls *)не совпадёт сlsof, аBash(ls*)совпадёт.Bash(npm run build)— только эта команда.- Звёздочку ставьте после подкоманды:
Bash(git log *)разрешает все вариантыgit log, аBash(git *)— вообще любой git, включаяgit push. Read(./.env),Edit(./src/generated/**)— файлы. Проверяются только правилаReadиEdit; писатьWrite(...)бесполезно, используйтеEdit.WebFetch(domain:docs.example.com)— запросы к домену.- Голое имя инструмента в
deny(например,"WebFetch") убирает инструмент из контекста модели целиком.
Claude Code понимает составные команды: правило Bash(pnpm test *) не разрешит pnpm test && rm -rf dist, потому что каждая часть проверяется отдельно. Зато он снимает безобидные обёртки: timeout 30 pnpm test совпадёт с тем же правилом.
Управлять правилами удобнее через /permissions: диалог показывает все правила и файл, из которого каждое пришло. Когда вы в ответ на запрос выбираете «да, и больше не спрашивай», правило сохраняется в .claude/settings.local.json в корне репозитория.
Где лежат настройки и что важнее
| Файл | Область | В git |
|---|---|---|
| Управляемые настройки организации | Все пользователи; переопределить нельзя | Разворачиваются централизованно |
~/.claude/settings.json |
Все ваши проекты | Нет |
.claude/settings.json |
Проект, общий для команды | Да |
.claude/settings.local.json |
Проект, только вы | Нет |
Запрет на любом уровне не может быть снят на другом: deny в пользовательских настройках блокирует allow в проектных и наоборот. Команда может закоммитить в .claude/settings.json общий список: разрешить скрипты pnpm, запретить git push и чтение .env. Каждый разработчик добавит своё в локальный файл.
Пример командного файла для веб-проекта агентства:
{
"permissions": {
"defaultMode": "acceptEdits",
"allow": [
"Bash(pnpm install)",
"Bash(pnpm run *)",
"Bash(pnpm test *)",
"Bash(pnpm lint *)",
"Bash(git status *)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(git add *)",
"Bash(git commit *)",
"WebFetch(domain:nextjs.org)"
],
"deny": [
"Bash(git push *)",
"Bash(git reset --hard *)",
"Read(./.env)",
"Read(./.env.*)",
"Edit(./src/generated/**)",
"Edit(./prisma/migrations/**)"
]
}
}Здесь Claude свободно правит код, ставит зависимости, гоняет тесты и коммитит, но не может отправить ветку, затереть историю, прочитать секреты или руками править миграции и сгенерированный код.
Когда «пропустить все проверки» допустимо
--dangerously-skip-permissions соблазнителен: никаких вопросов. Документация формулирует условие однозначно: только в изолированной среде — контейнере, виртуалке, специальной песочнице, — где Claude Code не может причинить вред, и под пользователем без прав администратора. В этом режиме Claude может писать даже в защищённые пути вроде .git и .claude.
Для сценариев «оставить на ночь» есть лучшие варианты. Режим dontAsk с точным списком allow — Claude делает ровно то, что разрешено, и молча отклоняет остальное. Режим auto — классификатор фильтрует опасное. Комбинация acceptEdits плюс allow для команд сборки и тестов покрывает почти всё, что нужно для миграции или обновления зависимостей.
Если организация хочет запретить обход совсем, есть настройка permissions.disableBypassPermissionsMode со значением "disable". Её ставят в управляемые настройки, где она не переопределяется.
Как хуки дополняют правила
Правила описывают шаблоны команд, но не могут проверить содержимое. «Разрешить rm, кроме удаления папки photos/» шаблоном не записать. Для этого есть хук PreToolUse: он видит полную команду, может её проверить скриптом и заблокировать. Хук срабатывает до проверки прав, в любом режиме, включая bypassPermissions. При этом ослабить правила хук не может: если deny совпал, вызов заблокирован независимо от решения хука. Хуки ужесточают, но не расширяют. Подробно — в следующем уроке.
Попробуйте сами
10–15 мин на рабочем месте- Откройте
/permissionsв своём проекте и посмотрите, какие правила уже накопились в.claude/settings.local.jsonот кнопок «больше не спрашивай». Уберите слишком широкие (например,Bash(git *)). - Составьте для проекта командный
.claude/settings.jsonпо образцу выше: разрешите команды сборки и тестов, запретите отправку в удалённый репозиторий и чтение.env. Попросите Claude сделатьgit pushи убедитесь, что запрос отклонён. - Запустите
claude --permission-mode plan, попросите внести правку и посмотрите, как Claude Code блокирует редактирование до утверждения плана. Переключитесь черезShift+Tabи повторите.
Коротко
- Правила применяет Claude Code, а не модель: CLAUDE.md — просьба,
deny— механизм. - Режимы:
defaultспрашивает,acceptEditsпринимает правки,planтолько исследует,autoдоверяет классификатору,dontAskразрешает только явное,bypassPermissions— всё. Shift+Tabпереключает по ходу,--permission-modeпри запуске,permissions.defaultMode— по умолчанию.- Правила
allow/deny/askвsettings.json:Bash(pnpm run *),Read(./.env),Edit(path),WebFetch(domain:...);denyпобеждает всё и на любом уровне. - Полный обход — только в контейнере или виртуалке; для ночных прогонов лучше
dontAskс точным списком илиauto.
Видеоверсия
Сценарий озвучки · 503 слова, ≈ 4 мин
Каждое подтверждение «да, выполни» — секунда вашего внимания. После десятого вы уже не читаете, а кликаете. Режимы прав нужны, чтобы убрать лишние вопросы, не отдавая контроль над тем, что действительно опасно. Разберём, какие режимы есть и как их настраивать.
Сначала главная мысль. Правила разрешений применяет Claude Code, а не модель. Строчка в файле клод-эм-дэ «не делай пуш» влияет на то, что Claude попытается сделать. Запрещающее правило влияет на то, что Claude Code позволит. Первое — просьба, второе — механизм. Для всего, что нельзя допустить, используйте механизм.
Теперь режимы. Обычный режим — в интерфейсе он называется Manual — спрашивает обо всём, кроме чтения файлов и встроенного набора безопасных команд. Режим принятия правок дополнительно принимает изменения файлов и простые файловые команды внутри рабочей папки, но по-прежнему спрашивает про остальное. Режим плана — только исследование, правки заблокированы до утверждения плана. Режим авто — почти всё выполняется, но отдельная модель-классификатор проверяет действия и блокирует подозрительные; на некоторых планах это стартовый режим. Режим «не спрашивать» — выполняется только то, что явно разрешено правилами, остальное молча отклоняется; это для скриптов и CI. И режим полного обхода — выполняется всё.
Переключаются режимы по ходу сессии сочетанием шифт-таб: обычный, принятие правок, план, снова обычный. При запуске — флагом «пермишн-мод». А по умолчанию — настройкой «дефолт-мод» в файле настроек. Есть нюанс: авто и полный обход из проектных файлов не действуют, только из личных настроек или из настроек организации.
Правила лежат в файле сеттингс-джейсон в ключе «пермишнс». Три списка: разрешить, запретить, спрашивать. Приоритет строгий: запрет побеждает всё, «спрашивать» побеждает «разрешить». Правило — это имя инструмента и шаблон в скобках. Например, разрешить любую команду, начинающуюся с «pnpm run». Звёздочка после подкоманды: если разрешить «git» со звёздочкой, разрешится и пуш. Пробел перед звёздочкой важен: без него «ls» совпадёт и с «lsof». Для файлов — правила чтения и редактирования: запретить чтение файла с переменными окружения, запретить редактирование сгенерированного кода. Для веба — правило по домену.
Claude Code понимает составные команды. Правило для тестов не разрешит «тесты, а потом удалить папку», потому что каждая часть проверяется отдельно.
Настройки живут в нескольких файлах. Управляемые настройки организации — переопределить нельзя. Личные — для всех ваших проектов. Проектные — общие для команды, в гите. И локальные проектные — только ваши. Запрет на любом уровне нельзя снять на другом. Хорошая практика для команды: закоммитить в проектный файл разрешения на скрипты сборки, тестов и коммитов и запреты на пуш, жёсткий сброс, чтение секретов и правку миграций. Claude свободно работает с кодом, но не может отправить ветку или затереть историю.
Про полный обход проверок. Документация однозначна: только в изолированной среде — контейнере или виртуалке, где Claude Code не может причинить вред. Для ночных прогонов есть варианты лучше: режим «не спрашивать» с точным списком разрешений, режим авто с классификатором, или принятие правок плюс разрешения на сборку и тесты. Этого хватает почти для любой миграции. А если организация хочет запретить обход совсем, есть настройка, которая его отключает.
И последнее. Правила описывают шаблоны, но не содержимое. «Разрешить удаление, кроме папки с фотографиями» шаблоном не записать. Для этого есть хуки — они видят полную команду и могут её заблокировать в любом режиме. Но ослабить правила хук не может. Хуки ужесточают, но не расширяют. О них — следующий урок.
