Scripts
Saída JSON, fluxos, códigos de saída, variáveis de ambiente, e execução sem supervisão ou em CI.
Saída JSON
Com --json, stdout contém só JSON, indentado com dois espaços, enquanto as notas e o progresso ficam em stderr, e nada pede entrada. Uma lista mostra { items, hasMore, nextCursor }, um objeto da API é mostrado tal como a API o devolveu, e um comando escrito à mão mostra o objeto que a sua ajuda descreve.
openemail whoami --json | jq -r .workspaceIdopenemail emails list --status failed --json | jq -r ".items[].id"Um erro vai para stderr como uma única linha de JSON, e o código de saída é o que uma pessoa receberia:
{"error":{"type":"permission_error","code":"insufficient_scope","message":"This API key does not have the domains:write scope.","hint":"The credential is missing a scope this call needs. Use a key that has it, or sign in again with openemail login.","next":null,"status":403,"requestId":"req_7Hc2kQ","param":null,"docUrl":"https://openemail.uk/docs/api/errors#insufficient_scope","exitCode":4}}| Campo | O que contém |
|---|---|
| type | O tipo de erro da API, ou cli_error, network_error ou internal_error para uma falha dentro da CLI |
| code | Um código estável como insufficient_scope, not_signed_in ou unknown_flag |
| message | O que correu mal, numa frase |
| hint, next | O que tentar, e o comando a executar a seguir, ou null |
| status, requestId, param, docUrl | Da API quando o erro veio dela, caso contrário null |
| exitCode | O código de saída com que o processo termina |
Fluxos
Parte da saída é um fluxo de objetos JSON, um por linha, para que um pipeline trate cada item assim que chega:
- Uma lista de recursos com
--allquando stdout não é um terminal, ou com--ndjson.--max <n>para depois desse número de itens. openemail temp watch --json, uma linha por mensagem nova.openemail mcp serve, uma mensagem JSON-RPC por linha em cada sentido.
openemail contacts list --all > contacts.ndjsonopenemail emails list --status failed --all --max 500 | jq -r .idCódigos de saída
| Código | Significado |
|---|---|
| 0 | Concluído |
| 1 | Uma falha inesperada, um erro do servidor ou um envio que falhou |
| 2 | Um erro de utilização: um argumento errado, um comando ou uma opção desconhecidos, um valor ou uma confirmação que não pôde ser pedida, ou uma origem ou um caminho para os quais a CLI não envia uma credencial |
| 3 | Sem sessão iniciada, ou o início de sessão foi recusado, expirou ou terminou enquanto o comando corria |
| 4 | Não permitido: falta um scope ou uma permissão, um código de verificação que não pôde ser pedido ou está em pausa, ou uma chave de API onde é preciso um início de sessão no navegador |
| 5 | Não encontrado |
| 6 | Um conflito com o estado atual |
| 7 | A entrada era inválida |
| 8 | Limite de pedidos atingido, ou a quota de IA está esgotada |
| 9 | A rede falhou ou excedeu o tempo |
| 10 | Cancelado: recusou uma confirmação ou um pedido |
| 130, 143 | Parado com Ctrl+C, ou por SIGTERM |
Variáveis de ambiente
| Variável | O que faz |
|---|---|
| OPENEMAIL_API_KEY | Uma chave de API a usar em vez de qualquer perfil guardado |
| OPENEMAIL_PROFILE | O perfil guardado a usar |
| OPENEMAIL_BASE_URL | A origem da API para OPENEMAIL_API_KEY, --api-key e comandos que não enviam credenciais. Um início de sessão guardado só vai para a API em que iniciou sessão |
| OPENEMAIL_APP_URL | A origem da aplicação web, para o início de sessão, open e as ligações para a documentação |
| OPENEMAIL_CONFIG_DIR | Onde ficam os perfis e os tokens de caixa, ~/.openemail se não estiver definida |
| OPENEMAIL_NO_UPDATE_CHECK | Nunca procurar no npm uma versão mais recente. OPENEMAIL_DISABLE_UPDATE_NOTICE faz o mesmo |
| NO_COLOR, FORCE_COLOR=0 | Sem cor |
| CI | Nunca perguntar, nunca abrir um navegador, nunca procurar atualizações. A maioria dos serviços de CI é reconhecida sem ela |
| VISUAL, EDITOR | O editor que send e reply abrem para um corpo |
Execuções sem supervisão
A CLI só pergunta quando stdin e stdout são ambos terminais, e não se aplica nenhum de --json, --no-input ou CI. Caso contrário:
- Um valor obrigatório em falta para com o código de saída
2e indica a opção a passar. - Um comando destrutivo para com
Refusing to run unattended. Pass --yes to confirm.e o código de saída2, a menos que passe--yes. - Uma alteração que precisa de um código de verificação para com o código de saída
4, porque ninguém o pode escrever. Use uma chave de API, ou execute primeiroopenemail verify.
Em CI
Dê ao trabalho uma chave de API só com os scopes de que precisa, guarde-a num segredo e deixe OPENEMAIL_API_KEY transportá-la. Nada é guardado, nada pede entrada e não corre nenhuma verificação de atualizações.
- name: Tell the team env: OPENEMAIL_API_KEY: ${{ secrets.OPENEMAIL_API_KEY }} run: | npx -y @openemail/[email protected] send \ --from [email protected] \ --to [email protected] \ --subject "Deployed ${{ github.sha }}" \ --text "Build ${{ github.run_number }} is live." \ --idempotency-key "deploy-${{ github.run_id }}"ADDRESS=$(npx -y @openemail/[email protected] temp new --ttl 15)./signup-test.sh "$ADDRESS"npx -y @openemail/[email protected] temp watch --first --json | jq -r .snippetnpx -y @openemail/[email protected] temp delete --yesfailed=$(openemail emails list --status failed --json | jq ".items | length")test "$failed" -eq 0Passe --idempotency-key num envio que um pipeline possa repetir, e derive-a do que tornou o envio necessário, como um id de execução. Repetir o passo devolve então o primeiro envio em vez de enviar duas vezes.