aprimoração de ia

This commit is contained in:
Luiz Silva 2026-08-10 16:18:49 -03:00
parent 1177e31e56
commit 4a9f5f70ff
109 changed files with 8835 additions and 55 deletions

View 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`

View 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`

View 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`

View 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`

View 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)

View 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

View 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`

View 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`

View 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`

View 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`

View 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`

View 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`

View 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`

View 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`

View 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`

View 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`

View file

@ -5,43 +5,43 @@
"artefatos": {
"global": {
"rules": [
"global/rules/autonomia-agente",
"global/rules/carta-principios-agente-azteca",
"global/rules/consultar-banco-query-ia",
"global/rules/css-global-betha",
"global/rules/diagnostico-antes-correcao",
"global/rules/escrita-natural",
"global/rules/estilos-design-system",
"global/rules/feedback-visivel",
"global/rules/fronteiras-monorepo",
"global/rules/funcoes-anonimas-arrow",
"global/rules/jsdoc-padrao",
"global/rules/limite-linhas",
"global/rules/mensagens-usuario",
"global/rules/modal-dialog-padrao-betha",
"global/rules/proibido-commit-ia",
"global/rules/regras-negocio-md",
"global/rules/theme-provider-mui-betha",
"global/rules/tsconfig-ignore-deprecations",
"global/rules/typescript-module-resolution",
"global/rules/typescript-sem-any",
"global/rules/zod-validacao-padrao"
"global/rules/autonomia-agente.md",
"global/rules/carta-principios-agente-azteca.md",
"global/rules/consultar-banco-query-ia.md",
"global/rules/css-global-betha.md",
"global/rules/diagnostico-antes-correcao.md",
"global/rules/escrita-natural.md",
"global/rules/estilos-design-system.md",
"global/rules/feedback-visivel.md",
"global/rules/fronteiras-monorepo.md",
"global/rules/funcoes-anonimas-arrow.md",
"global/rules/jsdoc-padrao.md",
"global/rules/limite-linhas.md",
"global/rules/mensagens-usuario.md",
"global/rules/modal-dialog-padrao-betha.md",
"global/rules/proibido-commit-ia.md",
"global/rules/regras-negocio-md.md",
"global/rules/theme-provider-mui-betha.md",
"global/rules/tsconfig-ignore-deprecations.md",
"global/rules/typescript-module-resolution.md",
"global/rules/typescript-sem-any.md",
"global/rules/zod-validacao-padrao.md"
],
"workflows": [
"global/workflows/aprimora-ia",
"global/workflows/documentar-regras-negocio",
"global/workflows/otimizar-codigos",
"global/workflows/ux"
"global/workflows/aprimora-ia.md",
"global/workflows/documentar-regras-negocio.md",
"global/workflows/otimizar-codigos.md",
"global/workflows/ux.md"
],
"skills": [
"global/skills/criar-schema-zod/SKILL",
"global/skills/diagnosticar-antes-corrigir/SKILL",
"global/skills/diagnosticar-erros-build/SKILL",
"global/skills/documentar-decisao-tecnica/SKILL",
"global/skills/documentar-dominio-modulo/SKILL",
"global/skills/documentar-regras-negocio/SKILL",
"global/skills/mapear-codigo-fonte/SKILL",
"global/skills/orquestrar-agentes/SKILL"
"global/skills/criar-schema-zod/SKILL.md",
"global/skills/diagnosticar-antes-corrigir/SKILL.md",
"global/skills/diagnosticar-erros-build/SKILL.md",
"global/skills/documentar-decisao-tecnica/SKILL.md",
"global/skills/documentar-dominio-modulo/SKILL.md",
"global/skills/documentar-regras-negocio/SKILL.md",
"global/skills/mapear-codigo-fonte/SKILL.md",
"global/skills/orquestrar-agentes/SKILL.md"
]
},
"agents": {
@ -53,93 +53,93 @@
"persona": "agents/arquiteto/persona",
"config": "agents/arquiteto/agent.json",
"skills": [
"agents/arquiteto/skills/auditar-arquitetura-modulo/SKILL"
"agents/arquiteto/skills/auditar-arquitetura-modulo/SKILL.md"
]
},
"back": {
"persona": "agents/back/persona",
"config": "agents/back/agent.json",
"skills": [
"agents/back/skills/diagnosticar-saude-backend/SKILL"
"agents/back/skills/diagnosticar-saude-backend/SKILL.md"
]
},
"comercial": {
"persona": "agents/comercial/persona",
"config": "agents/comercial/agent.json",
"workflows": [
"agents/comercial/workflows/comercial",
"agents/comercial/workflows/marketing",
"agents/comercial/workflows/orcamento",
"agents/comercial/workflows/reels"
"agents/comercial/workflows/comercial.md",
"agents/comercial/workflows/marketing.md",
"agents/comercial/workflows/orcamento.md",
"agents/comercial/workflows/reels.md"
]
},
"deploy": {
"persona": "agents/deploy/persona",
"config": "agents/deploy/agent.json",
"skills": [
"agents/deploy/skills/diagnosticar-saude-deploy/SKILL"
"agents/deploy/skills/diagnosticar-saude-deploy/SKILL.md"
]
},
"documentacao": {
"persona": "agents/documentacao/persona",
"config": "agents/documentacao/agent.json",
"skills": [
"agents/documentacao/skills/diagnosticar-lacunas-documentacao/SKILL"
"agents/documentacao/skills/diagnosticar-lacunas-documentacao/SKILL.md"
]
},
"front": {
"persona": "agents/front/persona",
"config": "agents/front/agent.json",
"rules": [
"agents/front/rules/estrutura-vue"
"agents/front/rules/estrutura-vue.md"
],
"workflows": [
"agents/front/workflows/adicionar-ajuda",
"agents/front/workflows/criar-fluxograma"
"agents/front/workflows/adicionar-ajuda.md",
"agents/front/workflows/criar-fluxograma.md"
],
"skills": [
"agents/front/skills/diagnosticar-saude-frontend/SKILL"
"agents/front/skills/diagnosticar-saude-frontend/SKILL.md"
]
},
"land": {
"persona": "agents/land/persona",
"config": "agents/land/agent.json",
"rules": [
"agents/land/rules/copywriting-landing"
"agents/land/rules/copywriting-landing.md"
],
"workflows": [
"agents/land/workflows/criar-landing-page"
"agents/land/workflows/criar-landing-page.md"
]
},
"refatorar": {
"persona": "agents/refatorar/persona",
"config": "agents/refatorar/agent.json",
"rules": [
"agents/refatorar/rules/design-patterns-pragmatico",
"agents/refatorar/rules/refatoracao-segura",
"agents/refatorar/rules/solid-compliance"
"agents/refatorar/rules/design-patterns-pragmatico.md",
"agents/refatorar/rules/refatoracao-segura.md",
"agents/refatorar/rules/solid-compliance.md"
],
"workflows": [
"agents/refatorar/workflows/refatorar-modulo"
"agents/refatorar/workflows/refatorar-modulo.md"
],
"skills": [
"agents/refatorar/skills/diagnosticar-code-smells/SKILL"
"agents/refatorar/skills/diagnosticar-code-smells/SKILL.md"
]
},
"testes": {
"persona": "agents/testes/persona",
"config": "agents/testes/agent.json",
"skills": [
"agents/testes/skills/diagnosticar-cobertura-testes/SKILL"
"agents/testes/skills/diagnosticar-cobertura-testes/SKILL.md"
]
},
"ux": {
"persona": "agents/ux/persona",
"config": "agents/ux/agent.json",
"skills": [
"agents/ux/skills/auditar-ux-heuristicas/SKILL"
"agents/ux/skills/auditar-ux-heuristicas/SKILL.md"
]
}
}
}
}
}

View file

@ -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
View 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.

View 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**.

View 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)

View 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
View 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`

View 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`

View 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
View 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.

View 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
View 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
View 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)

View 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`

View 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
View 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
View 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
View 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)

View 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`

View 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

View 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
View 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
View 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`

View 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`

View 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`

View 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`

View 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)

View 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)

View 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
View 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.

View 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`

View 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
View 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)

View 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)

View 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.

View 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`

View 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`

View 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`

View 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

View 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`

View 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`

View 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`

View 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`

View 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)

View 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`

View 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