Headless-режим claude -p выполняет один неинтерактивный прогон и завершает процесс - это основа скриптов и автоматизации. Успех возвращает код выхода 0, неудача - ненулевой. Тонкость, которую надо знать: ошибки стартовых флагов идут в stderr, а неудача внутри прогона может быть представлена результатом в stdout. Поэтому автоматизация проверяет и код возврата, и структурированный payload - полагаться на что-то одно значит однажды принять сбой за успех.
Ключевой режим для скриптов - bare. Флаг --bare пропускает автоподхват hooks, skills, plugins, MCP, auto memory и CLAUDE.md; это рекомендуемый сейчас режим для скриптов и вызовов SDK и будущий default для -p. Он не читает subscription-OAuth и keychain: для Anthropic API нужен ANTHROPIC_API_KEY или apiKeyHelper в явном --settings, а облачные провайдеры используют свои credentials. Контекст в bare добавляется только явно - через --append-system-prompt, --settings, --mcp-config, --agents, --plugin-dir.
Рядом стоит диагностический --safe-mode. Он сохраняет аутентификацию, модель, встроенные инструменты и permissions, но отключает кастомизации. Это средняя точка для диагностики: если safe-прогон работает, проблему ищут в hook, plugin, MCP, skill, памяти или config-кастомизации. Различие с bare важно: bare - для чистого воспроизводимого прогона в автоматизации, safe-mode - для того, чтобы понять, ломает ли работу именно кастомизация, не теряя при этом аутентификацию и инструменты.
У ввода есть лимиты, которые надо учитывать. Prompt передают аргументом или через stdin, но piped-stdin ограничен 10 МБ; большой лог не встраивают напрямую, а сохраняют в файл и дают путь. Это то же правило узкого контекста: не вставлять безграничный CI-лог в prompt, а сначала отфильтровать или взять хвост, а полный артефакт хранить отдельно. Иначе прогон и дороже, и медленнее, и рискует упереться в лимит на пустом месте.
Форматы вывода определяют, как автоматизация читает результат. text - дефолт; json - один структурированный конверт с result, session_id и метаданными usage и cost; stream-json - события, разделённые переводом строки. Полезно один раз увидеть эти формы рядом. При --json-schema бизнес-результат лежит в structured_output, и required с additionalProperties валидируют на стороне caller: поле format в схеме - аннотация, а не enforcement, поэтому проверку делают сами.
Потоковый вывод требует аккуратного потребителя. Consumer stream-json разбирает типы событий, дожидается финального result и толерантно игнорирует незнакомые возможности - иначе новая версия с новым типом события сломает парсер. События субагентов связываются через parent_tool_use_id. Это тот случай, где детерминированность headless-режима работает на вас, только если парсер написан с запасом на будущие поля, а не жёстко под текущий набор.
Бюджет и разрешения задают guardrails прогона. --allowedTools использует синтаксис permission-правил, --max-turns и --max-budget-usd ограничивают число ходов и стоимость, а таймаут супервизора процесса и sandbox дополняют картину. Полезно один раз увидеть такой закрытый прогон: режим dontAsk, узкий allowlist инструментов, лимиты ходов и бюджета, json на выходе. Но и при всех guardrails caller обязан обрабатывать частичный результат и сбой - лимиты ограничивают расход, а не гарантируют успех.
Непрерывность сессий и завершение тоже подчиняются правилам. --continue продолжает последнюю беседу, --resume по id - конкретную; session_id ловят из JSON, а разрешение привязано к каталогу проекта. Для независимых CI-задач лучше новый детерминированный прогон. Фоновый Bash после финального результата получает около пяти секунд grace; SIGTERM гасит дерево процессов, вызывает SessionEnd-hooks и даёт код 143. Официально для скриптов предпочтителен --bare, а если намеренно тянете project-кастомизации, не называйте прогон bare и проверяйте каждый источник.
# bare: без автоподхвата hooks/skills/plugins/MCP/memory/CLAUDE.md
claude --bare -p "Summarize README.md" --allowedTools Read --output-format json
# schema-ограниченный structured_output (валидируйте required на стороне caller)
claude --bare -p "Extract exported function names from src/index.ts" \
--allowedTools Read --output-format json \
--json-schema '{"type":"object","properties":{"functions":{"type":"array",
"items":{"type":"string"}}},"required":["functions"],"additionalProperties":false}'# Закрытый прогон с guardrails
claude --bare -p "Run focused tests and report failures" \
--permission-mode dontAsk \
--allowedTools "Read,Grep,Glob,Bash(npm test:*)" \
--max-turns 8 --max-budget-usd 2.00 --output-format json
# лимиты ограничивают расход, но caller обрабатывает частичный result/failure