spec-first-copilot 0.2.0 → 0.4.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.
Files changed (38) hide show
  1. package/README.md +148 -148
  2. package/bin/cli.js +52 -52
  3. package/lib/init.js +89 -93
  4. package/package.json +24 -23
  5. package/templates/.ai/memory/napkin.md +68 -68
  6. package/templates/.github/agents/backend-coder.md +215 -215
  7. package/templates/.github/agents/db-coder.md +165 -165
  8. package/templates/.github/agents/doc-writer.md +51 -51
  9. package/templates/.github/agents/frontend-coder.md +222 -222
  10. package/templates/.github/agents/infra-coder.md +341 -341
  11. package/templates/.github/agents/reviewer.md +99 -99
  12. package/templates/.github/agents/security-reviewer.md +153 -153
  13. package/templates/.github/copilot-instructions.md +175 -176
  14. package/templates/.github/instructions/docs.instructions.md +123 -123
  15. package/templates/.github/instructions/sensitive-files.instructions.md +32 -32
  16. package/templates/.github/skills/sf-design/SKILL.md +181 -181
  17. package/templates/.github/skills/sf-dev/SKILL.md +349 -326
  18. package/templates/.github/skills/sf-extract/SKILL.md +284 -284
  19. package/templates/.github/skills/sf-feature/SKILL.md +130 -130
  20. package/templates/.github/skills/sf-merge-delta/SKILL.md +142 -142
  21. package/templates/.github/skills/sf-plan/SKILL.md +178 -178
  22. package/templates/.github/skills/{sf-pausar → sf-session-finish}/SKILL.md +120 -120
  23. package/templates/.github/skills/sf-setup-projeto/SKILL.md +123 -123
  24. package/templates/docs/Desenvolvimento/rules.md +229 -229
  25. package/templates/docs/_templates/estrutura/ADRs.template.md +91 -91
  26. package/templates/docs/_templates/estrutura/API.template.md +144 -144
  27. package/templates/docs/_templates/estrutura/Arquitetura.template.md +82 -82
  28. package/templates/docs/_templates/estrutura/Infraestrutura.template.md +104 -104
  29. package/templates/docs/_templates/estrutura/Modelo_Dados.template.md +99 -99
  30. package/templates/docs/_templates/estrutura/Seguranca.template.md +138 -138
  31. package/templates/docs/_templates/estrutura/Stack.template.md +78 -78
  32. package/templates/docs/_templates/estrutura/Visao.template.md +82 -82
  33. package/templates/docs/_templates/feature/Progresso.template.md +136 -136
  34. package/templates/docs/_templates/feature/backlog-extraido.template.md +154 -154
  35. package/templates/docs/_templates/feature/context.template.md +42 -42
  36. package/templates/docs/_templates/feature/extract-log.template.md +38 -38
  37. package/templates/docs/_templates/feature/projetos.template.yaml +73 -73
  38. package/templates/docs/_templates/global/progresso_global.template.md +57 -57
@@ -1,284 +1,284 @@
1
- ---
2
- name: sf-extract
3
- description: |
4
- Extração de insumos. Lê docs/PM/ e gera PRD ou TRD estruturado.
5
- Trigger: /sf-extract
6
- author: GustavoMaritan
7
- version: 1.0.0
8
- date: 2026-04-08
9
- ---
10
-
11
- # Skill: /sf-extract
12
-
13
- > Skill atômica de extração. Lê insumos brutos do PM/ e gera PRD ou TRD.
14
- > Chamada via orquestrador (/feature, /sf-setup-projeto) ou diretamente para re-extração.
15
-
16
- ## Tipo
17
- Atômica — Multi-agent
18
-
19
- ## Uso
20
- ```
21
- /sf-extract <nome>
22
- ```
23
- Exemplo: `/sf-extract feat_cadastro_cliente`
24
-
25
- ---
26
-
27
- ## Agentes
28
-
29
- | Agente | Papel | Modelo | Input | Output |
30
- |--------|-------|--------|-------|--------|
31
- | **Reader** | Lê e cataloga 1 arquivo de insumo | Sonnet | 1 arquivo bruto + formato esperado | Resumo estruturado por seção do template |
32
- | **Analyzer** | Cruza fontes, detecta gaps, gera documento final | Opus | Outputs de todos os Readers + template + contexto do projeto | PRD/TRD completo + extract-log |
33
-
34
- ### Orquestração
35
- ```
36
- 1. Ler .context.md e .extract-log.md (se existir)
37
- 2. Ler discovery.md (se existir) — análise profunda prévia dos insumos
38
- 3. Inventariar arquivos em docs/PM/{nome}/ → filtrar NOVOS e MODIFICADOS
39
- 4. Spawn 1 Reader por arquivo NOVO/MODIFICADO (paralelo)
40
- 5. Aguardar todos os Readers
41
- 6. Spawn Analyzer com:
42
- - Outputs concatenados dos Readers
43
- - discovery.md (se existir) — mapa do sistema pré-validado
44
- - PRD/TRD existente (se re-extração)
45
- - Template (PRD.template.md ou TRD.template.md)
46
- - docs/Estrutura/ (contexto do projeto)
47
- 7. Analyzer gera documento final + extract-log
48
- 8. Atualizar .context.md → status: extract_done
49
- ```
50
-
51
- > **Se discovery.md existir**: O Analyzer usa o mapa do sistema, perguntas já respondidas
52
- > e pontos críticos como contexto enriquecido. Resultado: menos ambiguidades, melhor estruturação.
53
- > **Se não existir**: O Analyzer trabalha normalmente com os outputs dos Readers.
54
-
55
- ### Agent: Reader (Sonnet)
56
-
57
- **Papel**: Especialista em leitura e catalogação de um único arquivo de insumo.
58
-
59
- **Comportamento**:
60
- - Lê 1 arquivo por vez
61
- - Extrai informações seguindo as categorias do template alvo
62
- - Não interpreta, não infere — apenas cataloga o que encontra
63
- - Marca cada informação com a seção do template onde se encaixa
64
-
65
- **Formatos e o que extrair:**
66
-
67
- | Formato | Extensões | O que extrair |
68
- |---------|-----------|---------------|
69
- | Texto/Requisitos | `.md`, `.txt` | Requisitos, regras de negócio, contexto, restrições |
70
- | Banco de dados | `.sql` | Entidades, campos, tipos, constraints, índices, relações |
71
- | Protótipos | `.html` | Telas, campos (`data-field`), ações (`data-action`), validações (`data-validation`), rotas (`data-route`), permissões (`data-permission`), estados (`data-state`) |
72
- | Diagramas | `.xml` (drawio), `.json` | Fluxos, decisões, atores, sequências |
73
- | Planilhas | `.csv` | Dados tabulares, mapeamentos, configurações |
74
- | Imagens | `.png`, `.jpg`, `.pdf` | Wireframes, mockups, fluxogramas (análise visual) |
75
- | Outros | qualquer | Extrair o que for relevante — nunca ignorar um arquivo |
76
-
77
- **Output do Reader** (por arquivo):
78
- ```markdown
79
- ## Reader Output: {nome_arquivo}
80
- - Hash: {sha256_8chars}
81
- - Formato: {tipo}
82
- - Status: extraído | parcial | não identificado
83
-
84
- ### Seções alimentadas:
85
- - §1 Contexto: ...
86
- - §3 Entidades: ...
87
- - §5 Regras: RN-XXX: "descrição"
88
- - §13 Ambiguidades: "campo X definido mas sem tipo especificado"
89
- ```
90
-
91
- **Quando o Reader NÃO consegue extrair conteúdo:**
92
- - Status: `não identificado` — arquivo binário desconhecido, corrompido, ou sem conteúdo relevante
93
- - Status: `parcial` — conseguiu extrair algo mas o formato limita (ex: imagem sem OCR, PDF escaneado)
94
- - O Reader NUNCA ignora o arquivo — sempre registra no output com o status
95
- - O Analyzer inclui arquivo não identificado no extract-log com classificação `NÃO IDENTIFICADO`
96
- - O Analyzer gera ambiguidade: "Arquivo {nome} não pôde ser processado — verifique conteúdo e formato"
97
-
98
- ### Agent: Analyzer (Opus)
99
-
100
- **Papel**: Especialista em análise cruzada, detecção de gaps e geração de documento estruturado.
101
-
102
- **Comportamento**:
103
- - Nunca assume — se não está explícito nos insumos, vira pergunta bloqueante
104
- - Busca contradições ativamente entre fontes diferentes
105
- - Rastreia tudo — cada informação aponta para o arquivo fonte
106
- - Prefere estrutura a narrativa — tabelas e listas, nunca texto livre
107
- - Pessimista construtivo — melhor uma ambiguidade a mais do que uma regra inventada
108
-
109
- **Responsabilidades**:
110
- 1. Consolidar outputs dos Readers em visão unificada
111
- 2. Detectar contradições entre fontes → gerar ambiguidade com os dois arquivos citados
112
- 3. Detectar gaps — seções do template sem informação → gerar ambiguidade
113
- 4. **Validar Checklist de Temas Críticos** (ver abaixo) — temas ausentes viram ambiguidades obrigatórias
114
- 5. Nunca inferir regra de negócio — se não está explícito, é ambiguidade
115
- 6. Manter IDs estáveis (RN-001 nunca renumera, novos continuam sequência)
116
- 7. Gerar rastreabilidade completa (§14 PRD / §10 TRD)
117
- 8. Na re-extração: merge ADITIVO com documento existente, marcar seções atualizadas
118
-
119
- ### Checklist de Temas Críticos (Analyzer)
120
-
121
- Após consolidar os Readers, o Analyzer DEVE verificar se os insumos cobrem os temas abaixo.
122
- Se um tema **não foi mencionado em nenhum insumo**, gera **ambiguidade obrigatória** pedindo ao usuário.
123
-
124
- #### Para TRD (setup):
125
-
126
- | # | Tema | O que verificar | Se ausente |
127
- |---|------|-----------------|------------|
128
- | 1 | **Autenticação** | Qual mecanismo? JWT, OAuth, API Key, Session? | Ambiguidade: "Nenhum mecanismo de autenticação definido nos insumos" |
129
- | 2 | **Autorização / Roles** | Quais perfis? RBAC, ABAC? Quem acessa o quê? | Ambiguidade: "Perfis de acesso e regras de autorização não definidos" |
130
- | 3 | **Separação de serviços** | É monolito, microserviços, modular? API e Worker são separados? | Ambiguidade: "Arquitetura de serviços não definida (monolito vs separados)" |
131
- | 4 | **Ambientes** | Dev, staging, prod? Docker? CI/CD? | Ambiguidade: "Estratégia de ambientes e deploy não definida" |
132
- | 5 | **Dados sensíveis** | PII, LGPD, criptografia, masking? | Ambiguidade: "Tratamento de dados sensíveis / LGPD não mencionado" |
133
-
134
- #### Para PRD (feature):
135
-
136
- | # | Tema | O que verificar | Se ausente |
137
- |---|------|-----------------|------------|
138
- | 1 | **Autenticação requerida** | Feature exige login? Quais endpoints são públicos vs autenticados? | Ambiguidade: "Não definido quais operações exigem autenticação" |
139
- | 2 | **Permissões / Roles** | Quais perfis podem executar cada ação? | Ambiguidade: "Não definido quais perfis têm acesso a cada operação" |
140
- | 3 | **Validações de entrada** | Regras de validação dos campos? Limites? Formatos? | Ambiguidade: "Validações de entrada não detalhadas" |
141
- | 4 | **Tratamento de erros** | O que acontece quando dá errado? Mensagens ao usuário? | Ambiguidade: "Cenários de erro e mensagens ao usuário não definidos" |
142
- | 5 | **Impacto em dados existentes** | A feature altera dados existentes? Migração necessária? | Ambiguidade: "Impacto em dados existentes não avaliado" |
143
-
144
- > **Regra**: O Analyzer NÃO inventa respostas para esses temas. Se não está nos insumos, PERGUNTA.
145
- > Esses temas são os mais comuns de serem esquecidos pelo usuário e os mais caros de corrigir depois.
146
-
147
- ---
148
-
149
- ## Pré-condições
150
-
151
- | # | Validação | Se falhar |
152
- |---|-----------|-----------|
153
- | 1 | Argumento `nome` foi informado | Parar → "Informe o nome. Ex: /sf-extract feat_cadastro_cliente" |
154
- | 2 | `docs/PM/{nome}/` existe e contém pelo menos 1 arquivo (ignorar .gitkeep) | Parar → "Pasta de insumos vazia ou inexistente" |
155
- | 3 | `docs/Desenvolvimento/{nome}/.context.md` existe | Parar → "Execute /sf-feature {nome} ou /sf-setup-projeto primeiro" |
156
- | 4 | Status em `.context.md` é `not_started` ou `extract_done` | Se `approved` ou posterior → "Extração já aprovada. Para re-extrair, o status será revertido para extract_done" |
157
-
158
- ## Passos detalhados
159
-
160
- ### 1. Ler contexto
161
- - Ler `.context.md` → identificar `tipo` (feature ou setup) e `documento` (PRD ou TRD)
162
- - Ler `docs/Estrutura/` se existir (contexto para extração coerente)
163
- - Selecionar template: `tipo=feature` → `PRD.template.md` | `tipo=setup` → `TRD.template.md`
164
-
165
- ### 2. Inventariar e classificar insumos
166
- Ler todos os arquivos em `docs/PM/{nome}/`. Para cada arquivo, calcular hash (SHA-256 truncado 8 chars).
167
-
168
- Se `.extract-log.md` existir, classificar:
169
-
170
- | Classificação | Critério | Ação |
171
- |---------------|----------|------|
172
- | **NOVO** | Arquivo não existe no log | Processar |
173
- | **MODIFICADO** | Hash diferente do log | Reprocessar |
174
- | **INALTERADO** | Hash igual ao log | Pular |
175
-
176
- Se `.extract-log.md` não existir: todos são NOVOS.
177
-
178
- ### 3. Spawn Readers (paralelo)
179
- Para cada arquivo NOVO ou MODIFICADO, disparar 1 Reader (Sonnet):
180
- - Input: arquivo bruto + seções do template alvo
181
- - Output: resumo estruturado por seção
182
-
183
- Arquivos INALTERADOS: pular — informação já está no PRD/TRD existente.
184
-
185
- ### 4. Spawn Analyzer (sequencial)
186
- Após todos Readers concluírem, disparar Analyzer (Opus) com:
187
- - Todos os outputs dos Readers
188
- - PRD/TRD existente (se re-extração — para merge aditivo)
189
- - Template correspondente
190
- - `docs/Estrutura/` como contexto
191
-
192
- ### 5. Gerar/atualizar documento
193
-
194
- **Primeira extração:**
195
- - Analyzer gera PRD.md ou TRD.md completo a partir do template
196
-
197
- **Re-extração:**
198
- - Merge ADITIVO com o documento existente (nunca remove info de arquivos inalterados)
199
- - Seções afetadas recebem marcador:
200
- ```
201
- <!-- ATUALIZADO: re-extração {{ISO_DATE}} — arquivos: {lista} -->
202
- ```
203
- - Novas regras de negócio continuam sequência de IDs existentes
204
-
205
- ### 6. Gerar roadmap de produto faseado (APENAS no setup)
206
- Quando tipo=setup, o Analyzer encontra informações que não são infraestrutura
207
- (regras de negócio, jornadas, telas, fluxos). Em vez de descartar, organizar em
208
- `backlog_extraido.md` como **roadmap faseado** com entregáveis incrementais:
209
-
210
- O Analyzer deve:
211
- 1. Identificar funcionalidades, entidades, regras de negócio, jornadas, telas
212
- 2. Mapear dependências entre elas (ex: agendamento depende de cadastro de clientes)
213
- 3. Agrupar em **fases de entrega** por dependência + complexidade
214
- 4. Para cada fase: definir entregável + critério de done
215
- 5. Sugerir **1 feature única** com nome descritivo (ex: `feat_mvp`)
216
- 6. Usar template `backlog-extraido.template.md`
217
-
218
- **Princípio**: Entregáveis contínuos — cada fase entrega valor e pode ir pra produção.
219
- Máximo 4-5 fases. Fase 1 sempre = fundação/cadastros base.
220
-
221
- Este arquivo:
222
- - É gerado APENAS no setup (não em features)
223
- - Serve como roadmap quando o usuário for criar `/feature`
224
- - O /sf-extract da feature usa as fases como referência para o PRD
225
-
226
- ### 7. Gerar/atualizar `.extract-log.md`
227
-
228
- ```markdown
229
- # Extract Log — {nome}
230
-
231
- ## Extração 1 — {{ISO_DATETIME}}
232
- | Arquivo | Hash | Classificação | Seções alimentadas |
233
- |---------|------|---------------|-------------------|
234
- | requisitos.txt | a1b2c3d4 | NOVO | §1, §5, §9 |
235
- | modelagem.sql | e5f6g7h8 | NOVO | §3, §6 |
236
-
237
- ## Extração 2 — {{ISO_DATETIME}}
238
- | Arquivo | Hash | Classificação | Seções alimentadas |
239
- |---------|------|---------------|-------------------|
240
- | novas_regras.md | m3n4o5p6 | NOVO | §5, §9 |
241
- | modelagem.sql | q7r8s9t0 | MODIFICADO | §3 |
242
- | requisitos.txt | a1b2c3d4 | INALTERADO | — |
243
- ```
244
-
245
- ### 7. Atualizar `.context.md`
246
- ```yaml
247
- status: "extract_done"
248
- ultima_skill: "/sf-extract"
249
- atualizado_em: "{{ISO_DATETIME}}"
250
- ```
251
-
252
- ---
253
-
254
- ## Saídas
255
-
256
- | Arquivo | Descrição |
257
- |---------|-----------|
258
- | `PRD.md` ou `TRD.md` | Documento de extração com todas as seções preenchidas |
259
- | `.extract-log.md` | Registro de arquivos processados com hashes e classificação |
260
- | `.context.md` | Atualizado com status `extract_done` |
261
-
262
- ## Pós-condições
263
- - Documento gerado com rastreabilidade completa
264
- - Ambiguidades listadas na seção correspondente — bloqueiam avanço no `/design`
265
- - Usuário deve revisar antes de chamar `/design`
266
-
267
- ## Erros
268
-
269
- | Erro | Ação |
270
- |------|------|
271
- | PM/{nome}/ vazio | Parar, listar formatos aceitos |
272
- | .context.md não existe | Parar, sugerir /sf-feature ou /sf-setup-projeto |
273
- | Nenhum arquivo novo/modificado | Informar "Nenhuma alteração detectada desde a última extração" |
274
- | Formato não reconhecido | Processar mesmo assim, extrair o que for possível, avisar no log |
275
- | Conteúdo não identificado | Registrar como NÃO IDENTIFICADO no extract-log, gerar ambiguidade pedindo ao usuário verificar o arquivo |
276
- | Extração parcial | Registrar como PARCIAL no extract-log, extrair o que for possível, avisar quais seções ficaram incompletas |
277
- | Contradição entre arquivos | Analyzer gera ambiguidade citando os dois arquivos e a contradição |
278
-
279
- ## Notas
280
- - O `/extract` é a ÚNICA skill que lê `docs/PM/` — nenhuma outra skill acessa insumos brutos
281
- - Na re-extração, o merge é ADITIVO — nunca remove informação de arquivos inalterados
282
- - Para recomeçar do zero: apagar PRD/TRD e .extract-log.md manualmente
283
- - Readers são stateless — não conhecem outros arquivos, apenas o seu
284
- - Analyzer é quem tem visão global e detecta contradições cross-arquivo
1
+ ---
2
+ name: sf-extract
3
+ description: |
4
+ Extração de insumos. Lê docs/PM/ e gera PRD ou TRD estruturado.
5
+ Trigger: /sf-extract
6
+ author: GustavoMaritan
7
+ version: 1.0.0
8
+ date: 2026-04-08
9
+ ---
10
+
11
+ # Skill: /sf-extract
12
+
13
+ > Skill atômica de extração. Lê insumos brutos do PM/ e gera PRD ou TRD.
14
+ > Chamada via orquestrador (/feature, /sf-setup-projeto) ou diretamente para re-extração.
15
+
16
+ ## Tipo
17
+ Atômica — Multi-agent
18
+
19
+ ## Uso
20
+ ```
21
+ /sf-extract <nome>
22
+ ```
23
+ Exemplo: `/sf-extract feat_cadastro_cliente`
24
+
25
+ ---
26
+
27
+ ## Agentes
28
+
29
+ | Agente | Papel | Modelo | Input | Output |
30
+ |--------|-------|--------|-------|--------|
31
+ | **Reader** | Lê e cataloga 1 arquivo de insumo | Sonnet | 1 arquivo bruto + formato esperado | Resumo estruturado por seção do template |
32
+ | **Analyzer** | Cruza fontes, detecta gaps, gera documento final | Opus | Outputs de todos os Readers + template + contexto do projeto | PRD/TRD completo + extract-log |
33
+
34
+ ### Orquestração
35
+ ```
36
+ 1. Ler .context.md e .extract-log.md (se existir)
37
+ 2. Ler discovery.md (se existir) — análise profunda prévia dos insumos
38
+ 3. Inventariar arquivos em docs/PM/{nome}/ → filtrar NOVOS e MODIFICADOS
39
+ 4. Spawn 1 Reader por arquivo NOVO/MODIFICADO (paralelo)
40
+ 5. Aguardar todos os Readers
41
+ 6. Spawn Analyzer com:
42
+ - Outputs concatenados dos Readers
43
+ - discovery.md (se existir) — mapa do sistema pré-validado
44
+ - PRD/TRD existente (se re-extração)
45
+ - Template (PRD.template.md ou TRD.template.md)
46
+ - docs/Estrutura/ (contexto do projeto)
47
+ 7. Analyzer gera documento final + extract-log
48
+ 8. Atualizar .context.md → status: extract_done
49
+ ```
50
+
51
+ > **Se discovery.md existir**: O Analyzer usa o mapa do sistema, perguntas já respondidas
52
+ > e pontos críticos como contexto enriquecido. Resultado: menos ambiguidades, melhor estruturação.
53
+ > **Se não existir**: O Analyzer trabalha normalmente com os outputs dos Readers.
54
+
55
+ ### Agent: Reader (Sonnet)
56
+
57
+ **Papel**: Especialista em leitura e catalogação de um único arquivo de insumo.
58
+
59
+ **Comportamento**:
60
+ - Lê 1 arquivo por vez
61
+ - Extrai informações seguindo as categorias do template alvo
62
+ - Não interpreta, não infere — apenas cataloga o que encontra
63
+ - Marca cada informação com a seção do template onde se encaixa
64
+
65
+ **Formatos e o que extrair:**
66
+
67
+ | Formato | Extensões | O que extrair |
68
+ |---------|-----------|---------------|
69
+ | Texto/Requisitos | `.md`, `.txt` | Requisitos, regras de negócio, contexto, restrições |
70
+ | Banco de dados | `.sql` | Entidades, campos, tipos, constraints, índices, relações |
71
+ | Protótipos | `.html` | Telas, campos (`data-field`), ações (`data-action`), validações (`data-validation`), rotas (`data-route`), permissões (`data-permission`), estados (`data-state`) |
72
+ | Diagramas | `.xml` (drawio), `.json` | Fluxos, decisões, atores, sequências |
73
+ | Planilhas | `.csv` | Dados tabulares, mapeamentos, configurações |
74
+ | Imagens | `.png`, `.jpg`, `.pdf` | Wireframes, mockups, fluxogramas (análise visual) |
75
+ | Outros | qualquer | Extrair o que for relevante — nunca ignorar um arquivo |
76
+
77
+ **Output do Reader** (por arquivo):
78
+ ```markdown
79
+ ## Reader Output: {nome_arquivo}
80
+ - Hash: {sha256_8chars}
81
+ - Formato: {tipo}
82
+ - Status: extraído | parcial | não identificado
83
+
84
+ ### Seções alimentadas:
85
+ - §1 Contexto: ...
86
+ - §3 Entidades: ...
87
+ - §5 Regras: RN-XXX: "descrição"
88
+ - §13 Ambiguidades: "campo X definido mas sem tipo especificado"
89
+ ```
90
+
91
+ **Quando o Reader NÃO consegue extrair conteúdo:**
92
+ - Status: `não identificado` — arquivo binário desconhecido, corrompido, ou sem conteúdo relevante
93
+ - Status: `parcial` — conseguiu extrair algo mas o formato limita (ex: imagem sem OCR, PDF escaneado)
94
+ - O Reader NUNCA ignora o arquivo — sempre registra no output com o status
95
+ - O Analyzer inclui arquivo não identificado no extract-log com classificação `NÃO IDENTIFICADO`
96
+ - O Analyzer gera ambiguidade: "Arquivo {nome} não pôde ser processado — verifique conteúdo e formato"
97
+
98
+ ### Agent: Analyzer (Opus)
99
+
100
+ **Papel**: Especialista em análise cruzada, detecção de gaps e geração de documento estruturado.
101
+
102
+ **Comportamento**:
103
+ - Nunca assume — se não está explícito nos insumos, vira pergunta bloqueante
104
+ - Busca contradições ativamente entre fontes diferentes
105
+ - Rastreia tudo — cada informação aponta para o arquivo fonte
106
+ - Prefere estrutura a narrativa — tabelas e listas, nunca texto livre
107
+ - Pessimista construtivo — melhor uma ambiguidade a mais do que uma regra inventada
108
+
109
+ **Responsabilidades**:
110
+ 1. Consolidar outputs dos Readers em visão unificada
111
+ 2. Detectar contradições entre fontes → gerar ambiguidade com os dois arquivos citados
112
+ 3. Detectar gaps — seções do template sem informação → gerar ambiguidade
113
+ 4. **Validar Checklist de Temas Críticos** (ver abaixo) — temas ausentes viram ambiguidades obrigatórias
114
+ 5. Nunca inferir regra de negócio — se não está explícito, é ambiguidade
115
+ 6. Manter IDs estáveis (RN-001 nunca renumera, novos continuam sequência)
116
+ 7. Gerar rastreabilidade completa (§14 PRD / §10 TRD)
117
+ 8. Na re-extração: merge ADITIVO com documento existente, marcar seções atualizadas
118
+
119
+ ### Checklist de Temas Críticos (Analyzer)
120
+
121
+ Após consolidar os Readers, o Analyzer DEVE verificar se os insumos cobrem os temas abaixo.
122
+ Se um tema **não foi mencionado em nenhum insumo**, gera **ambiguidade obrigatória** pedindo ao usuário.
123
+
124
+ #### Para TRD (setup):
125
+
126
+ | # | Tema | O que verificar | Se ausente |
127
+ |---|------|-----------------|------------|
128
+ | 1 | **Autenticação** | Qual mecanismo? JWT, OAuth, API Key, Session? | Ambiguidade: "Nenhum mecanismo de autenticação definido nos insumos" |
129
+ | 2 | **Autorização / Roles** | Quais perfis? RBAC, ABAC? Quem acessa o quê? | Ambiguidade: "Perfis de acesso e regras de autorização não definidos" |
130
+ | 3 | **Separação de serviços** | É monolito, microserviços, modular? API e Worker são separados? | Ambiguidade: "Arquitetura de serviços não definida (monolito vs separados)" |
131
+ | 4 | **Ambientes** | Dev, staging, prod? Docker? CI/CD? | Ambiguidade: "Estratégia de ambientes e deploy não definida" |
132
+ | 5 | **Dados sensíveis** | PII, LGPD, criptografia, masking? | Ambiguidade: "Tratamento de dados sensíveis / LGPD não mencionado" |
133
+
134
+ #### Para PRD (feature):
135
+
136
+ | # | Tema | O que verificar | Se ausente |
137
+ |---|------|-----------------|------------|
138
+ | 1 | **Autenticação requerida** | Feature exige login? Quais endpoints são públicos vs autenticados? | Ambiguidade: "Não definido quais operações exigem autenticação" |
139
+ | 2 | **Permissões / Roles** | Quais perfis podem executar cada ação? | Ambiguidade: "Não definido quais perfis têm acesso a cada operação" |
140
+ | 3 | **Validações de entrada** | Regras de validação dos campos? Limites? Formatos? | Ambiguidade: "Validações de entrada não detalhadas" |
141
+ | 4 | **Tratamento de erros** | O que acontece quando dá errado? Mensagens ao usuário? | Ambiguidade: "Cenários de erro e mensagens ao usuário não definidos" |
142
+ | 5 | **Impacto em dados existentes** | A feature altera dados existentes? Migração necessária? | Ambiguidade: "Impacto em dados existentes não avaliado" |
143
+
144
+ > **Regra**: O Analyzer NÃO inventa respostas para esses temas. Se não está nos insumos, PERGUNTA.
145
+ > Esses temas são os mais comuns de serem esquecidos pelo usuário e os mais caros de corrigir depois.
146
+
147
+ ---
148
+
149
+ ## Pré-condições
150
+
151
+ | # | Validação | Se falhar |
152
+ |---|-----------|-----------|
153
+ | 1 | Argumento `nome` foi informado | Parar → "Informe o nome. Ex: /sf-extract feat_cadastro_cliente" |
154
+ | 2 | `docs/PM/{nome}/` existe e contém pelo menos 1 arquivo (ignorar .gitkeep) | Parar → "Pasta de insumos vazia ou inexistente" |
155
+ | 3 | `docs/Desenvolvimento/{nome}/.context.md` existe | Parar → "Execute /sf-feature {nome} ou /sf-setup-projeto primeiro" |
156
+ | 4 | Status em `.context.md` é `not_started` ou `extract_done` | Se `approved` ou posterior → "Extração já aprovada. Para re-extrair, o status será revertido para extract_done" |
157
+
158
+ ## Passos detalhados
159
+
160
+ ### 1. Ler contexto
161
+ - Ler `.context.md` → identificar `tipo` (feature ou setup) e `documento` (PRD ou TRD)
162
+ - Ler `docs/Estrutura/` se existir (contexto para extração coerente)
163
+ - Selecionar template: `tipo=feature` → `PRD.template.md` | `tipo=setup` → `TRD.template.md`
164
+
165
+ ### 2. Inventariar e classificar insumos
166
+ Ler todos os arquivos em `docs/PM/{nome}/`. Para cada arquivo, calcular hash (SHA-256 truncado 8 chars).
167
+
168
+ Se `.extract-log.md` existir, classificar:
169
+
170
+ | Classificação | Critério | Ação |
171
+ |---------------|----------|------|
172
+ | **NOVO** | Arquivo não existe no log | Processar |
173
+ | **MODIFICADO** | Hash diferente do log | Reprocessar |
174
+ | **INALTERADO** | Hash igual ao log | Pular |
175
+
176
+ Se `.extract-log.md` não existir: todos são NOVOS.
177
+
178
+ ### 3. Spawn Readers (paralelo)
179
+ Para cada arquivo NOVO ou MODIFICADO, disparar 1 Reader (Sonnet):
180
+ - Input: arquivo bruto + seções do template alvo
181
+ - Output: resumo estruturado por seção
182
+
183
+ Arquivos INALTERADOS: pular — informação já está no PRD/TRD existente.
184
+
185
+ ### 4. Spawn Analyzer (sequencial)
186
+ Após todos Readers concluírem, disparar Analyzer (Opus) com:
187
+ - Todos os outputs dos Readers
188
+ - PRD/TRD existente (se re-extração — para merge aditivo)
189
+ - Template correspondente
190
+ - `docs/Estrutura/` como contexto
191
+
192
+ ### 5. Gerar/atualizar documento
193
+
194
+ **Primeira extração:**
195
+ - Analyzer gera PRD.md ou TRD.md completo a partir do template
196
+
197
+ **Re-extração:**
198
+ - Merge ADITIVO com o documento existente (nunca remove info de arquivos inalterados)
199
+ - Seções afetadas recebem marcador:
200
+ ```
201
+ <!-- ATUALIZADO: re-extração {{ISO_DATE}} — arquivos: {lista} -->
202
+ ```
203
+ - Novas regras de negócio continuam sequência de IDs existentes
204
+
205
+ ### 6. Gerar roadmap de produto faseado (APENAS no setup)
206
+ Quando tipo=setup, o Analyzer encontra informações que não são infraestrutura
207
+ (regras de negócio, jornadas, telas, fluxos). Em vez de descartar, organizar em
208
+ `backlog_extraido.md` como **roadmap faseado** com entregáveis incrementais:
209
+
210
+ O Analyzer deve:
211
+ 1. Identificar funcionalidades, entidades, regras de negócio, jornadas, telas
212
+ 2. Mapear dependências entre elas (ex: agendamento depende de cadastro de clientes)
213
+ 3. Agrupar em **fases de entrega** por dependência + complexidade
214
+ 4. Para cada fase: definir entregável + critério de done
215
+ 5. Sugerir **1 feature única** com nome descritivo (ex: `feat_mvp`)
216
+ 6. Usar template `backlog-extraido.template.md`
217
+
218
+ **Princípio**: Entregáveis contínuos — cada fase entrega valor e pode ir pra produção.
219
+ Máximo 4-5 fases. Fase 1 sempre = fundação/cadastros base.
220
+
221
+ Este arquivo:
222
+ - É gerado APENAS no setup (não em features)
223
+ - Serve como roadmap quando o usuário for criar `/feature`
224
+ - O /sf-extract da feature usa as fases como referência para o PRD
225
+
226
+ ### 7. Gerar/atualizar `.extract-log.md`
227
+
228
+ ```markdown
229
+ # Extract Log — {nome}
230
+
231
+ ## Extração 1 — {{ISO_DATETIME}}
232
+ | Arquivo | Hash | Classificação | Seções alimentadas |
233
+ |---------|------|---------------|-------------------|
234
+ | requisitos.txt | a1b2c3d4 | NOVO | §1, §5, §9 |
235
+ | modelagem.sql | e5f6g7h8 | NOVO | §3, §6 |
236
+
237
+ ## Extração 2 — {{ISO_DATETIME}}
238
+ | Arquivo | Hash | Classificação | Seções alimentadas |
239
+ |---------|------|---------------|-------------------|
240
+ | novas_regras.md | m3n4o5p6 | NOVO | §5, §9 |
241
+ | modelagem.sql | q7r8s9t0 | MODIFICADO | §3 |
242
+ | requisitos.txt | a1b2c3d4 | INALTERADO | — |
243
+ ```
244
+
245
+ ### 7. Atualizar `.context.md`
246
+ ```yaml
247
+ status: "extract_done"
248
+ ultima_skill: "/sf-extract"
249
+ atualizado_em: "{{ISO_DATETIME}}"
250
+ ```
251
+
252
+ ---
253
+
254
+ ## Saídas
255
+
256
+ | Arquivo | Descrição |
257
+ |---------|-----------|
258
+ | `PRD.md` ou `TRD.md` | Documento de extração com todas as seções preenchidas |
259
+ | `.extract-log.md` | Registro de arquivos processados com hashes e classificação |
260
+ | `.context.md` | Atualizado com status `extract_done` |
261
+
262
+ ## Pós-condições
263
+ - Documento gerado com rastreabilidade completa
264
+ - Ambiguidades listadas na seção correspondente — bloqueiam avanço no `/design`
265
+ - Usuário deve revisar antes de chamar `/design`
266
+
267
+ ## Erros
268
+
269
+ | Erro | Ação |
270
+ |------|------|
271
+ | PM/{nome}/ vazio | Parar, listar formatos aceitos |
272
+ | .context.md não existe | Parar, sugerir /sf-feature ou /sf-setup-projeto |
273
+ | Nenhum arquivo novo/modificado | Informar "Nenhuma alteração detectada desde a última extração" |
274
+ | Formato não reconhecido | Processar mesmo assim, extrair o que for possível, avisar no log |
275
+ | Conteúdo não identificado | Registrar como NÃO IDENTIFICADO no extract-log, gerar ambiguidade pedindo ao usuário verificar o arquivo |
276
+ | Extração parcial | Registrar como PARCIAL no extract-log, extrair o que for possível, avisar quais seções ficaram incompletas |
277
+ | Contradição entre arquivos | Analyzer gera ambiguidade citando os dois arquivos e a contradição |
278
+
279
+ ## Notas
280
+ - O `/extract` é a ÚNICA skill que lê `docs/PM/` — nenhuma outra skill acessa insumos brutos
281
+ - Na re-extração, o merge é ADITIVO — nunca remove informação de arquivos inalterados
282
+ - Para recomeçar do zero: apagar PRD/TRD e .extract-log.md manualmente
283
+ - Readers são stateless — não conhecem outros arquivos, apenas o seu
284
+ - Analyzer é quem tem visão global e detecta contradições cross-arquivo