> · 7 мин

Claude Code без поводка — 5 уровней автономности, от «Accept Edits» до полного автопилота

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 — крайняя мера для одноразовых задач в изоляции.

Как попробовать

  1. Создай .claude/settings.json в корне проекта (если нет) и добавь allow-правила для своих частых команд — Bash(npm run *), Bash(git *), Edit

  2. Добавь deny-правила для опасного:

"deny": ["Bash(rm -rf *)", "Bash(git push --force *)", "Bash(git reset --hard *)"]
  1. Проверь, что правила подхватились — запусти Claude Code и выполни /permissions

  2. Попробуй Shift+Tab во время работы — увидишь ⏵⏵ accept edits on внизу терминала

  3. Для продвинутых: создай .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.

$ ls ./related/

Похожие статьи

subscribe.sh

$ cat /dev/blog/updates

> Свежие заметки о программировании,

> DevOps и AI — прямо в мессенджер

./subscribe