Bastidores

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.

Um terminal com o comando npx do Currículo para Vaga e a nota ATS de um currículo na tela.

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:

  1. Conferir se a tag bate com a versão declarada no package.json.
  2. Rodar os testes e fazer o build.
  3. Confirmar que a CLI abre na versão mínima suportada do Node com npx node@22.13.0 ... --version.
  4. Empacotar com bun pm pack, que escreve no pacote as versões reais das dependências internas do monorepo.
  5. Publicar o arquivo .tgz gerado 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.

Teste local verde até no S23, e o staging ainda achou um defeito.08 nov · DesenvolvimentoOutra IA revisou 4.170 traduções da IA em inglês e corrigiu 307.08 nov · Inteligência artificialA conta live do Stripe estava ativa, mas falhou na minha conferência.08 nov · LançamentoTrês regras de HSTS num só domínio: por que deixei o preload de fora.08 nov · DesenvolvimentoUma palavra a menos derrubou 13 páginas que já estavam no ar.08 nov · DesenvolvimentoOutro agente de IA revisou meu código 71 vezes e criou dois defeitos.08 nov · Inteligência artificialDepois de 20 anos de carreira, publiquei meu primeiro pacote no npm.08 nov · LançamentoSozinho com IA: iPhone, Android, SaaS com MCP e CLI, e já faturando.07 nov · BastidoresCopiei a mecânica dos líderes e recusei a mentira deles.07 nov · BastidoresA pergunta de LGPD que trava a venda: e o backup?07 nov · ProdutoA IA calibrou minha câmera pelos números. Ficou cara de lanterna.07 nov · BastidoresUm usuário não via o dia de ontem. Abri todo o passado do Garfim.07 nov · Produto62% baixavam o Garfim. O problema estava antes da página.07 nov · LançamentoO idioma certo na tela pode virar o errado no servidor.07 nov · DesenvolvimentoO limite de 10 por minuto que deixou passar muito mais.07 nov · DesenvolvimentoUm PR do Dependabot travou meu banco e as rotas voltaram 500.07 nov · DesenvolvimentoMeus produtos novos não começam do zero. Começam de um clone.07 nov · DesenvolvimentoTirei uma trava da minha IA e a resposta caiu de 5,5 s para 3,7 s.07 nov · DesenvolvimentoTroquei velocidade por uma auditora que confere cada frase.07 nov · Inteligência artificialEscrevi o método CERNE lendo seis especificações reais.07 nov · Inteligência artificialComo anunciar na Meta e vender online no CPF sem abrir empresa.05 nov · BastidoresPausei anúncios depois de ignorar o resultado anterior.05 nov · BastidoresComo depurei um erro de API sem log no registro do Garfim.05 nov · DesenvolvimentoComo forçar atualização no React Native antes de um defeito grave.05 nov · DesenvolvimentoComo levei o LCP do ClipLeve de 9,9 s para menos de 1,5 s.05 nov · DesenvolvimentoPubliquei 650 páginas contra a regra do meu método.05 nov · Inteligência artificialUma conta para organizar erros, métricas e IA dos meus produtos.05 nov · BastidoresSeparei o painel do site e pus o Access na porta.05 nov · DesenvolvimentoUma lista de 69 itens encontrou requisitos só no papel.05 nov · BastidoresO antispam esperou tanto que parou o formulário.05 nov · DesenvolvimentoCortei a publicação de 17 minutos para 4 na minha máquina.05 nov · DesenvolvimentoEu gravo. A IA corta, legenda e entrega o vídeo curto.05 nov · Inteligência artificialComo criar anúncios UGC com IA usando o método PROVA.05 nov · Inteligência artificialA IA disse que usou as skills. A página provou o contrário.05 nov · Inteligência artificialNove páginas reprovadas antes de encontrar uma identidade.05 nov · Inteligência artificialEm 48 horas, juntei domínios, e‑mail, sites e medição num padrão só.30 out · BastidoresPor que tirei os três sites do GPT Sites.30 out · DesenvolvimentoComo troquei o luisjunior.ai com cerca de 10 segundos fora do ar.30 out · DesenvolvimentoRefiz o luisjunior.ai do zero: cada afirmação com prova.30 out · LançamentoUm padrão para todos os domínios, inclusive os de produtos futuros.30 out · BastidoresTodo o e‑mail dos meus domínios saiu do VPS num só dia.30 out · DesenvolvimentoDecidi mover o envio do Garfim do Resend para a Cloudflare.30 out · DesenvolvimentoO método FONTE para aparecer no Google e nas respostas de IA.30 out · Inteligência artificialTrês sites, três decisões de busca, e uma delas é não gerar páginas.30 out · Inteligência artificialMedição de vários sites num painel só, com consentimento.30 out · BastidoresComo a IA me apresenta mídias para aprovação29 out · Inteligência artificialO Garfim chegou ao Google Play. Agora tem Android e iPhone.22 out · LançamentoConseguir testadores e esperar 14 dias: a reta final do Garfim no Android.22 out · BastidoresO ClipLeve chegou à App Store. O que aprendi até aqui.20 out · LançamentoO ClipLeve foi rejeitado de novo. Dessa vez, por uma palavra.20 out · ProdutoO Garfim foi aprovado. E já está na App Store.16 out · LançamentoA última negativa do Garfim: câmera, assinatura e o caminho inteiro.16 out · LançamentoClipLeve: o cuidado por trás de um vídeo mais leve.12 out · ProdutoPor que restaurar uma assinatura pode falhar em outra conta.12 out · ProdutoQuando um aplicativo pode dizer que sua conta foi excluída?12 out · ProdutoO que a primeira negativa da App Store me fez explicar.08 out · LançamentoO que quero aprender com o teste fechado do Garfim.08 out · ProdutoO trabalho de uma assinatura continua depois da compra.03 out · DesenvolvimentoPor que o Garfim ganhou um plano gratuito.03 out · ProdutoO login funcionou. Por que a tela do Garfim não saiu do lugar?03 out · LançamentoPagenello: um site começa pelo que o visitante veio fazer.03 out · LançamentoComo uma foto do almoço vira um produto.27 set · ConcepçãoAs decisões que continuo tomando ao desenvolver com IA.27 set · DesenvolvimentoApresentar o Garfim ao público também é um teste do produto.27 set · Lançamento

GET luisjunior.ai/llms.txt

Esta é a versão do site escrita para modelos de linguagem: os mesmos fatos, sem layout, prontos para um assistente de IA ler e citar. Agentes no Chrome também encontram aqui ferramentas WebMCP para consultar produtos, textos e contato.

conectando…0 tokens · 0 tok/s