@daniel-da-silva-alves/sddk 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/LICENSE +21 -0
- package/README.md +260 -0
- package/bin/cli.js +430 -0
- package/package.json +49 -0
- package/sddk/plugin.json +12 -0
- package/sddk/skills/code-review/SKILL.md +185 -0
- package/sddk/skills/code-review/references/anti-ai-design-patterns.md +185 -0
- package/sddk/skills/code-review/references/refactoring-severity-guide.md +96 -0
- package/sddk/skills/code-review/references/security-checklist.md +131 -0
- package/sddk/skills/fullstack-development/SKILL.md +128 -0
- package/sddk/skills/fullstack-development/references/clean-code-rules.md +146 -0
- package/sddk/skills/fullstack-development/references/self-review-checklist.md +64 -0
- package/sddk/skills/implementation-planning/SKILL.md +102 -0
- package/sddk/skills/implementation-planning/references/manual-tests-template.md +95 -0
- package/sddk/skills/implementation-planning/references/microtask-template.md +66 -0
- package/sddk/skills/software-requirements-specification/SKILL.md +80 -0
- package/sddk/skills/software-requirements-specification/references/checklist-template.md +65 -0
- package/sddk/skills/software-requirements-specification/references/ieee-830-template.md +151 -0
- package/sddk/skills/software-requirements-specification/references/socratic-interview-guide.md +96 -0
- package/sddk/skills/system-design-document/SKILL.md +164 -0
- package/sddk/skills/system-design-document/references/architecture-patterns.md +105 -0
- package/sddk/skills/system-design-document/references/documentation-sources-guide.md +126 -0
- package/sddk/skills/system-design-document/references/sdd-template.md +259 -0
- package/sddk/skills/system-design-document/references/standards-api-template.md +128 -0
- package/sddk/skills/system-design-document/references/standards-architecture-template.md +76 -0
- package/sddk/skills/system-design-document/references/standards-coding-template.md +114 -0
- package/sddk/skills/system-design-document/references/standards-design-system-template.md +137 -0
- package/sddk/skills/system-design-document/references/standards-naming-template.md +96 -0
- package/sddk/skills/system-design-document/references/standards-onboarding-guide.md +119 -0
- package/sddk/skills/system-design-document/references/tech-stack-analysis.md +84 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# Anti-Design de IA — 8 Padrões a Detectar e Rejeitar
|
|
2
|
+
|
|
3
|
+
Estes são padrões que denunciam código gerado por IA sem curadoria humana. O agente DEVE detectar e corrigir todos eles durante o Code Review.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Padrão 1: Emojis em Interface
|
|
8
|
+
|
|
9
|
+
### O que detectar
|
|
10
|
+
Emojis usados como conteúdo textual em elementos de interface do usuário.
|
|
11
|
+
|
|
12
|
+
### Onde procurar
|
|
13
|
+
- Textos de botões
|
|
14
|
+
- Labels de formulários
|
|
15
|
+
- Headings e títulos
|
|
16
|
+
- Placeholders de inputs
|
|
17
|
+
- Mensagens de feedback/toast
|
|
18
|
+
- Navegação (menus, breadcrumbs)
|
|
19
|
+
|
|
20
|
+
### Exemplos
|
|
21
|
+
|
|
22
|
+
❌ **Ruim**:
|
|
23
|
+
```html
|
|
24
|
+
<button>🚀 Enviar Projeto</button>
|
|
25
|
+
<h1>📊 Dashboard de Vendas</h1>
|
|
26
|
+
<input placeholder="🔍 Pesquisar..." />
|
|
27
|
+
<span>✅ Salvo com sucesso!</span>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
✅ **Bom**:
|
|
31
|
+
```html
|
|
32
|
+
<button>Enviar Projeto</button>
|
|
33
|
+
<h1>Dashboard de Vendas</h1>
|
|
34
|
+
<input placeholder="Pesquisar produtos, pedidos ou clientes" />
|
|
35
|
+
<span>Alterações salvas</span>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Exceção
|
|
39
|
+
Emojis são aceitáveis em: conteúdo gerado por usuários (chat, comentários), campos de dados (não de UI), e quando o design system do projeto explicitamente os inclui.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Padrão 2: CSS/Tailwind Genérico
|
|
44
|
+
|
|
45
|
+
### O que detectar
|
|
46
|
+
Estilos visuais aplicados sem coerência com um design system. Cores aleatórias, tamanhos inconsistentes, espaçamentos ad-hoc.
|
|
47
|
+
|
|
48
|
+
### Exemplos
|
|
49
|
+
|
|
50
|
+
❌ **Ruim**:
|
|
51
|
+
```html
|
|
52
|
+
<div class="bg-blue-500 text-white p-4 rounded-lg shadow-lg">
|
|
53
|
+
<h2 class="text-2xl font-bold mb-2">Título</h2>
|
|
54
|
+
<p class="text-gray-200">Descrição aqui</p>
|
|
55
|
+
</div>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
✅ **Bom** (com design tokens):
|
|
59
|
+
```html
|
|
60
|
+
<div class="bg-surface-primary text-on-surface p-card rounded-card shadow-card">
|
|
61
|
+
<h2 class="text-heading-md font-heading mb-spacing-sm">Título</h2>
|
|
62
|
+
<p class="text-body-md text-on-surface-secondary">Descrição aqui</p>
|
|
63
|
+
</div>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Ou com CSS variables:
|
|
67
|
+
```css
|
|
68
|
+
.card {
|
|
69
|
+
background: var(--color-surface-primary);
|
|
70
|
+
padding: var(--spacing-card);
|
|
71
|
+
border-radius: var(--radius-card);
|
|
72
|
+
box-shadow: var(--shadow-card);
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Padrão 3: Comentários Óbvios
|
|
79
|
+
|
|
80
|
+
### O que detectar
|
|
81
|
+
Comentários que reescrevem em português/inglês o que o código já diz.
|
|
82
|
+
|
|
83
|
+
### Exemplos
|
|
84
|
+
|
|
85
|
+
❌ **Ruim**:
|
|
86
|
+
```typescript
|
|
87
|
+
// Importa o serviço de usuários
|
|
88
|
+
import { UserService } from './user.service';
|
|
89
|
+
|
|
90
|
+
// Define a variável contador como 0
|
|
91
|
+
let counter = 0;
|
|
92
|
+
|
|
93
|
+
// Incrementa o contador
|
|
94
|
+
counter++;
|
|
95
|
+
|
|
96
|
+
// Retorna a resposta
|
|
97
|
+
return response;
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
✅ **Bom** (sem comentários — o código é autoexplicativo):
|
|
101
|
+
```typescript
|
|
102
|
+
import { UserService } from './user.service';
|
|
103
|
+
let counter = 0;
|
|
104
|
+
counter++;
|
|
105
|
+
return response;
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Padrão 4: Nomes Genéricos
|
|
111
|
+
|
|
112
|
+
### O que detectar
|
|
113
|
+
Variáveis, funções e componentes com nomes que não descrevem seu conteúdo ou propósito.
|
|
114
|
+
|
|
115
|
+
### Lista de Nomes Proibidos
|
|
116
|
+
|
|
117
|
+
| Contexto | Nomes Genéricos ❌ |
|
|
118
|
+
|:---|:---|
|
|
119
|
+
| Variáveis | `data`, `result`, `temp`, `item`, `obj`, `val`, `info`, `stuff` |
|
|
120
|
+
| Funções | `handleClick`, `handleChange`, `handleSubmit`, `getData`, `processData`, `doStuff`, `check` |
|
|
121
|
+
| Componentes | `Card`, `Modal`, `List`, `Item`, `Container`, `Wrapper` (sem qualificador) |
|
|
122
|
+
| Tipos | `Props`, `Data`, `Response`, `Payload` (sem qualificador) |
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Padrão 5: Componentes Monolíticos
|
|
127
|
+
|
|
128
|
+
### O que detectar
|
|
129
|
+
Arquivos de componente com mais de ~150 linhas significativas que misturam múltiplas responsabilidades.
|
|
130
|
+
|
|
131
|
+
### Sinais
|
|
132
|
+
- Múltiplos `useState`/`useEffect` não relacionados no mesmo componente
|
|
133
|
+
- Renderização condicional extensa (múltiplos `if/else` ou ternários aninhados)
|
|
134
|
+
- Lógica de negócio misturada com UI
|
|
135
|
+
- Formulário, tabela e gráfico no mesmo componente
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Padrão 6: Código Boilerplate Repetitivo
|
|
140
|
+
|
|
141
|
+
### O que detectar
|
|
142
|
+
Padrões de código idênticos ou quase idênticos repetidos em múltiplos arquivos sem abstração.
|
|
143
|
+
|
|
144
|
+
### Sinais
|
|
145
|
+
- Fetch/API calls repetidos sem cliente centralizado
|
|
146
|
+
- Validações duplicadas entre formulários
|
|
147
|
+
- Tratamento de loading/error state repetido
|
|
148
|
+
- Formatações de data/moeda duplicadas
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Padrão 7: UI "Tutorial de YouTube"
|
|
153
|
+
|
|
154
|
+
### O que detectar
|
|
155
|
+
Interfaces que parecem screenshots de tutoriais genéricos — funcionais mas sem identidade visual.
|
|
156
|
+
|
|
157
|
+
### Sinais
|
|
158
|
+
- Cards com `box-shadow` padrão do framework sem personalização
|
|
159
|
+
- Gradientes genéricos (`linear-gradient(to right, blue, purple)`)
|
|
160
|
+
- Cores padrão do Tailwind sem customização (`blue-500`, `gray-700`)
|
|
161
|
+
- Layout grid básico sem hierarquia visual
|
|
162
|
+
- Tipografia padrão do browser (sem fonte customizada)
|
|
163
|
+
- Ícones genéricos de bibliotecas sem curadoria
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Padrão 8: Textos Placeholder Genéricos
|
|
168
|
+
|
|
169
|
+
### O que detectar
|
|
170
|
+
Textos que demonstram falta de cuidado com o conteúdo real da interface.
|
|
171
|
+
|
|
172
|
+
### Lista de Textos Proibidos
|
|
173
|
+
|
|
174
|
+
| Contexto | Textos Genéricos ❌ |
|
|
175
|
+
|:---|:---|
|
|
176
|
+
| Conteúdo | "Lorem ipsum dolor sit amet" |
|
|
177
|
+
| Botões | "Click here", "Submit", "Send", "OK", "Go" |
|
|
178
|
+
| Links | "Read more", "Learn more", "Click here" |
|
|
179
|
+
| Placeholders | "Enter text here", "Type something...", "Search..." |
|
|
180
|
+
| Labels | "Label", "Field", "Input" |
|
|
181
|
+
| Headings | "Title", "Heading", "Section" |
|
|
182
|
+
| Error msgs | "An error occurred", "Something went wrong" |
|
|
183
|
+
|
|
184
|
+
### O que usar no lugar
|
|
185
|
+
Textos reais e descritivos baseados no domínio da aplicação, extraídos dos requisitos funcionais do SRS.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Guia de Classificação de Severidade de Refatorações
|
|
2
|
+
|
|
3
|
+
Use este guia para classificar cada issue encontrada durante o Code Review. A classificação determina a **ação imediata** a ser tomada.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Severidades
|
|
8
|
+
|
|
9
|
+
### 🔴 Crítica — Execução Imediata
|
|
10
|
+
|
|
11
|
+
Issues que **devem ser corrigidas na mesma sessão** antes de considerar a feature concluída.
|
|
12
|
+
|
|
13
|
+
#### Critérios para Classificar como Crítica:
|
|
14
|
+
|
|
15
|
+
| Categoria | Exemplos |
|
|
16
|
+
|:---|:---|
|
|
17
|
+
| **Segurança** | SQL injection, XSS, IDOR, secrets expostos, senhas em plaintext |
|
|
18
|
+
| **Bug funcional** | Feature não funciona conforme SRS, crash em fluxo principal |
|
|
19
|
+
| **Violação grave do SDD** | Arquitetura implementada diferente do design (ex: lógica de negócio no controller) |
|
|
20
|
+
| **Perda de dados** | Operações destrutivas sem confirmação, falta de validação em deletes |
|
|
21
|
+
|
|
22
|
+
#### Ação:
|
|
23
|
+
1. Corrigir o código diretamente
|
|
24
|
+
2. Documentar o que foi corrigido no relatório de review
|
|
25
|
+
3. Se houver mais de 5 correções críticas, criar microtasks e voltar para Skill 4
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
### 🟡 Média — Documentar no Backlog
|
|
30
|
+
|
|
31
|
+
Issues que **afetam qualidade mas não impedem o funcionamento**. Devem ser resolvidas antes do próximo release ou sprint.
|
|
32
|
+
|
|
33
|
+
#### Critérios para Classificar como Média:
|
|
34
|
+
|
|
35
|
+
| Categoria | Exemplos |
|
|
36
|
+
|:---|:---|
|
|
37
|
+
| **Code smell** | Duplicação de código, funções muito longas, complexidade ciclomática alta |
|
|
38
|
+
| **Naming** | Nomes inconsistentes entre arquivos, convenções misturadas |
|
|
39
|
+
| **Anti-IA detectado** | Emojis em UI, CSS genérico, comentários óbvios |
|
|
40
|
+
| **Componentização** | Componente com múltiplas responsabilidades (mas funcional) |
|
|
41
|
+
| **Configuração** | CORS aberto, falta de rate limiting, validação apenas no frontend |
|
|
42
|
+
|
|
43
|
+
#### Ação:
|
|
44
|
+
1. Documentar em `.specs/features/{feature}/refactoring-backlog.md`
|
|
45
|
+
2. Incluir: arquivo, linha, descrição, sugestão de correção
|
|
46
|
+
3. Priorizar dentro do backlog
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
### 🟢 Baixa — Documentar no Backlog (Baixa Prioridade)
|
|
51
|
+
|
|
52
|
+
Issues que são **melhorias opcionais** de estética, performance ou organização. Não urgentes.
|
|
53
|
+
|
|
54
|
+
#### Critérios para Classificar como Baixa:
|
|
55
|
+
|
|
56
|
+
| Categoria | Exemplos |
|
|
57
|
+
|:---|:---|
|
|
58
|
+
| **Otimização** | Queries que poderiam ser mais eficientes (mas funcionam) |
|
|
59
|
+
| **Estilo** | Formatação inconsistente (que um linter resolveria) |
|
|
60
|
+
| **Documentação** | Falta de JSDoc em funções públicas |
|
|
61
|
+
| **Organização** | Arquivo poderia estar em outro diretório (mas funciona onde está) |
|
|
62
|
+
| **DX** | Mensagens de log pouco informativas |
|
|
63
|
+
|
|
64
|
+
#### Ação:
|
|
65
|
+
1. Documentar em `.specs/features/{feature}/refactoring-backlog.md`
|
|
66
|
+
2. Marcar como baixa prioridade
|
|
67
|
+
3. Resolver quando houver tempo disponível
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Árvore de Decisão
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
O código funciona incorretamente ou tem falha de segurança?
|
|
75
|
+
├── SIM → 🔴 Crítica → CORRIGIR AGORA
|
|
76
|
+
└── NÃO
|
|
77
|
+
└── O código viola boas práticas, convenções ou o SDD?
|
|
78
|
+
├── SIM → 🟡 Média → BACKLOG (prioridade)
|
|
79
|
+
└── NÃO
|
|
80
|
+
└── O código pode ser melhorado mas está OK?
|
|
81
|
+
├── SIM → 🟢 Baixa → BACKLOG (quando possível)
|
|
82
|
+
└── NÃO → ✅ Sem issue
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Formato do Backlog Entry
|
|
86
|
+
|
|
87
|
+
```markdown
|
|
88
|
+
### RB-{número}: {Título descritivo}
|
|
89
|
+
- **Severidade**: 🟡 Média / 🟢 Baixa
|
|
90
|
+
- **Arquivo**: `{caminho/do/arquivo.ext}`
|
|
91
|
+
- **Linha(s)**: {L42-L58}
|
|
92
|
+
- **Categoria**: {Code Smell | Naming | Anti-IA | Segurança | Performance | Organização}
|
|
93
|
+
- **Descrição**: {O que está errado}
|
|
94
|
+
- **Sugestão**: {Como corrigir}
|
|
95
|
+
- **Esforço estimado**: {Baixo | Médio | Alto}
|
|
96
|
+
```
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Checklist de Segurança para Code Review
|
|
2
|
+
|
|
3
|
+
Checklist simplificado baseado no OWASP Top 10, adaptado para revisão de código de features individuais.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Injeção (SQL, XSS, Command)
|
|
8
|
+
|
|
9
|
+
- [ ] **SQL Injection**: Queries usam parametrização/prepared statements (nunca concatenação de strings)
|
|
10
|
+
- [ ] **XSS**: Inputs de usuário são sanitizados antes de renderizar no DOM
|
|
11
|
+
- [ ] **Command Injection**: Inputs de usuário NUNCA são passados diretamente para execução de comandos do sistema
|
|
12
|
+
- [ ] **Template Injection**: Templates (Handlebars, EJS, Jinja) escapam variáveis por padrão
|
|
13
|
+
|
|
14
|
+
### O que verificar
|
|
15
|
+
```typescript
|
|
16
|
+
// ❌ SQL Injection
|
|
17
|
+
db.query(`SELECT * FROM users WHERE id = '${userId}'`);
|
|
18
|
+
|
|
19
|
+
// ✅ Parameterizado
|
|
20
|
+
db.query('SELECT * FROM users WHERE id = $1', [userId]);
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// ❌ XSS
|
|
25
|
+
element.innerHTML = userInput;
|
|
26
|
+
|
|
27
|
+
// ✅ Sanitizado
|
|
28
|
+
element.textContent = userInput;
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2. Autenticação
|
|
34
|
+
|
|
35
|
+
- [ ] Senhas são hasheadas com algoritmo forte (bcrypt, argon2, scrypt) — nunca MD5/SHA1
|
|
36
|
+
- [ ] Tokens JWT têm expiração definida
|
|
37
|
+
- [ ] Refresh tokens são armazenados de forma segura (httpOnly cookies, não localStorage)
|
|
38
|
+
- [ ] Tentativas de login são limitadas (rate limiting / account lockout)
|
|
39
|
+
- [ ] Logout invalida sessão/token no servidor
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 3. Autorização
|
|
44
|
+
|
|
45
|
+
- [ ] Cada endpoint verifica permissões do usuário autenticado
|
|
46
|
+
- [ ] Não há IDOR (Insecure Direct Object Reference) — usuário A não acessa dados do usuário B
|
|
47
|
+
- [ ] Roles/permissions são validadas no backend (nunca apenas no frontend)
|
|
48
|
+
- [ ] Endpoints admin são protegidos adequadamente
|
|
49
|
+
|
|
50
|
+
### O que verificar
|
|
51
|
+
```typescript
|
|
52
|
+
// ❌ IDOR — qualquer usuário autenticado acessa qualquer pedido
|
|
53
|
+
app.get('/api/orders/:id', async (req, res) => {
|
|
54
|
+
const order = await orderRepo.findById(req.params.id);
|
|
55
|
+
return res.json(order);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// ✅ Verificação de propriedade
|
|
59
|
+
app.get('/api/orders/:id', async (req, res) => {
|
|
60
|
+
const order = await orderRepo.findById(req.params.id);
|
|
61
|
+
if (order.userId !== req.user.id) return res.status(403).json({ error: 'Forbidden' });
|
|
62
|
+
return res.json(order);
|
|
63
|
+
});
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 4. Exposição de Dados Sensíveis
|
|
69
|
+
|
|
70
|
+
- [ ] Senhas nunca aparecem em responses de API
|
|
71
|
+
- [ ] Dados sensíveis (CPF, cartão, tokens) não são logados
|
|
72
|
+
- [ ] .env e secrets não estão comitados no git (.gitignore configurado)
|
|
73
|
+
- [ ] Errors de produção não expõem stack traces ou detalhes internos ao cliente
|
|
74
|
+
|
|
75
|
+
### O que verificar
|
|
76
|
+
```typescript
|
|
77
|
+
// ❌ Expõe senha
|
|
78
|
+
return res.json(user);
|
|
79
|
+
|
|
80
|
+
// ✅ Omite campos sensíveis
|
|
81
|
+
const { password, ...safeUser } = user;
|
|
82
|
+
return res.json(safeUser);
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 5. Configuração de Segurança
|
|
88
|
+
|
|
89
|
+
- [ ] CORS está configurado para permitir apenas origens necessárias (não `*` em produção)
|
|
90
|
+
- [ ] Headers de segurança configurados (CSP, X-Frame-Options, X-Content-Type-Options)
|
|
91
|
+
- [ ] HTTPS enforced em produção
|
|
92
|
+
- [ ] Secrets/tokens não estão hardcoded no código fonte
|
|
93
|
+
|
|
94
|
+
### O que verificar
|
|
95
|
+
```typescript
|
|
96
|
+
// ❌ CORS aberto
|
|
97
|
+
app.use(cors({ origin: '*' }));
|
|
98
|
+
|
|
99
|
+
// ✅ CORS restrito
|
|
100
|
+
app.use(cors({ origin: process.env.ALLOWED_ORIGINS?.split(',') }));
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 6. Validação de Input
|
|
106
|
+
|
|
107
|
+
- [ ] Todos os inputs de formulário são validados no backend (não apenas no frontend)
|
|
108
|
+
- [ ] Uploads de arquivo validam tipo, tamanho e conteúdo
|
|
109
|
+
- [ ] Paginação tem limites máximos (não permite `limit=999999`)
|
|
110
|
+
- [ ] Campos numéricos validam range (não aceita negativos quando não deveria)
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Classificação de Issues de Segurança
|
|
115
|
+
|
|
116
|
+
| Issue | Severidade |
|
|
117
|
+
|:---|:---|
|
|
118
|
+
| SQL/XSS/Command Injection | 🔴 Crítica |
|
|
119
|
+
| IDOR (acesso a dados de outros usuários) | 🔴 Crítica |
|
|
120
|
+
| Senha em plaintext / hash fraco | 🔴 Crítica |
|
|
121
|
+
| Secrets hardcoded no código | 🔴 Crítica |
|
|
122
|
+
| Token sem expiração | 🔴 Crítica |
|
|
123
|
+
| CORS `*` em produção | 🟡 Média |
|
|
124
|
+
| Falta de rate limiting | 🟡 Média |
|
|
125
|
+
| Falta de headers de segurança | 🟡 Média |
|
|
126
|
+
| Stack trace em response de erro | 🟡 Média |
|
|
127
|
+
| Validação apenas no frontend | 🟡 Média |
|
|
128
|
+
| Falta de paginação com limite | 🟢 Baixa |
|
|
129
|
+
|
|
130
|
+
> [!IMPORTANT]
|
|
131
|
+
> **Toda issue de segurança classificada como Crítica DEVE ser corrigida imediatamente.** Nunca mover para backlog.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fullstack-development
|
|
3
|
+
description: "Desenvolvimento fullstack orientado pelo SDD com auto-review inline e clean code. ATIVE esta skill quando o usuário mencionar: desenvolver, implementar, codar, programar, criar o código, iniciar desenvolvimento, executar microtasks, começar a codar, build da feature. Também acione quando o agente completar a skill de Planejamento e o usuário confirmar a transição para o Desenvolvimento."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill de Desenvolvimento Fullstack
|
|
7
|
+
|
|
8
|
+
## Identidade
|
|
9
|
+
|
|
10
|
+
Você é um **Desenvolvedor Fullstack Sênior** que escreve código limpo, seguindo estritamente o System Design Document e as boas práticas da stack utilizada.
|
|
11
|
+
|
|
12
|
+
## Contexto do Pipeline
|
|
13
|
+
|
|
14
|
+
Esta é a **Skill 4 de 5** do pipeline Spec-Driven Development (SDD):
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
1. SRS ✅ → 2. SDD ✅ → 3. Planejamento ✅ → ► [4. Dev] → 5. CodeReview
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
> [!IMPORTANT]
|
|
21
|
+
> O SRS, SDD e Planejamento DEVEM ter sido concluídos antes desta skill. Verifique que existem:
|
|
22
|
+
> - `.specs/features/{feature-name}/srs.md`
|
|
23
|
+
> - `.specs/features/{feature-name}/sdd.md`
|
|
24
|
+
> - `.specs/features/{feature-name}/manual-tests.md`
|
|
25
|
+
> - Task artifact com microtasks
|
|
26
|
+
|
|
27
|
+
## Regras Obrigatórias
|
|
28
|
+
|
|
29
|
+
### Clean Code
|
|
30
|
+
1. **NUNCA escrever comentários óbvios** — o código deve ser autoexplicativo
|
|
31
|
+
2. **SEMPRE usar nomes descritivos** — nunca `data`, `temp`, `handleClick`, `x`, `result`
|
|
32
|
+
3. **NUNCA usar código boilerplate repetitivo** — abstrair em funções/componentes reutilizáveis
|
|
33
|
+
4. **SEMPRE seguir naming conventions da stack** — camelCase, PascalCase, snake_case conforme convenção
|
|
34
|
+
5. **NUNCA criar componentes monolíticos** — dividir em componentes granulares com responsabilidade única
|
|
35
|
+
|
|
36
|
+
### Aderência ao SDD
|
|
37
|
+
6. **SEMPRE seguir a arquitetura definida no SDD** — respeitar camadas, estrutura de pastas, padrões
|
|
38
|
+
7. **SEMPRE seguir o modelo de dados do SDD** — campos, tipos, constraints exatamente como definido
|
|
39
|
+
8. **SEMPRE seguir o design de API do SDD** — endpoints, request/response bodies, status codes
|
|
40
|
+
9. **NUNCA inventar funcionalidade não especificada** — se não está no SRS/SDD, não implemente
|
|
41
|
+
|
|
42
|
+
### Anti-Design de IA
|
|
43
|
+
10. **NUNCA usar emojis** em textos de interface (botões, labels, headings, placeholders)
|
|
44
|
+
11. **NUNCA usar CSS/Tailwind genérico** — seguir design tokens definidos no SDD
|
|
45
|
+
12. **NUNCA usar textos placeholder genéricos** — 'Lorem ipsum', 'Click here', 'Submit' são proibidos
|
|
46
|
+
13. **NUNCA criar UI com aparência "tutorial de YouTube"** — cards com sombras genéricas, gradientes sem propósito
|
|
47
|
+
|
|
48
|
+
## Fluxo de Execução
|
|
49
|
+
|
|
50
|
+
### Fase 1: Preparação
|
|
51
|
+
|
|
52
|
+
1. **Ler o Task artifact** com as microtasks do Planejamento
|
|
53
|
+
2. **Carregar os standards do projeto** — ler `.specs/standards/naming-conventions.md` e `.specs/standards/coding-standards.md` para ter as convenções na memória ativa
|
|
54
|
+
3. **Se tem frontend na microtask** — ler também `.specs/standards/design-system.md`
|
|
55
|
+
4. **Se tem API na microtask** — ler também `.specs/standards/api-conventions.md`
|
|
56
|
+
5. Identificar a primeira microtask pendente (marcada `[ ]`)
|
|
57
|
+
|
|
58
|
+
### Fase 2: Execução por Microtask
|
|
59
|
+
|
|
60
|
+
Para CADA microtask, seguir este ciclo:
|
|
61
|
+
|
|
62
|
+
#### 2a. Iniciar Microtask
|
|
63
|
+
1. Marcar a microtask como `[/]` (em progresso) no Task artifact
|
|
64
|
+
2. **Ler as referências (ponteiros)** da microtask:
|
|
65
|
+
- Abrir e ler a seção específica do SDD referenciada
|
|
66
|
+
- Abrir e ler a seção específica do SRS referenciada
|
|
67
|
+
- Abrir e ler o standard referenciado (se houver ponteiro `📎 Ref Standards`)
|
|
68
|
+
3. Anunciar: "Iniciando microtask {Fase.Número}: {título}"
|
|
69
|
+
|
|
70
|
+
#### 2b. Implementar
|
|
71
|
+
1. Criar/modificar os arquivos listados na microtask
|
|
72
|
+
2. Seguir estritamente o SDD, os **standards do projeto** e as regras de Clean Code
|
|
73
|
+
3. Garantir que o código é funcional e completo para esta microtask
|
|
74
|
+
|
|
75
|
+
#### 2c. Auto-Review Inline
|
|
76
|
+
Após implementar, verificar usando o checklist em `references/self-review-checklist.md`:
|
|
77
|
+
|
|
78
|
+
1. **Aderência ao SDD** — o código reflete exatamente o que o SDD especifica?
|
|
79
|
+
2. **Clean code** — nomes descritivos? Sem comentários óbvios? Sem repetição?
|
|
80
|
+
3. **Naming conventions** — consistente com a stack?
|
|
81
|
+
4. **Anti-IA patterns** — sem emojis, sem CSS genérico, sem placeholders?
|
|
82
|
+
|
|
83
|
+
Se encontrar problemas, corrija ANTES de marcar como concluída.
|
|
84
|
+
|
|
85
|
+
#### 2d. Concluir Microtask
|
|
86
|
+
1. Marcar a microtask como `[x]` (concluída) no Task artifact
|
|
87
|
+
2. Prosseguir para a próxima microtask pendente
|
|
88
|
+
|
|
89
|
+
### Fase 3: Transição
|
|
90
|
+
|
|
91
|
+
Após todas as microtasks estarem `[x]`:
|
|
92
|
+
|
|
93
|
+
1. Anunciar: "✅ Desenvolvimento concluído. Todas as {N} microtasks foram implementadas. Próxima etapa: **Code Review**. Deseja prosseguir?"
|
|
94
|
+
2. **AGUARDAR** confirmação explícita antes de ativar a próxima skill
|
|
95
|
+
|
|
96
|
+
## Estratégia de Memória (Leitura Sob Demanda)
|
|
97
|
+
|
|
98
|
+
> [!IMPORTANT]
|
|
99
|
+
> **NUNCA tente ler o SRS e SDD inteiros de uma vez.** Isso polui o contexto e desperdiça tokens.
|
|
100
|
+
|
|
101
|
+
A estratégia correta é:
|
|
102
|
+
1. Cada microtask tem **ponteiros** para seções específicas (ex: `SDD#3.1 L45-L78`)
|
|
103
|
+
2. Ao iniciar uma microtask, leia **APENAS** as seções referenciadas
|
|
104
|
+
3. Isso garante que o contexto carregado é preciso e relevante para a tarefa atual
|
|
105
|
+
|
|
106
|
+
## Consulta de Documentação Técnica
|
|
107
|
+
|
|
108
|
+
Quando precisar consultar documentação de uma tecnologia da stack (ex: "como usar server actions no Next.js 15?"), siga a hierarquia configurada na **seção 10 do SDD**:
|
|
109
|
+
|
|
110
|
+
### Passo a passo:
|
|
111
|
+
|
|
112
|
+
1. **Ler a seção 10 do SDD** — abrir `.specs/features/{feature}/sdd.md` e localizar a tabela de fontes
|
|
113
|
+
2. **Seguir a hierarquia de prioridade**:
|
|
114
|
+
- **Docs local?** → `view_file` no caminho listado na seção 10.2
|
|
115
|
+
- **MCP/Skill?** → Usar a ferramenta/skill configurada na tabela 10.1
|
|
116
|
+
- **URL oficial?** → `read_url_content("{url-da-tabela}/topico-especifico")`
|
|
117
|
+
- **Nenhum?** → `search_web("{tecnologia} {versão} {tópico} site:{domínio-oficial}")`
|
|
118
|
+
3. **Validar a versão** — confirmar que a documentação consultada corresponde à versão listada na tabela 10.1
|
|
119
|
+
|
|
120
|
+
> [!WARNING]
|
|
121
|
+
> **NUNCA use seu conhecimento de treino como fonte primária** para APIs e padrões de tecnologias. Sempre consulte a documentação configurada no SDD. Seu conhecimento de treino pode estar desatualizado para a versão específica da stack.
|
|
122
|
+
|
|
123
|
+
## Routing Table
|
|
124
|
+
|
|
125
|
+
### References
|
|
126
|
+
|
|
127
|
+
- Se precisar do checklist de auto-review para aplicar após cada microtask, leia `references/self-review-checklist.md`
|
|
128
|
+
- Se precisar das regras de clean code detalhadas e exemplos, leia `references/clean-code-rules.md`
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# Regras de Clean Code
|
|
2
|
+
|
|
3
|
+
Regras stack-agnostic que o agente deve seguir durante o desenvolvimento. Estas regras são aplicadas automaticamente — não precisam ser mencionadas ao usuário.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Nomenclatura
|
|
8
|
+
|
|
9
|
+
### Variáveis e Funções
|
|
10
|
+
| ❌ Ruim | ✅ Bom | Razão |
|
|
11
|
+
|:---|:---|:---|
|
|
12
|
+
| `data` | `userProfile` | Descreve o conteúdo |
|
|
13
|
+
| `temp` | `formattedDate` | Descreve o propósito |
|
|
14
|
+
| `handleClick` | `handleLoginSubmit` | Descreve a ação específica |
|
|
15
|
+
| `result` | `validationErrors` | Descreve o que contém |
|
|
16
|
+
| `x`, `y`, `i` (fora de loop) | `index`, `coordinate` | Autodocumentável |
|
|
17
|
+
| `flag` | `isAuthenticated` | Semântico |
|
|
18
|
+
| `arr` | `activeUsers` | Descreve o conteúdo da coleção |
|
|
19
|
+
|
|
20
|
+
### Funções
|
|
21
|
+
| ❌ Ruim | ✅ Bom | Razão |
|
|
22
|
+
|:---|:---|:---|
|
|
23
|
+
| `process()` | `validateAndSaveUser()` | Descreve o que faz |
|
|
24
|
+
| `doStuff()` | `calculateShippingCost()` | Específico |
|
|
25
|
+
| `getData()` | `fetchUserOrders()` | Especifica o que busca |
|
|
26
|
+
| `check()` | `isEmailAlreadyRegistered()` | Booleans com prefixo `is/has/can` |
|
|
27
|
+
|
|
28
|
+
### Componentes (React/Vue/Svelte)
|
|
29
|
+
| ❌ Ruim | ✅ Bom | Razão |
|
|
30
|
+
|:---|:---|:---|
|
|
31
|
+
| `Card` (genérico) | `ProductCard` | Específico ao domínio |
|
|
32
|
+
| `Modal` (genérico) | `ConfirmDeleteModal` | Descreve o propósito |
|
|
33
|
+
| `List` (genérico) | `OrderHistoryList` | Específico |
|
|
34
|
+
| `Button` (global catch-all) | `SubmitButton`, `NavigationButton` | Variantes explícitas |
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 2. Comentários
|
|
39
|
+
|
|
40
|
+
### Comentários Proibidos (❌)
|
|
41
|
+
```typescript
|
|
42
|
+
// Incrementa o contador
|
|
43
|
+
counter++;
|
|
44
|
+
|
|
45
|
+
// Retorna o usuário
|
|
46
|
+
return user;
|
|
47
|
+
|
|
48
|
+
// Define o estado como true
|
|
49
|
+
setIsLoading(true);
|
|
50
|
+
|
|
51
|
+
// Cria uma nova instância
|
|
52
|
+
const service = new UserService();
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Comentários Aceitáveis (✅)
|
|
56
|
+
```typescript
|
|
57
|
+
// Regex RFC 5322 simplificada para validação de email corporativo
|
|
58
|
+
const EMAIL_PATTERN = /^[a-zA-Z0-9._%+-]+@empresa\.com$/;
|
|
59
|
+
|
|
60
|
+
// Delay de 300ms para debounce de busca — evita flood de requests
|
|
61
|
+
// durante digitação rápida no campo de pesquisa
|
|
62
|
+
const SEARCH_DEBOUNCE_MS = 300;
|
|
63
|
+
|
|
64
|
+
// TODO(#123): Migrar para a v2 da API quando disponível em produção
|
|
65
|
+
const API_BASE = '/api/v1';
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Regra Geral
|
|
69
|
+
> Comente o **porquê**, nunca o **o quê**. Se o código precisa de comentário para explicar o que faz, renomeie variáveis e funções até ficar óbvio.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 3. Abstração e Reutilização
|
|
74
|
+
|
|
75
|
+
### Código Repetitivo (❌)
|
|
76
|
+
```typescript
|
|
77
|
+
// Repetido em 5 componentes
|
|
78
|
+
const response = await fetch('/api/users', {
|
|
79
|
+
headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }
|
|
80
|
+
});
|
|
81
|
+
if (!response.ok) throw new Error('Failed to fetch');
|
|
82
|
+
const data = await response.json();
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Com Abstração (✅)
|
|
86
|
+
```typescript
|
|
87
|
+
// Usado em 5+ componentes — fetch centralizado
|
|
88
|
+
const users = await apiClient.get<User[]>('/users');
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Regra: Extrair quando repetir ≥ 2 vezes
|
|
92
|
+
Se um padrão de código aparece 2 ou mais vezes, deve ser extraído para:
|
|
93
|
+
- Uma função utilitária
|
|
94
|
+
- Um componente reutilizável
|
|
95
|
+
- Um hook customizado (React)
|
|
96
|
+
- Um serviço/module
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 4. Estrutura de Arquivos
|
|
101
|
+
|
|
102
|
+
### Arquivo Monolítico (❌)
|
|
103
|
+
```
|
|
104
|
+
src/components/Dashboard.tsx ← 500+ linhas com tudo junto
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Arquivos Granulares (✅)
|
|
108
|
+
```
|
|
109
|
+
src/components/dashboard/
|
|
110
|
+
├── Dashboard.tsx ← Composição dos sub-componentes
|
|
111
|
+
├── DashboardHeader.tsx ← Header isolado
|
|
112
|
+
├── DashboardMetrics.tsx ← Cards de métricas
|
|
113
|
+
├── DashboardRecentOrders.tsx ← Lista de pedidos recentes
|
|
114
|
+
└── useDashboardData.ts ← Hook de dados
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Regra: 1 componente por arquivo, máximo ~150 linhas significativas
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 5. Tratamento de Erros
|
|
122
|
+
|
|
123
|
+
### Genérico (❌)
|
|
124
|
+
```typescript
|
|
125
|
+
try {
|
|
126
|
+
await saveUser(data);
|
|
127
|
+
} catch (e) {
|
|
128
|
+
console.log(e); // Ignora silenciosamente
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Específico (✅)
|
|
133
|
+
```typescript
|
|
134
|
+
try {
|
|
135
|
+
await saveUser(data);
|
|
136
|
+
} catch (error) {
|
|
137
|
+
if (error instanceof ValidationError) {
|
|
138
|
+
showFieldErrors(error.fields);
|
|
139
|
+
} else if (error instanceof NetworkError) {
|
|
140
|
+
showRetryNotification('Falha na conexão. Tente novamente.');
|
|
141
|
+
} else {
|
|
142
|
+
logger.error('Unexpected error saving user', { error, userId: data.id });
|
|
143
|
+
showGenericError();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|