Linha de comando¶
Toda fatia também instala um comando que você pode disparar de um shell ou de um cron job, sem nenhuma conversa com LLM envolvida. As CLIs não dependem do Claude como cliente MCP; as etapas que dão nota ou rascunham continuam chamando o backend de LLM do config.yaml, e --no-eval faz um scan sem nenhuma chamada de LLM.
Saída e códigos de saída¶
Todo comando moonlighter-*, e o moonlighter doctor, imprime exatamente um documento JSON no stdout (os logs vão para o stderr) e sai com o código abaixo — o moonlighter puro é o servidor MCP via stdio e o moonlighter init é um assistente interativo, então nenhum dos dois imprime JSON:
| Código | Significado |
|---|---|
0 |
sucesso |
1 |
nada a fazer (nenhuma vaga nova, vaga não encontrada, nenhuma pergunta) |
2 |
erro de uso ou de config |
3 |
erro inesperado — o JSON então traz kind: "error" e o traceback vai para o stderr |
Comandos¶
| Comando | O que faz |
|---|---|
moonlighter-scan [--phase all] [--keywords ...] |
Roda um scan; --company SOURCE SLUG escaneia um portal só. --no-eval descobre e grava as vagas como needs_review sem chamar o LLM — dê nota depois com verify_job. |
moonlighter-apply prepare JOB_ID [--paste FILE] |
Compõe a folha pronta para colar; --paste - lê o texto da página do stdin. |
moonlighter-apply prepare --url URL [--company X --title Y] [--paste FILE] |
Ingere a vaga primeiro: pela API do ATS quando a URL tem um formato conhecido, senão a partir da própria página, com --company e --title informados; grava sem nota e depois prepara. Nenhuma chamada de LLM na ingestão. |
moonlighter-apply bootstrap-cv [--force] [--skip] |
Rascunha um banco de CV e um template a partir do profile.yaml — veja CV sob medida. |
moonlighter-email sync |
Classifica respostas recentes e avança candidaturas. Sozinho, ele não alimenta o banco de respostas; quem faz isso é o sync_email_responses do servidor MCP. |
moonlighter-email register JOB_ID |
Marca uma vaga como candidatada à mão e gera o alias de rastreio +ref dela, para que as respostas a ela sejam casadas pelo sync. |
moonlighter-scan doctor · moonlighter-apply doctor · moonlighter-email doctor · moonlighter doctor |
Onde o estado mora e se a config carrega, em JSON; sai com 1 quando a config está faltando ou é inválida. |
O exemplo acima sai com 1 em todo dia sem novidade (nenhuma vaga nova), o que dispara set -e/pipefail num script que o encadeia com jq — confira o código de saída antes de tratar isso como falha do script. --no-eval é zero-LLM, não offline: o archive_stale_jobs continua fazendo requisições HTTP para checar se vagas já salvas fecharam.
O que cada instalação oferece¶
Os cinco pacotes são fatias de uma ferramenta só. Instale as que você precisa; cada comando conta no --help o que consegue fazer nessa combinação e o que uma fatia faltando acrescentaria, e o doctor imprime o mesmo em JSON.
Cada pacote funciona sozinho, e instalar dois faz eles trabalharem juntos: o resultado do scan alimenta o prepare, e o +alias que uma folha de respostas cria é o mesmo que o sync usa para casar os e-mails de retorno. O moonlighter instala os três mais o moonlighter-core. Todo comando moonlighter-* imprime um único documento JSON, seja o que for que você instale.
| Você instala | Você ganha |
|---|---|
moonlighter-scan |
moonlighter-scan: portais e feeds escaneados, vagas com nota (ou gravadas sem nota com --no-eval), as fechadas arquivadas |
moonlighter-apply |
moonlighter-apply prepare: a folha pronta para colar, a partir de um id de vaga ou direto de uma URL |
moonlighter-email |
moonlighter-email register e sync: candidaturas registradas à mão, respostas do Gmail casadas de volta com elas |
moonlighter-scan + moonlighter-apply |
um script só: escaneia, escolhe pela nota, prepara uma folha para cada uma |
moonlighter-apply + moonlighter-email |
o alias de rastreio que uma folha gera é o mesmo que o sync usa para casar as respostas |
moonlighter (tudo) |
tudo isso acima, mais o servidor MCP para o Claude Code e a promoção para o banco de respostas quando uma resposta avança uma candidatura |