{"_id":"@9bitts/prumo","name":"@9bitts/prumo","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"@9bitts/prumo","version":"0.2.0","description":"CLI que verifica se o projeto está no prumo antes do deploy: env, segredos, dependências, segurança e higiene.","license":"MIT","author":{"name":"9bitts"},"publishConfig":{"access":"public"},"type":"module","bin":{"prumo":"dist/cli.js"},"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"engines":{"node":">=20"},"scripts":{"build":"tsup","dev":"tsup --watch","start":"node server.mjs","site":"node server.mjs","test":"vitest run","test:watch":"vitest","lint":"eslint src tests","format":"prettier --write .","format:check":"prettier --check .","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"keywords":["cli","ci","security","env","secrets","pre-deploy","checklist"],"repository":{"type":"git","url":"git+https://github.com/9bitts/prumo.git"},"bugs":{"url":"https://github.com/9bitts/prumo/issues"},"homepage":"https://github.com/9bitts/prumo#readme","dependencies":{"commander":"^13.1.0","fast-glob":"^3.3.3","picocolors":"^1.1.1","zod":"^3.24.2"},"devDependencies":{"@eslint/js":"^9.22.0","@types/node":"^22.13.10","eslint":"^9.22.0","prettier":"^3.5.3","tsup":"^8.4.0","typescript":"^5.8.2","typescript-eslint":"^8.26.1","vitest":"^3.0.8"},"gitHead":"191a5af3c7022d21029cc59ac3a35d61fbd20622","_id":"@9bitts/prumo@0.2.0","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-NN5opfP5CKPyKWFIKUslmsJDhWcTNbyltbLjI8KdbcMXYdDi6Mte5oYkh4pIDABah8od7ntiwS2tJI70gN9SWA==","shasum":"756775dd170aa746a7ae74770b9b4e2f37575172","tarball":"https://registry.npmjs.org/@9bitts/prumo/-/prumo-0.2.0.tgz","fileCount":11,"unpackedSize":616790,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFu2dgkhVFwh4H7WOGJRy14WLOyCAhLegR6v0IUg3nHDAiEAiV+XV8jrM0VFzENuOQAjE6YNN07ehrfU4RgxRqfC5/s="}]},"_npmUser":{"name":"9bitts","email":"diegoalbs@proton.me"},"directories":{},"maintainers":[{"name":"9bitts","email":"diegoalbs@proton.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/prumo_0.2.0_1786010588601_0.5943540122616866"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-06T10:03:08.456Z","0.2.0":"2026-08-06T10:03:08.780Z","modified":"2026-08-06T10:03:09.011Z"},"maintainers":[{"name":"9bitts","email":"diegoalbs@proton.me"}],"description":"CLI que verifica se o projeto está no prumo antes do deploy: env, segredos, dependências, segurança e higiene.","homepage":"https://github.com/9bitts/prumo#readme","keywords":["cli","ci","security","env","secrets","pre-deploy","checklist"],"repository":{"type":"git","url":"git+https://github.com/9bitts/prumo.git"},"author":{"name":"9bitts"},"bugs":{"url":"https://github.com/9bitts/prumo/issues"},"license":"MIT","readme":"# prumo\r\n\r\nCLI que roda **antes do deploy** e verifica se o projeto está no prumo: variáveis de ambiente, segredos vazados, dependências, configuração de segurança e higiene do repositório.\r\n\r\nUm comando, saída legível, exit code confiável para CI. Zero rede, zero LLM.\r\n\r\n**Site / docs:** rode localmente com `npm start` (serve a pasta `site/`). Em produção, o Railway deve usar o start command `node server.mjs`.\r\n\r\n## Instalação\r\n\r\n```bash\r\nnpx @9bitts/prumo@0.2.0\r\n# ou\r\nnpm install -g @9bitts/prumo\r\n```\r\n\r\nRequer **Node.js 20+**.\r\n\r\n## Uso\r\n\r\n```bash\r\nprumo                      # analisa o diretório atual\r\nprumo -C ./apps/web        # outro diretório\r\nprumo --ci                 # sem cor (CI)\r\nprumo --json               # saída máquina\r\nprumo --sarif              # GitHub code scanning\r\nprumo --fix                # correções seguras (.env.example, .gitignore)\r\nprumo --only env,segredos\r\nprumo --skip higiene\r\nprumo --fail-on aviso\r\nprumo --filter @scope/app  # pacote do monorepo\r\nprumo --update-baseline    # grava prumo.baseline.json\r\nprumo --timeout 20000\r\nprumo --list\r\n```\r\n\r\n### Exit codes\r\n\r\n| Code | Significado |\r\n|------|-------------|\r\n| 0 | Sem findings ativos no limiar de `--fail-on` |\r\n| 1 | Findings que quebram o build |\r\n| 2 | Falha interna ou config inválida |\r\n\r\nErro em um check **nunca** derruba os demais, mas qualquer falha interna produz exit `2`.\r\n\r\n## Configuração (`prumo.config.json`)\r\n\r\n```json\r\n{\r\n  \"disabledChecks\": [\"deps-unused\"],\r\n  \"ignorePaths\": [\"vendor/**\", \"legacy/**\"],\r\n  \"severityOverrides\": {\r\n    \"hygiene-console-debugger\": \"info\"\r\n  },\r\n  \"secretsHistoryCommits\": 20,\r\n  \"failOn\": \"erro\",\r\n  \"baselinePath\": \"prumo.baseline.json\",\r\n  \"checkEnvInCi\": false,\r\n  \"workspaces\": false\r\n}\r\n```\r\n\r\n- `deps-unused` vem **desabilitado por padrão** (muito ruído). Remova da lista para ativar.\r\n- `workspaces: true` analisa a raiz e todos os pacotes do monorepo; use `--filter` para um pacote.\r\n\r\n## Baseline\r\n\r\nSuprime findings conhecidos sem desligar o check:\r\n\r\n```bash\r\nprumo --update-baseline   # cria/atualiza prumo.baseline.json\r\nprumo --ci                # findings do baseline não quebram o build\r\n```\r\n\r\n## Checks\r\n\r\n| ID | Categoria | Gravidade | Descrição |\r\n|----|-----------|-----------|-----------|\r\n| `env-missing-in-example` | env | erro | Vars usadas no código ausentes em `.env.example` |\r\n| `env-missing-in-environment` | env | aviso | Vars do `.env.example` ausentes (pula em CI por padrão) |\r\n| `env-file-tracked` | env | erro | `.env` versionado no git |\r\n| `secrets-in-files` | segredos | erro | Segredos em arquivos (padrões + entropia) |\r\n| `secrets-in-history` | segredos | erro | Segredos nos últimos N commits |\r\n| `deps-unused` | dependencias | info | Declarados e não importados (opt-in) |\r\n| `deps-missing` | dependencias | erro | Importados e não declarados |\r\n| `deps-should-be-dev` | dependencias | aviso | Deps de prod que parecem de desenvolvimento |\r\n| `deps-lockfile` | dependencias | erro | Lockfile ausente ou dessincronizado |\r\n| `security-headers` | seguranca | aviso | Headers ausentes (CSP, HSTS, XCTO, Referrer-Policy) |\r\n| `security-cors-wildcard` | seguranca | erro | CORS com origem `*` |\r\n| `hygiene-gitignore` | higiene | erro | `.gitignore` incompleto |\r\n| `hygiene-large-files` | higiene | aviso | Arquivos versionados > 5MB |\r\n| `hygiene-console-debugger` | higiene | aviso | `console.log` / `debugger` |\r\n| `hygiene-blocking-todos` | higiene | erro | `TODO(BLOCKING)` |\r\n| `hygiene-license-readme` | higiene | aviso | Ausência de LICENSE ou README |\r\n| `build-script-missing` | build | aviso | Script `build` ausente |\r\n| `build-ts-strict` | build | aviso | TypeScript sem `strict` |\r\n| `build-node-engines` | build | aviso | `engines.node` não declarado |\r\n| `docker-root-user` | docker | aviso | Dockerfile sem USER não-root |\r\n| `docker-env-secrets` | docker | erro | Segredos em `ENV` no Dockerfile |\r\n| `docker-latest-tag` | docker | aviso | Imagem com tag `:latest` |\r\n\r\n## CI / GitHub Actions\r\n\r\nWorkflow de exemplo: [`.github/workflows/prumo.yml`](.github/workflows/prumo.yml).\r\n\r\nAction composta:\r\n\r\n```yaml\r\n- uses: 9bitts/prumo@main\r\n  with:\r\n    fail-on: erro\r\n```\r\n\r\n## Hook pre-push (opcional)\r\n\r\n```bash\r\ncp scripts/pre-push .git/hooks/pre-push\r\n```\r\n\r\n## Como escrever um check novo\r\n\r\n1. Crie `src/checks/meu-check.ts` implementando `Check`.\r\n2. Registre em `src/checks/index.ts`.\r\n3. Adicione testes com fixture que passa e que falha.\r\n4. Documente na tabela acima.\r\n\r\nUse `readCtxFile(ctx, path)` para ler arquivos (cache por contexto).\r\n\r\n## Desenvolvimento\r\n\r\n```bash\r\nnpm install\r\nnpm run build\r\nnpm test\r\nnpm run lint\r\n```\r\n\r\nStack: Node 20+ · TypeScript strict · tsup · commander · picocolors · fast-glob · zod.\r\n\r\n## Licença\r\n\r\nMIT — veja [LICENSE](LICENSE).\r\n\r\nPendências: [docs/PENDENCIAS.md](docs/PENDENCIAS.md) · Changelog: [CHANGELOG.md](CHANGELOG.md).\r\n","readmeFilename":"README.md","_rev":"1-6cc3c46f9911f1b4737bd744f158bb54"}