Sobre o projeto
AI Shipcheck é um scanner de prontidão para produção local que visa aplicações amplamente escritas por ferramentas de codificação com IA. Sua premissa: assistentes de IA são bons em produzir código que roda, menos bons em produzir código que sobrevive à produção, e relatam o trabalho como concluído de qualquer forma. O Shipcheck procura lacunas recorrentes e entediantes — uma tabela Supabase sem row-level security, um route handler que grava sem verificar o chamador, uma variável NEXT_PUBLIC_ contendo um segredo, um endpoint LLM sem limite de taxa ou limite de tokens.
O uso é um único comando:
npx ai-shipcheck .
Sem cadastro, sem chave de API, sem upload de código-fonte. Requer Node.js 22 ou mais recente. As opções incluem --fail-on (por exemplo, critical), --min-score, --format (json, markdown, sarif) e um subcomando explain que documenta por que uma regra existe e como corrigi-la. Achados sozinhos nunca fazem o comando falhar; os limites são opcionais, então adicioná-lo a um pipeline existente é reversível. Os códigos de saída distinguem limites atingidos, não atingidos, erros de uso e erros internos.
O que ele verifica
Nove categorias são pontuadas independentemente, respaldadas por 63 regras, cada uma com documentação, um fixture vulnerável, um fixture seguro e testes:
- Segurança: credenciais embutidas no código, segredos atrás de NEXT_PUBLIC_, eval, injeção de shell, redirecionamentos abertos, CORS permissivo, verificação de TLS desativada, criptografia fraca.
- Autenticação: rotas de escrita sem verificações de autorização, server actions não autenticadas, verificações de privilégio apenas no navegador, webhooks não verificados, JWTs não assinados, chaves de service-role expostas.
- Banco de dados: tabelas sem row-level security, políticas USING (true), SQL construído por interpolação, exclusões sem filtro, migrações destrutivas.
- Confiabilidade: erros engolidos, timeouts ausentes em caminhos de requisição, rejeições não tratadas, retentativas sem backoff, builds que ignoram erros de tipo.
- Testes: sem testes, CI sem test/build/typecheck, .only commitado, código de servidor sem teste referenciador.
- Observabilidade: sem monitoramento de erros, logging de servidor apenas no console, sem React error boundary.
- Desempenho: consultas sem limite, I/O síncrono em handlers, padrões N+1, imports pesados no cliente.
- Acessibilidade: texto alt ausente, click handlers em elementos não interativos, controles de formulário sem rótulo, tabIndex positivo.
- Custo de IA: endpoints LLM sem autenticação ou limite de taxa, sem limite de tokens, seleção de modelo controlada pela requisição, chaves de provedor no navegador.
As stacks detectadas incluem Next.js (ambos os roteadores), React, Vite, Express, Fastify, Hono, NestJS, Remix, Astro, SvelteKit, Nuxt, Supabase, Firebase, Prisma, Drizzle, Mongoose, Stripe, OpenAI, Anthropic, Vercel AI SDK, LangChain, tRPC e test runners comuns. Regras específicas de framework só são executadas quando o framework é detectado, incluindo monorepos.
Saída e integração
O relatório mostra uma pontuação, um veredito, barras por categoria e achados com arquivo, linha, regra, severidade e confiança. Um bloqueador força NOT READY independentemente da pontuação. Categorias que não podem ser avaliadas são excluídas em vez de receberem um 100 gratuito. Uma GitHub Action anota achados inline no diff, escreve um relatório Markdown no resumo do job, produz SARIF para code scanning e gera como saída score, verdict, critical-count e high-count; ela é empacotada em um único arquivo commitado para que um workflow fixado por tag execute exatamente aquele código.
Confiança e escopo
A ferramenta não faz chamadas de rede e não envia telemetria; nada no repositório escaneado é executado — os arquivos são lidos como bytes e analisados lexicalmente. Segredos são mascarados onde quer que possam ser impressos, os scans são limitados e informam quando truncados, e há uma única dependência de runtime.
As limitações declaradas são explícitas: apenas JavaScript e TypeScript; a análise é lexical e não semântica, sem raciocínio entre arquivos ou informações de tipo e com taint tracking que segue um valor por um salto, então um wrapper de autenticação personalizado que ela não reconhece pode produzir um falso positivo. Rotas Express e Fastify não são cobertas pelas regras de autenticação, descrito como a maior lacuna conhecida. A infraestrutura é invisível para ela, então uma tabela com RLS habilitado em um dashboard mas ausente das migrações é relatada como não avaliada, não como segura. Um relatório limpo significa que as verificações que ela sabe fazer não encontraram nada, não que o código esteja correto.
As regras foram validadas contra 20 repositórios públicos fixados por commit SHA; a triagem de sua saída supostamente reduziu os achados de 5.710 para 2.819 e revelou um bug de lexer afetando números de linha em arquivos com comentários multilinha. A documentação cobre regras, contrato da CLI, configuração, pontuação, modelo de confiança, limitações, modelo de ameaças, arquitetura, adição de uma regra, lançamento e governança. Licenciado sob MIT.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.