Настройки Claude Code живут в файлах settings.json, а не в меню. Меню /config есть, но в нём десяток личных опций вроде темы и режима редактора; всё остальное - права, модель, переменные окружения, хуки, строка состояния - правится в JSON. Файлов четыре, они складываются по приоритету, и знание этого приоритета решает большинство вопросов вида «почему настройка не применилась».
Сама установка тут не разбирается - она в отдельной статье про установку Claude Code и установку на Windows. Здесь про то, что делают сразу после неё.
Что здесь называется настройкой
Установка Claude Code не создаёт ни одного файла настроек. Пока вы ничего не меняли, работают значения по умолчанию, и это нормальное состояние - агент запускается и работает без единой строки конфигурации.
Файлы появляются двумя путями. Либо вы создаёте их сами, либо их создаёт Claude Code: ~/.claude/settings.json - когда вы первый раз меняете что-то в /config, а .claude/settings.local.json - когда вы первый раз отвечаете на запрос разрешения «да, и больше не спрашивай».
Отдельно от них лежит пятый файл, ~/.claude.json, который CLI ведёт для себя. Там сессия входа, конфигурация MCP-серверов, состояние доверия по проектам и глобальные ключи, которые пишет /config. Руками его править не нужно.
Настройки - строгий JSON. Комментарий // или запятая после последнего элемента это синтаксическая ошибка, и при следующем запуске Claude Code покажет Settings Error. Схема для автодополнения и подсветки в редакторе подключается строкой "$schema": "https://json.schemastore.org/claude-code-settings.json" в начале файла.
Четыре файла настроек и кого они касаются
| Область | Файл | На кого действует | Что туда кладут |
|---|---|---|---|
| Пользователь | ~/.claude/settings.json |
Вы, во всех проектах на этой машине | Личное: тема, модель по умолчанию, свои правила прав |
| Проект | .claude/settings.json |
Все, кто работает в этой папке; в репозитории - вся команда | Командные права, хуки, плагины, переменные окружения проекта |
| Проект, локально | .claude/settings.local.json |
Только вы и только в этом проекте | Личные исключения из командного файла, обкатка перед тем как поделиться |
| Управляемые | managed-settings.json, MDM, консоль claude.ai |
Все, кому организация их раскатала | Политика безопасности; переопределить своими файлами нельзя |
На Windows ~/.claude это %USERPROFILE%\.claude. Перенести домашние файлы в другое место можно переменной CLAUDE_CONFIG_DIR - тогда там же окажутся история сессий и плагины.
Локальный файл Claude Code при первой записи сам добавляет **/.claude/settings.local.json в глобальные git-исключения, так что он не попадёт в коммит. Но если файл создали вы руками и Claude Code в него ещё не писал, добавить в .gitignore придётся самому.
Есть неочевидная деталь про расположение локального файла в репозитории: если запустить Claude Code в подкаталоге, читаться и писаться он будет всё равно на корне репозитория, и выданное разрешение подействует на весь репозиторий. В worktree используется файл основного checkout. Исключения из этого правила: работа вне git-репозитория, корень репозитория в домашнем каталоге и Windows - там файл остаётся рядом с .claude/settings.json.
Что победит, если ключ задан в двух местах
Порядок от сильного к слабому:
- Управляемые настройки организации. Не переопределяются ничем из вашего, включая флаг
--settings. - Аргументы командной строки - то, что передано при запуске
claude, на одну сессию. - Локальный файл проекта
.claude/settings.local.json. - Общий файл проекта
.claude/settings.json. - Пользовательский
~/.claude/settings.json.
Отсюда практическое следствие. Команда положила в общий файл "model": "claude-sonnet-5", а вам на этом проекте нужен Opus - не спорьте в общем файле, пропишите свою модель в .claude/settings.local.json. Изменится только у вас.
Списки ведут себя иначе, чем одиночные значения. Ключи-списки - в первую очередь permissions.allow - не перекрываются, а объединяются: правила из всех файлов действуют вместе. Поэтому «убрать» разрешение, добавив пустой список в файл рангом выше, не получится - его надо убирать там, где оно записано, либо перекрывать правилом deny.
Переменные окружения в этот список уровней не входят вовсе. Для каждой пары «переменная - ключ» правило своё: ANTHROPIC_MODEL из вашей оболочки перебивает ключ model из любого файла, а ANTHROPIC_DEFAULT_MODEL применяется только если model не задан нигде.
Права: allow, ask, deny
Права - главное, ради чего вообще открывают settings.json. Правило пишется как Инструмент или Инструмент(уточнение):
{
"permissions": {
"allow": [
"Bash(npm run lint)",
"Bash(npm run test *)",
"Bash(git commit *)"
],
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Bash(git push *)"
]
}
}
Три вида правил: allow разрешает без вопроса, ask заставляет спрашивать всегда, deny запрещает. Проверяются они строго в порядке deny, потом ask, потом allow, и первое совпадение решает исход. Точность правила на порядок не влияет: широкое Bash(aws *) в deny перекроет узкое Bash(aws s3 ls) в allow, поэтому список запретов не умеет иметь исключений.
Про звёздочку стоит знать три вещи, иначе правило будет работать не так, как вы думали.
| Правило | Совпадает | Не совпадает |
|---|---|---|
Bash(npm run build) | npm run build | npm run build --watch |
Bash(npm run *) | npm run build, npm run test --watch, npm run | npm install |
Bash(ls *) | ls -la, ls | lsof |
Bash(ls*) | ls -la, lsof | - |
Bash(git * main) | git merge main, git push origin main | git log |
Первое: пробел перед хвостовой звёздочкой - часть правила, из-за него ls * не ловит lsof. Второе: хвостовая звёздочка с пробелом ловит и голую команду, Bash(ls *) разрешает просто ls. Третье, самое опасное: звёздочку ставят после подкоманды. В Bash(git * main) звёздочка занимает место подкоманды, и правило разрешает любую операцию git, включая push и -c с произвольной программой. Claude Code предупреждает об этом при старте, но предупреждение легко пропустить.
Голое имя инструмента в deny работает жёстче правила с уточнением: "deny": ["Bash"] убирает инструмент из контекста модели совсем, Claude его просто не видит. А Bash(rm *) оставляет инструмент доступным и блокирует конкретные вызовы.
Посмотреть все действующие правила вместе с файлом, откуда каждое пришло, можно командой /permissions прямо в сессии.
Права применяет Claude Code, а не модель. Написанное в промпте и в CLAUDE.md влияет на то, что Claude попытается сделать, но не на то, что ему разрешено. Отзывать доступ надо правилами, режимом или хуком.
Режимы одобрения и defaultMode
Поверх правил лежит режим - им задаётся, что делать со всем, для чего правила не написаны. Режим, с которым стартуют новые сессии, задаётся ключом permissions.defaultMode.
| Значение | Поведение |
|---|---|
default | Спрашивает при первом использовании каждого инструмента. В интерфейсе называется Manual, принимается и алиас manual |
acceptEdits | Правки файлов и обычные файловые команды (mkdir, touch, mv, cp) принимаются сами - в рабочем каталоге и в additionalDirectories |
plan | Читает и запускает команды только на чтение, исходники не правит |
auto | Одобряет вызовы сам, с фоновой проверкой на соответствие вашему запросу |
dontAsk | Запрещает всё, что не разрешено явно правилами |
bypassPermissions | Не спрашивает ничего |
Про bypassPermissions честно: он снимает вопросы в том числе на запись в защищённые пути вроде .git и .claude. Место ему в контейнере или виртуалке, где агент физически не может испортить ничего ценного. Если такой режим не должен появляться у вас в принципе, есть ключи permissions.disableBypassPermissionsMode и permissions.disableAutoMode со значением "disable".
Смежная настройка - permissions.additionalDirectories: список каталогов за пределами рабочего, к которым агент получает доступ к файлам. Это именно доступ к файлам, а не подключение чужих настроек оттуда.
Ключи, которые ставят чаще всего
Ключей в справочнике больше сотни, но в обычном проекте трогают десяток.
| Ключ | Что делает |
|---|---|
model | Модель, с которой стартует сессия. Подробности про выбор - в статье про модели Claude Code |
effortLevel, modelSettings | Уровень усилий по умолчанию, в том числе отдельно для каждой модели |
fallbackModel | Запасные модели, когда основная перегружена. Это упорядоченная цепочка, и она не склеивается из разных файлов - берётся целиком из самого приоритетного |
env | Переменные окружения для каждой сессии |
outputStyle | Роль, тон и формат ответов |
statusLine | Своя команда, которая рисует строку состояния |
hooks | Команды на события жизненного цикла |
cleanupPeriodDays | Сколько дней хранятся расшифровки сессий |
autoCompactEnabled, autoCompactWindow | Автоматическое сжатие контекста и порог, на котором оно включается |
autoMemoryEnabled | Автопамять - заметки, которые Claude пишет себе сам |
attribution | Подпись, которую Claude Code добавляет в коммиты и описания PR. Прежний includeCoAuthoredBy объявлен устаревшим |
defaultShell | Какая оболочка достаётся команде - Bash или PowerShell |
autoUpdatesChannel | Канал обновлений: стабильный вместо последнего |
Часть ключей читается один раз при старте, и правка в работающую сессию не доедет. Из тех, что правят чаще всего: model (менять на ходу через /model), effortLevel и modelSettings (через /effort), outputStyle - он часть системного промпта, поэтому применяется после /clear или перезапуска. Всё остальное, включая permissions и hooks, подхватывается на лету: Claude Code следит за файлами настроек и перечитывает их при изменении.
Настройка на одну сессию
Пробовать значение, не записывая его в файл, можно тремя способами.
Флаг --settings принимает JSON строкой или путь к файлу и встаёт по приоритету выше ваших файлов и ниже управляемых:
claude --settings '{"model": "claude-opus-4-8"}'
У части ключей есть собственные флаги - --model для model, --effort для уровня усилий. И у части есть парная переменная окружения, например ANTHROPIC_MODEL.
Команды внутри сессии, наоборот, обычно запоминают выбор: /config пишет в файлы настроек, /model сохраняет модель как значение по умолчанию для новых сессий. Если нужно переключить модель только здесь и сейчас, в выборе /model есть клавиша s - она переключает без сохранения.
Проверка: что загрузилось и что сломалось
Первое, что стоит сделать после правки файла, - убедиться, что его прочитали. Команда /status в сессии показывает строку Setting sources со списком загруженных файлов. Она отвечает на вопрос «какие файлы прочитаны», но не на вопрос «откуда пришло конкретное значение».
Развёрнутая диагностика - claude doctor. Она печатает в том числе записи, которые Claude Code отбросил: битое правило прав, неизвестное имя события хука, ключ с недопустимым значением.
Как выглядит поломка:
- Settings Error - файл целиком не разобрался. При старте интерактивной сессии появляется диалог: починить с помощью Claude, выйти или продолжить без этого файла.
- Settings Warning - не разобрались отдельные записи. Они пропускаются, остальной файл действует.
- Configuration error - не читается
~/.claude.json. Битый файл копируется в~/.claude/backups/, и предлагается сбросить конфигурацию к умолчанию. Там же лежат пять последних резервных копий, из которых можно вернуть прежнее состояние.
Отдельно про запуск с -p: там диалога нет вообще, битый файл или значение просто пропускается молча. После такого запуска стоит прогнать claude doctor и посмотреть, что именно выпало.
Минимальный набор после установки
То, что имеет смысл сделать один раз и забыть:
- закрыть чтение секретов:
"deny": ["Read(./.env)", "Read(./.env.*)"]; - закрыть то, что нельзя откатить:
Bash(git push *), удаление, деплой; - разрешить рутину, на которой вы устанете жать «да»: линтер, тесты, сборку;
- выбрать
permissions.defaultModeпод свою манеру работы -planдля незнакомого кода,acceptEditsдля своего; - командные права положить в
.claude/settings.jsonи закоммитить, личные исключения - в.claude/settings.local.json; - после каждой правки -
/status, а при сомненияхclaude doctor.
Что осознанно не стоит настраивать в первый день: хуки, песочницу и управляемые политики. Они решают задачи, которых у одного человека на одном проекте ещё нет, а сломать запуск умеют. Про то, где проходит граница безопасности при работе с агентом, - отдельная статья.