Claude Code сохраняет команду с паролем в git

Автономный прогон упирается в одно и то же: агент останавливается и спрашивает, можно ли выполнить команду. В чате это выглядит как тормоз, и рука сама жмёт "Yes, and don't ask again". 9 ноября 2026 Apiiro показала, чем такая настройка заканчивается в Claude Code: команда сохраняется целиком, вместе с паролем или ключом, в файл `.claude/settings.local.json` внутри репозитория. Тому, кто внедряет ИИ-агентов в разработку, это снимает лишний круг: не переписывать промпт и не менять модель, а запретить кнопку на строках с доступом и не коммитить сам файл. Что клиент кладёт рядом с кодом Речь не про модель, которая "запомнила" секрет и сама выложила его в интернет. Apiiro пишет прямо: так устроен клиент Claude Code, и это повторили на Opus 5.5 и Fable 5.1. Кнопка согласия без повторного вопроса записывает команду так, как её вызвали. Если в строке был пароль, токен или строка подключения к базе, в файл попадает не шаблон "можно вызывать клиент базы". Попадает живой вызов. Файл задуман как локальный. Репозиторий от этого не помечает его приватным. Нет исключения в git - обычный коммит увозит настройку вместе с кодом. На публичном GitHub у Apiiro 104 185 копий `.claude/settings.local.json` в 103 617 репозиториях. В 1 122 файлах, это 1,1%, нашёлся секрет известного формата: ключ провайдера или пароль и токен рядом с публичным хостом. Среди них 379 паролей баз. Если добавить историю git, общий `settings.json` и сохранённые записи чатов агента, счётчик вырастает до 2 539 различных секретов в 1 994 репозиториях. Долю в один с небольшим процент легко прочитать как "почти никого". Для автономных ИИ-агентов это слабое утешение: они как раз просят запомнить команду, чтобы не вставать на каждом доступе. Один пароль базы в публичном файле работает, пока его не сменят. Что проверить до следующего коммита В своей организации на GitHub откройте поиск по `path:.claude/settings.local.json` и отдельно по `settings.json` внутри каталога `.claude`. Файл в текущей ветке - смотрите, нет ли в правиле пароля, ключа или адреса базы. Файл только в истории - секрет всё равно считайте утёкшим и перевыпустите. Убрать его из последней ветки историю не чистит. Дальше порядок жёсткий. Сначала перевыпуск, если строка с секретом уже уехала. Потом `.gitignore`: добавьте `.claude/settings.local.json`, чтобы следующий коммит не повторил то же самое. И только затем договорённость в команде: "don't ask again" нельзя на командах, где в строке пароль, строка подключения или токен. Разрешение должно называть программу и безопасные флаги, а не полную строку вызова. Секрет живёт в окружении. В правиле его значения быть не должно: агент видит, что переменная задана, и не видит её в тексте команды. Мы в Интеллект Технологии на стенде сначала закрыли вопрос исключением в git. Казалось, локальный файл в репозиторий не попадёт, и настраивать ИИ-агента дальше незачем. Сам по себе такой файл приватным не становится: нет исключения в git - обычный коммит увозит настройку вместе с кодом, а в правиле не должно быть значения секрета. Полностью - в блоге: https://inteltek.ru/blog/190