Lançamento· Construindo o Currículo para Vaga · parte 1
Depois de 20 anos de carreira, publiquei meu primeiro pacote no npm.
Como coloquei a CLI do Currículo para Vaga no npm com GitHub Actions, teste no Node 22.13, empacotamento em monorepo e a correção do ./ no npm publish.

Em mais de 20 anos de carreira, eu nunca tinha publicado um pacote no npm até as 10h15 de 8 de novembro de 2026. Saiu na organização luis-junior que tenho no npm, sob licença MIT, a versão 1.0.0 de @luis-junior/curriculo-para-vaga.
Esse pacote entrega a CLI do Currículo para Vaga, meu SaaS em produção desde 2 de novembro em curriculoparavaga.com.br, citado antes sem nome em um dev sozinho com IA. A proposta cabe na descrição do pacote: nota ATS, análise de vaga e ajuste de currículo para vagas no Brasil, do terminal ou do seu agente de IA. Enquanto a extensão de navegador do produto espera a aprovação da Chrome Web Store, qualquer pessoa ou agente de IA já usa o serviço por uma linha no terminal.
Uma linha no terminal roda o produto com ou sem conta
Quem quiser usar sem instalar roda npx @luis-junior/curriculo-para-vaga ats curriculo.pdf --job <link da vaga> ou executa pelo bunx. Para instalar na máquina, o comando é npm i -g @luis-junior/curriculo-para-vaga, que habilita os atalhos cpv e curriculo-para-vaga. O ambiente precisa de Node.js 22.13 ou mais novo na linha 22, ou 23.5 em diante.
Dois comandos funcionam grátis e sem conta, com limite de 3 análises ATS e 2 planos por dia. O cpv ats calcula a nota de 0 a 100 na triagem automática e mostra o que corrigir primeiro. O cpv plan informa a compatibilidade com a vaga, até onde a nota pode subir e o plano de melhoria.
Três comandos cobrem os recursos pagos do produto. O cpv improve reescreve o currículo para a vaga, aceitando de 1 a 10 vagas de uma vez, e a reescrita nunca inventa cargo, empresa, data, diploma nem número. Completam a lista o cpv letter, que escreve a carta de apresentação, e o cpv linkedin, que ajusta o perfil do LinkedIn.
Agentes e humanos passam pela mesma API sem pagamento automático
A CLI e o servidor MCP do Currículo para Vaga seguem uma mesma decisão de arquitetura: nenhum dos dois tem regra própria. Os dois chamam a mesma API pública, que por sua vez chama os mesmos procedimentos usados pelo painel. Assim o comportamento continua único tanto no navegador quanto no terminal.
Para agentes de código, cpv install-skill --agent all instala uma skill para o Claude Code e o Codex, apresentada na página para agentes. Quando a execução acontece fora de um terminal, a opção --json liga sozinha e imprime um objeto por linha, com o resultado final na última, enquanto os erros saem em JSON no stderr.
O comando cpv login conecta a CLI à conta da pessoa. A chave salva fica vinculada ao endereço da API que a emitiu e nunca vai para outro endereço. Além disso, a CLI nunca paga sozinha: uma compra mostra o QR e o código do PIX junto com o link da página do pedido, e espera a pessoa pagar.
O caminho seguro da tag ao pacote fechado no monorepo
Para publicar a CLI com segurança, empurro uma tag cli-v<versão> e um workflow do GitHub Actions executa todas as travas antes de enviar ao registro. Quem mantém uma CLI em monorepo pode repetir exatamente esta sequência:
- Conferir se a tag bate com a versão declarada no
package.json. - Rodar os testes e fazer o build.
- Confirmar que a CLI abre na versão mínima suportada do Node com
npx node@22.13.0 ... --version. - Empacotar com
bun pm pack, que escreve no pacote as versões reais das dependências internas do monorepo. - Publicar o arquivo
.tgzgerado no npm.
Validar a abertura no Node 22.13 evita publicar um binário que exige recursos presentes apenas numa versão mais nova instalada no runner. Essa conferência garante que a versão mínima prometida seja de fato respeitada antes do envio ao registro.
Um ponto e uma barra separaram a falha das 10h01 da saída às 10h15
A primeira tentativa de publicar falhou no último comando. Sem prefixo de caminho relativo, npm publish dist-cli/<arquivo>.tgz foi lido pelo npm como um atalho de repositório do GitHub no formato usuário/repositório, e o comando tentou clonar um repositório em vez de ler o pacote local.
A correção foi colocar ./ na frente do arquivo: npm publish ./dist-cli/<arquivo>.tgz. Esse ajuste entrou às 10h01, e o pacote saiu publicado às 10h15.
O provenance do npm ficou desligado porque exige repositório público, e o repositório do produto é privado. Quando o repositório abrir, entram juntos --provenance, a permissão id-token: write e o campo repository. Enquanto minhas aplicações web seguem o modelo de publicar da minha máquina, distribuir um pacote público pede tag conferida e teste na versão mínima prometida.