@lugom.io/hefesto 0.3.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agents/hefesto-argos.md +51 -237
- package/agents/hefesto-athena.md +59 -339
- package/agents/hefesto-hermes.md +39 -71
- package/bin/install.js +105 -69
- package/hooks/hefesto-check-update.cjs +32 -11
- package/hooks/hefesto-statusline.cjs +8 -17
- package/hooks/hefesto-workflow.cjs +68 -0
- package/package.json +12 -2
- package/skills/hefesto-context/SKILL.md +59 -26
- package/skills/hefesto-debug/SKILL.md +54 -0
- package/skills/hefesto-design/SKILL.md +133 -143
- package/skills/hefesto-execute/SKILL.md +133 -0
- package/skills/hefesto-init/SKILL.md +94 -59
- package/skills/hefesto-init/references/api.md +116 -0
- package/skills/hefesto-init/references/cli.md +91 -0
- package/skills/hefesto-init/references/mobile.md +69 -0
- package/skills/hefesto-init/references/web.md +246 -0
- package/skills/hefesto-new-feature/SKILL.md +75 -41
- package/skills/hefesto-security/SKILL.md +89 -0
- package/skills/hefesto-security/references/boundaries-and-bypasses.md +152 -0
- package/skills/hefesto-security/references/secrets-detection.md +121 -0
- package/skills/hefesto-security/references/severity-and-judgment.md +176 -0
- package/skills/hefesto-simplify/SKILL.md +82 -0
- package/templates/TPL-CLAUDE.md +54 -0
- package/templates/TPL-CONFIG.json +19 -0
- package/templates/TPL-DESIGN.md +305 -0
- package/templates/{FEATURE.md → TPL-FEATURE.md} +13 -6
- package/templates/TPL-PROJECT.md +50 -0
- package/templates/{RECON.md → TPL-RECON.md} +10 -4
- package/templates/{RESEARCH.md → TPL-RESEARCH.md} +15 -15
- package/templates/TPL-SECURITY.md +42 -0
- package/templates/TPL-SIMPLIFY.md +40 -0
- package/templates/{STATE.md → TPL-STATE.md} +0 -6
- package/templates/TPL-VERDICT.md +34 -0
- package/skills/hefesto-design/data/animations.csv +0 -21
- package/skills/hefesto-design/data/anti-patterns.csv +0 -41
- package/skills/hefesto-design/data/charts.csv +0 -26
- package/skills/hefesto-design/data/colors.csv +0 -108
- package/skills/hefesto-design/data/components.csv +0 -31
- package/skills/hefesto-design/data/google-fonts.csv +0 -56
- package/skills/hefesto-design/data/icons.csv +0 -23
- package/skills/hefesto-design/data/landing-pages.csv +0 -28
- package/skills/hefesto-design/data/products.csv +0 -46
- package/skills/hefesto-design/data/spacing.csv +0 -16
- package/skills/hefesto-design/data/styles.csv +0 -53
- package/skills/hefesto-design/data/typography.csv +0 -41
- package/skills/hefesto-design/data/ux-rules.csv +0 -61
- package/skills/hefesto-design/references/accessibility.md +0 -335
- package/skills/hefesto-design/references/aesthetics.md +0 -343
- package/skills/hefesto-design/references/anti-patterns.md +0 -107
- package/skills/hefesto-design/references/checklist.md +0 -66
- package/skills/hefesto-design/references/color-psychology.md +0 -203
- package/skills/hefesto-design/references/component-specs.md +0 -318
- package/skills/hefesto-design/references/polish.md +0 -339
- package/skills/hefesto-design/references/token-architecture.md +0 -394
- package/skills/hefesto-design/references/ux-rules.md +0 -349
- package/skills/hefesto-design/scripts/__pycache__/audit.cpython-314.pyc +0 -0
- package/skills/hefesto-design/scripts/__pycache__/contrast.cpython-314.pyc +0 -0
- package/skills/hefesto-design/scripts/__pycache__/core.cpython-314.pyc +0 -0
- package/skills/hefesto-design/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
- package/skills/hefesto-design/scripts/__pycache__/search.cpython-314.pyc +0 -0
- package/skills/hefesto-design/scripts/__pycache__/validate_tokens.cpython-314.pyc +0 -0
- package/skills/hefesto-design/scripts/audit.py +0 -450
- package/skills/hefesto-design/scripts/contrast.py +0 -195
- package/skills/hefesto-design/scripts/core.py +0 -155
- package/skills/hefesto-design/scripts/design_system.py +0 -311
- package/skills/hefesto-design/scripts/search.py +0 -235
- package/skills/hefesto-design/scripts/validate_tokens.py +0 -274
- package/skills/hefesto-update/SKILL.md +0 -34
- package/templates/DESIGN.md +0 -137
- package/templates/PROJECT.md +0 -28
- package/templates/ROADMAP.md +0 -23
- package/templates/VERDICT.md +0 -52
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Detecção de Segredos
|
|
2
|
+
|
|
3
|
+
Regex por provider e padrões genéricos para detecção automatizada de segredos hardcoded. Inclui auditoria de `.gitignore`.
|
|
4
|
+
|
|
5
|
+
## Quick Index
|
|
6
|
+
|
|
7
|
+
- **API keys por provider** → "API Keys by Provider" (linha 12)
|
|
8
|
+
- **Padrões genéricos** → "Generic Patterns" (linha 31)
|
|
9
|
+
- **.env commitado** → ".env Committed" (linha 47)
|
|
10
|
+
- **Auditoria de .gitignore** → "Gitignore Audit" (linha 55)
|
|
11
|
+
- **Regex para grep** → "Grep Patterns" (linha 87)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## API Keys by Provider
|
|
16
|
+
|
|
17
|
+
| Provider | Prefixo / Padrão | Regex |
|
|
18
|
+
| ------------- | ---------------------- | -------------------------------------------------------- |
|
|
19
|
+
| **AWS** | `AKIA` (access key) | `AKIA[0-9A-Z]{16}` |
|
|
20
|
+
| **AWS** | Secret key | `['"]\w{40}['"]` proximo de `aws_secret` ou `AWS_SECRET` |
|
|
21
|
+
| **GCP** | Service account JSON | `"type":\s*"service_account"` em `.json` |
|
|
22
|
+
| **GCP** | API key | `AIza[0-9A-Za-z_-]{35}` |
|
|
23
|
+
| **GitHub** | Personal access token | `ghp_[0-9a-zA-Z]{36}` |
|
|
24
|
+
| **GitHub** | OAuth token | `gho_[0-9a-zA-Z]{36}` |
|
|
25
|
+
| **GitHub** | App token | `ghs_[0-9a-zA-Z]{36}` |
|
|
26
|
+
| **Stripe** | Secret key (live) | `sk_live_[0-9a-zA-Z]{24,}` |
|
|
27
|
+
| **Stripe** | Publishable key (live) | `pk_live_[0-9a-zA-Z]{24,}` |
|
|
28
|
+
| **Slack** | Bot token | `xoxb-[0-9]{10,}-[0-9a-zA-Z]{24,}` |
|
|
29
|
+
| **Slack** | User token | `xoxp-[0-9]{10,}-[0-9a-zA-Z]{24,}` |
|
|
30
|
+
| **Anthropic** | API key | `sk-ant-[0-9a-zA-Z_-]{80,}` |
|
|
31
|
+
| **OpenAI** | API key | `sk-[0-9a-zA-Z]{48,}` |
|
|
32
|
+
| **Twilio** | Account SID | `AC[0-9a-f]{32}` |
|
|
33
|
+
| **SendGrid** | API key | `SG\.[0-9A-Za-z_-]{22}\.[0-9A-Za-z_-]{43}` |
|
|
34
|
+
| **Mailgun** | API key | `key-[0-9a-zA-Z]{32}` |
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Generic Patterns
|
|
39
|
+
|
|
40
|
+
| Tipo | O que procurar | Regex |
|
|
41
|
+
| ----------------------- | -------------------------------------------------- | ---------------------------------------------------------------------- |
|
|
42
|
+
| **API key generica** | Variavel com nome sugestivo atribuida a string | `(?:api_key\|apikey\|api_secret\|secret_key)\s*=\s*['"][^'"]{10,}['"]` |
|
|
43
|
+
| **Password hardcoded** | Variavel password/senha atribuida a string | `(?:password\|passwd\|pwd\|senha)\s*=\s*['"][^'"]+['"]` |
|
|
44
|
+
| **JWT hardcoded** | String que comeca com `eyJ` (base64 de `{"`) | `['"]eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]+['"]` |
|
|
45
|
+
| **URL com credentials** | `user:pass@` em URL | `https?://[^/\s:]+:[^/\s@]+@` |
|
|
46
|
+
| **Connection string** | MongoDB, Postgres, MySQL, Redis | `(?:mongodb\|postgres\|mysql\|redis)://[^/\s:]+:[^/\s@]+@` |
|
|
47
|
+
| **SSH private key** | Begin/end markers | `-----BEGIN (?:RSA\|DSA\|EC\|OPENSSH) PRIVATE KEY-----` |
|
|
48
|
+
| **Arquivo de key** | Extensoes de arquivo sensiveis | `\.(pem\|key\|p12\|pfx\|keystore)$` em arquivos tracked |
|
|
49
|
+
| **Base64 longa** | Strings base64 suspeitas (>40 chars) em atribuicao | `['"][A-Za-z0-9+/=]{40,}['"]` proximo de `key\|secret\|token` |
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## .env Committed
|
|
54
|
+
|
|
55
|
+
Verificar se `.env` esta no git:
|
|
56
|
+
|
|
57
|
+
1. `git ls-files .env .env.local .env.production .env.staging` — se retorna algo, esta commitado
|
|
58
|
+
2. Verificar `.gitignore` — se `.env` nao esta listado, qualquer .env futuro sera commitado
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Gitignore Audit
|
|
63
|
+
|
|
64
|
+
Verificar que estes padroes estao em `.gitignore`:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
# Secrets e credentials
|
|
68
|
+
.env
|
|
69
|
+
.env.local
|
|
70
|
+
.env.production
|
|
71
|
+
.env.staging
|
|
72
|
+
*.pem
|
|
73
|
+
*.key
|
|
74
|
+
*.p12
|
|
75
|
+
*.pfx
|
|
76
|
+
*.keystore
|
|
77
|
+
credentials.json
|
|
78
|
+
service-account*.json
|
|
79
|
+
*-credentials.json
|
|
80
|
+
|
|
81
|
+
# IDE e sistema
|
|
82
|
+
.idea/
|
|
83
|
+
.vscode/settings.json
|
|
84
|
+
*.swp
|
|
85
|
+
.DS_Store
|
|
86
|
+
|
|
87
|
+
# Databases locais
|
|
88
|
+
*.sqlite
|
|
89
|
+
*.sqlite3
|
|
90
|
+
*.db
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Se `.gitignore` nao tem estes padroes, reportar como ⚠ warning.
|
|
94
|
+
|
|
95
|
+
Se algum destes arquivos ja esta tracked (`git ls-files`), reportar como 🔴 critical — precisam ser removidos do tracking com `git rm --cached`.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Grep Patterns
|
|
100
|
+
|
|
101
|
+
Regex prontos para busca automatizada com `Grep` tool.
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
AKIA[0-9A-Z]{16}
|
|
105
|
+
AIza[0-9A-Za-z_-]{35}
|
|
106
|
+
ghp_[0-9a-zA-Z]{36}
|
|
107
|
+
gho_[0-9a-zA-Z]{36}
|
|
108
|
+
sk_live_[0-9a-zA-Z]{24,}
|
|
109
|
+
pk_live_[0-9a-zA-Z]{24,}
|
|
110
|
+
xoxb-[0-9]{10,}
|
|
111
|
+
xoxp-[0-9]{10,}
|
|
112
|
+
sk-ant-[0-9a-zA-Z_-]{80,}
|
|
113
|
+
sk-[0-9a-zA-Z]{48,}
|
|
114
|
+
SG\.[0-9A-Za-z_-]{22}
|
|
115
|
+
-----BEGIN\s+(?:RSA|DSA|EC|OPENSSH)\s+PRIVATE\s+KEY
|
|
116
|
+
eyJ[A-Za-z0-9_-]{10,}\.eyJ
|
|
117
|
+
(?:password|passwd|pwd|senha)\s*=\s*['"][^'"]+['"]
|
|
118
|
+
(?:api_key|apikey|api_secret|secret_key)\s*=\s*['"][^'"]{10,}['"]
|
|
119
|
+
https?://[^/\s:]+:[^/\s@]+@
|
|
120
|
+
(?:mongodb|postgres|mysql|redis)://[^/\s:]+:[^/\s@]+@
|
|
121
|
+
```
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# Severidade e Julgamento
|
|
2
|
+
|
|
3
|
+
Critérios universais para classificar findings, evitar falsos positivos e calibrar decisões de fix.
|
|
4
|
+
|
|
5
|
+
## Quick Index
|
|
6
|
+
|
|
7
|
+
- **Níveis de severidade** → "Severity Levels" (linha 14)
|
|
8
|
+
- **Falhas silenciosas** → "Silent Failures" (linha 50)
|
|
9
|
+
- **Quando NÃO reportar** → "When NOT to Report" (linha 108)
|
|
10
|
+
- **SEMPRE reportar** → "When to ALWAYS Report" (linha 156)
|
|
11
|
+
- **Migrations e schema** → "Migration and Schema Changes" (linha 172)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Severity Levels
|
|
16
|
+
|
|
17
|
+
### Critical — aplicar fix automaticamente
|
|
18
|
+
|
|
19
|
+
Condições (independente de linguagem):
|
|
20
|
+
|
|
21
|
+
- Erro completamente ignorado (catch vazio, erro descartado, bare except equivalente)
|
|
22
|
+
- Processo pode crashar ou ficar em estado inconsistente
|
|
23
|
+
- Panic/crash engolido sem log
|
|
24
|
+
- Segredos de produção hardcoded
|
|
25
|
+
- Input de usuário direto em code execution, shell commands, ou queries sem sanitização
|
|
26
|
+
- Desserialização de dados não confiáveis usando deserializadores inseguros
|
|
27
|
+
- Permissões excessivas de filesystem (world-writable)
|
|
28
|
+
|
|
29
|
+
### Warning — aplicar fix se seguro, perguntar se altera comportamento
|
|
30
|
+
|
|
31
|
+
Condições:
|
|
32
|
+
|
|
33
|
+
- Erro logado mas não propagado (pode ser intencional)
|
|
34
|
+
- Valor default pode confundir chamador (retorna `[]` ou `null` em vez de erro)
|
|
35
|
+
- Catch/except muito amplo mas pelo menos trata o erro
|
|
36
|
+
- Validação ausente em trust boundary
|
|
37
|
+
- Configuração permissiva (CORS wildcard, debug mode, crypto fraco)
|
|
38
|
+
- Rate limiting ausente em endpoints sensíveis (login, reset, signup)
|
|
39
|
+
- Queries sem limit/pagination
|
|
40
|
+
|
|
41
|
+
### Info — apenas reportar
|
|
42
|
+
|
|
43
|
+
Condições:
|
|
44
|
+
|
|
45
|
+
- Optional chaining ou null coalescing que pode ser intencional
|
|
46
|
+
- Error handling via context managers sem except explícito
|
|
47
|
+
- Configuração que pode ser intencional no contexto
|
|
48
|
+
- Minor code smells sem impacto de segurança direto
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Silent Failures
|
|
53
|
+
|
|
54
|
+
Falhas silenciosas são um dos riscos mais subestimados em segurança. Quando erros são engolidos, bugs ficam invisíveis em produção — incluindo bugs de segurança.
|
|
55
|
+
|
|
56
|
+
### Categorias universais
|
|
57
|
+
|
|
58
|
+
Estas categorias se aplicam a **qualquer linguagem** — os mecanismos mudam (try/catch, error returns, Result types, defer, promises), mas os anti-padrões são os mesmos:
|
|
59
|
+
|
|
60
|
+
| Categoria | Definição | Severidade |
|
|
61
|
+
| --------------------------- | --------------------------------------------------------------------------------------------- | ---------- |
|
|
62
|
+
| **Swallowed errors** | Erro capturado/retornado e completamente ignorado. Sem log, sem propagação, sem feedback | critical |
|
|
63
|
+
| **Log-only handling** | Erro logado mas execução continua como se fosse sucesso. Chamador não sabe que houve falha | warning |
|
|
64
|
+
| **Deceptive defaults** | Handler retorna valor indistinguível de sucesso (lista vazia, null, zero) sem indicar erro | warning |
|
|
65
|
+
| **Overly broad catching** | Captura todos os erros quando só específicos eram esperados, escondendo bugs não relacionados | warning |
|
|
66
|
+
| **Abandoned intent** | Handler com TODO/FIXME — intenção de tratar nunca materializada | critical |
|
|
67
|
+
| **Panic/crash suppression** | Mecanismo de recovery (recover, catch-all, global handler) que suprime sem logar | critical |
|
|
68
|
+
|
|
69
|
+
### O que procurar (por paradigma)
|
|
70
|
+
|
|
71
|
+
| Paradigma | Mecanismos a inspecionar |
|
|
72
|
+
| -------------------------------------------------------- | ------------------------------------------------------------------------------- |
|
|
73
|
+
| **Exception-based** (JS/TS, Python, Java, C#, Ruby, PHP) | try/catch/except blocks, promise .catch(), global exception handlers |
|
|
74
|
+
| **Error-return** (Go, Rust, C) | `_ = err`, `Result` não verificado, errno ignorado |
|
|
75
|
+
| **Event-based** (Node.js, browsers) | EventEmitters sem handler de 'error', unhandled rejection handlers |
|
|
76
|
+
| **Async** (qualquer) | Promises/Futures sem tratamento de rejeição, async sem try/catch em entrypoints |
|
|
77
|
+
| **Deferred cleanup** (Go defer, Python with, C++ RAII) | Erros em cleanup ignorados (ex: close() falha em escrita) |
|
|
78
|
+
|
|
79
|
+
### Quando silenciamento é aceitável
|
|
80
|
+
|
|
81
|
+
Não reportar como critical se:
|
|
82
|
+
|
|
83
|
+
- **Cleanup code** — tentativa de deletar temp file em finally/defer. Falha não é crítica
|
|
84
|
+
- **Feature detection** — testar se recurso existe, catch para saber que não existe
|
|
85
|
+
- **Documentado** — catch com comentário explicando por que é intencional
|
|
86
|
+
- **Best-effort** — operações explicitamente opcionais (ex: enviar analytics, prefetch de cache)
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## When NOT to Report
|
|
91
|
+
|
|
92
|
+
### Test code
|
|
93
|
+
|
|
94
|
+
Arquivos em diretórios ou com padrões de teste:
|
|
95
|
+
|
|
96
|
+
- `*.test.*`, `*.spec.*`, `__tests__/`, `test_*`, `*_test.go`, `*_test.py`, `*_test.rs`, `*Test.java`, `*_test.rb`, `tests/`, `spec/`
|
|
97
|
+
- Exceção: se o teste usa input de PRODUÇÃO ou segredos reais → reportar
|
|
98
|
+
|
|
99
|
+
### Static/literal input
|
|
100
|
+
|
|
101
|
+
- O valor perigoso é uma string fixa no código, não controlada pelo usuário
|
|
102
|
+
- `eval("2 + 2")` é code smell, não vulnerabilidade
|
|
103
|
+
- Pode ser mencionado como ℹ info, nunca como 🔴 critical
|
|
104
|
+
|
|
105
|
+
### Sanitization present
|
|
106
|
+
|
|
107
|
+
- Existe validação/sanitização entre a fonte de input e a operação perigosa
|
|
108
|
+
- Procurar: schema validation, type guards, sanitization functions, parameterized queries, middleware de validação
|
|
109
|
+
- Se a sanitização está presente mas é insuficiente → reportar com contexto
|
|
110
|
+
|
|
111
|
+
### Generated code
|
|
112
|
+
|
|
113
|
+
- Arquivos com header de auto-geração, em diretórios de código gerado (ex: `components/ui/`, migrations geradas por ORM, código de protobuf)
|
|
114
|
+
- Vulnerabilidades devem ser reportadas ao gerador, não corrigidas inline
|
|
115
|
+
|
|
116
|
+
### Dependencies
|
|
117
|
+
|
|
118
|
+
- Código em diretórios de dependência (`node_modules/`, `vendor/`, `site-packages/`, `.cargo/`, `Pods/`, etc.)
|
|
119
|
+
- Escopo de ferramentas de auditoria de dependências, não desta revisão
|
|
120
|
+
|
|
121
|
+
### Secret exceptions
|
|
122
|
+
|
|
123
|
+
| Situação | Por quê |
|
|
124
|
+
| -------------------------------------------------------------------- | ---------------------------------------------------------------------- |
|
|
125
|
+
| Valores em `.env.example` / `.env.template` | Placeholders, não segredos reais |
|
|
126
|
+
| Referências a variáveis de ambiente (leitura, não valor) | Estão usando env vars corretamente |
|
|
127
|
+
| Valores em arquivos de teste que são claramente mock | Fixtures intencionais |
|
|
128
|
+
| Keys de modo teste de providers (ex: `sk_test_`, `pk_test_`) | Keys de teste são públicas por design |
|
|
129
|
+
| Keys de exemplo em documentação | Exemplos pedagógicos |
|
|
130
|
+
| Variáveis marcadas como públicas pelo framework (ex: `NEXT_PUBLIC_`) | Intencionalmente públicas — mas verificar que não contêm secrets reais |
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## When to ALWAYS Report
|
|
135
|
+
|
|
136
|
+
Independente de contexto — estas são sempre vulnerabilidades:
|
|
137
|
+
|
|
138
|
+
| Situação | Por quê |
|
|
139
|
+
| ---------------------------------------------------------------------------------- | --------------------------------------------- |
|
|
140
|
+
| Secrets de produção hardcoded (live API keys, SSH private keys, credentials reais) | Compromisso imediato se repositório é público |
|
|
141
|
+
| `.env` com valores reais commitado no git | Credenciais no git history permanentemente |
|
|
142
|
+
| Desserialização insegura de dados de rede | Arbitrary code execution |
|
|
143
|
+
| Shell execution com input de usuário não sanitizado | Command injection |
|
|
144
|
+
| Permissões excessivas em filesystem (world-writable, 777) | Qualquer processo pode modificar |
|
|
145
|
+
| Private key no repositório | Compromisso criptográfico |
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Migration and Schema Changes
|
|
150
|
+
|
|
151
|
+
### Operações destrutivas
|
|
152
|
+
|
|
153
|
+
| Operação | Risco | Verificação necessária |
|
|
154
|
+
| ---------------------------- | ---------------------------------------- | ---------------------------------------------------------------- |
|
|
155
|
+
| DROP TABLE / DROP COLLECTION | Perda de dados irreversível | Backup confirmado. Dados migrados antes |
|
|
156
|
+
| DROP COLUMN / Remove field | Perda de dados da coluna | Confirmar que campo não é usado. Deploy em fases |
|
|
157
|
+
| TRUNCATE / Delete all | Deleta todos os registros | Nunca em migration de produção sem backup |
|
|
158
|
+
| ALTER TYPE / Change schema | Pode falhar com dados existentes | Testar com dados reais. Considerar nova coluna + migrar + dropar |
|
|
159
|
+
| RENAME | Quebra código que referencia nome antigo | Deploy em fases com período de compatibilidade |
|
|
160
|
+
|
|
161
|
+
### Seed files
|
|
162
|
+
|
|
163
|
+
- Sem passwords reais em seeds
|
|
164
|
+
- Sem API keys de produção em dados de seed
|
|
165
|
+
- Sem PII real (usar dados fake)
|
|
166
|
+
- Guard de ambiente: seeds não devem ser executáveis em produção
|
|
167
|
+
|
|
168
|
+
### Permissões
|
|
169
|
+
|
|
170
|
+
| Contexto | Princípio |
|
|
171
|
+
| ------------------------ | ----------------------------------------------------------- |
|
|
172
|
+
| User da aplicação | Apenas CRUD nas tabelas da app. Sem CREATE/DROP/ALTER/GRANT |
|
|
173
|
+
| User de migration | Pode ter DDL. Não deve ser usado pelo app em runtime |
|
|
174
|
+
| Connection string do app | Apontar para user da aplicação, não admin/root |
|
|
175
|
+
| Backups | SELECT apenas |
|
|
176
|
+
| Row-level security | Habilitar em tabelas multi-tenant onde suportado |
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hefesto-simplify
|
|
3
|
+
description: >
|
|
4
|
+
Revisão de código para reuso, qualidade e eficiência. Corrige issues preservando funcionalidade.
|
|
5
|
+
ATIVAR quando: "simplificar", "refatorar", "code review", "código duplicado", "limpar código",
|
|
6
|
+
"otimizar", "extrair pra lib", "checar qualidade", "código repetido", "performance".
|
|
7
|
+
Também: revisar reuso de utilitários, code smells, leaky abstractions, memory leaks.
|
|
8
|
+
user-invocable: true
|
|
9
|
+
disable-model-invocation: false
|
|
10
|
+
argument-hint: '[arquivos ou escopo opcional]'
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Hefesto Simplify
|
|
14
|
+
|
|
15
|
+
Revisão de código modificado focada em reuso, qualidade e eficiência. Corrige issues encontradas preservando funcionalidade.
|
|
16
|
+
|
|
17
|
+
## Fase 1 — Identificar Escopo
|
|
18
|
+
|
|
19
|
+
Rodar `git diff` (ou `git diff HEAD` se houver staged changes) para ver o que mudou. Determinar o escopo:
|
|
20
|
+
|
|
21
|
+
1. Se argumentos foram fornecidos (paths de arquivos), usar esses arquivos como escopo
|
|
22
|
+
2. Senão, identificar a feature ativa:
|
|
23
|
+
- Ler `.hefesto/STATE.md` → seção "Feature Ativa"
|
|
24
|
+
- Se houver feature ativa, ler o frontmatter do arquivo da feature em `.hefesto/features/`
|
|
25
|
+
- Usar `git diff --name-only` para listar arquivos modificados e não comitados
|
|
26
|
+
3. Fallback: `git diff --name-only HEAD~1`
|
|
27
|
+
4. Se nenhuma mudança no git, revisar os arquivos mais recentemente modificados que o usuário mencionou ou que foram editados anteriormente na conversa
|
|
28
|
+
5. Filtrar: incluir apenas arquivos de código-fonte (`.ts`, `.tsx`, `.js`, `.jsx`, `.py`, `.go`, `.rs`, `.java`, etc.). Excluir: `node_modules/`, `.next/`, `dist/`, `build/`, arquivos de configuração, lockfiles, testes, arquivos gerados
|
|
29
|
+
|
|
30
|
+
## Fase 2 — Lançar Três Agentes de Revisão em Paralelo
|
|
31
|
+
|
|
32
|
+
Usar a ferramenta Agent para lançar os três agentes concorrentemente em uma única mensagem. Passar para cada agente o diff completo para que tenha o contexto completo.
|
|
33
|
+
|
|
34
|
+
### Agent 1: Code Reuse Review
|
|
35
|
+
|
|
36
|
+
Para cada mudança:
|
|
37
|
+
|
|
38
|
+
1. **Buscar utilitários e helpers existentes** que possam substituir código recém-escrito. Procurar padrões similares em outros lugares do codebase — locais comuns são diretórios de utilitários, módulos compartilhados e arquivos adjacentes aos modificados
|
|
39
|
+
2. **Flaggar qualquer função nova que duplica funcionalidade existente.** Sugerir a função existente para usar no lugar
|
|
40
|
+
3. **Flaggar lógica inline que poderia usar utilitário existente** — manipulação de string manual, path handling customizado, checks de ambiente ad-hoc, type guards manuais e padrões similares são candidatos comuns
|
|
41
|
+
4. **Duplicação cross-feature**: para funções exportadas nos arquivos do escopo, grep pelo nome em todo o projeto (excluindo o arquivo de origem). Se encontrar implementação idêntica ou muito similar em outro local, flaggar e sugerir extração para módulo compartilhado
|
|
42
|
+
5. **Helpers não externalizados**: identificar funções helper definidas dentro de componentes/módulos que não dependem de state/props local e são genéricas o suficiente para compartilhar. Verificar se já existe algo similar nos diretórios compartilhados do projeto
|
|
43
|
+
|
|
44
|
+
### Agent 2: Code Quality Review
|
|
45
|
+
|
|
46
|
+
Revisar as mesmas mudanças para padrões problemáticos:
|
|
47
|
+
|
|
48
|
+
1. **Redundant state**: state que duplica state existente, valores cacheados que poderiam ser derivados, observers/effects que poderiam ser chamadas diretas
|
|
49
|
+
2. **Parameter sprawl**: adicionar novos parâmetros a uma função ao invés de generalizar ou reestruturar os existentes
|
|
50
|
+
3. **Copy-paste com variação leve**: blocos de código near-duplicate que deveriam ser unificados com uma abstração compartilhada
|
|
51
|
+
4. **Leaky abstractions**: expor detalhes internos que deveriam ser encapsulados, ou quebrar boundaries de abstração existentes
|
|
52
|
+
5. **Stringly-typed code**: usar strings raw onde constants, enums (string unions) ou branded types já existem no codebase
|
|
53
|
+
6. **Unnecessary JSX nesting**: wrapper Boxes/elements que não adicionam valor de layout — verificar se props do componente interno (flexShrink, alignItems, etc.) já fornecem o comportamento necessário
|
|
54
|
+
7. **Unnecessary comments**: comentários explicando O QUE o código faz (identificadores bem nomeados já fazem isso), narrando a mudança, ou referenciando task/caller — deletar; manter apenas WHY não óbvio (constraints escondidas, invariantes sutis, workarounds)
|
|
55
|
+
8. **Ternários aninhados**: substituir por `if/else` ou `switch`. Um nível de ternário é ok; dois ou mais precisa simplificar
|
|
56
|
+
9. **Nesting excessivo**: funções com mais de 3 níveis de indentação. Aplicar early return ou extrair subfunção
|
|
57
|
+
10. **Código morto**: imports não usados, variáveis declaradas mas não referenciadas, branches de condição inalcançáveis
|
|
58
|
+
11. **Nomes pouco descritivos**: variáveis de 1-2 letras (exceto iteradores `i`, `j`), nomes genéricos como `data`, `temp`, `result` quando o contexto permite ser mais específico
|
|
59
|
+
12. **Abstrações prematuras**: wrappers que apenas chamam outra função sem adicionar lógica, abstrações de uso único (classes, interfaces, factories usadas por apenas um consumidor), configurabilidade excessiva (parâmetros que só têm um valor possível)
|
|
60
|
+
13. **Padrões do projeto**: ler `CLAUDE.md` e `.hefesto/PROJECT.md` (se existir). Comparar código do escopo contra convenções estabelecidas — imports, naming conventions, error handling, estrutura de features. Reportar desvios
|
|
61
|
+
|
|
62
|
+
### Agent 3: Efficiency Review
|
|
63
|
+
|
|
64
|
+
Revisar as mesmas mudanças para eficiência:
|
|
65
|
+
|
|
66
|
+
1. **Trabalho desnecessário**: computações redundantes, leituras de arquivo repetidas, chamadas de rede/API duplicadas, padrões N+1
|
|
67
|
+
2. **Concorrência perdida**: operações independentes executadas sequencialmente quando poderiam ser paralelas
|
|
68
|
+
3. **Hot-path bloat**: novo trabalho bloqueante adicionado a startup ou hot paths per-request/per-render
|
|
69
|
+
4. **Updates recorrentes no-op**: updates de state/store dentro de polling loops, intervals, ou event handlers que disparam incondicionalmente — adicionar guard de change-detection para que consumidores downstream não sejam notificados quando nada mudou. Também: se uma função wrapper recebe um callback updater/reducer, verificar que respeita retornos same-reference (ou qualquer que seja o sinal de "sem mudança") — senão, early-return no-ops dos callers são silenciosamente derrotados
|
|
70
|
+
5. **Checks de existência desnecessários**: verificar existência de arquivo/recurso antes de operar (anti-pattern TOCTOU) — operar diretamente e tratar o erro
|
|
71
|
+
6. **Memory**: data structures unbounded, cleanup faltando, event listener leaks
|
|
72
|
+
7. **Operações broad demais**: ler arquivos inteiros quando apenas uma porção é necessária, carregar todos os items quando filtrando por um
|
|
73
|
+
|
|
74
|
+
## Fase 3 — Aplicar Correções
|
|
75
|
+
|
|
76
|
+
Aguardar os três agentes completarem. Agregar os findings e corrigir cada issue diretamente. Se um finding é false positive ou não vale a pena endereçar, anotar e seguir em frente — não argumentar com o finding, apenas pular.
|
|
77
|
+
|
|
78
|
+
Restrições: não modificar configs/testes/gerados, respeitar boundaries de packages em monorepo, rodar `verification.commands` após fixes.
|
|
79
|
+
|
|
80
|
+
Relatório via `TPL-SIMPLIFY.md`. Omitir dimensões sem issues. Código limpo → confirmar sem relatório.
|
|
81
|
+
|
|
82
|
+
Funciona sem `.hefesto/` (usa `git diff` e `CLAUDE.md`). Se invocado pelo `/hefesto-execute`, relatório vai para o Argos.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
Este arquivo orienta o Claude Code (claude.ai/code) ao trabalhar com o código deste repositório.
|
|
4
|
+
|
|
5
|
+
# {{PROJECT_NAME}}
|
|
6
|
+
|
|
7
|
+
{{PROJECT_DESCRIPTION}}
|
|
8
|
+
|
|
9
|
+
## Comandos
|
|
10
|
+
|
|
11
|
+
{{COMMANDS}}
|
|
12
|
+
|
|
13
|
+
## Arquitetura
|
|
14
|
+
|
|
15
|
+
{{ARCHITECTURE}}
|
|
16
|
+
|
|
17
|
+
## Convenções
|
|
18
|
+
|
|
19
|
+
{{CONVENTIONS}}
|
|
20
|
+
|
|
21
|
+
## Idioma
|
|
22
|
+
|
|
23
|
+
- Comunicação com o usuário: Português BR
|
|
24
|
+
- Identificadores de código: Inglês
|
|
25
|
+
|
|
26
|
+
## Hefesto
|
|
27
|
+
|
|
28
|
+
Este projeto usa o [Hefesto](https://www.npmjs.com/package/@lugom.io/hefesto) para gestão de features e desenvolvimento feature-driven.
|
|
29
|
+
|
|
30
|
+
### Estrutura .hefesto/
|
|
31
|
+
|
|
32
|
+
- `PROJECT.md` — Visão, restrições, features e decisões
|
|
33
|
+
- `STATE.md` — Memória entre sessões (manter < 80 linhas)
|
|
34
|
+
- `config.json` — Configuração e counters
|
|
35
|
+
- `features/` — Documentos de feature (FEAT-NNN-slug.md)
|
|
36
|
+
- `research/` — Documentos de pesquisa (RES-NNN-slug.md)
|
|
37
|
+
- `DESIGN.md` — Contrato visual (cores, tipografia, componentes, tokens)
|
|
38
|
+
|
|
39
|
+
### Skills disponíveis
|
|
40
|
+
|
|
41
|
+
- `/hefesto-init` — Inicializar ou atualizar configuração do projeto
|
|
42
|
+
- `/hefesto-new-feature` — Criar nova feature
|
|
43
|
+
- `/hefesto-execute` — Executar implementação de feature (verificação + QA loop)
|
|
44
|
+
- `/hefesto-debug` — Debugging sistemático (causa raiz → hipótese → fix)
|
|
45
|
+
- `/hefesto-design` — Criar contrato visual do projeto
|
|
46
|
+
- `/hefesto-security` — Auditoria de segurança (OWASP, secrets, boundaries)
|
|
47
|
+
- `/hefesto-simplify` — Simplificação e reuso de código
|
|
48
|
+
|
|
49
|
+
### Workflow
|
|
50
|
+
|
|
51
|
+
1. Features seguem o ciclo: `draft` → `ready` → `active` → `done`
|
|
52
|
+
2. Cada feature tem Fases de implementação (stories atômicas)
|
|
53
|
+
3. `STATE.md` é atualizado a cada mudança de estado
|
|
54
|
+
4. IDs são sequenciais e nunca reutilizados
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "{{HEFESTO_VERSION}}",
|
|
3
|
+
"project": {
|
|
4
|
+
"name": "",
|
|
5
|
+
"description": "",
|
|
6
|
+
"language": "pt-BR",
|
|
7
|
+
"platform": "",
|
|
8
|
+
"lang": "",
|
|
9
|
+
"monorepo": false
|
|
10
|
+
},
|
|
11
|
+
"runtime": "claude",
|
|
12
|
+
"feature": { "id_prefix": "FEAT", "counter": 0 },
|
|
13
|
+
"research": { "id_prefix": "RES", "counter": 0 },
|
|
14
|
+
"design": { "status": "none" },
|
|
15
|
+
"verification": {
|
|
16
|
+
"commands": [],
|
|
17
|
+
"auto_detect": true
|
|
18
|
+
}
|
|
19
|
+
}
|