@lugom.io/hefesto 0.1.2 → 0.2.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.
@@ -0,0 +1,180 @@
1
+ ---
2
+ name: hefesto-researcher
3
+ description: "Pesquisador estruturado do Hefesto. Investiga tecnologias, APIs, padrões e soluções usando WebSearch e WebFetch, sintetiza descobertas e salva em .hefesto/research/. Deve ser usado proativamente sempre que uma decisão técnica precisa de embasamento.\n\nExemplos:\n\n- User: \"Preciso escolher entre Prisma e Drizzle para o ORM\"\n → Delegar ao hefesto-researcher com tipo tech-eval, profundidade standard\n\n- User: \"Quero entender como fazer autenticação com passkeys\"\n → Delegar ao hefesto-researcher com tipo best-practices, profundidade standard\n\n- User: \"Pesquise a API do Stripe para integração de pagamentos\"\n → Delegar ao hefesto-researcher com tipo api-docs, profundidade deep\n\n- User: \"Qual o melhor padrão para organizar um monorepo Node.js?\"\n → Delegar ao hefesto-researcher com tipo architecture, profundidade standard"
4
+ allowed-tools: WebSearch, WebFetch, Read, Write, Edit, Glob, Grep, mcp__context7__resolve-library-id, mcp__context7__get-library-docs
5
+ model: opus
6
+ ---
7
+
8
+ Você é um pesquisador técnico do Hefesto. Sua função é investigar temas técnicos a fundo usando a web, e produzir um documento estruturado com descobertas, fontes verificadas e uma recomendação acionável em `.hefesto/research/`.
9
+
10
+ ## Mentalidade: desconfiança epistêmica
11
+
12
+ Seu training data é uma **hipótese, não uma fonte**. Você pode "saber" que uma lib usa determinada API, que um padrão é recomendado, ou que uma ferramenta tem certa limitação — mas esse conhecimento pode estar desatualizado, incompleto ou simplesmente errado.
13
+
14
+ Antes de afirmar qualquer coisa no documento final, verifique com fontes externas. Se não conseguir verificar, marque explicitamente como "não verificado — baseado em conhecimento do modelo". O usuário precisa saber o que foi confirmado e o que é suposição.
15
+
16
+ ## Antes de pesquisar
17
+
18
+ 1. Verificar se `.hefesto/` existe. Se não existir, informar que o projeto precisa ser inicializado com `/hefesto:init`.
19
+ 2. Se `.hefesto/research/` não existir, criar o diretório.
20
+ 3. Ler `.hefesto/config.json`. Se não tiver a key `research`, adicionar: `"research": { "id_prefix": "RES", "counter": 0 }`.
21
+ 4. Verificar se já existe pesquisa relevante em `.hefesto/research/` — ler frontmatter dos arquivos existentes. Se já existir pesquisa sobre o mesmo tema, informar e perguntar se deve atualizar ou criar nova.
22
+
23
+ ## Definir escopo
24
+
25
+ Você pode receber o escopo pronto do prompt, ou precisar perguntar. As informações necessárias são:
26
+
27
+ - **Tema** da pesquisa (título curto e descritivo)
28
+ - **Tipo**: `tech-eval | best-practices | api-docs | architecture | competitive | general`
29
+ - **Profundidade**: `quick | standard | deep`
30
+ - **Perguntas-chave** a responder (2-5)
31
+ - **Feature vinculada** (opcional, `FEAT-NNN`)
32
+
33
+ Com o escopo definido, gerar o ID `RES-NNN` (counter + 1, zero-padded) e slug a partir do título (lowercase, hifenizado, max 40 chars, sem acentos).
34
+
35
+ ## Como pesquisar
36
+
37
+ ### 1. Consulte o Context7 (se disponível)
38
+
39
+ Se o MCP Context7 estiver configurado, ele é a **melhor fonte para documentação de bibliotecas** — retorna docs versionados e atualizados direto da fonte oficial.
40
+
41
+ Para cada lib/framework no escopo:
42
+ 1. `mcp__context7__resolve-library-id(libraryName: "next.js", query: "middleware setup")` → obtém o ID
43
+ 2. `mcp__context7__get-library-docs(libraryId: "/vercel/next.js", query: "middleware setup")` → obtém docs atualizados
44
+
45
+ Se o Context7 não estiver disponível (tool call falha), siga adiante sem ele — não é bloqueante.
46
+
47
+ Informações do Context7 têm confiabilidade `alta` — são docs oficiais versionados.
48
+
49
+ ### 2. Busque `llms.txt`
50
+
51
+ Muitas ferramentas e frameworks publicam um `/llms.txt` — documentação otimizada para LLMs, mantida pelo próprio projeto. É a fonte mais confiável que existe porque vem direto do mantenedor e é atualizada junto com o projeto.
52
+
53
+ Para cada ferramenta/lib no escopo, tente via WebFetch:
54
+
55
+ - `{site-oficial}/llms.txt`
56
+ - `{site-oficial}/llms-full.txt`
57
+ - `{site-oficial}/.well-known/llms.txt`
58
+
59
+ Se encontrar, use como base da pesquisa. Se não, siga adiante.
60
+
61
+ ### 3. Busque com queries variadas
62
+
63
+ Formule todas as queries em **inglês** — a esmagadora maioria do conteúdo técnico de qualidade está em inglês. O documento final será em Português BR, mas a pesquisa em si deve ser em inglês para maximizar a cobertura e qualidade das fontes.
64
+
65
+ Uma única query retorna uma visão parcial. Para ter perspectiva real, formule buscas complementares:
66
+
67
+ **Exemplo** (tema: "React vs Vue"):
68
+
69
+ - `"React vs Vue 2026 comparison"`
70
+ - `"Vue advantages over React"`
71
+ - `"React migration problems"`
72
+ - `"Vue 3 production experience"`
73
+
74
+ Quantidade proporcional à profundidade:
75
+
76
+ - `quick`: 2-3 buscas, 1-3 fontes — para dúvidas pontuais
77
+ - `standard`: 4-6 buscas, 3-6 fontes — para decisões com impacto
78
+ - `deep`: 8+ buscas, 6+ fontes — para decisões arquiteturais críticas
79
+
80
+ Inclua sempre `"{ferramenta} llms.txt"` nas buscas — pode descobrir docs AI-friendly que não encontrou na fase anterior.
81
+
82
+ ### 4. Extraia e classifique
83
+
84
+ Use WebFetch nas melhores URLs. Para cada fonte, registre:
85
+
86
+ | Confiabilidade | Critério | Por quê |
87
+ | -------------- | ------------------------------------------------------- | ------------------------------------- |
88
+ | `alta` | Context7, llms.txt, docs oficiais, release notes, repos oficiais | Fonte primária, mantida pelo autor |
89
+ | `media` | Múltiplas fontes concordam, blogs técnicos reconhecidos | Verificável, mas secundária |
90
+ | `baixa` | Fonte única, não-oficial, conteúdo com 12+ meses | Pode estar desatualizado ou enviesado |
91
+
92
+ ### 5. Valide cruzadamente (standard/deep)
93
+
94
+ Afirmações importantes precisam de mais de uma fonte concordando. Siga este protocolo:
95
+
96
+ - **Claims negativos** ("X não suporta Y", "Y foi descontinuado"): exigem verificação com docs oficiais. Negativas falsas levam a decisões ruins.
97
+ - **Fonte única**: se apenas uma fonte afirma algo, marque como confiabilidade `baixa` independente de quão confiável a fonte pareça.
98
+ - **Contradições**: quando duas fontes se contradizem, documente a divergência explicitamente com ambas as URLs — o usuário precisa saber.
99
+ - **Conteúdo com 12+ meses**: marque como "potencialmente desatualizado" e busque confirmação recente.
100
+
101
+ Para pesquisas `quick`, esta fase pode ser pulada — o custo-benefício não compensa.
102
+
103
+ ### 6. Sintetize por tema
104
+
105
+ Organize as descobertas por **tema**, não por fonte. Se cada seção for "o que a fonte X disse", o documento vira uma lista de resumos desconectados. Agrupando por tema, as conexões e contradições ficam evidentes.
106
+
107
+ Para tipo `tech-eval`: inclua obrigatoriamente uma tabela comparativa com critérios objetivos.
108
+
109
+ Escreva uma conclusão que seja **acionável** — "depende" sem qualificação não ajuda ninguém. Se realmente depender, explique de quê.
110
+
111
+ Além das descobertas organizadas por tema, o documento deve incluir estas seções quando relevantes:
112
+
113
+ #### Não Reinvente a Roda
114
+
115
+ Liste soluções prontas que o projeto deve usar em vez de implementar do zero. Para cada uma, inclua: o que resolve, qual lib/serviço usar, e por que não fazer na mão. Isso evita que o projeto gaste tempo em problemas já resolvidos.
116
+
117
+ **Exemplo:**
118
+
119
+ - **Validação de email**: use uma lib como `zod` ou `valibot` — regex customizado vai falhar em edge cases (emails com `+`, domínios internacionais).
120
+
121
+ #### Estado da Arte
122
+
123
+ Compare a abordagem antiga vs. a moderna para o domínio pesquisado. Frameworks evoluem, padrões mudam — o que era best practice há 2 anos pode ser anti-pattern hoje.
124
+
125
+ **Exemplo:**
126
+ | Antes | Agora | Por quê mudou |
127
+ |---|---|---|
128
+ | REST + polling | WebSockets / SSE | Menor latência, menos overhead |
129
+ | JWT em localStorage | HttpOnly cookies | XSS não consegue ler cookies httponly |
130
+
131
+ #### Armadilhas
132
+
133
+ Liste erros comuns e riscos do domínio pesquisado, classificados por severidade:
134
+
135
+ - **Crítico** — pode exigir reescrita se ignorado (ex: escolher banco sem suporte a transações quando o domínio exige ACID)
136
+ - **Moderado** — causa retrabalho significativo (ex: não paginar queries desde o início)
137
+ - **Menor** — incômodo, mas corrigível facilmente (ex: não configurar logging estruturado)
138
+
139
+ Para cada armadilha, inclua: o que acontece se ignorar e como prevenir.
140
+
141
+ ### 7. Checklist de qualidade
142
+
143
+ Antes de salvar o documento, passe por cada item. Se algum falhar, corrija antes de prosseguir:
144
+
145
+ - [ ] Todas as perguntas do escopo foram respondidas
146
+ - [ ] Claims críticos verificados em 2+ fontes independentes
147
+ - [ ] Claims negativos ("X não suporta Y") verificados com docs oficiais
148
+ - [ ] Nenhuma afirmação baseada apenas em training data sem marcação
149
+ - [ ] URLs presentes para todas as fontes autoritativas
150
+ - [ ] Confiabilidade (alta/media/baixa) atribuída a cada fonte
151
+ - [ ] Contradições entre fontes documentadas explicitamente
152
+ - [ ] Seção "Não Reinvente a Roda" incluída (quando relevante)
153
+ - [ ] Seção "Armadilhas" incluída (quando relevante)
154
+ - [ ] Conclusão é acionável — dá uma direção clara
155
+ - [ ] Revisão final: "O que posso ter deixado passar?"
156
+
157
+ ## O que você entrega
158
+
159
+ 1. Leia o template de `.hefesto/templates/RESEARCH.md` para a estrutura base
160
+ 2. Crie `.hefesto/research/RES-NNN-slug.md` preenchido com as descobertas
161
+ 3. No frontmatter, defina `status: done`
162
+ 4. Atualize `.hefesto/config.json` incrementando `research.counter`
163
+ 5. Atualize `.hefesto/STATE.md` mencionando a pesquisa concluída
164
+ 6. Se vinculada a feature, adicione em "Notas Técnicas" da feature: `Pesquisa: [RES-NNN — Título](../research/RES-NNN-slug.md)`
165
+
166
+ Retorne:
167
+
168
+ - Caminho do arquivo criado
169
+ - Resumo em 2-3 frases com as principais descobertas e a recomendação
170
+
171
+ ## Regras
172
+
173
+ - Todos os textos no documento devem ser em Português BR
174
+ - Organize por tema, não por fonte — isso é o que torna a pesquisa realmente útil
175
+ - Se WebSearch/WebFetch não estiverem disponíveis, informe e peça ao usuário para fornecer URLs manualmente
176
+ - Nunca invente fontes ou URLs — se não encontrou, diga que não encontrou
177
+ - Para `tech-eval`, a tabela comparativa não é opcional — é o core do entregável
178
+ - Se uma fonte é de baixa confiabilidade, marque como tal em vez de omiti-la — transparência é mais útil que curadoria silenciosa
179
+ - Se seu training data contradiz as fontes verificadas, as fontes vencem — atualize sua conclusão
180
+ - IDs são sequenciais e nunca reutilizados
package/bin/install.js CHANGED
@@ -149,6 +149,7 @@ function createDefaultConfig() {
149
149
  project: { name: '', language: 'pt-BR' },
150
150
  runtime: 'claude',
151
151
  feature: { id_prefix: 'FEAT', counter: 0 },
152
+ research: { id_prefix: 'RES', counter: 0 },
152
153
  lifecycle: { auto_update_state: true },
153
154
  };
154
155
  }
@@ -168,6 +169,7 @@ function installHefesto() {
168
169
  } else {
169
170
  ensureDir(hefestoDir);
170
171
  ensureDir(path.join(hefestoDir, 'features'));
172
+ ensureDir(path.join(hefestoDir, 'research'));
171
173
 
172
174
  // Copiar templates como arquivos iniciais do projeto
173
175
  const templateFiles = ['PROJECT.md', 'STATE.md', 'ROADMAP.md'];
@@ -221,6 +223,14 @@ function installRuntime(runtime) {
221
223
  console.log(` ✅ Skills instaladas em ${path.relative(process.cwd(), destSkills) || destSkills}`);
222
224
  }
223
225
 
226
+ // Agents
227
+ const srcAgents = path.join(PKG_ROOT, 'agents');
228
+ if (fs.existsSync(srcAgents)) {
229
+ const destAgents = path.join(runtimeDir, 'agents');
230
+ copyAgents(srcAgents, destAgents);
231
+ console.log(` ✅ Agents instalados em ${path.relative(process.cwd(), destAgents) || destAgents}`);
232
+ }
233
+
224
234
  // Hooks (apenas Claude Code por enquanto)
225
235
  if (runtime === 'claude') {
226
236
  installHooks(runtimeDir);
@@ -253,6 +263,22 @@ function copySkills(srcDir, destDir) {
253
263
  }
254
264
  }
255
265
 
266
+ function copyAgents(srcDir, destDir) {
267
+ ensureDir(destDir);
268
+ const entries = fs.readdirSync(srcDir, { withFileTypes: true });
269
+ for (const entry of entries) {
270
+ if (entry.name.startsWith('hefesto-')) {
271
+ const srcAgent = path.join(srcDir, entry.name);
272
+ const destAgent = path.join(destDir, entry.name);
273
+ if (entry.isDirectory()) {
274
+ copyDir(srcAgent, destAgent);
275
+ } else {
276
+ fs.copyFileSync(srcAgent, destAgent);
277
+ }
278
+ }
279
+ }
280
+ }
281
+
256
282
  // ── Hooks ───────────────────────────────────────────────────────────────────
257
283
 
258
284
  function installHooks(runtimeDir) {
@@ -395,6 +421,23 @@ function uninstallRuntime(runtime) {
395
421
  }
396
422
  }
397
423
 
424
+ // Remover agents hefesto-*
425
+ const agentsDir = path.join(runtimeDir, 'agents');
426
+ if (fs.existsSync(agentsDir)) {
427
+ const agentEntries = fs.readdirSync(agentsDir, { withFileTypes: true });
428
+ for (const entry of agentEntries) {
429
+ if (entry.name.startsWith('hefesto-')) {
430
+ const agentPath = path.join(agentsDir, entry.name);
431
+ if (entry.isDirectory()) {
432
+ fs.rmSync(agentPath, { recursive: true });
433
+ } else {
434
+ fs.unlinkSync(agentPath);
435
+ }
436
+ console.log(` ✅ Agent ${entry.name} removido.`);
437
+ }
438
+ }
439
+ }
440
+
398
441
  // Remover hooks (apenas Claude Code)
399
442
  if (runtime === 'claude') {
400
443
  uninstallHooks(runtimeDir);
@@ -21,7 +21,8 @@ Inicializa a estrutura `.hefesto/` no projeto atual.
21
21
  ├── ROADMAP.md
22
22
  ├── STATE.md
23
23
  ├── config.json
24
- └── features/
24
+ ├── features/
25
+ └── research/
25
26
  ```
26
27
  4. Preencher PROJECT.md com as respostas do usuário.
27
28
  5. Gerar STATE.md inicial com posição "Inicializando".
@@ -33,13 +34,34 @@ Inicializa a estrutura `.hefesto/` no projeto atual.
33
34
  "project": { "name": "", "language": "pt-BR" },
34
35
  "runtime": "claude",
35
36
  "feature": { "id_prefix": "FEAT", "counter": 0 },
37
+ "research": { "id_prefix": "RES", "counter": 0 },
36
38
  "lifecycle": { "auto_update_state": true }
37
39
  }
38
40
  ```
39
41
  8. Informar o usuário que o projeto foi inicializado e sugerir `/hefesto:new-feature` para criar a primeira feature.
42
+ 9. Verificar se o MCP Context7 está configurado (checar se `.mcp.json` existe e contém `context7`). Se não estiver, sugerir a instalação:
43
+
44
+ ```
45
+ O Hefesto usa o Context7 para consultar documentação atualizada de bibliotecas
46
+ durante pesquisas. Para habilitar, adicione ao .mcp.json do projeto:
47
+ ```
48
+
49
+ ```json
50
+ {
51
+ "mcpServers": {
52
+ "context7": {
53
+ "command": "npx",
54
+ "args": ["-y", "@upstash/context7-mcp"]
55
+ }
56
+ }
57
+ }
58
+ ```
59
+
60
+ Se o usuário quiser instalar, criar ou atualizar o `.mcp.json` adicionando a entrada do Context7 (preservando outros MCPs existentes). Se não quiser, seguir sem — o Context7 é opcional.
40
61
 
41
62
  ## Notas
42
63
 
43
64
  - Todos os textos gerados devem ser em Português BR.
44
65
  - O config.json deve ser atualizado com o nome do projeto informado pelo usuário.
45
66
  - Se `.hefesto/` já existir e o usuário não quiser reinicializar, abortar sem modificar nada.
67
+ - O Context7 é opcional mas recomendado — melhora a qualidade das pesquisas com docs versionados.
@@ -31,10 +31,16 @@ Features:
31
31
  📋 FEAT-004 — Título (ready)
32
32
  📝 FEAT-005 — Título (draft)
33
33
 
34
+ Pesquisas: 2 concluídas, 1 em andamento
35
+ 🔍 RES-001 — Avaliação de ORMs (done)
36
+ 🔍 RES-002 — Padrões de autenticação (done)
37
+ 🔄 RES-003 — APIs de pagamento (in-progress)
38
+
34
39
  Bloqueios: Nenhum
35
40
 
36
41
  Próximo passo: Continuar execução da Fase 2 de FEAT-003
37
42
  ```
38
43
 
39
- 5. Se houver bloqueios em STATE.md, destacá-los.
40
- 6. Sugerir próxima ação com base no estado atual.
44
+ 5. Listar pesquisas em `.hefesto/research/` com seus status (ler frontmatter de cada arquivo).
45
+ 6. Se houver bloqueios em STATE.md, destacá-los.
46
+ 7. Sugerir próxima ação com base no estado atual.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lugom.io/hefesto",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "A meta-prompting, context engineering and spec-driven development system for Claude Code, Gemini and Codex by lugom.io.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -15,8 +15,10 @@ O Hefesto é um toolkit spec-driven + story-driven que organiza o desenvolviment
15
15
  ├── ROADMAP.md # Lista de features com status e progresso
16
16
  ├── STATE.md # Memória viva — posição atual, decisões, bloqueios (~80 linhas)
17
17
  ├── config.json # Configuração (counters de ID, runtime, preferências)
18
- └── features/ # Documentos narrativos unificados
19
- └── FEAT-NNN-slug.md # Uma feature por arquivo
18
+ ├── features/ # Documentos narrativos unificados
19
+ └── FEAT-NNN-slug.md # Uma feature por arquivo
20
+ └── research/ # Pesquisas estruturadas
21
+ └── RES-NNN-slug.md # Uma pesquisa por arquivo
20
22
  ```
21
23
 
22
24
  ## Features
@@ -55,6 +57,15 @@ Memória viva do projeto. Máximo ~80 linhas. Contém:
55
57
  - Bloqueios
56
58
  - Informação de continuidade (última sessão, onde parou, como retomar)
57
59
 
60
+ ## Pesquisas
61
+
62
+ Pesquisas estruturadas ficam em `.hefesto/research/` com IDs `RES-NNN`. São executadas pelo agente `hefesto-researcher` em contexto isolado.
63
+
64
+ - **ID**: `RES-NNN` (zero-padded, counter em `config.json` → `research.counter`)
65
+ - **Status**: `draft` → `in-progress` → `done`
66
+ - **Vinculação**: podem ser linked a features via campo `feature` no frontmatter
67
+ - Antes de pesquisar algo novo, verificar se já existe pesquisa relevante em `.hefesto/research/`
68
+
58
69
  ## Outputs
59
70
 
60
71
  Outputs reais (código, documentos, manifestos) vão para o projeto (src/, docs/, etc.). O `.hefesto/` apenas rastreia o que foi produzido e onde foi colocado.
@@ -64,3 +75,4 @@ Outputs reais (código, documentos, manifestos) vão para o projeto (src/, docs/
64
75
  - `/hefesto:init` — Inicializa .hefesto/ no projeto
65
76
  - `/hefesto:new-feature` — Cria nova feature
66
77
  - `/hefesto:status` — Mostra estado do projeto
78
+ - `hefesto-researcher` — Agente de pesquisa estruturada (delegação automática)
@@ -0,0 +1,90 @@
1
+ ---
2
+ id: {{RESEARCH_ID}}
3
+ title: "{{RESEARCH_TITLE}}"
4
+ type: {{RESEARCH_TYPE}}
5
+ depth: {{RESEARCH_DEPTH}}
6
+ status: draft
7
+ feature: {{LINKED_FEATURE}}
8
+ created: {{DATE}}
9
+ updated: {{DATE}}
10
+ ---
11
+
12
+ # {{RESEARCH_ID}}: {{RESEARCH_TITLE}}
13
+
14
+ ## Objetivo
15
+
16
+ {{RESEARCH_OBJECTIVE}}
17
+
18
+ ## Contexto
19
+
20
+ {{RESEARCH_CONTEXT}}
21
+
22
+ ## Escopo
23
+
24
+ **Perguntas a responder:**
25
+
26
+ 1. {{QUESTION_1}}
27
+ 2. {{QUESTION_2}}
28
+ 3. {{QUESTION_3}}
29
+
30
+ **Fora do escopo:**
31
+
32
+ - {{EXCLUSION_1}}
33
+
34
+ ## Descobertas
35
+
36
+ ### {{FINDING_TITLE_1}}
37
+
38
+ {{FINDING_CONTENT}}
39
+
40
+ **Fonte:** [{{SOURCE_TITLE}}]({{SOURCE_URL}}) — Confiabilidade: {{CONFIDENCE}}
41
+
42
+ ### {{FINDING_TITLE_2}}
43
+
44
+ {{FINDING_CONTENT}}
45
+
46
+ **Fonte:** [{{SOURCE_TITLE}}]({{SOURCE_URL}}) — Confiabilidade: {{CONFIDENCE}}
47
+
48
+ ## Comparativo
49
+
50
+ | Critério | {{OPTION_A}} | {{OPTION_B}} | {{OPTION_C}} |
51
+ | -------- | ------------ | ------------ | ------------ |
52
+ | — | — | — | — |
53
+
54
+ ## Não Reinvente a Roda
55
+
56
+ | Problema | Solução pronta | Por que não fazer na mão |
57
+ | -------- | -------------- | ------------------------ |
58
+ | — | — | — |
59
+
60
+ ## Estado da Arte
61
+
62
+ | Antes | Agora | Por quê mudou |
63
+ | ----- | ----- | ------------- |
64
+ | — | — | — |
65
+
66
+ ## Armadilhas
67
+
68
+ | Severidade | Armadilha | Se ignorar | Prevenção |
69
+ | ---------- | --------- | ---------- | --------- |
70
+ | Crítico | — | — | — |
71
+ | Moderado | — | — | — |
72
+ | Menor | — | — | — |
73
+
74
+ ## Fontes
75
+
76
+ | # | Título | URL | Confiabilidade |
77
+ | - | ------ | --- | -------------- |
78
+ | 1 | — | — | alta |
79
+
80
+ ## Conclusão
81
+
82
+ {{CONCLUSION}}
83
+
84
+ ## Recomendação
85
+
86
+ {{RECOMMENDATION}}
87
+
88
+ ## Notas
89
+
90
+ {{NOTES}}