Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
230 changes: 57 additions & 173 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -1,216 +1,100 @@
# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
# CodeRabbit Configuration - Nikolas de Hor projects
# Template universal: cobre stacks variadas (Next.js, React, FastAPI, Python CLI, MCP servers, Flutter, Static, Shell)
# Template React/Vite/TS + Supabase

language: "pt-BR"
tone_instructions: "Seja profissional, construtivo e focado em qualidade. Comentários em português do Brasil. Sem em dashes (— ou –), usar hífens (-) ou vírgulas. Nome do autor: Nikolas de Hor. Goiânia sempre com acento."
tone_instructions: "Assertivo. Bugs, segurança e performance. pt-BR, hífens, sem em-dashes."
# 68 chars

early_access: false

reviews:
profile: "assertive"
request_changes_workflow: true
high_level_summary: true
review_status: true
poem: false
sequence_diagrams: true
estimate_code_review_effort: true

auto_review:
enabled: true
drafts: false
base_branches:
- main
drafts: false
auto_incremental_review: false

request_changes_workflow: false
high_level_summary: true
poem: false
review_status: true
collapse_walkthrough: false

path_instructions:
- path: "**/*.{ts,tsx,js,jsx}"
instructions: |
TypeScript/JavaScript geral. Verificar:
- Tipos estritos quando possível (evitar any sem justificativa).
- Async/await sem unhandled promise rejection.
- Imports organizados (sem ciclos).
- Sem console.log esquecido em produção.
- Sem credenciais hardcoded ou tokens.
- process.env validado (não usar undefined silenciosamente).

- path: "**/*.{py}"
instructions: |
Python geral. Verificar:
- PEP 8 e type hints quando aplicável.
- try/except específico (não capturar Exception nu).
- Sem credenciais hardcoded.
- os.environ validado.
- SQL queries parametrizadas (nunca f-string em SQL).
- Subprocess sem shell=True com input não confiável.

- path: "**/*.{dart}"
instructions: |
Dart/Flutter geral. Verificar:
- null safety estrito.
- StatelessWidget preferido quando não há state.
- Async/await com error handling.
- BuildContext não usado após dispose.
- Sem chaves hardcoded.

- path: "**/auth/**"
instructions: |
Auth crítico. Verificar:
- Secrets sempre via env vars.
- Tokens com expiração apropriada.
- bcrypt rounds >= 10 (idealmente 12).
- Endpoints não vazam existência de usuário.
- Rate limit em login/signup/forgot-password.
- Logout limpa estado completamente (localStorage, cookies, refresh token).

- path: "**/api/**"
instructions: |
API endpoints. Verificar:
- Validação de entrada via schema (Zod, Pydantic, class-validator).
- Rate limiting onde aplicável.
- Mensagens de erro não vazam stack trace em produção.
- Status codes corretos (401 vs 403, 400 vs 422).
- CORS configurado de forma restritiva.

- path: "**/middleware*"
instructions: |
Middleware. Verificar:
- Matcher cobre todas rotas pretendidas.
- Não bloqueia rotas públicas por engano.
- Headers de segurança aplicados (CSP, X-Frame-Options, etc).

- path: "**/migrations/**"
instructions: |
Database migrations. Verificar:
- Não destrutivas sem backup (DROP TABLE, DROP COLUMN).
- Rollback documentado.
- Mudança de tipo de coluna tem migração de dados.
- FK com índice no lado FK.

- path: "**/schema.{prisma,sql}"
instructions: |
Schema database. Verificar:
- Índices em colunas frequentemente filtradas.
- Unique constraints onde aplicável.
- Relations com onDelete coerente.
- Tipos apropriados (não usar String pra ID quando UUID/Int fazem sentido).

- path: "**/Dockerfile*"
instructions: |
Dockerfile. Verificar:
- Multi-stage quando build é separado de runtime.
- User não-root no runtime.
- HEALTHCHECK configurado.
- Sem segredos hardcoded.
- Versão da base image fixada (não latest).
- .dockerignore presente pra reduzir contexto.

- path: "**/.github/workflows/**"
instructions: |
GitHub Actions. Verificar:
- Secrets via ${{ secrets.* }}, nunca hardcoded.
- Concurrency group pra evitar runs duplicados.
- Permissions explicitas (preferir least privilege).
- actions/checkout@vX com versão fixa ou SHA.
- Cache strategy não vaza dependências privadas.

- path: "**/*.env.example"
- path: "src/**/*.{ts,tsx,js,jsx}"
instructions: |
Env example. Verificar:
- APENAS placeholders, nunca valores reais.
- Sem project-refs reais (Supabase, Firebase, etc).
- Documentação clara de onde obter cada chave.
- Variáveis NEXT_PUBLIC_* / VITE_* / REACT_APP_* só pra valores PÚBLICOS.

- path: "**/package.json"
TypeScript/React. Verificar:
- Sem uso de `any` sem justificativa.
- Hooks usados corretamente (dependências em useEffect, cleanup em subscriptions).
- Props com tipos explícitos, sem PropTypes implícitos.
- Não renderizar dados não sanitizados via dangerouslySetInnerHTML.
- Estados de erro e loading tratados explicitamente (não só happy path).

- path: "src/services/**"
instructions: |
package.json. Verificar:
- Sem dependências desnecessárias (sugerir devDeps quando aplicável).
- Scripts não expõem secrets.
- Sem versões "latest" (preferir SemVer explícito).
Camada de serviço. Verificar:
- Chamadas de API com tratamento de erro explícito.
- Tokens/credenciais nunca logados ou expostos em respostas de erro.
- Retry com backoff em endpoints críticos.

- path: "**/requirements*.txt"
- path: "supabase/**"
instructions: |
Python requirements. Verificar:
- Versões pinadas (==X.Y.Z), não open-ended.
- Sem pacotes obsoletos com CVEs conhecidos.
Supabase: RLS habilitado em todas as tabelas com dados de usuário, policies com
user_id = auth.uid(), migrations idempotentes, índices em colunas de filtro.
Nunca chamar supabase.auth.admin sem verificação de papel admin.

- path: "**/pubspec.yaml"
- path: ".github/workflows/**"
instructions: |
Flutter pubspec. Verificar:
- Versões SDK e Flutter especificadas.
- Dependências sem ^ aberto demais.
- Sem assets bloated.
CI/CD: secrets via secrets.*, nunca hardcoded. Permissions mínimas. Actions
pinadas por SHA quando possível. Concurrency control pra evitar runs duplicados.

- path: "**/*.md"
- path: "**/.env.example"
instructions: |
Documentação. Verificar:
- Linguagem clara em pt-BR ou en consistente no arquivo.
- Exemplos de código funcionam (sintaxe correta).
- Links não quebrados (relative ou absolute consistentes).
- Sem em dashes (usar hífens).
- "Goiânia" sempre com acento se mencionada.
Apenas placeholders, NUNCA valores reais. Sem project-refs reais do Supabase.

path_filters:
# Build artifacts
- "!**/node_modules/**"
- "!**/dist/**"
- "!**/build/**"
- "!**/.next/**"
- "!**/.nuxt/**"
- "!**/.svelte-kit/**"
- "!**/.output/**"
- "!**/.cache/**"
- "!**/coverage/**"
# Lockfiles
- "!**/package-lock.json"
- "!**/yarn.lock"
- "!**/pnpm-lock.yaml"
- "!**/poetry.lock"
- "!**/Pipfile.lock"
- "!**/Cargo.lock"
- "!**/composer.lock"
# Minified
- "!**/*.min.js"
- "!**/*.min.css"
- "!**/*.bundle.*"
- "!**/*.generated.*"
# Snapshots/cache
- "!**/*.lock"
- "!**/package-lock.json"
- "!**/pnpm-lock.yaml"
- "!**/*.snap"
- "!**/__pycache__/**"
- "!**/.pytest_cache/**"
- "!**/.mypy_cache/**"
- "!**/.ruff_cache/**"
# DB/local
- "!**/*.db"
- "!**/*.sqlite"
- "!**/*.sqlite3"
# Env files (sempre proteger)
- "!**/.env"
- "!**/.env.local"
- "!**/.env.production"
- "!**/.env.development"
# Binários
- "!**/*.png"
- "!**/*.jpg"
- "!**/*.jpeg"
- "!**/*.gif"
- "!**/*.ico"
- "!**/*.svg"
- "!**/*.webp"
- "!**/*.avif"
- "!**/*.woff"
- "!**/*.woff2"
- "!**/*.ttf"
- "!**/*.eot"
- "!**/*.pdf"
- "!**/*.zip"
- "!**/*.tar.gz"
# Mobile builds
- "!**/android/build/**"
- "!**/ios/Pods/**"
- "!**/*.ipa"
- "!**/*.apk"
- "!**/*.aab"
# Próprio config
- "!.coderabbit.yaml"

tools:
gitleaks:
enabled: true
semgrep:
enabled: true
presidio:
enabled: true

knowledge_base:
web_search:
enabled: true
code_guidelines:
enabled: true
filePatterns:
- ".github/copilot-instructions.md"
- "AGENTS.md"
learnings:
scope: "local"

chat:
auto_reply: true
Loading