Objetivo: ao final, o consultor roda o Claude Code como um comando de shell dentro de um pipeline, e sabe exatamente qual flag garante que o resultado não dependa da máquina onde rodou.
-p (ou --print) roda o Claude uma vez, sem interface: lê a entrada padrão, escreve na saída padrão e encerra — é um comando de shell como qualquer outro, com teto de 10 MB no stdin.-p não pula a descoberta do ambiente local. Sem flag adicional, ele carrega o mesmo contexto de uma sessão interativa: hooks, skills, plugins, servidores MCP, memória automática e CLAUDE.md. A flag que pula tudo isso é --bare.--bare com --permission-mode dontAsk (módulo 2.5.3) ou --allowedTools, e autentique por ANTHROPIC_API_KEY — porque bare também pula OAuth e keychain.-p fazgit diff main...release/qas-0730 | claude -p "resuma as mudanças deste diff como nota de transporte: um bullet por objeto, com o impacto funcional"
| Comportamento | Detalhe |
|---|---|
| Roda uma vez, sem interface | Faz o trabalho e encerra; nenhuma tela interativa |
| Lê a entrada padrão | Aceita pipe de qualquer comando; limite de 10 MB — acima disso, encerra com erro e status diferente de zero |
| Escreve na saída padrão | Redireciona para arquivo, encadeia em pipe, alimenta outro programa |
| Aceita todas as flags do CLI | Inclusive --allowedTools, --continue, --output-format, --permission-mode |
| Aceita skill e comando no prompt | /nome-da-skill dentro da string do prompt é expandido antes de rodar. Comandos que só existem no terminal, como /login, não funcionam |
-p não roda limpoEsta é a afirmação que mais circula errada sobre headless, e vale ler duas vezes:
Sem
--bare,claude -pcarrega o mesmo contexto que uma sessão interativa carregaria, incluindo qualquer coisa configurada na pasta de trabalho e no~/.claudeda máquina.
Na prática, isso significa que um claude -p dentro de um pipeline pode se comportar de forma diferente em duas máquinas:
| O que existe na máquina | Com -p sozinho |
Com --bare -p |
|---|---|---|
Hook no ~/.claude de quem rodou |
Roda | Não roda |
Servidor MCP no .mcp.json do projeto |
Sobe | Não sobe |
| Skills e plugins instalados | Carregam | Não carregam |
Memória automática e CLAUDE.md |
Entram no contexto | Não entram |
| Ferramentas disponíveis | As do ambiente + o que você autorizar | Bash, leitura e edição de arquivo + o que você passar por flag |
Para CI e script, é --bare que dá o mesmo resultado em toda máquina, porque ele simplesmente nunca lê essas fontes. A documentação recomenda --bare como o modo padrão para chamada de script e SDK, e avisa que ele deve se tornar o comportamento padrão de -p numa versão futura — mais uma razão para escrever o script já com a flag explícita, em vez de depender do padrão de hoje.
| Para carregar | Use |
|---|---|
| Instrução de sistema adicional | --append-system-prompt, --append-system-prompt-file |
| Settings | --settings <arquivo-ou-json> |
| Servidor MCP | --mcp-config <arquivo-ou-json> |
| Agentes customizados | --agents <json> |
| Plugin | --plugin-dir <caminho>, --plugin-url <url> |
Autenticação em modo bare: como ele pula OAuth e leitura de keychain, defina ANTHROPIC_API_KEY no ambiente ou configure um apiKeyHelper no JSON de --settings. Amazon Bedrock, Google Cloud e Microsoft Foundry usam as credenciais habituais do provedor.
O módulo 2.5.3 já resolveu o "qual modo". Aqui é só como passar por linha de comando:
| Forma | Quando |
|---|---|
--allowedTools "Read,Edit,Bash(git diff *)" |
Caso simples, com poucas ferramentas nomeadas. Segue a sintaxe de regra de permissão: o espaço antes do * importa |
--permission-mode dontAsk |
Execução travada, de CI: nega tudo que não estiver nas suas regras de allow ou no conjunto de comandos somente-leitura, sem parar para perguntar |
--permission-mode acceptEdits |
Deixa escrever arquivo e rodar comandos comuns de arquivo sem perguntar; outro comando de shell ainda precisa de allow explícito |
Vale um reconhecimento honesto: a maior parte do trabalho ABAP não vive em git. Objeto ABAP mora no repositório do próprio sistema, e ordem de transporte não é commit. Headless não muda isso. Onde ele se aplica de fato no Meridiano:
| Onde funciona | Exemplo |
|---|---|
| Stack aberta — CAP, Fiori, extensões BTP | Changelog de release, revisão de diff, geração de nota de transporte a partir do diff |
| Scripts operacionais de BASIS | Resumir log de job, classificar dump, gerar relatório de execução em lote |
| Documentação versionada | Verificar se a especificação funcional acompanhou a mudança de objeto |
| Artefatos exportados | Diff de export de customizing ou de definição de objeto salvo em arquivo, versionado à parte |
Para o mundo ABAP puro, o caminho não é headless em cima de git — é o Claude lendo artefatos exportados e documentação, que é justamente onde a Wayon versiona material de projeto.
Regra Wayon Todo
claude -pque entra em pipeline ou script compartilhado leva--bareobrigatoriamente. Sem ela, o resultado passa a depender do que está instalado na máquina de quem rodou — hook de colega, servidor MCP de projeto,CLAUDE.mdde outra pasta — e um pipeline que muda de comportamento por máquina não é um pipeline. Chave de API em pipeline sempre por secret do runner, nunca no arquivo do workflow.
📖 Run Claude Code programmatically · Bare mode · CLI reference
claude -p e afirma na revisão: "não precisa se preocupar com o CLAUDE.md da pasta nem com os hooks da máquina, porque -p não carrega nada disso". A afirmação está:-p é justamente o modo que roda sem o ambiente localÉ a crença mais comum sobre headless, e é falsa: -p sozinho carrega o mesmo contexto de uma sessão interativa.
--bare, -p carrega hooks, skills, plugins, MCP e CLAUDE.md como uma sessão normalCorreto. É --bare que pula a descoberta; -p apenas tira a interface.
CLAUDE.mdNão há essa divisão: sem --bare, todas essas fontes são carregadas.
Pode acontecer, mas há uma causa muito mais comum quando a flag de isolamento está ausente.
--modelMudaria o estilo da resposta, não explica comportamento divergente de ferramentas e hooks.
~/.claude, MCP do projeto, CLAUDE.md); acrescente --bareCorreto. --bare nunca lê essas fontes, e é por isso que ele é o modo recomendado para script e CI.
--bare ao comando do pipeline e a execução passou a falhar na autenticação, embora a mesma máquina rode claude interativo sem problema.ANTHROPIC_API_KEY no ambiente ou um apiKeyHelper via --settingsCorreto. É a consequência direta de não ler as fontes locais.
--bare é incompatível com -p e por isso a sessão não autenticaSão combináveis; claude --bare -p é exatamente a forma recomendada.
claude login antes de cada execução do pipelineNão resolve: bare não lê o resultado do login guardado no keychain.
claude -p. Ele precisa ler arquivos de log e rodar dois comandos de git, e não pode ficar pendurado esperando aprovação que ninguém vai dar às 3h. -----permission-mode bypassPermissions, para garantir que nada bloqueieRemove toda checagem de segurança; pela regra Wayon (2.5.3), só dentro de container ou VM isolada, nunca num job com acesso a material de projeto.
Em Manual o job para no primeiro pedido de aprovação e fica pendurado a noite inteira — o problema exato que 2.5.3 descreve.
--allowedTools com as ferramentas exatas, ou --permission-mode dontAskCorreto. Don't ask nega o que não está pré-aprovado em vez de travar, e é o modo da execução desassistida.