Obrigado pelo interesse em contribuir! Este documento explica como configurar o ambiente, os padrões de código e o processo para enviar contribuições.
Todas as contribuições são bem-vindas: correções de bugs, novas funcionalidades, melhorias de documentação e sugestões.
flowchart LR
A[Fork] --> B[Branch]
B --> C[Codigo]
C --> D[Build + Lint]
D --> E[Pull Request]
style A fill:#1a1a2e,stroke:#00ffd5,color:#e4e4e7
style B fill:#1a1a2e,stroke:#00ffd5,color:#e4e4e7
style C fill:#1a1a2e,stroke:#00ffd5,color:#e4e4e7
style D fill:#1a1a2e,stroke:#ffd32a,color:#e4e4e7
style E fill:#1a1a2e,stroke:#00ff88,color:#e4e4e7
- Faça um fork do repositório
- Crie uma branch a partir de
master(ex.:feat/novo-provedoroufix/erro-parse) - Realize suas alterações seguindo os padrões abaixo
- Rode
npm run buildenpm run lintsem erros - Abra um Pull Request descrevendo o que foi feito
Pré-requisitos: Node.js 18+ e npm 9+
# 1. Clone o repositório
git clone https://github.com/eoLucasS/CyberLens.git
# 2. Instale as dependências
cd CyberLens && npm install
# 3. Inicie o servidor de desenvolvimento
npm run devA aplicação estará disponível em http://localhost:3000.
| Comando | O que faz |
|---|---|
npm run dev |
Servidor de desenvolvimento (Turbopack) |
npm run build |
Build de produção |
npm run lint |
ESLint + verificação de tipos |
npm run format |
Formata todos os arquivos (Prettier) |
- Modo
strictativado, zero uso deany - Prefira
interfacepara objetos etypepara unions - Exporte sempre os tipos criados
| Onde | Idioma |
|---|---|
| Comentários de código | Inglês |
| Texto visível ao usuário (UI) | Português do Brasil (pt-BR) |
| Nomes de variáveis e funções | Inglês (camelCase) |
| Commits | Inglês ou português (Conventional Commits) |
- Componentes funcionais com named exports (sem default em componentes)
- Lógica de estado e efeitos em custom hooks (
src/hooks/) - Props tipadas com
interface+ sufixoProps(ex.:ButtonProps) - Um componente por arquivo
- Use importações absolutas com
@/(configurado notsconfig.json) - Ordem: externos > internos > tipos
import { useState } from 'react';
import { Button } from '@/components/ui/Button';
import type { AnalysisResult } from '@/types';Passo a passo completo
Adicione um novo objeto no array AI_PROVIDERS:
{
name: 'nome-do-provedor',
label: 'Nome Exibido',
requiresProxy: false, // true se a API bloqueia CORS
apiKeyPlaceholder: 'prefix...',
docsUrl: 'https://...',
models: [
{
id: 'id-exato-do-modelo',
name: 'Nome do Modelo',
description: 'Descrição em pt-BR.',
},
],
}Crie callNomeDoProvedor(params) que:
- Faz a requisição HTTP para a API
- Extrai o texto da resposta
- Lança
Errorcom mensagem em pt-BR se falhar
Adicione ao mapa providerCallers.
No mesmo arquivo, adicione o case no testConnection para o novo provedor. O teste deve enviar um prompt mínimo e retornar { success, message }.
Se o provedor bloqueia requests do browser, crie uma API Route em src/app/api/proxy/nome/route.ts. A rota deve apenas repassar a requisição sem armazenar dados.
Se o provedor precisa de campos extras além de apiKey e model, adicione em src/types/settings.ts.
Passo a passo
Os perfis da página /demo são arquivos JSON estáticos em public/demo/profiles/.
Crie public/demo/profiles/meu-perfil.json seguindo o formato dos arquivos existentes. Estrutura mínima:
{
"profile": {
"slug": "meu-perfil",
"title": "Título",
"subtitle": "Subtítulo",
"narrative": "Descrição curta do cenário."
},
"resume": { "fileName": "...", "text": "..." },
"job": { "title": "...", "company": "...", "location": "...", "text": "..." },
"keywordRadar": { "matched": [...], "missing": [...], "matchPercentage": 0, "totalKeywords": 0 },
"analysis": { "score": 0, "classification": "...", "matchedSkills": [...], "gaps": [...], "missingKeywords": [...], "experienceAnalysis": {...}, "studyPlan": [...] }
}Adicione o novo perfil nos arrays PROFILES (dados visuais do card) e VALID_SLUGS em src/app/demo/[profile]/page.tsx.
Acesse /demo/meu-perfil localmente e confirme que o KeywordRadar e AnalysisResult renderizam corretamente.
Dados fictícios não podem conter nomes, emails ou telefones reais.
Padrão Conventional Commits:
| Prefixo | Uso |
|---|---|
feat: |
Nova funcionalidade |
fix: |
Correção de bug |
docs: |
Documentação |
style: |
Formatação (sem mudança de lógica) |
refactor: |
Refatoração |
chore: |
Manutenção (deps, configs) |
Exemplos:
feat: add Mistral AI provider support
fix: resolve timeout on Google Gemini API calls
docs: update API key configuration guide
npm run buildenpm run lintdevem passar sem erros- Descreva o que foi feito e por que no corpo do PR
- Referencie a issue com
Closes #número(se houver) - Use o template de PR fornecido em
.github/PULL_REQUEST_TEMPLATE.md
Para mudanças grandes, abra uma issue primeiro para alinhar a abordagem.
Obrigado por contribuir!