adi_dev_workflow 1.1.1 → 1.3.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 (98) hide show
  1. package/bin/index.js +8 -8
  2. package/frameworks/agents/qa-staff-engineer.md +311 -311
  3. package/frameworks/agents/qa-validation-expert.md +458 -458
  4. package/frameworks/agents/tech-review-conformance.md +200 -200
  5. package/frameworks/commands/ministack/README.md +2 -0
  6. package/frameworks/commands/ministack/code-review.md +2 -0
  7. package/frameworks/commands/ministack/generate-intent.md +2 -0
  8. package/frameworks/commands/ministack/generate-scope.md +2 -0
  9. package/frameworks/commands/ministack/generate-tasks.md +2 -0
  10. package/frameworks/commands/ministack/generate-tech-direction.md +2 -0
  11. package/frameworks/commands/ministack/run-ministack-tasks.md +3 -0
  12. package/frameworks/commands/ministack/run-ministack-withlinear.md +2 -0
  13. package/frameworks/commands/ministack/status.md +2 -0
  14. package/frameworks/commands/sdd/code-review.md +2 -0
  15. package/frameworks/commands/sdd/generate-prd.md +2 -0
  16. package/frameworks/commands/sdd/generate-task-plan.md +2 -0
  17. package/frameworks/commands/sdd/generate-tech-direction.md +2 -0
  18. package/frameworks/commands/sdd/generate-tech-spec.md +2 -0
  19. package/frameworks/commands/sdd/generate-tests.md +2 -0
  20. package/frameworks/commands/sdd/run_tasks.md +3 -0
  21. package/frameworks/commands/sdd/run_tasks_withlinear.md +2 -0
  22. package/frameworks/commands/sdd/status.md +2 -0
  23. package/frameworks/commands/sdd/validate-sdd.md +2 -0
  24. package/frameworks/commands/sync-tasks-to-linear.md +2 -0
  25. package/frameworks/commands/taskcard/generate-taskcard.md +2 -0
  26. package/frameworks/commands/taskcard/run-taskcard.md +2 -0
  27. package/frameworks/config/ai-framework-config.yaml +112 -0
  28. package/frameworks/skills/ministack-tasks-expert/SKILL.md +204 -204
  29. package/frameworks/skills/ministack-tasks-expert/templates/task_plan_template.md +78 -78
  30. package/frameworks/skills/ministack-tasks-expert/templates/task_template.md +103 -103
  31. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.json +99 -99
  32. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.md +64 -64
  33. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/eval_metadata.json +12 -12
  34. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/grading.json +32 -32
  35. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/response.md +134 -134
  36. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/transcript.md +68 -68
  37. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/timing.json +5 -5
  38. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/grading.json +32 -32
  39. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/response.md +525 -525
  40. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/transcript.md +30 -30
  41. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/timing.json +5 -5
  42. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/eval_metadata.json +12 -12
  43. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/grading.json +32 -32
  44. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/response.md +1126 -1126
  45. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/transcript.md +131 -131
  46. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/timing.json +5 -5
  47. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/grading.json +32 -32
  48. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/response.md +452 -452
  49. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/transcript.md +78 -78
  50. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/timing.json +5 -5
  51. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/eval_metadata.json +12 -12
  52. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/grading.json +32 -32
  53. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/response.md +101 -101
  54. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/transcript.md +133 -133
  55. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/timing.json +5 -5
  56. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/grading.json +32 -32
  57. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/response.md +248 -248
  58. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/transcript.md +49 -49
  59. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/timing.json +5 -5
  60. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/review.html +1325 -1325
  61. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.json +94 -94
  62. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.md +67 -67
  63. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/eval_metadata.json +12 -12
  64. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/grading.json +32 -32
  65. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/response.md +117 -117
  66. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/transcript.md +91 -91
  67. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/timing.json +1 -1
  68. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/grading.json +32 -32
  69. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/response.md +694 -694
  70. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/transcript.md +45 -45
  71. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/timing.json +1 -1
  72. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/eval_metadata.json +12 -12
  73. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/grading.json +32 -32
  74. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/response.md +1087 -1087
  75. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/transcript.md +124 -124
  76. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/timing.json +1 -1
  77. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/grading.json +32 -32
  78. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/response.md +458 -458
  79. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/transcript.md +84 -84
  80. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/timing.json +1 -1
  81. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/eval_metadata.json +12 -12
  82. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/grading.json +32 -32
  83. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/response.md +70 -70
  84. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/transcript.md +148 -148
  85. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/timing.json +1 -1
  86. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/grading.json +32 -32
  87. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/response.md +249 -249
  88. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/transcript.md +80 -80
  89. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/timing.json +1 -1
  90. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/review.html +1325 -1325
  91. package/frameworks/skills/sdd-tech-spec-expert/SKILL.md +317 -317
  92. package/frameworks/skills/sdd-tech-spec-expert/evals/evals.json +199 -199
  93. package/frameworks/skills/sdd-tech-spec-expert/templates/spec_tech_template.md +290 -290
  94. package/frameworks/skills/sdd-tech-spec-expert/templates/tech_direction-template.md +23 -23
  95. package/package.json +28 -28
  96. package/src/cli.js +121 -121
  97. package/src/installer.js +155 -136
  98. package/src/transformer.js +86 -86
@@ -1,452 +1,452 @@
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.
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.