adi_dev_workflow 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/bin/index.js +8 -8
  2. package/frameworks/agents/qa-staff-engineer.md +311 -0
  3. package/frameworks/agents/qa-validation-expert.md +458 -0
  4. package/frameworks/agents/tech-review-conformance.md +200 -0
  5. package/frameworks/commands/generate-prompt.md +33 -100
  6. package/frameworks/commands/ministack/README.md +2 -0
  7. package/frameworks/commands/ministack/code-review.md +2 -0
  8. package/frameworks/commands/ministack/generate-intent.md +2 -0
  9. package/frameworks/commands/ministack/generate-scope.md +2 -0
  10. package/frameworks/commands/ministack/generate-tasks.md +2 -0
  11. package/frameworks/commands/ministack/generate-tech-direction.md +2 -0
  12. package/frameworks/commands/ministack/run-ministack-tasks.md +3 -0
  13. package/frameworks/commands/ministack/run-ministack-withlinear.md +2 -0
  14. package/frameworks/commands/ministack/status.md +2 -0
  15. package/frameworks/commands/sdd/code-review.md +2 -0
  16. package/frameworks/commands/sdd/generate-prd.md +2 -0
  17. package/frameworks/commands/sdd/generate-task-plan.md +2 -0
  18. package/frameworks/commands/sdd/generate-tech-direction.md +2 -0
  19. package/frameworks/commands/sdd/generate-tech-spec.md +2 -0
  20. package/frameworks/commands/sdd/generate-tests.md +2 -0
  21. package/frameworks/commands/sdd/run_tasks.md +3 -0
  22. package/frameworks/commands/sdd/run_tasks_withlinear.md +2 -0
  23. package/frameworks/commands/sdd/status.md +2 -0
  24. package/frameworks/commands/sdd/validate-sdd.md +2 -0
  25. package/frameworks/commands/sync-tasks-to-linear.md +2 -0
  26. package/frameworks/commands/taskcard/generate-taskcard.md +106 -33
  27. package/frameworks/commands/taskcard/run-taskcard.md +2 -0
  28. package/frameworks/config/ai-framework-config.yaml +112 -0
  29. package/frameworks/skills/ministack-intent-expert/SKILL.md +15 -1
  30. package/frameworks/skills/ministack-scope-expert/SKILL.md +17 -1
  31. package/frameworks/skills/sdd-prd-expert/SKILL.md +14 -0
  32. package/frameworks/skills/sdd-task-plan-expert/SKILL.md +14 -0
  33. package/frameworks/skills/taskcard-expert/SKILL.md +30 -11
  34. package/frameworks/templates/prompt_template.md +207 -0
  35. package/package.json +28 -28
  36. package/src/cli.js +121 -121
  37. package/src/installer.js +155 -136
  38. package/src/transformer.js +86 -86
  39. package/frameworks/skills/ministack-tasks-expert/SKILL.md +0 -192
  40. package/frameworks/skills/ministack-tasks-expert/templates/task_plan_template.md +0 -78
  41. package/frameworks/skills/ministack-tasks-expert/templates/task_template.md +0 -103
  42. package/frameworks/skills/ministack-tech-direction-expert/SKILL.md +0 -218
  43. package/frameworks/skills/ministack-tech-direction-expert/evals/evals.json +0 -1
  44. package/frameworks/skills/ministack-tech-direction-expert/templates/tech_direction-template.md +0 -17
  45. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.json +0 -99
  46. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.md +0 -64
  47. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/eval_metadata.json +0 -12
  48. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/grading.json +0 -32
  49. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/response.md +0 -134
  50. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/transcript.md +0 -68
  51. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/timing.json +0 -5
  52. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/grading.json +0 -32
  53. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/response.md +0 -525
  54. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/transcript.md +0 -30
  55. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/timing.json +0 -5
  56. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/eval_metadata.json +0 -12
  57. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/grading.json +0 -32
  58. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/response.md +0 -1126
  59. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/transcript.md +0 -131
  60. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/timing.json +0 -5
  61. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/grading.json +0 -32
  62. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/response.md +0 -452
  63. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/transcript.md +0 -78
  64. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/timing.json +0 -5
  65. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/eval_metadata.json +0 -12
  66. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/grading.json +0 -32
  67. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/response.md +0 -101
  68. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/transcript.md +0 -133
  69. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/timing.json +0 -5
  70. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/grading.json +0 -32
  71. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/response.md +0 -248
  72. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/transcript.md +0 -49
  73. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/timing.json +0 -5
  74. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/review.html +0 -1325
  75. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.json +0 -94
  76. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.md +0 -67
  77. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/eval_metadata.json +0 -12
  78. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/grading.json +0 -32
  79. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/response.md +0 -117
  80. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/transcript.md +0 -91
  81. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/timing.json +0 -1
  82. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/grading.json +0 -32
  83. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/response.md +0 -694
  84. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/transcript.md +0 -45
  85. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/timing.json +0 -1
  86. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/eval_metadata.json +0 -12
  87. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/grading.json +0 -32
  88. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/response.md +0 -1087
  89. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/transcript.md +0 -124
  90. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/timing.json +0 -1
  91. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/grading.json +0 -32
  92. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/response.md +0 -458
  93. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/transcript.md +0 -84
  94. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/timing.json +0 -1
  95. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/eval_metadata.json +0 -12
  96. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/grading.json +0 -32
  97. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/response.md +0 -70
  98. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/transcript.md +0 -148
  99. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/timing.json +0 -1
  100. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/grading.json +0 -32
  101. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/response.md +0 -249
  102. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/transcript.md +0 -80
  103. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/timing.json +0 -1
  104. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/review.html +0 -1325
  105. package/frameworks/skills/sdd-tech-direction-expert/SKILL.md +0 -223
  106. package/frameworks/skills/sdd-tech-direction-expert/evals/evals.json +0 -1
  107. package/frameworks/skills/sdd-tech-direction-expert/templates/tech_direction-template.md +0 -23
  108. package/frameworks/skills/sdd-tech-spec-expert/SKILL.md +0 -304
  109. package/frameworks/skills/sdd-tech-spec-expert/evals/evals.json +0 -199
  110. package/frameworks/skills/sdd-tech-spec-expert/templates/spec_tech_template.md +0 -290
  111. package/frameworks/skills/sdd-tech-spec-expert/templates/tech_direction-template.md +0 -23
@@ -1,1087 +0,0 @@
1
- # Simulacao Completa do Fluxo TASK PLAN — Adicionar Telefone ao Usuario
2
-
3
- ---
4
-
5
- ## Passo 1: Receber SPEC_TECH e Extrair Nome
6
-
7
- **Nome extraido da secao "1. Identificacao":** Adicionar Telefone ao Modulo de Usuario
8
-
9
- **Pergunta que eu faria ao usuario:**
10
-
11
- > Obrigado! Vamos iniciar o TASK PLAN para **Adicionar Telefone ao Modulo de Usuario**. Podemos iniciar a definicao macro das fases?
12
-
13
- **Resposta simulada do usuario:** Sim, pode iniciar.
14
-
15
- ---
16
-
17
- ## Passo 2: Analise Obrigatoria do Projeto (Resumo)
18
-
19
- ### Rules Lidas
20
- - `CLAUDE.md` — arquitetura em camadas, comandos, convencoes
21
- - `.claude/rules/code-conventions.md` — codigo em ingles, banco/logs/erros em portugues
22
- - `.claude/rules/database.md` — SQLite WAL, migracoes imutaveis, nomenclatura PT-BR
23
- - `.claude/rules/fx-di.md` — Uber FX para DI
24
- - `.claude/rules/grpc.md` — handlers, mapeamento de erros, registro de handlers
25
- - `.claude/rules/protobuf.md` — Buf, convencoes de go_package, mensagens
26
- - `.claude/rules/repository.md` — interface + impl nao exportada, UUID no repo, mapeamento PT->EN
27
- - `.claude/rules/service.md` — validacao, logging, erros exportados
28
- - `.claude/rules/sqlc.md` — queries editaveis em `internal/db/sqlc/queries/`, codigo gerado NAO editar
29
-
30
- ### Codebase Explorado — O que ja existe
31
-
32
- | Camada | Arquivo | Estado Atual |
33
- |--------|---------|-------------|
34
- | Migration 1 | `internal/db/migrations/001_create_usuarios.sql` | Tabela `usuarios` com id, nome, email, senha_hash, data_criacao, data_atualizacao |
35
- | Migration 2 | `internal/db/migrations/002_add_endereco_usuarios.sql` | `ALTER TABLE usuarios ADD COLUMN endereco TEXT NOT NULL DEFAULT ''` |
36
- | SQLC Queries | `internal/db/sqlc/queries/user.sql` | CreateUser, GetUserByID, GetUserByEmail, UpdateUser — **sem coluna `telefone`** |
37
- | SQLC Config | `internal/db/sqlc/sqlc.yaml` | Engine SQLite, queries em `queries/`, schema em `../migrations/` |
38
- | Repository | `internal/repository/user_repository.go` | Struct `User` com campos ID, Name, Email, PasswordHash, Address, CreatedAt, UpdatedAt. Interface com Create, GetByID, GetByEmail, Update. Mapeamento via `toUser()` |
39
- | Service | `internal/service/user_service.go` | `CreateUserInput` com Name, Email, Password, Address. `UpdateUserInput` com Name*, Email*, Address*, NewPassword*, CurrentPassword*. Validacoes e regras de negocio |
40
- | Handler | `internal/handler/grpc/user_handler.go` | Handlers CreateUser, Login, GetUserLogged, UpdateUser. Funcao `domainUserToProto()` e `mapServiceError()` |
41
- | Handler FX | `internal/handler/grpc/fx.go` | Registra UserHandler como pb.UserServiceServer |
42
- | Proto | `api/proto/v1/user.proto` | Mensagem User com id(1), name(2), email(3), address(4), created_at(5), updated_at(6). CreateUserRequest com name(1), email(2), password(3), address(4). UpdateUserRequest com optional name(1), email(2), address(3), new_password(4), current_password(5) |
43
- | gRPC Server | `internal/infra/grpc/server.go` | Registra UserServiceServer |
44
- | Testes Service | `internal/service/user_service_test.go` | Testes table-driven com mock de UserRepository via testify/mock |
45
- | Testes Handler | `internal/handler/grpc/user_handler_test.go` | Mock de UserService, testes de todos os endpoints |
46
- | Testes Repository | `internal/repository/user_repository_integration_test.go` | Testes de integracao com SQLite in-memory |
47
-
48
- ### Descobertas Importantes para o Planejamento
49
-
50
- 1. **Proxima migracao sera `003_add_telefone_usuarios.sql`** (sequencial apos 002)
51
- 2. **Queries SQLC precisam ser atualizadas** em `internal/db/sqlc/queries/user.sql` — depois rodar `make sqlc`
52
- 3. **Repository struct `User`** precisa de novo campo `Phone string`
53
- 4. **Service `CreateUserInput`** e `UpdateUserInput`** precisam de campo `Phone`
54
- 5. **Proto `user.proto`**: campo `phone` sera field number `7` na mensagem `User`, `5` em `CreateUserRequest`, e `6` em `UpdateUserRequest`
55
- 6. **Mock de repository** em `user_service_test.go` precisa do campo `Phone`
56
- 7. **Mock de service** em `user_handler_test.go` precisa do campo `Phone` no input
57
- 8. **Nenhum campo `telefone` existe atualmente** em qualquer camada — tudo precisa ser criado do zero
58
- 9. **Arquivo `configs/config.yaml`** nao precisa de alteracao (nao ha skip_methods novo)
59
- 10. **Nota sobre nomenclatura de migracao**: o projeto usa `001_create_usuarios.sql` sem `.up.sql`/`.down.sql` — apenas arquivo unico
60
-
61
- ---
62
-
63
- ## Passo 3: Proposta de Fases
64
-
65
- **Pergunta que eu faria ao usuario:**
66
-
67
- > Com base na analise do SPEC_TECH e do codebase, proponho as seguintes macro-fases:
68
- >
69
- > **Fase 1 — Banco de Dados e Queries (Fundacao)**
70
- > - Nova migracao para adicionar coluna `telefone`
71
- > - Atualizar queries SQLC para incluir `telefone`
72
- > - Executar `make sqlc` para regenerar codigo
73
- >
74
- > **Fase 2 — Camadas de Negocio (Repository + Service)**
75
- > - Adicionar campo `Phone` ao modelo e mapeamento no repository
76
- > - Adicionar campo `Phone` nos inputs do service e validacao
77
- >
78
- > **Fase 3 — Interface gRPC (Proto + Handler)**
79
- > - Atualizar `user.proto` com campo `phone`
80
- > - Executar `make proto` para regenerar
81
- > - Atualizar handler para mapear campo `phone`
82
- >
83
- > **Fase 4 — Testes**
84
- > - Atualizar testes existentes em todas as camadas
85
- > - Adicionar testes especificos para o campo telefone
86
- >
87
- > Podemos prosseguir com esta estrutura de fases?
88
-
89
- **Resposta simulada do usuario:** Sim, aprovado. Pode destrinchar as tasks.
90
-
91
- ---
92
-
93
- ## Passo 4: Destrinchar Tasks — Fase por Fase
94
-
95
- ### Pergunta Fase 1:
96
-
97
- > Podemos destrinchar as tasks da Fase 1 — Banco de Dados e Queries?
98
-
99
- **Resposta simulada:** Sim.
100
-
101
- ### Pergunta Fase 2:
102
-
103
- > Podemos destrinchar as tasks da Fase 2 — Camadas de Negocio?
104
-
105
- **Resposta simulada:** Sim.
106
-
107
- ### Pergunta Fase 3:
108
-
109
- > Podemos destrinchar as tasks da Fase 3 — Interface gRPC?
110
-
111
- **Resposta simulada:** Sim.
112
-
113
- ### Pergunta Fase 4:
114
-
115
- > Podemos destrinchar as tasks da Fase 4 — Testes?
116
-
117
- **Resposta simulada:** Sim.
118
-
119
- ---
120
-
121
- ## Passo 5: Tasks Individuais (conteudo completo)
122
-
123
- Abaixo estao as tasks completas que seriam salvas em `docs/telefone-usuario/v1/tasks/TN.md`:
124
-
125
- ---
126
-
127
- # T1.md — Criar migracao para adicionar coluna telefone
128
-
129
- ## 1. Identificacao
130
- - **ID**: T1
131
- - **Nome da Task**: Criar migracao para adicionar coluna telefone na tabela usuarios
132
- - **Responsavel**: —
133
- - **Status**: A Fazer
134
- - **Fase**: Fase 1 — Banco de Dados e Queries
135
- - **Dependencias**: Nenhuma
136
- - **User Stories Relacionadas**: US-10
137
-
138
- ---
139
-
140
- ## 2. Objetivo da Task
141
- Criar nova migracao SQL que adiciona a coluna `telefone` (TEXT, opcional/nullable) a tabela `usuarios`.
142
-
143
- ---
144
-
145
- ## 3. Descricao Detalhada
146
-
147
- Criar o arquivo `internal/db/migrations/003_add_telefone_usuarios.sql` com o seguinte conteudo:
148
-
149
- ```sql
150
- ALTER TABLE usuarios ADD COLUMN telefone TEXT;
151
- ```
152
-
153
- **Decisoes tecnicas:**
154
- - A coluna `telefone` e `TEXT` sem `NOT NULL`, tornando-a opcional (nullable)
155
- - Seguir o padrao do projeto: nome do arquivo sequencial (`003_`), descritivo, sem `.up.sql`/`.down.sql` (projeto usa arquivo unico de migracao)
156
- - Coluna em portugues conforme convencao do projeto (`telefone`, nao `phone`)
157
- - Sem valor DEFAULT, pois o campo e opcional e usuarios existentes terao `NULL`
158
-
159
- **IMPORTANTE**: Nao editar migracoes existentes (001, 002). Apenas criar nova.
160
-
161
- ---
162
-
163
- ## 4. Aceite Tecnico (criterios objetivos)
164
- - [ ] Arquivo `003_add_telefone_usuarios.sql` criado em `internal/db/migrations/`
165
- - [ ] SQL sintaticamente correto para SQLite
166
- - [ ] Coluna `telefone` e TEXT nullable (sem NOT NULL)
167
- - [ ] Migracao nao altera tabelas existentes alem de adicionar a coluna
168
- - [ ] Migracao aplica sem erro em banco limpo (junto com 001 e 002)
169
- - [ ] Nenhuma migracao existente foi editada
170
-
171
- ---
172
-
173
- ## 5. Arquivos Impactados
174
-
175
- ### 5.1 Arquivos a Criar
176
- | Arquivo | Descricao |
177
- |---------|-----------|
178
- | `internal/db/migrations/003_add_telefone_usuarios.sql` | Migracao ALTER TABLE para adicionar coluna telefone |
179
-
180
- ### 5.2 Arquivos a Modificar
181
- | Arquivo | Modificacao |
182
- |---------|------------|
183
- | Nenhum | — |
184
-
185
- ### 5.3 Arquivos de Referencia
186
- | Arquivo | Motivo da Consulta |
187
- |---------|-------------------|
188
- | `internal/db/migrations/001_create_usuarios.sql` | Referencia de schema existente |
189
- | `internal/db/migrations/002_add_endereco_usuarios.sql` | Referencia de padrao de ALTER TABLE no projeto |
190
-
191
- ---
192
-
193
- ## 6. Testes
194
-
195
- ### 6.1 Testes Unitarios
196
- - N/A — migracao SQL nao possui logica testavel unitariamente
197
-
198
- ### 6.2 Testes de Integracao
199
- - [ ] Teste: verificar que a coluna `telefone` existe na tabela `usuarios` apos migracao (PRAGMA table_info) — adicionar em `internal/repository/user_repository_integration_test.go` seguindo o padrao de `TestRunMigrations_TableSchema_IncludesEndereco`
200
- - [ ] Teste: verificar que a coluna `telefone` aceita NULL (inserir usuario sem telefone e consultar)
201
- - [ ] Teste: verificar que a coluna `telefone` aceita valor TEXT (inserir usuario com telefone e consultar)
202
-
203
- ### 6.3 Testes E2E
204
- - N/A — sera coberto nas tasks de camadas superiores
205
-
206
- ### 6.4 Cenarios de Erro
207
- - [ ] Cenario: migracao aplicada em banco que ja tem a coluna (idempotencia via golang-migrate)
208
-
209
- ---
210
-
211
- ## 7. Notas / Observacoes
212
- - O padrao do projeto para migracoes usa arquivo unico (sem separacao up/down), conforme observado em `001_create_usuarios.sql` e `002_add_endereco_usuarios.sql`
213
- - A migracao 002 usou `NOT NULL DEFAULT ''` para `endereco` (campo obrigatorio). Para `telefone` o SPEC define como opcional, portanto `TEXT` sem `NOT NULL`
214
-
215
- ---
216
-
217
- ## 8. Checklist Final
218
- - [ ] Implementada conforme SPEC
219
- - [ ] Testes de integracao criados/atualizados
220
- - [ ] Aceite tecnico atendido
221
- - [ ] Revisada
222
- - [ ] Integrada a branch principal
223
-
224
- ---
225
- ---
226
-
227
- # T2.md — Atualizar queries SQLC para incluir coluna telefone
228
-
229
- ## 1. Identificacao
230
- - **ID**: T2
231
- - **Nome da Task**: Atualizar queries SQLC para incluir coluna telefone
232
- - **Responsavel**: —
233
- - **Status**: A Fazer
234
- - **Fase**: Fase 1 — Banco de Dados e Queries
235
- - **Dependencias**: T1
236
- - **User Stories Relacionadas**: US-10
237
-
238
- ---
239
-
240
- ## 2. Objetivo da Task
241
- Atualizar as queries `CreateUser` e `UpdateUser` no arquivo de queries SQLC para incluir a coluna `telefone`, e regenerar o codigo SQLC.
242
-
243
- ---
244
-
245
- ## 3. Descricao Detalhada
246
-
247
- Editar o arquivo `internal/db/sqlc/queries/user.sql`:
248
-
249
- **Query `CreateUser`** — adicionar `telefone` na lista de colunas e valores:
250
- ```sql
251
- -- name: CreateUser :one
252
- INSERT INTO usuarios (id, nome, email, senha_hash, endereco, telefone, data_criacao, data_atualizacao)
253
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)
254
- RETURNING *;
255
- ```
256
-
257
- **Query `UpdateUser`** — adicionar `telefone` no SET:
258
- ```sql
259
- -- name: UpdateUser :one
260
- UPDATE usuarios
261
- SET nome = ?,
262
- email = ?,
263
- senha_hash = ?,
264
- endereco = ?,
265
- telefone = ?,
266
- data_atualizacao = ?
267
- WHERE id = ?
268
- RETURNING *;
269
- ```
270
-
271
- **Queries `GetUserByID` e `GetUserByEmail`** — usam `SELECT *`, portanto ja incluirao `telefone` automaticamente apos a migracao. Nao precisam de alteracao.
272
-
273
- Apos editar, executar `make sqlc` para regenerar o codigo em `internal/db/sqlc/`.
274
-
275
- **IMPORTANTE**: NAO editar arquivos em `internal/db/sqlc/` diretamente — apenas os arquivos em `internal/db/sqlc/queries/`.
276
-
277
- ---
278
-
279
- ## 4. Aceite Tecnico (criterios objetivos)
280
- - [ ] Query `CreateUser` inclui coluna `telefone` e parametro correspondente
281
- - [ ] Query `UpdateUser` inclui `telefone` no SET
282
- - [ ] `make sqlc` executa sem erros
283
- - [ ] Struct `Usuario` gerada em `internal/db/sqlc/` contém campo `Telefone`
284
- - [ ] Params `CreateUserParams` inclui campo `Telefone`
285
- - [ ] Params `UpdateUserParams` inclui campo `Telefone`
286
- - [ ] Queries SELECT continuam funcionando (retornando `telefone`)
287
-
288
- ---
289
-
290
- ## 5. Arquivos Impactados
291
-
292
- ### 5.1 Arquivos a Criar
293
- | Arquivo | Descricao |
294
- |---------|-----------|
295
- | Nenhum | — |
296
-
297
- ### 5.2 Arquivos a Modificar
298
- | Arquivo | Modificacao |
299
- |---------|------------|
300
- | `internal/db/sqlc/queries/user.sql` | Adicionar `telefone` nas queries CreateUser e UpdateUser |
301
-
302
- ### 5.3 Arquivos de Referencia
303
- | Arquivo | Motivo da Consulta |
304
- |---------|-------------------|
305
- | `internal/db/sqlc/sqlc.yaml` | Verificar configuracao SQLC (engine, paths) |
306
- | `internal/db/migrations/003_add_telefone_usuarios.sql` | Verificar tipo da coluna (TEXT nullable) |
307
-
308
- ---
309
-
310
- ## 6. Testes
311
-
312
- ### 6.1 Testes Unitarios
313
- - N/A — queries SQL e codigo gerado SQLC nao possuem logica testavel unitariamente
314
-
315
- ### 6.2 Testes de Integracao
316
- - [ ] Teste: `CreateUser` com campo `telefone` preenchido retorna valor correto — sera coberto na task T3/T4 (repository)
317
- - [ ] Teste: `CreateUser` com campo `telefone` NULL funciona corretamente — sera coberto na task T3/T4
318
- - [ ] Teste: `UpdateUser` com campo `telefone` atualiza valor corretamente — sera coberto na task T3/T4
319
-
320
- ### 6.3 Testes E2E
321
- - N/A
322
-
323
- ### 6.4 Cenarios de Erro
324
- - [ ] Cenario: `make sqlc` gera codigo sem erros de compilacao (validar com `make build`)
325
-
326
- ---
327
-
328
- ## 7. Notas / Observacoes
329
- - O tipo do campo `Telefone` no codigo gerado sera `sql.NullString` pois a coluna e nullable
330
- - As queries SELECT usam `SELECT *` e portanto capturarao a coluna automaticamente
331
- - Executar `make sqlc` e obrigatorio apos editar queries — o codigo gerado em `internal/db/sqlc/` sera atualizado automaticamente
332
-
333
- ---
334
-
335
- ## 8. Checklist Final
336
- - [ ] Implementada conforme SPEC
337
- - [ ] Codigo SQLC regenerado com sucesso
338
- - [ ] Aceite tecnico atendido
339
- - [ ] Revisada
340
- - [ ] Integrada a branch principal
341
-
342
- ---
343
- ---
344
-
345
- # T3.md — Adicionar campo Phone ao repository e atualizar mapeamento
346
-
347
- ## 1. Identificacao
348
- - **ID**: T3
349
- - **Nome da Task**: Adicionar campo Phone ao modelo User do repository e atualizar mapeamento
350
- - **Responsavel**: —
351
- - **Status**: A Fazer
352
- - **Fase**: Fase 2 — Camadas de Negocio
353
- - **Dependencias**: T2
354
- - **User Stories Relacionadas**: US-10
355
-
356
- ---
357
-
358
- ## 2. Objetivo da Task
359
- Adicionar o campo `Phone` (opcional, ponteiro `*string`) ao modelo `User` do repository, e atualizar as funcoes `Create`, `Update` e `toUser` para mapear `telefone` (banco) para `Phone` (Go).
360
-
361
- ---
362
-
363
- ## 3. Descricao Detalhada
364
-
365
- Editar `internal/repository/user_repository.go`:
366
-
367
- **1. Adicionar campo na struct `User`:**
368
- ```go
369
- type User struct {
370
- ID string
371
- Name string
372
- Email string
373
- PasswordHash string
374
- Address string
375
- Phone *string // novo campo - ponteiro pois e opcional (nullable no banco)
376
- CreatedAt time.Time
377
- UpdatedAt time.Time
378
- }
379
- ```
380
-
381
- **2. Atualizar funcao `Create`** — mapear `Phone` para `Telefone` nos params SQLC:
382
- ```go
383
- params := sqlc.CreateUserParams{
384
- // ... campos existentes ...
385
- Telefone: toNullString(user.Phone),
386
- // ...
387
- }
388
- ```
389
-
390
- **3. Atualizar funcao `Update`** — mapear `Phone` para `Telefone` nos params SQLC:
391
- ```go
392
- params := sqlc.UpdateUserParams{
393
- // ... campos existentes ...
394
- Telefone: toNullString(user.Phone),
395
- // ...
396
- }
397
- ```
398
-
399
- **4. Atualizar funcao `toUser`** — mapear `Telefone` (sqlc) para `Phone` (dominio):
400
- ```go
401
- func toUser(u sqlc.Usuario) *User {
402
- return &User{
403
- // ... campos existentes ...
404
- Phone: fromNullString(u.Telefone),
405
- // ...
406
- }
407
- }
408
- ```
409
-
410
- **5. Criar funcoes helper** para conversao `*string` <-> `sql.NullString`:
411
- ```go
412
- func toNullString(s *string) sql.NullString {
413
- if s == nil {
414
- return sql.NullString{}
415
- }
416
- return sql.NullString{String: *s, Valid: true}
417
- }
418
-
419
- func fromNullString(ns sql.NullString) *string {
420
- if !ns.Valid {
421
- return nil
422
- }
423
- return &ns.String
424
- }
425
- ```
426
-
427
- **Decisoes tecnicas:**
428
- - `Phone` e `*string` (ponteiro) no modelo de dominio para representar campo nullable
429
- - Funcoes helper `toNullString`/`fromNullString` para converter entre `*string` e `sql.NullString`
430
- - Mapeamento: `telefone` (coluna banco, portugues) -> `Phone` (struct Go, ingles)
431
-
432
- ---
433
-
434
- ## 4. Aceite Tecnico (criterios objetivos)
435
- - [ ] Struct `User` possui campo `Phone *string`
436
- - [ ] Funcao `Create` mapeia `Phone` para `Telefone` no SQLC params
437
- - [ ] Funcao `Update` mapeia `Phone` para `Telefone` no SQLC params
438
- - [ ] Funcao `toUser` mapeia `Telefone` (sqlc) para `Phone` (dominio)
439
- - [ ] Funcoes helper `toNullString`/`fromNullString` implementadas
440
- - [ ] Codigo compila sem erros (`make build`)
441
- - [ ] Fluxos existentes (sem telefone) continuam funcionando — campo e opcional
442
-
443
- ---
444
-
445
- ## 5. Arquivos Impactados
446
-
447
- ### 5.1 Arquivos a Criar
448
- | Arquivo | Descricao |
449
- |---------|-----------|
450
- | Nenhum | — |
451
-
452
- ### 5.2 Arquivos a Modificar
453
- | Arquivo | Modificacao |
454
- |---------|------------|
455
- | `internal/repository/user_repository.go` | Adicionar campo Phone a struct User, atualizar Create, Update, toUser, adicionar helpers |
456
-
457
- ### 5.3 Arquivos de Referencia
458
- | Arquivo | Motivo da Consulta |
459
- |---------|-------------------|
460
- | `internal/db/sqlc/` (codigo gerado) | Verificar nomes dos campos gerados (Telefone, sql.NullString) |
461
-
462
- ---
463
-
464
- ## 6. Testes
465
-
466
- ### 6.1 Testes Unitarios
467
- - N/A — repository nao possui logica testavel unitariamente (depende de banco)
468
-
469
- ### 6.2 Testes de Integracao
470
- Atualizar `internal/repository/user_repository_integration_test.go`:
471
-
472
- - [ ] Teste: `TestUserRepository_Create_WithPhone` — criar usuario com telefone e verificar que o valor e persistido e retornado
473
- - [ ] Teste: `TestUserRepository_Create_WithoutPhone` — criar usuario sem telefone (nil) e verificar que `Phone` retorna nil
474
- - [ ] Teste: `TestUserRepository_Update_Phone` — atualizar telefone de usuario existente e verificar
475
- - [ ] Teste: `TestUserRepository_Update_PhoneToNil` — limpar telefone (setar nil) e verificar
476
- - [ ] Teste: atualizar `createTestUser` para incluir campo `Phone` (pode ser nil por padrao)
477
- - [ ] Teste: verificar que testes existentes continuam passando (campo `Phone` nil por padrao)
478
-
479
- ### 6.3 Testes E2E
480
- - N/A
481
-
482
- ### 6.4 Cenarios de Erro
483
- - [ ] Cenario: criar usuario com `Phone` nil nao gera erro
484
- - [ ] Cenario: update com `Phone` nil nao sobrescreve valor existente indevidamente (depende da logica do service, mas repository deve aceitar nil)
485
-
486
- ---
487
-
488
- ## 7. Notas / Observacoes
489
- - O campo `Telefone` no codigo gerado pelo SQLC sera `sql.NullString` porque a coluna e nullable no banco
490
- - Os helpers `toNullString`/`fromNullString` podem ser reutilizados por outros campos opcionais no futuro
491
- - O helper `createTestUser` nos testes de integracao precisa ser atualizado para incluir `Phone` (pode ser `nil` para manter compatibilidade)
492
-
493
- ---
494
-
495
- ## 8. Checklist Final
496
- - [ ] Implementada conforme SPEC
497
- - [ ] Testes de integracao criados/atualizados
498
- - [ ] Aceite tecnico atendido
499
- - [ ] Revisada
500
- - [ ] Integrada a branch principal
501
-
502
- ---
503
- ---
504
-
505
- # T4.md — Adicionar campo Phone ao service com validacao
506
-
507
- ## 1. Identificacao
508
- - **ID**: T4
509
- - **Nome da Task**: Adicionar campo Phone ao service com validacao
510
- - **Responsavel**: —
511
- - **Status**: A Fazer
512
- - **Fase**: Fase 2 — Camadas de Negocio
513
- - **Dependencias**: T3
514
- - **User Stories Relacionadas**: US-10
515
-
516
- ---
517
-
518
- ## 2. Objetivo da Task
519
- Adicionar o campo `Phone` (opcional) nos inputs `CreateUserInput` e `UpdateUserInput` do service, implementar validacao de tamanho (10 a 15 caracteres) e integrar com o repository.
520
-
521
- ---
522
-
523
- ## 3. Descricao Detalhada
524
-
525
- Editar `internal/service/user_service.go`:
526
-
527
- **1. Adicionar erro de validacao:**
528
- ```go
529
- var (
530
- // ... erros existentes ...
531
- ErrInvalidPhone = errors.New("telefone deve ter entre 10 e 15 caracteres")
532
- )
533
- ```
534
-
535
- **2. Adicionar campo em `CreateUserInput`:**
536
- ```go
537
- type CreateUserInput struct {
538
- Name string
539
- Email string
540
- Password string
541
- Address string
542
- Phone *string // opcional
543
- }
544
- ```
545
-
546
- **3. Adicionar campo em `UpdateUserInput`:**
547
- ```go
548
- type UpdateUserInput struct {
549
- Name *string
550
- Email *string
551
- Address *string
552
- Phone *string // opcional
553
- NewPassword *string
554
- CurrentPassword *string
555
- }
556
- ```
557
-
558
- **4. Adicionar validacao em `CreateUser`:**
559
- Apos as validacoes existentes, antes de criar o usuario:
560
- ```go
561
- if input.Phone != nil {
562
- if len(*input.Phone) < 10 || len(*input.Phone) > 15 {
563
- return nil, ErrInvalidPhone
564
- }
565
- }
566
- ```
567
-
568
- E mapear para o repository:
569
- ```go
570
- user := &repository.User{
571
- // ... campos existentes ...
572
- Phone: input.Phone,
573
- // ...
574
- }
575
- ```
576
-
577
- **5. Adicionar validacao e mapeamento em `UpdateUser`:**
578
- Na secao de campos opcionais:
579
- ```go
580
- if input.Phone != nil {
581
- if len(*input.Phone) < 10 || len(*input.Phone) > 15 {
582
- return nil, ErrInvalidPhone
583
- }
584
- currentUser.Phone = input.Phone
585
- }
586
- ```
587
-
588
- E atualizar a verificacao de "nenhum campo":
589
- ```go
590
- if input.Name == nil && input.Email == nil && input.Address == nil && input.Phone == nil && input.NewPassword == nil {
591
- return nil, ErrNoFieldsToUpdate
592
- }
593
- ```
594
-
595
- ---
596
-
597
- ## 4. Aceite Tecnico (criterios objetivos)
598
- - [ ] `CreateUserInput` possui campo `Phone *string`
599
- - [ ] `UpdateUserInput` possui campo `Phone *string`
600
- - [ ] Erro `ErrInvalidPhone` exportado com mensagem em portugues
601
- - [ ] Validacao: se `Phone` informado, deve ter entre 10 e 15 caracteres
602
- - [ ] Validacao: `Phone` nil e aceito sem erro (campo opcional)
603
- - [ ] `CreateUser` mapeia `Phone` para `repository.User`
604
- - [ ] `UpdateUser` mapeia `Phone` para `currentUser` quando informado
605
- - [ ] `UpdateUser` aceita `Phone` como campo unico para update (verificacao de "nenhum campo")
606
- - [ ] Codigo compila sem erros
607
-
608
- ---
609
-
610
- ## 5. Arquivos Impactados
611
-
612
- ### 5.1 Arquivos a Criar
613
- | Arquivo | Descricao |
614
- |---------|-----------|
615
- | Nenhum | — |
616
-
617
- ### 5.2 Arquivos a Modificar
618
- | Arquivo | Modificacao |
619
- |---------|------------|
620
- | `internal/service/user_service.go` | Adicionar ErrInvalidPhone, campo Phone nos inputs, validacao e mapeamento |
621
-
622
- ### 5.3 Arquivos de Referencia
623
- | Arquivo | Motivo da Consulta |
624
- |---------|-------------------|
625
- | `internal/repository/user_repository.go` | Verificar struct User com campo Phone |
626
-
627
- ---
628
-
629
- ## 6. Testes
630
-
631
- ### 6.1 Testes Unitarios
632
- Atualizar `internal/service/user_service_test.go`:
633
-
634
- **Testes novos:**
635
- - [ ] Teste: `TestCreateUser_WithPhone_Success` — criar usuario com telefone valido (ex: "11987654321", 11 chars)
636
- - [ ] Teste: `TestCreateUser_WithoutPhone_Success` — criar usuario sem telefone (nil) — validar que nao gera erro
637
- - [ ] Teste: `TestCreateUser_PhoneTooShort` — telefone com 9 caracteres retorna `ErrInvalidPhone`
638
- - [ ] Teste: `TestCreateUser_PhoneTooLong` — telefone com 16 caracteres retorna `ErrInvalidPhone`
639
- - [ ] Teste: `TestCreateUser_PhoneExactly10Chars` — limite inferior aceito
640
- - [ ] Teste: `TestCreateUser_PhoneExactly15Chars` — limite superior aceito
641
- - [ ] Teste: `TestUpdateUser_PhoneOnly` — atualizar apenas telefone com sucesso
642
- - [ ] Teste: `TestUpdateUser_PhoneInvalid` — telefone invalido retorna `ErrInvalidPhone`
643
- - [ ] Teste: `TestUpdateUser_PhoneWithOtherFields` — atualizar telefone junto com outros campos
644
-
645
- **Testes existentes a atualizar:**
646
- - [ ] Atualizar `MockUserRepository` se necessario (interface nao muda, mas `User` struct ganha campo)
647
- - [ ] Atualizar `returnUser` em testes existentes para incluir `Phone` (pode ser nil)
648
- - [ ] Garantir que testes existentes continuam passando
649
-
650
- ### 6.2 Testes de Integracao
651
- - N/A — coberto pelos testes unitarios com mock
652
-
653
- ### 6.3 Testes E2E
654
- - N/A
655
-
656
- ### 6.4 Cenarios de Erro
657
- - [ ] Cenario: telefone com 9 caracteres -> `ErrInvalidPhone`
658
- - [ ] Cenario: telefone com 16 caracteres -> `ErrInvalidPhone`
659
- - [ ] Cenario: telefone vazio string ("") -> `ErrInvalidPhone` (len < 10)
660
- - [ ] Cenario: telefone nil -> aceito sem erro
661
-
662
- ---
663
-
664
- ## 7. Notas / Observacoes
665
- - A validacao de telefone e simples: apenas tamanho entre 10 e 15 chars, conforme SPEC
666
- - Nao ha validacao de formato (apenas digitos, por exemplo) — se necessario, criar US separada
667
- - O campo `Phone` no `UpdateUserInput` participa da verificacao de "nenhum campo para atualizar"
668
-
669
- ---
670
-
671
- ## 8. Checklist Final
672
- - [ ] Implementada conforme SPEC
673
- - [ ] Testes unitarios criados/atualizados
674
- - [ ] Aceite tecnico atendido
675
- - [ ] Revisada
676
- - [ ] Integrada a branch principal
677
-
678
- ---
679
- ---
680
-
681
- # T5.md — Atualizar proto e handler gRPC para incluir campo phone
682
-
683
- ## 1. Identificacao
684
- - **ID**: T5
685
- - **Nome da Task**: Atualizar proto e handler gRPC para incluir campo phone
686
- - **Responsavel**: —
687
- - **Status**: A Fazer
688
- - **Fase**: Fase 3 — Interface gRPC
689
- - **Dependencias**: T4
690
- - **User Stories Relacionadas**: US-10
691
-
692
- ---
693
-
694
- ## 2. Objetivo da Task
695
- Adicionar campo `phone` nas mensagens proto (User, CreateUserRequest, UpdateUserRequest), regenerar codigo, e atualizar o handler gRPC para mapear o campo.
696
-
697
- ---
698
-
699
- ## 3. Descricao Detalhada
700
-
701
- ### 3.1 Atualizar Proto
702
-
703
- Editar `api/proto/v1/user.proto`:
704
-
705
- **Mensagem `User`** — adicionar campo `phone` com field number 7:
706
- ```proto
707
- message User {
708
- string id = 1;
709
- string name = 2;
710
- string email = 3;
711
- string address = 4;
712
- string created_at = 5;
713
- string updated_at = 6;
714
- optional string phone = 7;
715
- }
716
- ```
717
-
718
- **Mensagem `CreateUserRequest`** — adicionar campo `phone` com field number 5:
719
- ```proto
720
- message CreateUserRequest {
721
- string name = 1;
722
- string email = 2;
723
- string password = 3;
724
- string address = 4;
725
- optional string phone = 5;
726
- }
727
- ```
728
-
729
- **Mensagem `UpdateUserRequest`** — adicionar campo `phone` com field number 6:
730
- ```proto
731
- message UpdateUserRequest {
732
- optional string name = 1;
733
- optional string email = 2;
734
- optional string address = 3;
735
- optional string new_password = 4;
736
- optional string current_password = 5;
737
- optional string phone = 6;
738
- }
739
- ```
740
-
741
- Executar `make proto` (ou `buf generate`) para regenerar codigo em `gen/`.
742
-
743
- ### 3.2 Atualizar Handler
744
-
745
- Editar `internal/handler/grpc/user_handler.go`:
746
-
747
- **Funcao `CreateUser`** — mapear `Phone` do request para input:
748
- ```go
749
- input := service.CreateUserInput{
750
- Name: req.GetName(),
751
- Email: req.GetEmail(),
752
- Password: req.GetPassword(),
753
- Address: req.GetAddress(),
754
- Phone: req.Phone, // optional -> *string
755
- }
756
- ```
757
-
758
- **Funcao `UpdateUser`** — adicionar mapeamento de phone:
759
- ```go
760
- if req.Phone != nil {
761
- input.Phone = req.Phone
762
- }
763
- ```
764
-
765
- **Funcao `domainUserToProto`** — mapear `Phone` para proto:
766
- ```go
767
- func domainUserToProto(user *repository.User) *pb.User {
768
- return &pb.User{
769
- // ... campos existentes ...
770
- Phone: user.Phone,
771
- }
772
- }
773
- ```
774
-
775
- **Funcao `mapServiceError`** — adicionar mapeamento de `ErrInvalidPhone`:
776
- ```go
777
- case errors.Is(err, service.ErrInvalidPhone):
778
- return status.Errorf(codes.InvalidArgument, "%v", err)
779
- ```
780
- Adicionar na clausula `switch` junto com os outros erros de `InvalidArgument`.
781
-
782
- ---
783
-
784
- ## 4. Aceite Tecnico (criterios objetivos)
785
- - [ ] Proto `user.proto` inclui campo `phone` em User (field 7), CreateUserRequest (field 5), UpdateUserRequest (field 6)
786
- - [ ] `make proto` executa sem erros
787
- - [ ] Handler `CreateUser` mapeia `Phone` do request para service input
788
- - [ ] Handler `UpdateUser` mapeia `Phone` do request para service input
789
- - [ ] Funcao `domainUserToProto` mapeia `Phone` do dominio para proto
790
- - [ ] `mapServiceError` trata `ErrInvalidPhone` como `InvalidArgument`
791
- - [ ] Codigo compila sem erros (`make build`)
792
- - [ ] Endpoint `CreateUser` aceita e persiste telefone
793
- - [ ] Endpoint `UpdateUser` aceita e atualiza telefone
794
- - [ ] Endpoint `GetUserLogged` retorna telefone
795
-
796
- ---
797
-
798
- ## 5. Arquivos Impactados
799
-
800
- ### 5.1 Arquivos a Criar
801
- | Arquivo | Descricao |
802
- |---------|-----------|
803
- | Nenhum | — |
804
-
805
- ### 5.2 Arquivos a Modificar
806
- | Arquivo | Modificacao |
807
- |---------|------------|
808
- | `api/proto/v1/user.proto` | Adicionar campo `phone` em User, CreateUserRequest, UpdateUserRequest |
809
- | `internal/handler/grpc/user_handler.go` | Mapear campo Phone em CreateUser, UpdateUser, domainUserToProto, mapServiceError |
810
-
811
- ### 5.3 Arquivos de Referencia
812
- | Arquivo | Motivo da Consulta |
813
- |---------|-------------------|
814
- | `gen/proto/v1/` (codigo gerado) | Verificar nomes de campos gerados apos `make proto` |
815
- | `internal/service/user_service.go` | Verificar nomes dos campos nos inputs e erro ErrInvalidPhone |
816
-
817
- ---
818
-
819
- ## 6. Testes
820
-
821
- ### 6.1 Testes Unitarios
822
- Atualizar `internal/handler/grpc/user_handler_test.go`:
823
-
824
- **Testes novos:**
825
- - [ ] Teste: `TestUserHandler_CreateUser_WithPhone` — enviar CreateUserRequest com phone e verificar que o input service recebe o valor
826
- - [ ] Teste: `TestUserHandler_CreateUser_WithoutPhone` — enviar sem phone e verificar que funciona normalmente
827
- - [ ] Teste: `TestUserHandler_CreateUser_InvalidPhone` — service retorna `ErrInvalidPhone`, verificar que handler retorna `InvalidArgument`
828
- - [ ] Teste: `TestUserHandler_UpdateUser_PhoneOnly` — atualizar apenas telefone via gRPC
829
- - [ ] Teste: `TestUserHandler_UpdateUser_InvalidPhone` — telefone invalido retorna `InvalidArgument`
830
- - [ ] Teste: `TestUserHandler_GetUserLogged_ReturnsPhone` — verificar que GetUserLogged retorna o campo phone no proto
831
- - [ ] Teste: atualizar `TestDomainUserToProto` para verificar campo `Phone`
832
- - [ ] Teste: atualizar `TestMapServiceError_AllErrors` para incluir `ErrInvalidPhone`
833
-
834
- **Testes existentes a atualizar:**
835
- - [ ] Atualizar `MockUserService` se a interface mudou (adicionar `Phone` nos inputs)
836
- - [ ] Atualizar testes existentes de CreateUser para incluir `Phone` no input (pode ser nil)
837
- - [ ] Atualizar testes existentes de UpdateUser para incluir `Phone` no input (pode ser nil)
838
- - [ ] Garantir que todos os testes existentes continuam passando
839
-
840
- ### 6.2 Testes de Integracao
841
- - N/A
842
-
843
- ### 6.3 Testes E2E
844
- - N/A — testes do handler com mock cobrem a integracao proto<->service
845
-
846
- ### 6.4 Cenarios de Erro
847
- - [ ] Cenario: `ErrInvalidPhone` -> gRPC `InvalidArgument`
848
- - [ ] Cenario: phone nil no request -> nao gera erro
849
- - [ ] Cenario: phone vazio no UpdateUser -> nao inclui no input (req.Phone seria nil)
850
-
851
- ---
852
-
853
- ## 7. Notas / Observacoes
854
- - O campo `optional string phone` no proto gera `*string` no Go, o que e compativel com o tipo `*string` no service e repository
855
- - Os field numbers escolhidos (7 para User, 5 para CreateUserRequest, 6 para UpdateUserRequest) sao os proximos disponiveis em cada mensagem
856
- - `make proto` deve ser executado ANTES de compilar o handler, pois o handler depende do codigo gerado
857
- - A mensagem `CreateUserResponse` e `LoginResponse` NAO incluem phone (conforme estrutura atual do proto — elas retornam campos especificos, nao a mensagem User)
858
-
859
- ---
860
-
861
- ## 8. Checklist Final
862
- - [ ] Implementada conforme SPEC
863
- - [ ] Testes unitarios criados/atualizados
864
- - [ ] Aceite tecnico atendido
865
- - [ ] Revisada
866
- - [ ] Integrada a branch principal
867
-
868
- ---
869
- ---
870
-
871
- # T6.md — Validacao cruzada e testes end-to-end da feature completa
872
-
873
- ## 1. Identificacao
874
- - **ID**: T6
875
- - **Nome da Task**: Validacao cruzada e testes end-to-end da feature completa
876
- - **Responsavel**: —
877
- - **Status**: A Fazer
878
- - **Fase**: Fase 4 — Testes e Validacao
879
- - **Dependencias**: T5
880
- - **User Stories Relacionadas**: US-10
881
-
882
- ---
883
-
884
- ## 2. Objetivo da Task
885
- Garantir que toda a stack funciona de ponta a ponta: migracao aplica, queries funcionam, repository persiste e recupera, service valida, handler expoe via gRPC. Executar todos os testes existentes e validar que nenhum fluxo existente foi quebrado.
886
-
887
- ---
888
-
889
- ## 3. Descricao Detalhada
890
-
891
- **1. Executar suite completa de testes:**
892
- ```bash
893
- make test
894
- ```
895
- Verificar que TODOS os testes passam — tanto os novos quanto os existentes.
896
-
897
- **2. Executar build completo:**
898
- ```bash
899
- make build
900
- ```
901
- Verificar que nao ha erros de compilacao.
902
-
903
- **3. Validar cenarios manualmente (se aplicavel):**
904
- - Subir servidor com `make run`
905
- - Testar via grpcurl ou cliente gRPC:
906
- - CreateUser com telefone
907
- - CreateUser sem telefone
908
- - UpdateUser adicionando telefone
909
- - UpdateUser removendo telefone (setar vazio / nil)
910
- - GetUserLogged retornando telefone
911
- - CreateUser com telefone invalido (< 10 chars)
912
-
913
- **4. Verificar que testes de regressao passam:**
914
- - Testes de service (unitarios com mock)
915
- - Testes de handler (unitarios com mock)
916
- - Testes de repository (integracao com SQLite)
917
-
918
- ---
919
-
920
- ## 4. Aceite Tecnico (criterios objetivos)
921
- - [ ] `make test` passa sem falhas
922
- - [ ] `make build` compila sem erros
923
- - [ ] Nenhum teste existente quebrado
924
- - [ ] Novos testes (de T3, T4, T5) incluidos e passando
925
- - [ ] Campo `phone` flui corretamente de gRPC request -> handler -> service -> repository -> banco -> retorno
926
-
927
- ---
928
-
929
- ## 5. Arquivos Impactados
930
-
931
- ### 5.1 Arquivos a Criar
932
- | Arquivo | Descricao |
933
- |---------|-----------|
934
- | Nenhum | — |
935
-
936
- ### 5.2 Arquivos a Modificar
937
- | Arquivo | Modificacao |
938
- |---------|------------|
939
- | Nenhum | Task de validacao — apenas execucao de testes |
940
-
941
- ### 5.3 Arquivos de Referencia
942
- | Arquivo | Motivo da Consulta |
943
- |---------|-------------------|
944
- | Todos os arquivos de teste | Verificar que passam |
945
- | `Makefile` | Verificar comandos make test, make build |
946
-
947
- ---
948
-
949
- ## 6. Testes
950
-
951
- ### 6.1 Testes Unitarios
952
- - [ ] Executar `CGO_ENABLED=1 go test ./internal/service/... -v` — todos devem passar
953
- - [ ] Executar `CGO_ENABLED=1 go test ./internal/handler/grpc/... -v` — todos devem passar
954
-
955
- ### 6.2 Testes de Integracao
956
- - [ ] Executar `CGO_ENABLED=1 go test ./internal/repository/... -v` — todos devem passar
957
-
958
- ### 6.3 Testes E2E
959
- - [ ] (Opcional) Teste manual via grpcurl: CreateUser com phone, GetUserLogged retorna phone
960
-
961
- ### 6.4 Cenarios de Erro
962
- - [ ] Cenario: nenhum teste existente quebrado (regressao zero)
963
-
964
- ---
965
-
966
- ## 7. Notas / Observacoes
967
- - Esta task e de validacao final — nao cria codigo novo
968
- - Se algum teste falhar, a correcao deve ser feita na task correspondente (T1-T5)
969
- - O objetivo e garantir integridade antes de considerar a feature completa
970
-
971
- ---
972
-
973
- ## 8. Checklist Final
974
- - [ ] `make test` sem falhas
975
- - [ ] `make build` sem erros
976
- - [ ] Aceite tecnico atendido
977
- - [ ] Revisada
978
- - [ ] Integrada a branch principal
979
-
980
- ---
981
- ---
982
-
983
- # task_plan.md — Documento de Referencia
984
-
985
- # TASK PLAN -- Adicionar Telefone ao Modulo de Usuario
986
-
987
- ## 1. Identificacao
988
- - **Feature/Projeto**: Adicionar Telefone ao Modulo de Usuario
989
- - **Responsavel (Tech Lead)**: —
990
- - **Data**: 2026-03-08
991
- - **Status**: Rascunho
992
- - **SPEC Relacionado**: docs/feature-telefone-usuario/v1/spec_tech.md (referencia inline no SPEC_TECH fornecido)
993
- - **PRD Relacionado**: docs/feature-telefone-usuario/v1/prd.md
994
-
995
- ---
996
-
997
- ## 2. Objetivo do Task Plan
998
- Adicionar o campo `telefone` (opcional) ao modulo de usuario em todas as camadas da aplicacao: banco de dados, queries SQLC, repository, service (com validacao de 10-15 caracteres), proto e handler gRPC. Ao final, o campo telefone estara disponivel nos endpoints CreateUser, UpdateUser e GetUserLogged.
999
-
1000
- ---
1001
-
1002
- ## 3. Macro-Fases (alto nivel)
1003
- - **Fase 1 -- Banco de Dados e Queries**
1004
- - Objetivo: Criar a infraestrutura de dados para suportar o campo telefone
1005
- - Tasks: T1, T2
1006
- - **Fase 2 -- Camadas de Negocio (Repository + Service)**
1007
- - Objetivo: Integrar o campo telefone nas camadas de dominio com mapeamento e validacao
1008
- - Tasks: T3, T4
1009
- - **Fase 3 -- Interface gRPC (Proto + Handler)**
1010
- - Objetivo: Expor o campo telefone via API gRPC
1011
- - Tasks: T5
1012
- - **Fase 4 -- Testes e Validacao**
1013
- - Objetivo: Garantir integridade da feature e regressao zero
1014
- - Tasks: T6
1015
-
1016
- ---
1017
-
1018
- ## 4. Lista de Tasks (visao macro)
1019
- | ID | Nome da Task | Arquivo | Fase | Dependencias | Pode Rodar em Paralelo? | Status |
1020
- | --- | ------------ | ------- | ---- | ------------ | ----------------------- | ------ |
1021
- | T1 | Criar migracao para adicionar coluna telefone | [T1](tasks/T1.md) | Fase 1 | Nenhuma | Sim (inicio) | A Fazer |
1022
- | T2 | Atualizar queries SQLC para incluir coluna telefone | [T2](tasks/T2.md) | Fase 1 | T1 | Nao | A Fazer |
1023
- | T3 | Adicionar campo Phone ao repository e atualizar mapeamento | [T3](tasks/T3.md) | Fase 2 | T2 | Nao | A Fazer |
1024
- | T4 | Adicionar campo Phone ao service com validacao | [T4](tasks/T4.md) | Fase 2 | T3 | Nao | A Fazer |
1025
- | T5 | Atualizar proto e handler gRPC para incluir campo phone | [T5](tasks/T5.md) | Fase 3 | T4 | Nao | A Fazer |
1026
- | T6 | Validacao cruzada e testes end-to-end da feature completa | [T6](tasks/T6.md) | Fase 4 | T5 | Nao | A Fazer |
1027
-
1028
- ---
1029
-
1030
- ## 5. Rastreabilidade: User Stories -> Tasks
1031
-
1032
- | User Story (PRD) | Definicao Tecnica (SPEC) | Tasks Relacionadas | Status |
1033
- | ---------------- | ------------------------ | ------------------ | ------ |
1034
- | US-10: Informar telefone para receber SMS | 3.1 Banco (migracao), 3.2 SQLC (queries), 3.3 Repository (campo Phone), 3.4 Service (validacao), 3.5 Handler (mapeamento), 3.6 Proto (campo phone) | T1, T2, T3, T4, T5, T6 | A Fazer |
1035
-
1036
- > Todas as user stories do SPEC_TECH foram decompostas em tasks.
1037
-
1038
- ---
1039
-
1040
- ## 6. Dependencias Gerais
1041
-
1042
- - **Cadeia sequencial**: T1 -> T2 -> T3 -> T4 -> T5 -> T6
1043
- - As tasks sao sequenciais pois cada camada depende da anterior (banco -> SQLC -> repository -> service -> handler)
1044
- - **Ferramentas externas necessarias**: `buf` (proto), `sqlc` (queries) — devem estar instaladas
1045
- - **Prerequisito**: `CGO_ENABLED=1` para compilacao (dependencia go-sqlite3)
1046
- - Nao ha dependencia de tasks de outras features
1047
- - Nao ha paralelismo possivel nesta feature (cadeia linear de dependencias por camada)
1048
-
1049
- ---
1050
-
1051
- ## 7. Criterios de Conclusao da Feature
1052
- A feature sera considerada concluida quando:
1053
- - [x] Todas as tasks estiverem completas (T1-T6)
1054
- - [ ] Testes validados (`make test` sem falhas)
1055
- - [ ] Criterios tecnicos do SPEC atendidos (campo telefone opcional, validacao 10-15 chars)
1056
- - [ ] Nenhum comportamento divergente do PRD
1057
- - [ ] Todas as User Stories cobertas (US-10)
1058
- - [ ] Build aprovado (`make build` sem erros)
1059
-
1060
- ---
1061
-
1062
- ## 8. Riscos & Mitigacoes
1063
- - **Risco**: Migracao SQLite com ALTER TABLE pode ter limitacoes -> **Mitigacao**: ALTER TABLE ADD COLUMN e suportado sem restricoes no SQLite
1064
- - **Risco**: Campo `telefone` nullable gera `sql.NullString` no SQLC, adicionando complexidade -> **Mitigacao**: Funcoes helper `toNullString`/`fromNullString` encapsulam a conversao
1065
- - **Risco**: Testes existentes quebram por mudanca na struct User -> **Mitigacao**: Campo `Phone` e ponteiro (`*string`), valor zero e nil, testes existentes nao precisam setar
1066
-
1067
- ---
1068
-
1069
- ## 9. Checklist Final
1070
- - [x] Task Plan completo
1071
- - [x] Tasks mapeadas (T1-T6)
1072
- - [x] Dependencias validadas (cadeia sequencial)
1073
- - [x] Rastreabilidade User Stories -> Tasks preenchida (US-10 -> T1-T6)
1074
- - [x] Pronto para execucao
1075
-
1076
- ---
1077
-
1078
- Arquivos que seriam salvos:
1079
- - `docs/telefone-usuario/v1/task_plan.md`
1080
- - `docs/telefone-usuario/v1/tasks/T1.md`
1081
- - `docs/telefone-usuario/v1/tasks/T2.md`
1082
- - `docs/telefone-usuario/v1/tasks/T3.md`
1083
- - `docs/telefone-usuario/v1/tasks/T4.md`
1084
- - `docs/telefone-usuario/v1/tasks/T5.md`
1085
- - `docs/telefone-usuario/v1/tasks/T6.md`
1086
-
1087
- Task Plan aprovado para execucao? (sim/nao)