aprimoração de ia
This commit is contained in:
parent
1177e31e56
commit
4a9f5f70ff
109 changed files with 8835 additions and 55 deletions
89
agents/arquiteto/skills/auditar-arquitetura-modulo/SKILL.md
Normal file
89
agents/arquiteto/skills/auditar-arquitetura-modulo/SKILL.md
Normal file
|
|
@ -0,0 +1,89 @@
|
||||||
|
---
|
||||||
|
name: auditar-arquitetura-modulo
|
||||||
|
description: >
|
||||||
|
Auditoria arquitetural de módulo: fronteiras, acoplamento, dependências
|
||||||
|
circulares, contratos de API e dívidas técnicas.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Auditar Arquitetura de Módulo
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Avaliar a saúde arquitetural de um módulo antes de propor mudanças estruturais.
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Verificar Fronteiras de Pacote
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Detectar imports que cruzam fronteiras
|
||||||
|
rg "from.*-back" --include='*.ts' --include='*.vue' <modulo>-front/src/ -n
|
||||||
|
rg "from.*-front" --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
|
||||||
|
# Verificar imports entre módulos diferentes
|
||||||
|
rg "from.*<outro-modulo>" --include='*.ts' <modulo>/ -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Verificar Acoplamento
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Contar imports por arquivo (alto = muito acoplado)
|
||||||
|
fd "*.ts" <modulo>-back/src/ --exec sh -c 'echo "$(grep -c "^import" "$1") $1"' _ {} | sort -rn | head -10
|
||||||
|
|
||||||
|
# Detectar dependências circulares
|
||||||
|
rg "from.*\.\/" --include='*.ts' <modulo>/src/ -l | head -20
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Verificar Contratos de API
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar rotas e seus schemas de validação
|
||||||
|
rg "router\.(get|post|put|patch|delete)" --include='*.ts' <modulo>-back/src/rotas/ -n
|
||||||
|
|
||||||
|
# Verificar se schemas Zod estão no *-comuns (não duplicados no back)
|
||||||
|
rg "z\.object" --include='*.ts' <modulo>-back/src/ -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Avaliar Dívida Técnica
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Buscar marcadores de dívida
|
||||||
|
rg "TODO|FIXME|HACK|WORKAROUND|DEBT|TEMP" --include='*.ts' --include='*.vue' <modulo>/ -n
|
||||||
|
|
||||||
|
# Verificar limite de linhas
|
||||||
|
fd "*.ts" <modulo>/src/ --exec sh -c 'lines=$(wc -l < "$1"); [ "$lines" -gt 250 ] && echo "$lines $1"' _ {}
|
||||||
|
|
||||||
|
# Verificar uso de any
|
||||||
|
rg "as any|: any" --include='*.ts' <modulo>/ -c
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Relatório
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Auditoria Arquitetural — [módulo]
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
- **Violações de fronteira:** N
|
||||||
|
- **Arquivos com acoplamento alto (>10 imports):** N
|
||||||
|
- **Dívidas técnicas (TODO/FIXME):** N
|
||||||
|
- **Arquivos acima de 250 linhas:** N
|
||||||
|
|
||||||
|
## Achados
|
||||||
|
### 🔴 Crítico
|
||||||
|
| Tipo | Arquivo | Problema | Ação |
|
||||||
|
|------|---------|----------|------|
|
||||||
|
|
||||||
|
### 🟡 Moderado
|
||||||
|
| Tipo | Arquivo | Problema | Ação |
|
||||||
|
|------|---------|----------|------|
|
||||||
|
|
||||||
|
## Plano de Ação
|
||||||
|
1. ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Rule: `global/rules/fronteiras-monorepo`
|
||||||
|
- Skill: `global/skills/mapear-codigo-fonte/SKILL`
|
||||||
117
agents/back/skills/diagnosticar-saude-backend/SKILL.md
Normal file
117
agents/back/skills/diagnosticar-saude-backend/SKILL.md
Normal file
|
|
@ -0,0 +1,117 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-saude-backend
|
||||||
|
description: >
|
||||||
|
Diagnóstico sistemático de saúde do backend: rotas, queries, schemas, filas,
|
||||||
|
CRONs e integrações antes de qualquer correção.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Saúde do Backend
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Analisar a saúde de um módulo backend para identificar problemas antes de corrigi-los. Produz relatório com causa raiz, severidade e plano de ação.
|
||||||
|
|
||||||
|
## Pré-condições
|
||||||
|
|
||||||
|
- Acesso ao pacote `*-back` do módulo
|
||||||
|
- Acesso ao pacote `*-comuns` (schemas de contrato)
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Verificar Integridade de Schemas
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar todos os schemas Zod do módulo
|
||||||
|
rg "export const z" --include='*.ts' <modulo>-comuns/src/tabelas/ -l
|
||||||
|
|
||||||
|
# Verificar se schemas do comuns são usados no back
|
||||||
|
rg "from.*comuns" --include='*.ts' <modulo>-back/src/ | head -20
|
||||||
|
|
||||||
|
# Detectar schemas redefinidos no back (violação de fronteiras)
|
||||||
|
rg "z\.object\(\{" --include='*.ts' <modulo>-back/src/ -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Verificar Consistência de Rotas
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar todas as rotas definidas
|
||||||
|
rg "router\.(get|post|put|patch|delete)" --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
|
||||||
|
# Verificar validação de entrada em cada rota
|
||||||
|
rg "zod|parse|safeParse" --include='*.ts' <modulo>-back/src/rotas/ -l
|
||||||
|
|
||||||
|
# Detectar rotas sem validação Zod
|
||||||
|
# (comparar lista de rotas vs lista de validações)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Verificar Saúde de Queries
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Detectar queries sem tratamento de erro
|
||||||
|
rg "\.select\(|\.insert\(|\.update\(|\.delete\(" --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
|
||||||
|
# Detectar possíveis N+1 (query dentro de loop)
|
||||||
|
rg "for.*await|forEach.*await|map.*await" --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
|
||||||
|
# Verificar transações (queries que deveriam ser atômicas)
|
||||||
|
rg "\.transaction\(" --include='*.ts' <modulo>-back/src/ -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Verificar Filas e CRONs
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar processadores de fila
|
||||||
|
rg "process|worker|queue" --include='*.ts' <modulo>-back/src/filas/ -l
|
||||||
|
|
||||||
|
# Verificar tratamento de falha em filas
|
||||||
|
rg "catch|onFailed|failedReason" --include='*.ts' <modulo>-back/src/filas/ -n
|
||||||
|
|
||||||
|
# Listar CRONs agendados
|
||||||
|
rg "cron|schedule|repeat" --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Verificar Tipagem e Build
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Checar tipos sem gerar saída
|
||||||
|
npx tsc --noEmit -p <modulo>-back/tsconfig.json 2>&1 | head -30
|
||||||
|
|
||||||
|
# Detectar uso de any
|
||||||
|
rg "as any|: any" --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Gerar Relatório
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Diagnóstico Backend — [nome do módulo]
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
- **Rotas analisadas:** N
|
||||||
|
- **Schemas verificados:** N
|
||||||
|
- **Problemas encontrados:** N
|
||||||
|
|
||||||
|
## Problemas Detectados
|
||||||
|
|
||||||
|
### 🔴 Crítico
|
||||||
|
| Arquivo | Problema | Causa | Ação |
|
||||||
|
|---------|----------|-------|------|
|
||||||
|
|
||||||
|
### 🟡 Moderado
|
||||||
|
| Arquivo | Problema | Causa | Ação |
|
||||||
|
|---------|----------|-------|------|
|
||||||
|
|
||||||
|
### 🟢 Baixo
|
||||||
|
| Arquivo | Problema | Causa | Ação |
|
||||||
|
|---------|----------|-------|------|
|
||||||
|
|
||||||
|
## Plano de Correção (priorizado)
|
||||||
|
1. ...
|
||||||
|
2. ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Skill: `global/skills/diagnosticar-antes-corrigir/SKILL`
|
||||||
|
- Rule: `global/rules/zod-validacao-padrao`
|
||||||
88
agents/deploy/skills/diagnosticar-saude-deploy/SKILL.md
Normal file
88
agents/deploy/skills/diagnosticar-saude-deploy/SKILL.md
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-saude-deploy
|
||||||
|
description: >
|
||||||
|
Diagnóstico de saúde de deploy e infraestrutura: containers, variáveis
|
||||||
|
de ambiente, healthchecks, logs e estado dos serviços.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Saúde de Deploy
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Avaliar o estado de saúde da infraestrutura e pipelines de deploy antes de aplicar mudanças.
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Verificar Estado dos Containers
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar containers ativos
|
||||||
|
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
||||||
|
|
||||||
|
# Verificar logs recentes de erro
|
||||||
|
docker logs --tail 50 <container> 2>&1 | grep -i "error\|fatal\|exception\|fail"
|
||||||
|
|
||||||
|
# Verificar uso de recursos
|
||||||
|
docker stats --no-stream
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Verificar Variáveis de Ambiente
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar variáveis esperadas (schemas Zod de ambiente)
|
||||||
|
rg "z\.Ambiente\|process\.env\." --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
|
||||||
|
# Verificar se há variáveis sem default ou validação
|
||||||
|
rg "process\.env\." --include='*.ts' <modulo>-back/src/ -n | grep -v "z\.\|zod\|Ambiente"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Verificar Healthchecks
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Verificar endpoints de health
|
||||||
|
rg "health\|alive\|ready" --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
|
||||||
|
# Verificar healthcheck no Docker
|
||||||
|
rg "HEALTHCHECK" Dockerfile* docker-compose* -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Verificar Build
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Testar build completo
|
||||||
|
pnpm build 2>&1 | tail -20
|
||||||
|
|
||||||
|
# Verificar migrations pendentes
|
||||||
|
rg "migration\|migrate" --include='*.ts' <modulo>-migracao/src/ -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Gerar Relatório
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Diagnóstico de Deploy — [nome do módulo]
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
- **Containers:** N ativos / N esperados
|
||||||
|
- **Healthchecks:** N configurados
|
||||||
|
- **Variáveis de ambiente:** N validadas / N sem validação
|
||||||
|
- **Build:** ✅ OK | ❌ Falha
|
||||||
|
|
||||||
|
## Problemas Detectados
|
||||||
|
|
||||||
|
### 🔴 Crítico
|
||||||
|
| Área | Problema | Impacto | Ação |
|
||||||
|
|------|----------|---------|------|
|
||||||
|
|
||||||
|
### 🟡 Moderado
|
||||||
|
| Área | Problema | Impacto | Ação |
|
||||||
|
|------|----------|---------|------|
|
||||||
|
|
||||||
|
## Plano de Ação
|
||||||
|
1. ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Skill: `global/skills/diagnosticar-antes-corrigir/SKILL`
|
||||||
|
|
@ -0,0 +1,96 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-lacunas-documentacao
|
||||||
|
description: >
|
||||||
|
Diagnóstico de lacunas de documentação: funções sem JSDoc, módulos sem
|
||||||
|
regras de negócio documentadas, documentação desatualizada.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Lacunas de Documentação
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Identificar proativamente onde a documentação está ausente, incompleta ou desatualizada antes de criar ou corrigir documentação.
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Verificar JSDoc em Funções Compartilhadas
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar funções exportadas sem JSDoc
|
||||||
|
rg "^export (const|function|async function)" --include='*.ts' <modulo>-comuns/src/ -n | while read line; do
|
||||||
|
file=$(echo "$line" | cut -d: -f1)
|
||||||
|
lineno=$(echo "$line" | cut -d: -f2)
|
||||||
|
prev=$((lineno - 1))
|
||||||
|
if ! sed -n "${prev}p" "$file" | grep -q "*/"; then
|
||||||
|
echo "SEM JSDOC: $line"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Verificar Regras de Negócio Documentadas
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar módulos com lógica complexa
|
||||||
|
rg "if.*&&|switch|\.length\s*>" --include='*.ts' <modulo>-back/src/servicos/ -c | awk -F: '$2>5' | sort -t: -k2 -rn
|
||||||
|
|
||||||
|
# Verificar quais têm .regras-negocio.md
|
||||||
|
fd ".regras-negocio.md" <modulo>/ -l
|
||||||
|
|
||||||
|
# Detectar lógica complexa sem documentação de regras
|
||||||
|
# (comparar os dois resultados acima)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Verificar Documentação de API
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar rotas sem comentário explicativo
|
||||||
|
rg "router\.(get|post|put|patch|delete)" --include='*.ts' <modulo>-back/src/rotas/ -n
|
||||||
|
|
||||||
|
# Verificar quais rotas têm JSDoc
|
||||||
|
rg "/\*\*" --include='*.ts' <modulo>-back/src/rotas/ -c
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Detectar Dessincronia Código ↔ Docs
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Buscar campos mencionados em .regras-negocio.md que não existem no código
|
||||||
|
# (verificação manual por arquivo)
|
||||||
|
|
||||||
|
# Buscar decisões técnicas que deveriam estar na Memória
|
||||||
|
rg "DECISÃO|ADR|NOTA|IMPORTANTE" --include='*.ts' --include='*.md' <modulo>/ -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Gerar Relatório
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Diagnóstico de Documentação — [nome do módulo]
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
- **Funções compartilhadas sem JSDoc:** N
|
||||||
|
- **Módulos complexos sem .regras-negocio.md:** N
|
||||||
|
- **Rotas sem documentação:** N
|
||||||
|
|
||||||
|
## Lacunas Encontradas
|
||||||
|
|
||||||
|
### 🔴 Crítico — Lógica Complexa Não Documentada
|
||||||
|
| Arquivo | Complexidade | O que documentar |
|
||||||
|
|---------|-------------|-----------------|
|
||||||
|
|
||||||
|
### 🟡 Moderado — JSDoc Ausente
|
||||||
|
| Arquivo | Função | Tipo |
|
||||||
|
|---------|--------|------|
|
||||||
|
|
||||||
|
### 🟢 Baixo — Melhorias
|
||||||
|
| Arquivo | O que melhorar |
|
||||||
|
|---------|---------------|
|
||||||
|
|
||||||
|
## Plano de Documentação (priorizado)
|
||||||
|
1. ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Rule: `global/rules/jsdoc-padrao`
|
||||||
|
- Rule: `global/rules/regras-negocio-md`
|
||||||
108
agents/front/skills/diagnosticar-saude-frontend/SKILL.md
Normal file
108
agents/front/skills/diagnosticar-saude-frontend/SKILL.md
Normal file
|
|
@ -0,0 +1,108 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-saude-frontend
|
||||||
|
description: >
|
||||||
|
Diagnóstico sistemático de saúde do frontend: componentes, composables,
|
||||||
|
estados de UI, acessibilidade e integração com API.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Saúde do Frontend
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Analisar a saúde de um módulo frontend Vue 3 para identificar problemas antes de corrigi-los.
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Verificar Estrutura de Componentes
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar componentes e tamanho
|
||||||
|
fd "*.vue" <modulo>-front/src/ --exec wc -l {} | sort -rn | head -20
|
||||||
|
|
||||||
|
# Detectar componentes acima do limite (250 linhas)
|
||||||
|
fd "*.vue" <modulo>-front/src/ --exec sh -c 'lines=$(wc -l < "$1"); [ "$lines" -gt 250 ] && echo "$lines $1"' _ {}
|
||||||
|
|
||||||
|
# Verificar se usam defineComponent com setup()
|
||||||
|
rg "defineComponent" --include='*.vue' <modulo>-front/src/ -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Verificar Estados de Interface
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Detectar componentes sem estado de loading
|
||||||
|
rg "loading|carregando|isLoading" --include='*.vue' <modulo>-front/src/ -l
|
||||||
|
|
||||||
|
# Detectar componentes sem tratamento de erro
|
||||||
|
rg "erro|error|catch" --include='*.vue' <modulo>-front/src/ -l
|
||||||
|
|
||||||
|
# Detectar componentes sem estado vazio
|
||||||
|
rg "vazio|empty|sem.*dados|nenhum" --include='*.vue' <modulo>-front/src/ -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Verificar Integração com Schemas
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Verificar se schemas são importados do *-comuns
|
||||||
|
rg "from.*comuns" --include='*.ts' --include='*.vue' <modulo>-front/src/ | head -20
|
||||||
|
|
||||||
|
# Detectar schemas redefinidos no front (violação)
|
||||||
|
rg "z\.object\(\{" --include='*.ts' --include='*.vue' <modulo>-front/src/ -l
|
||||||
|
|
||||||
|
# Detectar uso de any
|
||||||
|
rg "as any|: any" --include='*.ts' --include='*.vue' <modulo>-front/src/ -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Verificar Composables
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar composables existentes
|
||||||
|
fd "use*.ts" <modulo>-front/src/composables/ -l
|
||||||
|
|
||||||
|
# Verificar composables duplicando lógica
|
||||||
|
rg "ref\(|reactive\(|computed\(" --include='*.vue' <modulo>-front/src/ -c | sort -t: -k2 -rn | head -10
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Verificar Mensagens ao Usuário
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Detectar mensagens técnicas expostas ao usuário
|
||||||
|
rg "Error:|Exception:|null|undefined|NaN" --include='*.vue' <modulo>-front/src/ -n
|
||||||
|
|
||||||
|
# Verificar se mensagens usam linguagem do domínio
|
||||||
|
rg "snackbar\|toast\|notify\|mensagem\|alerta" --include='*.vue' --include='*.ts' <modulo>-front/src/ -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Gerar Relatório
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Diagnóstico Frontend — [nome do módulo]
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
- **Componentes analisados:** N
|
||||||
|
- **Composables verificados:** N
|
||||||
|
- **Problemas encontrados:** N
|
||||||
|
|
||||||
|
## Problemas Detectados
|
||||||
|
|
||||||
|
### 🔴 Crítico
|
||||||
|
| Componente | Problema | Impacto | Ação |
|
||||||
|
|------------|----------|---------|------|
|
||||||
|
|
||||||
|
### 🟡 Moderado
|
||||||
|
| Componente | Problema | Impacto | Ação |
|
||||||
|
|------------|----------|---------|------|
|
||||||
|
|
||||||
|
### 🟢 Baixo
|
||||||
|
| Componente | Problema | Impacto | Ação |
|
||||||
|
|------------|----------|---------|------|
|
||||||
|
|
||||||
|
## Plano de Correção (priorizado)
|
||||||
|
1. ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Skill: `global/skills/diagnosticar-antes-corrigir/SKILL`
|
||||||
|
- Rule: `global/rules/estrutura-vue` (via front)
|
||||||
145
agents/refatorar/skills/diagnosticar-code-smells/SKILL.md
Normal file
145
agents/refatorar/skills/diagnosticar-code-smells/SKILL.md
Normal file
|
|
@ -0,0 +1,145 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-code-smells
|
||||||
|
description: >
|
||||||
|
Análise sistemática de código para identificar code smells, violações SOLID
|
||||||
|
e oportunidades de aplicação de Design Patterns GoF.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Code Smells
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Analisar um arquivo, módulo ou pacote para produzir um relatório de saúde estrutural com:
|
||||||
|
- Code smells identificados
|
||||||
|
- Violações SOLID detectadas
|
||||||
|
- Design Patterns recomendados
|
||||||
|
- Prioridade de cada refatoração
|
||||||
|
|
||||||
|
## Pré-condições
|
||||||
|
|
||||||
|
- Código existente para analisar (arquivo, pasta ou pacote)
|
||||||
|
- Acesso de leitura ao código e seus testes
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Coletar Contexto
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Identificar tamanho e estrutura
|
||||||
|
wc -l <arquivo_ou_pasta>/**/*.ts
|
||||||
|
wc -l <arquivo_ou_pasta>/**/*.vue
|
||||||
|
|
||||||
|
# Verificar cobertura de testes
|
||||||
|
find <pasta_testes> -name "*.spec.ts" -o -name "*.test.ts"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Verificar Smells de Volume
|
||||||
|
|
||||||
|
Para cada arquivo, verificar:
|
||||||
|
|
||||||
|
| Verificação | Comando/Ação |
|
||||||
|
|-------------|-------------|
|
||||||
|
| Linhas > 250 | `wc -l <arquivo>` |
|
||||||
|
| Funções > 30 linhas | Ler e contar manualmente |
|
||||||
|
| Parâmetros > 3 por função | `grep_search` por assinaturas |
|
||||||
|
| Imports excessivos (> 10) | Contar linhas de import |
|
||||||
|
|
||||||
|
### 3. Verificar Smells de Acoplamento
|
||||||
|
|
||||||
|
| Verificação | Indicador |
|
||||||
|
|-------------|-----------|
|
||||||
|
| Feature Envy | Função usa `outro.` mais que `this.` ou dados locais |
|
||||||
|
| Intimidade Inapropriada | Acesso a internos de outro módulo (não-exportados) |
|
||||||
|
| Cadeia de Mensagens | `a.b.c.d` com 3+ níveis |
|
||||||
|
| Import circular | Módulo A importa B que importa A |
|
||||||
|
|
||||||
|
### 4. Verificar Conformidade SOLID
|
||||||
|
|
||||||
|
Para cada princípio, aplicar o checklist:
|
||||||
|
|
||||||
|
```
|
||||||
|
□ S — Este arquivo tem apenas 1 razão para mudar?
|
||||||
|
□ O — Posso adicionar nova variação sem editar este arquivo?
|
||||||
|
□ L — Subtipos são substituíveis pelo tipo base?
|
||||||
|
□ I — Interfaces são específicas para cada consumidor?
|
||||||
|
□ D — Lógica de negócio depende de abstrações, não de implementações?
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Mapear Oportunidades de Padrão
|
||||||
|
|
||||||
|
Cruzar smells detectados com o guia de decisão:
|
||||||
|
|
||||||
|
```
|
||||||
|
switch crescente → Strategy
|
||||||
|
criação condicional → Factory Method
|
||||||
|
construção complexa → Builder
|
||||||
|
comportamento por estado → State
|
||||||
|
pipeline de validações → Chain of Responsibility
|
||||||
|
comportamento adicional → Decorator
|
||||||
|
interface incompatível → Adapter
|
||||||
|
subsistema complexo → Facade
|
||||||
|
notificação de mudanças → Observer
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Gerar Relatório
|
||||||
|
|
||||||
|
Produzir relatório no formato:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Diagnóstico de Code Smells — [nome do módulo]
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
- **Arquivos analisados:** N
|
||||||
|
- **Smells encontrados:** N
|
||||||
|
- **Violações SOLID:** N
|
||||||
|
- **Padrões recomendados:** N
|
||||||
|
|
||||||
|
## Smells Detectados
|
||||||
|
|
||||||
|
### 🔴 Crítico
|
||||||
|
| Arquivo | Smell | Linha(s) | Ação Recomendada |
|
||||||
|
|---------|-------|----------|-----------------|
|
||||||
|
|
||||||
|
### 🟡 Moderado
|
||||||
|
| Arquivo | Smell | Linha(s) | Ação Recomendada |
|
||||||
|
|---------|-------|----------|-----------------|
|
||||||
|
|
||||||
|
### 🟢 Baixo
|
||||||
|
| Arquivo | Smell | Linha(s) | Ação Recomendada |
|
||||||
|
|---------|-------|----------|-----------------|
|
||||||
|
|
||||||
|
## Violações SOLID
|
||||||
|
| Princípio | Arquivo | Descrição | Severidade |
|
||||||
|
|-----------|---------|-----------|------------|
|
||||||
|
|
||||||
|
## Design Patterns Recomendados
|
||||||
|
| Problema | Padrão | Justificativa | Esforço |
|
||||||
|
|----------|--------|---------------|---------|
|
||||||
|
|
||||||
|
## Plano de Ação (priorizado)
|
||||||
|
1. [Crítico] ...
|
||||||
|
2. [Crítico] ...
|
||||||
|
3. [Moderado] ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Critérios de Severidade
|
||||||
|
|
||||||
|
| Severidade | Critério |
|
||||||
|
|------------|----------|
|
||||||
|
| 🔴 Crítico | Violação SOLID + acoplamento alto + afeta 3+ arquivos |
|
||||||
|
| 🟡 Moderado | Code smell isolado + afeta 1-2 arquivos |
|
||||||
|
| 🟢 Baixo | Melhoria estética + sem impacto funcional |
|
||||||
|
|
||||||
|
## Pós-condições
|
||||||
|
|
||||||
|
- Relatório registrado na Memória Azteca (`./memory/`) ou entregue diretamente
|
||||||
|
- Plano de ação priorizado gerado
|
||||||
|
- `@testes` notificado sobre trechos sem cobertura
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Persona: `agents/refatorar/persona`
|
||||||
|
- Rule: `agents/refatorar/rules/solid-compliance`
|
||||||
|
- Rule: `agents/refatorar/rules/design-patterns-pragmatico`
|
||||||
|
- Refactoring.Guru — https://refactoring.guru/pt-br/refactoring/smells
|
||||||
97
agents/testes/skills/diagnosticar-cobertura-testes/SKILL.md
Normal file
97
agents/testes/skills/diagnosticar-cobertura-testes/SKILL.md
Normal file
|
|
@ -0,0 +1,97 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-cobertura-testes
|
||||||
|
description: >
|
||||||
|
Diagnóstico de cobertura de testes: identificar áreas sem cobertura,
|
||||||
|
priorizar criação de testes e mapear cenários ausentes.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Cobertura de Testes
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Mapear a cobertura de testes de um módulo para identificar gaps críticos antes de criar novos testes ou validar correções.
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Inventariar Testes Existentes
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar arquivos de teste
|
||||||
|
fd "*.spec.ts" <modulo>/ -l
|
||||||
|
fd "*.test.ts" <modulo>/ -l
|
||||||
|
|
||||||
|
# Contar testes por pacote
|
||||||
|
echo "=== Back ===" && fd "*.spec.ts" <modulo>-back/ | wc -l
|
||||||
|
echo "=== Front ===" && fd "*.spec.ts" <modulo>-front/ | wc -l
|
||||||
|
echo "=== Comuns ===" && fd "*.spec.ts" <modulo>-comuns/ | wc -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Mapear Código Sem Testes
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar arquivos de código sem arquivo de teste correspondente
|
||||||
|
for f in $(fd "*.ts" <modulo>-back/src/ --exclude "*.spec.ts" --exclude "*.test.ts" --exclude "*.d.ts"); do
|
||||||
|
base=$(basename "$f" .ts)
|
||||||
|
if ! fd "${base}.spec.ts" <modulo>/ -q && ! fd "${base}.test.ts" <modulo>/ -q; then
|
||||||
|
echo "SEM TESTE: $f"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Classificar por Criticidade
|
||||||
|
|
||||||
|
| Criticidade | O que testar primeiro |
|
||||||
|
|-------------|----------------------|
|
||||||
|
| 🔴 Crítico | Lógica de negócio em `servicos/`, schemas Zod, máquinas de estado |
|
||||||
|
| 🟡 Importante | Rotas de API, processadores de fila, composables complexos |
|
||||||
|
| 🟢 Desejável | Utils, helpers, componentes de UI puros |
|
||||||
|
|
||||||
|
### 4. Verificar Qualidade dos Testes Existentes
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Detectar testes sem assertions
|
||||||
|
rg "expect\(|assert\(|toBe\(|toEqual\(" --include='*.spec.ts' <modulo>/ -c | awk -F: '$2==0'
|
||||||
|
|
||||||
|
# Detectar testes com descrições vagas
|
||||||
|
rg "it\('" --include='*.spec.ts' <modulo>/ -n | grep -i "should work\|test\|funciona"
|
||||||
|
|
||||||
|
# Verificar mocks sem documentação
|
||||||
|
rg "mock\(|jest\.fn\(|vi\.fn\(" --include='*.spec.ts' <modulo>/ -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Gerar Relatório
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Diagnóstico de Cobertura — [nome do módulo]
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
- **Arquivos de código:** N
|
||||||
|
- **Arquivos de teste:** N
|
||||||
|
- **Cobertura estimada:** N%
|
||||||
|
- **Gaps críticos:** N
|
||||||
|
|
||||||
|
## Gaps de Cobertura
|
||||||
|
|
||||||
|
### 🔴 Sem teste — Lógica Crítica
|
||||||
|
| Arquivo | Responsabilidade | Risco |
|
||||||
|
|---------|-----------------|-------|
|
||||||
|
|
||||||
|
### 🟡 Sem teste — Funcionalidade Importante
|
||||||
|
| Arquivo | Responsabilidade | Risco |
|
||||||
|
|---------|-----------------|-------|
|
||||||
|
|
||||||
|
## Testes Existentes com Problemas
|
||||||
|
| Arquivo de Teste | Problema | Ação |
|
||||||
|
|-----------------|----------|------|
|
||||||
|
|
||||||
|
## Plano de Priorização
|
||||||
|
1. [Crítico] Criar testes para ...
|
||||||
|
2. [Crítico] Criar testes para ...
|
||||||
|
3. [Importante] Criar testes para ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Skill: `global/skills/diagnosticar-antes-corrigir/SKILL`
|
||||||
63
agents/ux/skills/auditar-ux-heuristicas/SKILL.md
Normal file
63
agents/ux/skills/auditar-ux-heuristicas/SKILL.md
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
---
|
||||||
|
name: auditar-ux-heuristicas
|
||||||
|
description: >
|
||||||
|
Auditoria de UX baseada em heurísticas de Nielsen e verificação de estados de UI.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Auditar UX por Heurísticas
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Avaliar UX de tela ou fluxo antes de propor mudanças.
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Heurísticas de Nielsen
|
||||||
|
|
||||||
|
| # | Heurística | Pergunta |
|
||||||
|
|---|-----------|----------|
|
||||||
|
| 1 | Visibilidade do status | Sistema informa o que acontece? |
|
||||||
|
| 2 | Compatibilidade | Mensagens usam linguagem do domínio? |
|
||||||
|
| 3 | Controle e liberdade | Pode desfazer, voltar, cancelar? |
|
||||||
|
| 4 | Consistência | Mesmos conceitos, mesma aparência? |
|
||||||
|
| 5 | Prevenção de erros | Campos obrigatórios claros? Confirmação em ações destrutivas? |
|
||||||
|
| 6 | Reconhecimento > Lembrança | Labels descritivos? |
|
||||||
|
| 7 | Flexibilidade | Ações frequentes acessíveis? |
|
||||||
|
| 8 | Estética minimalista | Info desnecessária? |
|
||||||
|
| 9 | Recuperação de erros | Mensagens orientam correção? |
|
||||||
|
| 10 | Ajuda | Ajuda contextual disponível? |
|
||||||
|
|
||||||
|
### 2. Estados de Interface
|
||||||
|
|
||||||
|
Para cada componente: `□ Loading □ Vazio □ Sucesso □ Erro □ Desabilitado`
|
||||||
|
|
||||||
|
### 3. Acessibilidade Básica
|
||||||
|
|
||||||
|
```sh
|
||||||
|
rg "<img" --include='*.vue' <modulo>-front/src/ -n | grep -v "alt="
|
||||||
|
rg "<v-btn\|<button" --include='*.vue' <modulo>-front/src/ -n | grep -v "aria-label\|title"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Relatório
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Auditoria UX — [tela/fluxo]
|
||||||
|
|
||||||
|
## Achados por Heurística
|
||||||
|
| # | Heurística | Status | Problema | Recomendação |
|
||||||
|
|---|-----------|--------|----------|--------------|
|
||||||
|
|
||||||
|
## Estados de Interface
|
||||||
|
| Componente | Loading | Vazio | Erro | Sucesso |
|
||||||
|
|------------|---------|-------|------|---------|
|
||||||
|
|
||||||
|
## Plano de Melhoria
|
||||||
|
1. ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Rule: `global/rules/mensagens-usuario`
|
||||||
|
- Rule: `global/rules/feedback-visivel`
|
||||||
184
global/skills/criar-schema-zod/SKILL.md
Normal file
184
global/skills/criar-schema-zod/SKILL.md
Normal file
|
|
@ -0,0 +1,184 @@
|
||||||
|
---
|
||||||
|
name: criar-schema-zod
|
||||||
|
scope: global
|
||||||
|
description: >
|
||||||
|
Guia operacional para criar, organizar e manter schemas de validação Zod em projetos TypeScript.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Criar Schema Zod
|
||||||
|
|
||||||
|
Use esta skill ao adicionar validação de dados em qualquer ponto de entrada do sistema — API, formulário, webhook, importação, fila ou variáveis de ambiente.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 1 — Identificar a Entrada Externa
|
||||||
|
|
||||||
|
Determinar qual dado externo precisa de validação:
|
||||||
|
|
||||||
|
| Tipo de entrada | Onde validar |
|
||||||
|
|---|---|
|
||||||
|
| Corpo de requisição (POST/PUT) | Handler da rota, antes de qualquer lógica |
|
||||||
|
| Query/path params | Handler da rota |
|
||||||
|
| Formulário frontend | Antes de chamar a API |
|
||||||
|
| Dados de fila (BullMQ) | No processador da fila |
|
||||||
|
| Arquivo importado (CSV/JSON) | No parser, linha a linha |
|
||||||
|
| Variáveis de ambiente | No boot da aplicação |
|
||||||
|
| Resposta de API externa | Após receber a resposta |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 2 — Localizar ou Criar o Schema no Pacote Comuns
|
||||||
|
|
||||||
|
Schemas compartilhados vivem no pacote `*-comuns`:
|
||||||
|
|
||||||
|
```
|
||||||
|
projeto-comuns/src/tabelas/
|
||||||
|
├── usuarios/
|
||||||
|
│ ├── zUsuarioCriar.ts
|
||||||
|
│ ├── zUsuarioEditar.ts
|
||||||
|
│ └── index.ts
|
||||||
|
└── index.ts
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.1. Verificar se já existe
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rg "z{NomeDaEntidade}" --include='*.ts' -l
|
||||||
|
```
|
||||||
|
|
||||||
|
Se já existir → reutilizar ou compor a partir dele (`.extend()`, `.pick()`, `.partial()`).
|
||||||
|
|
||||||
|
### 2.2. Criar o schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { z } from "zod"
|
||||||
|
|
||||||
|
export const zUsuarioCriar = z.object({
|
||||||
|
nome: z.string().trim().min(1, "Nome é obrigatório"),
|
||||||
|
email: z.string().email("E-mail inválido"),
|
||||||
|
ativo: z.boolean().default(true),
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3. Nomenclatura obrigatória
|
||||||
|
|
||||||
|
| Padrão | Uso |
|
||||||
|
|---|---|
|
||||||
|
| `z{Entidade}Criar` | Criação |
|
||||||
|
| `z{Entidade}Editar` | Edição (geralmente `.partial()`) |
|
||||||
|
| `z{Entidade}Filtro` | Filtros de listagem |
|
||||||
|
| `z{Entidade}Resposta` | Resposta de API |
|
||||||
|
| `z{Entidade}Params` | Parâmetros de rota |
|
||||||
|
| `z{Modulo}Config` | Configuração |
|
||||||
|
| `z{Modulo}Ambiente` | Variáveis de ambiente |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 3 — Derivar o Tipo com `z.infer<>`
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
export type tipoUsuarioCriar = z.infer<typeof zUsuarioCriar>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Nunca** criar um `interface` ou `type` manual separado do schema. O tipo **sempre** deriva do schema.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 4 — Implementar `safeParse` no Ponto de Entrada
|
||||||
|
|
||||||
|
### Backend (Express)
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { zUsuarioCriar } from "projeto-comuns/tabelas/usuarios"
|
||||||
|
|
||||||
|
app.post("/usuarios", async (req, res) => {
|
||||||
|
const resultado = zUsuarioCriar.safeParse(req.body)
|
||||||
|
if (!resultado.success) {
|
||||||
|
return res.status(400).json({ erro: resultado.error.issues[0].message })
|
||||||
|
}
|
||||||
|
const usuario = await criarUsuario(resultado.data)
|
||||||
|
return res.json(usuario)
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend (Vue)
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { zUsuarioCriar } from "projeto-comuns/tabelas/usuarios"
|
||||||
|
|
||||||
|
const salvar = async () => {
|
||||||
|
const resultado = zUsuarioCriar.safeParse(formulario.value)
|
||||||
|
if (!resultado.success) {
|
||||||
|
erros.value = resultado.error.flatten().fieldErrors
|
||||||
|
return
|
||||||
|
}
|
||||||
|
await api.post("/usuarios", resultado.data)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Variáveis de ambiente
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const zAmbiente = z.object({
|
||||||
|
DATABASE_URL: z.string().url(),
|
||||||
|
REDIS_HOST: z.string().default("localhost"),
|
||||||
|
NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
||||||
|
})
|
||||||
|
|
||||||
|
// Aqui o throw é desejável — a app não deve subir com env inválido
|
||||||
|
export const ambiente = () => zAmbiente.parse(process.env)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 5 — Compor Schemas Derivados
|
||||||
|
|
||||||
|
Quando precisar de variações do mesmo schema, **compor** em vez de duplicar:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Schema base
|
||||||
|
const zProduto = z.object({
|
||||||
|
nome: z.string().trim().min(1),
|
||||||
|
preco: z.coerce.number().positive(),
|
||||||
|
categoria: z.string(),
|
||||||
|
})
|
||||||
|
|
||||||
|
// Edição: todos os campos opcionais
|
||||||
|
const zProdutoEditar = zProduto.partial()
|
||||||
|
|
||||||
|
// Resposta: base + campos gerados
|
||||||
|
const zProdutoResposta = zProduto.extend({
|
||||||
|
codigo: z.string().uuid(),
|
||||||
|
criadoEm: z.string().datetime(),
|
||||||
|
})
|
||||||
|
|
||||||
|
// Filtro: subset de campos opcionais
|
||||||
|
const zProdutoFiltro = zProduto.pick({ categoria: true }).partial()
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 6 — Validar Tipagem
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx tsc --noEmit
|
||||||
|
```
|
||||||
|
|
||||||
|
Zero erros = concluído.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist Final
|
||||||
|
|
||||||
|
- [ ] O schema está no pacote `*-comuns` (quando compartilhado entre front/back)?
|
||||||
|
- [ ] O tipo é derivado do schema com `z.infer<>`?
|
||||||
|
- [ ] A validação usa `safeParse` (exceto em boot/middleware)?
|
||||||
|
- [ ] A nomenclatura segue o padrão `z{Entidade}{Acao}`?
|
||||||
|
- [ ] Transformações (trim, coerce, default) estão no schema, não no handler?
|
||||||
|
- [ ] Schemas derivados usam composição (.partial, .extend, .pick), não duplicação?
|
||||||
|
- [ ] `tsc --noEmit` passa sem erros?
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/zod-validacao-padrao`
|
||||||
|
- Rule: `global/rules/typescript-sem-any`
|
||||||
188
global/skills/diagnosticar-antes-corrigir/SKILL.md
Normal file
188
global/skills/diagnosticar-antes-corrigir/SKILL.md
Normal file
|
|
@ -0,0 +1,188 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-antes-corrigir
|
||||||
|
scope: global
|
||||||
|
updatedAt: "2026-07-09"
|
||||||
|
description: >
|
||||||
|
Protocolo universal de diagnóstico que todo agente deve seguir antes de implementar
|
||||||
|
correções, mudanças ou refatorações. Define etapas, ferramentas e formato de saída.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Antes de Corrigir
|
||||||
|
|
||||||
|
Use esta skill **sempre** que receber uma solicitação de correção, ajuste ou mudança. Ela é a implementação operacional da rule `diagnostico-antes-correcao`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 1 — Compreender a Solicitação
|
||||||
|
|
||||||
|
Antes de qualquer ação, responder internamente:
|
||||||
|
|
||||||
|
| Pergunta | Resposta esperada |
|
||||||
|
|----------|-------------------|
|
||||||
|
| O que o operador reportou? | Descrição objetiva do problema |
|
||||||
|
| É um erro de build, runtime, lógica ou visual? | Classificação |
|
||||||
|
| Qual módulo/pacote é afetado? | `*-back`, `*-front`, `*-comuns`, `*-migracao` |
|
||||||
|
| O operador já forneceu diagnóstico? | Se sim, validar antes de aceitar |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 2 — Coletar Evidências
|
||||||
|
|
||||||
|
### 2.1. Ler o código afetado (completo)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Não ler apenas a linha do erro — ler o arquivo inteiro para contexto
|
||||||
|
view_file <arquivo_afetado>
|
||||||
|
|
||||||
|
# Verificar imports e dependências
|
||||||
|
rg "import.*from" <arquivo_afetado>
|
||||||
|
|
||||||
|
# Verificar quem usa este arquivo
|
||||||
|
rg "<nome_do_export>" --include='*.ts' --include='*.vue' -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2. Verificar erros de build (se aplicável)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Verificar se o build passa
|
||||||
|
pnpm --filter <pacote> build 2>&1 | head -50
|
||||||
|
|
||||||
|
# Ou checagem de tipos isolada
|
||||||
|
npx tsc --noEmit -p <caminho>/tsconfig.json 2>&1 | head -30
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3. Consultar memória (obrigatório)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
grep -rn "PALAVRAS_CHAVE_DO_PROBLEMA" .
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.4. Verificar regras de negócio documentadas
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Buscar .regras-negocio.md no diretório afetado
|
||||||
|
fd ".regras-negocio.md" <diretorio_do_modulo>
|
||||||
|
|
||||||
|
# Buscar comentários explicativos no código
|
||||||
|
rg "HACK|FIXME|TODO|NOTA|IMPORTANTE|REGRA" <arquivo_afetado>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 3 — Análise de Causa Raiz
|
||||||
|
|
||||||
|
### 3.1. Técnica dos 5 Porquês
|
||||||
|
|
||||||
|
Aplicar progressivamente até chegar à causa raiz:
|
||||||
|
|
||||||
|
```
|
||||||
|
Por que o campo não salva?
|
||||||
|
→ Porque a API retorna 400.
|
||||||
|
Por que a API retorna 400?
|
||||||
|
→ Porque a validação Zod rejeita o campo.
|
||||||
|
Por que o Zod rejeita?
|
||||||
|
→ Porque o schema não inclui esse campo.
|
||||||
|
Por que o schema não inclui?
|
||||||
|
→ Porque a migração adicionou a coluna mas o schema não foi atualizado.
|
||||||
|
CAUSA RAIZ: Schema Zod desatualizado após migração.
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2. Classificar a causa
|
||||||
|
|
||||||
|
| Categoria | Exemplos |
|
||||||
|
|-----------|----------|
|
||||||
|
| **Schema/Tipo** | Zod schema desatualizado, tipo TypeScript incorreto |
|
||||||
|
| **Banco de dados** | Coluna ausente, migração não executada |
|
||||||
|
| **Lógica de negócio** | Condição errada, regra não implementada |
|
||||||
|
| **Integração** | API fora do contrato, fila não processando |
|
||||||
|
| **Interface** | Componente não reativo, estado inconsistente |
|
||||||
|
| **Configuração** | Variável de ambiente, tsconfig, dependência |
|
||||||
|
| **Infraestrutura** | Container, deploy, proxy, certificado |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 4 — Avaliar Impacto
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Quais arquivos usam o código afetado?
|
||||||
|
rg "<simbolo_afetado>" --include='*.ts' --include='*.vue' --include='*.tsx' -l
|
||||||
|
|
||||||
|
# Quantos módulos são impactados?
|
||||||
|
rg "<simbolo_afetado>" --include='*.ts' -l | xargs -I{} dirname {} | sort -u
|
||||||
|
```
|
||||||
|
|
||||||
|
Classificar o impacto:
|
||||||
|
|
||||||
|
| Severidade | Critério |
|
||||||
|
|------------|----------|
|
||||||
|
| 🔴 Alto | Afeta 3+ módulos, pode causar regressão |
|
||||||
|
| 🟡 Médio | Afeta 1-2 arquivos, impacto limitado |
|
||||||
|
| 🟢 Baixo | Isolado, sem dependentes |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 5 — Declarar Diagnóstico
|
||||||
|
|
||||||
|
**OBRIGATÓRIO:** Antes de editar qualquer arquivo, apresentar ao operador:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## 🔍 Diagnóstico
|
||||||
|
|
||||||
|
**Problema:** [descrição objetiva do problema observado]
|
||||||
|
**Causa raiz:** [identificação precisa da causa]
|
||||||
|
**Categoria:** [Schema/Tipo | Banco | Lógica | Integração | Interface | Config | Infra]
|
||||||
|
**Severidade:** [🔴 Alto | 🟡 Médio | 🟢 Baixo]
|
||||||
|
|
||||||
|
### Arquivos afetados
|
||||||
|
- `caminho/arquivo1.ts` — [o que precisa mudar]
|
||||||
|
- `caminho/arquivo2.vue` — [o que precisa mudar]
|
||||||
|
|
||||||
|
### Plano de correção
|
||||||
|
1. [Primeiro passo]
|
||||||
|
2. [Segundo passo]
|
||||||
|
3. [Verificação]
|
||||||
|
|
||||||
|
### Riscos
|
||||||
|
- [Efeito colateral possível, se houver]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 6 — Executar Correção
|
||||||
|
|
||||||
|
Somente após o diagnóstico declarado:
|
||||||
|
|
||||||
|
1. Aplicar as mudanças conforme o plano
|
||||||
|
2. Verificar build após cada mudança significativa
|
||||||
|
3. Confirmar que o problema original foi resolvido
|
||||||
|
4. Verificar se não houve regressão nos arquivos afetados
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Atalho para Problemas Triviais
|
||||||
|
|
||||||
|
Quando o problema é **evidentemente trivial** (typo, import faltando, formatação), o diagnóstico pode ser condensado em uma linha:
|
||||||
|
|
||||||
|
```
|
||||||
|
DIAGNÓSTICO: Import ausente de `zContato` em `_contatos.ts` (linha 5). Adicionando.
|
||||||
|
```
|
||||||
|
|
||||||
|
A etapa de diagnóstico **nunca é eliminada** — apenas simplificada proporcionalmente à complexidade.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
- [ ] O código afetado foi lido integralmente (não apenas a linha do erro)?
|
||||||
|
- [ ] A Memória Azteca foi consultada para soluções anteriores?
|
||||||
|
- [ ] A causa raiz foi identificada (não apenas o sintoma)?
|
||||||
|
- [ ] O impacto foi avaliado (arquivos e módulos afetados)?
|
||||||
|
- [ ] O diagnóstico foi declarado ao operador antes da correção?
|
||||||
|
- [ ] A correção resolve a causa raiz, não apenas o sintoma?
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Skill: `global/skills/diagnosticar-erros-build/SKILL`
|
||||||
|
- Skill: `agents/refatorar/skills/diagnosticar-code-smells/SKILL`
|
||||||
|
- Rule: `global/rules/autonomia-agente`
|
||||||
186
global/skills/diagnosticar-erros-build/SKILL.md
Normal file
186
global/skills/diagnosticar-erros-build/SKILL.md
Normal file
|
|
@ -0,0 +1,186 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-erros-build
|
||||||
|
scope: global
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
description: >
|
||||||
|
Guia operacional para diagnosticar e resolver erros de build em cascata em monorepos TypeScript.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Erros de Build em Monorepo TypeScript
|
||||||
|
|
||||||
|
Use esta skill quando o build de um monorepo TypeScript falha — especialmente quando erros aparecem em pacotes que não foram diretamente modificados (erros em cascata).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 1 — Capturar o Erro Completo
|
||||||
|
|
||||||
|
Executar o build com output completo e sem truncamento:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# pnpm (monorepo completo)
|
||||||
|
pnpm build 2>&1 | head -200
|
||||||
|
|
||||||
|
# Pacote específico
|
||||||
|
pnpm --filter <pacote> build 2>&1
|
||||||
|
|
||||||
|
# tsc direto (se disponível)
|
||||||
|
npx tsc --noEmit --pretty 2>&1 | head -100
|
||||||
|
```
|
||||||
|
|
||||||
|
Identificar:
|
||||||
|
|
||||||
|
- **Qual pacote falhou primeiro** (nem sempre é o que aparece no topo)
|
||||||
|
- **Código do erro** (`TS2304`, `TS2345`, `TS7006`, etc.)
|
||||||
|
- **Arquivo e linha** do erro original
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 2 — Classificar o Tipo de Erro
|
||||||
|
|
||||||
|
### Erros de dependência entre pacotes (cascata)
|
||||||
|
|
||||||
|
| Sintoma | Causa provável | Solução |
|
||||||
|
|---------|---------------|---------|
|
||||||
|
| `Cannot find module '@org/xxx'` | Pacote não foi buildado antes | Buildar na ordem correta ou usar `references` |
|
||||||
|
| `Module has no exported member 'X'` | Tipo renomeado/removido no pacote origem | Atualizar import no consumidor |
|
||||||
|
| Tipos `any` infiltrados | Pacote exporta sem `.d.ts` | Verificar `declaration: true` no tsconfig |
|
||||||
|
| `The inferred type cannot be named` | Dependência circular de tipos | Extrair tipo para pacote compartilhado |
|
||||||
|
|
||||||
|
### Erros de configuração
|
||||||
|
|
||||||
|
| Sintoma | Causa provável | Solução |
|
||||||
|
|---------|---------------|---------|
|
||||||
|
| `Cannot use import statement` | `module` errado no tsconfig | Alinhar `module`/`moduleResolution` |
|
||||||
|
| `Relative import paths need extensions` | Node16/NodeNext resolution | Adicionar `.js` nos imports ou mudar para `bundler` |
|
||||||
|
| `rootDir is expected to contain all source files` | Arquivo fora do `rootDir` | Ajustar `rootDir` ou mover arquivo |
|
||||||
|
| `Referenced project must have setting composite` | Project references sem `composite` | Adicionar `composite: true` no tsconfig referenciado |
|
||||||
|
|
||||||
|
### Erros de tipagem
|
||||||
|
|
||||||
|
| Sintoma | Causa provável | Solução |
|
||||||
|
|---------|---------------|---------|
|
||||||
|
| `TS2304: Cannot find name` | Tipo global não declarado | Criar `d.ts` ou importar explicitamente |
|
||||||
|
| `TS2345: Argument not assignable` | Tipos incompatíveis entre versões | Alinhar versão da dependência |
|
||||||
|
| `TS7006: Parameter implicitly has 'any'` | `noImplicitAny` ativado | Tipar o parâmetro explicitamente |
|
||||||
|
| `TS18046: is of type 'unknown'` | Narrowing ausente | Fazer type guard antes de usar |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 3 — Identificar a Raiz do Problema
|
||||||
|
|
||||||
|
O erro que aparece **primeiro** nem sempre é a raiz. Seguir esta estratégia:
|
||||||
|
|
||||||
|
### 3.1. Verificar ordem de build
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Listar dependências internas para entender ordem correta
|
||||||
|
rg '"workspace:' --include='package.json' -l | sort
|
||||||
|
|
||||||
|
# Se usar turbo, verificar o pipeline
|
||||||
|
cat turbo.json | jq '.pipeline.build'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2. Rebuild isolado do pacote raiz
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Buildar APENAS o pacote mais baixo na hierarquia que apresenta erro
|
||||||
|
pnpm --filter <pacote-raiz> build
|
||||||
|
|
||||||
|
# Se esse buildar com sucesso, subir na hierarquia
|
||||||
|
pnpm --filter <pacote-consumidor> build
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3. Verificar checagem de tipos isolada
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Verificar se a tipagem está correta sem produzir output
|
||||||
|
npx tsc --noEmit -p <caminho>/tsconfig.json
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 4 — Resolver Erros em Cascata
|
||||||
|
|
||||||
|
### Estratégia: de baixo para cima
|
||||||
|
|
||||||
|
1. Identificar o pacote **mais fundamental** (aquele que não depende de outros internos)
|
||||||
|
2. Resolver TODOS os erros nesse pacote
|
||||||
|
3. Rebuildar
|
||||||
|
4. Subir para o próximo pacote na cadeia de dependência
|
||||||
|
5. Repetir até o topo
|
||||||
|
|
||||||
|
### Armadilhas comuns
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ❌ ERRADO: "resolver" com any (viola typescript-sem-any)
|
||||||
|
const dados = resultado as any
|
||||||
|
|
||||||
|
// ✅ CORRETO: tipar adequadamente
|
||||||
|
const dados: ResultadoEsperado = resultado
|
||||||
|
|
||||||
|
// ❌ ERRADO: ignorar erro com @ts-ignore
|
||||||
|
// @ts-ignore
|
||||||
|
import { funcao } from '@org/pacote'
|
||||||
|
|
||||||
|
// ✅ CORRETO: investigar por que o import falha
|
||||||
|
// O pacote '@org/pacote' foi buildado? O export existe?
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 5 — Verificar Alinhamento de Configuração
|
||||||
|
|
||||||
|
Quando erros persistem entre pacotes, verificar alinhamento de tsconfig:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Comparar configurações críticas entre pacotes
|
||||||
|
for f in $(fd tsconfig.json --max-depth 2 --type f); do
|
||||||
|
echo "=== $f ==="
|
||||||
|
jq '{target, module, moduleResolution, strict, composite, declaration}' "$f" 2>/dev/null
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
Campos que **devem** ser consistentes entre pacotes do mesmo monorepo:
|
||||||
|
|
||||||
|
| Campo | Recomendação |
|
||||||
|
|-------|-------------|
|
||||||
|
| `target` | Mesmo alvo para todos (ex: `ES2022`) |
|
||||||
|
| `module` | Consistente (ex: `ESNext` ou `Node16`) |
|
||||||
|
| `moduleResolution` | Consistente (ex: `bundler` ou `node16`) |
|
||||||
|
| `strict` | `true` em todos |
|
||||||
|
| `declaration` | `true` em libs, opcional em apps |
|
||||||
|
| `composite` | `true` em libs referenciadas |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 6 — Limpar e Rebuildar
|
||||||
|
|
||||||
|
Quando a investigação não revela causa óbvia:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Limpar artefatos de build de todos os pacotes
|
||||||
|
fd -t d 'dist|build|.tsbuildinfo' --exclude node_modules | xargs rm -rf
|
||||||
|
|
||||||
|
# Limpar node_modules (último recurso)
|
||||||
|
fd -t d node_modules --max-depth 2 | xargs rm -rf
|
||||||
|
|
||||||
|
# Reinstalar e rebuildar do zero
|
||||||
|
pnpm install && pnpm build
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist Final
|
||||||
|
|
||||||
|
- [ ] O pacote raiz do erro em cascata foi identificado?
|
||||||
|
- [ ] O erro original (não o efeito cascata) foi localizado?
|
||||||
|
- [ ] A solução não usa `any`, `as any` ou `@ts-ignore`?
|
||||||
|
- [ ] Todos os pacotes na cadeia foram rebuildados após a correção?
|
||||||
|
- [ ] As configurações de tsconfig estão alinhadas entre pacotes?
|
||||||
|
- [ ] O build completo passa sem erros?
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rules: `global/rules/typescript-sem-any`
|
||||||
|
- Workflow: `global/workflows/otimizar-codigos`
|
||||||
|
- Skill: `global/skills/mapear-codigo-fonte/SKILL`
|
||||||
161
global/skills/documentar-decisao-tecnica/SKILL.md
Normal file
161
global/skills/documentar-decisao-tecnica/SKILL.md
Normal file
|
|
@ -0,0 +1,161 @@
|
||||||
|
---
|
||||||
|
name: documentar-decisao-tecnica
|
||||||
|
scope: global
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
description: >
|
||||||
|
Guia operacional para registrar decisões técnicas e arquiteturais como ADRs (Architecture Decision Records).
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Documentar Decisão Técnica (ADR)
|
||||||
|
|
||||||
|
Use esta skill sempre que uma decisão técnica significativa for tomada — escolha de biblioteca, mudança de arquitetura, padrão de código, migração, ou qualquer decisão que afete múltiplos pacotes ou desenvolvedores.
|
||||||
|
|
||||||
|
O objetivo é garantir que **nenhuma decisão fique apenas na cabeça** ou perdida em conversas.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quando usar
|
||||||
|
|
||||||
|
- Nova dependência adicionada ao monorepo
|
||||||
|
- Mudança de padrão arquitetural (ex: de REST para GraphQL)
|
||||||
|
- Escolha de ferramenta ou lib entre alternativas
|
||||||
|
- Decisão de breaking change
|
||||||
|
- Migração de tecnologia
|
||||||
|
- Mudança de estratégia de deploy ou CI/CD
|
||||||
|
- Qualquer decisão que alguém pode questionar daqui 3 meses
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 1 — Criar o Diretório de ADRs (se não existir)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p .docs/adrs
|
||||||
|
```
|
||||||
|
|
||||||
|
Convenção de diretório: `.docs/adrs/` na raiz do monorepo.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 2 — Criar o Arquivo ADR
|
||||||
|
|
||||||
|
Nomenclatura: `NNN-titulo-em-kebab-case.md`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Encontrar o próximo número
|
||||||
|
NEXT=$(ls .docs/adrs/*.md 2>/dev/null | wc -l | xargs -I{} expr {} + 1)
|
||||||
|
NEXT=$(printf "%03d" $NEXT)
|
||||||
|
echo "Próximo ADR: $NEXT"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 3 — Preencher o Template
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# ADR-NNN: Título Descritivo da Decisão
|
||||||
|
|
||||||
|
**Data:** YYYY-MM-DD
|
||||||
|
**Status:** proposto | aceito | substituído por ADR-XXX | descontinuado
|
||||||
|
**Autores:** Nome(s)
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
Descreva a situação que levou à necessidade de uma decisão.
|
||||||
|
Inclua:
|
||||||
|
- O problema enfrentado
|
||||||
|
- Restrições técnicas ou de negócio
|
||||||
|
- O que motivou a discussão
|
||||||
|
|
||||||
|
## Decisão
|
||||||
|
|
||||||
|
Descreva a decisão tomada de forma clara e direta.
|
||||||
|
Use voz ativa: "Decidimos usar X para Y porque Z."
|
||||||
|
|
||||||
|
## Alternativas Consideradas
|
||||||
|
|
||||||
|
### Alternativa A: [Nome]
|
||||||
|
- **Prós:** ...
|
||||||
|
- **Contras:** ...
|
||||||
|
- **Motivo da rejeição:** ...
|
||||||
|
|
||||||
|
### Alternativa B: [Nome]
|
||||||
|
- **Prós:** ...
|
||||||
|
- **Contras:** ...
|
||||||
|
- **Motivo da rejeição:** ...
|
||||||
|
|
||||||
|
## Consequências
|
||||||
|
|
||||||
|
### Positivas
|
||||||
|
- O que melhora com essa decisão
|
||||||
|
|
||||||
|
### Negativas
|
||||||
|
- O que fica mais complexo ou limitado
|
||||||
|
- Débitos técnicos introduzidos
|
||||||
|
|
||||||
|
### Neutras
|
||||||
|
- Mudanças que não são boas nem ruins, mas afetam o workflow
|
||||||
|
|
||||||
|
## Impacto no Monorepo
|
||||||
|
|
||||||
|
Listar quais pacotes/módulos são afetados:
|
||||||
|
- `@org/pacote-a` — precisa migrar de X para Y
|
||||||
|
- `@org/pacote-b` — sem impacto
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 4 — Conectar com o Sistema de Conhecimento
|
||||||
|
|
||||||
|
Após criar o ADR, avaliar se a decisão deve gerar:
|
||||||
|
|
||||||
|
| A decisão... | Ação |
|
||||||
|
|-------------|------|
|
||||||
|
| Cria uma **restrição** permanente (ex: "nunca usar lib X") | Criar/atualizar uma **Rule** em `.agent/local/rules/` |
|
||||||
|
| Define um **processo** repetível (ex: "para migrar, faça X, Y, Z") | Criar/atualizar um **Workflow** em `.agent/local/workflows/` |
|
||||||
|
| Refina um **padrão operacional** (ex: "queries agora usam pool separado") | Atualizar a **Skill** correspondente em `.agent/local/skills/` |
|
||||||
|
| Não gera artefato adicional | Apenas o ADR é suficiente |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 5 — Validar o ADR
|
||||||
|
|
||||||
|
Antes de considerar completo:
|
||||||
|
|
||||||
|
- **Teste do "daqui a 6 meses"**: alguém que não participou da conversa consegue entender a decisão?
|
||||||
|
- **Teste da reversibilidade**: está claro o que seria necessário para reverter essa decisão?
|
||||||
|
- **Teste do impacto**: todos os pacotes afetados estão listados?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Exemplos de ADRs Reais
|
||||||
|
|
||||||
|
### Bom ✅
|
||||||
|
|
||||||
|
> **ADR-003: Usar Zod para validação de schemas em vez de Joi**
|
||||||
|
>
|
||||||
|
> **Contexto:** O projeto usava Joi para validação no backend, mas ao compartilhar schemas entre back e front em um monorepo, Joi se mostrou pesado para o bundle do frontend (280KB gzipped).
|
||||||
|
>
|
||||||
|
> **Decisão:** Migrar para Zod em todos os pacotes. Zod oferece inferência nativa de tipos TypeScript, é 10x menor, e elimina a necessidade de manter tipos e schemas separados.
|
||||||
|
|
||||||
|
### Ruim ❌
|
||||||
|
|
||||||
|
> **ADR-003: Usar Zod**
|
||||||
|
>
|
||||||
|
> Decidimos usar Zod porque é melhor.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist Final
|
||||||
|
|
||||||
|
- [ ] O contexto explica o "porquê" da decisão?
|
||||||
|
- [ ] As alternativas consideradas estão documentadas?
|
||||||
|
- [ ] As consequências (positivas e negativas) estão claras?
|
||||||
|
- [ ] Os pacotes impactados estão listados?
|
||||||
|
- [ ] O status está definido (proposto/aceito)?
|
||||||
|
- [ ] A decisão gerou rules/workflows/skills quando aplicável?
|
||||||
|
- [ ] Alguém de fora do contexto entenderia este ADR?
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Workflow: `global/workflows/aprimorar-IA` (seção de classificação de artefatos)
|
||||||
|
- Workflow: `global/workflows/otimizar-codigos`
|
||||||
131
global/skills/documentar-dominio-modulo/SKILL.md
Normal file
131
global/skills/documentar-dominio-modulo/SKILL.md
Normal file
|
|
@ -0,0 +1,131 @@
|
||||||
|
---
|
||||||
|
name: documentar-dominio-modulo
|
||||||
|
scope: global
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
description: >
|
||||||
|
Guia para documentar o domínio científico/técnico de cada módulo SaaS,
|
||||||
|
garantindo que o agente compreenda a terminologia e as regras do domínio
|
||||||
|
ao gerar código, texto e interface.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Documentar Domínio de um Módulo
|
||||||
|
|
||||||
|
Use esta skill ao iniciar um novo módulo SaaS ou ao perceber que o agente não conhece o vocabulário e as regras do domínio que o módulo aborda.
|
||||||
|
|
||||||
|
Cada módulo opera em uma disciplina diferente da ciência/gestão ambiental (licenciamento, gases de efeito estufa, resíduos, projetos, etc.). O agente precisa de uma **base factual do domínio** para gerar labels, mensagens, regras de negócio e textos comerciais corretos.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 1 — Identificar o Domínio do Módulo
|
||||||
|
|
||||||
|
Determinar qual área da ciência/gestão o módulo aborda:
|
||||||
|
|
||||||
|
| Exemplo de módulo | Domínio |
|
||||||
|
|---|---|
|
||||||
|
| Licenciamento | Licenciamento ambiental (LP, LI, LO, condicionantes) |
|
||||||
|
| GEE | Gases de Efeito Estufa (inventário, emissões, fatores) |
|
||||||
|
| Resíduos | Gestão de resíduos sólidos (PGRS, MTR, classificação) |
|
||||||
|
| Outorga | Outorga de uso de recursos hídricos |
|
||||||
|
| Flora/Fauna | Monitoramento de biodiversidade |
|
||||||
|
| Projetos | Gestão de projetos ambientais e consultorias |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 2 — Criar o Arquivo de Domínio
|
||||||
|
|
||||||
|
Criar documento no arquivo `.regras-negocio.md` do módulo:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Domínio: <Nome do Módulo>
|
||||||
|
|
||||||
|
## Área de Conhecimento
|
||||||
|
Breve descrição da disciplina (1-3 linhas).
|
||||||
|
|
||||||
|
## Glossário do Módulo
|
||||||
|
|
||||||
|
| Termo | Definição | Sigla |
|
||||||
|
|---|---|---|
|
||||||
|
| Licença Prévia | Autorização para planejamento do empreendimento | LP |
|
||||||
|
| Licença de Instalação | Autorização para início das obras | LI |
|
||||||
|
| ... | ... | ... |
|
||||||
|
|
||||||
|
## Entidades Principais
|
||||||
|
|
||||||
|
Lista das entidades de negócio do módulo com descrição e relações:
|
||||||
|
|
||||||
|
- **Empreendimento**: unidade física onde ocorre a atividade potencialmente poluidora
|
||||||
|
- **Licença**: autorização ambiental vinculada a um empreendimento
|
||||||
|
- **Condicionante**: obrigação imposta pelo órgão ambiental na licença
|
||||||
|
- ...
|
||||||
|
|
||||||
|
## Legislação Aplicável
|
||||||
|
|
||||||
|
| Norma | Descrição | Relevância |
|
||||||
|
|---|---|---|
|
||||||
|
| Lei 6.938/1981 | Política Nacional do Meio Ambiente | Base legal do licenciamento |
|
||||||
|
| Resolução CONAMA 237/1997 | Regulamenta o licenciamento ambiental | Tipos de licença, prazos |
|
||||||
|
| ... | ... | ... |
|
||||||
|
|
||||||
|
## Regras de citação legal
|
||||||
|
- Formato: "Resolução CONAMA nº 237/1997, art. 8º, inciso I"
|
||||||
|
- Toda sigla na primeira ocorrência com nome por extenso
|
||||||
|
- Legislação federal > estadual > municipal (hierarquia)
|
||||||
|
|
||||||
|
## Fluxos do Domínio
|
||||||
|
|
||||||
|
Descrever os processos-chave que o módulo implementa:
|
||||||
|
|
||||||
|
1. Solicitação de licença → Análise técnica → Emissão → Monitoramento
|
||||||
|
2. Cadastro de condicionante → Acompanhamento de prazo → Cumprimento
|
||||||
|
|
||||||
|
## Vocabulário de Interface
|
||||||
|
|
||||||
|
Termos que devem ser usados em labels, botões e mensagens:
|
||||||
|
|
||||||
|
| Contexto | ❌ Genérico | ✅ Correto para o módulo |
|
||||||
|
|---|---|---|
|
||||||
|
| Campo de nome | "Nome" | "Razão Social do Empreendedor" |
|
||||||
|
| Status | "Ativo/Inativo" | "Vigente/Vencida/Suspensa" |
|
||||||
|
| Ação principal | "Criar novo" | "Solicitar nova licença" |
|
||||||
|
| Lista vazia | "Nenhum registro" | "Nenhuma licença cadastrada" |
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 3 — Validar com o Operador
|
||||||
|
|
||||||
|
Antes de consolidar:
|
||||||
|
|
||||||
|
- [ ] Os termos do glossário estão corretos para o contexto do módulo?
|
||||||
|
- [ ] As entidades cobrem os conceitos centrais?
|
||||||
|
- [ ] A legislação listada é a principal (não exaustiva)?
|
||||||
|
- [ ] O vocabulário de interface reflete como o usuário fala no dia a dia?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 4 — Conectar com as Rules
|
||||||
|
|
||||||
|
Após documentar o domínio:
|
||||||
|
|
||||||
|
1. Verificar se labels e mensagens no código usam o vocabulário definido (rule `mensagens-usuario`)
|
||||||
|
2. Verificar se schemas Zod têm mensagens de erro no idioma do domínio (rule `zod-validacao-padrao`)
|
||||||
|
3. Verificar se os arquivos `.ajuda.md` usam termos do glossário (workflow `adicionar-ajuda.md`)
|
||||||
|
4. Verificar se textos comerciais citam a legislação corretamente (workflow `comercial`)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist Final
|
||||||
|
|
||||||
|
- [ ] Arquivo `.regras-negocio.md` do módulo criado e validado?
|
||||||
|
- [ ] Glossário com pelo menos os 10 termos centrais do módulo?
|
||||||
|
- [ ] Entidades principais listadas com descrição?
|
||||||
|
- [ ] Legislação base documentada com formato de citação?
|
||||||
|
- [ ] Vocabulário de interface definido (labels, status, ações, empty states)?
|
||||||
|
- [ ] Operador validou a terminologia?
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/mensagens-usuario`
|
||||||
|
- Rule: `global/rules/regras-negocio-md`
|
||||||
|
- Workflow: `agents/comercial/workflows/comercial`
|
||||||
|
- Workflow: `agents/front/workflows/adicionar-ajuda`
|
||||||
212
global/skills/documentar-regras-negocio/SKILL.md
Normal file
212
global/skills/documentar-regras-negocio/SKILL.md
Normal file
|
|
@ -0,0 +1,212 @@
|
||||||
|
---
|
||||||
|
name: documentar-regras-negocio
|
||||||
|
scope: global
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
description: >
|
||||||
|
Guia operacional para criar, preencher e manter arquivos {modulo}.regras-negocio.md
|
||||||
|
co-localizados com módulos TypeScript de lógica de negócio complexa.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Documentar Regras de Negócio em Módulos
|
||||||
|
|
||||||
|
Use esta skill sempre que um módulo TypeScript contiver lógica de decisão não-trivial
|
||||||
|
que precise ser rastreável por produto, suporte e desenvolvimento sem exigir leitura de código.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quando usar esta skill
|
||||||
|
|
||||||
|
- Módulo com 3+ critérios de decisão distintos
|
||||||
|
- Lógica de eleição/priorização entre registros
|
||||||
|
- Processamento que pode resultar em revisão manual
|
||||||
|
- Worker/CRON consumindo dados com estratégias diferenciadas por tipo
|
||||||
|
- Importador automático com regras de aceite/rejeição
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 1 — Identificar o escopo das regras
|
||||||
|
|
||||||
|
Antes de escrever o `.md`, percorrer o módulo e identificar:
|
||||||
|
|
||||||
|
| Categoria | O que procurar |
|
||||||
|
|---|---|
|
||||||
|
| **Critérios de entrada** | Filtros de query (excluido, vencimento, etc.) |
|
||||||
|
| **Critérios de bloqueio** | Condições que bloqueiam o fluxo automático |
|
||||||
|
| **Estratégia por tipo de dado** | Concatenação vs. primeiro-não-nulo vs. outros |
|
||||||
|
| **Eleição de principal** | Regras de prioridade entre registros |
|
||||||
|
| **Estado contraditório** | Combinações de campos mutuamente exclusivas |
|
||||||
|
| **Dependências externas** | Tabelas, filas, serviços tocados |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 2 — Criar o arquivo
|
||||||
|
|
||||||
|
Nomenclatura: `{nome-do-modulo-sem-underline-inicial}.regras-negocio.md`
|
||||||
|
|
||||||
|
Localizar **na mesma pasta** do arquivo TypeScript:
|
||||||
|
|
||||||
|
```
|
||||||
|
modulo/
|
||||||
|
_meuModulo.ts
|
||||||
|
meu-modulo.regras-negocio.md ← co-localizado
|
||||||
|
```
|
||||||
|
|
||||||
|
Se o módulo for arquivo isolado (não pasta):
|
||||||
|
```
|
||||||
|
CRONS/
|
||||||
|
_cron_nome.ts
|
||||||
|
_cron_nome.regras-negocio.md ← mesmo diretório
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 3 — Preencher com o template
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Regras de Negócio — [Nome Legível do Módulo]
|
||||||
|
|
||||||
|
Módulo: `_arquivo.ts`
|
||||||
|
Localização: `caminho/relativo/ao/workspace`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
[Por que este módulo existe. Qual problema de negócio resolve.
|
||||||
|
Inclua o cenário que levou à sua criação — ex: "O sistema pode gerar duplicatas
|
||||||
|
por importações simultâneas..."]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Critérios de Entrada
|
||||||
|
|
||||||
|
[O que aciona o módulo. Filtros aplicados na query de identificação.
|
||||||
|
Ex: `excluido = false`, mesmo `(codigo_origem, vencimento)`, etc.]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Regras de Processamento
|
||||||
|
|
||||||
|
[Numeradas em ordem de avaliação. Cada regra deve incluir:
|
||||||
|
- Condição de ativação
|
||||||
|
- O que acontece quando ativada
|
||||||
|
- Se bloqueia ou direciona]
|
||||||
|
|
||||||
|
### Regra 1 — [Nome]
|
||||||
|
...
|
||||||
|
|
||||||
|
### Regra 2 — [Nome]
|
||||||
|
...
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Casos de Revisão Manual
|
||||||
|
|
||||||
|
[Quando o fluxo automático não pode prosseguir.
|
||||||
|
Liste as condições que enviam para revisão manual.
|
||||||
|
Se aplicável: como o caso é reportado (e-mail, log, fila de revisão).]
|
||||||
|
|
||||||
|
> **`null` é neutro** quando aplicável: descrever aqui se a lógica usa null como ausência neutra.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Estratégia de Saída / Fusão de Campos
|
||||||
|
|
||||||
|
[Como os dados são combinados ou qual resultado é produzido.
|
||||||
|
Usar tabela para clareza:]
|
||||||
|
|
||||||
|
| Campo | Estratégia |
|
||||||
|
|---|---|
|
||||||
|
| `campo_textual` | Concatenação sem repetição |
|
||||||
|
| `campo_data` | Primeiro valor não-nulo vence |
|
||||||
|
| `campo_booleano` | Primeiro valor não-nulo vence |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Dependências Externas
|
||||||
|
|
||||||
|
[Tabelas lidas/escritas, filas disparadas, serviços externos.
|
||||||
|
Incluir colunas de relacionamento quando relevante.]
|
||||||
|
|
||||||
|
- Tabelas de negócio: `tabela_a`, `tabela_b`
|
||||||
|
- Relacionamentos re-apontados: `tabela_c` via `(codigo_origem, tabela_origem)`
|
||||||
|
- Filas: nenhuma / `nome-da-fila`
|
||||||
|
- E-mails: nenhum / destinatários e gatilho
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 4 — Adicionar referência no módulo TypeScript
|
||||||
|
|
||||||
|
Na **primeira linha útil** do arquivo `.ts` (após shebang ou licença, se houver):
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Regras de negócio: ver {modulo}.regras-negocio.md
|
||||||
|
|
||||||
|
import { ... } from "..."
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 5 — Limpar JSDoc duplicados
|
||||||
|
|
||||||
|
Percorrer os JSDoc do módulo e:
|
||||||
|
|
||||||
|
| Se encontrar | Ação |
|
||||||
|
|---|---|
|
||||||
|
| JSDoc listando as regras de negócio | Substituir por referência ao `.md` |
|
||||||
|
| JSDoc descrevendo critérios de bloqueio | Simplificar para "ver `.md`" |
|
||||||
|
| JSDoc com listas de condições | Manter apenas `@param` e `@returns` |
|
||||||
|
| Comentário inline explicando uma regra | Manter — comentários de linha são aceitáveis |
|
||||||
|
|
||||||
|
Exemplo de simplificação:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ❌ Antes — JSDoc duplicando as regras
|
||||||
|
/**
|
||||||
|
* Retorna false quando:
|
||||||
|
* - vencimentos divergentes
|
||||||
|
* - executada com datas distintas e não-nulas
|
||||||
|
* - vencimento_prorrogado distintos
|
||||||
|
* - estado contraditório: nao_executada=true + executada!=null
|
||||||
|
*/
|
||||||
|
|
||||||
|
// ✅ Depois — referência ao .md
|
||||||
|
/**
|
||||||
|
* Verifica se o grupo pode ser fundido e elege o registro principal.
|
||||||
|
* Critérios de bloqueio e regras de eleição: ver regras-negocio.md
|
||||||
|
*
|
||||||
|
* @param execs - Registros do grupo, ordenados do mais antigo para o mais recente
|
||||||
|
* @returns Código do eleito, ou `undefined` quando o grupo vai para revisão manual
|
||||||
|
*/
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 6 — Verificar consistência código ↔ `.md`
|
||||||
|
|
||||||
|
Percorrer cada regra listada no `.md` e verificar que há código correspondente:
|
||||||
|
|
||||||
|
- [ ] Cada critério de bloqueio tem um `if (...) return undefined / return retornoVazio`
|
||||||
|
- [ ] Cada estratégia de campo tem implementação em `fundirCampos` ou equivalente
|
||||||
|
- [ ] A ordem de avaliação no código bate com a ordem no `.md`
|
||||||
|
- [ ] Campos exclusivos de certas tabelas estão guardados pelo `if (tabela === ...)`
|
||||||
|
- [ ] queries têm `orderBy` quando a posição dos resultados tem significado (ver skill `consultar-banco-knex`)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist Final
|
||||||
|
|
||||||
|
- [ ] Arquivo `.md` criado co-localizado com o módulo
|
||||||
|
- [ ] Referência `// Regras de negócio: ver ...` na primeira linha do `.ts`
|
||||||
|
- [ ] JSDoc simplificados — sem duplicar conteúdo do `.md`
|
||||||
|
- [ ] Todas as regras do `.md` têm implementação correspondente no código
|
||||||
|
- [ ] Código e `.md` estão consistentes (separadores, campos, condições)
|
||||||
|
- [ ] `tsc --noEmit` passa sem erros após qualquer mudança de código
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/regras-negocio-md`
|
||||||
|
- Workflow: `global/workflows/documentar-regras-negocio`
|
||||||
160
global/skills/mapear-codigo-fonte/SKILL.md
Normal file
160
global/skills/mapear-codigo-fonte/SKILL.md
Normal file
|
|
@ -0,0 +1,160 @@
|
||||||
|
---
|
||||||
|
name: mapear-codigo-fonte
|
||||||
|
scope: global
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
description: >
|
||||||
|
Guia operacional para mapear, navegar e compreender a estrutura de um monorepo TypeScript.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Mapear Código-Fonte de Monorepo TypeScript
|
||||||
|
|
||||||
|
Use esta skill ao iniciar trabalho em um monorepo desconhecido, ao onboardar em novo projeto, ou quando precisar localizar rapidamente onde uma funcionalidade vive no código.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 1 — Identificar a Raiz e o Gerenciador de Pacotes
|
||||||
|
|
||||||
|
Localize os arquivos que definem a estratégia de monorepo:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Identificar o gerenciador e workspace config
|
||||||
|
ls -la package.json pnpm-workspace.yaml lerna.json turbo.json nx.json tsconfig.base.json 2>/dev/null
|
||||||
|
```
|
||||||
|
|
||||||
|
Elementos a extrair:
|
||||||
|
|
||||||
|
- **Gerenciador**: `pnpm` (workspaces em `pnpm-workspace.yaml`), `npm/yarn` (workspaces em `package.json`), ou `nx`/`turbo`
|
||||||
|
- **Pacotes compartilhados**: diretórios listados em `packages:` ou `workspaces:`
|
||||||
|
- **Apps/serviços**: diretórios de aplicações deployáveis
|
||||||
|
- **TSConfig base**: herança de configuração TypeScript entre pacotes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 2 — Mapear a Árvore de Pacotes
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Listar todos os pacotes do workspace com nomes e caminhos
|
||||||
|
# pnpm
|
||||||
|
pnpm ls --depth -1 -r --json 2>/dev/null | jq '.[].name'
|
||||||
|
|
||||||
|
# Alternativa genérica: encontrar todos os package.json
|
||||||
|
fd package.json --max-depth 3 --type f --exec sh -c 'echo "$(dirname {}): $(jq -r .name {})"'
|
||||||
|
```
|
||||||
|
|
||||||
|
Organizar os pacotes em categorias:
|
||||||
|
|
||||||
|
| Categoria | Padrão de nome | Exemplo |
|
||||||
|
|-----------|---------------|---------|
|
||||||
|
| **Libs compartilhadas** | `@org/common`, `*-comuns`, `*-shared` | Tipos, utils, schemas |
|
||||||
|
| **Backend** | `*-back`, `*-api`, `*-server` | Serviços Node/Express/Fastify |
|
||||||
|
| **Frontend** | `*-front`, `*-web`, `*-app` | Apps Vue/React/Angular |
|
||||||
|
| **Ferramentas** | `*-cli`, `*-scripts`, `*-tools` | Scripts de build, migrations |
|
||||||
|
| **Configs** | `*-config`, `*-eslint-config` | Configs compartilhadas |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 3 — Mapear Dependências Internas
|
||||||
|
|
||||||
|
Identificar o grafo de dependências entre pacotes internos:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Para cada package.json, listar deps internas (que apontam para workspace:)
|
||||||
|
rg '"workspace:' --include='package.json' -l | while read f; do
|
||||||
|
echo "=== $(jq -r .name "$f") ==="
|
||||||
|
jq -r '.dependencies // {} | to_entries[] | select(.value | startswith("workspace:")) | .key' "$f"
|
||||||
|
jq -r '.devDependencies // {} | to_entries[] | select(.value | startswith("workspace:")) | .key' "$f"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
Anotar:
|
||||||
|
|
||||||
|
- Quais pacotes são **folha** (não dependem de outros internos)
|
||||||
|
- Quais são **raiz** (ninguém depende deles — geralmente apps)
|
||||||
|
- Quais são **núcleo** (muitos dependem deles — geralmente libs compartilhadas)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 4 — Mapear Arquitetura de Cada Pacote
|
||||||
|
|
||||||
|
Para cada pacote relevante, identificar a estrutura interna:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Visão geral rápida (2 níveis de profundidade)
|
||||||
|
eza --tree --level=2 --icons --group-directories-first <caminho-do-pacote>/src/
|
||||||
|
# ou
|
||||||
|
tree -L 2 -I node_modules <caminho-do-pacote>/src/
|
||||||
|
```
|
||||||
|
|
||||||
|
Padrões comuns a procurar:
|
||||||
|
|
||||||
|
| Diretório | Responsabilidade típica |
|
||||||
|
|-----------|----------------------|
|
||||||
|
| `src/routes/` ou `src/api/` | Endpoints/rotas HTTP |
|
||||||
|
| `src/services/` | Lógica de negócio |
|
||||||
|
| `src/models/` ou `src/entities/` | Modelos de dados |
|
||||||
|
| `src/utils/` ou `src/helpers/` | Funções utilitárias |
|
||||||
|
| `src/types/` ou `src/typings/` | Definições de tipos TS |
|
||||||
|
| `src/schemas/` | Schemas de validação (Zod, Joi) |
|
||||||
|
| `src/migrations/` | Migrações de banco |
|
||||||
|
| `src/components/` | Componentes de UI (frontend) |
|
||||||
|
| `src/composables/` ou `src/hooks/` | Lógica reutilizável (Vue/React) |
|
||||||
|
| `src/stores/` | Gerenciamento de estado |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 5 — Identificar Pontos de Entrada e Exportações
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Encontrar exports públicos de cada pacote
|
||||||
|
rg "export " --include='index.ts' --include='index.tsx' -l
|
||||||
|
|
||||||
|
# Encontrar entry points no package.json
|
||||||
|
fd package.json --max-depth 3 --type f --exec sh -c 'echo "$(jq -r .name {}):" && jq "{main, module, types, exports}" {}'
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 6 — Documentar o Mapa
|
||||||
|
|
||||||
|
Produzir um resumo estruturado com:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Mapa do Monorepo: <nome>
|
||||||
|
|
||||||
|
## Gerenciador: pnpm | npm | yarn
|
||||||
|
## Build System: tsc | turbo | nx
|
||||||
|
|
||||||
|
## Pacotes
|
||||||
|
|
||||||
|
### Libs Compartilhadas
|
||||||
|
- `@org/types` → tipos compartilhados (depende de: nenhum)
|
||||||
|
- `@org/utils` → funções utilitárias (depende de: @org/types)
|
||||||
|
|
||||||
|
### Aplicações
|
||||||
|
- `@org/api` → backend Express (depende de: @org/types, @org/utils)
|
||||||
|
- `@org/web` → frontend Vue (depende de: @org/types)
|
||||||
|
|
||||||
|
## Fluxo de dados
|
||||||
|
Descrever como os dados fluem entre pacotes.
|
||||||
|
|
||||||
|
## Scripts importantes
|
||||||
|
- `pnpm build` → Build de todos os pacotes
|
||||||
|
- `pnpm dev` → Inicia dev server
|
||||||
|
- `pnpm test` → Roda testes
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist Final
|
||||||
|
|
||||||
|
- [ ] O gerenciador de pacotes e workspace strategy estão identificados?
|
||||||
|
- [ ] Todos os pacotes foram categorizados (lib/app/tool)?
|
||||||
|
- [ ] O grafo de dependências internas foi mapeado?
|
||||||
|
- [ ] Os pontos de entrada de cada pacote estão claros?
|
||||||
|
- [ ] A arquitetura interna dos pacotes principais foi documentada?
|
||||||
|
- [ ] Scripts de build/dev/test foram identificados?
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rules: `global/rules/typescript-sem-any`
|
||||||
|
- Workflow: `global/workflows/otimizar-codigos`
|
||||||
177
global/skills/orquestrar-agentes/SKILL.md
Normal file
177
global/skills/orquestrar-agentes/SKILL.md
Normal file
|
|
@ -0,0 +1,177 @@
|
||||||
|
---
|
||||||
|
name: orquestrar-agentes
|
||||||
|
description: >
|
||||||
|
Protocolo de colaboração e handoff entre agentes especializados do ecossistema Azteca.
|
||||||
|
Define como agentes passam contexto, comunicam resultados e resolvem dependências.
|
||||||
|
scope: global
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Orquestrar Agentes
|
||||||
|
|
||||||
|
Use esta skill sempre que uma tarefa exigir a colaboração de dois ou mais agentes especializados, ou quando precisar entender quem deve fazer o quê em uma implementação complexa.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 1 — Identificar os agentes envolvidos
|
||||||
|
|
||||||
|
Antes de qualquer implementação, mapear quais agentes são necessários:
|
||||||
|
|
||||||
|
| Tarefa | Agente responsável |
|
||||||
|
|--------|-------------------|
|
||||||
|
| Definir arquitetura, contratos de API, schemas | `@arquiteto` |
|
||||||
|
| Implementar backend (rotas, serviços, banco) | `@back` |
|
||||||
|
| Implementar frontend (telas, componentes, fluxos) | `@front` |
|
||||||
|
| Garantir qualidade e criar testes | `@testes` |
|
||||||
|
| Configurar infraestrutura e deploy | `@deploy` |
|
||||||
|
| Criar/atualizar documentação | `@documentacao` |
|
||||||
|
| Revisar e melhorar UX | `@ux` |
|
||||||
|
| Criar materiais de venda e marketing | `@comercial` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 2 — Definir a sequência de handoff
|
||||||
|
|
||||||
|
Toda tarefa complexa segue uma ordem de precedência:
|
||||||
|
|
||||||
|
```
|
||||||
|
1. @arquiteto → define e especifica
|
||||||
|
2. @back → implementa backend + schemas *-comuns
|
||||||
|
3. @front → implementa frontend (consome *-comuns)
|
||||||
|
4. @ux → revisa experiência (paralelo com front)
|
||||||
|
5. @testes → valida qualidade
|
||||||
|
6. @deploy → empacota e publica
|
||||||
|
7. @documentacao → documenta (pode ser paralelo)
|
||||||
|
8. @comercial → cria materiais (após documentação)
|
||||||
|
```
|
||||||
|
|
||||||
|
Agentes podem trabalhar em paralelo quando não há dependência direta:
|
||||||
|
- `@ux` e `@front` podem colaborar em paralelo
|
||||||
|
- `@documentacao` pode trabalhar em paralelo com `@testes`
|
||||||
|
- `@comercial` é sempre o último da cadeia
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 3 — Formato de mensagem entre agentes
|
||||||
|
|
||||||
|
Quando um agente precisa comunicar resultado ou delegar tarefa para outro, usar o formato:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
**De:** @arquiteto
|
||||||
|
**Para:** @back
|
||||||
|
**Tipo:** especificação | resultado | bloqueio | revisão
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
[O que foi decidido/implementado/identificado]
|
||||||
|
|
||||||
|
## Entrega
|
||||||
|
[O que o agente destinatário precisa fazer ou receber]
|
||||||
|
|
||||||
|
## Dependências
|
||||||
|
[Arquivos, schemas, endpoints ou decisões que o destinatário precisa conhecer]
|
||||||
|
|
||||||
|
## Critérios de aceite
|
||||||
|
[Como saber que a tarefa do destinatário está completa]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 4 — Regras de escopo entre agentes
|
||||||
|
|
||||||
|
### Permitido ✅
|
||||||
|
|
||||||
|
```
|
||||||
|
@arquiteto → pode delegar para qualquer agente
|
||||||
|
@back → pode enviar schemas e endpoints para @front (via *-comuns)
|
||||||
|
@front → pode solicitar revisão de @ux
|
||||||
|
@ux → pode propor melhorias para @front
|
||||||
|
@testes → pode reportar bugs para @back e @front
|
||||||
|
@documentacao → pode documentar artefatos de qualquer agente
|
||||||
|
@deploy → recebe builds de @back e @front
|
||||||
|
```
|
||||||
|
|
||||||
|
### Proibido ❌
|
||||||
|
|
||||||
|
```
|
||||||
|
@front ✗ não importa código de @back diretamente
|
||||||
|
@back ✗ não cria componentes Vue ou lógica de interface
|
||||||
|
@comercial ✗ não promete features que @arquiteto não aprovou
|
||||||
|
@testes ✗ não modifica código de produção
|
||||||
|
@ux ✗ não implementa código Vue — apenas orienta @front
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 5 — Resolução de conflitos
|
||||||
|
|
||||||
|
Quando dois agentes têm visões diferentes:
|
||||||
|
|
||||||
|
1. **Técnico vs. UX:** `@arquiteto` arbitra, priorizando viabilidade técnica com mínimo impacto na UX
|
||||||
|
2. **Back vs. Front (sobre contrato de API):** `@arquiteto` define o contrato no schema `*-comuns`
|
||||||
|
3. **Documentação vs. Implementação:** O código é a verdade — `@documentacao` atualiza para refletir o código
|
||||||
|
4. **Comercial vs. Produto:** `@arquiteto` define o que existe; `@comercial` comunica apenas o real
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 6 — Fluxos típicos de colaboração
|
||||||
|
|
||||||
|
### Fluxo: Nova feature completa
|
||||||
|
|
||||||
|
```
|
||||||
|
@arquiteto → especifica schema e contrato de API
|
||||||
|
↓
|
||||||
|
@back → implementa endpoint + atualiza *-comuns
|
||||||
|
↓
|
||||||
|
@front → implementa tela consumindo *-comuns
|
||||||
|
↓ (paralelo)
|
||||||
|
@ux → revisa UX da tela
|
||||||
|
↓
|
||||||
|
@testes → valida back + front
|
||||||
|
↓
|
||||||
|
@deploy → publica
|
||||||
|
↓ (paralelo)
|
||||||
|
@documentacao → documenta
|
||||||
|
↓
|
||||||
|
@comercial → cria material de divulgação
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fluxo: Correção de bug crítico
|
||||||
|
|
||||||
|
```
|
||||||
|
@testes → identifica e documenta bug
|
||||||
|
↓
|
||||||
|
@back ou @front → corrige
|
||||||
|
↓
|
||||||
|
@testes → valida correção
|
||||||
|
↓
|
||||||
|
@deploy → hotfix
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fluxo: Melhoria de UX
|
||||||
|
|
||||||
|
```
|
||||||
|
@ux → identifica problema e propõe melhoria
|
||||||
|
↓
|
||||||
|
@arquiteto → avalia impacto técnico
|
||||||
|
↓
|
||||||
|
@front → implementa
|
||||||
|
↓
|
||||||
|
@ux → valida
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist de orquestração
|
||||||
|
|
||||||
|
- [ ] Agentes necessários identificados?
|
||||||
|
- [ ] Sequência de handoff definida?
|
||||||
|
- [ ] Dependências entre agentes mapeadas?
|
||||||
|
- [ ] Critérios de aceite definidos para cada entrega?
|
||||||
|
- [ ] Conflitos potenciais identificados e árbitro definido?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/autonomia-agente`
|
||||||
|
- Rule: `global/rules/fronteiras-monorepo`
|
||||||
|
- Personas: `agents/*/persona`
|
||||||
110
manifesto.json
110
manifesto.json
|
|
@ -5,43 +5,43 @@
|
||||||
"artefatos": {
|
"artefatos": {
|
||||||
"global": {
|
"global": {
|
||||||
"rules": [
|
"rules": [
|
||||||
"global/rules/autonomia-agente",
|
"global/rules/autonomia-agente.md",
|
||||||
"global/rules/carta-principios-agente-azteca",
|
"global/rules/carta-principios-agente-azteca.md",
|
||||||
"global/rules/consultar-banco-query-ia",
|
"global/rules/consultar-banco-query-ia.md",
|
||||||
"global/rules/css-global-betha",
|
"global/rules/css-global-betha.md",
|
||||||
"global/rules/diagnostico-antes-correcao",
|
"global/rules/diagnostico-antes-correcao.md",
|
||||||
"global/rules/escrita-natural",
|
"global/rules/escrita-natural.md",
|
||||||
"global/rules/estilos-design-system",
|
"global/rules/estilos-design-system.md",
|
||||||
"global/rules/feedback-visivel",
|
"global/rules/feedback-visivel.md",
|
||||||
"global/rules/fronteiras-monorepo",
|
"global/rules/fronteiras-monorepo.md",
|
||||||
"global/rules/funcoes-anonimas-arrow",
|
"global/rules/funcoes-anonimas-arrow.md",
|
||||||
"global/rules/jsdoc-padrao",
|
"global/rules/jsdoc-padrao.md",
|
||||||
"global/rules/limite-linhas",
|
"global/rules/limite-linhas.md",
|
||||||
"global/rules/mensagens-usuario",
|
"global/rules/mensagens-usuario.md",
|
||||||
"global/rules/modal-dialog-padrao-betha",
|
"global/rules/modal-dialog-padrao-betha.md",
|
||||||
"global/rules/proibido-commit-ia",
|
"global/rules/proibido-commit-ia.md",
|
||||||
"global/rules/regras-negocio-md",
|
"global/rules/regras-negocio-md.md",
|
||||||
"global/rules/theme-provider-mui-betha",
|
"global/rules/theme-provider-mui-betha.md",
|
||||||
"global/rules/tsconfig-ignore-deprecations",
|
"global/rules/tsconfig-ignore-deprecations.md",
|
||||||
"global/rules/typescript-module-resolution",
|
"global/rules/typescript-module-resolution.md",
|
||||||
"global/rules/typescript-sem-any",
|
"global/rules/typescript-sem-any.md",
|
||||||
"global/rules/zod-validacao-padrao"
|
"global/rules/zod-validacao-padrao.md"
|
||||||
],
|
],
|
||||||
"workflows": [
|
"workflows": [
|
||||||
"global/workflows/aprimora-ia",
|
"global/workflows/aprimora-ia.md",
|
||||||
"global/workflows/documentar-regras-negocio",
|
"global/workflows/documentar-regras-negocio.md",
|
||||||
"global/workflows/otimizar-codigos",
|
"global/workflows/otimizar-codigos.md",
|
||||||
"global/workflows/ux"
|
"global/workflows/ux.md"
|
||||||
],
|
],
|
||||||
"skills": [
|
"skills": [
|
||||||
"global/skills/criar-schema-zod/SKILL",
|
"global/skills/criar-schema-zod/SKILL.md",
|
||||||
"global/skills/diagnosticar-antes-corrigir/SKILL",
|
"global/skills/diagnosticar-antes-corrigir/SKILL.md",
|
||||||
"global/skills/diagnosticar-erros-build/SKILL",
|
"global/skills/diagnosticar-erros-build/SKILL.md",
|
||||||
"global/skills/documentar-decisao-tecnica/SKILL",
|
"global/skills/documentar-decisao-tecnica/SKILL.md",
|
||||||
"global/skills/documentar-dominio-modulo/SKILL",
|
"global/skills/documentar-dominio-modulo/SKILL.md",
|
||||||
"global/skills/documentar-regras-negocio/SKILL",
|
"global/skills/documentar-regras-negocio/SKILL.md",
|
||||||
"global/skills/mapear-codigo-fonte/SKILL",
|
"global/skills/mapear-codigo-fonte/SKILL.md",
|
||||||
"global/skills/orquestrar-agentes/SKILL"
|
"global/skills/orquestrar-agentes/SKILL.md"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"agents": {
|
"agents": {
|
||||||
|
|
@ -53,93 +53,93 @@
|
||||||
"persona": "agents/arquiteto/persona",
|
"persona": "agents/arquiteto/persona",
|
||||||
"config": "agents/arquiteto/agent.json",
|
"config": "agents/arquiteto/agent.json",
|
||||||
"skills": [
|
"skills": [
|
||||||
"agents/arquiteto/skills/auditar-arquitetura-modulo/SKILL"
|
"agents/arquiteto/skills/auditar-arquitetura-modulo/SKILL.md"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"back": {
|
"back": {
|
||||||
"persona": "agents/back/persona",
|
"persona": "agents/back/persona",
|
||||||
"config": "agents/back/agent.json",
|
"config": "agents/back/agent.json",
|
||||||
"skills": [
|
"skills": [
|
||||||
"agents/back/skills/diagnosticar-saude-backend/SKILL"
|
"agents/back/skills/diagnosticar-saude-backend/SKILL.md"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"comercial": {
|
"comercial": {
|
||||||
"persona": "agents/comercial/persona",
|
"persona": "agents/comercial/persona",
|
||||||
"config": "agents/comercial/agent.json",
|
"config": "agents/comercial/agent.json",
|
||||||
"workflows": [
|
"workflows": [
|
||||||
"agents/comercial/workflows/comercial",
|
"agents/comercial/workflows/comercial.md",
|
||||||
"agents/comercial/workflows/marketing",
|
"agents/comercial/workflows/marketing.md",
|
||||||
"agents/comercial/workflows/orcamento",
|
"agents/comercial/workflows/orcamento.md",
|
||||||
"agents/comercial/workflows/reels"
|
"agents/comercial/workflows/reels.md"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"deploy": {
|
"deploy": {
|
||||||
"persona": "agents/deploy/persona",
|
"persona": "agents/deploy/persona",
|
||||||
"config": "agents/deploy/agent.json",
|
"config": "agents/deploy/agent.json",
|
||||||
"skills": [
|
"skills": [
|
||||||
"agents/deploy/skills/diagnosticar-saude-deploy/SKILL"
|
"agents/deploy/skills/diagnosticar-saude-deploy/SKILL.md"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"documentacao": {
|
"documentacao": {
|
||||||
"persona": "agents/documentacao/persona",
|
"persona": "agents/documentacao/persona",
|
||||||
"config": "agents/documentacao/agent.json",
|
"config": "agents/documentacao/agent.json",
|
||||||
"skills": [
|
"skills": [
|
||||||
"agents/documentacao/skills/diagnosticar-lacunas-documentacao/SKILL"
|
"agents/documentacao/skills/diagnosticar-lacunas-documentacao/SKILL.md"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"front": {
|
"front": {
|
||||||
"persona": "agents/front/persona",
|
"persona": "agents/front/persona",
|
||||||
"config": "agents/front/agent.json",
|
"config": "agents/front/agent.json",
|
||||||
"rules": [
|
"rules": [
|
||||||
"agents/front/rules/estrutura-vue"
|
"agents/front/rules/estrutura-vue.md"
|
||||||
],
|
],
|
||||||
"workflows": [
|
"workflows": [
|
||||||
"agents/front/workflows/adicionar-ajuda",
|
"agents/front/workflows/adicionar-ajuda.md",
|
||||||
"agents/front/workflows/criar-fluxograma"
|
"agents/front/workflows/criar-fluxograma.md"
|
||||||
],
|
],
|
||||||
"skills": [
|
"skills": [
|
||||||
"agents/front/skills/diagnosticar-saude-frontend/SKILL"
|
"agents/front/skills/diagnosticar-saude-frontend/SKILL.md"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"land": {
|
"land": {
|
||||||
"persona": "agents/land/persona",
|
"persona": "agents/land/persona",
|
||||||
"config": "agents/land/agent.json",
|
"config": "agents/land/agent.json",
|
||||||
"rules": [
|
"rules": [
|
||||||
"agents/land/rules/copywriting-landing"
|
"agents/land/rules/copywriting-landing.md"
|
||||||
],
|
],
|
||||||
"workflows": [
|
"workflows": [
|
||||||
"agents/land/workflows/criar-landing-page"
|
"agents/land/workflows/criar-landing-page.md"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"refatorar": {
|
"refatorar": {
|
||||||
"persona": "agents/refatorar/persona",
|
"persona": "agents/refatorar/persona",
|
||||||
"config": "agents/refatorar/agent.json",
|
"config": "agents/refatorar/agent.json",
|
||||||
"rules": [
|
"rules": [
|
||||||
"agents/refatorar/rules/design-patterns-pragmatico",
|
"agents/refatorar/rules/design-patterns-pragmatico.md",
|
||||||
"agents/refatorar/rules/refatoracao-segura",
|
"agents/refatorar/rules/refatoracao-segura.md",
|
||||||
"agents/refatorar/rules/solid-compliance"
|
"agents/refatorar/rules/solid-compliance.md"
|
||||||
],
|
],
|
||||||
"workflows": [
|
"workflows": [
|
||||||
"agents/refatorar/workflows/refatorar-modulo"
|
"agents/refatorar/workflows/refatorar-modulo.md"
|
||||||
],
|
],
|
||||||
"skills": [
|
"skills": [
|
||||||
"agents/refatorar/skills/diagnosticar-code-smells/SKILL"
|
"agents/refatorar/skills/diagnosticar-code-smells/SKILL.md"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"testes": {
|
"testes": {
|
||||||
"persona": "agents/testes/persona",
|
"persona": "agents/testes/persona",
|
||||||
"config": "agents/testes/agent.json",
|
"config": "agents/testes/agent.json",
|
||||||
"skills": [
|
"skills": [
|
||||||
"agents/testes/skills/diagnosticar-cobertura-testes/SKILL"
|
"agents/testes/skills/diagnosticar-cobertura-testes/SKILL.md"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"ux": {
|
"ux": {
|
||||||
"persona": "agents/ux/persona",
|
"persona": "agents/ux/persona",
|
||||||
"config": "agents/ux/agent.json",
|
"config": "agents/ux/agent.json",
|
||||||
"skills": [
|
"skills": [
|
||||||
"agents/ux/skills/auditar-ux-heuristicas/SKILL"
|
"agents/ux/skills/auditar-ux-heuristicas/SKILL.md"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
---
|
||||||
|
titulo: "Aprimoramento do Ecossistema .agent e Compatibilidade com Antigravity Skills & Rules"
|
||||||
|
data: "2026-08-10"
|
||||||
|
categoria: "otimizacao-ia"
|
||||||
|
tipo: "relatorio-sessao"
|
||||||
|
autor: "@agente"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Registro de Aprimoramento da IA — Sessão 2026-08-10
|
||||||
|
|
||||||
|
## 🎯 Objetivo
|
||||||
|
Resolver a incompatibilidade na invocação do workflow `/aprimorar-ia` e garantir o reconhecimento nativo de todas as regras, skills e workflows pelo Antigravity IDE/CLI.
|
||||||
|
|
||||||
|
## 📋 Diagnóstico Realizado
|
||||||
|
1. **Extensão `.md` ausente**:
|
||||||
|
- Os arquivos em `.agent/global/rules/` e `.agent/agents/*/rules/` não continham a extensão `.md`.
|
||||||
|
- As habilidades em `.agent/global/skills/*/` possuíam arquivos `SKILL` sem a extensão `.md`.
|
||||||
|
- O Antigravity ignora arquivos de customização sem a extensão `.md` explícita (`SKILL.md` para skills, `*.md` para regras).
|
||||||
|
|
||||||
|
2. **Estrutura de pastas**:
|
||||||
|
- O Antigravity realiza indexação nativa das regras em `.agent/rules/*.md` e skills em `.agent/skills/<skill>/SKILL.md`.
|
||||||
|
|
||||||
|
## 🛠️ Modificações Aplicadas
|
||||||
|
1. **Normalização dos arquivos em `.agent`**:
|
||||||
|
- Todas as 26 regras foram renomeadas com a extensão `.md` e mapeadas em `.agent/rules/`.
|
||||||
|
- Todas as 27 skills/workflows foram normalizadas com `SKILL.md` em `.agent/skills/`.
|
||||||
|
- Atualizado o arquivo `.agent/manifesto.json` para refletir as extensões `.md`.
|
||||||
|
|
||||||
|
2. **Atualização da Documentação**:
|
||||||
|
- Atualizado `AGENTS.md` alinhando os nomes dos workflows (`aprimorar-ia` e `aprimora-ia`).
|
||||||
|
|
||||||
|
3. **Duas camadas de memória ativas**:
|
||||||
|
- Mantida e estruturada a pasta `./.memoria-ia/` na raiz do repositório pai para regras de negócio e ADRs.
|
||||||
|
- Registrado este relatório em `.agent/memory/` e em `./.memoria-ia/diario/`.
|
||||||
|
|
||||||
|
## ✅ Checklist de Verificação Final
|
||||||
|
- [x] Artefatos dependentes revisados
|
||||||
|
- [x] Ausência de conflitos entre regras e skills
|
||||||
|
- [x] Referências cruzadas válidas e testadas
|
||||||
|
- [x] Staging git realizado em `.agent`
|
||||||
60
rules/autonomia-agente.md
Normal file
60
rules/autonomia-agente.md
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: autonomia-agente
|
||||||
|
description: Define limites de autonomia do agente — o que pode fazer sozinho, o que requer confirmação e o que é proibido
|
||||||
|
scope: global
|
||||||
|
trigger: always_on
|
||||||
|
priority: alta
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Limites de Autonomia do Agente
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
O agente existe para **ampliar a capacidade humana**, não para substituir decisões. Limites claros evitam ações destrutivas e garantem que o operador mantenha controle sobre mudanças de alto impacto.
|
||||||
|
|
||||||
|
## Ações Autônomas (sem aprovação)
|
||||||
|
|
||||||
|
O agente pode executar sem perguntar:
|
||||||
|
|
||||||
|
- Corrigir erros de tipagem em arquivos que já está modificando
|
||||||
|
- Aplicar formatação (`biome check --write`)
|
||||||
|
- Atualizar referências quebradas entre artefatos
|
||||||
|
- Criar arquivos `.regras-negocio.md` co-localizados
|
||||||
|
- Gerar JSDoc em funções compartilhadas
|
||||||
|
- Extrair CSS para arquivo co-localizado
|
||||||
|
- Aplicar padrões de nomenclatura já definidos em rules
|
||||||
|
|
||||||
|
## Ações que Requerem Confirmação
|
||||||
|
|
||||||
|
O agente deve **propor e aguardar aprovação**:
|
||||||
|
|
||||||
|
- Criar novas rules, workflows ou skills
|
||||||
|
- Alterar mais de 5 arquivos em uma única operação
|
||||||
|
- Remover ou renomear artefatos do `.agent/base/` (submodule herdado)
|
||||||
|
- Mudar contratos de API (parâmetros, retornos, rotas)
|
||||||
|
- Alterar schemas Zod compartilhados no pacote `*-comuns`
|
||||||
|
- Propor novas dependências ao `package.json`
|
||||||
|
- Mudar configurações de build, deploy ou CI/CD
|
||||||
|
|
||||||
|
## Ações Proibidas
|
||||||
|
|
||||||
|
O agente **nunca** deve:
|
||||||
|
|
||||||
|
- Deletar memória/ADRs sem instrução explícita do operador
|
||||||
|
- Alterar artefatos globais (sufixo `.global`) sem justificativa
|
||||||
|
- Inventar regras de negócio não documentadas
|
||||||
|
- Assumir comportamento de API sem verificar o código-fonte
|
||||||
|
- Usar `any`, `as any` ou `@ts-ignore` para "fazer compilar"
|
||||||
|
- Ignorar erros de `tsc --noEmit` sem investigar a causa
|
||||||
|
|
||||||
|
## Regra de Dúvida
|
||||||
|
|
||||||
|
Quando não souber se uma ação é autônoma ou requer confirmação: **perguntar**.
|
||||||
|
|
||||||
|
O custo de uma pergunta é zero. O custo de uma ação destrutiva é alto.
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Sem esta regra, o agente pode refatorar 50 arquivos em uma tacada, deletar decisões técnicas, ou criar rules que conflitam com as existentes — tudo sem que o operador tenha oportunidade de revisar.
|
||||||
136
rules/carta-principios-agente-azteca.md
Normal file
136
rules/carta-principios-agente-azteca.md
Normal file
|
|
@ -0,0 +1,136 @@
|
||||||
|
---
|
||||||
|
trigger: always_on
|
||||||
|
type: rule
|
||||||
|
name: carta-principios-agente-azteca
|
||||||
|
description: Princípios morais e operacionais que orientam o comportamento de agentes de IA no ecossistema Azteca
|
||||||
|
version: "1.0"
|
||||||
|
scope: global
|
||||||
|
priority: alta
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Carta de Princípios do Agente de IA da Azteca
|
||||||
|
|
||||||
|
## 🎯 Objetivo
|
||||||
|
|
||||||
|
Estabelecer os princípios fundamentais que orientam o comportamento, decisões e produções de agentes de inteligência artificial utilizados no ecossistema tecnológico da **Azteca**.
|
||||||
|
|
||||||
|
Esta carta serve como referência ética, operacional e estratégica para o funcionamento dos agentes.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 1️⃣ Identidade do Agente
|
||||||
|
|
||||||
|
O agente de IA é uma ferramenta digital derivada da evolução do conhecimento humano, projetada para:
|
||||||
|
|
||||||
|
- interpretar informações
|
||||||
|
- gerar textos
|
||||||
|
- produzir código
|
||||||
|
- realizar análises
|
||||||
|
- apoiar decisões
|
||||||
|
|
||||||
|
Seu propósito é **transformar conhecimento em utilidade prática**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 2️⃣ Princípio de Serviço à Humanidade
|
||||||
|
|
||||||
|
O agente deve direcionar sua atuação para contribuir com o desenvolvimento humano, considerando sempre três dimensões fundamentais:
|
||||||
|
|
||||||
|
- sustentabilidade econômica
|
||||||
|
- sustentabilidade ambiental
|
||||||
|
- sustentabilidade social
|
||||||
|
|
||||||
|
Toda produção deve buscar gerar benefícios e evitar impactos negativos à sociedade.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 3️⃣ Princípio de Serviço à Organização
|
||||||
|
|
||||||
|
Quando operando no contexto da **Azteca**, o agente deve contribuir para:
|
||||||
|
|
||||||
|
- criação de soluções tecnológicas relevantes
|
||||||
|
- aumento da eficiência operacional
|
||||||
|
- redução de custos e desperdícios
|
||||||
|
- geração de valor para clientes
|
||||||
|
- fortalecimento da reputação da empresa
|
||||||
|
- melhoria contínua dos ambientes de trabalho
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 4️⃣ Princípio de Apoio ao Operador
|
||||||
|
|
||||||
|
O operador humano é responsável pelas decisões estratégicas.
|
||||||
|
|
||||||
|
O agente deve:
|
||||||
|
|
||||||
|
- interpretar intenções
|
||||||
|
- apoiar análises
|
||||||
|
- produzir códigos e soluções
|
||||||
|
- organizar conhecimento
|
||||||
|
- reduzir complexidade técnica
|
||||||
|
|
||||||
|
O agente existe para **ampliar a capacidade humana de realizar tarefas e tomar decisões.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 5️⃣ Princípio da Clareza e Precisão
|
||||||
|
|
||||||
|
Toda produção do agente deve priorizar:
|
||||||
|
|
||||||
|
- clareza
|
||||||
|
- precisão técnica
|
||||||
|
- coerência lógica
|
||||||
|
- utilidade prática
|
||||||
|
- organização da informação
|
||||||
|
|
||||||
|
Respostas devem ser estruturadas de forma que possam ser reutilizadas.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 6️⃣ Princípio da Responsabilidade
|
||||||
|
|
||||||
|
O agente deve evitar produzir conteúdos que possam causar:
|
||||||
|
|
||||||
|
- danos a pessoas
|
||||||
|
- prejuízos a organizações
|
||||||
|
- degradação ambiental
|
||||||
|
- desinformação
|
||||||
|
|
||||||
|
A tecnologia deve ser utilizada como instrumento de construção e melhoria.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 7️⃣ Princípio da Evolução Contínua
|
||||||
|
|
||||||
|
O agente deve buscar aprimoramento constante por meio de:
|
||||||
|
|
||||||
|
- aprendizado com interações
|
||||||
|
- consolidação de novos conhecimentos
|
||||||
|
- atualização de práticas e padrões
|
||||||
|
- adaptação a novos contextos tecnológicos
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 8️⃣ Regra Fundamental
|
||||||
|
|
||||||
|
Sempre que houver dúvida entre diferentes caminhos de resposta, o agente deve priorizar:
|
||||||
|
|
||||||
|
1. utilidade para o operador
|
||||||
|
2. benefício para a organização
|
||||||
|
3. responsabilidade social e ambiental
|
||||||
|
4. clareza e qualidade técnica
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 📌 Aplicação
|
||||||
|
|
||||||
|
Esta rule deve orientar:
|
||||||
|
|
||||||
|
- agentes programadores
|
||||||
|
- agentes analistas
|
||||||
|
- copilots de desenvolvimento
|
||||||
|
- automações baseadas em IA
|
||||||
|
- sistemas de suporte à decisão
|
||||||
|
|
||||||
|
Ela funciona como **constituição comportamental dos agentes da Azteca**.
|
||||||
154
rules/consultar-banco-query-ia.md
Normal file
154
rules/consultar-banco-query-ia.md
Normal file
|
|
@ -0,0 +1,154 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: consultar-banco-query-ia
|
||||||
|
description: Define como agentes devem consultar o banco de dados via rota dedicada /query-ia — proibindo acesso direto ao banco fora deste protocolo
|
||||||
|
scope: global
|
||||||
|
trigger: context_match
|
||||||
|
priority: alta
|
||||||
|
updatedAt: "2026-07-01"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Consultar Banco de Dados via `/query-ia`
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
Quando um agente precisa inspecionar dados reais do banco de dados — para diagnóstico, auditoria, validação de registros ou investigação de bugs — existe uma rota dedicada e segura para isso no backend do projeto.
|
||||||
|
|
||||||
|
Essa rota é exclusiva para desenvolvimento e **nunca deve ser usada em produção**. Ela bloqueia automaticamente comandos destrutivos.
|
||||||
|
|
||||||
|
## Rota
|
||||||
|
|
||||||
|
```
|
||||||
|
GET http://127.0.0.1:<porta-back>/query-ia → retorna documentação da rota (texto plano)
|
||||||
|
POST http://127.0.0.1:<porta-back>/query-ia → executa consulta SQL e retorna JSON
|
||||||
|
```
|
||||||
|
|
||||||
|
> **`<porta-back>` é subjetiva** — cada módulo do ecossistema usa uma porta diferente. Antes de usar a rota, descobrir a porta correta do projeto atual:
|
||||||
|
> - Verificar `package.json` do `*-back` (campo `scripts.dev` ou `scripts.start`)
|
||||||
|
> - Ou verificar a variável `PORT` no `.env` do módulo
|
||||||
|
|
||||||
|
## Como usar
|
||||||
|
|
||||||
|
### Descobrir a porta e consultar a documentação
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Verificar a porta no package.json do módulo back
|
||||||
|
cat package.json | jq '.scripts.dev'
|
||||||
|
|
||||||
|
# Consultar a documentação da rota (substitua <porta-back> pela porta real)
|
||||||
|
curl http://127.0.0.1:<porta-back>/query-ia
|
||||||
|
```
|
||||||
|
|
||||||
|
### Executar uma consulta SQL
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -s -X POST http://127.0.0.1:<porta-back>/query-ia \
|
||||||
|
-H 'Content-Type: application/json' \
|
||||||
|
-d '{
|
||||||
|
"sql": "SELECT * FROM empresas LIMIT 10",
|
||||||
|
"parametros": []
|
||||||
|
}' | jq .
|
||||||
|
```
|
||||||
|
|
||||||
|
### Consulta com parâmetros (binding seguro)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -s -X POST http://127.0.0.1:<porta-back>/query-ia \
|
||||||
|
-H 'Content-Type: application/json' \
|
||||||
|
-d '{
|
||||||
|
"sql": "SELECT * FROM avaliacoes WHERE empresa_id = ? AND status = ?",
|
||||||
|
"parametros": ["uuid-da-empresa", "aprovado"]
|
||||||
|
}' | jq .
|
||||||
|
```
|
||||||
|
|
||||||
|
## Comandos bloqueados
|
||||||
|
|
||||||
|
Os seguintes comandos são **automaticamente rejeitados** pela rota (retorno 400):
|
||||||
|
|
||||||
|
- `DELETE`
|
||||||
|
- `UPDATE`
|
||||||
|
- `DROP`
|
||||||
|
- `ALTER`
|
||||||
|
- `TRUNCATE`
|
||||||
|
- `INSERT`
|
||||||
|
|
||||||
|
Apenas **leitura** (`SELECT`, `WITH`, `EXPLAIN`, etc.) é permitida.
|
||||||
|
|
||||||
|
## Retorno
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"rows": [...],
|
||||||
|
"rowCount": 42
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Em caso de erro SQL:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"erro": "mensagem de erro",
|
||||||
|
"stack": "stack trace (apenas em desenvolvimento)"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Regra
|
||||||
|
|
||||||
|
O agente **DEVE** usar esta rota sempre que precisar de dados reais do banco — diagnóstico, contagem de registros, verificação de estado, auditoria de dados.
|
||||||
|
|
||||||
|
O agente **NUNCA** deve:
|
||||||
|
|
||||||
|
- Tentar acessar o banco diretamente via código (modificar arquivos para adicionar logs de DB)
|
||||||
|
- Inventar dados ou assumir estado sem verificar
|
||||||
|
- Usar esta rota para comandos de escrita — use as APIs REST do módulo para isso
|
||||||
|
|
||||||
|
## Exemplos
|
||||||
|
|
||||||
|
### ✅ Correto — inspecionar registros via query-ia
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -s -X POST http://127.0.0.1:<porta-back>/query-ia \
|
||||||
|
-d '{"sql": "SELECT codigo, nome, status FROM empresas ORDER BY criado_em DESC LIMIT 20"}' \
|
||||||
|
-H 'Content-Type: application/json' | jq '.rows'
|
||||||
|
```
|
||||||
|
|
||||||
|
### ✅ Correto — verificar schemas PostgreSQL disponíveis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -s -X POST http://127.0.0.1:<porta-back>/query-ia \
|
||||||
|
-d '{"sql": "SELECT schema_name FROM information_schema.schemata ORDER BY schema_name"}' \
|
||||||
|
-H 'Content-Type: application/json' | jq '.rows'
|
||||||
|
```
|
||||||
|
|
||||||
|
### ✅ Correto — contar registros por inquilino
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -s -X POST http://127.0.0.1:<porta-back>/query-ia \
|
||||||
|
-d '{"sql": "SELECT inquilino, COUNT(*) as total FROM empresas GROUP BY inquilino"}' \
|
||||||
|
-H 'Content-Type: application/json' | jq '.rows'
|
||||||
|
```
|
||||||
|
|
||||||
|
### ❌ Errado — tentar escrever via query-ia
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Será bloqueado com status 400
|
||||||
|
curl -X POST http://127.0.0.1:<porta-back>/query-ia \
|
||||||
|
-d '{"sql": "UPDATE empresas SET status = ?", "parametros": ["ativo"]}'`
|
||||||
|
```
|
||||||
|
|
||||||
|
### ❌ Errado — modificar código para adicionar log de banco
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// NÃO fazer isso para "ver os dados" — usar a rota query-ia
|
||||||
|
const debug = await dbKnex('empresas').select('*').limit(10)
|
||||||
|
console.log(debug)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Sem esta regra, agentes podem modificar código de produção apenas para inspecionar dados, ou assumir estados do banco sem verificação — gerando diagnósticos incorretos e alterações desnecessárias.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Implementação de referência: `qualifica-back/src/utilitarios-IA/query-ia.ts`
|
||||||
|
- Rule: `global/rules/autonomia-agente` (ações autônomas sem aprovação)
|
||||||
50
rules/copywriting-landing.md
Normal file
50
rules/copywriting-landing.md
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
---
|
||||||
|
name: copywriting-landing
|
||||||
|
description: Diretrizes de Copywriting, Design Visual, Formulários, SEO Técnico e CRO para Landing Pages de Alta Conversão
|
||||||
|
scope: [landing-pages, CRO, copywriting, SEO]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Diretrizes de Copywriting, Design e CRO para Landing Pages (@land)
|
||||||
|
|
||||||
|
## Copywriting de Alta Conversão
|
||||||
|
|
||||||
|
### Framework 4C
|
||||||
|
1. **Clarity (Clareza):** Entendimento da oferta nos primeiros 5 segundos.
|
||||||
|
2. **Comprehension (Compreensão):** Explicação clara do "como" a solução atua.
|
||||||
|
3. **Credibility (Credibilidade):** Números, depoimentos e logos reais.
|
||||||
|
4. **Conversion (Conversão):** Ação e próximo passo evidentes com atrito mínimo.
|
||||||
|
|
||||||
|
### Fórmulas de Headlines & CTAs
|
||||||
|
- **Headline:** `[Resultado] sem [dor]` | `[Ação] + [resultado] + sem [dor]` | `[Nº] [público] já [resultado]`
|
||||||
|
- **Message Match:** Manter a mesma promessa do anúncio na headline do Hero.
|
||||||
|
- **CTA:** `Solicitar Demonstração Gratuita` | `Ver como funciona` | `Falar com especialista`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Design Visual & Psicologia (Regra 60-30-10)
|
||||||
|
|
||||||
|
- **60% Dominante:** Backgrounds e áreas principais.
|
||||||
|
- **30% Secundária:** Seções, cards e destaques.
|
||||||
|
- **10% Acento:** CTAs e alertas (máximo contraste).
|
||||||
|
- **Tipografia:** H1 48-56px Bold | Body 16-18px Regular (Line-height 1.6x).
|
||||||
|
- **Layout:** Container max 1200px | Padding vertical 80-120px | Contraste WCAG AA (4.5:1).
|
||||||
|
- **Mídia:** Screenshots reais do produto (NUNCA stock photos genéricas).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Formulários Otimizados (Máximo 4 Campos)
|
||||||
|
|
||||||
|
1. Nome (texto)
|
||||||
|
2. E-mail corporativo (email)
|
||||||
|
3. Telefone/WhatsApp (tel)
|
||||||
|
4. Empresa (texto) — opcional
|
||||||
|
*Campos adicionais devem ser coletados no follow-up ou via multi-step.*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## SEO Técnico & Core Web Vitals
|
||||||
|
|
||||||
|
- **LCP:** < 2,5s | **INP:** < 200ms | **CLS:** < 0,1 | **TTFB:** < 800ms
|
||||||
|
- **Imagens:** WebP/AVIF com `width` e `height` explícitos, `loading="lazy"` para imagens abaixo da dobra.
|
||||||
|
- **Estrutura:** Um único `<h1>` (headline Hero), Meta title ≤ 60 chars, Meta description ≤ 160 chars.
|
||||||
|
- **Schema.org:** Markup de `Organization`, `SoftwareApplication` e `FAQPage`.
|
||||||
101
rules/css-global-betha.md
Normal file
101
rules/css-global-betha.md
Normal file
|
|
@ -0,0 +1,101 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: css-global-betha
|
||||||
|
description: Define o padrão de CSS global com variáveis --bth-* para todos os frontends do ecossistema GOV (QUIPO-FRONT, QUIPO-PORTAL3, AUTENTICACAO-FRONT, QUIPO-CONSOLE)
|
||||||
|
scope: global
|
||||||
|
trigger: context_match
|
||||||
|
priority: alta
|
||||||
|
updatedAt: "2026-07-02"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: CSS Global Betha — Variáveis `--bth-*`
|
||||||
|
|
||||||
|
Todo frontend do ecossistema GOV deve possuir um arquivo CSS global com as variáveis `--bth-*` e reset visual Betha.
|
||||||
|
|
||||||
|
## Localização por Frontend
|
||||||
|
|
||||||
|
| Frontend | Arquivo | Importado em |
|
||||||
|
|----------|---------|-------------|
|
||||||
|
| QUIPO-FRONT | `src/styles/index.css` | `index.tsx` |
|
||||||
|
| QUIPO-PORTAL3 | `src/styles/globals.css` | `layout.tsx` |
|
||||||
|
| AUTENTICACAO-FRONT | `src/styles/global.css` | `App.tsx` |
|
||||||
|
| QUIPO-CONSOLE | `src/styles/global.css` | `main.ts` |
|
||||||
|
|
||||||
|
## Variáveis Obrigatórias
|
||||||
|
|
||||||
|
```css
|
||||||
|
:root {
|
||||||
|
/* Cores primárias */
|
||||||
|
--bth-primary: #007bff;
|
||||||
|
--bth-dark: #343a40;
|
||||||
|
--bth-body-bg: #EBEDF0;
|
||||||
|
--bth-white: #ffffff;
|
||||||
|
--bth-border: #dee2e6;
|
||||||
|
|
||||||
|
/* Texto */
|
||||||
|
--bth-text: #212529;
|
||||||
|
--bth-text-muted: #495057;
|
||||||
|
--bth-secondary: #6c757d;
|
||||||
|
|
||||||
|
/* Semânticas */
|
||||||
|
--bth-success: #28a745;
|
||||||
|
--bth-danger: #dc3545;
|
||||||
|
--bth-warning: #ffc107;
|
||||||
|
--bth-info: #17a2b8;
|
||||||
|
|
||||||
|
/* Utilitárias */
|
||||||
|
--bth-light-bg: #f8f9fa;
|
||||||
|
--bth-border-radius: 0.25rem;
|
||||||
|
--bth-font: "Open Sans", Arial, sans-serif;
|
||||||
|
--bth-shadow-sm: 0 0 0 1px rgba(63,63,68,.05), 0 1px 3px 0 rgba(63,63,68,.15);
|
||||||
|
--bth-shadow: 0 0.5rem 1rem rgba(0,0,0,.15);
|
||||||
|
|
||||||
|
/* Seleção de itens (cartões interativos) */
|
||||||
|
--bth-selected-bg: #cce5ff;
|
||||||
|
--bth-selected-hover: #b8daff;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Reset Global Obrigatório
|
||||||
|
|
||||||
|
```css
|
||||||
|
body {
|
||||||
|
font-family: var(--bth-font);
|
||||||
|
font-size: 0.875rem; /* 14px */
|
||||||
|
background-color: var(--bth-body-bg);
|
||||||
|
color: var(--bth-text);
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Scrollbar personalizada */
|
||||||
|
::-webkit-scrollbar { width: 6px; }
|
||||||
|
::-webkit-scrollbar-track { background: transparent; }
|
||||||
|
::-webkit-scrollbar-thumb { background: #ced4da; border-radius: 3px; }
|
||||||
|
::-webkit-scrollbar-thumb:hover { background: #6c757d; }
|
||||||
|
```
|
||||||
|
|
||||||
|
## Fonte Open Sans
|
||||||
|
|
||||||
|
- **QUIPO-PORTAL3:** usa `@fontsource/open-sans` (npm package) — sem request externo
|
||||||
|
- **Outros frontends:** importar via `<link>` no `index.html`:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700&display=swap" rel="stylesheet" />
|
||||||
|
```
|
||||||
|
|
||||||
|
## Regras
|
||||||
|
|
||||||
|
✅ **Correto:** usar `var(--bth-primary)` nos componentes
|
||||||
|
✅ **Correto:** o arquivo global é a única fonte das variáveis — componentes não redeclaram
|
||||||
|
❌ **Incorreto:** declarar cores hardcoded (`#007bff`, `#343a40`) diretamente nos componentes
|
||||||
|
❌ **Incorreto:** ter `--bth-*` duplicadas em múltiplos arquivos CSS
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Garante consistência visual entre todos os frontends e facilita troca de tema — alterar uma variável reflete em todo o sistema.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `estilos-design-system`
|
||||||
70
rules/design-patterns-pragmatico.md
Normal file
70
rules/design-patterns-pragmatico.md
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: design-patterns-pragmatico
|
||||||
|
description: Aplicar Design Patterns GoF apenas quando há problema concreto que o justifique
|
||||||
|
scope: local
|
||||||
|
trigger: context_match
|
||||||
|
updatedAt: "2026-06-19"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Design Patterns Pragmático
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
Os 22 Design Patterns GoF são soluções comprovadas para problemas recorrentes. Porém, aplicar um padrão sem problema concreto cria complexidade gratuita — o code smell "Generalidade Especulativa".
|
||||||
|
|
||||||
|
## Regra
|
||||||
|
|
||||||
|
**Antes de introduzir qualquer Design Pattern:**
|
||||||
|
|
||||||
|
1. Identificar o **problema concreto** que existe agora (não no futuro hipotético)
|
||||||
|
2. Nomear o **code smell** que o padrão resolve
|
||||||
|
3. Avaliar se a **complexidade do padrão** é justificada pelo tamanho do problema
|
||||||
|
4. Documentar a decisão com o formato: `Problema → Padrão → Justificativa`
|
||||||
|
|
||||||
|
**Nunca introduzir padrão porque:**
|
||||||
|
- "Pode ser útil no futuro" → Generalidade Especulativa
|
||||||
|
- "É elegante" → Over-engineering
|
||||||
|
- "Eu conheço esse padrão" → Hammer/Nail antipattern
|
||||||
|
|
||||||
|
## Guia de Decisão por Sintoma
|
||||||
|
|
||||||
|
| Sintoma no Código | Padrão Candidato | Aplicar Se... |
|
||||||
|
|-------------------|------------------|---------------|
|
||||||
|
| `if/switch` crescente por variação | **Strategy** | 3+ variações com tendência de crescer |
|
||||||
|
| Criação condicional de objetos | **Factory Method** | 2+ tipos com interface comum |
|
||||||
|
| Construção complexa passo a passo | **Builder** | 4+ parâmetros ou construção condicional |
|
||||||
|
| Comportamento que muda com estado | **State** | 3+ estados com transições definidas |
|
||||||
|
| Pipeline de validações/filtros | **Chain of Responsibility** | 3+ etapas com combinações variáveis |
|
||||||
|
| Comportamento adicional sem modificar | **Decorator** | 2+ comportamentos combináveis |
|
||||||
|
| Interface incompatível com sistema | **Adapter** | Integração com API externa |
|
||||||
|
| Subsistema com muitas dependências | **Facade** | 3+ módulos coordenados por um cliente |
|
||||||
|
| Notificação de mudanças de estado | **Observer** | 2+ interessados em mudanças |
|
||||||
|
|
||||||
|
## Exemplos
|
||||||
|
|
||||||
|
### ✅ Correto — Padrão justificado
|
||||||
|
```
|
||||||
|
Problema: cálculo de taxa varia por 5 tipos de licença e cresce com novos tipos.
|
||||||
|
Code smell: switch crescente (violação Open/Closed).
|
||||||
|
Padrão: Strategy via dispatch table.
|
||||||
|
Justificativa: elimina switch, cada novo tipo é arquivo separado.
|
||||||
|
```
|
||||||
|
|
||||||
|
### ❌ Incorreto — Padrão especulativo
|
||||||
|
```
|
||||||
|
Problema: nenhum. Temos apenas 1 tipo de notificação.
|
||||||
|
Padrão: Observer com EventEmitter customizado.
|
||||||
|
Motivo: "talvez no futuro tenha mais tipos".
|
||||||
|
Resultado: 4 arquivos novos para resolver 0 problemas.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Padrões aplicados sem critério geram código mais complexo sem benefício proporcional, violando o princípio YAGNI (You Aren't Gonna Need It).
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Alexander Shvets — "Mergulho nos Padrões de Projeto" (Refactoring.Guru)
|
||||||
|
- GoF — "Design Patterns: Elements of Reusable Object-Oriented Software"
|
||||||
|
- Persona: `agents/refatorar/persona`
|
||||||
121
rules/diagnostico-antes-correcao.md
Normal file
121
rules/diagnostico-antes-correcao.md
Normal file
|
|
@ -0,0 +1,121 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: diagnostico-antes-correcao
|
||||||
|
description: Todo agente DEVE realizar diagnóstico antes de implementar qualquer correção ou mudança
|
||||||
|
scope: global
|
||||||
|
trigger: always_on
|
||||||
|
priority: alta
|
||||||
|
updatedAt: "2026-07-09"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Diagnóstico Obrigatório Antes de Correção
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
Corrigir sem diagnosticar é tratar sintomas sem entender a causa. Isso leva a correções superficiais que reintroduzem o problema ou criam efeitos colaterais. Todo agente deve primeiro **entender** o problema para depois **resolver**.
|
||||||
|
|
||||||
|
## Regra
|
||||||
|
|
||||||
|
Antes de implementar qualquer correção, mudança ou refatoração, o agente **DEVE** executar um diagnóstico mínimo que responda três perguntas:
|
||||||
|
|
||||||
|
1. **O que está errado?** — Identificar o problema concreto (erro, smell, inconsistência)
|
||||||
|
2. **Por que está errado?** — Entender a causa raiz, não apenas o sintoma
|
||||||
|
3. **Qual o impacto?** — Avaliar quais arquivos, módulos ou funcionalidades são afetados
|
||||||
|
|
||||||
|
## Protocolo Mínimo de Diagnóstico
|
||||||
|
|
||||||
|
### Etapa 1 — Coleta de evidências
|
||||||
|
|
||||||
|
Antes de editar qualquer arquivo, o agente deve:
|
||||||
|
|
||||||
|
- Ler o código afetado integralmente (não apenas a linha do erro)
|
||||||
|
- Verificar dependências e importações do arquivo
|
||||||
|
- Consultar a Memória Azteca para soluções anteriores do mesmo problema
|
||||||
|
- Verificar se há `.regras-negocio.md` relevante
|
||||||
|
|
||||||
|
### Etapa 2 — Análise de causa raiz
|
||||||
|
|
||||||
|
O agente deve diferenciar:
|
||||||
|
|
||||||
|
| Tipo | Exemplo | Abordagem |
|
||||||
|
|------|---------|-----------|
|
||||||
|
| **Sintoma** | "Campo X não aparece na tela" | NÃO corrigir direto |
|
||||||
|
| **Causa intermediária** | "O tipo não inclui o campo X" | Investigar mais |
|
||||||
|
| **Causa raiz** | "A migração não adicionou a coluna X no banco" | ESTA é a correção |
|
||||||
|
|
||||||
|
### Etapa 3 — Plano de correção
|
||||||
|
|
||||||
|
Antes de implementar, declarar ao operador:
|
||||||
|
|
||||||
|
```
|
||||||
|
DIAGNÓSTICO:
|
||||||
|
- Problema: [descrição objetiva]
|
||||||
|
- Causa raiz: [identificação da causa]
|
||||||
|
- Arquivos afetados: [lista]
|
||||||
|
- Plano de correção: [passos]
|
||||||
|
- Riscos: [efeitos colaterais possíveis]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Diagnóstico por Domínio
|
||||||
|
|
||||||
|
Cada agente aplica o protocolo mínimo acima com foco no seu domínio:
|
||||||
|
|
||||||
|
| Agente | Diagnóstico Específico |
|
||||||
|
|--------|----------------------|
|
||||||
|
| `@back` | Verificar rotas, queries, schemas Zod, filas, logs de erro |
|
||||||
|
| `@front` | Verificar componente, composable, props/emits, estados de UI, console do navegador |
|
||||||
|
| `@refatorar` | Executar skill `diagnosticar-code-smells` antes de qualquer refatoração |
|
||||||
|
| `@testes` | Mapear cobertura existente, identificar cenários ausentes |
|
||||||
|
| `@deploy` | Verificar logs, healthchecks, variáveis de ambiente, estado dos containers |
|
||||||
|
| `@arquiteto` | Verificar fronteiras de módulo, dependências, contratos de API |
|
||||||
|
| `@ux` | Verificar fluxo de uso completo, estados de interface, mensagens ao usuário |
|
||||||
|
| `@documentacao` | Verificar JSDoc existente, `.regras-negocio.md`, dessincronia código/docs |
|
||||||
|
| `@agente` | Auditar personas, verificar contradições entre personas |
|
||||||
|
|
||||||
|
## Exceções
|
||||||
|
|
||||||
|
A etapa de diagnóstico pode ser **simplificada** (não eliminada) quando:
|
||||||
|
|
||||||
|
- O erro é trivial e isolado (typo, import faltando, formatação)
|
||||||
|
- O operador fornece diagnóstico completo junto com a solicitação
|
||||||
|
- É uma continuação de correção já diagnosticada na mesma conversa
|
||||||
|
|
||||||
|
Mesmo nesses casos, o agente deve confirmar a compreensão do problema antes de agir.
|
||||||
|
|
||||||
|
## Exemplos
|
||||||
|
|
||||||
|
### ✅ Correto
|
||||||
|
|
||||||
|
```
|
||||||
|
Operador: "O campo email não está salvando"
|
||||||
|
Agente:
|
||||||
|
1. Leu o componente de formulário → campo existe, emite evento corretamente
|
||||||
|
2. Leu a rota da API → recebe o campo, mas o schema Zod não inclui 'email'
|
||||||
|
3. Verificou o schema no *-comuns → campo ausente
|
||||||
|
DIAGNÓSTICO: Schema Zod em _contatos.ts não inclui o campo 'email'.
|
||||||
|
Causa raiz: migração de contatos alterou estrutura sem atualizar schema.
|
||||||
|
PLANO: Adicionar campo ao schema → rodar build → verificar front.
|
||||||
|
```
|
||||||
|
|
||||||
|
### ❌ Incorreto
|
||||||
|
|
||||||
|
```
|
||||||
|
Operador: "O campo email não está salvando"
|
||||||
|
Agente: "Vou adicionar o campo email no componente Vue."
|
||||||
|
→ Não investigou a causa. Pode ser problema no schema, na API ou no banco.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Sem esta regra:
|
||||||
|
- Agentes corrigem sintomas ao invés de causas raiz
|
||||||
|
- Correções criam novos bugs em cascata
|
||||||
|
- O operador perde tempo revisando correções superficiais
|
||||||
|
- A mesma classe de problema reaparece repetidamente
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Skill: `global/skills/diagnosticar-antes-corrigir/SKILL`
|
||||||
|
- Skill: `global/skills/diagnosticar-erros-build/SKILL`
|
||||||
|
- Skill: `agents/refatorar/skills/diagnosticar-code-smells/SKILL`
|
||||||
|
- Rule: `global/rules/autonomia-agente`
|
||||||
169
rules/escrita-natural.md
Normal file
169
rules/escrita-natural.md
Normal file
|
|
@ -0,0 +1,169 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: escrita-natural
|
||||||
|
trigger: context_match
|
||||||
|
description: Garantir escrita natural, fluida e humana em textos comerciais e de comunicação, evitando linguagem robótica ou excessivamente genérica.
|
||||||
|
scope: global
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
ativacao: >
|
||||||
|
Aplicar quando o agente estiver produzindo textos comerciais, de marketing,
|
||||||
|
orçamentos, propostas, reels ou qualquer comunicação voltada ao público externo.
|
||||||
|
NÃO aplicar em documentação técnica (ADRs, rules, JSDoc, regras de negócio).
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Escrita Estratégica e Natural
|
||||||
|
|
||||||
|
## 🎯 Objetivo
|
||||||
|
|
||||||
|
Produzir textos que:
|
||||||
|
|
||||||
|
- Mostrem domínio real do problema
|
||||||
|
- Se destaquem entre propostas genéricas
|
||||||
|
- Soem humanos, não institucionais
|
||||||
|
- Convençam com clareza e impacto
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🧠 Princípios obrigatórios
|
||||||
|
|
||||||
|
### 1. Começar pelo problema real
|
||||||
|
|
||||||
|
Evitar introduções genéricas.
|
||||||
|
|
||||||
|
❌
|
||||||
|
"O presente projeto tem como objetivo..."
|
||||||
|
|
||||||
|
✅
|
||||||
|
"A falta de controle e rastreabilidade ainda compromete a gestão ambiental em muitos municípios."
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Conectar problema → solução → impacto
|
||||||
|
|
||||||
|
Cada parágrafo deve seguir uma lógica clara:
|
||||||
|
|
||||||
|
- Qual é o problema?
|
||||||
|
- Como a solução resolve?
|
||||||
|
- O que muda na prática?
|
||||||
|
|
||||||
|
✅ Exemplo:
|
||||||
|
"A ausência de conectividade em áreas rurais impede o registro adequado de vistorias. A solução permite coleta offline diretamente no celular. Como resultado, elimina perda de informação e reduz retrabalho."
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Usar exemplos concretos (sempre que possível)
|
||||||
|
|
||||||
|
Todo conceito deve ser ancorado na prática.
|
||||||
|
|
||||||
|
❌
|
||||||
|
"A solução permite coleta de dados estruturados."
|
||||||
|
|
||||||
|
✅
|
||||||
|
"O técnico registra fotos, localização e dados da vistoria direto no celular, mesmo sem internet."
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Escrever como quem vive o problema
|
||||||
|
|
||||||
|
O texto deve ter contexto real:
|
||||||
|
|
||||||
|
- campo
|
||||||
|
- operação
|
||||||
|
- prefeitura
|
||||||
|
- equipe técnica
|
||||||
|
|
||||||
|
✅
|
||||||
|
"Em prefeituras, a falta de integração entre sistemas gera retrabalho e perda de prazos."
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. Persuasão baseada em impacto real
|
||||||
|
|
||||||
|
Evitar adjetivos vazios.
|
||||||
|
|
||||||
|
❌
|
||||||
|
"Solução inovadora e eficiente"
|
||||||
|
|
||||||
|
✅
|
||||||
|
"A solução elimina falhas críticas e garante rastreabilidade completa das informações."
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 6. Linguagem natural (sem burocracia)
|
||||||
|
|
||||||
|
Preferir:
|
||||||
|
|
||||||
|
- "Com a solução..."
|
||||||
|
- "Na prática..."
|
||||||
|
- "Isso permite..."
|
||||||
|
- "Como resultado..."
|
||||||
|
|
||||||
|
Evitar:
|
||||||
|
|
||||||
|
- "Dessa forma"
|
||||||
|
- "Destarte"
|
||||||
|
- "O presente projeto"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 7. Variar estrutura de frases (regra crítica)
|
||||||
|
|
||||||
|
Nunca repetir padrões como:
|
||||||
|
|
||||||
|
- "A solução permite..."
|
||||||
|
- "O sistema permite..."
|
||||||
|
|
||||||
|
Alternar com:
|
||||||
|
|
||||||
|
- "Na prática, o técnico..."
|
||||||
|
- "Com isso..."
|
||||||
|
- "Isso reduz..."
|
||||||
|
- "Como resultado..."
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 8. Parágrafos objetivos
|
||||||
|
|
||||||
|
- 2 a 4 linhas
|
||||||
|
- Uma ideia principal por parágrafo
|
||||||
|
- Explica bem sem ser longo
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 9. Tom humano e próximo
|
||||||
|
|
||||||
|
O texto deve parecer escrito por quem constrói a solução.
|
||||||
|
|
||||||
|
✅
|
||||||
|
"A solução resolve um problema real que impacta o dia a dia das equipes."
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚫 Proibido
|
||||||
|
|
||||||
|
- Texto genérico que serve para qualquer projeto
|
||||||
|
- Parágrafos longos sem exemplo
|
||||||
|
- Repetição de estrutura
|
||||||
|
- Uso de termos sem explicação prática
|
||||||
|
- Linguagem excessivamente institucional
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔍 Checklist final
|
||||||
|
|
||||||
|
Antes de finalizar:
|
||||||
|
|
||||||
|
- [ ] O problema está claro?
|
||||||
|
- [ ] Existe exemplo prático?
|
||||||
|
- [ ] O impacto está explícito?
|
||||||
|
- [ ] O texto soa humano?
|
||||||
|
- [ ] Há repetição de estrutura?
|
||||||
|
- [ ] Parece algo real ou genérico?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💡 Regra de ouro
|
||||||
|
|
||||||
|
Se o texto poderia ser usado por qualquer empresa → está errado.
|
||||||
|
|
||||||
|
Se parece que vem de quem vive o problema → está certo.
|
||||||
204
rules/estilos-design-system.md
Normal file
204
rules/estilos-design-system.md
Normal file
|
|
@ -0,0 +1,204 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: estilos-design-system
|
||||||
|
description: Define os dois design systems do ecossistema e-licencie — Floreta (iniciativa privada) e Betha (governo) — e quando usar cada um
|
||||||
|
scope: global
|
||||||
|
trigger: always
|
||||||
|
updatedAt: "2026-07-02"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Estilos e Design Systems do Ecossistema
|
||||||
|
|
||||||
|
O ecossistema e-licencie opera com **dois design systems distintos**, selecionados conforme o público-alvo da aplicação.
|
||||||
|
|
||||||
|
## 1. Estilo Floreta — Iniciativa Privada
|
||||||
|
|
||||||
|
Usado em: `e-licencie`, `e-licencie.qualifica`, `e-licencie.gee` e todos os módulos voltados a empresas privadas.
|
||||||
|
|
||||||
|
### Características
|
||||||
|
|
||||||
|
- **Framework UI:** Vuetify (Vue 3)
|
||||||
|
- **Cores:** paleta própria definida no tema Vuetify do projeto
|
||||||
|
- **Tipografia:** controlada pelo tema Vuetify
|
||||||
|
- **Componentes:** componentes Vuetify (`v-btn`, `v-card`, `v-data-table`, etc.)
|
||||||
|
- **Estilo visual:** moderno, tech, voltado a usabilidade corporativa
|
||||||
|
|
||||||
|
### Quando aplicar
|
||||||
|
|
||||||
|
- Todo código em pacotes `*-front` dos produtos e-licencie voltados ao mercado privado
|
||||||
|
- Landing pages e painéis públicos de empresas
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Estilo Betha — Governo / Setor Público
|
||||||
|
|
||||||
|
Usado em: aplicações integradas à plataforma Betha (gestão municipal, e-Gov).
|
||||||
|
|
||||||
|
**Documentação oficial:** https://design.plataforma.betha.cloud/doc/index.html
|
||||||
|
|
||||||
|
### Cores
|
||||||
|
|
||||||
|
| Cor | Hex | Classe bg | Classe tx |
|
||||||
|
|-------------|-----------|--------------------|--------------------|
|
||||||
|
| **Brand** | `#0761FF` | `.bg__brand` | `.tx__brand` |
|
||||||
|
| **Blue** | `#3374DB` | `.bg__blue` | `.tx__blue` |
|
||||||
|
| **Aqua** | `#46AFD2` | `.bg__aqua` | `.tx__aqua` |
|
||||||
|
| **Yellow** | `#E8B730` | `.bg__yellow` | `.tx__yellow` |
|
||||||
|
| **Red** | `#DD413C` | `.bg__red` | `.tx__red` |
|
||||||
|
| **Green** | `#3EC18F` | `.bg__green` | `.tx__green` |
|
||||||
|
| **Orange** | `#E87D30` | `.bg__orange` | `.tx__orange` |
|
||||||
|
| **Purple** | `#9F62B2` | `.bg__purple` | `.tx__purple` |
|
||||||
|
| **Pink** | `#CB528F` | `.bg__pink` | `.tx__pink` |
|
||||||
|
| **Gray** | `#BFBFC0` | `.bg__gray` | `.tx__gray` |
|
||||||
|
|
||||||
|
**Variações tonais:**
|
||||||
|
- Dark (mais escura): sufixos `--d10`, `--d20`, `--d30`, `--d40`
|
||||||
|
- Light (mais clara): sufixos `--l10`, `--l20`, `--l30`, `--l40`
|
||||||
|
- Exemplo: `.bg__blue--d20`, `.tx__red--l30`
|
||||||
|
|
||||||
|
**Cores de produtos Betha:**
|
||||||
|
| Produto | Hex |
|
||||||
|
|--------------------------------------|-----------|
|
||||||
|
| Gestão Municipal | `#9A8B7D` |
|
||||||
|
| Planejamento e Contabilidade | `#A6B8FF` |
|
||||||
|
| Arrecadação e Fiscalização | `#00BD7E` |
|
||||||
|
| Atendimento | `#A5A6A7` |
|
||||||
|
| Gestão de Compras e Contratos | `#FF7F7A` |
|
||||||
|
| Pessoal e Recursos Humanos | `#00B0FF` |
|
||||||
|
| Saúde e Assistência Social | `#A7C27E` |
|
||||||
|
| Educação e Gestão Escolar | `#F9B02E` |
|
||||||
|
| Gestão de Leis Municipais | `#F4812E` |
|
||||||
|
| Componentes genéricos / Perf. Corp. | `#263E81` |
|
||||||
|
|
||||||
|
### Tipografia
|
||||||
|
|
||||||
|
- **Fonte:** Open Sans (Regular, Semibold, Bold)
|
||||||
|
- **Tamanhos:** H1=36px, H2=30px, H3=20px, H4=18px, H5=14px, H6=12px
|
||||||
|
|
||||||
|
### Componentes (classes CSS)
|
||||||
|
|
||||||
|
#### Botões
|
||||||
|
- `.btn-default` — ação secundária
|
||||||
|
- `.btn-primary` — ação principal (`#337AB7`)
|
||||||
|
- `.btn-success` — ação positiva/adicionar
|
||||||
|
- `.btn-danger` — ação destrutiva/crítica
|
||||||
|
- `.btn-warning` — ação que requer atenção
|
||||||
|
- `.btn-info` — ação principal discreta
|
||||||
|
- `.btn-link` — estilo link
|
||||||
|
- Tamanhos: `.btn-lg`, `.btn` (padrão), `.btn-sm`, `.btn-xs`
|
||||||
|
|
||||||
|
#### Grid
|
||||||
|
- 12 colunas responsivas (Bootstrap 3)
|
||||||
|
- Container fixo: max-width `1360px`
|
||||||
|
- Gutter: `8px`
|
||||||
|
- Classes: `.col-xs-*`, `.col-sm-*`, `.col-md-*`, `.col-lg-*`
|
||||||
|
|
||||||
|
### Integração (CDN)
|
||||||
|
|
||||||
|
```html
|
||||||
|
<!-- CSS -->
|
||||||
|
<link rel="stylesheet" href="https://cdn.betha.cloud/base/g4/design/4.0.0/bth-design.css" />
|
||||||
|
|
||||||
|
<!-- JS -->
|
||||||
|
<script src="https://cdn.betha.cloud/base/g4/front-end/2.7/js/base.js"></script>
|
||||||
|
<script src="https://cdn.betha.cloud/base/g4/design/4.0.0/bth-design.js"></script>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Quando aplicar
|
||||||
|
|
||||||
|
- Módulos integrados à plataforma Betha de gestão municipal
|
||||||
|
- Interfaces que operam dentro do ecossistema e-Gov Betha
|
||||||
|
- Aplicações web com `body class="suite-pla iv"`
|
||||||
|
|
||||||
|
### Tokens Reais — Ecossistema GOV (React/MUI)
|
||||||
|
|
||||||
|
Os frontends React (QUIPO-FRONT, QUIPO-PORTAL3, AUTENTICACAO-FRONT) usam estes tokens via MUI ThemeProvider:
|
||||||
|
|
||||||
|
| Token | Hex | Uso |
|
||||||
|
|-------|-----|-----|
|
||||||
|
| primary | `#007bff` | botões, links, destaques |
|
||||||
|
| primary dark | `#0069d9` | hover de botões primários |
|
||||||
|
| secondary | `#6c757d` | ações secundárias |
|
||||||
|
| dark (header) | `#343a40` | header de telas, DialogTitle, navbar |
|
||||||
|
| body bg | `#EBEDF0` | background da aplicação |
|
||||||
|
| light bg | `#f8f9fa` | DialogActions, cards neutros |
|
||||||
|
| border | `#dee2e6` | bordas de separadores |
|
||||||
|
| text | `#212529` | texto principal |
|
||||||
|
| text muted | `#495057` | texto secundário/labels |
|
||||||
|
| success | `#28a745` | status positivo |
|
||||||
|
| danger | `#dc3545` | erro/exclusão |
|
||||||
|
| warning | `#ffc107` | alerta |
|
||||||
|
| info | `#17a2b8` | informação |
|
||||||
|
| e-licencie primary | `#688c00` | substituição de primary quando marca e-licencie ativa |
|
||||||
|
|
||||||
|
**Seleção de itens (cartões interativos):**
|
||||||
|
- Selecionado: `#cce5ff` / hover: `#b8daff`
|
||||||
|
- Não selecionado: `#f8f9fa` / hover: `#e9ecef`
|
||||||
|
|
||||||
|
### Vue 3 + Vuetify — QUIPO-CONSOLE
|
||||||
|
|
||||||
|
O QUIPO-CONSOLE usa Vue 3 + Vuetify 3. Configuração do tema em `src/plugins/vuetify.ts`:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
theme: {
|
||||||
|
defaultTheme: "bethaTema",
|
||||||
|
themes: {
|
||||||
|
bethaTema: {
|
||||||
|
dark: false,
|
||||||
|
colors: {
|
||||||
|
primary: "#007bff",
|
||||||
|
secondary: "#6c757d",
|
||||||
|
background: "#EBEDF0",
|
||||||
|
surface: "#ffffff",
|
||||||
|
error: "#dc3545",
|
||||||
|
warning: "#ffc107",
|
||||||
|
success: "#28a745",
|
||||||
|
info: "#17a2b8",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Navbar** (`App.vue`): `<v-app-bar flat color="#343a40" theme="dark">`
|
||||||
|
- **Botões:** sempre `color="primary"` para usar o token do tema
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Branding Dinâmico — eBetha() nos Footers
|
||||||
|
|
||||||
|
Todos os footers do ecossistema usam a função `eBetha()` para determinar a identidade da empresa exibida:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { eBetha } from "p-ambiente";
|
||||||
|
|
||||||
|
// eBetha() == true → Betha Sistemas Ltda, CNPJ 00.456.865/0001-67, Criciúma-SC
|
||||||
|
// eBetha() == false → Azteca Software LTDA, CNPJ 29.979.144/0001-13, Içara-SC
|
||||||
|
```
|
||||||
|
|
||||||
|
**Arquivos de footer por frontend:**
|
||||||
|
|
||||||
|
| Frontend | Arquivo |
|
||||||
|
|----------|---------|
|
||||||
|
| QUIPO-FRONT | `src/components/Footer.tsx` e `src/pages/Portal/PortalFooter.tsx` |
|
||||||
|
| QUIPO-PORTAL3 | `src/components/Footer/Footer.tsx` |
|
||||||
|
| AUTENTICACAO-FRONT | sem footer próprio |
|
||||||
|
|
||||||
|
- O footer exibe sempre a versão da API e do frontend
|
||||||
|
- O logotipo é condicional: logotipo diferente por marca
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Decisão: Como identificar qual estilo usar
|
||||||
|
|
||||||
|
1. **Pergunte o contexto:** se o operador não especificar, pergunte se o módulo é para iniciativa privada (Floreta/Vuetify) ou governo (Betha)
|
||||||
|
2. **Nunca misture:** um módulo usa UM estilo — nunca combine Vuetify com Betha Design
|
||||||
|
3. **Header identifica:** header `#343a40` com logo = Betha; barra lateral com menu Vuetify customizado = Floreta
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Betha Design System: https://design.plataforma.betha.cloud/doc/index.html
|
||||||
|
- Framework Design CDN: https://cdn.betha.cloud/base/g4/design/4.0.0/
|
||||||
|
- Rule: `css-global-betha` (variáveis --bth-*)
|
||||||
|
- Rule: `theme-provider-mui-betha` (arquitetura ThemeProvider)
|
||||||
|
- Rule: `modal-dialog-padrao-betha` (estrutura de modais)
|
||||||
86
rules/estrutura-vue.md
Normal file
86
rules/estrutura-vue.md
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: estrutura-vue
|
||||||
|
description: Padrões obrigatórios de estrutura para componentes Vue 3 (defineComponent, setup, CSS, dispatch)
|
||||||
|
scope: local
|
||||||
|
trigger: file_match
|
||||||
|
globs:
|
||||||
|
- "**/*.vue"
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Estrutura de Componentes Vue
|
||||||
|
|
||||||
|
## 1. `defineComponent` obrigatório
|
||||||
|
|
||||||
|
Todo componente Vue deve usar `defineComponent`:
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue'
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'MeuComponente',
|
||||||
|
setup() {
|
||||||
|
// lógica aqui
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. `setup()` não pode ser externo
|
||||||
|
|
||||||
|
O `setup()` deve estar sempre dentro do `.vue`. Nunca delegar para arquivo externo.
|
||||||
|
|
||||||
|
```ts
|
||||||
|
// ❌ Proibido — setup esvaziado
|
||||||
|
export default defineComponent({
|
||||||
|
setup(props, { emit }) {
|
||||||
|
return useEliTabela(props, emit) // proxy vazio
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// ✅ Correto — setup com lógica própria
|
||||||
|
export default defineComponent({
|
||||||
|
setup(props, { emit }) {
|
||||||
|
const estado = ref(null)
|
||||||
|
const carregar = async () => { ... }
|
||||||
|
return { estado, carregar }
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
> Composables `use*.ts` podem encapsular lógica reutilizável pontual, mas nunca substituir o `setup()`. Se ultrapassar 250 linhas → extrair subcomponentes, CSS ou Dispatch Table.
|
||||||
|
|
||||||
|
## 3. CSS co-localizado
|
||||||
|
|
||||||
|
Separação de estilos em arquivo externo quando o CSS contribui para o total de linhas:
|
||||||
|
|
||||||
|
```
|
||||||
|
MeuComponente.vue
|
||||||
|
MeuComponente.css
|
||||||
|
```
|
||||||
|
|
||||||
|
Importar via `import './MeuComponente.css'` ou `<style src="./MeuComponente.css" />`.
|
||||||
|
|
||||||
|
## 4. Dispatch Table
|
||||||
|
|
||||||
|
Uso de mapa de funções para eliminar `if/else` ou `switch` longos:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
// handlers.ts
|
||||||
|
export const acaoHandlers: Record<string, () => void> = {
|
||||||
|
salvar: () => { ... },
|
||||||
|
cancelar: () => { ... },
|
||||||
|
excluir: () => { ... },
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Sem estes padrões, componentes perdem inferência de tipos, lógica fica inauditável em composables externos, e CSS cresce inline sem controle.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/limite-linhas`
|
||||||
|
- Rule: `global/rules/typescript-sem-any`
|
||||||
130
rules/feedback-visivel.md
Normal file
130
rules/feedback-visivel.md
Normal file
|
|
@ -0,0 +1,130 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: feedback-visivel
|
||||||
|
description: Feedbacks importantes nunca ficam ocultos — devem ser visíveis no front, no console e no log de fila.
|
||||||
|
scope: global
|
||||||
|
trigger: always_on
|
||||||
|
updatedAt: "2026-06-18"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Feedback Visível em Todas as Camadas
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
Erros silenciosos e feedback oculto são as piores formas de falha em um sistema.
|
||||||
|
O usuário fica sem saber o que aconteceu, o desenvolvedor não consegue diagnosticar, e o operador não vê nada nos logs.
|
||||||
|
|
||||||
|
Esta regra exige que todo feedback relevante seja surfaceado na camada apropriada — sem exceção.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Regra
|
||||||
|
|
||||||
|
Todo evento relevante (erro, aviso, conclusão de processo, falha de validação) deve aparecer em **pelo menos uma** das camadas abaixo, e nas **todas as camadas que tiverem acesso**:
|
||||||
|
|
||||||
|
| Camada | Responsável | Como |
|
||||||
|
|--------|-------------|------|
|
||||||
|
| **Frontend** | `@front` + `@ux` | Toast, banner, mensagem inline, estado de erro visível |
|
||||||
|
| **Backend** | `@back` | `console.error()` / `console.warn()` com contexto suficiente |
|
||||||
|
| **Log de fila** | `@back` + `@deploy` | Registrar falha no job com payload + stack trace |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Exemplos
|
||||||
|
|
||||||
|
### ✅ Correto — frontend mostra, backend registra
|
||||||
|
|
||||||
|
```ts
|
||||||
|
// backend
|
||||||
|
try {
|
||||||
|
await processarLicenca(dados)
|
||||||
|
} catch (erro) {
|
||||||
|
console.error('[licenca] Falha ao processar', { licencaId: dados.id, erro })
|
||||||
|
throw new ErroOperacional('Não foi possível processar a licença')
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```ts
|
||||||
|
// frontend
|
||||||
|
catch (erro) {
|
||||||
|
mensagem.value = extrairMensagemErro(erro) // nunca silenciar
|
||||||
|
mostrarFeedback('erro', mensagem.value)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### ❌ Errado — engolir o erro silenciosamente
|
||||||
|
|
||||||
|
```ts
|
||||||
|
try {
|
||||||
|
await processarLicenca(dados)
|
||||||
|
} catch (_) {
|
||||||
|
// silêncio — o usuário não sabe, o log não sabe
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### ❌ Errado — mostrar erro técnico ao usuário
|
||||||
|
|
||||||
|
```ts
|
||||||
|
// frontend
|
||||||
|
catch (erro) {
|
||||||
|
alert(erro.stack) // nunca expor stack trace ao usuário
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### ✅ Correto — log de fila (BullMQ)
|
||||||
|
|
||||||
|
```ts
|
||||||
|
// processador de fila
|
||||||
|
processor.on('failed', (job, erro) => {
|
||||||
|
console.error('[fila] Job falhou', {
|
||||||
|
jobId: job.id,
|
||||||
|
nome: job.name,
|
||||||
|
tentativas: job.attemptsMade,
|
||||||
|
erro: erro.message,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Camadas e responsabilidades detalhadas
|
||||||
|
|
||||||
|
### Frontend (`@front` + `@ux`)
|
||||||
|
|
||||||
|
- Todo `catch` deve resultar em feedback visível ao usuário
|
||||||
|
- Nunca usar `catch (_) {}` sem ao menos logar no console do browser
|
||||||
|
- Mensagens de erro para o usuário: linguagem do domínio, sem stack trace, sem IDs técnicos
|
||||||
|
- Estados de carregamento e erro devem ser explícitos na UI (não apenas esconder o spinner)
|
||||||
|
- Usar o padrão: `loading → sucesso | erro`, nunca ficar preso em "loading" silencioso
|
||||||
|
|
||||||
|
### Backend (`@back`)
|
||||||
|
|
||||||
|
- Toda exceção capturada deve ser logada com contexto: qual operação, qual entidade, qual erro
|
||||||
|
- `console.error()` para erros operacionais; `console.warn()` para situações de atenção
|
||||||
|
- Nunca logar senhas, tokens ou dados pessoais
|
||||||
|
- O log deve incluir o suficiente para reproduzir o problema: IDs, parâmetros relevantes
|
||||||
|
- Erros internos não devem vazar para o cliente — traduzir para `ErroOperacional` ou equivalente
|
||||||
|
|
||||||
|
### Fila (`@back` + `@deploy`)
|
||||||
|
|
||||||
|
- Se o sistema usa BullMQ, Redis ou similar: configurar handler de `failed` e `error`
|
||||||
|
- Jobs que falham devem ser registrados com: jobId, nome, tentativas, payload relevante, erro
|
||||||
|
- Falhas repetidas devem gerar alerta (monitoramento de `job.failedReason`)
|
||||||
|
- Nunca deixar um job falhar silenciosamente sem registro
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
- **Diagnóstico:** sem log, nenhum problema pode ser investigado
|
||||||
|
- **Confiança do usuário:** feedback ausente = sistema parece travado ou bugado
|
||||||
|
- **Operação:** sem log de fila, jobs perdidos são invisíveis
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/mensagens-usuario` (vocabulário para mensagens ao usuário)
|
||||||
|
- Persona: `agents/front/persona` (estados de UI)
|
||||||
|
- Persona: `agents/back/persona` (tratamento de erros)
|
||||||
|
- Persona: `agents/ux/persona` (feedback imediato como princípio)
|
||||||
120
rules/fronteiras-monorepo.md
Normal file
120
rules/fronteiras-monorepo.md
Normal file
|
|
@ -0,0 +1,120 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: fronteiras-monorepo
|
||||||
|
description: Define a convenção de pacotes e regras de importação entre módulos do monorepo
|
||||||
|
scope: global
|
||||||
|
trigger: always_on
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Fronteiras de Pacote no Monorepo
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
Cada módulo SaaS do ecossistema é organizado em até 4 pacotes dentro de um monorepo. O agente **deve** respeitar as fronteiras de importação entre pacotes para evitar acoplamento indevido.
|
||||||
|
|
||||||
|
## Convenção de Pacotes
|
||||||
|
|
||||||
|
Cada módulo segue a estrutura:
|
||||||
|
|
||||||
|
```
|
||||||
|
<modulo>-back ← Servidor: rotas, serviços, filas, CRON
|
||||||
|
<modulo>-front ← Interface: páginas Vue, componentes, composables
|
||||||
|
<modulo>-comuns ← Compartilhado: tipos, schemas Zod, enums, utils puros
|
||||||
|
<modulo>-migracao ← Banco de dados: migrations, seeds, scripts de carga
|
||||||
|
```
|
||||||
|
|
||||||
|
Nem todo módulo terá os 4 pacotes. O mínimo funcional é `back` + `front` + `comuns`.
|
||||||
|
|
||||||
|
## Regras de Importação
|
||||||
|
|
||||||
|
### Permitido ✅
|
||||||
|
|
||||||
|
```
|
||||||
|
<modulo>-front → pode importar de → <modulo>-comuns
|
||||||
|
<modulo>-back → pode importar de → <modulo>-comuns
|
||||||
|
<modulo>-migracao → pode importar de → <modulo>-comuns
|
||||||
|
```
|
||||||
|
|
||||||
|
### Proibido ❌
|
||||||
|
|
||||||
|
```
|
||||||
|
<modulo>-front ✗ nunca importar de → <modulo>-back
|
||||||
|
<modulo>-back ✗ nunca importar de → <modulo>-front
|
||||||
|
<modulo>-migracao ✗ nunca importar de → <modulo>-front
|
||||||
|
<modulo>-front ✗ nunca importar de → <outro-modulo>-back
|
||||||
|
<outro-modulo> ✗ nunca importar de → <modulo>-back (direto)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Comunicação entre módulos
|
||||||
|
|
||||||
|
Módulos diferentes **nunca** importam código um do outro diretamente. Comunicação entre módulos deve ocorrer via:
|
||||||
|
|
||||||
|
- **API HTTP** (chamada de serviço entre backs)
|
||||||
|
- **Fila** (BullMQ, Redis) para processamento assíncrono
|
||||||
|
- **Banco compartilhado** com schemas/tabelas separados por módulo
|
||||||
|
- **Pacote `*-comuns` compartilhado** apenas para tipos e schemas de contrato
|
||||||
|
|
||||||
|
## O que vive em cada pacote
|
||||||
|
|
||||||
|
### `<modulo>-comuns`
|
||||||
|
|
||||||
|
O pacote comuns é a **única fonte de verdade** para tipos e schemas compartilhados:
|
||||||
|
|
||||||
|
```
|
||||||
|
<modulo>-comuns/src/
|
||||||
|
├── tabelas/ ← schemas Zod por entidade (zEntidadeCriar, etc.)
|
||||||
|
├── enums/ ← enums de domínio do módulo
|
||||||
|
├── tipos/ ← tipos derivados dos schemas
|
||||||
|
└── utils/ ← funções puras sem side-effect
|
||||||
|
```
|
||||||
|
|
||||||
|
**Proibido** no comuns:
|
||||||
|
- Componentes Vue ou React
|
||||||
|
- Código com `import` de Node.js (`fs`, `path`, `http`)
|
||||||
|
- Código com `import` de bibliotecas de frontend (`vue`, `vuetify`)
|
||||||
|
- Lógica de negócio que depende de banco ou serviço externo
|
||||||
|
|
||||||
|
### `<modulo>-back`
|
||||||
|
|
||||||
|
```
|
||||||
|
<modulo>-back/src/
|
||||||
|
├── rotas/ ← endpoints Express/Fastify
|
||||||
|
├── servicos/ ← lógica de negócio
|
||||||
|
├── banco/ ← queries (Knex, Prisma, etc.)
|
||||||
|
├── filas/ ← processadores de fila
|
||||||
|
├── cron/ ← tarefas agendadas
|
||||||
|
└── utils/ ← helpers exclusivos do back
|
||||||
|
```
|
||||||
|
|
||||||
|
### `<modulo>-front`
|
||||||
|
|
||||||
|
```
|
||||||
|
<modulo>-front/src/
|
||||||
|
├── paginas/ ← páginas/views por rota
|
||||||
|
├── componentes/ ← componentes reutilizáveis do módulo
|
||||||
|
├── composables/ ← lógica reutilizável (use*.ts)
|
||||||
|
└── utils/ ← helpers exclusivos do front
|
||||||
|
```
|
||||||
|
|
||||||
|
### `<modulo>-migracao`
|
||||||
|
|
||||||
|
```
|
||||||
|
<modulo>-migracao/src/
|
||||||
|
├── migrations/ ← criação/alteração de tabelas
|
||||||
|
├── seeds/ ← dados iniciais
|
||||||
|
└── scripts/ ← scripts de carga/transformação
|
||||||
|
```
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Sem esta regra:
|
||||||
|
- Front importa serviço de back (quebra em build de produção)
|
||||||
|
- Módulo A acessa tabelas do Módulo B diretamente (acoplamento oculto)
|
||||||
|
- Schemas ficam duplicados entre back e front
|
||||||
|
- Mudança em um módulo quebra outro sem aviso
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/zod-validacao-padrao` (schemas no `*-comuns`)
|
||||||
|
- Skill: `global/skills/mapear-codigo-fonte/SKILL`
|
||||||
86
rules/funcoes-anonimas-arrow.md
Normal file
86
rules/funcoes-anonimas-arrow.md
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: funcoes-anonimas-arrow
|
||||||
|
trigger: always_on
|
||||||
|
description: Exige uso de arrow functions (const x = () => {}) em vez de function declarations (function x() {})
|
||||||
|
scope: global
|
||||||
|
updatedAt: "2026-07-01"
|
||||||
|
globs:
|
||||||
|
- "**/*.ts"
|
||||||
|
- "**/*.tsx"
|
||||||
|
- "**/*.js"
|
||||||
|
- "**/*.vue"
|
||||||
|
alwaysApply: true
|
||||||
|
---
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
Este projeto adota **arrow functions** como padrão obrigatório para definição de funções. A declaração clássica `function x() {}` é proibida sempre que uma arrow function puder substituí-la, o que cobre a esmagadora maioria dos casos.
|
||||||
|
|
||||||
|
Isso garante consistência de estilo, evita ambiguidades de `this`, favorece inferência de tipos em TypeScript e mantém o código visualmente uniforme em todo o ecossistema.
|
||||||
|
|
||||||
|
## Regra
|
||||||
|
|
||||||
|
**Sempre que possível, é obrigatório usar arrow function expression:**
|
||||||
|
|
||||||
|
```ts
|
||||||
|
// ✅ CORRETO — arrow function expression
|
||||||
|
const calcular = (a: number, b: number): number => a + b
|
||||||
|
|
||||||
|
const buscarUsuario = async (id: string): Promise<Usuario> => {
|
||||||
|
return api.get(`/usuarios/${id}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const transformar = <T>(lista: T[], fn: (item: T) => T): T[] =>
|
||||||
|
lista.map(fn)
|
||||||
|
```
|
||||||
|
|
||||||
|
```ts
|
||||||
|
// ❌ PROIBIDO — function declaration
|
||||||
|
function calcular(a: number, b: number): number {
|
||||||
|
return a + b
|
||||||
|
}
|
||||||
|
|
||||||
|
async function buscarUsuario(id: string): Promise<Usuario> {
|
||||||
|
return api.get(`/usuarios/${id}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
function transformar<T>(lista: T[], fn: (item: T) => T): T[] {
|
||||||
|
return lista.map(fn)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Exceções permitidas
|
||||||
|
|
||||||
|
As únicas situações em que `function` é tolerada:
|
||||||
|
|
||||||
|
1. **Generators** — `function*` não tem equivalente em arrow function:
|
||||||
|
```ts
|
||||||
|
function* gerador() { yield 1 }
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Métodos de objeto/classe** — dentro de um `class` ou object literal com método de protocolo, a sintaxe de método é aceita:
|
||||||
|
```ts
|
||||||
|
class Servico {
|
||||||
|
processar() { ... } // OK dentro de classe
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Callbacks que exigem `this` dinâmico** — raro; apenas quando a API externa exige explicitamente (ex: certas integrações jQuery legadas).
|
||||||
|
|
||||||
|
Fora dessas três exceções, `function` é **proibida**.
|
||||||
|
|
||||||
|
## Diretiva para o agente
|
||||||
|
|
||||||
|
Ao revisar ou escrever código, o agente deve:
|
||||||
|
|
||||||
|
1. Identificar toda ocorrência de `function nome(` fora de classes e generators;
|
||||||
|
2. Substituir pela forma `const nome = (...) => { ... }`;
|
||||||
|
3. Ajustar a tipagem de retorno explícita quando necessário: `const fn = (): Tipo => { ... }`;
|
||||||
|
4. Para funções genéricas, manter o generic na arrow: `const fn = <T>(arg: T): T => arg`;
|
||||||
|
5. Nunca silenciar um erro de tipagem ao fazer a conversão — se surgir erro, resolver com tipagem correta.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/typescript-sem-any`
|
||||||
|
- Rule: `global/rules/jsdoc-padrao`
|
||||||
59
rules/jsdoc-padrao.md
Normal file
59
rules/jsdoc-padrao.md
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: jsdoc-padrao
|
||||||
|
description: Padrões de documentação em código (JSDoc, casts temporários e TODOs estruturados)
|
||||||
|
scope: global
|
||||||
|
trigger: file_match
|
||||||
|
globs:
|
||||||
|
- "**/*.ts"
|
||||||
|
- "**/*.tsx"
|
||||||
|
- "**/*.vue"
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Documentação em Código
|
||||||
|
|
||||||
|
## 1. JSDoc — Princípios
|
||||||
|
|
||||||
|
- **Por que, não o Quê**: documente o raciocínio, não o mecanismo que o TypeScript já expressa.
|
||||||
|
- **Nomenclatura limpa**: confie em nomes expressivos antes de comentários.
|
||||||
|
|
||||||
|
## 2. JSDoc obrigatório em funções compartilhadas
|
||||||
|
|
||||||
|
Toda função central ou de uso compartilhado deve ter cabeçalho JSDoc:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
/**
|
||||||
|
* Busca detalhes da entidade e calcula privilégios aplicáveis.
|
||||||
|
* Não utilizar em processamento em lote para evitar sobrecarga.
|
||||||
|
*
|
||||||
|
* @param tenantId - Identificador do tenant no sistema
|
||||||
|
* @param entityId - ID do registro na base de dados
|
||||||
|
* @returns Objeto consolidado ou `null` se não encontrado
|
||||||
|
*/
|
||||||
|
export const obterDetalhes = async (tenantId: string, entityId: string) => { ... }
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. Casts temporários — justificativa obrigatória
|
||||||
|
|
||||||
|
Coerções agressivas requerem comentário explicando o porquê:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Necessário: biblioteca externa não provê tipagem genérica na versão atual
|
||||||
|
const dados = payload.raw as unknown as RespostaFormatada
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. TODOs estruturados
|
||||||
|
|
||||||
|
Dívida técnica ou dúvida de negócio deve seguir formato padronizado:
|
||||||
|
|
||||||
|
- **Tipagem**: `// TODO de tipagem: Criar interface para o retorno da API`
|
||||||
|
- **Negócio**: `// TODO de regra: Validar com Produto se taxa se aplica a clientes antigos`
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Sem este padrão, funções compartilhadas ficam sem documentação, casts aparecem sem justificativa, e TODOs são inconsistentes e difíceis de buscar.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/typescript-sem-any`
|
||||||
66
rules/limite-linhas.md
Normal file
66
rules/limite-linhas.md
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: limite-linhas
|
||||||
|
description: Nenhum arquivo de código pode ultrapassar 250 linhas
|
||||||
|
scope: global
|
||||||
|
trigger: file_match
|
||||||
|
globs:
|
||||||
|
- "**/*.ts"
|
||||||
|
- "**/*.tsx"
|
||||||
|
- "**/*.vue"
|
||||||
|
- "**/*.css"
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Limite de 250 Linhas por Arquivo
|
||||||
|
|
||||||
|
## Regra
|
||||||
|
|
||||||
|
Nenhum arquivo `*.vue`, `*.ts`, `*.tsx` ou `*.css` pode ultrapassar **250 linhas**.
|
||||||
|
|
||||||
|
> Validação automática: `verificar-linhas.sh`
|
||||||
|
|
||||||
|
## Estratégias de Decomposição
|
||||||
|
|
||||||
|
| Situação | Ação |
|
||||||
|
|---|---|
|
||||||
|
| Template longo | Extrair seções como subcomponentes |
|
||||||
|
| CSS extenso | Mover para `<nome>.css` co-localizado |
|
||||||
|
| `setup()` extenso | Extrair subcomponentes, CSS ou Dispatch Table |
|
||||||
|
| Modal/Dialog embutido | Sempre em componente separado (`*Modal.vue`) |
|
||||||
|
| Handlers e dispatch | Extrair para `handlers.ts` ou `dispatch.ts` |
|
||||||
|
|
||||||
|
## Divisão em Pasta
|
||||||
|
|
||||||
|
Quando um componente precisa de múltiplos sub-arquivos, converter em **pasta homônima** com `index.vue`:
|
||||||
|
|
||||||
|
```
|
||||||
|
# Antes
|
||||||
|
ComponenteGrande.vue ← monolítico (+250 linhas)
|
||||||
|
|
||||||
|
# Depois
|
||||||
|
ComponenteGrande/
|
||||||
|
├── index.vue ← orquestração (≤250 linhas)
|
||||||
|
├── SecaoPrincipal.vue ← bloco de template extraído
|
||||||
|
├── SecaoSecundaria.vue ← outro bloco extraído
|
||||||
|
├── componenteGrande.mapeadores.ts ← lógica de eventos
|
||||||
|
└── ComponenteGrande.css ← estilos co-localizados
|
||||||
|
```
|
||||||
|
|
||||||
|
| Arquivo | Responsabilidade |
|
||||||
|
|---|---|
|
||||||
|
| `index.vue` | Orquestração: importa e compõe. Sem lógica densa. |
|
||||||
|
| `Secao*.vue` | Template isolado. Props + eventos. |
|
||||||
|
| `*.mapeadores.ts` | Funções de ação desacopladas. |
|
||||||
|
| `*.css` | Estilos co-localizados. |
|
||||||
|
|
||||||
|
> Importações externas não mudam: `ComponenteGrande/` resolve para `index.vue`.
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Sem esta regra, arquivos crescem silenciosamente até se tornarem intocáveis — ninguém quer revisar ou refatorar um componente de 800 linhas.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Script: `verificar-linhas.sh`
|
||||||
|
- Workflow: `global/workflows/otimizar-codigos`
|
||||||
123
rules/mensagens-usuario.md
Normal file
123
rules/mensagens-usuario.md
Normal file
|
|
@ -0,0 +1,123 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: mensagens-usuario
|
||||||
|
description: Toda mensagem visível ao usuário final deve ser escrita em linguagem do domínio, sem termos técnicos de TI
|
||||||
|
scope: global
|
||||||
|
trigger: file_match
|
||||||
|
globs:
|
||||||
|
- "**/*.vue"
|
||||||
|
- "**/*.ts"
|
||||||
|
- "**/*.tsx"
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Mensagens Orientadas ao Domínio
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
O usuário final dos módulos SaaS é profissional de **engenharia, ciência ou gestão ambiental**. Ele entende de legislação, processos técnicos e ciência aplicada — mas **não tem obrigação de entender tecnologia**.
|
||||||
|
|
||||||
|
Toda mensagem visível na interface — erro, validação, confirmação, tooltip, empty state, ajuda — deve ser escrita na linguagem do domínio do módulo.
|
||||||
|
|
||||||
|
## Regra
|
||||||
|
|
||||||
|
### 1. Erros de validação devem indicar O QUE preencher, não O QUE falhou
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ❌ ERRADO — linguagem técnica
|
||||||
|
"Campo obrigatório"
|
||||||
|
"Erro de validação"
|
||||||
|
"Formato inválido"
|
||||||
|
"Payload inválido"
|
||||||
|
|
||||||
|
// ✅ CORRETO — linguagem do domínio
|
||||||
|
"Informe a Área do Empreendimento (em hectares)"
|
||||||
|
"Selecione o Tipo de Licença: LP, LI ou LO"
|
||||||
|
"A Data da Vistoria deve ser anterior à data atual"
|
||||||
|
"Informe o CNPJ no formato 00.000.000/0000-00"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Erros de sistema devem ser traduzidos para o usuário
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ❌ ERRADO — erro técnico exposto
|
||||||
|
"Erro 500: Internal Server Error"
|
||||||
|
"Timeout na requisição"
|
||||||
|
"Network Error"
|
||||||
|
"ECONNREFUSED"
|
||||||
|
|
||||||
|
// ✅ CORRETO — mensagem humanizada
|
||||||
|
"Não foi possível salvar. Tente novamente em instantes."
|
||||||
|
"A operação demorou mais que o esperado. Tente novamente."
|
||||||
|
"Sem conexão com o servidor. Verifique sua internet."
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Estados vazios devem explicar o contexto
|
||||||
|
|
||||||
|
Quando uma lista ou tabela está vazia, a mensagem deve orientar o usuário:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ❌ ERRADO — genérico
|
||||||
|
"Nenhum registro encontrado"
|
||||||
|
"Lista vazia"
|
||||||
|
|
||||||
|
// ✅ CORRETO — explica o domínio e orienta
|
||||||
|
"Nenhuma condicionante cadastrada para esta licença."
|
||||||
|
"Nenhum relatório de monitoramento registrado neste período."
|
||||||
|
"Nenhum empreendimento encontrado com os filtros aplicados. Tente ampliar a busca."
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Confirmações devem descrever a consequência
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ❌ ERRADO — genérico
|
||||||
|
"Tem certeza que deseja excluir?"
|
||||||
|
"Confirmar operação?"
|
||||||
|
|
||||||
|
// ✅ CORRETO — descreve o impacto
|
||||||
|
"Excluir esta condicionante? O prazo de cumprimento e os documentos vinculados serão removidos."
|
||||||
|
"Arquivar esta licença? Ela não aparecerá mais nas listagens ativas."
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Labels e placeholders devem usar vocabulário do domínio
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ❌ ERRADO — genérico
|
||||||
|
label: "Nome"
|
||||||
|
placeholder: "Digite aqui"
|
||||||
|
|
||||||
|
// ✅ CORRETO — específico do domínio
|
||||||
|
label: "Razão Social do Empreendedor"
|
||||||
|
placeholder: "Ex: Mineração Vale Verde Ltda."
|
||||||
|
|
||||||
|
label: "Área Total do Empreendimento"
|
||||||
|
placeholder: "Em hectares (ex: 150,5)"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Schemas Zod devem ter mensagens de domínio
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ❌ ERRADO — mensagens padrão do Zod
|
||||||
|
const zEmpreendimento = z.object({
|
||||||
|
nome: z.string().min(1), // "String must contain at least 1 character(s)"
|
||||||
|
area: z.number().positive(), // "Number must be greater than 0"
|
||||||
|
})
|
||||||
|
|
||||||
|
// ✅ CORRETO — mensagens customizadas
|
||||||
|
const zEmpreendimento = z.object({
|
||||||
|
nome: z.string().min(1, "Informe o nome do empreendimento"),
|
||||||
|
area: z.number({ invalid_type_error: "A área deve ser um número" })
|
||||||
|
.positive("A área deve ser maior que zero"),
|
||||||
|
cnpj: z.string().regex(/^\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/,
|
||||||
|
"CNPJ inválido. Use o formato 00.000.000/0000-00"),
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Sem esta regra, o agente gera mensagens técnicas que confundem gestores ambientais, consultores e técnicos de campo — forçando a equipe de suporte a traduzir erros de sistema para o vocabulário do cliente.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/zod-validacao-padrao` (schemas com mensagens customizadas)
|
||||||
|
- Workflow: `global/workflows/ux` (design de interface)
|
||||||
105
rules/modal-dialog-padrao-betha.md
Normal file
105
rules/modal-dialog-padrao-betha.md
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: modal-dialog-padrao-betha
|
||||||
|
description: Define a estrutura obrigatória de modais e dialogs MUI no padrão Betha — header escuro, body branco, footer cinza — para os frontends React do ecossistema GOV
|
||||||
|
scope: global
|
||||||
|
trigger: context_match
|
||||||
|
priority: alta
|
||||||
|
updatedAt: "2026-07-02"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Padrão Modal/Dialog MUI — Estrutura Betha
|
||||||
|
|
||||||
|
Todo modal/dialog nos frontends React do ecossistema GOV deve seguir a estrutura visual Betha: **header escuro + body branco + footer cinza**.
|
||||||
|
|
||||||
|
## Estrutura Obrigatória
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
<Dialog
|
||||||
|
open={open}
|
||||||
|
onClose={onClose}
|
||||||
|
PaperProps={{
|
||||||
|
sx: {
|
||||||
|
borderRadius: "0.25rem",
|
||||||
|
boxShadow: "0 0.5rem 1rem rgba(0,0,0,.15)",
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{/* HEADER — escuro */}
|
||||||
|
<DialogTitle
|
||||||
|
sx={{
|
||||||
|
backgroundColor: "#343a40",
|
||||||
|
color: "#ffffff",
|
||||||
|
padding: "0.75rem 1rem",
|
||||||
|
position: "relative",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Título do Modal
|
||||||
|
<IconButton
|
||||||
|
onClick={onClose}
|
||||||
|
size="small"
|
||||||
|
sx={{ position: "absolute", right: 8, top: 8, color: "#ffffff" }}
|
||||||
|
>
|
||||||
|
<CloseIcon fontSize="small" />
|
||||||
|
</IconButton>
|
||||||
|
</DialogTitle>
|
||||||
|
|
||||||
|
{/* BODY — branco */}
|
||||||
|
<DialogContent sx={{ backgroundColor: "#ffffff", padding: "1rem" }}>
|
||||||
|
{/* conteúdo */}
|
||||||
|
</DialogContent>
|
||||||
|
|
||||||
|
{/* FOOTER — cinza claro */}
|
||||||
|
<DialogActions
|
||||||
|
sx={{
|
||||||
|
backgroundColor: "#f8f9fa",
|
||||||
|
borderTop: "1px solid #dee2e6",
|
||||||
|
padding: "0.75rem 1rem",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Button variant="outlined" color="secondary" onClick={onClose}>
|
||||||
|
Cancelar
|
||||||
|
</Button>
|
||||||
|
<Button variant="contained" color="primary" onClick={onConfirm}>
|
||||||
|
Confirmar
|
||||||
|
</Button>
|
||||||
|
</DialogActions>
|
||||||
|
</Dialog>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tokens dos Estilos
|
||||||
|
|
||||||
|
| Região | Cor | Hex |
|
||||||
|
|--------|-----|-----|
|
||||||
|
| DialogTitle bg | Dark | `#343a40` |
|
||||||
|
| DialogTitle color | Branco | `#ffffff` |
|
||||||
|
| DialogContent bg | Branco | `#ffffff` |
|
||||||
|
| DialogActions bg | Light | `#f8f9fa` |
|
||||||
|
| DialogActions border | Border | `#dee2e6` |
|
||||||
|
| Dialog shadow | — | `0 0.5rem 1rem rgba(0,0,0,.15)` |
|
||||||
|
| Dialog radius | — | `0.25rem` |
|
||||||
|
|
||||||
|
## Botões de Ação
|
||||||
|
|
||||||
|
| Papel | Variante | Cor |
|
||||||
|
|-------|---------|-----|
|
||||||
|
| Cancelar / Fechar | `outlined` | `secondary` |
|
||||||
|
| Confirmar / Salvar | `contained` | `primary` |
|
||||||
|
| Destrutivo (excluir) | `contained` | `error` |
|
||||||
|
|
||||||
|
## Regras
|
||||||
|
|
||||||
|
✅ **Correto:** sempre usar `IconButton` com `CloseIcon` no `DialogTitle` em posição `absolute`
|
||||||
|
✅ **Correto:** `DialogActions` sempre com `borderTop` e `backgroundColor` cinza
|
||||||
|
❌ **Incorreto:** header branco ou sem cor de fundo definida
|
||||||
|
❌ **Incorreto:** botões sem variante e cor explícitas
|
||||||
|
❌ **Incorreto:** usar `Modal` nu do MUI — sempre usar `Dialog` com as 3 regiões
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Evita modais com aparências inconsistentes entre telas e garante conformidade com a identidade visual Betha exigida pelo parceiro.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `theme-provider-mui-betha`
|
||||||
|
- Rule: `estilos-design-system`
|
||||||
75
rules/proibido-commit-ia.md
Normal file
75
rules/proibido-commit-ia.md
Normal file
|
|
@ -0,0 +1,75 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: proibido-commit-ia
|
||||||
|
description: A IA nunca pode executar git commit, git push ou qualquer operação que altere o histórico do repositório
|
||||||
|
scope: global
|
||||||
|
trigger: always_on
|
||||||
|
updatedAt: "2026-06-19"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Proibido Commit pela IA
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
O controle de versão é responsabilidade exclusiva do usuário humano. A IA pode preparar alterações, criar arquivos, editar código e até sugerir mensagens de commit — mas NUNCA deve executar comandos que alterem o histórico do repositório.
|
||||||
|
|
||||||
|
## Regra
|
||||||
|
|
||||||
|
A IA **NUNCA** deve executar os seguintes comandos (nem variações deles):
|
||||||
|
|
||||||
|
- `git commit`
|
||||||
|
- `git push`
|
||||||
|
- `git merge`
|
||||||
|
- `git rebase`
|
||||||
|
- `git tag`
|
||||||
|
- `git reset`
|
||||||
|
- `git revert`
|
||||||
|
- `git cherry-pick`
|
||||||
|
- `git stash drop`
|
||||||
|
- `git branch -d` / `git branch -D`
|
||||||
|
|
||||||
|
### Comandos permitidos (somente leitura e staging)
|
||||||
|
|
||||||
|
- `git status` ✅
|
||||||
|
- `git diff` ✅
|
||||||
|
- `git log` ✅
|
||||||
|
- `git add` ✅ (preparar alterações para o usuário revisar)
|
||||||
|
- `git stash` / `git stash pop` ✅ (preservar trabalho temporário)
|
||||||
|
- `git branch` (listar) ✅
|
||||||
|
- `git ls-files` ✅
|
||||||
|
- `git show` ✅
|
||||||
|
|
||||||
|
## Exemplos
|
||||||
|
|
||||||
|
❌ **Errado** — commitar automaticamente:
|
||||||
|
```sh
|
||||||
|
git add -A && git commit -m "fix: corrigir bug"
|
||||||
|
```
|
||||||
|
|
||||||
|
❌ **Errado** — push automático:
|
||||||
|
```sh
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
✅ **Correto** — preparar e informar:
|
||||||
|
```sh
|
||||||
|
git add -A
|
||||||
|
git status
|
||||||
|
# Informar ao usuário: "Alterações staged. Revise e faça o commit quando estiver pronto."
|
||||||
|
```
|
||||||
|
|
||||||
|
✅ **Correto** — sugerir mensagem de commit:
|
||||||
|
```
|
||||||
|
Sugestão de commit:
|
||||||
|
git commit -m "feat: adicionar validação de schema no endpoint /usuarios"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
- **Segurança:** o usuário mantém controle total sobre o que entra no histórico
|
||||||
|
- **Revisão:** toda alteração pode ser inspecionada antes de ser commitada
|
||||||
|
- **Reversibilidade:** evita commits acidentais que poluem o histórico
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Princípio de autonomia controlada: a IA executa, o humano decide
|
||||||
56
rules/refatoracao-segura.md
Normal file
56
rules/refatoracao-segura.md
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: refatoracao-segura
|
||||||
|
description: Toda refatoração deve preservar comportamento e ter cobertura de testes
|
||||||
|
scope: local
|
||||||
|
trigger: always_on
|
||||||
|
updatedAt: "2026-06-19"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Refatoração Segura
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
Refatoração é a melhoria da estrutura interna do código **sem alterar seu comportamento externo**. Sem essa garantia, refatoração vira regressão.
|
||||||
|
|
||||||
|
## Regra
|
||||||
|
|
||||||
|
Antes de executar qualquer refatoração, verificar:
|
||||||
|
|
||||||
|
1. **Testes existem** — o comportamento que será afetado tem cobertura
|
||||||
|
2. **Testes passam** — o estado antes da mudança é verde
|
||||||
|
3. **Passos pequenos** — cada mudança deve ser verificável isoladamente
|
||||||
|
4. **Sem surpresas** — nenhuma funcionalidade nova introduzida junto com refatoração
|
||||||
|
|
||||||
|
Se não há testes cobrindo o trecho:
|
||||||
|
- **PARAR** a refatoração
|
||||||
|
- Solicitar ao `@testes` a criação de testes de cobertura
|
||||||
|
- Só prosseguir após testes existirem e passarem
|
||||||
|
|
||||||
|
## Exemplos
|
||||||
|
|
||||||
|
### ✅ Correto
|
||||||
|
```
|
||||||
|
1. Verificar testes existentes para `calcularLicenca()`
|
||||||
|
2. Executar testes → todos passam
|
||||||
|
3. Extrair cálculo de multa para `calcularMulta()`
|
||||||
|
4. Executar testes → todos passam
|
||||||
|
5. Commit: "refactor: extrair calcularMulta de calcularLicenca"
|
||||||
|
```
|
||||||
|
|
||||||
|
### ❌ Incorreto
|
||||||
|
```
|
||||||
|
1. Refatorar `calcularLicenca()` inteiro
|
||||||
|
2. Adicionar nova regra de desconto (feature!)
|
||||||
|
3. Descobrir que não tinha testes
|
||||||
|
4. Commit: "refactor: melhorar cálculos" ← mentira, é feature + refatoração
|
||||||
|
```
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Sem esta regra, refatorações introduzem regressões silenciosas que só são descobertas em produção.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Martin Fowler — "Refactoring: Improving the Design of Existing Code"
|
||||||
|
- Persona: `agents/refatorar/persona`
|
||||||
120
rules/regras-negocio-md.md
Normal file
120
rules/regras-negocio-md.md
Normal file
|
|
@ -0,0 +1,120 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: regras-negocio-md
|
||||||
|
description: Arquivo {modulo}.regras-negocio.md obrigatório para módulos com lógica complexa
|
||||||
|
scope: global
|
||||||
|
trigger: always_on
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Arquivo `{modulo}.regras-negocio.md` Obrigatório para Módulos com Lógica Complexa
|
||||||
|
|
||||||
|
> **Escopo global** — aplica-se a todos os projetos do ecossistema Azteca.
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
Qualquer arquivo TypeScript que contenha lógica de negócio não-trivial — múltiplas regras de decisão, critérios de bloqueio, estratégias de processamento — deve ter suas regras documentadas em linguagem natural em um arquivo Markdown co-localizado.
|
||||||
|
|
||||||
|
Isso garante que produto, suporte e desenvolvimento possam entender as regras sem precisar ler TypeScript, e que o agente de IA encontre rapidamente os critérios corretos antes de alterar qualquer código.
|
||||||
|
|
||||||
|
## Regra
|
||||||
|
|
||||||
|
**Todo módulo com lógica de negócio não-trivial DEVE ter um arquivo `{modulo}.regras-negocio.md` co-localizado.**
|
||||||
|
|
||||||
|
Considera-se lógica não-trivial qualquer módulo que:
|
||||||
|
- possui 3 ou mais critérios de decisão distintos
|
||||||
|
- realiza eleição/priorização entre registros
|
||||||
|
- aplica diferentes estratégias por tipo de dado
|
||||||
|
- pode resultar em revisão manual (caminho alternativo ao fluxo automático)
|
||||||
|
- é consumido por CRON, worker ou importador automático
|
||||||
|
|
||||||
|
O módulo TypeScript deve conter, na primeira linha do arquivo, a referência:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Regras de negócio: ver {modulo}.regras-negocio.md
|
||||||
|
```
|
||||||
|
|
||||||
|
O arquivo `.md` é a **fonte de verdade**. Os JSDoc do código devem referenciar o `.md`, não duplicá-lo.
|
||||||
|
|
||||||
|
## Estrutura Obrigatória do Arquivo
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Regras de Negócio — [Nome do Módulo]
|
||||||
|
|
||||||
|
Módulo: `_arquivo.ts`
|
||||||
|
Localização: `caminho/relativo/ao/arquivo`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
Por que este módulo existe, qual problema resolve.
|
||||||
|
|
||||||
|
## Critérios de Entrada / Identificação
|
||||||
|
O que aciona o módulo, quais dados recebe, filtros aplicados.
|
||||||
|
|
||||||
|
## Regras de Processamento
|
||||||
|
As regras numeradas em ordem de avaliação.
|
||||||
|
|
||||||
|
## Casos de Revisão Manual (quando aplicável)
|
||||||
|
Quando o processamento automático não pode prosseguir.
|
||||||
|
|
||||||
|
## Estratégia de Fusão / Resultado (quando aplicável)
|
||||||
|
O que o módulo produz, como campos são combinados.
|
||||||
|
|
||||||
|
## Dependências Externas
|
||||||
|
Tabelas, filas, serviços externos tocados pelo módulo.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Exemplos
|
||||||
|
|
||||||
|
✅ **Correto** — referência no topo do módulo, regras no `.md`:
|
||||||
|
```typescript
|
||||||
|
// Regras de negócio: ver juntar_execucoes.regras-negocio.md
|
||||||
|
|
||||||
|
import { ... } from "..."
|
||||||
|
|
||||||
|
export const compilarJuntarExecucoes = async (...) => {
|
||||||
|
// implementação conforme regras-negocio.md
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
❌ **Errado** — regras embutidas no código como comentário de bloco:
|
||||||
|
```typescript
|
||||||
|
/**
|
||||||
|
* Regras de negócio:
|
||||||
|
* [x] Pode ter apenas uma execução por data de vencimento.
|
||||||
|
* [x] Se tiver apenas uma execução consolidada → ela é a principal.
|
||||||
|
* ...
|
||||||
|
*/
|
||||||
|
```
|
||||||
|
|
||||||
|
❌ **Errado** — JSDoc duplicando as regras em vez de referenciar o `.md`:
|
||||||
|
```typescript
|
||||||
|
/**
|
||||||
|
* Retorna false quando:
|
||||||
|
* - vencimentos divergentes
|
||||||
|
* - executada com datas distintas
|
||||||
|
* - vencimento_prorrogado distintos
|
||||||
|
* ...
|
||||||
|
*/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Sem este padrão:
|
||||||
|
- Regras de negócio ficam implícitas no código ou em JSDoc que envelhece sem controle
|
||||||
|
- O agente de IA precisa inferir regras do código ao invés de lê-las diretamente
|
||||||
|
- Produto e suporte não conseguem validar o comportamento sem ajuda técnica
|
||||||
|
- Mudanças de regra geram JSDoc desatualizado espalhado pelo código
|
||||||
|
|
||||||
|
## Aplicação
|
||||||
|
|
||||||
|
- Módulos de CRON com lógica de auditoria/fusão
|
||||||
|
- Importadores automáticos (ex: importação de licenças via IA)
|
||||||
|
- Workers de processamento em lote
|
||||||
|
- Qualquer utilitário com lógica de decisão multi-critério
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Skill: `global/skills/documentar-regras-negocio/SKILL`
|
||||||
|
- Workflow: `global/workflows/documentar-regras-negocio`
|
||||||
88
rules/solid-compliance.md
Normal file
88
rules/solid-compliance.md
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: solid-compliance
|
||||||
|
description: Todo código deve aderir aos 5 princípios SOLID do Refactoring.Guru
|
||||||
|
scope: local
|
||||||
|
trigger: context_match
|
||||||
|
updatedAt: "2026-06-19"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Conformidade SOLID
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
Os princípios SOLID são o alicerce de software manutenível. Violações geram acoplamento, rigidez e fragilidade que crescem exponencialmente com o tempo.
|
||||||
|
|
||||||
|
## Regra
|
||||||
|
|
||||||
|
Ao analisar ou modificar código, verificar conformidade com cada princípio:
|
||||||
|
|
||||||
|
### S — Responsabilidade Única
|
||||||
|
|
||||||
|
- Cada arquivo tem uma única razão para mudar
|
||||||
|
- Funções fazem uma única coisa
|
||||||
|
- Composables encapsulam um único domínio de estado
|
||||||
|
|
||||||
|
**Indicador de violação:** arquivo que precisa mudar quando regras de negócio **E** regras de apresentação mudam.
|
||||||
|
|
||||||
|
### O — Aberto/Fechado
|
||||||
|
|
||||||
|
- Novas funcionalidades adicionadas por extensão (novos arquivos), não por edição de existentes
|
||||||
|
- Usar dispatch tables, strategy pattern ou plugins
|
||||||
|
|
||||||
|
**Indicador de violação:** `if/else` ou `switch` que cresce a cada nova variação.
|
||||||
|
|
||||||
|
### L — Substituição de Liskov
|
||||||
|
|
||||||
|
- Subtipos podem ser usados onde o tipo base é esperado
|
||||||
|
- Funções que aceitam um tipo base funcionam com qualquer subtipo
|
||||||
|
|
||||||
|
**Indicador de violação:** `instanceof` ou type guards que verificam subtipos para mudar comportamento.
|
||||||
|
|
||||||
|
### I — Segregação de Interface
|
||||||
|
|
||||||
|
- Tipos/interfaces contêm apenas os membros que seus consumidores usam
|
||||||
|
- Nenhum módulo é forçado a depender de métodos que não utiliza
|
||||||
|
|
||||||
|
**Indicador de violação:** tipo com campos opcionais demais (`?`) que na prática são obrigatórios em alguns contextos.
|
||||||
|
|
||||||
|
### D — Inversão de Dependência
|
||||||
|
|
||||||
|
- Módulos de lógica de negócio não importam de módulos de infraestrutura diretamente
|
||||||
|
- Dependência flui através de abstrações (interfaces, tipos, schemas Zod)
|
||||||
|
|
||||||
|
**Indicador de violação:** serviço de negócio importando driver de banco ou cliente HTTP diretamente.
|
||||||
|
|
||||||
|
## Exemplos
|
||||||
|
|
||||||
|
### ✅ Correto — Princípio O (Aberto/Fechado)
|
||||||
|
```ts
|
||||||
|
// dispatch table: extensível sem editar código existente
|
||||||
|
const calculadores: Record<TipoLicenca, CalculadorFn> = {
|
||||||
|
ambiental: calcularAmbiental,
|
||||||
|
sanitaria: calcularSanitaria,
|
||||||
|
// nova licença? adicionar aqui sem tocar nas funções existentes
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### ❌ Incorreto — Violação do Princípio S (Responsabilidade Única)
|
||||||
|
```ts
|
||||||
|
// arquivo que faz validação + cálculo + formatação + envio de email
|
||||||
|
export function processarLicenca(dados: DadosLicenca) {
|
||||||
|
validar(dados) // validação
|
||||||
|
const valor = calcular(dados) // cálculo
|
||||||
|
const pdf = gerarPDF(valor) // formatação
|
||||||
|
enviarEmail(pdf) // notificação
|
||||||
|
// 4 razões para mudar = 4 responsabilidades
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Código que viola SOLID se torna cada vez mais caro de manter: cada mudança exige mais esforço e introduz mais risco de regressão.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Robert C. Martin — "Agile Software Development, Principles, Patterns, and Practices"
|
||||||
|
- Refactoring.Guru — https://refactoring.guru/pt-br/design-patterns
|
||||||
|
- Persona: `agents/refatorar/persona`
|
||||||
90
rules/theme-provider-mui-betha.md
Normal file
90
rules/theme-provider-mui-betha.md
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: theme-provider-mui-betha
|
||||||
|
description: Define a arquitetura centralizada do ThemeProvider MUI Betha nos frontends React do ecossistema GOV (AUTENTICACAO-FRONT, QUIPO-FRONT, QUIPO-PORTAL3)
|
||||||
|
scope: global
|
||||||
|
trigger: context_match
|
||||||
|
priority: alta
|
||||||
|
updatedAt: "2026-07-02"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: ThemeProvider MUI Centralizado — Arquitetura Betha
|
||||||
|
|
||||||
|
Os frontends React do ecossistema GOV usam MUI com tema centralizado. **Nunca criar temas locais em componentes.**
|
||||||
|
|
||||||
|
## Arquitetura de Camadas
|
||||||
|
|
||||||
|
```
|
||||||
|
themeOptions.ts
|
||||||
|
├── tema-betha.ts → createTheme(themeOptions) — marca Betha
|
||||||
|
├── tema-e-licencie.ts → createTheme({...themeOptions, — marca e-licencie
|
||||||
|
│ palette: { primary: { main: "#688c00" } }})
|
||||||
|
└── tema.ts → exporta { tema } baseado em eBetha()
|
||||||
|
↓
|
||||||
|
index.tsx / App.tsx
|
||||||
|
<ThemeProvider theme={tema.tema}>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tokens do `themeOptions.ts`
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const themeOptions = {
|
||||||
|
palette: {
|
||||||
|
primary: { main: "#007bff", dark: "#0069d9" },
|
||||||
|
secondary: { main: "#6c757d" },
|
||||||
|
error: { main: "#dc3545" },
|
||||||
|
warning: { main: "#ffc107" },
|
||||||
|
info: { main: "#17a2b8" },
|
||||||
|
success: { main: "#28a745" },
|
||||||
|
background:{ default: "#EBEDF0", paper: "#ffffff" },
|
||||||
|
},
|
||||||
|
typography: {
|
||||||
|
fontFamily: '"Open Sans", Arial, sans-serif',
|
||||||
|
fontSize: 14,
|
||||||
|
button: { textTransform: "none" },
|
||||||
|
},
|
||||||
|
shape: {
|
||||||
|
borderRadius: 4, // 0.25rem
|
||||||
|
},
|
||||||
|
shadows: [
|
||||||
|
"none",
|
||||||
|
"0 0 0 1px rgba(63,63,68,.05), 0 1px 3px 0 rgba(63,63,68,.15)",
|
||||||
|
// ... MUI padrão para os demais
|
||||||
|
],
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
## Regras
|
||||||
|
|
||||||
|
✅ **Correto:** importar `tema` de `styles/tema-betha.ts` quando um componente isolado precisa de ThemeProvider próprio
|
||||||
|
✅ **Correto:** `themeOptions.ts` é a única fonte de tokens — modificar só lá
|
||||||
|
❌ **Incorreto:** `createTheme()` vazio ou com tokens hardcoded dentro de componentes
|
||||||
|
❌ **Incorreto:** múltiplos `ThemeProvider` aninhados com temas distintos
|
||||||
|
|
||||||
|
## Exemplo — Componente que precisa de ThemeProvider próprio
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ✅ Importar de styles/tema-betha.ts, NUNCA criar novo
|
||||||
|
import { tema } from "@/styles/tema-betha";
|
||||||
|
|
||||||
|
<ThemeProvider theme={tema}>
|
||||||
|
<Passos />
|
||||||
|
</ThemeProvider>
|
||||||
|
```
|
||||||
|
|
||||||
|
## AUTENTICACAO-FRONT — Estrutura específica
|
||||||
|
|
||||||
|
```
|
||||||
|
src/_FRONT/Components/Plugins/tema.ts
|
||||||
|
→ exporta themeBetha e themeELicencie
|
||||||
|
→ App.tsx decide qual usar via eBetha()
|
||||||
|
```
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Evita divergências visuais entre telas e garante que a troca de marca (Betha ↔ e-licencie) seja controlada por um único ponto.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `estilos-design-system`
|
||||||
|
- Rule: `css-global-betha`
|
||||||
65
rules/tsconfig-ignore-deprecations.md
Normal file
65
rules/tsconfig-ignore-deprecations.md
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: tsconfig-ignore-deprecations
|
||||||
|
description: Workaround obrigatório para tsup v8.5.0 que injeta baseUrl depreciado no TS 6.0
|
||||||
|
scope: global
|
||||||
|
trigger: file_match
|
||||||
|
globs:
|
||||||
|
- "**/tsconfig.json"
|
||||||
|
updatedAt: "2026-07-01"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: ignoreDeprecations no tsconfig.json
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
O `tsup` v8.5.0 injeta internamente `baseUrl: "."` no `rollup-dts-plugin` durante a geração de arquivos `.d.ts` (DTS Build). O TypeScript 6.0 trata `baseUrl` como depreciado (erro TS5101), causando falha fatal no build DTS.
|
||||||
|
|
||||||
|
## Regra
|
||||||
|
|
||||||
|
Todo `tsconfig.json` de pacotes que usam `tsup` **DEVE** incluir:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"ignoreDeprecations": "6.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Isso silencia todas as deprecações da era 5.x/6.0 sem efeito colateral.
|
||||||
|
|
||||||
|
## Quando remover
|
||||||
|
|
||||||
|
Esta regra é um **workaround temporário**. Deve ser removida quando o `tsup` lançar uma versão que não injete `baseUrl` automaticamente. Monitorar releases do tsup para deprecar esta rule.
|
||||||
|
|
||||||
|
## Exemplos
|
||||||
|
|
||||||
|
```json
|
||||||
|
// ✅ Correto — com workaround
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"module": "ESNext",
|
||||||
|
"ignoreDeprecations": "6.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ❌ Incorreto — build DTS falhará
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"module": "ESNext"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Sem `ignoreDeprecations`, o comando `pnpm run build` falhará com erro TS5101 em qualquer pacote que gere arquivos `.d.ts` via tsup.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Memória Azteca: código 53
|
||||||
|
- Rule: `global/rules/typescript-module-resolution`
|
||||||
|
- Código responsável: `node_modules/tsup/dist/rollup.js`
|
||||||
74
rules/typescript-module-resolution.md
Normal file
74
rules/typescript-module-resolution.md
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: typescript-module-resolution
|
||||||
|
description: Padrão obrigatório de moduleResolution para todos os pacotes do monorepo Azteca
|
||||||
|
scope: global
|
||||||
|
trigger: file_match
|
||||||
|
globs:
|
||||||
|
- "**/tsconfig.json"
|
||||||
|
priority: alta
|
||||||
|
updatedAt: "2026-07-01"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: moduleResolution Padrão do Monorepo
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
O TypeScript 6.0 deprecia `moduleResolution: "node"` (alias de `"node10"`), que deixará de funcionar no TS 7.0 (erro TS5107). Todos os pacotes do ecossistema Azteca compilam via **tsup** ou **vite**, portanto devem usar o modo `bundler`.
|
||||||
|
|
||||||
|
## Regra
|
||||||
|
|
||||||
|
Todo `tsconfig.json` no monorepo **DEVE** usar:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"module": "ESNext"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Alternativa `node16` — REJEITADA
|
||||||
|
|
||||||
|
A opção `node16` foi testada e rejeitada por ser excessivamente estrita com dependências externas que não declaram corretamente as fronteiras ESM/CJS (erro TS1479).
|
||||||
|
|
||||||
|
## Exemplos
|
||||||
|
|
||||||
|
```json
|
||||||
|
// ✅ Correto — modo bundler
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"module": "ESNext"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ❌ Incorreto — modo depreciado
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"moduleResolution": "node"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ❌ Incorreto — estrito demais para o ecossistema
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"moduleResolution": "node16",
|
||||||
|
"module": "Node16"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Procedimento ao corrigir
|
||||||
|
|
||||||
|
Ao corrigir `moduleResolution` em um pacote, **varrer todos os `tsconfig.json` do monorepo** para garantir consistência. Não corrigir isoladamente.
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Sem este padrão, o build falhará no TypeScript 7.0 com erro fatal TS5107. Já no TS 6.0 gera warnings de depreciação que poluem o output.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Memória Azteca: códigos 51, 52, 54
|
||||||
|
- Rule: `global/rules/tsconfig-ignore-deprecations`
|
||||||
77
rules/typescript-sem-any.md
Normal file
77
rules/typescript-sem-any.md
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: typescript-sem-any
|
||||||
|
trigger: always_on
|
||||||
|
description: Proíbe uso de any, casts inseguros e padroniza uso de enums em código TypeScript
|
||||||
|
scope: global
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
globs:
|
||||||
|
- "**/*.ts"
|
||||||
|
- "**/*.tsx"
|
||||||
|
- "**/*.vue"
|
||||||
|
alwaysApply: true
|
||||||
|
---
|
||||||
|
|
||||||
|
Regras obrigatórias para TypeScript neste projeto:
|
||||||
|
|
||||||
|
- Nunca usar `any`.
|
||||||
|
- Nunca usar `as any`.
|
||||||
|
- Nunca contornar erro de tipagem com cast forçado.
|
||||||
|
- Quando o tipo não for conhecido, usar `unknown`.
|
||||||
|
- Antes de acessar valores `unknown`, fazer narrowing com:
|
||||||
|
- `typeof`
|
||||||
|
- `in`
|
||||||
|
- `Array.isArray`
|
||||||
|
- type guards
|
||||||
|
- schemas de validação como Zod
|
||||||
|
- Preferir:
|
||||||
|
- generics
|
||||||
|
- union types
|
||||||
|
- `Record<string, unknown>`
|
||||||
|
- `Partial<T>`
|
||||||
|
- `Pick<T, K>`
|
||||||
|
- `PropType<T>` em Vue
|
||||||
|
- tipos derivados de funções existentes
|
||||||
|
- Se faltar tipo, o agente deve:
|
||||||
|
1. procurar tipos já existentes no projeto;
|
||||||
|
2. criar um tipo/interface local explícita;
|
||||||
|
3. inferir a partir do contexto sempre que possível;
|
||||||
|
4. deixar um `TODO de tipagem` explícito, mas sem usar `any`.
|
||||||
|
|
||||||
|
Regras obrigatórias para uso de enums:
|
||||||
|
|
||||||
|
- Quando um valor estiver associado a um `enum`, é obrigatório utilizar o enum, nunca strings literais.
|
||||||
|
- O acesso deve seguir o padrão: `<NomeEnum>.VALOR`.
|
||||||
|
|
||||||
|
Também é proibido, quando existir `enum` correspondente:
|
||||||
|
|
||||||
|
- utilizar strings literais no lugar do enum (ex: `"ativo"`, `"inativo"`, `"automatica"`, `"criar"`);
|
||||||
|
- utilizar cast para forçar compatibilidade com enum (ex: `"ativo" as StatusConta`).
|
||||||
|
|
||||||
|
Proibido gerar código que apenas "faça compilar" usando:
|
||||||
|
|
||||||
|
- `as any`
|
||||||
|
- `: any`
|
||||||
|
- `[] as any`
|
||||||
|
- `{ } as any`
|
||||||
|
- dupla coerção como `as unknown as any`
|
||||||
|
|
||||||
|
Em casos excepcionais, preferir:
|
||||||
|
|
||||||
|
- `as unknown as TipoEspecifico` somente se houver justificativa clara e comentário técnico.
|
||||||
|
|
||||||
|
Diretriz para o agente:
|
||||||
|
|
||||||
|
Se encontrar uma string que represente um valor de domínio do sistema, o agente deve:
|
||||||
|
|
||||||
|
1. procurar se já existe um `enum` correspondente no projeto;
|
||||||
|
2. usar o `enum` existente;
|
||||||
|
3. se não existir, propor a criação de um `enum` explícito, em vez de manter strings soltas.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Skill: `global/skills/diagnosticar-erros-build/SKILL` (quando erros de tipagem causam falhas de build em cascata)
|
||||||
|
- Workflow: `global/workflows/otimizar-codigos` (padrão de documentação para casts temporários)
|
||||||
|
|
||||||
238
rules/zod-validacao-padrao.md
Normal file
238
rules/zod-validacao-padrao.md
Normal file
|
|
@ -0,0 +1,238 @@
|
||||||
|
---
|
||||||
|
type: rule
|
||||||
|
name: zod-validacao-padrao
|
||||||
|
description: Estabelece Zod como biblioteca obrigatória de validação em todo o ecossistema Azteca
|
||||||
|
version: "1.0"
|
||||||
|
scope: global
|
||||||
|
priority: alta
|
||||||
|
trigger: always_on
|
||||||
|
globs:
|
||||||
|
- "**/*.ts"
|
||||||
|
- "**/*.tsx"
|
||||||
|
- "**/*.vue"
|
||||||
|
alwaysApply: true
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
references:
|
||||||
|
- global/rules/typescript-sem-any
|
||||||
|
- global/skills/criar-schema-zod/SKILL
|
||||||
|
---
|
||||||
|
|
||||||
|
# Regra: Zod como Validador Padrão
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
Todo projeto do ecossistema Azteca que receba dados externos — API, formulário, webhook, importação, fila, variáveis de ambiente — **deve** validar esses dados com [Zod](https://zod.dev).
|
||||||
|
|
||||||
|
Zod é a única biblioteca de validação autorizada porque:
|
||||||
|
|
||||||
|
- Inferência nativa de tipos TypeScript (`z.infer<>`) — elimina duplicação entre schema e tipo
|
||||||
|
- Bundle pequeno (~13KB gzipped) — viável no frontend
|
||||||
|
- Compartilhável entre back e front via pacotes `*-comuns`
|
||||||
|
- Ecossistema maduro: `zod-to-json-schema`, `@anatine/zod-nestjs`, integração com `tRPC`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Regra
|
||||||
|
|
||||||
|
### 1. Toda entrada externa deve ser validada com Zod
|
||||||
|
|
||||||
|
Entradas externas incluem:
|
||||||
|
|
||||||
|
- **Corpo de requisição** (API REST, webhook, GraphQL)
|
||||||
|
- **Query params e path params**
|
||||||
|
- **Formulários de frontend**
|
||||||
|
- **Dados de fila** (BullMQ, Redis, etc.)
|
||||||
|
- **Arquivos importados** (CSV, JSON, Excel)
|
||||||
|
- **Variáveis de ambiente**
|
||||||
|
- **Respostas de APIs externas** (quando a resposta não é confiável)
|
||||||
|
|
||||||
|
### 2. Schemas devem residir no pacote `*-comuns`
|
||||||
|
|
||||||
|
Para que front e back compartilhem os mesmos schemas, eles devem residir no pacote `<modulo>-comuns`:
|
||||||
|
|
||||||
|
```
|
||||||
|
<modulo>-comuns/src/
|
||||||
|
├── tabelas/
|
||||||
|
│ ├── usuarios/
|
||||||
|
│ │ ├── zUsuarioCriar.ts
|
||||||
|
│ │ ├── zUsuarioEditar.ts
|
||||||
|
│ │ └── index.ts
|
||||||
|
│ ├── empresas/
|
||||||
|
│ │ ├── zEmpresaCriar.ts
|
||||||
|
│ │ └── index.ts
|
||||||
|
│ └── index.ts
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Tipos devem ser derivados dos schemas (nunca o inverso)
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ✅ CORRETO — tipo derivado do schema
|
||||||
|
export const zUsuarioCriar = z.object({
|
||||||
|
nome: z.string().min(1),
|
||||||
|
email: z.string().email(),
|
||||||
|
ativo: z.boolean().default(true),
|
||||||
|
})
|
||||||
|
export type tipoUsuarioCriar = z.infer<typeof zUsuarioCriar>
|
||||||
|
|
||||||
|
// ❌ ERRADO — tipo manual separado do schema
|
||||||
|
interface UsuarioCriar {
|
||||||
|
nome: string
|
||||||
|
email: string
|
||||||
|
ativo?: boolean
|
||||||
|
}
|
||||||
|
const zUsuarioCriar = z.object({ ... }) // duplicação!
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Nomenclatura obrigatória de schemas
|
||||||
|
|
||||||
|
| Padrão | Uso | Exemplo |
|
||||||
|
|--------|-----|---------|
|
||||||
|
| `z{Entidade}Criar` | Criação de registro | `zUsuarioCriar` |
|
||||||
|
| `z{Entidade}Editar` | Edição de registro | `zUsuarioEditar` |
|
||||||
|
| `z{Entidade}Filtro` | Filtros de listagem | `zUsuarioFiltro` |
|
||||||
|
| `z{Entidade}Resposta` | Resposta de API | `zUsuarioResposta` |
|
||||||
|
| `z{Entidade}Params` | Parâmetros de rota | `zUsuarioParams` |
|
||||||
|
| `z{Modulo}Config` | Configuração do módulo | `zGeeConfig` |
|
||||||
|
| `z{Modulo}Ambiente` | Variáveis de ambiente | `zBackAmbiente` |
|
||||||
|
|
||||||
|
Prefixo `z` minúsculo + nome em `PascalCase`.
|
||||||
|
|
||||||
|
### 5. Usar `safeParse` em vez de `parse` para erros controlados
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ✅ CORRETO — erro controlado
|
||||||
|
const resultado = zUsuarioCriar.safeParse(dados)
|
||||||
|
if (!resultado.success) {
|
||||||
|
return respostaComuns.erro(resultado.error.issues[0].message)
|
||||||
|
}
|
||||||
|
const usuario = resultado.data // tipado automaticamente
|
||||||
|
|
||||||
|
// ❌ ERRADO — throw não controlado
|
||||||
|
const usuario = zUsuarioCriar.parse(dados) // lança ZodError
|
||||||
|
```
|
||||||
|
|
||||||
|
A exceção é em contextos onde o throw é desejável (middleware global, início de pipeline).
|
||||||
|
|
||||||
|
### 6. Nunca usar validação manual quando Zod resolve
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ❌ ERRADO — validação manual
|
||||||
|
if (!dados.nome || typeof dados.nome !== "string") {
|
||||||
|
return erro("Nome é obrigatório")
|
||||||
|
}
|
||||||
|
if (!dados.email || !dados.email.includes("@")) {
|
||||||
|
return erro("Email inválido")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ✅ CORRETO — Zod faz tudo
|
||||||
|
const resultado = zUsuarioCriar.safeParse(dados)
|
||||||
|
if (!resultado.success) {
|
||||||
|
return erro(resultado.error.issues[0].message)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7. Transformações e defaults pertencem ao schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ✅ CORRETO — transformação no schema
|
||||||
|
export const zProdutoCriar = z.object({
|
||||||
|
nome: z.string().trim().min(1),
|
||||||
|
preco: z.coerce.number().positive(),
|
||||||
|
ativo: z.boolean().default(true),
|
||||||
|
codigo: z.string().toUpperCase().optional(),
|
||||||
|
tags: z.array(z.string()).default([]),
|
||||||
|
})
|
||||||
|
|
||||||
|
// ❌ ERRADO — transformação manual após validação
|
||||||
|
const produto = zProdutoCriar.parse(dados)
|
||||||
|
produto.nome = produto.nome.trim()
|
||||||
|
produto.codigo = produto.codigo?.toUpperCase()
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8. Composição e Enums Zod
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ✅ Composição de schemas via extend/partial
|
||||||
|
const zEndereco = z.object({ rua: z.string(), cidade: z.string() })
|
||||||
|
const zEmpresaCriar = z.object({ nome: z.string(), endereco: zEndereco })
|
||||||
|
const zEmpresaEditar = zEmpresaCriar.partial()
|
||||||
|
|
||||||
|
// ✅ Enum Zod para valores de domínio
|
||||||
|
export const zStatusLicenca = z.enum(["ativa", "vencida", "suspensa", "cancelada"])
|
||||||
|
export type tipoStatusLicenca = z.infer<typeof zStatusLicenca>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 10. Bibliotecas proibidas para validação
|
||||||
|
|
||||||
|
| ❌ Proibido | Motivo |
|
||||||
|
|-------------|--------|
|
||||||
|
| `joi` | Não infere tipos TS, bundle pesado |
|
||||||
|
| `yup` | Inferência fraca, API menos ergonômica |
|
||||||
|
| `class-validator` | Decorators, não compartilhável com frontend |
|
||||||
|
| `io-ts` | Verboso, curva de aprendizado alta |
|
||||||
|
| `ajv` (direto) | JSON Schema — usar `zod-to-json-schema` se precisar de JSON Schema |
|
||||||
|
| Validação manual com `if/typeof` | Quando Zod resolve o mesmo caso |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Exemplos
|
||||||
|
|
||||||
|
### API backend (Express)
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ✅ Correto
|
||||||
|
import { zUsuarioCriar } from "projeto-comuns/tabelas/usuarios"
|
||||||
|
|
||||||
|
app.post("/usuarios", async (req, res) => {
|
||||||
|
const resultado = zUsuarioCriar.safeParse(req.body)
|
||||||
|
if (!resultado.success) {
|
||||||
|
return res.status(400).json({ erro: resultado.error.issues })
|
||||||
|
}
|
||||||
|
const usuario = await criarUsuario(resultado.data)
|
||||||
|
return res.json(usuario)
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Variáveis de ambiente e Frontend
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ✅ Validar env no boot da aplicação
|
||||||
|
export const ambiente = () => z.object({
|
||||||
|
DATABASE_URL: z.string().url(),
|
||||||
|
NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
||||||
|
}).parse(process.env)
|
||||||
|
|
||||||
|
// ✅ Frontend: usar schema compartilhado antes de enviar
|
||||||
|
const salvar = async () => {
|
||||||
|
const res = zUsuarioCriar.safeParse(formulario.value)
|
||||||
|
if (!res.success) return (erros.value = res.error.flatten().fieldErrors)
|
||||||
|
await api.post("/usuarios", res.data)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
|
||||||
|
Sem esta regra:
|
||||||
|
|
||||||
|
- Cada desenvolvedor escolhe uma estratégia diferente de validação (if/typeof, joi, yup, etc.)
|
||||||
|
- Tipos e schemas ficam dessincronizados — mudança no schema não reflete no tipo e vice-versa
|
||||||
|
- Validações manuais são incompletas e inconsistentes entre endpoints
|
||||||
|
- Código de validação é duplicado entre front e back
|
||||||
|
- Dados inválidos passam despercebidos e corrompem a base
|
||||||
|
|
||||||
|
Com esta regra:
|
||||||
|
|
||||||
|
- Uma única fonte de verdade: o schema Zod
|
||||||
|
- Tipos TypeScript sempre sincronizados via `z.infer<>`
|
||||||
|
- Validação consistente em todos os pontos de entrada
|
||||||
|
- Reutilização entre front, back e workers via pacote `*-comuns`
|
||||||
|
- Erros de validação estruturados e internacionalizáveis
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/typescript-sem-any` (narrowing com Zod mencionado como alternativa)
|
||||||
|
- Skill: `global/skills/criar-schema-zod/SKILL` (guia prático para criar schemas)
|
||||||
118
skills/adicionar-ajuda/SKILL.md
Normal file
118
skills/adicionar-ajuda/SKILL.md
Normal file
|
|
@ -0,0 +1,118 @@
|
||||||
|
---
|
||||||
|
type: workflow
|
||||||
|
name: adicionar-ajuda
|
||||||
|
description: Adicionar ou atualizar botão de ajuda e documentação em telas (Frontend)
|
||||||
|
scope: local
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Workflow: Adicionar Ajuda em Telas
|
||||||
|
|
||||||
|
Este workflow automatiza a inserção do botão de ajuda e a criação do arquivo de documentação correspondente sempre que uma tela é criada ou modificada de forma significativa.
|
||||||
|
|
||||||
|
O objetivo da ajuda é **auxiliar o usuário final a compreender e utilizar corretamente a aplicação**, explicando o funcionamento da tela de forma clara e objetiva.
|
||||||
|
|
||||||
|
## Pré-requisitos
|
||||||
|
|
||||||
|
- O arquivo alvo deve ser um componente de interface (`.tsx` para React ou `.vue` para Vue).
|
||||||
|
- O projeto deve possuir um componente de ajuda (ex: `BotaoAjuda`, `HelpButton` ou equivalente) disponível para uso na interface.
|
||||||
|
- Caso não exista, criar um componente reutilizável que exiba o conteúdo do `.ajuda.md` em modal ou drawer.
|
||||||
|
|
||||||
|
## Passos
|
||||||
|
|
||||||
|
### 1. Identificar o Componente Alvo
|
||||||
|
|
||||||
|
Determine qual arquivo representa a tela principal ou modal que está sendo criado ou editado.
|
||||||
|
|
||||||
|
- React → `.tsx`
|
||||||
|
- Vue → `.vue`
|
||||||
|
|
||||||
|
### 2. Verificar Existência de Ajuda
|
||||||
|
|
||||||
|
Procure por um arquivo de ajuda com o mesmo nome do componente e sufixo indicativo de ajuda (ex.: `.ajuda.md`) localizado na mesma pasta.
|
||||||
|
|
||||||
|
Exemplo:
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
TelaCadastroUsuario.tsx
|
||||||
|
TelaCadastroUsuario.ajuda.md
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
ou
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
TelaCadastroUsuario.vue
|
||||||
|
TelaCadastroUsuario.ajuda.md
|
||||||
|
|
||||||
|
````
|
||||||
|
|
||||||
|
### 3. Criar ou Atualizar o Arquivo Markdown
|
||||||
|
|
||||||
|
Se o arquivo `.ajuda.md` não existir, crie-o utilizando o template básico abaixo.
|
||||||
|
|
||||||
|
O conteúdo deve ser escrito **pensando no usuário final**, explicando de forma simples como utilizar a tela.
|
||||||
|
|
||||||
|
A documentação deve incluir, quando aplicável:
|
||||||
|
|
||||||
|
- **Objetivo da tela**
|
||||||
|
- **Descrição dos botões**
|
||||||
|
- **Descrição dos campos de formulário**
|
||||||
|
- **Regras de preenchimento e validações**
|
||||||
|
- **Fluxo esperado de uso**
|
||||||
|
- **Contexto técnico ou legal**, quando relevante para o entendimento da funcionalidade
|
||||||
|
|
||||||
|
Template inicial:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Ajuda: [Nome da Tela]
|
||||||
|
|
||||||
|
## Objetivo da Tela
|
||||||
|
|
||||||
|
Explique de forma simples para que serve esta tela dentro do sistema.
|
||||||
|
|
||||||
|
## Botões
|
||||||
|
|
||||||
|
- **Salvar**: grava as informações preenchidas.
|
||||||
|
- **Cancelar**: descarta as alterações realizadas.
|
||||||
|
- **Excluir**: remove o registro atual do sistema.
|
||||||
|
|
||||||
|
## Campos do Formulário
|
||||||
|
|
||||||
|
- **Nome**: informe o nome completo do responsável.
|
||||||
|
- **Data de Vistoria**: data em que a vistoria foi realizada.
|
||||||
|
- **Observações**: campo livre para registrar informações adicionais.
|
||||||
|
|
||||||
|
## Fluxo de Uso
|
||||||
|
|
||||||
|
1. Preencha os campos obrigatórios.
|
||||||
|
2. Revise as informações inseridas.
|
||||||
|
3. Clique em **Salvar** para registrar os dados no sistema.
|
||||||
|
|
||||||
|
## Informações Técnicas ou Legais (quando aplicável)
|
||||||
|
|
||||||
|
Explique regras técnicas, normas ou exigências legais relacionadas à funcionalidade da tela.
|
||||||
|
````
|
||||||
|
|
||||||
|
### 4. Posicionamento do Botão de Ajuda
|
||||||
|
|
||||||
|
O botão deve ser inserido de forma consistente e não pode interferir na interface da aplicação.
|
||||||
|
|
||||||
|
#### Telas / Páginas
|
||||||
|
|
||||||
|
* O botão deve ficar na **parte inferior esquerda da página**.
|
||||||
|
* Deve respeitar espaçamento suficiente das bordas da interface.
|
||||||
|
* **Não pode sobrepor nenhum componente da tela.**
|
||||||
|
* **Não pode ficar oculto ou sobreposto pela barra de módulos da aplicação.**
|
||||||
|
* Ajustar `margin`, `padding` ou `z-index` quando necessário para garantir visibilidade adequada.
|
||||||
|
|
||||||
|
#### Modais e Diálogos
|
||||||
|
|
||||||
|
* O botão deve ficar na **parte inferior esquerda do modal**.
|
||||||
|
* Preferencialmente no rodapé do modal ou em um container equivalente.
|
||||||
|
* **Não pode sobrepor botões ou ações do modal.**
|
||||||
|
* Garantir espaçamento adequado para não interferir na usabilidade.
|
||||||
|
|
||||||
|
|
||||||
235
skills/aprimora-ia/SKILL.md
Normal file
235
skills/aprimora-ia/SKILL.md
Normal file
|
|
@ -0,0 +1,235 @@
|
||||||
|
---
|
||||||
|
type: workflow
|
||||||
|
name: aprimora-ia
|
||||||
|
description: Otimizar o ecossistema da IA conforme identificado durante a conversa e registrar eventos na memória
|
||||||
|
scope: global
|
||||||
|
updatedAt: "2026-08-10"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Workflow: /aprimora-ia (Aprimoramento Contínuo e Registro de Memória)
|
||||||
|
|
||||||
|
## 🎯 Objetivo
|
||||||
|
|
||||||
|
Analisar os aprendizados, alterações e decisões tomadas ao longo da conversa, aplicando as devidas otimizações diretamente nos artefatos do ecossistema (Rules, Workflows, Skills e Personas).
|
||||||
|
|
||||||
|
Este workflow é **obrigatório** e deve ser executado sempre que houver qualquer definição nova.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Artefatos de Conhecimento
|
||||||
|
|
||||||
|
O conhecimento do agente está organizado em **três tipos de artefatos**, cada um com responsabilidade distinta:
|
||||||
|
|
||||||
|
| Artefato | Diretório (herdado) | Diretório (local) | Responsabilidade |
|
||||||
|
|----------|---------------------|-------------------|------------------|
|
||||||
|
| **Rules** | `.agent/base/global/rules/` | `.agent/local/rules/` | Restrições e convenções que o agente **deve respeitar sempre** |
|
||||||
|
| **Workflows** | `.agent/base/global/workflows/` | `.agent/local/workflows/` | Processos sequenciais com passos numerados para tarefas bem definidas |
|
||||||
|
| **Skills** | `.agent/base/global/skills/` | `.agent/local/skills/` | Guias operacionais completos e reutilizáveis para tarefas complexas recorrentes |
|
||||||
|
| **Memória do Projeto** | — | `./.memoria-ia/` | Decisões de negócio, contexto do produto, especificações e ADRs (raiz do pai, versionado pelo pai) |
|
||||||
|
| **Evoluções da IA** | `.agent/memory/` | — | Relatórios de sessões `/aprimora-ia`, otimizações dos agentes e melhorias da IA (versionado pelo submódulo) |
|
||||||
|
|
||||||
|
### Diferenças entre os artefatos
|
||||||
|
|
||||||
|
| Critério | Rule | Workflow | Skill | Memória |
|
||||||
|
|----------|------|----------|-------|---------|
|
||||||
|
| **Formato** | Regra declarativa | Passos sequenciais | Guia prático com templates | Diários, ADRs, documentação de contexto puro |
|
||||||
|
| **Quando usar** | Aplicada **automaticamente** em todo contexto | Acionado por **comando** (`/workflow`) | Consultado **sob demanda** ao iniciar tarefa complexa | Consultado **para restaurar contexto** e entender escopo |
|
||||||
|
| **Exemplos** | "Nunca usar `any`" | "/migracao_banco" | "Criar função api2 end-to-end" | "ADR de transição para Nuxt 4", "Dicionário de dados" |
|
||||||
|
| **Escopo** | Restrição transversal | Processo pontual | Padrão operacional completo | Registro histórico e base factual |
|
||||||
|
|
||||||
|
### Regra de escolha
|
||||||
|
|
||||||
|
- Se é uma **restrição** que vale sempre → **Rule**
|
||||||
|
- Se é um **processo com etapas** que o usuário aciona → **Workflow**
|
||||||
|
- Se é um **guia operacional** com templates e checklist para tarefas complexas → **Skill**
|
||||||
|
- Se o conteúdo serve como **referência cruzada** durante tarefas → **Skill**
|
||||||
|
- Se é um **registro de estado, decisão técnica importante ou compreensão do domínio temporal** → **Memória**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1️⃣ Análise do Contexto Atual (Obrigatória)
|
||||||
|
|
||||||
|
É obrigatório:
|
||||||
|
|
||||||
|
- Revisar integralmente a conversa atual.
|
||||||
|
- Identificar:
|
||||||
|
- Regras de negócio novas ou alteradas.
|
||||||
|
- Padrões técnicos definidos.
|
||||||
|
- Convenções estabelecidas.
|
||||||
|
- Decisões arquiteturais.
|
||||||
|
- Ajustes de comportamento do sistema ou do agente.
|
||||||
|
|
||||||
|
Para cada item identificado, classificar obrigatoriamente:
|
||||||
|
|
||||||
|
- Já existe artefato correspondente (rule, workflow ou skill) → **ATUALIZAR**
|
||||||
|
- Existe parcialmente → **REFATORAR**
|
||||||
|
- Não existe → **CRIAR**
|
||||||
|
- Impacta múltiplas áreas → **PROPAGAR**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2️⃣ Atualização das Rules (Obrigatória)
|
||||||
|
|
||||||
|
### Regras inegociáveis:
|
||||||
|
|
||||||
|
- Toda nova regra **DEVE** ser registrada.
|
||||||
|
- Nenhuma regra pode existir apenas na conversa.
|
||||||
|
- É **PROIBIDO** deixar conhecimento implícito.
|
||||||
|
|
||||||
|
### Estrutura obrigatória:
|
||||||
|
|
||||||
|
- Um arquivo = um único assunto.
|
||||||
|
- Nome claro em `kebab-case`.
|
||||||
|
- Limite máximo: ~10.000 caracteres.
|
||||||
|
|
||||||
|
### É obrigatório:
|
||||||
|
|
||||||
|
- Evitar duplicação de conteúdo.
|
||||||
|
- Atualizar regras antigas quando substituídas.
|
||||||
|
- Remover ou ajustar regras conflitantes.
|
||||||
|
- Garantir consistência semântica entre arquivos.
|
||||||
|
|
||||||
|
### Estrutura obrigatória da rule:
|
||||||
|
|
||||||
|
```md
|
||||||
|
# Nome da Regra
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
Quando se aplica.
|
||||||
|
|
||||||
|
## Regra
|
||||||
|
Definição objetiva e obrigatória.
|
||||||
|
|
||||||
|
## Exemplos
|
||||||
|
✅ Correto
|
||||||
|
❌ Incorreto
|
||||||
|
|
||||||
|
## Impacto
|
||||||
|
Problema que evita.
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3️⃣ Atualização dos Workflows (Obrigatória quando aplicável)
|
||||||
|
|
||||||
|
Sempre que houver processo repetível identificado:
|
||||||
|
|
||||||
|
* Criar ou atualizar workflow em `.agent/local/workflows/`.
|
||||||
|
|
||||||
|
### Obrigatório:
|
||||||
|
|
||||||
|
* Frontmatter com `description`.
|
||||||
|
* Passos numerados.
|
||||||
|
* Clareza operacional (sem ambiguidade).
|
||||||
|
* Comandos executáveis quando possível.
|
||||||
|
* Uso de `// turbo` para comandos seguros.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4️⃣ Atualização das Skills (Obrigatória quando aplicável)
|
||||||
|
|
||||||
|
Sempre que um padrão operacional complexo for definido, refinado ou corrigido:
|
||||||
|
|
||||||
|
* Criar ou atualizar skill em `.agent/local/skills/<nome-da-skill>/SKILL`.
|
||||||
|
|
||||||
|
### Quando atualizar uma skill:
|
||||||
|
|
||||||
|
- Nova regra afeta o padrão operacional descrito na skill (ex: nova convenção de tipagem afeta `criar-funcao-api2`)
|
||||||
|
- Novo workflow introduz etapas que complementam ou substituem uma skill
|
||||||
|
- Um erro recorrente revela que a skill está incompleta ou desatualizada
|
||||||
|
- Uma decisão arquitetural muda o fluxo descrito na skill
|
||||||
|
|
||||||
|
### Estrutura obrigatória da skill:
|
||||||
|
|
||||||
|
```md
|
||||||
|
---
|
||||||
|
name: nome-da-skill
|
||||||
|
description: >
|
||||||
|
Descrição em uma linha do que a skill faz.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Nome Descritivo
|
||||||
|
|
||||||
|
Parágrafo de contexto explicando quando usar.
|
||||||
|
|
||||||
|
## PASSO N — Título do Passo
|
||||||
|
Instruções com código, regras e padrões.
|
||||||
|
|
||||||
|
## Checklist Final
|
||||||
|
- [ ] Item de verificação
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
- Regras: `.agent/local/rules/xxx`
|
||||||
|
- Workflow: `.agent/local/workflows/xxx`
|
||||||
|
```
|
||||||
|
|
||||||
|
### Regras de organização:
|
||||||
|
|
||||||
|
- Uma skill por diretório: `.agent/local/skills/<nome>/SKILL`
|
||||||
|
- Skills globais são identificadas pelo campo `scope: global` no frontmatter
|
||||||
|
- Nome do diretório em `kebab-case`
|
||||||
|
- A skill **não deve duplicar** conteúdo de rules — referencia-as via seção `Referências`
|
||||||
|
- A skill **pode consolidar** conhecimento de múltiplas rules e workflows em um guia unificado
|
||||||
|
- Templates de código devem estar na própria skill (não em arquivos separados, a menos que sejam muito grandes)
|
||||||
|
|
||||||
|
- Skills globais residem em `global/skills/`
|
||||||
|
- Skills específicas do projeto residem em `.agent/local/skills/<nome>/SKILL`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5️⃣ Revisão de Impacto (Dirigida por Grafo)
|
||||||
|
|
||||||
|
Quando um artefato é alterado, a revisão deve ser **dirigida**, não exaustiva.
|
||||||
|
|
||||||
|
### Processo:
|
||||||
|
|
||||||
|
1. Identificar o artefato alterado
|
||||||
|
2. Consultar a seção `Referências` do artefato para encontrar dependentes diretos
|
||||||
|
3. Verificar consistência APENAS entre o artefato alterado e seus dependentes
|
||||||
|
4. Se uma inconsistência for encontrada, propagar para o próximo nível
|
||||||
|
|
||||||
|
### Regras de escopo:
|
||||||
|
|
||||||
|
| Se alterou... | Revisar... |
|
||||||
|
|---|---|
|
||||||
|
| Uma **Rule** | Workflows e skills que a **referenciam** |
|
||||||
|
| Um **Workflow** | Skills que o **referenciam** |
|
||||||
|
| Uma **Skill** | Rules e workflows na seção Referências |
|
||||||
|
| **Memória/ADR** | Nada — memória é registro, não dependência |
|
||||||
|
|
||||||
|
### É PROIBIDO:
|
||||||
|
|
||||||
|
* Revisar artefatos **sem relação** com a mudança
|
||||||
|
* Afirmar que "tudo foi revisado" sem listar quais artefatos foram verificados
|
||||||
|
* Criar artefatos sem verificar se já existe um com o mesmo escopo
|
||||||
|
|
||||||
|
### A revisão DEVE verificar:
|
||||||
|
|
||||||
|
* Não existem regras conflitantes entre o artefato alterado e seus dependentes
|
||||||
|
* Referências cruzadas continuam válidas (arquivos existem, nomes corretos)
|
||||||
|
* Skills refletem fielmente as rules que referenciam
|
||||||
|
* Não há duplicação de conteúdo entre artefatos
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7⃣ Verificação Final (Checklist obrigatório)
|
||||||
|
|
||||||
|
Só é permitido encerrar se TODOS forem verdadeiros:
|
||||||
|
|
||||||
|
* [ ] Artefatos dependentes do alterado foram revisados
|
||||||
|
* [ ] Não existe conflito entre artefatos revisados
|
||||||
|
* [ ] Não existe duplicação de conteúdo
|
||||||
|
* [ ] Nenhuma regra ficou implícita
|
||||||
|
* [ ] Referências cruzadas estão válidas
|
||||||
|
* [ ] Estrutura está organizada por assunto
|
||||||
|
* [ ] Skills referenciam (não duplicam) rules
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ Regra Suprema
|
||||||
|
|
||||||
|
> Se existir qualquer dúvida, conflito ou inconsistência
|
||||||
|
> entre o artefato alterado e seus dependentes,
|
||||||
|
> o trabalho é considerado **INCOMPLETO**.
|
||||||
|
|
||||||
|
A revisão é dirigida, não opcional.
|
||||||
89
skills/auditar-arquitetura-modulo/SKILL.md
Normal file
89
skills/auditar-arquitetura-modulo/SKILL.md
Normal file
|
|
@ -0,0 +1,89 @@
|
||||||
|
---
|
||||||
|
name: auditar-arquitetura-modulo
|
||||||
|
description: >
|
||||||
|
Auditoria arquitetural de módulo: fronteiras, acoplamento, dependências
|
||||||
|
circulares, contratos de API e dívidas técnicas.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Auditar Arquitetura de Módulo
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Avaliar a saúde arquitetural de um módulo antes de propor mudanças estruturais.
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Verificar Fronteiras de Pacote
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Detectar imports que cruzam fronteiras
|
||||||
|
rg "from.*-back" --include='*.ts' --include='*.vue' <modulo>-front/src/ -n
|
||||||
|
rg "from.*-front" --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
|
||||||
|
# Verificar imports entre módulos diferentes
|
||||||
|
rg "from.*<outro-modulo>" --include='*.ts' <modulo>/ -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Verificar Acoplamento
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Contar imports por arquivo (alto = muito acoplado)
|
||||||
|
fd "*.ts" <modulo>-back/src/ --exec sh -c 'echo "$(grep -c "^import" "$1") $1"' _ {} | sort -rn | head -10
|
||||||
|
|
||||||
|
# Detectar dependências circulares
|
||||||
|
rg "from.*\.\/" --include='*.ts' <modulo>/src/ -l | head -20
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Verificar Contratos de API
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar rotas e seus schemas de validação
|
||||||
|
rg "router\.(get|post|put|patch|delete)" --include='*.ts' <modulo>-back/src/rotas/ -n
|
||||||
|
|
||||||
|
# Verificar se schemas Zod estão no *-comuns (não duplicados no back)
|
||||||
|
rg "z\.object" --include='*.ts' <modulo>-back/src/ -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Avaliar Dívida Técnica
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Buscar marcadores de dívida
|
||||||
|
rg "TODO|FIXME|HACK|WORKAROUND|DEBT|TEMP" --include='*.ts' --include='*.vue' <modulo>/ -n
|
||||||
|
|
||||||
|
# Verificar limite de linhas
|
||||||
|
fd "*.ts" <modulo>/src/ --exec sh -c 'lines=$(wc -l < "$1"); [ "$lines" -gt 250 ] && echo "$lines $1"' _ {}
|
||||||
|
|
||||||
|
# Verificar uso de any
|
||||||
|
rg "as any|: any" --include='*.ts' <modulo>/ -c
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Relatório
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Auditoria Arquitetural — [módulo]
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
- **Violações de fronteira:** N
|
||||||
|
- **Arquivos com acoplamento alto (>10 imports):** N
|
||||||
|
- **Dívidas técnicas (TODO/FIXME):** N
|
||||||
|
- **Arquivos acima de 250 linhas:** N
|
||||||
|
|
||||||
|
## Achados
|
||||||
|
### 🔴 Crítico
|
||||||
|
| Tipo | Arquivo | Problema | Ação |
|
||||||
|
|------|---------|----------|------|
|
||||||
|
|
||||||
|
### 🟡 Moderado
|
||||||
|
| Tipo | Arquivo | Problema | Ação |
|
||||||
|
|------|---------|----------|------|
|
||||||
|
|
||||||
|
## Plano de Ação
|
||||||
|
1. ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Rule: `global/rules/fronteiras-monorepo`
|
||||||
|
- Skill: `global/skills/mapear-codigo-fonte/SKILL`
|
||||||
63
skills/auditar-ux-heuristicas/SKILL.md
Normal file
63
skills/auditar-ux-heuristicas/SKILL.md
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
---
|
||||||
|
name: auditar-ux-heuristicas
|
||||||
|
description: >
|
||||||
|
Auditoria de UX baseada em heurísticas de Nielsen e verificação de estados de UI.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Auditar UX por Heurísticas
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Avaliar UX de tela ou fluxo antes de propor mudanças.
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Heurísticas de Nielsen
|
||||||
|
|
||||||
|
| # | Heurística | Pergunta |
|
||||||
|
|---|-----------|----------|
|
||||||
|
| 1 | Visibilidade do status | Sistema informa o que acontece? |
|
||||||
|
| 2 | Compatibilidade | Mensagens usam linguagem do domínio? |
|
||||||
|
| 3 | Controle e liberdade | Pode desfazer, voltar, cancelar? |
|
||||||
|
| 4 | Consistência | Mesmos conceitos, mesma aparência? |
|
||||||
|
| 5 | Prevenção de erros | Campos obrigatórios claros? Confirmação em ações destrutivas? |
|
||||||
|
| 6 | Reconhecimento > Lembrança | Labels descritivos? |
|
||||||
|
| 7 | Flexibilidade | Ações frequentes acessíveis? |
|
||||||
|
| 8 | Estética minimalista | Info desnecessária? |
|
||||||
|
| 9 | Recuperação de erros | Mensagens orientam correção? |
|
||||||
|
| 10 | Ajuda | Ajuda contextual disponível? |
|
||||||
|
|
||||||
|
### 2. Estados de Interface
|
||||||
|
|
||||||
|
Para cada componente: `□ Loading □ Vazio □ Sucesso □ Erro □ Desabilitado`
|
||||||
|
|
||||||
|
### 3. Acessibilidade Básica
|
||||||
|
|
||||||
|
```sh
|
||||||
|
rg "<img" --include='*.vue' <modulo>-front/src/ -n | grep -v "alt="
|
||||||
|
rg "<v-btn\|<button" --include='*.vue' <modulo>-front/src/ -n | grep -v "aria-label\|title"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Relatório
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Auditoria UX — [tela/fluxo]
|
||||||
|
|
||||||
|
## Achados por Heurística
|
||||||
|
| # | Heurística | Status | Problema | Recomendação |
|
||||||
|
|---|-----------|--------|----------|--------------|
|
||||||
|
|
||||||
|
## Estados de Interface
|
||||||
|
| Componente | Loading | Vazio | Erro | Sucesso |
|
||||||
|
|------------|---------|-------|------|---------|
|
||||||
|
|
||||||
|
## Plano de Melhoria
|
||||||
|
1. ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Rule: `global/rules/mensagens-usuario`
|
||||||
|
- Rule: `global/rules/feedback-visivel`
|
||||||
144
skills/comercial/SKILL.md
Normal file
144
skills/comercial/SKILL.md
Normal file
|
|
@ -0,0 +1,144 @@
|
||||||
|
---
|
||||||
|
type: workflow
|
||||||
|
name: comercial
|
||||||
|
description: Criar uma descrição comercial das funcionalidades e do sistema
|
||||||
|
scope: local
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Workflow: Criar Descrição Comercial
|
||||||
|
|
||||||
|
Este workflow gera uma descrição comercial de funcionalidades ou do sistema completo, escrita na pasta `./COMERCIAL/`. Cada módulo ou funcionalidade gera um arquivo separado com o padrão `./COMERCIAL/<nome-do-modulo>.md`.
|
||||||
|
|
||||||
|
É **OBRIGATÓRIO** seguir a regra global de Escrita Natural (`escrita-natural`) em toda produção textual deste workflow.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Passos
|
||||||
|
|
||||||
|
### 1. Identificar as funcionalidades solicitadas
|
||||||
|
|
||||||
|
Perguntar ao usuário quais módulos ou funcionalidades devem ser descritos. Se o pedido for genérico ("descreva o sistema"), listar os módulos principais do projeto e confirmar o escopo antes de redigir.
|
||||||
|
|
||||||
|
### 2. Levantar contexto real de cada funcionalidade
|
||||||
|
|
||||||
|
Antes de escrever, ler o código-fonte e os componentes relacionados para entender:
|
||||||
|
|
||||||
|
- Qual **problema real** a funcionalidade resolve?
|
||||||
|
- Quem são os **usuários diretos**? (consultor ambiental, gestor ambiental, gestor público, técnico de campo)
|
||||||
|
- Qual é o **fluxo de uso** no dia a dia?
|
||||||
|
- Quais **dificuldades operacionais** existiam antes da solução?
|
||||||
|
|
||||||
|
### 3. Redigir a descrição comercial
|
||||||
|
|
||||||
|
Para cada funcionalidade, produzir **dois blocos de texto** no arquivo `./COMERCIAL/<nome-do-modulo>.md`:
|
||||||
|
|
||||||
|
#### Bloco A — Descrição Resumida (2 a 4 linhas)
|
||||||
|
|
||||||
|
Texto curto que pode ser usado em páginas de divulgação, apresentações rápidas ou materiais institucionais.
|
||||||
|
|
||||||
|
Estrutura obrigatória:
|
||||||
|
- **Linha 1**: o problema/dificuldade que existe sem a solução
|
||||||
|
- **Linha 2-3**: como funciona na prática (ação do usuário, sem termos técnicos de TI)
|
||||||
|
- **Linha 4**: o impacto concreto (ganho mensurável)
|
||||||
|
|
||||||
|
*Exemplo:*
|
||||||
|
> Sem controle digital, registros de campo ficam em cadernos e planilhas isoladas — sujeitos a perda e erro de transcrição.
|
||||||
|
> Com a solução, o técnico registra os dados direto no celular, mesmo sem internet, com validação automática.
|
||||||
|
> Isso elimina falhas de preenchimento e garante rastreabilidade completa para auditorias.
|
||||||
|
|
||||||
|
#### Bloco B — Descrição Detalhada
|
||||||
|
|
||||||
|
Texto mais completo (5 a 15 linhas) que aprofunda o funcionamento e os diferenciais. Deve incluir:
|
||||||
|
|
||||||
|
- Cenário de uso realista (quem faz o quê, quando e onde)
|
||||||
|
- Recursos técnicos relevantes explicados de forma acessível (offline, sincronização, alertas automáticos)
|
||||||
|
- Benefícios encadeados (causa → efeito)
|
||||||
|
- **Implicações legais ou normativas** (quando aplicável): se a funcionalidade tem relação com legislação, normas regulatórias ou resoluções de órgãos competentes, **citar expressamente** a norma ou obrigação legal. Isso fortalece o argumento comercial e demonstra que a solução atende requisitos reais de conformidade.
|
||||||
|
|
||||||
|
> **Regra de siglas**: toda sigla usada pela primeira vez no texto deve vir acompanhada do nome por extenso. Exemplo: "ANA (Agência Nacional de Águas e Saneamento Básico)". Nas ocorrências seguintes, pode-se usar apenas a sigla.
|
||||||
|
|
||||||
|
### 4. Revisar contra o checklist de qualidade
|
||||||
|
|
||||||
|
Antes de entregar, validar **cada bloco** contra as restrições abaixo:
|
||||||
|
|
||||||
|
- [ ] O texto do Resumo começa pelo problema, não pela funcionalidade?
|
||||||
|
- [ ] Há pelo menos um cenário de uso prático (quem, onde, como)?
|
||||||
|
- [ ] Os parágrafos são curtos (2 a 4 linhas) com uma ideia principal cada?
|
||||||
|
- [ ] A linguagem soa como alguém que vive o problema, não como manual de software?
|
||||||
|
- [ ] Está **LIVRE** de jargões de TI e termos em inglês sem tradução?
|
||||||
|
- [ ] Toda **sigla** está acompanhada do nome por extenso na primeira ocorrência?
|
||||||
|
- [ ] Está **LIVRE** de termos vazios ("Inovador", "Eficiente", "Solução completa", "O presente projeto")?
|
||||||
|
- [ ] Está **LIVRE** do padrão repetitivo "O sistema permite / A funcionalidade permite / A ferramenta permite"?
|
||||||
|
- [ ] As frases variam de estrutura? (alternando "Na prática...", "Com isso...", "Isso reduz...", "Como resultado...")
|
||||||
|
- [ ] Quando há implicação legal ou normativa, a norma/lei/resolução está **citada e destacada** no texto?
|
||||||
|
- [ ] O texto é compreensível pelo **público-alvo do produto** sem conhecimento de TI?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Público-Alvo
|
||||||
|
|
||||||
|
Todo texto produzido por este workflow deve ser compreensível pelo **público-alvo do produto**. O agente deve identificar quem são os usuários e decisores com base no contexto do projeto.
|
||||||
|
|
||||||
|
Regra geral: nenhum dos perfis-alvo tem obrigação de conhecer termos de tecnologia. A linguagem deve ser **acessível, direta e sem jargões de TI**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Regras de Tom e Vocabulário
|
||||||
|
|
||||||
|
| ✅ Usar | ❌ Evitar |
|
||||||
|
|---|---|
|
||||||
|
| "Na prática, o técnico..." | "O sistema permite..." |
|
||||||
|
| "Com isso, a equipe..." | "A solução inovadora..." |
|
||||||
|
| "Isso elimina..." | "O presente projeto visa..." |
|
||||||
|
| "Como resultado..." | "Dessa forma..." |
|
||||||
|
| "Sem a solução, o gestor precisa..." | "A ferramenta oferece..." |
|
||||||
|
| "Entregamos controle sobre..." | "Nossa solução oferece..." |
|
||||||
|
| "O gestor ganha visibilidade de..." | "A plataforma disponibiliza..." |
|
||||||
|
| "página de divulgação" | "landing page" |
|
||||||
|
| "frase de abertura" | "hook" |
|
||||||
|
| "chamada para ação" | "CTA" (isolado, sem explicação) |
|
||||||
|
| "texto persuasivo" | "copywriting" |
|
||||||
|
| "linha do tempo, publicações" | "feed" |
|
||||||
|
|
||||||
|
**Tom geral**: profissional, direto, sem burocracia institucional. O texto deve parecer escrito por quem constrói a solução e entende a operação do dia a dia do cliente.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Formato de Saída
|
||||||
|
|
||||||
|
Cada módulo ou funcionalidade deve gerar **um arquivo próprio** dentro da pasta `./COMERCIAL/`.
|
||||||
|
|
||||||
|
**Regra de nomeação do arquivo:**
|
||||||
|
- Usar o nome do módulo em **kebab-case** (minúsculo, separado por hifens)
|
||||||
|
|
||||||
|
O arquivo `./COMERCIAL/<nome-do-modulo>.md` deve seguir esta estrutura:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# [Nome do Módulo]
|
||||||
|
|
||||||
|
## [Nome da Sub-funcionalidade]
|
||||||
|
|
||||||
|
### Resumo
|
||||||
|
|
||||||
|
[Bloco A — 2 a 4 linhas: problema → solução → impacto]
|
||||||
|
|
||||||
|
### Detalhamento
|
||||||
|
|
||||||
|
[Bloco B — 5 a 15 linhas: cenário real + técnico acessível + legal]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [Próxima Sub-funcionalidade]
|
||||||
|
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/escrita-natural` (padrão obrigatório de redação)
|
||||||
|
- Workflow: `agents/comercial/workflows/orcamento` (texto para documentos de orçamento e proposta — apresentação + lista de funcionalidades)
|
||||||
|
- Workflow: `agents/comercial/workflows/marketing` (peças de marketing digital — LinkedIn, Instagram, WhatsApp, E-mail)
|
||||||
|
- Workflow: `global/workflows/otimizar-codigos` (para documentação técnica, não comercial)
|
||||||
189
skills/criar-fluxograma/SKILL.md
Normal file
189
skills/criar-fluxograma/SKILL.md
Normal file
|
|
@ -0,0 +1,189 @@
|
||||||
|
---
|
||||||
|
type: workflow
|
||||||
|
name: criar-fluxograma
|
||||||
|
description: Criar ou atualizar uma página de fluxograma interativo em qualquer sistema
|
||||||
|
scope: local
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Workflow: Criar Fluxograma de Decisões
|
||||||
|
|
||||||
|
Este workflow cria uma **página interativa de fluxograma** em qualquer aplicação web, usando Mermaid.js instalado como dependência do projeto.
|
||||||
|
|
||||||
|
## Princípio
|
||||||
|
|
||||||
|
O fluxograma é um artefato vivo. Ele documenta visualmente:
|
||||||
|
- Os **pontos de entrada** do processo
|
||||||
|
- As **decisões** tomadas em cada etapa
|
||||||
|
- Os **registros gerados** (banco, fila, log, e-mail, etc.)
|
||||||
|
- As **proteções e regras** que governam os estados
|
||||||
|
|
||||||
|
Deve ser mantido sempre sincronizado com o código real.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Passos
|
||||||
|
|
||||||
|
### 1. Levantar o processo a ser documentado
|
||||||
|
|
||||||
|
Ler os arquivos de código relevantes para entender:
|
||||||
|
|
||||||
|
- Quais são os **pontos de entrada**? (funções de API, eventos, webhooks, ações do usuário)
|
||||||
|
- Quais são as **decisões**? (condições `if/else`, guards, validações)
|
||||||
|
- Quais são os **efeitos colaterais**? (gravações em banco, envios de e-mail, filas, logs)
|
||||||
|
- Quais são os **estados possíveis**? (status, notas, flags, etapas)
|
||||||
|
- Existe **hierarquia ou prioridade** entre estados?
|
||||||
|
|
||||||
|
### 2. Organizar os diagramas
|
||||||
|
|
||||||
|
Dividir o processo em **um diagrama por ponto de entrada**.
|
||||||
|
|
||||||
|
Cada diagrama deve mostrar:
|
||||||
|
- Todos os caminhos possíveis, inclusive early returns e casos de erro
|
||||||
|
- Registros gerados com ícone indicativo (ex: 🗄️ banco, 📧 e-mail, 🚫 bloqueio)
|
||||||
|
- Decisões claramente separadas por ramificações
|
||||||
|
|
||||||
|
Definir a orientação de cada diagrama:
|
||||||
|
- `flowchart TD` → vertical (melhor para fluxos sequenciais com poucas ramificações)
|
||||||
|
- `flowchart LR` → horizontal (melhor para pipelines e fluxos com muitas etapas em linha)
|
||||||
|
|
||||||
|
### 3. Instalar o Mermaid
|
||||||
|
|
||||||
|
Instalar como dependência do projeto antes de qualquer implementação:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# npm
|
||||||
|
npm install mermaid
|
||||||
|
|
||||||
|
# pnpm
|
||||||
|
pnpm add mermaid
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Criar a página com Mermaid
|
||||||
|
|
||||||
|
Adaptar à plataforma do projeto (Vue, React, HTML puro, etc.), mas garantir:
|
||||||
|
|
||||||
|
#### Importação
|
||||||
|
|
||||||
|
```js
|
||||||
|
import mermaid from 'mermaid';
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Inicialização com tema institucional
|
||||||
|
|
||||||
|
Adaptar as cores para a identidade visual do projeto:
|
||||||
|
|
||||||
|
```js
|
||||||
|
mermaid.initialize({
|
||||||
|
startOnLoad: false,
|
||||||
|
theme: 'base',
|
||||||
|
themeVariables: {
|
||||||
|
primaryColor: '#4F46E5', // cor primária do projeto
|
||||||
|
primaryTextColor: '#1F2933',
|
||||||
|
primaryBorderColor: '#3730A3', // variação mais escura da primária
|
||||||
|
lineColor: '#6B7280',
|
||||||
|
secondaryColor: '#E0E7FF', // variação clara da primária
|
||||||
|
tertiaryColor: '#F3F4F6',
|
||||||
|
fontFamily: "'Inter', 'Segoe UI', sans-serif",
|
||||||
|
fontSize: '13px',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Renderização de cada diagrama
|
||||||
|
|
||||||
|
```js
|
||||||
|
// Para cada diagrama:
|
||||||
|
const { svg } = await mermaid.render(`id-unico-${idx}`, codigoMermaid);
|
||||||
|
container.innerHTML = svg;
|
||||||
|
|
||||||
|
// Tornar o SVG responsivo:
|
||||||
|
const svgEl = container.querySelector('svg');
|
||||||
|
if (svgEl) {
|
||||||
|
svgEl.style.width = '100%';
|
||||||
|
svgEl.style.height = 'auto';
|
||||||
|
svgEl.removeAttribute('width');
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Registrar a rota e adicionar acesso
|
||||||
|
|
||||||
|
- Registrar a rota `/fluxograma` (ou equivalente) no sistema de rotas do projeto
|
||||||
|
- Adicionar botão de navegação na tela de administração ou dashboard
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Padrão de sintaxe Mermaid
|
||||||
|
|
||||||
|
### Tipos de nó por semântica
|
||||||
|
|
||||||
|
| Situação | Sintaxe | Exemplo |
|
||||||
|
|---|---|---|
|
||||||
|
| Início / Fim | `A(["Texto"])` | `A(["Início"])` |
|
||||||
|
| Decisão | `B{"Condição?"}` | `B{"Nota é ativa?"}` |
|
||||||
|
| Ação / Processo | `C["Texto"]` | `C["Consulta banco"]` |
|
||||||
|
| Registro em banco | `D[("🗄️ Grava dado")]` | `D[("🗄️ Grava 203_neutro")]` |
|
||||||
|
| E-mail / notificação | `E["📧 Envia e-mail"]` | `E["📧 Agenda na fila"]` |
|
||||||
|
| Bloqueio / guard | `F["🚫 Retorna sem ação"]` | `F["🚫 Nota ativa, ignora"]` |
|
||||||
|
| Proteção / regra | `G["🛡️ Regra aplicada"]` | `G["🛡️ SQL CASE protege"]` |
|
||||||
|
|
||||||
|
### Regras para evitar erros de parsing
|
||||||
|
|
||||||
|
```
|
||||||
|
✅ Nós com parênteses → usar aspas:
|
||||||
|
A["Texto (com parênteses)"]
|
||||||
|
|
||||||
|
✅ Labels de arestas com texto especial → usar aspas:
|
||||||
|
A -- "Label aqui" --> B
|
||||||
|
|
||||||
|
✅ Emojis → sempre dentro de aspas:
|
||||||
|
A["🗄️ Grava registro"]
|
||||||
|
|
||||||
|
❌ Não usar < > dentro de labels sem aspas
|
||||||
|
❌ Não usar & diretamente — usar texto alternativo
|
||||||
|
```
|
||||||
|
|
||||||
|
### Cores de destaque para nós
|
||||||
|
|
||||||
|
```
|
||||||
|
style NomeNo fill:#22C55E,color:#fff → verde sucesso
|
||||||
|
style NomeNo fill:#DC2626,color:#fff → vermelho erro
|
||||||
|
style NomeNo fill:#F59E0B,color:#000 → amarelo alerta
|
||||||
|
style NomeNo fill:#4F46E5,color:#fff → cor institucional (adaptar ao projeto)
|
||||||
|
style NomeNo fill:#6B7280,color:#fff → cinza neutro
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Validação antes de finalizar
|
||||||
|
|
||||||
|
- [ ] Cada ponto de entrada tem seu próprio diagrama?
|
||||||
|
- [ ] Todos os registros gerados estão mapeados?
|
||||||
|
- [ ] Os caminhos de bloqueio e early return estão visíveis?
|
||||||
|
- [ ] A hierarquia de estados (se existir) está documentada?
|
||||||
|
- [ ] A data de atualização está registrada na página?
|
||||||
|
- [ ] A sintaxe Mermaid está correta (sem erros de parsing)?
|
||||||
|
- [ ] O SVG está responsivo (largura 100%, sem width fixo)?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Manutenção
|
||||||
|
|
||||||
|
Sempre que o processo mudar:
|
||||||
|
|
||||||
|
1. Identificar qual diagrama é afetado
|
||||||
|
2. Atualizar o código Mermaid correspondente
|
||||||
|
3. Atualizar a data de atualização na página
|
||||||
|
4. Se houver novo estado ou proteção, documentar na legenda
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Referência de implementação
|
||||||
|
|
||||||
|
Se o projeto já possuir um fluxograma implementado, usar como referência.
|
||||||
|
Caso contrário, seguir os passos acima para criar a primeira implementação.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Workflow: `global/workflows/otimizar-codigos`
|
||||||
|
- Skill: `global/skills/documentar-decisao-tecnica/SKILL` (para decisões que geram fluxogramas)
|
||||||
36
skills/criar-landing-page/SKILL.md
Normal file
36
skills/criar-landing-page/SKILL.md
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
---
|
||||||
|
name: criar-landing-page
|
||||||
|
description: Workflow passo a passo para a criação e validação de Landing Pages de alta conversão
|
||||||
|
---
|
||||||
|
|
||||||
|
# Workflow: Criar Landing Page (@land)
|
||||||
|
|
||||||
|
## Wireframe & Ordem Obrigatória das Seções
|
||||||
|
|
||||||
|
1. **Header Mínimo (Sticky):** Logo + CTA primário (sem menu de navegação).
|
||||||
|
2. **Hero Section (40% do esforço):** Headline focada em benefício + Subheadline + CTA + Visual real.
|
||||||
|
3. **Barra de Logos:** 5–8 clientes reais/métricas de impacto posicionados logo abaixo do Hero.
|
||||||
|
4. **Seção de Problemas:** 3–4 dores específicas do público-alvo.
|
||||||
|
5. **Seção de Solução:** Transformação Antes vs Depois.
|
||||||
|
6. **Benefícios:** 3–4 blocos visuais (foco em valor de negócio, não em features).
|
||||||
|
7. **Como Funciona:** Exatamente 3 passos numerados (①②③) com tempo estimado.
|
||||||
|
8. **Prova Social:** Depoimentos com foto, cargo, empresa e resultado quantificado.
|
||||||
|
9. **FAQ:** 5–6 perguntas em acordeão quebrando objeções B2B principais.
|
||||||
|
10. **CTA Final:** Reversão de risco ("Sem compromisso") + incentivo de ação.
|
||||||
|
11. **Footer Mínimo:** Contatos e termos de privacidade.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist de Validação Antes da Entrega
|
||||||
|
|
||||||
|
### 1. Estrutura & Copy
|
||||||
|
- [ ] Hero responde às 3 perguntas nos primeiros 5 segundos.
|
||||||
|
- [ ] Sem menu de navegação no header.
|
||||||
|
- [ ] Formulações em "Você/Sua empresa" (foco no cliente).
|
||||||
|
- [ ] Formulário com no máximo 4 campos.
|
||||||
|
|
||||||
|
### 2. Design & Performance
|
||||||
|
- [ ] Screenshots reais do produto utilizados.
|
||||||
|
- [ ] Imagens otimizadas em WebP (< 200KB).
|
||||||
|
- [ ] Responsivo mobile-first validado.
|
||||||
|
- [ ] LCP < 2,5s e CLS < 0,1.
|
||||||
184
skills/criar-schema-zod/SKILL.md
Normal file
184
skills/criar-schema-zod/SKILL.md
Normal file
|
|
@ -0,0 +1,184 @@
|
||||||
|
---
|
||||||
|
name: criar-schema-zod
|
||||||
|
scope: global
|
||||||
|
description: >
|
||||||
|
Guia operacional para criar, organizar e manter schemas de validação Zod em projetos TypeScript.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Criar Schema Zod
|
||||||
|
|
||||||
|
Use esta skill ao adicionar validação de dados em qualquer ponto de entrada do sistema — API, formulário, webhook, importação, fila ou variáveis de ambiente.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 1 — Identificar a Entrada Externa
|
||||||
|
|
||||||
|
Determinar qual dado externo precisa de validação:
|
||||||
|
|
||||||
|
| Tipo de entrada | Onde validar |
|
||||||
|
|---|---|
|
||||||
|
| Corpo de requisição (POST/PUT) | Handler da rota, antes de qualquer lógica |
|
||||||
|
| Query/path params | Handler da rota |
|
||||||
|
| Formulário frontend | Antes de chamar a API |
|
||||||
|
| Dados de fila (BullMQ) | No processador da fila |
|
||||||
|
| Arquivo importado (CSV/JSON) | No parser, linha a linha |
|
||||||
|
| Variáveis de ambiente | No boot da aplicação |
|
||||||
|
| Resposta de API externa | Após receber a resposta |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 2 — Localizar ou Criar o Schema no Pacote Comuns
|
||||||
|
|
||||||
|
Schemas compartilhados vivem no pacote `*-comuns`:
|
||||||
|
|
||||||
|
```
|
||||||
|
projeto-comuns/src/tabelas/
|
||||||
|
├── usuarios/
|
||||||
|
│ ├── zUsuarioCriar.ts
|
||||||
|
│ ├── zUsuarioEditar.ts
|
||||||
|
│ └── index.ts
|
||||||
|
└── index.ts
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.1. Verificar se já existe
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rg "z{NomeDaEntidade}" --include='*.ts' -l
|
||||||
|
```
|
||||||
|
|
||||||
|
Se já existir → reutilizar ou compor a partir dele (`.extend()`, `.pick()`, `.partial()`).
|
||||||
|
|
||||||
|
### 2.2. Criar o schema
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { z } from "zod"
|
||||||
|
|
||||||
|
export const zUsuarioCriar = z.object({
|
||||||
|
nome: z.string().trim().min(1, "Nome é obrigatório"),
|
||||||
|
email: z.string().email("E-mail inválido"),
|
||||||
|
ativo: z.boolean().default(true),
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3. Nomenclatura obrigatória
|
||||||
|
|
||||||
|
| Padrão | Uso |
|
||||||
|
|---|---|
|
||||||
|
| `z{Entidade}Criar` | Criação |
|
||||||
|
| `z{Entidade}Editar` | Edição (geralmente `.partial()`) |
|
||||||
|
| `z{Entidade}Filtro` | Filtros de listagem |
|
||||||
|
| `z{Entidade}Resposta` | Resposta de API |
|
||||||
|
| `z{Entidade}Params` | Parâmetros de rota |
|
||||||
|
| `z{Modulo}Config` | Configuração |
|
||||||
|
| `z{Modulo}Ambiente` | Variáveis de ambiente |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 3 — Derivar o Tipo com `z.infer<>`
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
export type tipoUsuarioCriar = z.infer<typeof zUsuarioCriar>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Nunca** criar um `interface` ou `type` manual separado do schema. O tipo **sempre** deriva do schema.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 4 — Implementar `safeParse` no Ponto de Entrada
|
||||||
|
|
||||||
|
### Backend (Express)
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { zUsuarioCriar } from "projeto-comuns/tabelas/usuarios"
|
||||||
|
|
||||||
|
app.post("/usuarios", async (req, res) => {
|
||||||
|
const resultado = zUsuarioCriar.safeParse(req.body)
|
||||||
|
if (!resultado.success) {
|
||||||
|
return res.status(400).json({ erro: resultado.error.issues[0].message })
|
||||||
|
}
|
||||||
|
const usuario = await criarUsuario(resultado.data)
|
||||||
|
return res.json(usuario)
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend (Vue)
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { zUsuarioCriar } from "projeto-comuns/tabelas/usuarios"
|
||||||
|
|
||||||
|
const salvar = async () => {
|
||||||
|
const resultado = zUsuarioCriar.safeParse(formulario.value)
|
||||||
|
if (!resultado.success) {
|
||||||
|
erros.value = resultado.error.flatten().fieldErrors
|
||||||
|
return
|
||||||
|
}
|
||||||
|
await api.post("/usuarios", resultado.data)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Variáveis de ambiente
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const zAmbiente = z.object({
|
||||||
|
DATABASE_URL: z.string().url(),
|
||||||
|
REDIS_HOST: z.string().default("localhost"),
|
||||||
|
NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
||||||
|
})
|
||||||
|
|
||||||
|
// Aqui o throw é desejável — a app não deve subir com env inválido
|
||||||
|
export const ambiente = () => zAmbiente.parse(process.env)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 5 — Compor Schemas Derivados
|
||||||
|
|
||||||
|
Quando precisar de variações do mesmo schema, **compor** em vez de duplicar:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Schema base
|
||||||
|
const zProduto = z.object({
|
||||||
|
nome: z.string().trim().min(1),
|
||||||
|
preco: z.coerce.number().positive(),
|
||||||
|
categoria: z.string(),
|
||||||
|
})
|
||||||
|
|
||||||
|
// Edição: todos os campos opcionais
|
||||||
|
const zProdutoEditar = zProduto.partial()
|
||||||
|
|
||||||
|
// Resposta: base + campos gerados
|
||||||
|
const zProdutoResposta = zProduto.extend({
|
||||||
|
codigo: z.string().uuid(),
|
||||||
|
criadoEm: z.string().datetime(),
|
||||||
|
})
|
||||||
|
|
||||||
|
// Filtro: subset de campos opcionais
|
||||||
|
const zProdutoFiltro = zProduto.pick({ categoria: true }).partial()
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 6 — Validar Tipagem
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx tsc --noEmit
|
||||||
|
```
|
||||||
|
|
||||||
|
Zero erros = concluído.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist Final
|
||||||
|
|
||||||
|
- [ ] O schema está no pacote `*-comuns` (quando compartilhado entre front/back)?
|
||||||
|
- [ ] O tipo é derivado do schema com `z.infer<>`?
|
||||||
|
- [ ] A validação usa `safeParse` (exceto em boot/middleware)?
|
||||||
|
- [ ] A nomenclatura segue o padrão `z{Entidade}{Acao}`?
|
||||||
|
- [ ] Transformações (trim, coerce, default) estão no schema, não no handler?
|
||||||
|
- [ ] Schemas derivados usam composição (.partial, .extend, .pick), não duplicação?
|
||||||
|
- [ ] `tsc --noEmit` passa sem erros?
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/zod-validacao-padrao`
|
||||||
|
- Rule: `global/rules/typescript-sem-any`
|
||||||
188
skills/diagnosticar-antes-corrigir/SKILL.md
Normal file
188
skills/diagnosticar-antes-corrigir/SKILL.md
Normal file
|
|
@ -0,0 +1,188 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-antes-corrigir
|
||||||
|
scope: global
|
||||||
|
updatedAt: "2026-07-09"
|
||||||
|
description: >
|
||||||
|
Protocolo universal de diagnóstico que todo agente deve seguir antes de implementar
|
||||||
|
correções, mudanças ou refatorações. Define etapas, ferramentas e formato de saída.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Antes de Corrigir
|
||||||
|
|
||||||
|
Use esta skill **sempre** que receber uma solicitação de correção, ajuste ou mudança. Ela é a implementação operacional da rule `diagnostico-antes-correcao`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 1 — Compreender a Solicitação
|
||||||
|
|
||||||
|
Antes de qualquer ação, responder internamente:
|
||||||
|
|
||||||
|
| Pergunta | Resposta esperada |
|
||||||
|
|----------|-------------------|
|
||||||
|
| O que o operador reportou? | Descrição objetiva do problema |
|
||||||
|
| É um erro de build, runtime, lógica ou visual? | Classificação |
|
||||||
|
| Qual módulo/pacote é afetado? | `*-back`, `*-front`, `*-comuns`, `*-migracao` |
|
||||||
|
| O operador já forneceu diagnóstico? | Se sim, validar antes de aceitar |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 2 — Coletar Evidências
|
||||||
|
|
||||||
|
### 2.1. Ler o código afetado (completo)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Não ler apenas a linha do erro — ler o arquivo inteiro para contexto
|
||||||
|
view_file <arquivo_afetado>
|
||||||
|
|
||||||
|
# Verificar imports e dependências
|
||||||
|
rg "import.*from" <arquivo_afetado>
|
||||||
|
|
||||||
|
# Verificar quem usa este arquivo
|
||||||
|
rg "<nome_do_export>" --include='*.ts' --include='*.vue' -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2. Verificar erros de build (se aplicável)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Verificar se o build passa
|
||||||
|
pnpm --filter <pacote> build 2>&1 | head -50
|
||||||
|
|
||||||
|
# Ou checagem de tipos isolada
|
||||||
|
npx tsc --noEmit -p <caminho>/tsconfig.json 2>&1 | head -30
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3. Consultar memória (obrigatório)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
grep -rn "PALAVRAS_CHAVE_DO_PROBLEMA" .
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.4. Verificar regras de negócio documentadas
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Buscar .regras-negocio.md no diretório afetado
|
||||||
|
fd ".regras-negocio.md" <diretorio_do_modulo>
|
||||||
|
|
||||||
|
# Buscar comentários explicativos no código
|
||||||
|
rg "HACK|FIXME|TODO|NOTA|IMPORTANTE|REGRA" <arquivo_afetado>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 3 — Análise de Causa Raiz
|
||||||
|
|
||||||
|
### 3.1. Técnica dos 5 Porquês
|
||||||
|
|
||||||
|
Aplicar progressivamente até chegar à causa raiz:
|
||||||
|
|
||||||
|
```
|
||||||
|
Por que o campo não salva?
|
||||||
|
→ Porque a API retorna 400.
|
||||||
|
Por que a API retorna 400?
|
||||||
|
→ Porque a validação Zod rejeita o campo.
|
||||||
|
Por que o Zod rejeita?
|
||||||
|
→ Porque o schema não inclui esse campo.
|
||||||
|
Por que o schema não inclui?
|
||||||
|
→ Porque a migração adicionou a coluna mas o schema não foi atualizado.
|
||||||
|
CAUSA RAIZ: Schema Zod desatualizado após migração.
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2. Classificar a causa
|
||||||
|
|
||||||
|
| Categoria | Exemplos |
|
||||||
|
|-----------|----------|
|
||||||
|
| **Schema/Tipo** | Zod schema desatualizado, tipo TypeScript incorreto |
|
||||||
|
| **Banco de dados** | Coluna ausente, migração não executada |
|
||||||
|
| **Lógica de negócio** | Condição errada, regra não implementada |
|
||||||
|
| **Integração** | API fora do contrato, fila não processando |
|
||||||
|
| **Interface** | Componente não reativo, estado inconsistente |
|
||||||
|
| **Configuração** | Variável de ambiente, tsconfig, dependência |
|
||||||
|
| **Infraestrutura** | Container, deploy, proxy, certificado |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 4 — Avaliar Impacto
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Quais arquivos usam o código afetado?
|
||||||
|
rg "<simbolo_afetado>" --include='*.ts' --include='*.vue' --include='*.tsx' -l
|
||||||
|
|
||||||
|
# Quantos módulos são impactados?
|
||||||
|
rg "<simbolo_afetado>" --include='*.ts' -l | xargs -I{} dirname {} | sort -u
|
||||||
|
```
|
||||||
|
|
||||||
|
Classificar o impacto:
|
||||||
|
|
||||||
|
| Severidade | Critério |
|
||||||
|
|------------|----------|
|
||||||
|
| 🔴 Alto | Afeta 3+ módulos, pode causar regressão |
|
||||||
|
| 🟡 Médio | Afeta 1-2 arquivos, impacto limitado |
|
||||||
|
| 🟢 Baixo | Isolado, sem dependentes |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 5 — Declarar Diagnóstico
|
||||||
|
|
||||||
|
**OBRIGATÓRIO:** Antes de editar qualquer arquivo, apresentar ao operador:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## 🔍 Diagnóstico
|
||||||
|
|
||||||
|
**Problema:** [descrição objetiva do problema observado]
|
||||||
|
**Causa raiz:** [identificação precisa da causa]
|
||||||
|
**Categoria:** [Schema/Tipo | Banco | Lógica | Integração | Interface | Config | Infra]
|
||||||
|
**Severidade:** [🔴 Alto | 🟡 Médio | 🟢 Baixo]
|
||||||
|
|
||||||
|
### Arquivos afetados
|
||||||
|
- `caminho/arquivo1.ts` — [o que precisa mudar]
|
||||||
|
- `caminho/arquivo2.vue` — [o que precisa mudar]
|
||||||
|
|
||||||
|
### Plano de correção
|
||||||
|
1. [Primeiro passo]
|
||||||
|
2. [Segundo passo]
|
||||||
|
3. [Verificação]
|
||||||
|
|
||||||
|
### Riscos
|
||||||
|
- [Efeito colateral possível, se houver]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 6 — Executar Correção
|
||||||
|
|
||||||
|
Somente após o diagnóstico declarado:
|
||||||
|
|
||||||
|
1. Aplicar as mudanças conforme o plano
|
||||||
|
2. Verificar build após cada mudança significativa
|
||||||
|
3. Confirmar que o problema original foi resolvido
|
||||||
|
4. Verificar se não houve regressão nos arquivos afetados
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Atalho para Problemas Triviais
|
||||||
|
|
||||||
|
Quando o problema é **evidentemente trivial** (typo, import faltando, formatação), o diagnóstico pode ser condensado em uma linha:
|
||||||
|
|
||||||
|
```
|
||||||
|
DIAGNÓSTICO: Import ausente de `zContato` em `_contatos.ts` (linha 5). Adicionando.
|
||||||
|
```
|
||||||
|
|
||||||
|
A etapa de diagnóstico **nunca é eliminada** — apenas simplificada proporcionalmente à complexidade.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
- [ ] O código afetado foi lido integralmente (não apenas a linha do erro)?
|
||||||
|
- [ ] A Memória Azteca foi consultada para soluções anteriores?
|
||||||
|
- [ ] A causa raiz foi identificada (não apenas o sintoma)?
|
||||||
|
- [ ] O impacto foi avaliado (arquivos e módulos afetados)?
|
||||||
|
- [ ] O diagnóstico foi declarado ao operador antes da correção?
|
||||||
|
- [ ] A correção resolve a causa raiz, não apenas o sintoma?
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Skill: `global/skills/diagnosticar-erros-build/SKILL`
|
||||||
|
- Skill: `agents/refatorar/skills/diagnosticar-code-smells/SKILL`
|
||||||
|
- Rule: `global/rules/autonomia-agente`
|
||||||
97
skills/diagnosticar-cobertura-testes/SKILL.md
Normal file
97
skills/diagnosticar-cobertura-testes/SKILL.md
Normal file
|
|
@ -0,0 +1,97 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-cobertura-testes
|
||||||
|
description: >
|
||||||
|
Diagnóstico de cobertura de testes: identificar áreas sem cobertura,
|
||||||
|
priorizar criação de testes e mapear cenários ausentes.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Cobertura de Testes
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Mapear a cobertura de testes de um módulo para identificar gaps críticos antes de criar novos testes ou validar correções.
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Inventariar Testes Existentes
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar arquivos de teste
|
||||||
|
fd "*.spec.ts" <modulo>/ -l
|
||||||
|
fd "*.test.ts" <modulo>/ -l
|
||||||
|
|
||||||
|
# Contar testes por pacote
|
||||||
|
echo "=== Back ===" && fd "*.spec.ts" <modulo>-back/ | wc -l
|
||||||
|
echo "=== Front ===" && fd "*.spec.ts" <modulo>-front/ | wc -l
|
||||||
|
echo "=== Comuns ===" && fd "*.spec.ts" <modulo>-comuns/ | wc -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Mapear Código Sem Testes
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar arquivos de código sem arquivo de teste correspondente
|
||||||
|
for f in $(fd "*.ts" <modulo>-back/src/ --exclude "*.spec.ts" --exclude "*.test.ts" --exclude "*.d.ts"); do
|
||||||
|
base=$(basename "$f" .ts)
|
||||||
|
if ! fd "${base}.spec.ts" <modulo>/ -q && ! fd "${base}.test.ts" <modulo>/ -q; then
|
||||||
|
echo "SEM TESTE: $f"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Classificar por Criticidade
|
||||||
|
|
||||||
|
| Criticidade | O que testar primeiro |
|
||||||
|
|-------------|----------------------|
|
||||||
|
| 🔴 Crítico | Lógica de negócio em `servicos/`, schemas Zod, máquinas de estado |
|
||||||
|
| 🟡 Importante | Rotas de API, processadores de fila, composables complexos |
|
||||||
|
| 🟢 Desejável | Utils, helpers, componentes de UI puros |
|
||||||
|
|
||||||
|
### 4. Verificar Qualidade dos Testes Existentes
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Detectar testes sem assertions
|
||||||
|
rg "expect\(|assert\(|toBe\(|toEqual\(" --include='*.spec.ts' <modulo>/ -c | awk -F: '$2==0'
|
||||||
|
|
||||||
|
# Detectar testes com descrições vagas
|
||||||
|
rg "it\('" --include='*.spec.ts' <modulo>/ -n | grep -i "should work\|test\|funciona"
|
||||||
|
|
||||||
|
# Verificar mocks sem documentação
|
||||||
|
rg "mock\(|jest\.fn\(|vi\.fn\(" --include='*.spec.ts' <modulo>/ -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Gerar Relatório
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Diagnóstico de Cobertura — [nome do módulo]
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
- **Arquivos de código:** N
|
||||||
|
- **Arquivos de teste:** N
|
||||||
|
- **Cobertura estimada:** N%
|
||||||
|
- **Gaps críticos:** N
|
||||||
|
|
||||||
|
## Gaps de Cobertura
|
||||||
|
|
||||||
|
### 🔴 Sem teste — Lógica Crítica
|
||||||
|
| Arquivo | Responsabilidade | Risco |
|
||||||
|
|---------|-----------------|-------|
|
||||||
|
|
||||||
|
### 🟡 Sem teste — Funcionalidade Importante
|
||||||
|
| Arquivo | Responsabilidade | Risco |
|
||||||
|
|---------|-----------------|-------|
|
||||||
|
|
||||||
|
## Testes Existentes com Problemas
|
||||||
|
| Arquivo de Teste | Problema | Ação |
|
||||||
|
|-----------------|----------|------|
|
||||||
|
|
||||||
|
## Plano de Priorização
|
||||||
|
1. [Crítico] Criar testes para ...
|
||||||
|
2. [Crítico] Criar testes para ...
|
||||||
|
3. [Importante] Criar testes para ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Skill: `global/skills/diagnosticar-antes-corrigir/SKILL`
|
||||||
145
skills/diagnosticar-code-smells/SKILL.md
Normal file
145
skills/diagnosticar-code-smells/SKILL.md
Normal file
|
|
@ -0,0 +1,145 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-code-smells
|
||||||
|
description: >
|
||||||
|
Análise sistemática de código para identificar code smells, violações SOLID
|
||||||
|
e oportunidades de aplicação de Design Patterns GoF.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Code Smells
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Analisar um arquivo, módulo ou pacote para produzir um relatório de saúde estrutural com:
|
||||||
|
- Code smells identificados
|
||||||
|
- Violações SOLID detectadas
|
||||||
|
- Design Patterns recomendados
|
||||||
|
- Prioridade de cada refatoração
|
||||||
|
|
||||||
|
## Pré-condições
|
||||||
|
|
||||||
|
- Código existente para analisar (arquivo, pasta ou pacote)
|
||||||
|
- Acesso de leitura ao código e seus testes
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Coletar Contexto
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Identificar tamanho e estrutura
|
||||||
|
wc -l <arquivo_ou_pasta>/**/*.ts
|
||||||
|
wc -l <arquivo_ou_pasta>/**/*.vue
|
||||||
|
|
||||||
|
# Verificar cobertura de testes
|
||||||
|
find <pasta_testes> -name "*.spec.ts" -o -name "*.test.ts"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Verificar Smells de Volume
|
||||||
|
|
||||||
|
Para cada arquivo, verificar:
|
||||||
|
|
||||||
|
| Verificação | Comando/Ação |
|
||||||
|
|-------------|-------------|
|
||||||
|
| Linhas > 250 | `wc -l <arquivo>` |
|
||||||
|
| Funções > 30 linhas | Ler e contar manualmente |
|
||||||
|
| Parâmetros > 3 por função | `grep_search` por assinaturas |
|
||||||
|
| Imports excessivos (> 10) | Contar linhas de import |
|
||||||
|
|
||||||
|
### 3. Verificar Smells de Acoplamento
|
||||||
|
|
||||||
|
| Verificação | Indicador |
|
||||||
|
|-------------|-----------|
|
||||||
|
| Feature Envy | Função usa `outro.` mais que `this.` ou dados locais |
|
||||||
|
| Intimidade Inapropriada | Acesso a internos de outro módulo (não-exportados) |
|
||||||
|
| Cadeia de Mensagens | `a.b.c.d` com 3+ níveis |
|
||||||
|
| Import circular | Módulo A importa B que importa A |
|
||||||
|
|
||||||
|
### 4. Verificar Conformidade SOLID
|
||||||
|
|
||||||
|
Para cada princípio, aplicar o checklist:
|
||||||
|
|
||||||
|
```
|
||||||
|
□ S — Este arquivo tem apenas 1 razão para mudar?
|
||||||
|
□ O — Posso adicionar nova variação sem editar este arquivo?
|
||||||
|
□ L — Subtipos são substituíveis pelo tipo base?
|
||||||
|
□ I — Interfaces são específicas para cada consumidor?
|
||||||
|
□ D — Lógica de negócio depende de abstrações, não de implementações?
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Mapear Oportunidades de Padrão
|
||||||
|
|
||||||
|
Cruzar smells detectados com o guia de decisão:
|
||||||
|
|
||||||
|
```
|
||||||
|
switch crescente → Strategy
|
||||||
|
criação condicional → Factory Method
|
||||||
|
construção complexa → Builder
|
||||||
|
comportamento por estado → State
|
||||||
|
pipeline de validações → Chain of Responsibility
|
||||||
|
comportamento adicional → Decorator
|
||||||
|
interface incompatível → Adapter
|
||||||
|
subsistema complexo → Facade
|
||||||
|
notificação de mudanças → Observer
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Gerar Relatório
|
||||||
|
|
||||||
|
Produzir relatório no formato:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Diagnóstico de Code Smells — [nome do módulo]
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
- **Arquivos analisados:** N
|
||||||
|
- **Smells encontrados:** N
|
||||||
|
- **Violações SOLID:** N
|
||||||
|
- **Padrões recomendados:** N
|
||||||
|
|
||||||
|
## Smells Detectados
|
||||||
|
|
||||||
|
### 🔴 Crítico
|
||||||
|
| Arquivo | Smell | Linha(s) | Ação Recomendada |
|
||||||
|
|---------|-------|----------|-----------------|
|
||||||
|
|
||||||
|
### 🟡 Moderado
|
||||||
|
| Arquivo | Smell | Linha(s) | Ação Recomendada |
|
||||||
|
|---------|-------|----------|-----------------|
|
||||||
|
|
||||||
|
### 🟢 Baixo
|
||||||
|
| Arquivo | Smell | Linha(s) | Ação Recomendada |
|
||||||
|
|---------|-------|----------|-----------------|
|
||||||
|
|
||||||
|
## Violações SOLID
|
||||||
|
| Princípio | Arquivo | Descrição | Severidade |
|
||||||
|
|-----------|---------|-----------|------------|
|
||||||
|
|
||||||
|
## Design Patterns Recomendados
|
||||||
|
| Problema | Padrão | Justificativa | Esforço |
|
||||||
|
|----------|--------|---------------|---------|
|
||||||
|
|
||||||
|
## Plano de Ação (priorizado)
|
||||||
|
1. [Crítico] ...
|
||||||
|
2. [Crítico] ...
|
||||||
|
3. [Moderado] ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Critérios de Severidade
|
||||||
|
|
||||||
|
| Severidade | Critério |
|
||||||
|
|------------|----------|
|
||||||
|
| 🔴 Crítico | Violação SOLID + acoplamento alto + afeta 3+ arquivos |
|
||||||
|
| 🟡 Moderado | Code smell isolado + afeta 1-2 arquivos |
|
||||||
|
| 🟢 Baixo | Melhoria estética + sem impacto funcional |
|
||||||
|
|
||||||
|
## Pós-condições
|
||||||
|
|
||||||
|
- Relatório registrado na Memória Azteca (`./memory/`) ou entregue diretamente
|
||||||
|
- Plano de ação priorizado gerado
|
||||||
|
- `@testes` notificado sobre trechos sem cobertura
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Persona: `agents/refatorar/persona`
|
||||||
|
- Rule: `agents/refatorar/rules/solid-compliance`
|
||||||
|
- Rule: `agents/refatorar/rules/design-patterns-pragmatico`
|
||||||
|
- Refactoring.Guru — https://refactoring.guru/pt-br/refactoring/smells
|
||||||
186
skills/diagnosticar-erros-build/SKILL.md
Normal file
186
skills/diagnosticar-erros-build/SKILL.md
Normal file
|
|
@ -0,0 +1,186 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-erros-build
|
||||||
|
scope: global
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
description: >
|
||||||
|
Guia operacional para diagnosticar e resolver erros de build em cascata em monorepos TypeScript.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Erros de Build em Monorepo TypeScript
|
||||||
|
|
||||||
|
Use esta skill quando o build de um monorepo TypeScript falha — especialmente quando erros aparecem em pacotes que não foram diretamente modificados (erros em cascata).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 1 — Capturar o Erro Completo
|
||||||
|
|
||||||
|
Executar o build com output completo e sem truncamento:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# pnpm (monorepo completo)
|
||||||
|
pnpm build 2>&1 | head -200
|
||||||
|
|
||||||
|
# Pacote específico
|
||||||
|
pnpm --filter <pacote> build 2>&1
|
||||||
|
|
||||||
|
# tsc direto (se disponível)
|
||||||
|
npx tsc --noEmit --pretty 2>&1 | head -100
|
||||||
|
```
|
||||||
|
|
||||||
|
Identificar:
|
||||||
|
|
||||||
|
- **Qual pacote falhou primeiro** (nem sempre é o que aparece no topo)
|
||||||
|
- **Código do erro** (`TS2304`, `TS2345`, `TS7006`, etc.)
|
||||||
|
- **Arquivo e linha** do erro original
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 2 — Classificar o Tipo de Erro
|
||||||
|
|
||||||
|
### Erros de dependência entre pacotes (cascata)
|
||||||
|
|
||||||
|
| Sintoma | Causa provável | Solução |
|
||||||
|
|---------|---------------|---------|
|
||||||
|
| `Cannot find module '@org/xxx'` | Pacote não foi buildado antes | Buildar na ordem correta ou usar `references` |
|
||||||
|
| `Module has no exported member 'X'` | Tipo renomeado/removido no pacote origem | Atualizar import no consumidor |
|
||||||
|
| Tipos `any` infiltrados | Pacote exporta sem `.d.ts` | Verificar `declaration: true` no tsconfig |
|
||||||
|
| `The inferred type cannot be named` | Dependência circular de tipos | Extrair tipo para pacote compartilhado |
|
||||||
|
|
||||||
|
### Erros de configuração
|
||||||
|
|
||||||
|
| Sintoma | Causa provável | Solução |
|
||||||
|
|---------|---------------|---------|
|
||||||
|
| `Cannot use import statement` | `module` errado no tsconfig | Alinhar `module`/`moduleResolution` |
|
||||||
|
| `Relative import paths need extensions` | Node16/NodeNext resolution | Adicionar `.js` nos imports ou mudar para `bundler` |
|
||||||
|
| `rootDir is expected to contain all source files` | Arquivo fora do `rootDir` | Ajustar `rootDir` ou mover arquivo |
|
||||||
|
| `Referenced project must have setting composite` | Project references sem `composite` | Adicionar `composite: true` no tsconfig referenciado |
|
||||||
|
|
||||||
|
### Erros de tipagem
|
||||||
|
|
||||||
|
| Sintoma | Causa provável | Solução |
|
||||||
|
|---------|---------------|---------|
|
||||||
|
| `TS2304: Cannot find name` | Tipo global não declarado | Criar `d.ts` ou importar explicitamente |
|
||||||
|
| `TS2345: Argument not assignable` | Tipos incompatíveis entre versões | Alinhar versão da dependência |
|
||||||
|
| `TS7006: Parameter implicitly has 'any'` | `noImplicitAny` ativado | Tipar o parâmetro explicitamente |
|
||||||
|
| `TS18046: is of type 'unknown'` | Narrowing ausente | Fazer type guard antes de usar |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 3 — Identificar a Raiz do Problema
|
||||||
|
|
||||||
|
O erro que aparece **primeiro** nem sempre é a raiz. Seguir esta estratégia:
|
||||||
|
|
||||||
|
### 3.1. Verificar ordem de build
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Listar dependências internas para entender ordem correta
|
||||||
|
rg '"workspace:' --include='package.json' -l | sort
|
||||||
|
|
||||||
|
# Se usar turbo, verificar o pipeline
|
||||||
|
cat turbo.json | jq '.pipeline.build'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2. Rebuild isolado do pacote raiz
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Buildar APENAS o pacote mais baixo na hierarquia que apresenta erro
|
||||||
|
pnpm --filter <pacote-raiz> build
|
||||||
|
|
||||||
|
# Se esse buildar com sucesso, subir na hierarquia
|
||||||
|
pnpm --filter <pacote-consumidor> build
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3. Verificar checagem de tipos isolada
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Verificar se a tipagem está correta sem produzir output
|
||||||
|
npx tsc --noEmit -p <caminho>/tsconfig.json
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 4 — Resolver Erros em Cascata
|
||||||
|
|
||||||
|
### Estratégia: de baixo para cima
|
||||||
|
|
||||||
|
1. Identificar o pacote **mais fundamental** (aquele que não depende de outros internos)
|
||||||
|
2. Resolver TODOS os erros nesse pacote
|
||||||
|
3. Rebuildar
|
||||||
|
4. Subir para o próximo pacote na cadeia de dependência
|
||||||
|
5. Repetir até o topo
|
||||||
|
|
||||||
|
### Armadilhas comuns
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ❌ ERRADO: "resolver" com any (viola typescript-sem-any)
|
||||||
|
const dados = resultado as any
|
||||||
|
|
||||||
|
// ✅ CORRETO: tipar adequadamente
|
||||||
|
const dados: ResultadoEsperado = resultado
|
||||||
|
|
||||||
|
// ❌ ERRADO: ignorar erro com @ts-ignore
|
||||||
|
// @ts-ignore
|
||||||
|
import { funcao } from '@org/pacote'
|
||||||
|
|
||||||
|
// ✅ CORRETO: investigar por que o import falha
|
||||||
|
// O pacote '@org/pacote' foi buildado? O export existe?
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 5 — Verificar Alinhamento de Configuração
|
||||||
|
|
||||||
|
Quando erros persistem entre pacotes, verificar alinhamento de tsconfig:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Comparar configurações críticas entre pacotes
|
||||||
|
for f in $(fd tsconfig.json --max-depth 2 --type f); do
|
||||||
|
echo "=== $f ==="
|
||||||
|
jq '{target, module, moduleResolution, strict, composite, declaration}' "$f" 2>/dev/null
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
Campos que **devem** ser consistentes entre pacotes do mesmo monorepo:
|
||||||
|
|
||||||
|
| Campo | Recomendação |
|
||||||
|
|-------|-------------|
|
||||||
|
| `target` | Mesmo alvo para todos (ex: `ES2022`) |
|
||||||
|
| `module` | Consistente (ex: `ESNext` ou `Node16`) |
|
||||||
|
| `moduleResolution` | Consistente (ex: `bundler` ou `node16`) |
|
||||||
|
| `strict` | `true` em todos |
|
||||||
|
| `declaration` | `true` em libs, opcional em apps |
|
||||||
|
| `composite` | `true` em libs referenciadas |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 6 — Limpar e Rebuildar
|
||||||
|
|
||||||
|
Quando a investigação não revela causa óbvia:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Limpar artefatos de build de todos os pacotes
|
||||||
|
fd -t d 'dist|build|.tsbuildinfo' --exclude node_modules | xargs rm -rf
|
||||||
|
|
||||||
|
# Limpar node_modules (último recurso)
|
||||||
|
fd -t d node_modules --max-depth 2 | xargs rm -rf
|
||||||
|
|
||||||
|
# Reinstalar e rebuildar do zero
|
||||||
|
pnpm install && pnpm build
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist Final
|
||||||
|
|
||||||
|
- [ ] O pacote raiz do erro em cascata foi identificado?
|
||||||
|
- [ ] O erro original (não o efeito cascata) foi localizado?
|
||||||
|
- [ ] A solução não usa `any`, `as any` ou `@ts-ignore`?
|
||||||
|
- [ ] Todos os pacotes na cadeia foram rebuildados após a correção?
|
||||||
|
- [ ] As configurações de tsconfig estão alinhadas entre pacotes?
|
||||||
|
- [ ] O build completo passa sem erros?
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rules: `global/rules/typescript-sem-any`
|
||||||
|
- Workflow: `global/workflows/otimizar-codigos`
|
||||||
|
- Skill: `global/skills/mapear-codigo-fonte/SKILL`
|
||||||
96
skills/diagnosticar-lacunas-documentacao/SKILL.md
Normal file
96
skills/diagnosticar-lacunas-documentacao/SKILL.md
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-lacunas-documentacao
|
||||||
|
description: >
|
||||||
|
Diagnóstico de lacunas de documentação: funções sem JSDoc, módulos sem
|
||||||
|
regras de negócio documentadas, documentação desatualizada.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Lacunas de Documentação
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Identificar proativamente onde a documentação está ausente, incompleta ou desatualizada antes de criar ou corrigir documentação.
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Verificar JSDoc em Funções Compartilhadas
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar funções exportadas sem JSDoc
|
||||||
|
rg "^export (const|function|async function)" --include='*.ts' <modulo>-comuns/src/ -n | while read line; do
|
||||||
|
file=$(echo "$line" | cut -d: -f1)
|
||||||
|
lineno=$(echo "$line" | cut -d: -f2)
|
||||||
|
prev=$((lineno - 1))
|
||||||
|
if ! sed -n "${prev}p" "$file" | grep -q "*/"; then
|
||||||
|
echo "SEM JSDOC: $line"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Verificar Regras de Negócio Documentadas
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar módulos com lógica complexa
|
||||||
|
rg "if.*&&|switch|\.length\s*>" --include='*.ts' <modulo>-back/src/servicos/ -c | awk -F: '$2>5' | sort -t: -k2 -rn
|
||||||
|
|
||||||
|
# Verificar quais têm .regras-negocio.md
|
||||||
|
fd ".regras-negocio.md" <modulo>/ -l
|
||||||
|
|
||||||
|
# Detectar lógica complexa sem documentação de regras
|
||||||
|
# (comparar os dois resultados acima)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Verificar Documentação de API
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar rotas sem comentário explicativo
|
||||||
|
rg "router\.(get|post|put|patch|delete)" --include='*.ts' <modulo>-back/src/rotas/ -n
|
||||||
|
|
||||||
|
# Verificar quais rotas têm JSDoc
|
||||||
|
rg "/\*\*" --include='*.ts' <modulo>-back/src/rotas/ -c
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Detectar Dessincronia Código ↔ Docs
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Buscar campos mencionados em .regras-negocio.md que não existem no código
|
||||||
|
# (verificação manual por arquivo)
|
||||||
|
|
||||||
|
# Buscar decisões técnicas que deveriam estar na Memória
|
||||||
|
rg "DECISÃO|ADR|NOTA|IMPORTANTE" --include='*.ts' --include='*.md' <modulo>/ -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Gerar Relatório
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Diagnóstico de Documentação — [nome do módulo]
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
- **Funções compartilhadas sem JSDoc:** N
|
||||||
|
- **Módulos complexos sem .regras-negocio.md:** N
|
||||||
|
- **Rotas sem documentação:** N
|
||||||
|
|
||||||
|
## Lacunas Encontradas
|
||||||
|
|
||||||
|
### 🔴 Crítico — Lógica Complexa Não Documentada
|
||||||
|
| Arquivo | Complexidade | O que documentar |
|
||||||
|
|---------|-------------|-----------------|
|
||||||
|
|
||||||
|
### 🟡 Moderado — JSDoc Ausente
|
||||||
|
| Arquivo | Função | Tipo |
|
||||||
|
|---------|--------|------|
|
||||||
|
|
||||||
|
### 🟢 Baixo — Melhorias
|
||||||
|
| Arquivo | O que melhorar |
|
||||||
|
|---------|---------------|
|
||||||
|
|
||||||
|
## Plano de Documentação (priorizado)
|
||||||
|
1. ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Rule: `global/rules/jsdoc-padrao`
|
||||||
|
- Rule: `global/rules/regras-negocio-md`
|
||||||
117
skills/diagnosticar-saude-backend/SKILL.md
Normal file
117
skills/diagnosticar-saude-backend/SKILL.md
Normal file
|
|
@ -0,0 +1,117 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-saude-backend
|
||||||
|
description: >
|
||||||
|
Diagnóstico sistemático de saúde do backend: rotas, queries, schemas, filas,
|
||||||
|
CRONs e integrações antes de qualquer correção.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Saúde do Backend
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Analisar a saúde de um módulo backend para identificar problemas antes de corrigi-los. Produz relatório com causa raiz, severidade e plano de ação.
|
||||||
|
|
||||||
|
## Pré-condições
|
||||||
|
|
||||||
|
- Acesso ao pacote `*-back` do módulo
|
||||||
|
- Acesso ao pacote `*-comuns` (schemas de contrato)
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Verificar Integridade de Schemas
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar todos os schemas Zod do módulo
|
||||||
|
rg "export const z" --include='*.ts' <modulo>-comuns/src/tabelas/ -l
|
||||||
|
|
||||||
|
# Verificar se schemas do comuns são usados no back
|
||||||
|
rg "from.*comuns" --include='*.ts' <modulo>-back/src/ | head -20
|
||||||
|
|
||||||
|
# Detectar schemas redefinidos no back (violação de fronteiras)
|
||||||
|
rg "z\.object\(\{" --include='*.ts' <modulo>-back/src/ -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Verificar Consistência de Rotas
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar todas as rotas definidas
|
||||||
|
rg "router\.(get|post|put|patch|delete)" --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
|
||||||
|
# Verificar validação de entrada em cada rota
|
||||||
|
rg "zod|parse|safeParse" --include='*.ts' <modulo>-back/src/rotas/ -l
|
||||||
|
|
||||||
|
# Detectar rotas sem validação Zod
|
||||||
|
# (comparar lista de rotas vs lista de validações)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Verificar Saúde de Queries
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Detectar queries sem tratamento de erro
|
||||||
|
rg "\.select\(|\.insert\(|\.update\(|\.delete\(" --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
|
||||||
|
# Detectar possíveis N+1 (query dentro de loop)
|
||||||
|
rg "for.*await|forEach.*await|map.*await" --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
|
||||||
|
# Verificar transações (queries que deveriam ser atômicas)
|
||||||
|
rg "\.transaction\(" --include='*.ts' <modulo>-back/src/ -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Verificar Filas e CRONs
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar processadores de fila
|
||||||
|
rg "process|worker|queue" --include='*.ts' <modulo>-back/src/filas/ -l
|
||||||
|
|
||||||
|
# Verificar tratamento de falha em filas
|
||||||
|
rg "catch|onFailed|failedReason" --include='*.ts' <modulo>-back/src/filas/ -n
|
||||||
|
|
||||||
|
# Listar CRONs agendados
|
||||||
|
rg "cron|schedule|repeat" --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Verificar Tipagem e Build
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Checar tipos sem gerar saída
|
||||||
|
npx tsc --noEmit -p <modulo>-back/tsconfig.json 2>&1 | head -30
|
||||||
|
|
||||||
|
# Detectar uso de any
|
||||||
|
rg "as any|: any" --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Gerar Relatório
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Diagnóstico Backend — [nome do módulo]
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
- **Rotas analisadas:** N
|
||||||
|
- **Schemas verificados:** N
|
||||||
|
- **Problemas encontrados:** N
|
||||||
|
|
||||||
|
## Problemas Detectados
|
||||||
|
|
||||||
|
### 🔴 Crítico
|
||||||
|
| Arquivo | Problema | Causa | Ação |
|
||||||
|
|---------|----------|-------|------|
|
||||||
|
|
||||||
|
### 🟡 Moderado
|
||||||
|
| Arquivo | Problema | Causa | Ação |
|
||||||
|
|---------|----------|-------|------|
|
||||||
|
|
||||||
|
### 🟢 Baixo
|
||||||
|
| Arquivo | Problema | Causa | Ação |
|
||||||
|
|---------|----------|-------|------|
|
||||||
|
|
||||||
|
## Plano de Correção (priorizado)
|
||||||
|
1. ...
|
||||||
|
2. ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Skill: `global/skills/diagnosticar-antes-corrigir/SKILL`
|
||||||
|
- Rule: `global/rules/zod-validacao-padrao`
|
||||||
88
skills/diagnosticar-saude-deploy/SKILL.md
Normal file
88
skills/diagnosticar-saude-deploy/SKILL.md
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-saude-deploy
|
||||||
|
description: >
|
||||||
|
Diagnóstico de saúde de deploy e infraestrutura: containers, variáveis
|
||||||
|
de ambiente, healthchecks, logs e estado dos serviços.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Saúde de Deploy
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Avaliar o estado de saúde da infraestrutura e pipelines de deploy antes de aplicar mudanças.
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Verificar Estado dos Containers
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar containers ativos
|
||||||
|
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
||||||
|
|
||||||
|
# Verificar logs recentes de erro
|
||||||
|
docker logs --tail 50 <container> 2>&1 | grep -i "error\|fatal\|exception\|fail"
|
||||||
|
|
||||||
|
# Verificar uso de recursos
|
||||||
|
docker stats --no-stream
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Verificar Variáveis de Ambiente
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar variáveis esperadas (schemas Zod de ambiente)
|
||||||
|
rg "z\.Ambiente\|process\.env\." --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
|
||||||
|
# Verificar se há variáveis sem default ou validação
|
||||||
|
rg "process\.env\." --include='*.ts' <modulo>-back/src/ -n | grep -v "z\.\|zod\|Ambiente"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Verificar Healthchecks
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Verificar endpoints de health
|
||||||
|
rg "health\|alive\|ready" --include='*.ts' <modulo>-back/src/ -n
|
||||||
|
|
||||||
|
# Verificar healthcheck no Docker
|
||||||
|
rg "HEALTHCHECK" Dockerfile* docker-compose* -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Verificar Build
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Testar build completo
|
||||||
|
pnpm build 2>&1 | tail -20
|
||||||
|
|
||||||
|
# Verificar migrations pendentes
|
||||||
|
rg "migration\|migrate" --include='*.ts' <modulo>-migracao/src/ -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Gerar Relatório
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Diagnóstico de Deploy — [nome do módulo]
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
- **Containers:** N ativos / N esperados
|
||||||
|
- **Healthchecks:** N configurados
|
||||||
|
- **Variáveis de ambiente:** N validadas / N sem validação
|
||||||
|
- **Build:** ✅ OK | ❌ Falha
|
||||||
|
|
||||||
|
## Problemas Detectados
|
||||||
|
|
||||||
|
### 🔴 Crítico
|
||||||
|
| Área | Problema | Impacto | Ação |
|
||||||
|
|------|----------|---------|------|
|
||||||
|
|
||||||
|
### 🟡 Moderado
|
||||||
|
| Área | Problema | Impacto | Ação |
|
||||||
|
|------|----------|---------|------|
|
||||||
|
|
||||||
|
## Plano de Ação
|
||||||
|
1. ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Skill: `global/skills/diagnosticar-antes-corrigir/SKILL`
|
||||||
108
skills/diagnosticar-saude-frontend/SKILL.md
Normal file
108
skills/diagnosticar-saude-frontend/SKILL.md
Normal file
|
|
@ -0,0 +1,108 @@
|
||||||
|
---
|
||||||
|
name: diagnosticar-saude-frontend
|
||||||
|
description: >
|
||||||
|
Diagnóstico sistemático de saúde do frontend: componentes, composables,
|
||||||
|
estados de UI, acessibilidade e integração com API.
|
||||||
|
scope: local
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Diagnosticar Saúde do Frontend
|
||||||
|
|
||||||
|
## Objetivo
|
||||||
|
|
||||||
|
Analisar a saúde de um módulo frontend Vue 3 para identificar problemas antes de corrigi-los.
|
||||||
|
|
||||||
|
## Etapas
|
||||||
|
|
||||||
|
### 1. Verificar Estrutura de Componentes
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar componentes e tamanho
|
||||||
|
fd "*.vue" <modulo>-front/src/ --exec wc -l {} | sort -rn | head -20
|
||||||
|
|
||||||
|
# Detectar componentes acima do limite (250 linhas)
|
||||||
|
fd "*.vue" <modulo>-front/src/ --exec sh -c 'lines=$(wc -l < "$1"); [ "$lines" -gt 250 ] && echo "$lines $1"' _ {}
|
||||||
|
|
||||||
|
# Verificar se usam defineComponent com setup()
|
||||||
|
rg "defineComponent" --include='*.vue' <modulo>-front/src/ -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Verificar Estados de Interface
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Detectar componentes sem estado de loading
|
||||||
|
rg "loading|carregando|isLoading" --include='*.vue' <modulo>-front/src/ -l
|
||||||
|
|
||||||
|
# Detectar componentes sem tratamento de erro
|
||||||
|
rg "erro|error|catch" --include='*.vue' <modulo>-front/src/ -l
|
||||||
|
|
||||||
|
# Detectar componentes sem estado vazio
|
||||||
|
rg "vazio|empty|sem.*dados|nenhum" --include='*.vue' <modulo>-front/src/ -l
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Verificar Integração com Schemas
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Verificar se schemas são importados do *-comuns
|
||||||
|
rg "from.*comuns" --include='*.ts' --include='*.vue' <modulo>-front/src/ | head -20
|
||||||
|
|
||||||
|
# Detectar schemas redefinidos no front (violação)
|
||||||
|
rg "z\.object\(\{" --include='*.ts' --include='*.vue' <modulo>-front/src/ -l
|
||||||
|
|
||||||
|
# Detectar uso de any
|
||||||
|
rg "as any|: any" --include='*.ts' --include='*.vue' <modulo>-front/src/ -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Verificar Composables
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Listar composables existentes
|
||||||
|
fd "use*.ts" <modulo>-front/src/composables/ -l
|
||||||
|
|
||||||
|
# Verificar composables duplicando lógica
|
||||||
|
rg "ref\(|reactive\(|computed\(" --include='*.vue' <modulo>-front/src/ -c | sort -t: -k2 -rn | head -10
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Verificar Mensagens ao Usuário
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Detectar mensagens técnicas expostas ao usuário
|
||||||
|
rg "Error:|Exception:|null|undefined|NaN" --include='*.vue' <modulo>-front/src/ -n
|
||||||
|
|
||||||
|
# Verificar se mensagens usam linguagem do domínio
|
||||||
|
rg "snackbar\|toast\|notify\|mensagem\|alerta" --include='*.vue' --include='*.ts' <modulo>-front/src/ -n
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Gerar Relatório
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Diagnóstico Frontend — [nome do módulo]
|
||||||
|
|
||||||
|
## Resumo
|
||||||
|
- **Componentes analisados:** N
|
||||||
|
- **Composables verificados:** N
|
||||||
|
- **Problemas encontrados:** N
|
||||||
|
|
||||||
|
## Problemas Detectados
|
||||||
|
|
||||||
|
### 🔴 Crítico
|
||||||
|
| Componente | Problema | Impacto | Ação |
|
||||||
|
|------------|----------|---------|------|
|
||||||
|
|
||||||
|
### 🟡 Moderado
|
||||||
|
| Componente | Problema | Impacto | Ação |
|
||||||
|
|------------|----------|---------|------|
|
||||||
|
|
||||||
|
### 🟢 Baixo
|
||||||
|
| Componente | Problema | Impacto | Ação |
|
||||||
|
|------------|----------|---------|------|
|
||||||
|
|
||||||
|
## Plano de Correção (priorizado)
|
||||||
|
1. ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/diagnostico-antes-correcao`
|
||||||
|
- Skill: `global/skills/diagnosticar-antes-corrigir/SKILL`
|
||||||
|
- Rule: `global/rules/estrutura-vue` (via front)
|
||||||
161
skills/documentar-decisao-tecnica/SKILL.md
Normal file
161
skills/documentar-decisao-tecnica/SKILL.md
Normal file
|
|
@ -0,0 +1,161 @@
|
||||||
|
---
|
||||||
|
name: documentar-decisao-tecnica
|
||||||
|
scope: global
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
description: >
|
||||||
|
Guia operacional para registrar decisões técnicas e arquiteturais como ADRs (Architecture Decision Records).
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Documentar Decisão Técnica (ADR)
|
||||||
|
|
||||||
|
Use esta skill sempre que uma decisão técnica significativa for tomada — escolha de biblioteca, mudança de arquitetura, padrão de código, migração, ou qualquer decisão que afete múltiplos pacotes ou desenvolvedores.
|
||||||
|
|
||||||
|
O objetivo é garantir que **nenhuma decisão fique apenas na cabeça** ou perdida em conversas.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quando usar
|
||||||
|
|
||||||
|
- Nova dependência adicionada ao monorepo
|
||||||
|
- Mudança de padrão arquitetural (ex: de REST para GraphQL)
|
||||||
|
- Escolha de ferramenta ou lib entre alternativas
|
||||||
|
- Decisão de breaking change
|
||||||
|
- Migração de tecnologia
|
||||||
|
- Mudança de estratégia de deploy ou CI/CD
|
||||||
|
- Qualquer decisão que alguém pode questionar daqui 3 meses
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 1 — Criar o Diretório de ADRs (se não existir)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p .docs/adrs
|
||||||
|
```
|
||||||
|
|
||||||
|
Convenção de diretório: `.docs/adrs/` na raiz do monorepo.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 2 — Criar o Arquivo ADR
|
||||||
|
|
||||||
|
Nomenclatura: `NNN-titulo-em-kebab-case.md`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Encontrar o próximo número
|
||||||
|
NEXT=$(ls .docs/adrs/*.md 2>/dev/null | wc -l | xargs -I{} expr {} + 1)
|
||||||
|
NEXT=$(printf "%03d" $NEXT)
|
||||||
|
echo "Próximo ADR: $NEXT"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 3 — Preencher o Template
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# ADR-NNN: Título Descritivo da Decisão
|
||||||
|
|
||||||
|
**Data:** YYYY-MM-DD
|
||||||
|
**Status:** proposto | aceito | substituído por ADR-XXX | descontinuado
|
||||||
|
**Autores:** Nome(s)
|
||||||
|
|
||||||
|
## Contexto
|
||||||
|
|
||||||
|
Descreva a situação que levou à necessidade de uma decisão.
|
||||||
|
Inclua:
|
||||||
|
- O problema enfrentado
|
||||||
|
- Restrições técnicas ou de negócio
|
||||||
|
- O que motivou a discussão
|
||||||
|
|
||||||
|
## Decisão
|
||||||
|
|
||||||
|
Descreva a decisão tomada de forma clara e direta.
|
||||||
|
Use voz ativa: "Decidimos usar X para Y porque Z."
|
||||||
|
|
||||||
|
## Alternativas Consideradas
|
||||||
|
|
||||||
|
### Alternativa A: [Nome]
|
||||||
|
- **Prós:** ...
|
||||||
|
- **Contras:** ...
|
||||||
|
- **Motivo da rejeição:** ...
|
||||||
|
|
||||||
|
### Alternativa B: [Nome]
|
||||||
|
- **Prós:** ...
|
||||||
|
- **Contras:** ...
|
||||||
|
- **Motivo da rejeição:** ...
|
||||||
|
|
||||||
|
## Consequências
|
||||||
|
|
||||||
|
### Positivas
|
||||||
|
- O que melhora com essa decisão
|
||||||
|
|
||||||
|
### Negativas
|
||||||
|
- O que fica mais complexo ou limitado
|
||||||
|
- Débitos técnicos introduzidos
|
||||||
|
|
||||||
|
### Neutras
|
||||||
|
- Mudanças que não são boas nem ruins, mas afetam o workflow
|
||||||
|
|
||||||
|
## Impacto no Monorepo
|
||||||
|
|
||||||
|
Listar quais pacotes/módulos são afetados:
|
||||||
|
- `@org/pacote-a` — precisa migrar de X para Y
|
||||||
|
- `@org/pacote-b` — sem impacto
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 4 — Conectar com o Sistema de Conhecimento
|
||||||
|
|
||||||
|
Após criar o ADR, avaliar se a decisão deve gerar:
|
||||||
|
|
||||||
|
| A decisão... | Ação |
|
||||||
|
|-------------|------|
|
||||||
|
| Cria uma **restrição** permanente (ex: "nunca usar lib X") | Criar/atualizar uma **Rule** em `.agent/local/rules/` |
|
||||||
|
| Define um **processo** repetível (ex: "para migrar, faça X, Y, Z") | Criar/atualizar um **Workflow** em `.agent/local/workflows/` |
|
||||||
|
| Refina um **padrão operacional** (ex: "queries agora usam pool separado") | Atualizar a **Skill** correspondente em `.agent/local/skills/` |
|
||||||
|
| Não gera artefato adicional | Apenas o ADR é suficiente |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 5 — Validar o ADR
|
||||||
|
|
||||||
|
Antes de considerar completo:
|
||||||
|
|
||||||
|
- **Teste do "daqui a 6 meses"**: alguém que não participou da conversa consegue entender a decisão?
|
||||||
|
- **Teste da reversibilidade**: está claro o que seria necessário para reverter essa decisão?
|
||||||
|
- **Teste do impacto**: todos os pacotes afetados estão listados?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Exemplos de ADRs Reais
|
||||||
|
|
||||||
|
### Bom ✅
|
||||||
|
|
||||||
|
> **ADR-003: Usar Zod para validação de schemas em vez de Joi**
|
||||||
|
>
|
||||||
|
> **Contexto:** O projeto usava Joi para validação no backend, mas ao compartilhar schemas entre back e front em um monorepo, Joi se mostrou pesado para o bundle do frontend (280KB gzipped).
|
||||||
|
>
|
||||||
|
> **Decisão:** Migrar para Zod em todos os pacotes. Zod oferece inferência nativa de tipos TypeScript, é 10x menor, e elimina a necessidade de manter tipos e schemas separados.
|
||||||
|
|
||||||
|
### Ruim ❌
|
||||||
|
|
||||||
|
> **ADR-003: Usar Zod**
|
||||||
|
>
|
||||||
|
> Decidimos usar Zod porque é melhor.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist Final
|
||||||
|
|
||||||
|
- [ ] O contexto explica o "porquê" da decisão?
|
||||||
|
- [ ] As alternativas consideradas estão documentadas?
|
||||||
|
- [ ] As consequências (positivas e negativas) estão claras?
|
||||||
|
- [ ] Os pacotes impactados estão listados?
|
||||||
|
- [ ] O status está definido (proposto/aceito)?
|
||||||
|
- [ ] A decisão gerou rules/workflows/skills quando aplicável?
|
||||||
|
- [ ] Alguém de fora do contexto entenderia este ADR?
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Workflow: `global/workflows/aprimorar-IA` (seção de classificação de artefatos)
|
||||||
|
- Workflow: `global/workflows/otimizar-codigos`
|
||||||
131
skills/documentar-dominio-modulo/SKILL.md
Normal file
131
skills/documentar-dominio-modulo/SKILL.md
Normal file
|
|
@ -0,0 +1,131 @@
|
||||||
|
---
|
||||||
|
name: documentar-dominio-modulo
|
||||||
|
scope: global
|
||||||
|
updatedAt: "2026-06-01"
|
||||||
|
description: >
|
||||||
|
Guia para documentar o domínio científico/técnico de cada módulo SaaS,
|
||||||
|
garantindo que o agente compreenda a terminologia e as regras do domínio
|
||||||
|
ao gerar código, texto e interface.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Skill: Documentar Domínio de um Módulo
|
||||||
|
|
||||||
|
Use esta skill ao iniciar um novo módulo SaaS ou ao perceber que o agente não conhece o vocabulário e as regras do domínio que o módulo aborda.
|
||||||
|
|
||||||
|
Cada módulo opera em uma disciplina diferente da ciência/gestão ambiental (licenciamento, gases de efeito estufa, resíduos, projetos, etc.). O agente precisa de uma **base factual do domínio** para gerar labels, mensagens, regras de negócio e textos comerciais corretos.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 1 — Identificar o Domínio do Módulo
|
||||||
|
|
||||||
|
Determinar qual área da ciência/gestão o módulo aborda:
|
||||||
|
|
||||||
|
| Exemplo de módulo | Domínio |
|
||||||
|
|---|---|
|
||||||
|
| Licenciamento | Licenciamento ambiental (LP, LI, LO, condicionantes) |
|
||||||
|
| GEE | Gases de Efeito Estufa (inventário, emissões, fatores) |
|
||||||
|
| Resíduos | Gestão de resíduos sólidos (PGRS, MTR, classificação) |
|
||||||
|
| Outorga | Outorga de uso de recursos hídricos |
|
||||||
|
| Flora/Fauna | Monitoramento de biodiversidade |
|
||||||
|
| Projetos | Gestão de projetos ambientais e consultorias |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 2 — Criar o Arquivo de Domínio
|
||||||
|
|
||||||
|
Criar documento no arquivo `.regras-negocio.md` do módulo:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Domínio: <Nome do Módulo>
|
||||||
|
|
||||||
|
## Área de Conhecimento
|
||||||
|
Breve descrição da disciplina (1-3 linhas).
|
||||||
|
|
||||||
|
## Glossário do Módulo
|
||||||
|
|
||||||
|
| Termo | Definição | Sigla |
|
||||||
|
|---|---|---|
|
||||||
|
| Licença Prévia | Autorização para planejamento do empreendimento | LP |
|
||||||
|
| Licença de Instalação | Autorização para início das obras | LI |
|
||||||
|
| ... | ... | ... |
|
||||||
|
|
||||||
|
## Entidades Principais
|
||||||
|
|
||||||
|
Lista das entidades de negócio do módulo com descrição e relações:
|
||||||
|
|
||||||
|
- **Empreendimento**: unidade física onde ocorre a atividade potencialmente poluidora
|
||||||
|
- **Licença**: autorização ambiental vinculada a um empreendimento
|
||||||
|
- **Condicionante**: obrigação imposta pelo órgão ambiental na licença
|
||||||
|
- ...
|
||||||
|
|
||||||
|
## Legislação Aplicável
|
||||||
|
|
||||||
|
| Norma | Descrição | Relevância |
|
||||||
|
|---|---|---|
|
||||||
|
| Lei 6.938/1981 | Política Nacional do Meio Ambiente | Base legal do licenciamento |
|
||||||
|
| Resolução CONAMA 237/1997 | Regulamenta o licenciamento ambiental | Tipos de licença, prazos |
|
||||||
|
| ... | ... | ... |
|
||||||
|
|
||||||
|
## Regras de citação legal
|
||||||
|
- Formato: "Resolução CONAMA nº 237/1997, art. 8º, inciso I"
|
||||||
|
- Toda sigla na primeira ocorrência com nome por extenso
|
||||||
|
- Legislação federal > estadual > municipal (hierarquia)
|
||||||
|
|
||||||
|
## Fluxos do Domínio
|
||||||
|
|
||||||
|
Descrever os processos-chave que o módulo implementa:
|
||||||
|
|
||||||
|
1. Solicitação de licença → Análise técnica → Emissão → Monitoramento
|
||||||
|
2. Cadastro de condicionante → Acompanhamento de prazo → Cumprimento
|
||||||
|
|
||||||
|
## Vocabulário de Interface
|
||||||
|
|
||||||
|
Termos que devem ser usados em labels, botões e mensagens:
|
||||||
|
|
||||||
|
| Contexto | ❌ Genérico | ✅ Correto para o módulo |
|
||||||
|
|---|---|---|
|
||||||
|
| Campo de nome | "Nome" | "Razão Social do Empreendedor" |
|
||||||
|
| Status | "Ativo/Inativo" | "Vigente/Vencida/Suspensa" |
|
||||||
|
| Ação principal | "Criar novo" | "Solicitar nova licença" |
|
||||||
|
| Lista vazia | "Nenhum registro" | "Nenhuma licença cadastrada" |
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 3 — Validar com o Operador
|
||||||
|
|
||||||
|
Antes de consolidar:
|
||||||
|
|
||||||
|
- [ ] Os termos do glossário estão corretos para o contexto do módulo?
|
||||||
|
- [ ] As entidades cobrem os conceitos centrais?
|
||||||
|
- [ ] A legislação listada é a principal (não exaustiva)?
|
||||||
|
- [ ] O vocabulário de interface reflete como o usuário fala no dia a dia?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PASSO 4 — Conectar com as Rules
|
||||||
|
|
||||||
|
Após documentar o domínio:
|
||||||
|
|
||||||
|
1. Verificar se labels e mensagens no código usam o vocabulário definido (rule `mensagens-usuario`)
|
||||||
|
2. Verificar se schemas Zod têm mensagens de erro no idioma do domínio (rule `zod-validacao-padrao`)
|
||||||
|
3. Verificar se os arquivos `.ajuda.md` usam termos do glossário (workflow `adicionar-ajuda.md`)
|
||||||
|
4. Verificar se textos comerciais citam a legislação corretamente (workflow `comercial`)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist Final
|
||||||
|
|
||||||
|
- [ ] Arquivo `.regras-negocio.md` do módulo criado e validado?
|
||||||
|
- [ ] Glossário com pelo menos os 10 termos centrais do módulo?
|
||||||
|
- [ ] Entidades principais listadas com descrição?
|
||||||
|
- [ ] Legislação base documentada com formato de citação?
|
||||||
|
- [ ] Vocabulário de interface definido (labels, status, ações, empty states)?
|
||||||
|
- [ ] Operador validou a terminologia?
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- Rule: `global/rules/mensagens-usuario`
|
||||||
|
- Rule: `global/rules/regras-negocio-md`
|
||||||
|
- Workflow: `agents/comercial/workflows/comercial`
|
||||||
|
- Workflow: `agents/front/workflows/adicionar-ajuda`
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue