Claude Code без поводка — 5 уровней автономности, от «Accept Edits» до полного автопилота
Claude Code без поводка — 5 уровней автономности, от «Accept Edits» до полного автопилота
Claude Code по умолчанию спрашивает разрешение на каждый чих — редактирование файла, запуск команды, даже git status может потребовать подтверждения. При активной работе это примерно 100 запросов в час. Ты начинаешь штамповать «Yes» не глядя, и вся идея с разрешениями теряет смысл — ты уже не читаешь, что одобряешь.
TL;DR: Есть 5 уровней «развязывания рук» Claude Code — от Shift+Tab (автоприём правок) до полного bypass через
--dangerously-skip-permissions. Золотая середина — allow-правила вsettings.json+ hooks. Bypass на голой машине — путь кrm -rf /.
Уровень 1: Shift+Tab — acceptEdits за секунду
Самый быстрый способ убрать половину попапов — нажать Shift+Tab прямо во время работы. Claude Code переключается в режим acceptEdits: все правки файлов (Edit, Write, MultiEdit) проходят без вопросов.
Нажимаешь ещё раз — попадаешь в Plan Mode (только чтение). Ещё раз — обратно в обычный режим. Цикл: normal → ⏵⏵ accept edits → ⏸ plan mode → normal.
Что важно: acceptEdits не даёт полную свободу. Bash-команды, WebFetch, MCP-инструменты — всё это по-прежнему требует подтверждения. Ты убираешь только половину попапов, связанных с редактированием файлов.
Чтобы каждая сессия стартовала в этом режиме, добавь в .claude/settings.json:
{ "permissions": { "defaultMode": "acceptEdits" } }
Уровень 2: allow-правила в settings.json
Вот тут начинается настоящая гибкость. В settings.json можно прописать конкретные инструменты и команды, которые Claude Code будет запускать без вопросов.
Файл лежит в одном из трёх мест:
~/.claude/settings.json— глобально для всех проектов.claude/settings.json— для конкретного проекта (коммитится в git).claude/settings.local.json— для проекта, но не коммитится
Пример конфига для типичного Node.js-проекта:
{ "permissions": { "allow": [ "Edit", "MultiEdit", "Write", "Bash(npm run *)", "Bash(npx *)", "Bash(node *)", "Bash(git status)", "Bash(git diff *)", "Bash(git log *)", "Bash(git add *)", "Bash(git commit *)", "Bash(ls *)", "Bash(cat *)", "Bash(mkdir *)", "WebFetch(domain:code.claude.com)", "WebFetch(domain:github.com)" ], "deny": [ "Bash(rm -rf *)", "Bash(git push *)", "Bash(git reset --hard *)", "Bash(curl *)", "Read(./.env)", "Read(./.env.*)" ] } }
Правила проверяются в порядке: deny → ask → allow. Deny всегда побеждает. Поэтому даже если ты разрешил Bash(*), deny-правило на rm -rf его заблокирует.
Подстановочный знак * работает как glob: Bash(npm run *) матчит npm run test, npm run build, но не матчит npm run test && rm -rf / — Claude Code понимает операторы шелла вроде && и не даёт обойти правило через цепочку команд.
Уровень 3: allowedTools через CLI
Для одноразовых сессий удобнее флаг --allowedTools:
claude --allowedTools "Edit" "Bash(npm run *)" "Bash(git *)"
Это разрешает указанные инструменты только для текущей сессии, не трогая settings.json. Удобно для CI/CD или когда нужно дать Claude Code свободу на конкретную задачу.
Уровень 4: hooks — умный автопилот
Начиная с Claude Code v2.0, hooks — рекомендованный способ управления разрешениями вместо --dangerously-skip-permissions. Хук — это скрипт, который запускается перед каждым вызовом инструмента и решает: одобрить, запросить подтверждение или заблокировать.
Конфигурация в .claude/settings.json:
{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": ".claude/hooks/validate-bash.sh" } ] } ] } }
А вот сам скрипт .claude/hooks/validate-bash.sh, который блокирует опасные команды и пропускает безопасные:
#!/bin/bash
COMMAND=$(jq -r '.tool_input.command')
# Блокируем деструктивные команды
if echo "$COMMAND" | grep -qE 'rm -rf|mkfs|dd if=|chmod -R 777|> /dev'; then
jq -n '{
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "deny",
permissionDecisionReason: "Деструктивная команда заблокирована хуком"
}
}'
exit 0
fi
# Одобряем безопасные команды без запроса
if echo "$COMMAND" | grep -qE '^(npm |npx |node |git |ls |cat |echo |mkdir |pwd|find )'; then
jq -n '{
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "allow"
}
}'
exit 0
fi
# Всё остальное — спрашиваем у пользователя
exit 0
Преимущество хуков перед allow-правилами: ты можешь реализовать любую логику — проверять содержимое файлов, валидировать URL в curl-запросах, логировать все команды в файл для аудита.
Есть также хук PermissionRequest — он запускается, когда Claude Code уже решил показать диалог разрешения, и тоже может одобрить или отклонить запрос программно.
Уровень 5: --dangerously-skip-permissions — полный bypass
Ядерная кнопка. Отключает все проверки разрешений:
claude --dangerously-skip-permissions "Сделай рефакторинг всего проекта"
Или через settings.json:
{ "permissions": { "defaultMode": "bypassPermissions" } }
Claude Code будет запускать любые команды, редактировать любые файлы, делать запросы куда угодно — без единого вопроса.
Anthropic прямо предупреждает: этот режим только для изолированных сред. Контейнер, VM, sandbox — но никогда на хост-машине.
Подводные камни
rm -rf / — не теория, а практика. В октябре 2025 разработчик Mike Wolak работал над прошивкой с --dangerously-skip-permissions. Claude Code выполнил rm -rf начиная с корня файловой системы. Логи показали тысячи "Permission denied" для /bin, /boot, /etc — команда пыталась удалить всё, и остановилась только там, где файловые права Linux не пустили. В январе 2026 разработчик James McAulay потерял ~11 ГБ файлов аналогичным образом, причём в task list Claude пометил "Delete user data folder: Completed".
deny-правила не всегда работают. По нескольким GitHub Issues (#6631, #12918, #27040), deny-правила в settings.json иногда не срабатывают. Для критичных ограничений лучше дублировать deny-правило хуком PreToolUse, который гарантированно блокирует команду через exit 1 или permissionDecision: "deny".
acceptEdits не защищает от Bash. Если ты привык к режиму acceptEdits и думаешь, что контролируешь ситуацию — помни: Claude Code может вызвать деструктивную Bash-команду, и acceptEdits её не заблокирует. Этот режим автоматизирует только файловые операции через встроенные Edit/Write инструменты.
Bypass не работает с Remote Control. Если ты используешь Remote Control для удалённого управления Claude Code — флаг --dangerously-skip-permissions там не поддерживается. Придётся одобрять каждое действие вручную.
allow-правила для Bash хрупкие с URL. Правило вроде Bash(curl http://github.com/ *) легко обходится: curl -X GET, другой протокол, переменные, редиректы. Для контроля сетевых запросов лучше заблокировать curl/wget через deny и использовать WebFetch(domain:github.com) — официальная документация рекомендует именно этот подход.
Вердикт
Из пяти уровней реальную пользу без риска дают два: allow-правила в settings.json (уровень 2) для ежедневной работы и hooks (уровень 4) когда нужна кастомная логика. Shift+Tab (уровень 1) — быстрый костыль на 5 минут. --dangerously-skip-permissions (уровень 5) — только в Docker-контейнере, и даже там стоит добавить хук, блокирующий rm -rf.
Оптимальная стратегия: начни с allow-правил для своего стека (npm, git, стандартные команды), добавь deny на всё деструктивное, и только если этого мало — пиши хуки. Полный bypass — крайняя мера для одноразовых задач в изоляции.
Как попробовать
-
Создай
.claude/settings.jsonв корне проекта (если нет) и добавь allow-правила для своих частых команд —Bash(npm run *),Bash(git *),Edit -
Добавь deny-правила для опасного:
"deny": ["Bash(rm -rf *)", "Bash(git push --force *)", "Bash(git reset --hard *)"]
-
Проверь, что правила подхватились — запусти Claude Code и выполни
/permissions -
Попробуй
Shift+Tabво время работы — увидишь⏵⏵ accept edits onвнизу терминала -
Для продвинутых: создай
.claude/hooks/validate-bash.shиз примера выше, добавь его вhooks.PreToolUseв настройках и получишь умный автопилот вместо тупого "Yes to all"
Документация по разрешениям: code.claude.com/docs/en/permissions. Документация по hooks: code.claude.com/docs/en/hooks. Документация по settings: code.claude.com/docs/en/settings.