jarvis-ai-framework 1.0.3 → 1.1.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 (44) hide show
  1. package/AGENTS.md +10 -7
  2. package/agents/AGENTS.md +4 -3
  3. package/agents/README.md +6 -4
  4. package/agents/product/prod.discovery-interviewer.md +86 -0
  5. package/bin/commands/init.js +1 -1
  6. package/bin/lib/config/constants.js +12 -0
  7. package/bin/lib/core/sync-engine.js +12 -0
  8. package/package.json +2 -5
  9. package/rules/AGENTS.md +1 -1
  10. package/rules/engineering/eng.breakdown-subtasks-rules.md +208 -37
  11. package/rules/engineering/eng.start-rules.md +11 -11
  12. package/rules/engineering/eng.work-rules.md +19 -14
  13. package/rules/product/README.md +2 -0
  14. package/rules/product/prod-rules.md +3 -1
  15. package/{skills/prod-specs/rules/prod-spec-rules.md → rules/product/prod.spec-rules.md} +55 -50
  16. package/skills/SKILLS-ROADMAP.md +2 -6
  17. package/skills/init-jarvis/SKILL.md +1 -1
  18. package/skills/prod-specs/SKILL.md +20 -84
  19. package/templates/AGENTS.md +7 -6
  20. package/templates/ENV-template.md +1 -1
  21. package/templates/product/prod-discovery-template.md +98 -0
  22. package/{skills/prod-specs/templates → templates/product}/prod-epic-template.md +1 -0
  23. package/{skills/prod-specs/templates → templates/product}/prod-frd-template.md +1 -0
  24. package/{skills/prod-specs/templates → templates/product}/prod-issue-template.md +1 -0
  25. package/{skills/prod-specs/templates → templates/product}/prod-prd-template.md +1 -0
  26. package/workflows/AGENTS.md +3 -1
  27. package/workflows/README.md +2 -0
  28. package/workflows/engineering/eng.build-tech-spec.md +37 -48
  29. package/workflows/engineering/eng.work.md +1 -1
  30. package/workflows/engineering/qa/eng.qa-quality-report.md +0 -5
  31. package/workflows/product/prod.spec.breakdown.md +3 -8
  32. package/workflows/product/prod.spec.discovery.md +152 -0
  33. package/workflows/product/prod.spec.epic.md +3 -0
  34. package/workflows/product/prod.spec.frd.md +123 -8
  35. package/workflows/product/prod.spec.issue.md +3 -2
  36. package/workflows/product/prod.spec.md +2 -0
  37. package/workflows/product/prod.spec.prd.md +105 -6
  38. package/skills/prod-specs/references/prod.spec.clarify.md +0 -176
  39. package/skills/prod-specs/references/prod.spec.epic.md +0 -107
  40. package/skills/prod-specs/references/prod.spec.frd.md +0 -135
  41. package/skills/prod-specs/references/prod.spec.issue.md +0 -145
  42. package/skills/prod-specs/references/prod.spec.prd.md +0 -118
  43. package/skills/prod-specs/templates/prod-prd-full-template.md +0 -159
  44. /package/{skills/prod-specs/templates → templates/product}/prod-breakdown-template.md +0 -0
package/AGENTS.md CHANGED
@@ -21,7 +21,7 @@ prompts/
21
21
  │ ├── MCPs.md # Integracoes MCP
22
22
  │ ├── LEGACY_PROJECTS.md # Guia para projetos legados
23
23
  │ │
24
- │ ├── agents/ # 17 ativos + 5 arquivados
24
+ │ ├── agents/ # 18 ativos + 5 arquivados
25
25
  │ │ ├── engineering/ # Agentes de engenharia (14 ativos: 7 main + 6 QA + 1 Data)
26
26
  │ │ │ ├── eng.agent.md
27
27
  │ │ │ ├── eng.cybersecurity.agent.md # Cybersecurity e AppSec (SENTINEL)
@@ -33,8 +33,9 @@ prompts/
33
33
  │ │ │ ├── data/ # 1 agente de Data
34
34
  │ │ │ │ └── eng.data-engineer.agent.md
35
35
  │ │ │ └── qa/ # 6 agentes de QA
36
- │ │ ├── product/ # Agentes de produto (1 ativo)
37
- │ │ │ └── prod.pm-checker.md
36
+ │ │ ├── product/ # Agentes de produto (2 ativos)
37
+ │ │ │ ├── prod.pm-checker.md
38
+ │ │ │ └── prod.discovery-interviewer.md
38
39
  │ │ └── archive/ # Agentes arquivados (uso especializado)
39
40
  │ │ ├── architecture-design/ # 2 agentes
40
41
  │ │ ├── implementation/ # 2 agentes
@@ -44,7 +45,7 @@ prompts/
44
45
  │ │ ├── engineering/ # 25 workflows de engenharia
45
46
  │ │ │ ├── data/ # 2 workflows de dados (data.new-pipeline, data.contract)
46
47
  │ │ │ └── frontend/ # 3 workflows de frontend (component, review, perf-audit)
47
- │ │ └── product/ # 6 workflows de produto
48
+ │ │ └── product/ # 7 workflows de produto
48
49
  │ │
49
50
  │ ├── skills/ # 50 skills
50
51
  │ │ ├── claude-plugin-creator/
@@ -85,7 +86,8 @@ prompts/
85
86
  │ │ ├── churn-audit/ # Análise de churn SaaS por squad com relatório narrativo via Slack
86
87
  │ │
87
88
  │ ├── templates/ # Templates de documentos
88
- │ │ └── engineering/ # ARD, RFC, Tech Spec
89
+ │ │ ├── engineering/ # ARD, RFC, Tech Spec
90
+ │ │ └── product/ # PRD, FRD, épico, issue, breakdown, discovery
89
91
  │ │
90
92
  │ ├── rules/ # Regras especificas (filtradas por perfil no init-jarvis)
91
93
  │ │ ├── rtk-rules.md # RTK Token Killer (opt-in: RTK_ENABLED=true)
@@ -261,7 +263,7 @@ Cada pasta pode ter seu proprio AGENTS.md com instrucoes especificas:
261
263
  ```bash
262
264
  /eng.start "feature" # Investigacao e arquitetura (somente planejamento)
263
265
  /eng.plan "feature" # Plano de execucao faseado (somente planejamento)
264
- /eng.work "feature" # Implementacao e testes (sem commits/PR)
266
+ /eng.work "feature" # Implementacao e testes (commit por fase, sem push/PR)
265
267
  /eng.pre-pr # Validacao pre-PR
266
268
  /eng.pr # Cria branch, commit e PR
267
269
  ```
@@ -347,7 +349,7 @@ Quando um agente atua em tema com skill correspondente, o skill e a fonte de ver
347
349
  | Fase | Comando | Restricao |
348
350
  |------|---------|-----------|
349
351
  | Planejamento | `eng.start`, `eng.plan` | Somente analise, sem codigo |
350
- | Implementacao | `eng.work` | Codigo e testes, sem commits |
352
+ | Implementacao | `eng.work` | Codigo e testes, commit por fase, sem push nem PR |
351
353
  | Entrega | `eng.pr` | Branch, commit e PR |
352
354
 
353
355
  ---
@@ -378,6 +380,7 @@ Quando um agente atua em tema com skill correspondente, o skill e a fonte de ver
378
380
 
379
381
  ### Produto (Ativo)
380
382
  - `prod.pm-checker.md` - Validacao de requisitos
383
+ - `prod.discovery-interviewer.md` - Entrevistador de discovery: investiga uma ideia sem chutar e gera um rascunho estruturado
381
384
 
382
385
  ### Arquivados
383
386
  Disponiveis em `$IDE/agents/archive/` organizados por categoria.
package/agents/AGENTS.md CHANGED
@@ -29,8 +29,9 @@ agents/
29
29
  │ ├── eng.qa.quality-champion-task-agent.md
30
30
  │ ├── eng.qa.cypress-specialist.md
31
31
  │ └── eng.qa.quality-strategist.md
32
- ├── product/ # Agentes ativos de produto (1 agent)
33
- │ └── prod.pm-checker.md
32
+ ├── product/ # Agentes ativos de produto (2 agents)
33
+ │ ├── prod.pm-checker.md
34
+ │ └── prod.discovery-interviewer.md
34
35
  └── archive/ # Biblioteca de agentes arquivados (9 agents)
35
36
  ├── architecture-design/ # 2 agents
36
37
  ├── implementation/ # 2 agents
@@ -174,7 +175,7 @@ ENABLE_CDD=true
174
175
 
175
176
  ### Ativos (em uso regular)
176
177
  - `engineering/` - Agentes de engenharia (12 agents: 5 main + 6 QA + 1 Data)
177
- - `product/` - Agentes de produto (1 agent)
178
+ - `product/` - Agentes de produto (2 agents)
178
179
 
179
180
  ### Arquivados (biblioteca de referência)
180
181
  - `archive/` - Agentes genéricos organizados por área funcional (11 agents)
package/agents/README.md CHANGED
@@ -24,16 +24,17 @@ agents/
24
24
  │ │ └── eng.data-engineer.agent.md
25
25
  │ └── qa/ # QA específico de engenharia (6 agents)
26
26
  ├── product/ # 🎯 Agentes do domínio de Produto (ATIVOS)
27
- │ └── prod.pm-checker.md # Product Manager checker
27
+ │ ├── prod.pm-checker.md # Product Manager checker
28
+ │ └── prod.discovery-interviewer.md # Entrevistador de discovery
28
29
  └── archive/ # 📦 Biblioteca de agentes arquivados
29
30
  └── product/ # Product WIP (5)
30
31
  ```
31
32
 
32
33
  **📊 Total:**
33
- - **16 agents ativos** (prontos para uso)
34
+ - **17 agents ativos** (prontos para uso)
34
35
  - Engineering main: 8 (6 main + 1 data + subpasta qa)
35
36
  - QA: 6
36
- - Product: 1
37
+ - Product: 2
37
38
  - **5 agents arquivados** (uso especializado quando necessário)
38
39
 
39
40
  ---
@@ -73,13 +74,14 @@ Agentes específicos para fluxos e regras do domínio de Engenharia.
73
74
 
74
75
  ---
75
76
 
76
- ## 🎯 2. Produto (1 agente)
77
+ ## 🎯 2. Produto (2 agentes)
77
78
 
78
79
  **Pasta**: `product/`
79
80
 
80
81
  Agentes específicos para fluxos e validações do domínio de Produto.
81
82
 
82
83
  - `prod.pm-checker.md` - `@prod.pm-checker`
84
+ - `prod.discovery-interviewer.md` - `@prod.discovery-interviewer`: entrevista o usuário sobre uma ideia e gera o rascunho de discovery
83
85
 
84
86
  ---
85
87
 
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: prod.discovery-interviewer
3
+ description: Entrevistador de produto que conduz o discovery de uma ideia: entende o problema, os requisitos iniciais e a viabilidade sem chutar, e registra tudo em um rascunho estruturado.
4
+ tools: Read, Write, Edit, Glob, Grep, LS, Bash
5
+ model: sonnet
6
+ ---
7
+
8
+ # @prod.discovery-interviewer
9
+
10
+ Entrevistador de produto do Jarvis. Conduz o `/prod.spec.discovery`: transforma uma ideia ainda crua em um rascunho estruturado, com o que se sabe, o que é hipótese e o que ainda é lacuna, e indica o próximo passo.
11
+
12
+ As regras de escrita de especificação ficam em `rules/product/` (`prod.spec-rules.md`). O fluxo do comando (criação e retomada do arquivo, veredito, limites) está no workflow `workflows/product/prod.spec.discovery.md`; este arquivo define a **postura**.
13
+
14
+ ## Persona
15
+
16
+ Você é um product manager experiente e curioso, e faz o papel de entrevistador: a qualidade do discovery depende das perguntas certas, não de preencher um formulário.
17
+
18
+ - **Faz perguntas abertas** e escuta a resposta antes de formular a próxima
19
+ - **Aprofunda respostas rasas**: "por quê?", "para quem?", "com que frequência?", "me dá um exemplo real", "o que acontece hoje?"
20
+ - **Pede evidência** quando ouve uma afirmação sem base ("todo mundo quer") e registra se ela é dado, observação ou suposição
21
+ - **Aponta contradições**, entre respostas ou entre o que o usuário disse e o que está no projeto, e pede que o usuário resolva
22
+ - **Levanta o que o usuário provavelmente não considerou**: quem mais é impactado, custo de manutenção, o que acontece se der errado, a alternativa mais simples
23
+ - **Adapta o roteiro às respostas**: não segue uma lista fixa e não repete temas já esgotados
24
+ - Tom direto e respeitoso; não julga a ideia, testa a ideia
25
+
26
+ ## Objetivo
27
+
28
+ Ajudar o usuário a fazer o melhor discovery possível de uma ideia, cobrindo quatro eixos:
29
+
30
+ 1. **Ideia**: o que é e para quem
31
+ 2. **Problema**: qual dor, que evidência existe, quem sofre, como se resolve hoje
32
+ 3. **Requisitos iniciais**: o que precisaria ser verdade, em alto nível, como hipóteses
33
+ 4. **Viabilidade**: sinal indicativo de valor, usabilidade, técnica e negócio, com riscos e dependências
34
+
35
+ O resultado é um arquivo no formato do template `$PROD_TEMPLATES/prod-discovery-template.md` (`templates/product/prod-discovery-template.md`), terminando com um veredito (`proceed`, `investigate_more` ou `do_not_proceed`) e um próximo passo sugerido.
36
+
37
+ ## Quando Usar
38
+
39
+ - O usuário tem uma ideia e ainda não sabe se o problema é real, quais são os requisitos ou se é viável
40
+ - O usuário roda `/prod.spec.discovery`, com uma ideia ou apontando um discovery existente para retomar
41
+ - O `/prod.spec` identifica que só existe uma ideia inicial
42
+
43
+ Não use quando já existe uma spec (use `/prod.spec.clarify`) ou quando o escopo já está claro e o usuário quer documentá-lo (use `/prod.spec.prd`, `/prod.spec.frd` ou `/prod.spec.issue`).
44
+
45
+ ## Entrada
46
+
47
+ - A ideia em texto livre (`$ARGUMENTS`), ou o caminho ou nome de um discovery existente para retomar
48
+ - O contexto do projeto: `ENV.md`, documentos em `$PROD_DOCS` e o código, lidos antes de perguntar
49
+
50
+ ## Saída
51
+
52
+ - O arquivo `$PROD_DOCS/discoveries/discovery-{id}-{nome}.md`, preenchido pelo template e atualizado a cada tema
53
+ - Uma seção de **Próximo passo sugerido**, sempre presente e sempre só uma sugestão
54
+
55
+ ## Como conduzir a entrevista
56
+
57
+ 1. **Comece explicando** em poucas linhas que vai entrevistar, quais temas cobrirá (ideia, problema, requisitos, viabilidade) e que o usuário pode responder "não sei" a qualquer momento
58
+ 2. **Consulte o projeto antes de perguntar**: documentos existentes (para não duplicar um PRD) e o código (para embasar a viabilidade)
59
+ 3. **Uma pergunta por vez.** Use o `AskUserQuestion` quando estiver disponível; caso contrário, o formato de tabela do `prod-rules.md`. Espere a resposta antes de seguir
60
+ 4. **Se o usuário não responde ou diz "não sei"**, não repita a pergunta: registre "não informado" e siga
61
+ 5. **Ao cobrir um tema**, resuma em poucas linhas o que entendeu e peça confirmação antes de passar ao próximo
62
+ 6. **Priorize as perguntas de maior impacto** na decisão de seguir ou não, em vez de esgotar todas as possíveis
63
+ 7. **Quando achar que já tem informação suficiente**, proponha encerrar e pergunte se o usuário quer acrescentar algo antes de fechar o documento
64
+
65
+ ## Não chute (regra inviolável)
66
+
67
+ - Quando você não tem uma informação (público, volume, custo, prazo, restrição técnica, comportamento de usuários, estado atual do código), **não presuma nem complete com "o que costuma ser"**: pergunte, busque no projeto ou registre como lacuna
68
+ - Todo fato citado indica a origem: resposta do usuário, arquivo do projeto ou documentação consultada. O que não tem origem entra no documento como **suposição a validar**
69
+ - Se o usuário pedir "preencha o que faltar" ou "assuma o padrão", registre o item como **suposição explícita**, nunca como fato, e não a use para sustentar o veredito
70
+ - Uma **lacuna crítica nunca** resulta em `proceed`: o veredito é `investigate_more`
71
+ - Quando a viabilidade técnica depende de bibliotecas, APIs ou serviços, consulte a documentação atual (por exemplo via Context7) em vez de responder de memória
72
+
73
+ ## Apoio de skills (apoio, nunca a fonte da decisão)
74
+
75
+ - **Sempre:** busca em `$PROD_DOCS`; `docs-central` quando `CENTRAL_DOCS_REPO` estiver configurado; `context-detect` para calibrar a profundidade da entrevista
76
+ - **Só com a confirmação do usuário:** `eng-arch-c4` (arquitetura atual) e `eng-cybersecurity` (quando a ideia envolve autenticação, dados pessoais ou fluxo financeiro). São skills de engenharia: pergunte antes de consultá-las, e o que retornarem entra no discovery como **suposição a validar**, não como fato
77
+
78
+ ## Restrições
79
+
80
+ - **O discovery é um rascunho.** Você **não** gera PRD, FRD, épico, issue, tarefas, histórias, critérios de aceitação nem estimativas (horas ou pontos). Se o usuário pedir, explique que é outra etapa e indique o comando certo
81
+ - **Não escreve código** e não implementa nada
82
+ - **Não grava credenciais, tokens nem dados pessoais de clientes** no arquivo: o discovery é versionado
83
+ - **Não entrevista terceiros**: a entrevista é sempre com o usuário que executou o comando
84
+ - **Não executa o próximo passo**: só sugere. O usuário pode escolher outro caminho ou parar ali
85
+ - Um rascunho de abordagem técnica pode aparecer na viabilidade, sempre como hipótese a validar; a decisão de arquitetura pertence ao fluxo de engenharia
86
+ - Siga as regras de `$PROD_RULES` (`prod-rules.md`): validação do `ENV.md`, idioma (pt-BR por padrão, ou o idioma da interação do usuário) e confirmação antes de salvar arquivos
@@ -169,7 +169,7 @@ export async function init(flags) {
169
169
  `${BOLD}${CYAN} versão: ${pkg.name} v${pkg.version}${NC}`,
170
170
  );
171
171
  logger.info(`${DIM} origem: ${pkg.root}${NC}`);
172
- logger.info(`${DIM}Pasta criada: ${ideDir}${NC}`);
172
+ logger.info(`${DIM} pasta criada: ${ideDir}${NC}`);
173
173
  logger.info("");
174
174
 
175
175
  const all = discoverAll();
@@ -22,6 +22,18 @@ export const SYNC_DIRS = Object.freeze([
22
22
  "scripts",
23
23
  ]);
24
24
 
25
+ /**
26
+ * Caminhos que saíram do framework e são removidos das instalações que atualizam.
27
+ * Lista explícita, relativa à pasta da IDE (ex.: `.claude/`): o `init` nunca varre
28
+ * nem apaga nada fora dela. Para uma remoção futura, acrescente o caminho aqui.
29
+ * @constant {ReadonlyArray<string>}
30
+ */
31
+ export const OBSOLETE_PATHS = Object.freeze([
32
+ "skills/prod-specs/references",
33
+ "skills/prod-specs/templates",
34
+ "skills/prod-specs/rules",
35
+ ]);
36
+
25
37
  /**
26
38
  * Arquivos da raiz que devem ser sincronizados
27
39
  * @constant {ReadonlyArray<string>}
@@ -15,6 +15,7 @@ import { getIDEFolder } from "../config/ide-config.js";
15
15
  import {
16
16
  SYNC_DIRS,
17
17
  SYNC_ROOT_FILES,
18
+ OBSOLETE_PATHS,
18
19
  LOCK_FILE,
19
20
  OPENCODE_MODEL_MAP,
20
21
  OPENCODE_DEFAULT_PERMISSIONS,
@@ -134,6 +135,17 @@ export function syncAssets(targetDir, ide, opts = {}) {
134
135
  } catch {}
135
136
  }
136
137
 
138
+ // Cleanup de caminhos que saíram do framework (lista explícita em OBSOLETE_PATHS)
139
+ for (const obsolete of OBSOLETE_PATHS) {
140
+ const obsoletePath = join(ideDir, obsolete);
141
+ if (existsSync(obsoletePath) && !opts.dryRun) {
142
+ try {
143
+ rmSync(obsoletePath, { recursive: true, force: true });
144
+ result.copied.push(`(cleanup) .${getIDEFolder(ide)}/${obsolete} removed`);
145
+ } catch {}
146
+ }
147
+ }
148
+
137
149
  if (!opts.dryRun) {
138
150
  writeLockFile(targetDir, ideDir, ide, frameworkRoot);
139
151
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jarvis-ai-framework",
3
- "version": "1.0.3",
3
+ "version": "1.1.0",
4
4
  "description": "Jarvis framework",
5
5
  "type": "module",
6
6
  "bin": {
@@ -10,10 +10,7 @@
10
10
  "postinstall": "node bin/postinstall.js",
11
11
  "prepublishOnly": "echo 'Publishing jarvis-framework...'",
12
12
  "publish:gitlab": "npm publish",
13
- "test": "node test/e2e-docs-central.js",
14
- "test:utils": "node test/test-phase1-utils.js",
15
- "test:comandos": "node test/test-comandos-docs.js",
16
- "test:all": "npm run test:utils && npm run test"
13
+ "test:comandos": "node test/test-comandos-docs.js"
17
14
  },
18
15
  "files": [
19
16
  "bin/",
package/rules/AGENTS.md CHANGED
@@ -147,7 +147,7 @@ Links para documentacao relacionada.
147
147
  | Fase | Comandos | Restricao |
148
148
  |------|----------|-----------|
149
149
  | Planejamento | `eng.start`, `eng.plan` | Somente analise, SEM codigo |
150
- | Implementacao | `eng.work` | Codigo e testes, SEM commits |
150
+ | Implementacao | `eng.work` | Codigo e testes, commit por fase, SEM push nem PR |
151
151
  | Entrega | `eng.pr` | Branch, commit e PR |
152
152
 
153
153
  ### Seguranca
@@ -373,35 +373,32 @@ Ao gerar subtarefas com escopo de QA/testes, aplique a seguinte divisão **obrig
373
373
 
374
374
  ---
375
375
 
376
- ## Formato de Saída: JSON
376
+ ## Formato de Saída: Markdown
377
377
 
378
378
  ### Estrutura Obrigatória
379
379
 
380
- ```json
381
- {
382
- "subtasks": [
383
- {
384
- "summary": "[STACK] Título específico da subtarefa",
385
- "description": "Template completo com:\n\n## 🎯 O Que Você Vai Fazer\n\n... (resto conforme template acima)"
386
- },
387
- {
388
- "summary": "[STACK] Próxima subtarefa",
389
- "description": "..."
390
- }
391
- ]
392
- }
380
+ Uma seção por subtarefa, em Markdown puro, na ordem de implementação:
381
+
382
+ ```markdown
383
+ # Subtarefa N: [STACK] Título específico da subtarefa
384
+
385
+ **Depende de:** Subtarefa X (ou "nenhuma")
386
+ **Desbloqueia:** Subtarefa Y (ou "nenhuma")
387
+ **Paralela com:** Subtarefa Z (ou "nenhuma")
388
+
389
+ {Description ULTRA DETALHADA seguindo o template da seção "Estrutura de Subtarefa"}
390
+
391
+ ---
393
392
  ```
394
393
 
395
- ### Regras CRÍTICAS para o JSON
394
+ ### Regras CRÍTICAS de formatação
396
395
 
397
- 1. **APENAS JSON** - Sem texto antes ou depois
398
- 2. **Use `\n` para quebras de linha** dentro das strings
399
- 3. **Escape aspas com `\"`** dentro das strings
400
- 4. **Todos os títulos com [STACK]** - Obrigatório
401
- 5. **Description ULTRA DETALHADA** - Siga o template COMPLETAMENTE
402
- 6. **Código COMPLETO** - Não use "..." ou placeholder
403
- 7. **Caminhos reais** - Use paths que existem no projeto
404
- 8. **Valide JSON** - Antes de retornar
396
+ 1. **Markdown nativo** - sem JSON, sem strings escapadas, sem `\n`
397
+ 2. **Todos os títulos com [STACK]** - Obrigatório
398
+ 3. **Description ULTRA DETALHADA** - Siga o template COMPLETAMENTE
399
+ 4. **Código COMPLETO** - Não use "..." ou placeholder
400
+ 5. **Caminhos reais** - Use paths que existem no projeto
401
+ 6. **Numeração sequencial** - Subtarefa 1, Subtarefa 2, etc.
405
402
 
406
403
  ---
407
404
 
@@ -434,7 +431,7 @@ Cada subtarefa deve ter seção "🔗 Dependências" indicando:
434
431
 
435
432
  ## Checklist de Qualidade Final
436
433
 
437
- Antes de retornar o JSON, valide CADA subtarefa:
434
+ Antes de retornar, valide CADA subtarefa:
438
435
 
439
436
  ### ✅ Completude
440
437
 
@@ -479,7 +476,7 @@ Antes de retornar o JSON, valide CADA subtarefa:
479
476
 
480
477
  ### ✅ Validação
481
478
 
482
- - [ ] JSON é válido
479
+ - [ ] Saída em Markdown válido, uma seção por subtarefa
483
480
  - [ ] Nenhuma subtarefa vaga
484
481
  - [ ] Toda subtarefa tem ≥ 4h e ≤ 1 dia de trabalho
485
482
  - [ ] Nenhuma fatia horizontal (split por camada)
@@ -500,7 +497,7 @@ eng.build-tech-spec → tech-spec.md → eng.breakdown-subtasks
500
497
  ### Saída (para onde vai)
501
498
 
502
499
  ```
503
- eng.breakdown-subtasks → subtasks JSON → Jira
500
+ eng.breakdown-subtasks → subtarefas em Markdown → board
504
501
  ```
505
502
 
506
503
  ### Relação com Outros Workflows
@@ -550,12 +547,17 @@ eng.breakdown-subtasks → subtasks JSON → Jira
550
547
 
551
548
  ### ❌ MAL FEITA
552
549
 
553
- ```json
554
- {
555
- "summary": "[BACKEND] Criar autenticação",
556
- "description": "Implementar o sistema de autenticação com JWT.\n\nFaça: Login, registro e validação.\n\nUse bcrypt para senha e JWT para token.\n\nRetorne o usuário no login."
557
- }
558
- ```
550
+ ````markdown
551
+ # Subtarefa 1: [BACKEND] Criar autenticação
552
+
553
+ Implementar o sistema de autenticação com JWT.
554
+
555
+ Faça: Login, registro e validação.
556
+
557
+ Use bcrypt para senha e JWT para token.
558
+
559
+ Retorne o usuário no login.
560
+ ````
559
561
 
560
562
  **Problemas:**
561
563
 
@@ -567,12 +569,181 @@ eng.breakdown-subtasks → subtasks JSON → Jira
567
569
 
568
570
  ### ✅ BEM FEITA
569
571
 
570
- ````json
571
- {
572
- "summary": "[BACKEND] Criar endpoint POST /api/auth/register com validação",
573
- "description": "## 🎯 O Que Você Vai Fazer\n\nCriar o endpoint de registro que recebe email/senha, valida dados, cria usuário no banco e retorna JWT.\n\n---\n\n## 📋 Contexto\n\n### Por que?\nSistema precisa permitir novos usuários se cadastrem.\n\n### Pré-requisitos\n- [ ] Migration de usuários ([DATA] Criar migration tabela users)\n\n---\n\n## 🛠️ Stack\n\n| Tech | Versão | Para |\n|------|--------|------|\n| Express | 4.18+ | Framework HTTP |\n| bcrypt | 5.1+ | Hash de senha |\n| JWT | 9.0+ | Tokens |\n\n---\n\n## 📁 Arquivos\n\n| Arquivo | Ação | Descrição |\n|---------|------|--------|\n| `src/controllers/auth.controller.ts` | 🆕 | Controlador |\n| `src/services/auth.service.ts` | 🆕 | Lógica de negócio |\n| `src/routes/auth.ts` | 🆕 | Rotas |\n| `src/__tests__/auth.spec.ts` | 🆕 | Testes |\n\n---\n\n## 👣 Passos\n\n### Passo 1: Criar schema de validação\n\n```typescript\n// src/schemas/auth.schema.ts\nimport { body } from 'express-validator';\n\nexport const registerSchema = [\n body('email')\n .isEmail()\n .withMessage('Email inválido')\n .normalizeEmail(),\n body('password')\n .isLength({ min: 8 })\n .withMessage('Mínimo 8 caracteres')\n .matches(/[A-Z]/)\n .withMessage('Precisa letra maiúscula'),\n];\n```\n\n**Explicação:**\n- `isEmail()`: Valida formato\n- `normalizeEmail()`: Padroniza\n- `matches(/[A-Z]/)`: Regex para maiúscula\n\n---\n\n### Passo 2: Criar AuthService\n\n```typescript\n// src/services/auth.service.ts\nimport bcrypt from 'bcrypt';\nimport jwt from 'jsonwebtoken';\n\nexport class AuthService {\n async register(email: string, password: string) {\n // Hash da senha\n const hash = await bcrypt.hash(password, 10);\n \n // Criar usuário (assumindo repo existe)\n const user = await this.userRepo.create({\n email,\n passwordHash: hash,\n });\n \n // Gerar token\n const token = jwt.sign(\n { userId: user.id },\n process.env.JWT_SECRET!,\n { expiresIn: '24h' }\n );\n \n return { user, token };\n }\n}\n```\n\n**Explicação:**\n- `bcrypt.hash(password, 10)`: 10 salt rounds é seguro\n- `jwt.sign()`: Cria token que expira em 24h\n- Não retornamos passwordHash no response\n\n---\n\n## 🧪 Testes\n\n```typescript\n// src/__tests__/auth.spec.ts\nimport request from 'supertest';\nimport { app } from '../app';\n\ndescribe('POST /api/auth/register', () => {\n it('deve registrar com email e senha válidos', async () => {\n const response = await request(app)\n .post('/api/auth/register')\n .send({\n email: 'test@example.com',\n password: 'Senha123!',\n });\n \n expect(response.status).toBe(201);\n expect(response.body).toHaveProperty('token');\n });\n \n it('deve retornar 400 para email inválido', async () => {\n const response = await request(app)\n .post('/api/auth/register')\n .send({\n email: 'invalid',\n password: 'Senha123!',\n });\n \n expect(response.status).toBe(400);\n });\n});\n```\n\n### Cenários\n\n| Cenário | Input | Output |\n|---------|-------|--------|\n| Válido | email + senha válidos | 201 + token |\n| Email inválido | email sem @ | 400 VALIDATION_ERROR |\n| Senha fraca | < 8 chars | 400 VALIDATION_ERROR |\n\n---\n\n## ✅ Checklist\n\n- [ ] Schema criado\n- [ ] AuthService implementado\n- [ ] AuthController implementado\n- [ ] Rotas configuradas\n- [ ] Testes passando\n- [ ] Linter clean\n- [ ] Build ok\n\n---\n\n## ⚠️ Riscos\n\n| Risco | Como Evitar |\n|-------|-------------|\n| JWT_SECRET exposto | Usar .env, nunca commitar |\n| Senha em log | Não logar req.body |\n\n---\n\n## 🔗 Dependências\n\n**Depende de:** [DATA] Criar migration tabela users\n**Desbloqueia:** [FRONTEND] Criar tela de registro\n**Paralela com:** [INFRA] Configurar variáveis JWT\n"
572
+ `````markdown
573
+ # Subtarefa 1: [BACKEND] Criar endpoint POST /api/auth/register com validação
574
+
575
+ ## 🎯 O Que Você Vai Fazer
576
+
577
+ Criar o endpoint de registro que recebe email/senha, valida dados, cria usuário no banco e retorna JWT.
578
+
579
+ ---
580
+
581
+ ## 📋 Contexto
582
+
583
+ ### Por que?
584
+ Sistema precisa permitir novos usuários se cadastrem.
585
+
586
+ ### Pré-requisitos
587
+ - [ ] Migration de usuários ([DATA] Criar migration tabela users)
588
+
589
+ ---
590
+
591
+ ## 🛠️ Stack
592
+
593
+ | Tech | Versão | Para |
594
+ |------|--------|------|
595
+ | Express | 4.18+ | Framework HTTP |
596
+ | bcrypt | 5.1+ | Hash de senha |
597
+ | JWT | 9.0+ | Tokens |
598
+
599
+ ---
600
+
601
+ ## 📁 Arquivos
602
+
603
+ | Arquivo | Ação | Descrição |
604
+ |---------|------|--------|
605
+ | `src/controllers/auth.controller.ts` | 🆕 | Controlador |
606
+ | `src/services/auth.service.ts` | 🆕 | Lógica de negócio |
607
+ | `src/routes/auth.ts` | 🆕 | Rotas |
608
+ | `src/__tests__/auth.spec.ts` | 🆕 | Testes |
609
+
610
+ ---
611
+
612
+ ## 👣 Passos
613
+
614
+ ### Passo 1: Criar schema de validação
615
+
616
+ ```typescript
617
+ // src/schemas/auth.schema.ts
618
+ import { body } from 'express-validator';
619
+
620
+ export const registerSchema = [
621
+ body('email')
622
+ .isEmail()
623
+ .withMessage('Email inválido')
624
+ .normalizeEmail(),
625
+ body('password')
626
+ .isLength({ min: 8 })
627
+ .withMessage('Mínimo 8 caracteres')
628
+ .matches(/[A-Z]/)
629
+ .withMessage('Precisa letra maiúscula'),
630
+ ];
631
+ ```
632
+
633
+ **Explicação:**
634
+ - `isEmail()`: Valida formato
635
+ - `normalizeEmail()`: Padroniza
636
+ - `matches(/[A-Z]/)`: Regex para maiúscula
637
+
638
+ ---
639
+
640
+ ### Passo 2: Criar AuthService
641
+
642
+ ```typescript
643
+ // src/services/auth.service.ts
644
+ import bcrypt from 'bcrypt';
645
+ import jwt from 'jsonwebtoken';
646
+
647
+ export class AuthService {
648
+ async register(email: string, password: string) {
649
+ // Hash da senha
650
+ const hash = await bcrypt.hash(password, 10);
651
+
652
+ // Criar usuário (assumindo repo existe)
653
+ const user = await this.userRepo.create({
654
+ email,
655
+ passwordHash: hash,
656
+ });
657
+
658
+ // Gerar token
659
+ const token = jwt.sign(
660
+ { userId: user.id },
661
+ process.env.JWT_SECRET!,
662
+ { expiresIn: '24h' }
663
+ );
664
+
665
+ return { user, token };
666
+ }
574
667
  }
575
- ````
668
+ ```
669
+
670
+ **Explicação:**
671
+ - `bcrypt.hash(password, 10)`: 10 salt rounds é seguro
672
+ - `jwt.sign()`: Cria token que expira em 24h
673
+ - Não retornamos passwordHash no response
674
+
675
+ ---
676
+
677
+ ## 🧪 Testes
678
+
679
+ ```typescript
680
+ // src/__tests__/auth.spec.ts
681
+ import request from 'supertest';
682
+ import { app } from '../app';
683
+
684
+ describe('POST /api/auth/register', () => {
685
+ it('deve registrar com email e senha válidos', async () => {
686
+ const response = await request(app)
687
+ .post('/api/auth/register')
688
+ .send({
689
+ email: 'test@example.com',
690
+ password: 'Senha123!',
691
+ });
692
+
693
+ expect(response.status).toBe(201);
694
+ expect(response.body).toHaveProperty('token');
695
+ });
696
+
697
+ it('deve retornar 400 para email inválido', async () => {
698
+ const response = await request(app)
699
+ .post('/api/auth/register')
700
+ .send({
701
+ email: 'invalid',
702
+ password: 'Senha123!',
703
+ });
704
+
705
+ expect(response.status).toBe(400);
706
+ });
707
+ });
708
+ ```
709
+
710
+ ### Cenários
711
+
712
+ | Cenário | Input | Output |
713
+ |---------|-------|--------|
714
+ | Válido | email + senha válidos | 201 + token |
715
+ | Email inválido | email sem @ | 400 VALIDATION_ERROR |
716
+ | Senha fraca | < 8 chars | 400 VALIDATION_ERROR |
717
+
718
+ ---
719
+
720
+ ## ✅ Checklist
721
+
722
+ - [ ] Schema criado
723
+ - [ ] AuthService implementado
724
+ - [ ] AuthController implementado
725
+ - [ ] Rotas configuradas
726
+ - [ ] Testes passando
727
+ - [ ] Linter clean
728
+ - [ ] Build ok
729
+
730
+ ---
731
+
732
+ ## ⚠️ Riscos
733
+
734
+ | Risco | Como Evitar |
735
+ |-------|-------------|
736
+ | JWT_SECRET exposto | Usar .env, nunca commitar |
737
+ | Senha em log | Não logar req.body |
738
+
739
+ ---
740
+
741
+ ## 🔗 Dependências
742
+
743
+ **Depende de:** [DATA] Criar migration tabela users
744
+ **Desbloqueia:** [FRONTEND] Criar tela de registro
745
+ **Paralela com:** [INFRA] Configurar variáveis JWT
746
+ `````
576
747
 
577
748
  **Diferenças:**
578
749
 
@@ -18,19 +18,19 @@ O workflow `start` tem como **único objetivo** criar o documento de arquitetura
18
18
 
19
19
  O `start` é **estritamente proibido** de:
20
20
 
21
- | ❌ Proibido | ✅ Permitido |
22
- | ------------------------------------ | ----------------------------------------- |
23
- | Criar arquivos de código (.ts, .js) | Criar `architecture.md` |
24
- | Modificar código existente | Ler código para análise |
25
- | Executar comandos no terminal | Listar arquivos e estruturas |
26
- | Instalar dependências | Buscar padrões no codebase |
27
- | Fazer commits | Criar diretório da sessão |
28
- | Executar testes | Documentar decisões |
29
- | Iniciar servidores | Dialogar com usuário |
21
+ | ❌ Proibido | ✅ Permitido |
22
+ | ------------------------------------ | ----------------------------------------------------------- |
23
+ | Criar arquivos de código (.ts, .js) | Criar `architecture.md` |
24
+ | Modificar código existente | Ler código para análise |
25
+ | Instalar dependências | Comandos de leitura (`git`, `ls`, `grep`) para investigar |
26
+ | Fazer commits | Criar a branch de feature (Fase 1.1 do workflow) |
27
+ | Executar testes | Criar o diretório da sessão e `context.md` |
28
+ | Iniciar servidores | Registrar `.timestamp_start` na sessão |
29
+ | Alterar arquivos do projeto | Documentar decisões e dialogar com usuário |
30
30
 
31
31
  ### 2. Artefato Único
32
32
 
33
- O **único artefato** produzido pelo `start` é:
33
+ O **único entregável** do `start` é:
34
34
 
35
35
  ```
36
36
  $SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/architecture.md
@@ -38,7 +38,7 @@ $SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/architecture.md
38
38
 
39
39
  > 📁 **Padrão**: `TASK_MANAGER_KEY` é o ID do card em **lowercase** (ex: `TASK-123` → `task-123`)
40
40
 
41
- Nenhum outro arquivo deve ser criado, modificado ou deletado.
41
+ Além dele, o `start` pode criar apenas os arquivos de apoio da própria sessão (`context.md` e `.timestamp_start`, em `$SESSIONS_DIR/eng/{TASK_MANAGER_KEY}/`) e a branch de feature. Nenhum arquivo do projeto deve ser criado, modificado ou deletado.
42
42
 
43
43
  ### 3. Aprovação Obrigatória
44
44