@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,246 @@
|
|
|
1
|
+
# Preset: Web
|
|
2
|
+
|
|
3
|
+
## Stack
|
|
4
|
+
|
|
5
|
+
- Next.js (App Router) + TypeScript
|
|
6
|
+
- TailwindCSS + shadcn/ui
|
|
7
|
+
- Vitest + Playwright
|
|
8
|
+
- ESLint + Prettier
|
|
9
|
+
- T3 Env + Zod
|
|
10
|
+
- pnpm (package manager)
|
|
11
|
+
|
|
12
|
+
## Scaffold
|
|
13
|
+
|
|
14
|
+
### 1. Criar projeto Next.js
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pnpx create-next-app@latest . --typescript --tailwind --eslint --app --src-dir --import-alias "@/*" --turbopack --yes
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Após o scaffold, deletar arquivos genéricos gerados: `rm -f CLAUDE.md AGENTS.md`
|
|
21
|
+
|
|
22
|
+
**Diretório não vazio:** se `.hefesto/` ou `package.json` já existem, criar num subdiretório temporário e mover:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
pnpx create-next-app@latest .tmp-scaffold --typescript --tailwind --eslint --app --src-dir --import-alias "@/*" --turbopack --yes
|
|
26
|
+
mv .tmp-scaffold/* . && mv .tmp-scaffold/.gitignore . 2>/dev/null && mv .tmp-scaffold/.eslintrc* . 2>/dev/null
|
|
27
|
+
rmdir .tmp-scaffold
|
|
28
|
+
rm -f CLAUDE.md AGENTS.md
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### 2. shadcn/ui
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pnpx shadcn@latest init -d
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 3. Prettier
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
pnpm add -D prettier prettier-plugin-tailwindcss eslint-config-prettier
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Criar `.prettierrc` (semi, singleQuote, trailingComma all, plugin tailwindcss). Criar `.prettierignore` (node_modules, .next, dist, coverage, .claude, .hefesto). Adicionar `eslint-config-prettier` ao ESLint config.
|
|
44
|
+
|
|
45
|
+
Scripts: `format`, `format:check`.
|
|
46
|
+
|
|
47
|
+
### 4. Vitest
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
pnpm add -D vitest @vitejs/plugin-react @testing-library/react @testing-library/dom @testing-library/user-event @testing-library/jest-dom jsdom vite-tsconfig-paths
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Criar `vitest.config.ts` (jsdom, react plugin, tsconfigPaths, setup em `tests/setup.ts`, include `src/**/*.test.*` e `tests/unit/**`). Criar `tests/setup.ts` com import de `@testing-library/jest-dom/vitest`.
|
|
54
|
+
|
|
55
|
+
Scripts: `test`, `test:watch`, `test:coverage`.
|
|
56
|
+
|
|
57
|
+
### 5. Playwright
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
pnpm add -D @playwright/test
|
|
61
|
+
pnpx playwright install --with-deps chromium
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Criar `playwright.config.ts` (testDir `tests/e2e`, baseURL localhost:3000, webServer com `pnpm dev`).
|
|
65
|
+
|
|
66
|
+
Script: `test:e2e`.
|
|
67
|
+
|
|
68
|
+
### 6. T3 Env + Zod
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
pnpm add @t3-oss/env-nextjs zod
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Criar `src/lib/env.ts` com `createEnv` (server: NODE_ENV, client: vazio). Importar `./src/lib/env.ts` no topo de `next.config.ts`. Criar `.env.example`. Adicionar `.env`, `.env.local`, `.env.production` ao `.gitignore`.
|
|
75
|
+
|
|
76
|
+
### 7. Limpar boilerplate
|
|
77
|
+
|
|
78
|
+
- `src/app/page.tsx` → página limpa com `<h1>` do nome do projeto
|
|
79
|
+
- `src/app/globals.css` → apenas imports Tailwind + variáveis shadcn
|
|
80
|
+
- Remover assets padrão em `public/` (next.svg, vercel.svg)
|
|
81
|
+
- Simplificar `src/app/layout.tsx`
|
|
82
|
+
|
|
83
|
+
### 8. Criar estrutura feature-based
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
mkdir -p src/features src/hooks src/services src/types tests/unit tests/e2e
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Criar `.gitkeep` nos diretórios vazios.
|
|
90
|
+
|
|
91
|
+
### 9. Formatação inicial
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
pnpm format
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Arquitetura e Convenções
|
|
100
|
+
|
|
101
|
+
### Feature-based
|
|
102
|
+
|
|
103
|
+
Código organizado por domínio em `src/features/`. Cada feature:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
src/features/<nome>/
|
|
107
|
+
├── components/ ← componentes da feature
|
|
108
|
+
├── hooks/ ← hooks da feature
|
|
109
|
+
├── services/ ← lógica de negócio e chamadas de API
|
|
110
|
+
├── types/ ← tipos e interfaces
|
|
111
|
+
└── index.ts ← barrel export (API pública)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Compartilhado entre features fica em `src/` raiz: `components/`, `components/ui/` (shadcn), `hooks/`, `services/`, `types/`, `lib/`.
|
|
115
|
+
|
|
116
|
+
### Princípios
|
|
117
|
+
|
|
118
|
+
1. **Features não importam de outras features.** Código compartilhado sobe para `src/`.
|
|
119
|
+
2. **`src/app/` só contém rotas e layouts.** Lógica fica em `src/features/`.
|
|
120
|
+
3. **Barrel exports** — importar do índice: `import { LoginForm } from '@/features/auth'`.
|
|
121
|
+
4. **Sem `any`** — usar `unknown` e narrowing.
|
|
122
|
+
5. **Validação nas bordas** — inputs de usuário e APIs externas com Zod.
|
|
123
|
+
6. **Env validado** — usar `env` de `@/lib/env`, nunca `process.env` direto.
|
|
124
|
+
|
|
125
|
+
### Naming
|
|
126
|
+
|
|
127
|
+
| Elemento | Convenção | Exemplo |
|
|
128
|
+
| ----------- | ------------------ | ---------------------- |
|
|
129
|
+
| Componentes | PascalCase | `ProductCard.tsx` |
|
|
130
|
+
| Hooks | useCamelCase | `useProducts.ts` |
|
|
131
|
+
| Serviços | camelCase.service | `auth.service.ts` |
|
|
132
|
+
| Tipos | PascalCase | `User`, `AuthResult` |
|
|
133
|
+
| Constantes | SCREAMING_SNAKE | `MAX_ITEMS_PER_PAGE` |
|
|
134
|
+
| Testes | .test.ts/.test.tsx | `auth.service.test.ts` |
|
|
135
|
+
|
|
136
|
+
### Testes
|
|
137
|
+
|
|
138
|
+
- **Co-localizados** (`src/**/*.test.ts`) — lógica de negócio. Ficam ao lado do arquivo.
|
|
139
|
+
- **De feature** (`tests/unit/`) — testes criados pelo Argos para validar requisitos. Nome: `feat-NNN-slug.test.ts`.
|
|
140
|
+
- **E2E** (`tests/e2e/`) — fluxos críticos com Playwright.
|
|
141
|
+
|
|
142
|
+
### Next.js 16 — `proxy.ts`
|
|
143
|
+
|
|
144
|
+
No Next.js 16, `middleware.ts` foi substituído por `proxy.ts` (runtime Node.js em vez de Edge). Função exportada: `proxy` em vez de `middleware`. Para migrar: `npx @next/codemod@canary middleware-to-proxy .`
|
|
145
|
+
|
|
146
|
+
Para proteção de rotas, preferir Server Components com `redirect()`.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Receitas
|
|
151
|
+
|
|
152
|
+
Padrões prontos para adotar conforme a feature precisar. **Não são instaladas no scaffold** — usar quando o projeto demandar.
|
|
153
|
+
|
|
154
|
+
### Data Fetching — TanStack Query
|
|
155
|
+
|
|
156
|
+
**Quando:** a feature precisa buscar, cachear ou sincronizar dados do servidor.
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
pnpm add @tanstack/react-query @tanstack/react-query-devtools
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Setup: criar `src/lib/query-client.ts` com `QueryClient` configurado (staleTime, gcTime). Criar `src/components/providers.tsx` com `QueryClientProvider` wrapping children + `ReactQueryDevtools` em dev. Adicionar o provider no `layout.tsx` (como Client Component).
|
|
163
|
+
|
|
164
|
+
Pattern de uso em features:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
src/features/products/
|
|
168
|
+
├── hooks/
|
|
169
|
+
│ └── use-products.ts ← useQuery + queryKey + fetch function
|
|
170
|
+
├── services/
|
|
171
|
+
│ └── products.service.ts ← fetch functions puras (sem hooks)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Hooks chamam services. Services são funções puras testáveis. Query keys seguem padrão `[feature, ...params]`.
|
|
175
|
+
|
|
176
|
+
### Formulários — React Hook Form + Zod
|
|
177
|
+
|
|
178
|
+
**Quando:** a feature tem formulários com validação.
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
pnpm add react-hook-form @hookform/resolvers
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Zod já está na stack. Usar `zodResolver` com `useForm`. Integrar com componentes `Form` do shadcn/ui (`npx shadcn@latest add form`).
|
|
185
|
+
|
|
186
|
+
Pattern: schema Zod define a validação, `useForm` gerencia o state, shadcn/ui `FormField` renderiza.
|
|
187
|
+
|
|
188
|
+
### Estado Global — Zustand
|
|
189
|
+
|
|
190
|
+
**Quando:** estado precisa ser compartilhado entre features sem prop drilling. Preferir para estado de UI (sidebar aberta, tema, filtros). Para dados do servidor, usar TanStack Query.
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
pnpm add zustand
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Pattern: um store por domínio em `src/features/<nome>/stores/`. Stores exportam hooks (`useCartStore`). Usar slices para stores complexas.
|
|
197
|
+
|
|
198
|
+
### Autenticação — Better Auth
|
|
199
|
+
|
|
200
|
+
**Quando:** a feature precisa de login, registro, sessões ou proteção de rotas.
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
pnpm add better-auth
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Setup: criar `src/lib/auth.ts` (server) com `betterAuth()` configurando database adapter e providers (email/password, Google, GitHub). Criar `src/lib/auth-client.ts` com `createAuthClient()`. Criar API route em `src/app/api/auth/[...all]/route.ts`.
|
|
207
|
+
|
|
208
|
+
Plugins úteis: `twoFactor()`, `magicLink()`, `organization()`.
|
|
209
|
+
|
|
210
|
+
Pattern de proteção: Server Components usam `auth.api.getSession()` + `redirect()`. Client Components usam `authClient.useSession()`.
|
|
211
|
+
|
|
212
|
+
### Banco de Dados — Drizzle ORM
|
|
213
|
+
|
|
214
|
+
**Quando:** a feature precisa persistir dados.
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
pnpm add drizzle-orm postgres
|
|
218
|
+
pnpm add -D drizzle-kit
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Setup: criar `src/db/index.ts` (connection com `postgres` driver). Criar `src/db/schema/` com schemas por domínio. Criar `drizzle.config.ts` apontando para o schema e connection string via `env.ts`, com `out: './src/db/migrations'`.
|
|
222
|
+
|
|
223
|
+
Estrutura:
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
src/db/
|
|
227
|
+
├── index.ts ← connection + export do db
|
|
228
|
+
├── schema/
|
|
229
|
+
│ ├── index.ts ← re-export de todos os schemas
|
|
230
|
+
│ └── users.ts
|
|
231
|
+
└── migrations/ ← geradas pelo drizzle-kit (out: './src/db/migrations')
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Adicionar `DATABASE_URL` ao T3 Env (`src/lib/env.ts`) e `.env.example`.
|
|
235
|
+
|
|
236
|
+
Scripts: `db:generate` (`drizzle-kit generate`), `db:migrate` (`drizzle-kit migrate`), `db:studio` (`drizzle-kit studio`).
|
|
237
|
+
|
|
238
|
+
Pattern: schemas em `src/db/schema/<dominio>.ts`, queries em `src/features/<nome>/services/`.
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## config.json
|
|
243
|
+
|
|
244
|
+
- platform: "web"
|
|
245
|
+
- lang: "typescript"
|
|
246
|
+
- monorepo: false
|
|
@@ -1,53 +1,87 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: hefesto-new-feature
|
|
3
|
-
description:
|
|
3
|
+
description: >
|
|
4
|
+
Cria o spec de uma nova feature no Hefesto. Coleta visão e requisitos, propõe abordagens,
|
|
5
|
+
decompõe em fases risk-first com rastreabilidade de requisitos.
|
|
6
|
+
Usar com: /hefesto-new-feature. Gera o documento FEAT-NNN — para implementar, usar
|
|
7
|
+
/hefesto-execute depois.
|
|
4
8
|
user-invocable: true
|
|
5
9
|
disable-model-invocation: true
|
|
6
10
|
---
|
|
7
11
|
|
|
8
12
|
# Hefesto New Feature
|
|
9
13
|
|
|
10
|
-
Cria um novo documento de feature em `.hefesto/features/`.
|
|
14
|
+
Cria um novo documento de feature em `.hefesto/features/`. Guia o usuário desde a visão inicial até um spec completo com requisitos testáveis, fases de implementação ordenadas por risco, e rastreabilidade requisito→fase.
|
|
11
15
|
|
|
12
16
|
## Pré-requisitos
|
|
13
17
|
|
|
14
|
-
Verificar se `.hefesto/` existe. Se não
|
|
15
|
-
|
|
16
|
-
##
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
18
|
+
Verificar se `.hefesto/` existe. Se não, sugerir `/hefesto-init`.
|
|
19
|
+
|
|
20
|
+
## Workflow
|
|
21
|
+
|
|
22
|
+
### Fase 0 — Explorar Contexto
|
|
23
|
+
|
|
24
|
+
Antes de perguntar, entender o terreno:
|
|
25
|
+
|
|
26
|
+
1. Ler `PROJECT.md` (valor central, stack, receitas), `STATE.md` (feature ativa, bloqueios), `config.json` (próximo ID)
|
|
27
|
+
2. Listar features existentes (frontmatter) — notar áreas cobertas, padrões de naming
|
|
28
|
+
3. Se há features `draft`/`blocked`, mencionar — talvez retomar em vez de criar nova
|
|
29
|
+
|
|
30
|
+
Resumo: `Projeto: X | Stack: Y | Features: N (X done, Y active) | Próxima: FEAT-NNN`
|
|
31
|
+
|
|
32
|
+
### Fase 1 — Entender a Feature
|
|
33
|
+
|
|
34
|
+
O objetivo é sair desta fase com entendimento completo do que construir. Conversar com o usuário até ter clareza — pode ser uma mensagem ou várias.
|
|
35
|
+
|
|
36
|
+
1. **Título** — curto e descritivo, identifica a feature de relance
|
|
37
|
+
2. **Problema** — qual dor ou necessidade motiva essa feature? Por que importa agora?
|
|
38
|
+
3. **Visão** — o que entrega e como o usuário se beneficia quando estiver pronta
|
|
39
|
+
4. **Fluxo do usuário** — passos concretos que o usuário percorre do início ao fim
|
|
40
|
+
5. **Requisitos** — testáveis, com critério claro de pass/fail. Perguntar: "como sei que está funcionando?"
|
|
41
|
+
6. **Fora do escopo** — o que explicitamente NÃO faz parte. Perguntar: "tem algo parecido que não devemos incluir?"
|
|
42
|
+
7. **Riscos/incertezas** — integração externa, tech nova, performance, dependência de terceiros
|
|
43
|
+
8. **Receitas** — Se o PROJECT.md contiver receitas, consultar e sugerir as relevantes (ex: feature com formulário → React Hook Form + Zod). Se não houver, pular
|
|
44
|
+
|
|
45
|
+
### Fase 2 — Propor Abordagens
|
|
46
|
+
|
|
47
|
+
Propor 2-3 abordagens com trade-offs quando relevante. Recomendar uma com razão concreta. Pular se feature é simples/óbvia.
|
|
48
|
+
|
|
49
|
+
### Fase 3 — Decompor em Fases
|
|
50
|
+
|
|
51
|
+
Seguir estrutura de `TPL-FEATURE.md` (seção "Implementação"). Para definições de status e ciclo de vida, ver `/hefesto-context`.
|
|
52
|
+
|
|
53
|
+
#### Risk-first ordering
|
|
54
|
+
|
|
55
|
+
Incerteza primeiro — invalidar premissas cedo. Se sem risco, ordenar por dependência natural.
|
|
56
|
+
|
|
57
|
+
#### Rastreabilidade REQ→Fase
|
|
58
|
+
|
|
59
|
+
Cada fase lista quais REQ-NN cobre. Verificar cobertura total — alertar se algum REQ ficou órfão.
|
|
60
|
+
|
|
61
|
+
Cada fase atômica (~30 min).
|
|
62
|
+
|
|
63
|
+
### Fase 4 — Detectar Escopo Excessivo
|
|
64
|
+
|
|
65
|
+
Se > 5 fases ou > 10 requisitos: alertar e sugerir divisão concreta. Advisory, não mandatório.
|
|
66
|
+
|
|
67
|
+
### Fase 5 — Self-Review
|
|
68
|
+
|
|
69
|
+
- [ ] Título claro (não genérico)
|
|
70
|
+
- [ ] Visão inclui O QUE e POR QUÊ
|
|
71
|
+
- [ ] Pelo menos 2 requisitos testáveis
|
|
72
|
+
- [ ] "Fora do Escopo" preenchido
|
|
73
|
+
- [ ] Fases atômicas com critérios de aceitação
|
|
74
|
+
|
|
75
|
+
Se falhar, pedir complemento. Se usuário disser "segue assim", respeitar.
|
|
76
|
+
|
|
77
|
+
### Fase 6 — Criar Arquivo
|
|
52
78
|
|
|
53
|
-
|
|
79
|
+
1. Gerar ID `FEAT-NNN` (counter + 1, zero-padded) e slug (lowercase, hifenizado, max 40 chars, sem acentos)
|
|
80
|
+
2. Ler `.hefesto/templates/TPL-FEATURE.md` e criar `.hefesto/features/FEAT-NNN-slug.md` substituindo placeholders
|
|
81
|
+
3. Atualizar `config.json` (feature.counter)
|
|
82
|
+
4. Atualizar tabela de Features em `PROJECT.md`
|
|
83
|
+
5. Atualizar `STATE.md` se for primeira feature ou nenhuma ativa
|
|
84
|
+
6. Seletor: "Promover para `ready` ou continuar iterando?"
|
|
85
|
+
- Se **ready**: atualizar status e STATE.md
|
|
86
|
+
- Se **iterar**: coletar ajustes, aplicar, repetir até promoção ou encerramento
|
|
87
|
+
7. Sugerir `/hefesto-execute` quando pronto
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hefesto-security
|
|
3
|
+
description: >
|
|
4
|
+
Revisão de segurança de código. Encontra vulnerabilidades e aplica fixes.
|
|
5
|
+
ATIVAR quando: "segurança", "security", "vulnerabilidade", "XSS", "injection", "OWASP",
|
|
6
|
+
"segredo exposto", "código seguro", "auditoria de segurança", "security review".
|
|
7
|
+
Também: padrões perigosos (eval, exec, deserialização), inputs não validados, falhas silenciosas.
|
|
8
|
+
user-invocable: true
|
|
9
|
+
disable-model-invocation: false
|
|
10
|
+
argument-hint: '[arquivos ou escopo opcional]'
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Hefesto Security
|
|
14
|
+
|
|
15
|
+
Revisão de segurança que encontra vulnerabilidades reais e aplica fixes concretos. Zero tolerância a falhas silenciosas e padrões perigosos.
|
|
16
|
+
|
|
17
|
+
## Princípios
|
|
18
|
+
|
|
19
|
+
1. **Falhas silenciosas são inaceitáveis** — catch vazio é bug escondido; todo erro deve ser logado
|
|
20
|
+
2. **Validar nas bordas** — inputs de usuário, APIs externas, env vars. Dados internos entre módulos não precisam
|
|
21
|
+
3. **Sem segredos em código** — API keys, tokens, passwords em variáveis de ambiente, nunca hardcoded
|
|
22
|
+
|
|
23
|
+
## Workflow
|
|
24
|
+
|
|
25
|
+
### Fase 1 — Identificar escopo
|
|
26
|
+
|
|
27
|
+
1. Se argumentos fornecidos → usar esses arquivos
|
|
28
|
+
2. Senão, buscar feature ativa:
|
|
29
|
+
- Ler `.hefesto/STATE.md` → extrair arquivos modificados do frontmatter
|
|
30
|
+
- Se STATE.md não existir ou não tiver arquivos → `git diff --name-only` (staged + unstaged)
|
|
31
|
+
3. Fallback → `git diff --name-only HEAD~1`
|
|
32
|
+
4. Filtrar apenas código-fonte (excluir binários, lock files, build artifacts, código gerado)
|
|
33
|
+
5. Excluir: diretórios de dependências, `dist/`, `build/`, `*.lock`, `*.lockb`, arquivos auto-gerados
|
|
34
|
+
|
|
35
|
+
### Fase 2 — Análise de vulnerabilidades
|
|
36
|
+
|
|
37
|
+
Ler `references/severity-and-judgment.md` — usar critérios de severidade e regras de falso positivo ao longo de toda a análise. Ler `references/boundaries-and-bypasses.md` — verificar cada boundary type aplicável.
|
|
38
|
+
|
|
39
|
+
Para cada arquivo no escopo, analisar semanticamente estas categorias universais:
|
|
40
|
+
|
|
41
|
+
1. **Code injection** — eval, exec, desserialização insegura, template injection, dynamic imports — em qualquer linguagem
|
|
42
|
+
2. **Data injection** — SQL, NoSQL, LDAP, command injection, XSS — em qualquer framework ou ORM
|
|
43
|
+
3. **Input validation gaps** — dados cruzando trust boundaries sem validação (consultar boundaries reference)
|
|
44
|
+
4. **Auth & access control** — rotas sem auth, IDOR, CORS permissivo, CSRF, missing role checks
|
|
45
|
+
5. **Insecure configuration** — debug mode em produção, headers de segurança ausentes, crypto fraco, default credentials
|
|
46
|
+
6. **Data exposure** — dados sensíveis em logs, responses, URLs, query params, error messages
|
|
47
|
+
7. **Resource exhaustion** — queries sem limit, missing pagination, missing timeouts, body size ilimitado
|
|
48
|
+
|
|
49
|
+
Para cada finding, avaliar contexto antes de reportar — consultar "When NOT to Report" na referencia de severidade.
|
|
50
|
+
|
|
51
|
+
### Fase 3 — Falhas silenciosas
|
|
52
|
+
|
|
53
|
+
Ler `references/severity-and-judgment.md` seção "Silent Failures" — contém as 6 categorias universais, critérios de classificação e exceções.
|
|
54
|
+
|
|
55
|
+
1. Encontrar todos os construtos de error handling na(s) linguagem(ns) detectada(s)
|
|
56
|
+
2. Classificar cada um usando as categorias e critérios da referência
|
|
57
|
+
3. Consultar "Quando silenciamento é aceitável" antes de reportar
|
|
58
|
+
|
|
59
|
+
### Fase 4 — Segredos
|
|
60
|
+
|
|
61
|
+
Ler `references/secrets-detection.md`.
|
|
62
|
+
|
|
63
|
+
1. Usar regex por provider e genericos para grep nos arquivos do escopo
|
|
64
|
+
2. Consultar "Exceptions" em `references/severity-and-judgment.md` antes de reportar — nem todo match e secret real
|
|
65
|
+
3. Verificar `.gitignore` conforme "Gitignore Audit"
|
|
66
|
+
4. Verificar se `.env` esta committed no git
|
|
67
|
+
|
|
68
|
+
### Fase 5 — Aplicar correções
|
|
69
|
+
|
|
70
|
+
1. Para issues **🔴 critical**: aplicar fix automaticamente
|
|
71
|
+
- Gerar correção apropriada para a linguagem/framework detectado
|
|
72
|
+
- Erros engolidos → adicionar log + re-throw ou return adequado
|
|
73
|
+
- Code injection → substituir por alternativa segura
|
|
74
|
+
- Segredos hardcoded → mover para variável de ambiente
|
|
75
|
+
- Queries com interpolação → parameterized queries
|
|
76
|
+
|
|
77
|
+
2. Para issues **⚠ warning**: aplicar fix se a correção é clara e segura. Para mudanças que alteram comportamento (ex: adicionar validação que pode rejeitar inputs), perguntar antes
|
|
78
|
+
|
|
79
|
+
3. Rodar verification commands após fixes para garantir que nada quebrou
|
|
80
|
+
|
|
81
|
+
4. Apresentar relatório no formato `TPL-SECURITY.md` — preencher todas as seções aplicáveis, omitir seções sem issues
|
|
82
|
+
|
|
83
|
+
## Notas
|
|
84
|
+
|
|
85
|
+
- Se o projeto não tiver `.hefesto/`, o skill funciona com `git diff` e `CLAUDE.md`
|
|
86
|
+
- Não reportar vulnerabilidades em dependências (escopo de ferramentas de audit de dependências)
|
|
87
|
+
- Não reportar issues em código gerado
|
|
88
|
+
- Priorizar issues com impacto real sobre issues teóricas
|
|
89
|
+
- Se invocado pelo `/hefesto-execute`, o relatório é passado para o Argos junto com o resultado da feature
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Boundaries e Bypass Techniques
|
|
2
|
+
|
|
3
|
+
Trust boundaries universais e tecnicas de bypass de validacao. Independente de linguagem ou framework.
|
|
4
|
+
|
|
5
|
+
## Quick Index
|
|
6
|
+
|
|
7
|
+
- **Tipos de boundary** → "Boundaries" (linha 12)
|
|
8
|
+
- **Tecnicas de bypass** → "Bypass Vectors" (linha 72)
|
|
9
|
+
- **Como detectar** → "How to Detect" (linha 117)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Boundaries
|
|
14
|
+
|
|
15
|
+
### Form inputs / JSON body
|
|
16
|
+
|
|
17
|
+
Dados submetidos via form HTML ou JSON body em POST/PUT/PATCH.
|
|
18
|
+
|
|
19
|
+
| O que verificar | Quando e problema |
|
|
20
|
+
| ------------------------------- | ---------------------------------------------------- |
|
|
21
|
+
| Usado diretamente em DB query | Sempre |
|
|
22
|
+
| Usado em operacao de filesystem | Sempre |
|
|
23
|
+
| Usado em redirect | Sempre |
|
|
24
|
+
| Tipos nao verificados | Se vem de JSON body (pode ser string, array, objeto) |
|
|
25
|
+
| Tamanho nao limitado | Se e string longa — DoS via payload gigante |
|
|
26
|
+
|
|
27
|
+
### Query params / route params
|
|
28
|
+
|
|
29
|
+
Dados na URL: `/users/:id?sort=name&order=asc`.
|
|
30
|
+
|
|
31
|
+
| O que verificar | Quando e problema |
|
|
32
|
+
| ------------------------------------ | ----------------------------- |
|
|
33
|
+
| Param numerico sem validacao de tipo | Sempre |
|
|
34
|
+
| Param usado em regex | Sempre — ReDoS |
|
|
35
|
+
| Param usado em path de filesystem | Sempre — path traversal |
|
|
36
|
+
| Sort/order sem whitelist | Se usado em query — injection |
|
|
37
|
+
| Pagination sem limites | Se usado em LIMIT — DoS |
|
|
38
|
+
|
|
39
|
+
### Respostas de API externa
|
|
40
|
+
|
|
41
|
+
Dados retornados por APIs de terceiros. Nao confiar mesmo em APIs "de confianca".
|
|
42
|
+
|
|
43
|
+
| O que verificar | Quando e problema |
|
|
44
|
+
| ------------------------------ | ------------------------------------- |
|
|
45
|
+
| Estrutura nao validada | Sempre — crash se estrutura mudou |
|
|
46
|
+
| Dados renderizados no frontend | Se contem HTML/JS — XSS stored |
|
|
47
|
+
| Status code nao verificado | Se assume sucesso |
|
|
48
|
+
| Dados usados em query | Sempre — injection via dados externos |
|
|
49
|
+
|
|
50
|
+
### Headers / Cookies
|
|
51
|
+
|
|
52
|
+
| O que verificar | Quando e problema |
|
|
53
|
+
| --------------------------------------------- | -------------------------------------------------------- |
|
|
54
|
+
| Cookie usado sem validacao | Se contem dados de sessao (JWT sem verificar assinatura) |
|
|
55
|
+
| Header Host / X-Forwarded-For usado em logica | Sempre — spoofavel |
|
|
56
|
+
| Content-Type nao verificado | Se processa body condicionalmente |
|
|
57
|
+
| Referer / Origin para autenticacao | Sempre — spoofavel |
|
|
58
|
+
|
|
59
|
+
### File uploads
|
|
60
|
+
|
|
61
|
+
| O que verificar | Quando e problema |
|
|
62
|
+
| -------------------------------------- | --------------------------------------- |
|
|
63
|
+
| Tipo nao validado (MIME + magic bytes) | Sempre |
|
|
64
|
+
| Tamanho nao limitado | Sempre — DoS |
|
|
65
|
+
| Nome do arquivo nao sanitizado | Se usado no filesystem — path traversal |
|
|
66
|
+
| Conteudo nao escaneado | Se armazenado/servido — polyglot files |
|
|
67
|
+
| Extensao dupla | Se whitelist por extensao — bypass |
|
|
68
|
+
|
|
69
|
+
### Boundaries adicionais
|
|
70
|
+
|
|
71
|
+
| Boundary | O que verificar |
|
|
72
|
+
| -------------------------------- | ---------------------------------------------------------------------------------------- |
|
|
73
|
+
| **WebSocket messages** | Cada mensagem deve ser validada — nao ha "sessao validada" que garanta mensagens futuras |
|
|
74
|
+
| **GraphQL inputs** | Validar args de cada resolver. Queries aninhadas → DoS (query depth limiting) |
|
|
75
|
+
| **CLI args** | Validar antes de usar em shell commands, file operations, ou regex |
|
|
76
|
+
| **Variaveis de ambiente** | Validar formato esperado no startup (URL valida, numero, enum) |
|
|
77
|
+
| **IPC / inter-process** | Mensagens entre processos devem ser validadas — outro processo pode ser comprometido |
|
|
78
|
+
| **Database read-back** | Dados lidos do DB podem ter sido inseridos sem sanitizacao em versao anterior do codigo |
|
|
79
|
+
| **gRPC / RPC inputs** | Mesmo com tipos definidos no proto, validar ranges e constraints de negocio |
|
|
80
|
+
| **Event queue / message broker** | Mensagens de filas (Kafka, RabbitMQ, SQS) sao tao untrusted quanto HTTP requests |
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Bypass Vectors
|
|
85
|
+
|
|
86
|
+
Tecnicas que atacantes usam para contornar validacao fraca. Verificar se a validacao cobre estes cenarios:
|
|
87
|
+
|
|
88
|
+
### Type coercion
|
|
89
|
+
|
|
90
|
+
Input esperado num tipo, recebido em outro. Comparacoes fracas (`==` vs `===`), conversoes implicitas, e frameworks que aceitam tipos variados para o mesmo parametro (string se 1 valor, array se multiplos).
|
|
91
|
+
|
|
92
|
+
**Deteccao**: comparacao fraca de input com valor fixo; ausencia de type check explicito.
|
|
93
|
+
|
|
94
|
+
### Prototype / object pollution
|
|
95
|
+
|
|
96
|
+
Payload JSON com propriedades especiais (`__proto__`, `constructor.prototype`) que injetam propriedades em objetos. Afeta linguagens com heranca prototipal ou merge recursivo de objetos.
|
|
97
|
+
|
|
98
|
+
**Deteccao**: JSON parse seguido de merge/assign/spread sem filtrar keys especiais.
|
|
99
|
+
|
|
100
|
+
### Unicode normalization
|
|
101
|
+
|
|
102
|
+
Caracteres Unicode que normalizam para equivalentes ASCII. Pode bypassar blacklists de filename, filtros de input, e comparacoes de string.
|
|
103
|
+
|
|
104
|
+
**Deteccao**: validacao de filename ou input sem normalizacao previa; filtros baseados em comparacao byte-a-byte.
|
|
105
|
+
|
|
106
|
+
### Null byte injection
|
|
107
|
+
|
|
108
|
+
Null bytes (`\0`, `\x00`, `%00`) que truncam strings em sistemas baseados em C. Path traversal classico: `../../etc/passwd\0.png` — extensao ignorada.
|
|
109
|
+
|
|
110
|
+
**Deteccao**: input usado em operacoes de filesystem sem filtrar null bytes.
|
|
111
|
+
|
|
112
|
+
### Array vs scalar ambiguity
|
|
113
|
+
|
|
114
|
+
Parametros que podem ser string ou array dependendo de quantos valores sao enviados. Frameworks web frequentemente tem este comportamento em query params.
|
|
115
|
+
|
|
116
|
+
**Deteccao**: input de query params usado sem type check ou conversao explicita.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## How to Detect
|
|
121
|
+
|
|
122
|
+
Heuristicas para identificar "input → operacao sem validacao no meio":
|
|
123
|
+
|
|
124
|
+
### 1. Rastrear fluxo de dados
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
input source → variavel local → operacao perigosa
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Se entre a origem (request, CLI arg, env var, file upload, API response) e o destino (DB query, filesystem op, shell command, redirect, HTML render) nao ha:
|
|
131
|
+
|
|
132
|
+
- Schema validation (qualquer biblioteca de validacao)
|
|
133
|
+
- Type assertion / type guard
|
|
134
|
+
- Sanitizacao explicita
|
|
135
|
+
- Parameterized query / prepared statement
|
|
136
|
+
|
|
137
|
+
→ Reportar como ⚠ warning.
|
|
138
|
+
|
|
139
|
+
### 2. Sinais de validacao ausente
|
|
140
|
+
|
|
141
|
+
- Input de request usado na mesma funcao que operacao perigosa sem chamada de validacao entre eles
|
|
142
|
+
- Dados de API externa usados diretamente sem schema validation
|
|
143
|
+
- Parametros de rota usados em query sem conversao de tipo
|
|
144
|
+
|
|
145
|
+
### 3. Sinais de validacao presente
|
|
146
|
+
|
|
147
|
+
- Import de biblioteca de validacao no arquivo
|
|
148
|
+
- Schema definido antes do handler
|
|
149
|
+
- Middleware de validacao na rota
|
|
150
|
+
- Type guards explicitos
|
|
151
|
+
- Parameterized queries (placeholders em vez de interpolacao)
|
|
152
|
+
- Sanitization functions entre input e uso
|