До сих пор Claude Code работал в диалоге: ты спрашиваешь, он отвечает, ты одобряешь. Но иногда нужен Claude без собеседника — в скрипте, по расписанию, в CI. Для этого есть .
Один запрос — один запуск
claude -p "В одном предложении: что делает этот репозиторий?"
Claude Code выполняет запрос, печатает ответ и завершается: с кодом 0, если всё прошло, и ненулевым при сбое. Он читает и stdin, поэтому скрипт может передать на вход, например, дифф:
git diff | claude -p "Найди в этом диффе очевидные ошибки" --permission-mode dontAsk
Ответ, который можно разобрать
С флагом --output-format json вместо текста приходит один JSON-объект:
{"type":"result","subtype":"success","is_error":false,"num_turns":2,"result":"…","session_id":"…","permission_denials":[]}
result— сам ответ;is_error— была ли ошибка;subtype—successили причина ранней остановки, напримерerror_max_turns;num_turns— сколько ходов понадобилось;permission_denials— какие действия были отклонены.
Важно: если прогон остановился по лимиту, поля result нет вовсе. Поэтому сначала проверяй код выхода и is_error, и только потом бери ответ.
Режим — всегда явно
В скрипте некому ответить на вопрос о разрешении. Поэтому режим передают всегда: прогон, где его ничто не задаёт, может стартовать в режиме auto.
Три флага задают рамки:
--permission-mode dontAsk— отклоняет всё, что в сессии потребовало бы вопроса;--allowedTools— перечисляет, что всё-таки можно, например"Bash(npm test *)";--max-turns— ограничивает число ходов.
claude -p "Прогони тесты и скажи, сколько прошло" \
--output-format json --permission-mode dontAsk \
--allowedTools "Bash(npm test *)" --max-turns 3
Пробел перед * важен: Bash(npm test *) разрешает npm test с любыми аргументами, включая запуск без аргументов.
Мини-проверка
Скрипт вызывает claude -p и сразу берёт поле result из JSON. Иногда скрипт падает с ошибкой «result is undefined». Почему?
Осторожно
Запуск claude -p не показывает диалог доверия: он выполнит хуки из .claude/settings.json проекта и подключит серверы из .mcp.json даже в папке, которой ты никогда не доверял. Запуская Claude из скрипта в чужом репозитории, добавляй --setting-sources user — тогда настройки и MCP проекта не загрузятся. И помни: если задана переменная ANTHROPIC_API_KEY, такой запуск тратит этот ключ, а не твою подписку.
Практика в терминале