code-review
Comprehensive code review skill for Breath of Now. Use this skill when reviewing PRs, checking code quality, or validating implementations. Focuses on TypeScript best practices, performance, and project conventions.
$ Instalar
git clone https://github.com/diogo-heleno/breathofnow /tmp/breathofnow && cp -r /tmp/breathofnow/.claude/skills/code-review ~/.claude/skills/breathofnow// tip: Run this command in your terminal to install the skill
SKILL.md
name: code-review description: Comprehensive code review skill for Breath of Now. Use this skill when reviewing PRs, checking code quality, or validating implementations. Focuses on TypeScript best practices, performance, and project conventions.
Code Review Skill
Este skill providencia capacidades de revisão de código compreensivas para o projecto Breath of Now. Verifica issues comuns, enforça convenções do projecto, e garante código de alta qualidade.
Quando Usar
Aplica este skill quando:
- Rever pull requests
- Validar novas implementações
- Verificar bugs e issues
- Garantir qualidade antes de merge
- Fechar sessões de trabalho (CLOSE-PROMPT)
Categorias de Revisão
1. Compliance TypeScript
// ❌ EVITAR: any type
const data: any = response;
function handleClick(event: any) { }
// ✅ PREFERIR: Tipos explícitos
interface ApiResponse {
data: Expense[];
error: string | null;
}
const data: ApiResponse = response;
function handleClick(event: React.MouseEvent<HTMLButtonElement>) { }
// ❌ EVITAR: Returns implícitos sem tipos
const getUser = (id) => users.find(u => u.id === id);
// ✅ PREFERIR: Tipos e returns explícitos
const getUser = (id: string): User | undefined => {
return users.find(u => u.id === id);
};
2. Compliance i18n
// ❌ REJEITAR: Texto hardcoded
<Button>Save Changes</Button>
<p className="error">Something went wrong</p>
<Input placeholder="Enter email" />
// ✅ ACEITAR: Texto traduzido
const t = useTranslations('Common');
<Button>{t('saveChanges')}</Button>
<p className="error">{t('errors.generic')}</p>
<Input placeholder={t('emailPlaceholder')} />
3. Arquitectura Local-First
// ❌ REJEITAR: Leituras directas do Supabase para dados do utilizador
const expenses = await supabase.from('expenses').select('*');
// ✅ ACEITAR: Leituras de Dexie
const expenses = await db.expenses.toArray();
4. Issues de Performance
// ❌ PROBLEMA: Async sequencial em loops
for (const item of items) {
await processItem(item); // Lento!
}
// ✅ MELHOR: Execução paralela
await Promise.all(items.map(item => processItem(item)));
// ❌ PROBLEMA: Missing useMemo/useCallback
const filteredExpenses = expenses.filter(e => e.category === category);
const handleClick = () => doSomething(id);
// ✅ MELHOR: Memoizado
const filteredExpenses = useMemo(
() => expenses.filter(e => e.category === category),
[expenses, category]
);
const handleClick = useCallback(() => doSomething(id), [id]);
5. Error Handling
// ❌ REJEITAR: Falhas silenciosas
try {
await saveData();
} catch (e) {
// Nada
}
// ✅ ACEITAR: Error handling adequado
try {
await saveData();
} catch (error) {
console.error('Failed to save:', error);
toast.error(t('errors.saveFailed'));
}
6. Issues de Segurança
// ❌ REJEITAR: Secrets expostos
const API_KEY = "sk-ant-xxxxx";
const SUPABASE_KEY = "eyJhbGc...";
// ✅ ACEITAR: Variáveis de ambiente
const API_KEY = process.env.NEXT_PUBLIC_API_KEY;
7. Convenções de Nomenclatura
| Tipo | Convenção | Exemplo |
|---|---|---|
| Ficheiros | kebab-case | expense-chart.tsx |
| Componentes | PascalCase | ExpenseChart |
| Funções | camelCase | handleClick |
| Constantes | SCREAMING_SNAKE | MAX_FILE_SIZE |
| Types/Interfaces | PascalCase | UserPreferences |
| DB Columns (Supabase) | snake_case | apps_selected_at |
| TS Properties | camelCase | appsSelectedAt |
Checklist de Revisão
Must Pass (Blocking) 🔴
- Sem tipos
any(usarunknownse realmente desconhecido) - Sem texto hardcoded em UI (usar traduções)
- Sem leituras directas de Supabase para dados do utilizador (usar Dexie)
- Sem console.log em código de produção
- Sem secrets expostos ou API keys
- Error handling em todas as operações async
- Consultar
.claude/supabase-schema.mdantes de queries
Should Pass (Non-blocking) 🟡
- Interfaces TypeScript definidas adequadamente
- Componentes têm tamanho razoável (<300 linhas)
- Lógica complexa tem comentários
- Convenções de nomenclatura consistentes
- Estados de loading/error adequados em UI
Nice to Have 🟢
- Unit tests para business logic
- Comentários JSDoc em funções exportadas
- Atributos de acessibilidade (aria-labels)
- Optimização de performance (memoização)
Formato de Mensagem de Commit
tipo(scope): descrição curta (máx 50 chars)
Descrição mais detalhada do que foi feito e porquê.
Pode ter múltiplas linhas.
- Lista de mudanças principais
- Outra mudança
- Mais uma mudança
Files changed:
- path/to/file1.ts
- path/to/file2.tsx
Tipos de commit:
feat: Nova funcionalidadefix: Correcção de bugdocs: Mudanças em documentaçãostyle: Formatação, missing semi-colons, etcrefactor: Refactoring de códigotest: Adicionar testeschore: Manutenção (deps, config, etc)
Scopes comuns:
expenses: ExpenseFlowfitlog: FitLogauth: Autenticaçãoi18n: Internacionalizaçãodb: Base de dadosui: Interface/Componentessync: Sync engine
Template de Resposta de Revisão
## Code Review: [Nome da Feature/PR]
### ✅ Aprovado / ❌ Mudanças Necessárias / 🔄 Precisa Discussão
### Sumário
Breve visão geral do que o código faz.
### Issues Encontradas
#### 🔴 Crítico (Must Fix)
- Issue 1: Descrição e localização
- Issue 2: Descrição e localização
#### 🟡 Importante (Should Fix)
- Issue 1: Descrição e sugestão
#### 🟢 Menor (Nice to Fix)
- Issue 1: Sugestão de melhoria
### O Que Está Bom
- Feedback positivo sobre a implementação
### Sugestões
- Melhorias adicionais a considerar
Verificações Automatizadas
Correr estes comandos para apanhar issues comuns:
# Erros TypeScript
npx tsc --noEmit
# Issues de linting
npm run lint
# Encontrar strings hardcoded (potenciais issues de i18n)
grep -r ">[A-Z][a-z]" --include="*.tsx" src/
# Encontrar console.log statements
grep -rn "console.log" --include="*.ts" --include="*.tsx" src/
# Encontrar tipos 'any'
grep -rn ": any" --include="*.ts" --include="*.tsx" src/
# Verificar imports não utilizados
npx eslint --rule 'no-unused-vars: error' src/
Matriz de Prioridade
| Tipo de Issue | Severidade | Acção |
|---|---|---|
| Vulnerabilidade de segurança | 🔴 Crítico | Bloquear merge |
| Texto hardcoded | 🔴 Crítico | Bloquear merge |
Uso de tipo any | 🟡 Alto | Requerer mudança |
| Missing error handling | 🟡 Alto | Requerer mudança |
| Issue de performance | 🟡 Médio | Sugerir fix |
| Estilo de código | 🟢 Baixo | Fix opcional |
Integração com CLOSE-PROMPT
Este skill é automaticamente invocado quando usas o CLOSE-PROMPT para:
- Verificar qualidade do código antes de commit
- Gerar mensagem de commit adequada
- Identificar issues não resolvidas
- Sugerir próximos passos
Lembra-te: Code review é sobre melhorar qualidade, não criticar o autor. Sê construtivo e útil.
Repository

diogo-heleno
Author
diogo-heleno/breathofnow/.claude/skills/code-review
1
Stars
0
Forks
Updated2d ago
Added1w ago