Destino Dev

Blog

Publicar um pacote NPM que impressiona recrutadores: semver, CI e docs

Por John Pires · 19 de março de 2026

Publicar um pacote NPM que impressiona recrutadores: semver, CI e docs

1) Problema real que resolve

Contexto prático

Recrutadores e avaliadores técnicos raramente abrem um repositório só por curiosidade: eles procuram sinais rápidos de maturidade de um desenvolvedor. Um pacote NPM público pode ser esse sinal. Mas há diferenças claras entre um pacote que parece amador e outro que transmite competência.

O problema real aqui não é meramente publicar um pacote: é publicar um pacote que comunique disciplina em versionamento, qualidade de entrega e documentação. Isso influencia entrevistas técnicas, retenção de atenção e a percepção sobre o seu código como produto.

O que os recrutadores observam

Em 30–60 segundos um avaliador escaneia: README, badges, scripts de build/test/release, histórico de commits e issues abertas. Um pacote sem testes, sem CI e com changelog manual é interpretado como trabalho em fase experimental — não como componente de produção.

Este artigo trata de como transformar um pacote simples em um artefato que conta uma história: você sabe versionar com semver, automatizar releases com CI e produzir documentação clara. Tudo isso melhora a primeira impressão durante entrevistas.

2) Abordagem ingênua vs abordagem otimizada

O jeito errado (ingênuo)

Descrição do erro: muitos publicam como fazem no projeto pessoal: atualizam version no package.json manualmente, fazem um commit, apertam o botão Publish no npm, e nunca documentam breaking changes. Isso gera versões inconsistentes, changelogs inúteis e histórico de commits confuso.

Consequências práticas: recrutadores veem um changelog com commits tipo "fix stuff" e versões saltando de 1.2.0 para 1.3.5 sem explicação. Isso reduz confiança técnica no autor e diminui chances em entrevistas.

O jeito certo (otimizado)

Princípio: automatize onde erros humanos são previsíveis. Use conventional commits para gerar changelogs e alimentar um fluxo de release automático (semantic-release). Garanta testes automatizados no pipeline e exponha exemplos práticos na README. Esses sinais mostram prática de produção.

Resultado prático: versionamento coerente seguindo semver, changelog legível, badges que mostram build passing e cobertura, e um README com exemplos práticos que o avaliador pode copiar e colar para testar rapidamente.

3) Implementacao com codigo real

Visão do pacote

Vamos trabalhar com um pacote cujo propósito é simples, mas relevante no portfólio: um utilitário para validar e formatar currículos em JSON para exportação em Markdown. Nome fictício: "cv-formatter". O objetivo é demonstrar práticas aplicáveis a qualquer pacote NPM real.

Abaixo há três exemplos de código: package.json com scripts e dependências; um index.js com API mínima; e um workflow GitHub Actions que roda testes e publica via semantic-release.

package.json exemplar

O que faz: define scripts úteis para desenvolvimento, testes e release. Observe o uso de conventional-changelog e semantic-release na configuração de release automatizado.

{
  "name": "cv-formatter",
  "version": "0.0.0-development",
  "description": "Formatador de curriculos JSON para Markdown - exemplo de portfolio",
  "main": "dist/index.js",
  "scripts": {
    "build": "babel src -d dist --copy-files",
    "test": "jest --coverage",
    "lint": "eslint src",
    "prepare": "npm run build",
    "semantic-release": "semantic-release"
  },
  "files": [
    "dist"
  ],
  "repository": {
    "type": "git",
    "url": "git+https://github.com/usuario/cv-formatter.git"
  },
  "license": "MIT",
  "devDependencies": {
    "@babel/cli": "^7.0.0",
    "@babel/core": "^7.0.0",
    "eslint": "^7.0.0",
    "jest": "^27.0.0",
    "semantic-release": "^19.0.0"
  }
}

O que acontece depois: com essa configuração o build roda no prepare (npm install localmente) e o semantic-release será executado no CI, não localmente. Usar version "0.0.0-development" deixa claro que a versão final virá do pipeline.

API mínima (src/index.js)

O que faz: função que recebe um objeto de currículo e retorna Markdown formatado. Exemplo real útil em entrevistas: permite mostrar manipulação de dados, testes e exemplos de uso no README.

/* src/index.js */
function formatExperience(items) {
  return items.map(e => `- **${e.role}** @ ${e.company} (${e.start} - ${e.end || 'presente'})\n  ${e.summary || ''}`).join('\n');
}

function formatCV(cv) {
  const header = `# ${cv.name} \n\n${cv.email} | ${cv.location}`;
  const exp = `\n\n## Experiencia\n\n${formatExperience(cv.experience || [])}`;
  return `${header}${exp}`;
}

module.exports = { formatCV };

O que acontece depois: exportamos uma API mínima. Em entrevistas, você mostra o README com exemplos de uso, copia e cola um JSON de currículo e demonstra o output. Isso vale muito mais que um "hello world".

GitHub Actions: workflow de CI e release

O que faz: roda lint, testes e, no branch main com tags/conventional commits, executa semantic-release para publicar no npm e criar release no GitHub.

# .github/workflows/ci.yml
name: CI
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Use Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '16'
      - run: npm ci
      - run: npm run lint
      - run: npm test --silent

  release:
    runs-on: ubuntu-latest
    needs: build-and-test
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v3
      - name: Use Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '16'
          registry-url: 'https://registry.npmjs.org/'
      - run: npm ci
      - run: npx semantic-release

O que acontece depois: quando commits seguem conventional commits, semantic-release determina automaticamente se será patch/minor/major, atualiza package.json, gera changelog, cria release no GitHub e publica no npm. Isso remove erros humanos no versionamento.

4) Testes e validacao

Testes unitários úteis para o portfólio

Testes no seu pacote mostram disciplina e aumentam credibilidade. Para o exemplo cv-formatter, escreva testes que validam saída Markdown para casos típicos e limites (sem experiência, datas ausentes, caracteres especiais).

Um bom teste de portfólio é simples, claro e demonstra raciocínio: entrada conhecida -> saída esperada. Isso é o que entrevistadores vão ler antes de examinar implementação.

/* tests/index.test.js */
const { formatCV } = require('../dist/index');

test('format minimal cv', () => {
  const cv = { name: 'Ana', email: 'ana@example.com', location: 'SP', experience: [] };
  const md = formatCV(cv);
  expect(md).toMatch('# Ana');
  expect(md).toMatch('ana@example.com');
});

O que acontece depois: o job de CI roda jest e gera coverage. Badges no README mostram cobertura e build passing. Em entrevistas, você pode apontar commits com testes adicionados para cada bug corrigido — isso conta muito.

Validação manual e exemplos no README

Inclua um bloco "Exemplo rápido" no README com o JSON de entrada e o Markdown de saída. Forneça comandos que qualquer avaliador pode rodar: npm i -g cv-formatter; node -e "...". Exemplos práticos reduzem atrito para avaliadores testarem seu pacote.

5) Consideracoes de producao

Semver: regras e armadilhas

Semver existe para comunicação clara: breaking changes = major, novas funcionalidades compatíveis = minor, correções = patch. Um erro comum é incrementar minor para mudanças que quebram a API. Isso demonstra falta de atenção ao contrato público do pacote.

Prática recomendada: documente o contrato público (exports, tipos esperados), e quando refatorar internamente sem alterar a API, mantenha a mesma versão major. Se remover ou renomear exports, aumente major e documente o migration path no changelog.

Segurança, tokens e publish

Não coloque tokens no repo. Configure secrets no CI (NPM_TOKEN, GH_TOKEN). Use accounts dedicadas quando estiver automatizando publish em corporações ou para demonstrações. Isso evita exposição acidental e problemas legais.

Tip: configure publish apenas a partir do branch main e ative proteções de branch para requerer PR reviews antes do merge.

Erros comuns e armadilhas

Lista prática de erros que vejo em code reviews de candidatos:

  • Cometer vers�o diretamente ao publicar no npm localmente e depois esquecer de atualizar no git.
  • Falta de testes que cubram casos de fronteira; testes que dependem de estado externo.
  • README sem exemplos executáveis ou com exemplos obsoletos.
  • Commits com mensagens vagas; sem conventional commits que alimentem release automático.

Corrigir esses pontos rende ganhos imediatos na percepção do seu trabalho em entrevistas.

Conclusao prática

Checklist para uma publicacao que impressiona

Resumo prático que você pode aplicar hoje. Antes de abrir o PR final, passe por essa lista:

  1. Adicionar testes unitários relevantes e garantir coverage mínima aceitável.
  2. Configurar CI para lint/test/build e só permitir merges com status verde.
  3. Adotar convencional commits e semantic-release para automação de versionamento e changelog.
  4. Escrever README com exemplos práticos e badges (build, coverage, npm version).
  5. Proteger tokens e automatizar publish apenas via CI com secrets.

Fechamento — como falar disso em entrevista

Quando o recrutador perguntar sobre seu pacote, seja objetivo: descreva o problema que resolveu, mostre o commit que adicionou testes, a PR que configurou CI e explique como semantic-release resolveu o problema de versionamento. Mostre dados: cobertura, histórico de releases, e um exemplo de API que funciona em 30s.

Esses pontos são o que converte curiosidade em confiança técnica. Não é só código bonito: é processo, automação e documentação que mostram maturidade.

Implementar essas práticas no seu pacote pessoal cria artefatos repetíveis que impressionam. Em code review, a diferença entre "funciona" e "pronto para uso" é sempre visível — e é isso que recrutadores valorizam.

Recomendações finais: escolha uma pequena feature, escreva testes, faça uma PR que adiciona pipeline e release automático, e escreva um README com três comandos claros: instalar, usar, testar. Isso transforma um projeto hobby em um ativo de carreira.

Assuntos: npm, semver, ci, documentation, portfolio

Leia também