adi_dev_workflow 1.3.0 → 1.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 (75) hide show
  1. package/frameworks/commands/ministack/generate-tasks.md +212 -212
  2. package/frameworks/commands/sdd/generate-task-plan.md +4 -4
  3. package/frameworks/commands/sdd/generate-tech-direction.md +2 -2
  4. package/frameworks/commands/sdd/generate-tech-spec.md +4 -4
  5. package/frameworks/commands/sdd/generate-tests.md +171 -39
  6. package/frameworks/config/ai-framework-config.yaml +2 -2
  7. package/frameworks/skills/ministack-tasks-expert/SKILL.md +115 -104
  8. package/frameworks/skills/ministack-tech-direction-expert/SKILL.md +21 -6
  9. package/frameworks/skills/prompt-engineer-expert/SKILL.md +10 -7
  10. package/frameworks/skills/sdd-tech-direction-expert/SKILL.md +21 -6
  11. package/frameworks/skills/sdd-tech-spec-expert/SKILL.md +23 -7
  12. package/package.json +1 -1
  13. package/src/cli.js +27 -2
  14. package/src/installer.js +185 -106
  15. package/frameworks/agents/qa-validation-expert.md +0 -458
  16. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.json +0 -99
  17. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.md +0 -64
  18. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/eval_metadata.json +0 -12
  19. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/grading.json +0 -32
  20. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/response.md +0 -134
  21. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/transcript.md +0 -68
  22. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/timing.json +0 -5
  23. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/grading.json +0 -32
  24. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/response.md +0 -525
  25. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/transcript.md +0 -30
  26. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/timing.json +0 -5
  27. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/eval_metadata.json +0 -12
  28. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/grading.json +0 -32
  29. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/response.md +0 -1126
  30. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/transcript.md +0 -131
  31. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/timing.json +0 -5
  32. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/grading.json +0 -32
  33. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/response.md +0 -452
  34. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/transcript.md +0 -78
  35. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/timing.json +0 -5
  36. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/eval_metadata.json +0 -12
  37. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/grading.json +0 -32
  38. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/response.md +0 -101
  39. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/transcript.md +0 -133
  40. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/timing.json +0 -5
  41. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/grading.json +0 -32
  42. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/response.md +0 -248
  43. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/transcript.md +0 -49
  44. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/timing.json +0 -5
  45. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/review.html +0 -1325
  46. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.json +0 -94
  47. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.md +0 -67
  48. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/eval_metadata.json +0 -12
  49. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/grading.json +0 -32
  50. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/response.md +0 -117
  51. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/transcript.md +0 -91
  52. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/timing.json +0 -1
  53. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/grading.json +0 -32
  54. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/response.md +0 -694
  55. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/transcript.md +0 -45
  56. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/timing.json +0 -1
  57. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/eval_metadata.json +0 -12
  58. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/grading.json +0 -32
  59. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/response.md +0 -1087
  60. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/transcript.md +0 -124
  61. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/timing.json +0 -1
  62. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/grading.json +0 -32
  63. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/response.md +0 -458
  64. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/transcript.md +0 -84
  65. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/timing.json +0 -1
  66. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/eval_metadata.json +0 -12
  67. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/grading.json +0 -32
  68. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/response.md +0 -70
  69. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/transcript.md +0 -148
  70. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/timing.json +0 -1
  71. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/grading.json +0 -32
  72. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/response.md +0 -249
  73. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/transcript.md +0 -80
  74. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/timing.json +0 -1
  75. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/review.html +0 -1325
@@ -1,131 +0,0 @@
1
- # Transcript de Tools Chamadas — Eval 2: Spec Simples (with_skill)
2
-
3
- ## Data: 2026-03-07
4
-
5
- ---
6
-
7
- ## 1. Leitura do Skill e Templates
8
-
9
- ### Tool: Read (3 chamadas em paralelo)
10
- 1. **Read** `.claude/skills/sdd-task-plan-expert/SKILL.md`
11
- - Resultado: Skill completo lido (384 linhas). Contém instrucoes do framework SDD para geracao de TASK PLAN, processo interativo, guardrails, templates e regras.
12
-
13
- 2. **Read** `.claude/skills/sdd-task-plan-expert/templates/task_plan_template.md`
14
- - Resultado: Template do task_plan.md lido (84 linhas). Contém 9 secoes: Identificacao, Objetivo, Macro-Fases, Lista de Tasks, Rastreabilidade, Dependencias, Criterios de Conclusao, Riscos, Checklist.
15
-
16
- 3. **Read** `.claude/skills/sdd-task-plan-expert/templates/task_template.md`
17
- - Resultado: Template da task individual lido (90 linhas). Contém 8 secoes: Identificacao, Objetivo, Descricao Detalhada, Aceite Tecnico, Arquivos Impactados, Testes, Notas, Checklist.
18
-
19
- ---
20
-
21
- ## 2. Exploracao do Codebase — Estrutura de Arquivos
22
-
23
- ### Tool: Glob (4 chamadas em paralelo)
24
- 1. **Glob** `internal/**/*.go` — Encontrados 17 arquivos Go no projeto
25
- 2. **Glob** `internal/db/migrations/*.sql` — Encontrado 1 arquivo: `001_create_usuarios.sql`
26
- 3. **Glob** `internal/db/queries/*.sql` — Nenhum arquivo encontrado (queries estao em `internal/db/sqlc/queries/`)
27
- 4. **Glob** `api/proto/**/*.proto` — Encontrado 1 arquivo: `api/proto/v1/user.proto`
28
-
29
- ---
30
-
31
- ## 3. Leitura dos Arquivos do Projeto (7 chamadas em paralelo)
32
-
33
- ### Tool: Read
34
- 1. **Read** `internal/db/migrations/001_create_usuarios.sql`
35
- - Resultado: Schema da tabela `usuarios` com colunas: id, nome, email, senha_hash, data_criacao, data_atualizacao. NAO possui coluna `telefone`.
36
-
37
- 2. **Read** `internal/repository/user_repository.go`
38
- - Resultado: Struct User (sem Phone), interface UserRepository (Create, GetByID), implementacao sqlcUserRepository, funcao toUser. Modulo FX.
39
-
40
- 3. **Read** `internal/service/user_service.go`
41
- - Resultado: CreateUserInput (sem Phone), interface UserService (CreateUser, GetUser — SEM UpdateUser), implementacao userServiceImpl. Modulo FX.
42
-
43
- 4. **Read** `internal/handler/grpc/user_handler.go`
44
- - Resultado: UserHandler com CreateUser e GetUser (SEM UpdateUser). Funcao mapServiceError. NAO retorna campo phone.
45
-
46
- 5. **Read** `api/proto/v1/user.proto`
47
- - Resultado: Messages CreateUserRequest (3 campos), CreateUserResponse (4 campos), GetUserRequest, GetUserResponse (5 campos). Service com CreateUser e GetUser. SEM UpdateUser. SEM campo phone.
48
-
49
- 6. **Read** `internal/service/user_service_test.go`
50
- - Resultado: MockUserRepository (Create, GetByID — sem Update). Testes table-driven com testify/mock. 10 testes cobrindo CreateUser e GetUser.
51
-
52
- 7. **Read** `internal/handler/grpc/user_handler_test.go`
53
- - Resultado: MockUserService (CreateUser, GetUser — sem UpdateUser). 11 testes cobrindo handler CreateUser e GetUser com gRPC status codes.
54
-
55
- ---
56
-
57
- ## 4. Leitura das Queries SQLC e Configuracao
58
-
59
- ### Tool: Glob (2 chamadas em paralelo)
60
- 1. **Glob** `internal/db/**/*.sql` — Encontrados: `001_create_usuarios.sql` e `internal/db/sqlc/queries/user.sql`
61
- 2. **Glob** `internal/db/sqlc/*` — Encontrado: `internal/db/sqlc/sqlc.yaml`
62
-
63
- ### Tool: Read (4 chamadas em paralelo)
64
- 1. **Read** `internal/db/sqlc/queries/user.sql`
65
- - Resultado: 2 queries — CreateUser (INSERT com 6 colunas, sem telefone) e GetUserByID (SELECT * por id).
66
-
67
- 2. **Read** `internal/db/sqlc/sqlc.yaml`
68
- - Resultado: Configuracao SQLC v2, engine sqlite, queries em `queries/`, schema em `../migrations/`.
69
-
70
- 3. **Read** `internal/infra/grpc/server.go`
71
- - Resultado: Struct Params com fx.In, NewGRPCServer registra UserServiceServer. Modulo FX com lifecycle hooks.
72
-
73
- 4. **Read** `internal/infra/di/fx.go`
74
- - Resultado: AppModule compoe config, logger, database, repository, service, grpchandler, grpcserver.
75
-
76
- ---
77
-
78
- ## 5. Leitura do Handler FX
79
-
80
- ### Tool: Read
81
- 1. **Read** `internal/handler/grpc/fx.go`
82
- - Resultado: Modulo FX que provê NewUserHandler como pb.UserServiceServer via fx.Annotate/fx.As.
83
-
84
- ---
85
-
86
- ## 6. Verificacao da Skill QA
87
-
88
- ### Tool: Glob
89
- 1. **Glob** `.claude/skills/sdd-qa-expert/**/*`
90
- - Resultado: 3 arquivos encontrados — SKILL.md, task_tests_template.md, test_strategy_template.md. Skill QA disponivel para subagente.
91
-
92
- ---
93
-
94
- ## 7. Criacao do Diretorio de Output
95
-
96
- ### Tool: Bash
97
- 1. **Bash** `mkdir -p ".claude/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs"`
98
- - Resultado: Diretorio criado com sucesso.
99
-
100
- ---
101
-
102
- ## 8. Escrita dos Arquivos de Saida
103
-
104
- ### Tool: Write
105
- 1. **Write** `.claude/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/response.md`
106
- - Resultado: Resposta completa com TASK PLAN + 6 tasks individuais.
107
-
108
- 2. **Write** `.claude/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/transcript.md`
109
- - Resultado: Este transcript.
110
-
111
- ---
112
-
113
- ## Resumo de Chamadas
114
-
115
- | Tool | Quantidade | Descricao |
116
- |--------|:----------:|-------------------------------------------------|
117
- | Read | 14 | Leitura de skill, templates e arquivos do projeto |
118
- | Glob | 7 | Busca de arquivos no codebase |
119
- | Bash | 1 | Criacao de diretorio de output |
120
- | Write | 2 | Escrita dos arquivos de saida |
121
- | **Total** | **24** | |
122
-
123
- ---
124
-
125
- ## Observacoes sobre o Processo
126
-
127
- 1. **Analise do projeto foi feita ANTES de planejar tasks** (conforme regra do skill "PONTO CRITICO: Analise Obrigatoria do Projeto")
128
- 2. **Descoberta critica**: O SPEC_TECH menciona UpdateUser, mas o endpoint NAO existe no codebase. Isso foi identificado na analise e impactou o escopo das tasks.
129
- 3. **Subagente QA**: Em uma execucao real, a secao 6 de cada task seria delegada a um subagente QA via ferramenta `Task`. Nesta simulacao (eval), a secao 6 foi preenchida diretamente com base nos padroes de teste observados no projeto.
130
- 4. **Paralelismo identificado**: T1 e T5 podem rodar em paralelo (migracao e proto sao independentes).
131
- 5. **Separacao de documentos respeitada**: O task_plan.md contem apenas referencia/indice; o detalhamento esta nas tasks individuais.
@@ -1,5 +0,0 @@
1
- {
2
- "total_tokens": 60596,
3
- "duration_ms": 286579,
4
- "total_duration_seconds": 286.6
5
- }
@@ -1,32 +0,0 @@
1
- {
2
- "eval_id": 2,
3
- "eval_name": "spec-tech-simples-alteracao-pontual",
4
- "configuration": "without_skill",
5
- "expectations": [
6
- {
7
- "text": "Gera um numero proporcional de tasks (entre 3 e 6) — nao over-engineers com tasks demais para uma alteracao simples",
8
- "passed": false,
9
- "evidence": "Gerou 12 tasks para uma feature simples de adicionar um campo. Over-engineered com tasks separadas para 'regenerar codigo SQLC' (TASK-3), 'regenerar codigo Proto' (TASK-7), e 'configurar UpdateUser como rota protegida' (TASK-9) que poderiam ser subtasks."
10
- },
11
- {
12
- "text": "Respeita a ordem de dependencias das camadas (migracao > SQLC > repository > service > handler > proto)",
13
- "passed": true,
14
- "evidence": "Grafo de dependencias mostra TASK-1(migracao)->TASK-2(SQLC)->TASK-3(generate)->TASK-4(repo)->TASK-5(service)->TASK-8(handler). Proto em paralelo (TASK-6). Ordem correta."
15
- },
16
- {
17
- "text": "Mapeia a US-10 na tabela de rastreabilidade do task_plan",
18
- "passed": false,
19
- "evidence": "Nao ha tabela de rastreabilidade mapeando US-10 para tasks. A US-10 nao e mencionada no task plan."
20
- },
21
- {
22
- "text": "Cada task segue o template completo (secoes 1-8) ou marca secoes N/A com justificativa",
23
- "passed": false,
24
- "evidence": "Tasks usam formato ad-hoc (Camada, Arquivo, Descricao, Criterio de aceite, Dependencias) em vez do template oficial com secoes 1-8 (Identificacao, Objetivo, Descricao Detalhada, Aceite Tecnico, Arquivos Impactados, Testes, Notas, Checklist)."
25
- },
26
- {
27
- "text": "Salva task_plan.md como documento de REFERENCIA (sem corpo detalhado de tasks dentro dele)",
28
- "passed": false,
29
- "evidence": "Todo o conteudo detalhado das tasks esta inline no mesmo documento. Nao ha separacao entre task_plan (referencia) e tasks individuais."
30
- }
31
- ]
32
- }
@@ -1,452 +0,0 @@
1
- # TASK PLAN — Adicionar Telefone ao Usuario v1
2
-
3
- ## 1. Identificacao
4
-
5
- | Campo | Valor |
6
- |-------|-------|
7
- | **Feature** | Adicionar Telefone ao Modulo de Usuario |
8
- | **Versao** | v1 |
9
- | **Data** | 2026-03-07 |
10
- | **SPEC_TECH** | docs/feature-telefone-usuario/v1/spec_tech.md |
11
- | **Branch base** | user-feature |
12
-
13
- ## 2. Resumo
14
-
15
- Adicionar o campo opcional `telefone` na tabela `usuarios` e propagar a mudanca por todas as camadas: migracao SQL, queries SQLC, repository, service, proto e handler gRPC. Inclui validacao opcional (10-15 caracteres quando informado) e testes unitarios.
16
-
17
- ## 3. Tarefas
18
-
19
- ### TASK-1: Criar migracao SQL para adicionar coluna telefone
20
-
21
- **Camada:** Banco de Dados
22
- **Arquivo a criar:** `internal/db/migrations/002_add_telefone_usuarios.sql`
23
- **Descricao:**
24
- Criar nova migracao com `ALTER TABLE usuarios ADD COLUMN telefone TEXT;`. Conforme regra de imutabilidade, nao editar a migracao 001 existente.
25
-
26
- **Conteudo esperado:**
27
- ```sql
28
- ALTER TABLE usuarios ADD COLUMN telefone TEXT;
29
- ```
30
-
31
- **Criterio de aceite:**
32
- - Arquivo criado em `internal/db/migrations/002_add_telefone_usuarios.sql`
33
- - Migracao 001 inalterada
34
- - Coluna `telefone` do tipo `TEXT` (nullable/opcional)
35
-
36
- **Dependencias:** Nenhuma
37
-
38
- ---
39
-
40
- ### TASK-2: Atualizar queries SQLC para incluir telefone
41
-
42
- **Camada:** SQLC Queries
43
- **Arquivo a editar:** `internal/db/sqlc/queries/user.sql`
44
- **Descricao:**
45
- Adicionar a coluna `telefone` na query `CreateUser` (INSERT e parametros) e criar uma nova query `UpdateUser` que permita atualizar nome e telefone.
46
-
47
- **Alteracoes esperadas:**
48
-
49
- Query `CreateUser` atualizada:
50
- ```sql
51
- -- name: CreateUser :one
52
- INSERT INTO usuarios (id, nome, email, senha_hash, telefone, data_criacao, data_atualizacao)
53
- VALUES (?, ?, ?, ?, ?, ?, ?)
54
- RETURNING *;
55
- ```
56
-
57
- Nova query `UpdateUser`:
58
- ```sql
59
- -- name: UpdateUser :one
60
- UPDATE usuarios SET nome = ?, telefone = ?, data_atualizacao = ?
61
- WHERE id = ?
62
- RETURNING *;
63
- ```
64
-
65
- **Criterio de aceite:**
66
- - Query `CreateUser` inclui coluna `telefone`
67
- - Nova query `UpdateUser` criada
68
- - Executar `make generate` (ou `make sqlc`) apos a edicao para regenerar codigo
69
-
70
- **Dependencias:** TASK-1
71
-
72
- ---
73
-
74
- ### TASK-3: Regenerar codigo SQLC
75
-
76
- **Camada:** Codigo Gerado
77
- **Descricao:**
78
- Executar `make generate` para que o SQLC regenere os arquivos Go em `internal/db/sqlc/` com a nova coluna `telefone` e a nova query `UpdateUser`.
79
-
80
- **Comando:**
81
- ```bash
82
- make generate
83
- ```
84
-
85
- **Criterio de aceite:**
86
- - Struct `Usuario` gerada inclui campo `Telefone`
87
- - Struct `CreateUserParams` inclui campo `Telefone`
88
- - Struct `UpdateUserParams` gerada
89
- - Funcao `UpdateUser` gerada em queries
90
-
91
- **Dependencias:** TASK-1, TASK-2
92
-
93
- ---
94
-
95
- ### TASK-4: Atualizar modelo e repository do usuario
96
-
97
- **Camada:** Repository
98
- **Arquivo a editar:** `internal/repository/user_repository.go`
99
- **Descricao:**
100
- Adicionar campo `Phone` ao modelo `User`. Atualizar o mapeamento na funcao `toUser` para converter `telefone` (banco) para `Phone` (Go). Atualizar `Create` para passar `telefone` nos parametros SQLC. Adicionar metodo `Update` na interface e implementacao.
101
-
102
- **Alteracoes esperadas:**
103
-
104
- 1. Adicionar campo na struct:
105
- ```go
106
- type User struct {
107
- ID string
108
- Name string
109
- Email string
110
- PasswordHash string
111
- Phone string // novo campo
112
- CreatedAt time.Time
113
- UpdatedAt time.Time
114
- }
115
- ```
116
-
117
- 2. Atualizar interface:
118
- ```go
119
- type UserRepository interface {
120
- Create(ctx context.Context, user *User) (*User, error)
121
- GetByID(ctx context.Context, id string) (*User, error)
122
- Update(ctx context.Context, user *User) (*User, error) // novo metodo
123
- }
124
- ```
125
-
126
- 3. Atualizar `Create` para incluir `Telefone` nos params SQLC
127
- 4. Implementar metodo `Update` usando `r.queries.UpdateUser`
128
- 5. Atualizar funcao `toUser` para mapear `Telefone` -> `Phone`
129
-
130
- **Criterio de aceite:**
131
- - Campo `Phone` presente no modelo `User`
132
- - Mapeamento `Telefone` <-> `Phone` funcional em `toUser`
133
- - Metodo `Update` implementado
134
- - `Create` passa `telefone` para o SQLC
135
-
136
- **Dependencias:** TASK-3
137
-
138
- ---
139
-
140
- ### TASK-5: Atualizar service do usuario
141
-
142
- **Camada:** Service
143
- **Arquivo a editar:** `internal/service/user_service.go`
144
- **Descricao:**
145
- Adicionar campo `Phone` ao `CreateUserInput`. Criar struct `UpdateUserInput`. Adicionar metodo `UpdateUser` na interface e implementacao. Implementar validacao: se `phone` informado, deve ter entre 10 e 15 caracteres.
146
-
147
- **Alteracoes esperadas:**
148
-
149
- 1. Atualizar input de criacao:
150
- ```go
151
- type CreateUserInput struct {
152
- Name string
153
- Email string
154
- Password string
155
- Phone string // novo, opcional
156
- }
157
- ```
158
-
159
- 2. Criar input de atualizacao:
160
- ```go
161
- type UpdateUserInput struct {
162
- ID string
163
- Name string
164
- Phone string // opcional
165
- }
166
- ```
167
-
168
- 3. Atualizar interface:
169
- ```go
170
- type UserService interface {
171
- CreateUser(ctx context.Context, input CreateUserInput) (*repository.User, error)
172
- GetUser(ctx context.Context, id string) (*repository.User, error)
173
- UpdateUser(ctx context.Context, input UpdateUserInput) (*repository.User, error) // novo
174
- }
175
- ```
176
-
177
- 4. Adicionar validacao de telefone (reutilizavel em Create e Update):
178
- ```go
179
- func validatePhone(phone string) error {
180
- if phone != "" && (len(phone) < 10 || len(phone) > 15) {
181
- return errors.New("telefone deve ter entre 10 e 15 caracteres")
182
- }
183
- return nil
184
- }
185
- ```
186
-
187
- 5. Chamar `validatePhone` em `CreateUser` e `UpdateUser`
188
- 6. Passar `Phone` para `repository.User` em `CreateUser`
189
- 7. Implementar `UpdateUser` com busca por ID + chamada ao repo
190
-
191
- **Criterio de aceite:**
192
- - Campo `Phone` aceito em `CreateUser`
193
- - Metodo `UpdateUser` implementado
194
- - Validacao de telefone (10-15 chars) funcional
195
- - Telefone vazio e aceito (campo opcional)
196
-
197
- **Dependencias:** TASK-4
198
-
199
- ---
200
-
201
- ### TASK-6: Atualizar definicao Proto
202
-
203
- **Camada:** Proto/gRPC
204
- **Arquivo a editar:** `api/proto/v1/user.proto`
205
- **Descricao:**
206
- Adicionar campo `string phone` nas mensagens `CreateUserRequest`, `CreateUserResponse`, `GetUserResponse`. Criar mensagens `UpdateUserRequest` e `UpdateUserResponse`. Adicionar RPC `UpdateUser` ao service.
207
-
208
- **Alteracoes esperadas:**
209
-
210
- 1. Adicionar `string phone = 4;` em `CreateUserRequest`
211
- 2. Adicionar `string phone = 4;` em `CreateUserResponse` (apos `email`, ajustar numeracao de `created_at` para 5)
212
- 3. Adicionar `string phone = 4;` em `GetUserResponse` (apos `email`, ajustar numeracao: `phone=4`, `created_at=5`, `updated_at=6`)
213
-
214
- > **ATENCAO:** A numeracao dos campos existentes NAO pode ser alterada sem quebrar compatibilidade. Verificar a numeracao atual antes de definir os novos numeros. Dado que `CreateUserResponse` ja usa campos 1-4 e `GetUserResponse` usa 1-5, o campo `phone` deve usar o proximo numero disponivel em cada mensagem.
215
-
216
- Numeracao correta baseada no proto atual:
217
- - `CreateUserRequest`: `string phone = 4;` (campos existentes: 1=name, 2=email, 3=password)
218
- - `CreateUserResponse`: `string phone = 5;` (campos existentes: 1=id, 2=name, 3=email, 4=created_at)
219
- - `GetUserResponse`: `string phone = 6;` (campos existentes: 1=id, 2=name, 3=email, 4=created_at, 5=updated_at)
220
-
221
- 4. Criar mensagens novas:
222
- ```proto
223
- message UpdateUserRequest {
224
- string id = 1;
225
- string name = 2;
226
- string phone = 3;
227
- }
228
-
229
- message UpdateUserResponse {
230
- string id = 1;
231
- string name = 2;
232
- string email = 3;
233
- string phone = 4;
234
- string updated_at = 5;
235
- }
236
- ```
237
-
238
- 5. Adicionar ao service:
239
- ```proto
240
- rpc UpdateUser(UpdateUserRequest) returns (UpdateUserResponse);
241
- ```
242
-
243
- **Criterio de aceite:**
244
- - Campo `phone` adicionado nas mensagens existentes com numeracao correta
245
- - Mensagens `UpdateUserRequest`/`UpdateUserResponse` criadas
246
- - RPC `UpdateUser` registrado no service
247
- - Numeracao de campos existentes NAO alterada
248
-
249
- **Dependencias:** Nenhuma (pode ser feita em paralelo com TASK-1 a TASK-5)
250
-
251
- ---
252
-
253
- ### TASK-7: Regenerar codigo Proto
254
-
255
- **Camada:** Codigo Gerado
256
- **Descricao:**
257
- Executar `make generate` (buf generate) para regenerar o codigo Go em `gen/proto/v1/`.
258
-
259
- **Comando:**
260
- ```bash
261
- make generate
262
- ```
263
-
264
- **Criterio de aceite:**
265
- - Structs Go geradas incluem campo `Phone`
266
- - Interface `UserServiceServer` inclui metodo `UpdateUser`
267
- - Compilacao sem erros
268
-
269
- **Dependencias:** TASK-6
270
-
271
- ---
272
-
273
- ### TASK-8: Atualizar handler gRPC do usuario
274
-
275
- **Camada:** Handler
276
- **Arquivo a editar:** `internal/handler/grpc/user_handler.go`
277
- **Descricao:**
278
- Atualizar `CreateUser` para passar `Phone` do request para o service input e incluir `phone` na response. Implementar metodo `UpdateUser`. Atualizar `GetUser` para incluir `phone` na response.
279
-
280
- **Alteracoes esperadas:**
281
-
282
- 1. Em `CreateUser`:
283
- - Adicionar `Phone: req.GetPhone()` ao `CreateUserInput`
284
- - Adicionar `Phone: user.Phone` na response
285
-
286
- 2. Em `GetUser`:
287
- - Adicionar `Phone: user.Phone` na response
288
-
289
- 3. Novo metodo `UpdateUser`:
290
- ```go
291
- func (h *UserHandler) UpdateUser(ctx context.Context, req *pb.UpdateUserRequest) (*pb.UpdateUserResponse, error) {
292
- input := service.UpdateUserInput{
293
- ID: req.GetId(),
294
- Name: req.GetName(),
295
- Phone: req.GetPhone(),
296
- }
297
- user, err := h.userService.UpdateUser(ctx, input)
298
- if err != nil {
299
- return nil, mapServiceError(err)
300
- }
301
- return &pb.UpdateUserResponse{
302
- Id: user.ID,
303
- Name: user.Name,
304
- Email: user.Email,
305
- Phone: user.Phone,
306
- UpdatedAt: user.UpdatedAt.Format(time.RFC3339),
307
- }, nil
308
- }
309
- ```
310
-
311
- **Criterio de aceite:**
312
- - `CreateUser` repassa e retorna `phone`
313
- - `GetUser` retorna `phone`
314
- - `UpdateUser` implementado e funcional
315
- - Erros mapeados corretamente
316
-
317
- **Dependencias:** TASK-5, TASK-7
318
-
319
- ---
320
-
321
- ### TASK-9: Configurar UpdateUser como rota protegida
322
-
323
- **Camada:** Configuracao
324
- **Arquivo a verificar:** `configs/config.yaml`
325
- **Descricao:**
326
- Verificar que `UpdateUser` NAO esta em `skip_methods` (ou seja, requer autenticacao). Apenas `CreateUser` deve ser publico. Se necessario, nenhuma alteracao e necessaria, apenas confirmar.
327
-
328
- **Criterio de aceite:**
329
- - `UpdateUser` exige autenticacao (Bearer token)
330
- - Nenhuma rota protegida acidentalmente exposta
331
-
332
- **Dependencias:** TASK-8
333
-
334
- ---
335
-
336
- ### TASK-10: Atualizar testes unitarios do service
337
-
338
- **Camada:** Testes
339
- **Arquivo a editar:** `internal/service/user_service_test.go`
340
- **Descricao:**
341
- Atualizar mock do repository para incluir metodo `Update`. Adicionar testes para:
342
-
343
- 1. `TestCreateUser_WithPhone_Success` — criacao com telefone valido
344
- 2. `TestCreateUser_WithInvalidPhone_TooShort` — telefone com menos de 10 chars
345
- 3. `TestCreateUser_WithInvalidPhone_TooLong` — telefone com mais de 15 chars
346
- 4. `TestCreateUser_WithEmptyPhone_Success` — telefone vazio (opcional)
347
- 5. `TestUpdateUser_Success` — atualizacao com dados validos
348
- 6. `TestUpdateUser_WithPhone_Success` — atualizacao com telefone valido
349
- 7. `TestUpdateUser_InvalidPhone` — telefone invalido na atualizacao
350
- 8. `TestUpdateUser_NotFound` — usuario nao encontrado
351
-
352
- **Criterio de aceite:**
353
- - Mock atualizado com metodo `Update`
354
- - Todos os cenarios de telefone cobertos (valido, vazio, curto, longo)
355
- - Testes de `UpdateUser` adicionados
356
- - Todos os testes passam: `CGO_ENABLED=1 go test ./internal/service/... -v`
357
-
358
- **Dependencias:** TASK-5
359
-
360
- ---
361
-
362
- ### TASK-11: Atualizar testes unitarios do handler
363
-
364
- **Camada:** Testes
365
- **Arquivo a editar:** `internal/handler/grpc/user_handler_test.go`
366
- **Descricao:**
367
- Atualizar mock do service para incluir metodo `UpdateUser`. Adicionar testes para:
368
-
369
- 1. `TestUserHandler_CreateUser_WithPhone` — verifica que phone e repassado e retornado
370
- 2. `TestUserHandler_GetUser_WithPhone` — verifica que phone e retornado
371
- 3. `TestUserHandler_UpdateUser_Success` — atualizacao com sucesso
372
- 4. `TestUserHandler_UpdateUser_NotFound` — usuario nao encontrado
373
- 5. `TestUserHandler_UpdateUser_InvalidPhone` — telefone invalido
374
-
375
- **Criterio de aceite:**
376
- - Mock atualizado com metodo `UpdateUser`
377
- - Testes de phone no CreateUser e GetUser
378
- - Testes de UpdateUser cobrindo sucesso e erros
379
- - Todos os testes passam: `CGO_ENABLED=1 go test ./internal/handler/grpc/... -v`
380
-
381
- **Dependencias:** TASK-8
382
-
383
- ---
384
-
385
- ### TASK-12: Teste de integracao e validacao final
386
-
387
- **Camada:** Validacao
388
- **Descricao:**
389
- Executar build e suite completa de testes para garantir que tudo funciona junto.
390
-
391
- **Comandos:**
392
- ```bash
393
- make build
394
- make test
395
- ```
396
-
397
- **Criterio de aceite:**
398
- - Build compila sem erros
399
- - Todos os testes passam
400
- - Nenhuma regressao nos testes existentes
401
-
402
- **Dependencias:** TASK-10, TASK-11
403
-
404
- ---
405
-
406
- ## 4. Grafo de Dependencias
407
-
408
- ```
409
- TASK-1 (migracao SQL)
410
- └─> TASK-2 (queries SQLC)
411
- └─> TASK-3 (make generate - SQLC)
412
- └─> TASK-4 (repository)
413
- └─> TASK-5 (service)
414
- ├─> TASK-8 (handler) [+ TASK-7]
415
- └─> TASK-10 (testes service)
416
-
417
- TASK-6 (proto) [paralelo com TASK-1..5]
418
- └─> TASK-7 (make generate - proto)
419
- └─> TASK-8 (handler)
420
- ├─> TASK-9 (config auth)
421
- └─> TASK-11 (testes handler)
422
-
423
- TASK-10 + TASK-11
424
- └─> TASK-12 (validacao final)
425
- ```
426
-
427
- ## 5. Ordem de Execucao Sugerida
428
-
429
- | Fase | Tasks | Descricao |
430
- |------|-------|-----------|
431
- | **Fase 1** | TASK-1, TASK-6 | Migracao SQL + Proto (paralelo) |
432
- | **Fase 2** | TASK-2 | Queries SQLC |
433
- | **Fase 3** | TASK-3, TASK-7 | Regenerar codigo (SQLC + Proto) — executar `make generate` uma unica vez |
434
- | **Fase 4** | TASK-4 | Repository |
435
- | **Fase 5** | TASK-5 | Service |
436
- | **Fase 6** | TASK-8, TASK-9 | Handler + Config |
437
- | **Fase 7** | TASK-10, TASK-11 | Testes (paralelo) |
438
- | **Fase 8** | TASK-12 | Validacao final |
439
-
440
- ## 6. Riscos e Observacoes
441
-
442
- 1. **Numeracao Proto:** A numeracao dos campos proto existentes NAO pode ser alterada. O campo `phone` deve usar o proximo numero livre em cada mensagem. Isso e critico para compatibilidade.
443
-
444
- 2. **Migracao imutavel:** A migracao 001 NAO deve ser editada. Sempre criar nova migracao (002).
445
-
446
- 3. **Codigo gerado:** Nunca editar arquivos em `gen/` ou `internal/db/sqlc/*.go`. Sempre editar os fontes (`.proto`, `.sql`) e rodar `make generate`.
447
-
448
- 4. **Campo opcional:** O campo `telefone` e `TEXT` nullable no SQLite. No Go, o SQLC pode gerar como `sql.NullString` — verificar apos geracao e ajustar mapeamento no repository conforme necessario.
449
-
450
- 5. **UpdateUser e novo:** O proto atual nao tem `UpdateUser`. E necessario criar o RPC, mensagens e implementar em todas as camadas. A SPEC_TECH menciona "UpdateUser" mas o codebase atual nao possui esse endpoint.
451
-
452
- 6. **`make generate`:** Os comandos `make generate` das TASK-3 e TASK-7 podem ser executados em uma unica chamada se o Makefile gerar tanto SQLC quanto Proto.