adi_dev_workflow 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/bin/index.js +0 -0
  2. package/frameworks/commands/generate-project-profile.md +68 -0
  3. package/frameworks/commands/generate-prompt.md +4 -2
  4. package/frameworks/commands/ministack/README.md +61 -46
  5. package/frameworks/commands/ministack/code-review.md +36 -49
  6. package/frameworks/commands/ministack/generate-intent.md +25 -2
  7. package/frameworks/commands/ministack/generate-scope.md +30 -6
  8. package/frameworks/commands/ministack/generate-tasks.md +191 -6
  9. package/frameworks/commands/ministack/generate-tech-direction.md +43 -0
  10. package/frameworks/commands/ministack/run-ministack-tasks.md +352 -33
  11. package/frameworks/commands/ministack/run-ministack-withlinear.md +23 -22
  12. package/frameworks/commands/ministack/status.md +153 -0
  13. package/frameworks/commands/sdd/code-review.md +10 -10
  14. package/frameworks/commands/sdd/generate-prd.md +32 -2
  15. package/frameworks/commands/sdd/generate-task-plan.md +199 -5
  16. package/frameworks/commands/sdd/generate-tech-direction.md +43 -0
  17. package/frameworks/commands/sdd/generate-tech-spec.md +218 -0
  18. package/frameworks/commands/sdd/generate-tests.md +2 -2
  19. package/frameworks/commands/sdd/run_tasks.md +391 -43
  20. package/frameworks/commands/sdd/run_tasks_withlinear.md +276 -37
  21. package/frameworks/commands/sdd/status.md +160 -0
  22. package/frameworks/commands/sdd/validate-sdd.md +18 -2
  23. package/frameworks/commands/sync-tasks-to-linear.md +588 -588
  24. package/frameworks/commands/taskcard/generate-taskcard.md +42 -25
  25. package/frameworks/commands/taskcard/run-taskcard.md +203 -34
  26. package/frameworks/skills/ministack-intent-expert/SKILL.md +3 -2
  27. package/frameworks/skills/ministack-intent-expert/templates/intent-template.md +1 -1
  28. package/frameworks/skills/ministack-scope-expert/SKILL.md +6 -10
  29. package/frameworks/skills/ministack-scope-expert/templates/scope-template.md +1 -1
  30. package/frameworks/skills/ministack-tasks-expert/SKILL.md +192 -0
  31. package/frameworks/skills/ministack-tasks-expert/templates/task_plan_template.md +78 -0
  32. package/frameworks/skills/ministack-tasks-expert/templates/task_template.md +103 -0
  33. package/frameworks/skills/ministack-tech-direction-expert/SKILL.md +218 -0
  34. package/frameworks/skills/ministack-tech-direction-expert/evals/evals.json +1 -0
  35. package/frameworks/skills/ministack-tech-direction-expert/templates/tech_direction-template.md +17 -0
  36. package/frameworks/skills/sdd-prd-expert/SKILL.md +143 -95
  37. package/frameworks/skills/sdd-prd-expert/evals/evals.json +59 -0
  38. package/frameworks/skills/sdd-prd-expert/templates/prd_template.md +46 -46
  39. package/frameworks/skills/sdd-prd-expert/templates/tech_direction-template.md +23 -0
  40. package/frameworks/skills/sdd-task-plan-expert/SKILL.md +179 -201
  41. package/frameworks/skills/sdd-task-plan-expert/evals/evals.json +109 -0
  42. package/frameworks/skills/sdd-task-plan-expert/templates/task_plan_template.md +33 -33
  43. package/frameworks/skills/sdd-task-plan-expert/templates/task_template.md +58 -32
  44. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.json +99 -0
  45. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.md +64 -0
  46. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/eval_metadata.json +12 -0
  47. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/grading.json +32 -0
  48. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/response.md +134 -0
  49. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/transcript.md +68 -0
  50. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/timing.json +5 -0
  51. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/grading.json +32 -0
  52. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/response.md +525 -0
  53. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/transcript.md +30 -0
  54. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/timing.json +5 -0
  55. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/eval_metadata.json +12 -0
  56. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/grading.json +32 -0
  57. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/response.md +1126 -0
  58. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/transcript.md +131 -0
  59. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/timing.json +5 -0
  60. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/grading.json +32 -0
  61. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/response.md +452 -0
  62. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/transcript.md +78 -0
  63. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/timing.json +5 -0
  64. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/eval_metadata.json +12 -0
  65. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/grading.json +32 -0
  66. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/response.md +101 -0
  67. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/transcript.md +133 -0
  68. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/timing.json +5 -0
  69. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/grading.json +32 -0
  70. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/response.md +248 -0
  71. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/transcript.md +49 -0
  72. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/timing.json +5 -0
  73. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/review.html +1325 -0
  74. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.json +94 -0
  75. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.md +67 -0
  76. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/eval_metadata.json +12 -0
  77. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/grading.json +32 -0
  78. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/response.md +117 -0
  79. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/transcript.md +91 -0
  80. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/timing.json +1 -0
  81. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/grading.json +32 -0
  82. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/response.md +694 -0
  83. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/transcript.md +45 -0
  84. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/timing.json +1 -0
  85. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/eval_metadata.json +12 -0
  86. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/grading.json +32 -0
  87. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/response.md +1087 -0
  88. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/transcript.md +124 -0
  89. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/timing.json +1 -0
  90. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/grading.json +32 -0
  91. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/response.md +458 -0
  92. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/transcript.md +84 -0
  93. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/timing.json +1 -0
  94. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/eval_metadata.json +12 -0
  95. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/grading.json +32 -0
  96. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/response.md +70 -0
  97. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/transcript.md +148 -0
  98. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/timing.json +1 -0
  99. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/grading.json +32 -0
  100. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/response.md +249 -0
  101. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/transcript.md +80 -0
  102. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/timing.json +1 -0
  103. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/review.html +1325 -0
  104. package/frameworks/skills/sdd-tech-direction-expert/SKILL.md +223 -0
  105. package/frameworks/skills/sdd-tech-direction-expert/evals/evals.json +1 -0
  106. package/frameworks/skills/sdd-tech-direction-expert/templates/tech_direction-template.md +23 -0
  107. package/frameworks/skills/sdd-tech-spec-expert/SKILL.md +304 -0
  108. package/frameworks/skills/sdd-tech-spec-expert/evals/evals.json +199 -0
  109. package/frameworks/skills/sdd-tech-spec-expert/templates/spec_tech_template.md +290 -0
  110. package/frameworks/skills/sdd-tech-spec-expert/templates/tech_direction-template.md +23 -0
  111. package/frameworks/skills/taskcard-expert/SKILL.md +26 -78
  112. package/frameworks/skills/taskcard-expert/templates/template.md +0 -2
  113. package/package.json +1 -1
  114. package/frameworks/commands/ministack/generate-tests.md +0 -37
  115. package/frameworks/commands/sdd/generate-spec-tech.md +0 -37
  116. package/frameworks/commands/taskcard/generate-tests.md +0 -37
  117. package/frameworks/skills/ministack-expert/SKILL.md +0 -415
  118. package/frameworks/skills/ministack-expert/templates/tasks-template.md +0 -141
  119. package/frameworks/skills/ministack-qa-expert/SKILL.md +0 -273
  120. package/frameworks/skills/ministack-qa-expert/templates/task_tests_template.md +0 -24
  121. package/frameworks/skills/ministack-qa-expert/templates/test_strategy_template.md +0 -75
  122. package/frameworks/skills/sdd-qa-expert/SKILL.md +0 -284
  123. package/frameworks/skills/sdd-qa-expert/templates/task_tests_template.md +0 -24
  124. package/frameworks/skills/sdd-qa-expert/templates/test_strategy_template.md +0 -75
  125. package/frameworks/skills/sdd-spec-tech-expert/SKILL.md +0 -387
  126. package/frameworks/skills/sdd-spec-tech-expert/templates/spec_tech_template.md +0 -246
  127. package/frameworks/skills/sdd-spec-tech-expert/templates/tech_direction-template.md +0 -23
  128. package/frameworks/skills/taskcard-qa-expert/SKILL.md +0 -265
  129. package/frameworks/skills/taskcard-qa-expert/templates/task_tests_template.md +0 -78
  130. package/frameworks/templates/prompt_template.md +0 -164
@@ -0,0 +1,124 @@
1
+ # Transcript de Tools Chamadas — Eval 2 (Spec Simples) com Skill
2
+
3
+ ## 1. Leitura da Skill e Templates
4
+
5
+ ### Tool: Read
6
+ - `.claude/skills/sdd-task-plan-expert/SKILL.md` — instrucoes completas da skill
7
+ - `.claude/skills/sdd-task-plan-expert/templates/task_plan_template.md` — template do task plan
8
+ - `.claude/skills/sdd-task-plan-expert/templates/task_template.md` — template de task individual
9
+
10
+ **Motivo:** Passo obrigatorio — ler skill e templates ANTES de gerar qualquer output.
11
+
12
+ ---
13
+
14
+ ## 2. Passo 1 — Ler Rules do Projeto
15
+
16
+ ### Tool: Glob
17
+ - `.claude/rules/*.md` — listar todos os arquivos de regras
18
+
19
+ **Resultado:** 8 arquivos encontrados:
20
+ - code-conventions.md
21
+ - database.md
22
+ - fx-di.md
23
+ - grpc.md
24
+ - protobuf.md
25
+ - repository.md
26
+ - service.md
27
+ - sqlc.md
28
+
29
+ **Nota:** Todos os arquivos de rules ja estavam carregados no contexto via system-reminder (CLAUDE.md e `.claude/rules/`), portanto nao foi necessario ler cada um individualmente com Read — o conteudo ja estava disponivel.
30
+
31
+ ---
32
+
33
+ ## 3. Passo 2 — Explorar o Codebase
34
+
35
+ ### Tool: Glob (7 chamadas em paralelo)
36
+ - `internal/db/migrations/*.sql` — encontrou 2 migracoes (001, 002)
37
+ - `internal/repository/*.go` — encontrou user_repository.go e integration test
38
+ - `internal/service/*.go` — encontrou user_service.go e test
39
+ - `internal/handler/grpc/*.go` — encontrou fx.go, user_handler.go e test
40
+ - `api/proto/v1/*.proto` — encontrou user.proto
41
+ - `internal/db/queries/*.sql` — nao encontrou (path incorreto)
42
+ - `.claude/rules/*.md` — confirmou 8 arquivos
43
+
44
+ ### Tool: Read (6 chamadas em paralelo)
45
+ - `internal/db/migrations/001_create_usuarios.sql` — schema original da tabela usuarios
46
+ - `internal/db/migrations/002_add_endereco_usuarios.sql` — ALTER TABLE para endereco
47
+ - `api/proto/v1/user.proto` — definicoes proto atuais (User, CreateUserRequest, UpdateUserRequest, etc.)
48
+ - `internal/repository/user_repository.go` — struct User, interface, implementacao, toUser()
49
+ - `internal/service/user_service.go` — inputs, validacoes, erros, logica de negocio
50
+ - `internal/handler/grpc/user_handler.go` — handlers, domainUserToProto(), mapServiceError()
51
+
52
+ ### Tool: Read (4 chamadas em paralelo)
53
+ - `internal/service/user_service_test.go` — testes unitarios existentes (table-driven, mocks)
54
+ - `internal/handler/grpc/user_handler_test.go` — testes de handler existentes
55
+ - `internal/db/sqlc/sqlc.yaml` — configuracao SQLC (engine sqlite, paths)
56
+ - `internal/repository/user_repository_integration_test.go` — testes de integracao com SQLite
57
+
58
+ ### Tool: Glob (3 chamadas em paralelo)
59
+ - `**/sqlc.yaml` — encontrou internal/db/sqlc/sqlc.yaml
60
+ - `internal/db/sqlc/*` — encontrou sqlc.yaml (codigo gerado nao listado)
61
+ - `**/queries/**/*.sql` — encontrou internal/db/sqlc/queries/user.sql
62
+
63
+ ### Tool: Read (2 chamadas em paralelo)
64
+ - `internal/db/sqlc/queries/user.sql` — queries SQLC atuais (CreateUser, GetUserByID, GetUserByEmail, UpdateUser)
65
+ - `internal/handler/grpc/fx.go` — modulo FX do handler
66
+
67
+ ### Tool: Glob (2 chamadas em paralelo)
68
+ - `.claude/skills/sdd-qa-expert/SKILL.md` — confirmou existencia
69
+ - `internal/infra/grpc/server.go` — confirmou existencia
70
+
71
+ ### Tool: Read
72
+ - `internal/infra/grpc/server.go` — registro de handlers no servidor gRPC
73
+
74
+ ---
75
+
76
+ ## 4. Geracao do Output
77
+
78
+ ### Tool: Bash
79
+ - `mkdir -p` — criar diretorio de output
80
+
81
+ ### Tool: Write
82
+ - Arquivo `response.md` — task plan completo + todas as tasks individuais (T1-T6) + task_plan.md
83
+
84
+ ### Tool: Write
85
+ - Arquivo `transcript.md` — este arquivo
86
+
87
+ ---
88
+
89
+ ## Resumo de Tools
90
+
91
+ | Tool | Quantidade | Motivo |
92
+ |------|-----------|--------|
93
+ | Read | 15 | Ler skill, templates, codigo fonte, testes, configuracoes |
94
+ | Glob | 12 | Localizar arquivos no codebase |
95
+ | Bash | 1 | Criar diretorio de output |
96
+ | Write | 2 | Salvar response.md e transcript.md |
97
+ | **Total** | **30** | |
98
+
99
+ ## Tempo Estimado
100
+ - Leitura de skill/templates: 1 chamada
101
+ - Leitura de rules: ja no contexto (0 chamadas extras)
102
+ - Exploracao do codebase: ~25 chamadas (Glob + Read)
103
+ - Geracao de output: 3 chamadas (mkdir + 2 Write)
104
+
105
+ ## Observacoes sobre o Processo
106
+
107
+ 1. **Passo 1 (Rules)**: As rules ja estavam disponiveis no contexto via system-reminder, o que evitou chamadas Read extras.
108
+
109
+ 2. **Passo 2 (Codebase)**: Explorei sistematicamente todas as camadas relevantes:
110
+ - Migracoes existentes (para saber o proximo numero sequencial)
111
+ - Queries SQLC (para saber o que modificar)
112
+ - Repository (struct User, interface, mapeamento)
113
+ - Service (inputs, validacoes, erros)
114
+ - Handler (mapeamento proto<->dominio, erros)
115
+ - Proto (field numbers atuais)
116
+ - Testes existentes (para saber padroes de teste)
117
+ - Configuracao SQLC (para saber paths)
118
+ - gRPC server (para saber como handlers sao registrados)
119
+
120
+ 3. **Simulacao de interacao**: Como e uma eval, simulei as perguntas e respostas do usuario inline, conforme instruido.
121
+
122
+ 4. **Subagente QA**: Em um cenario real, a secao 6 de cada task seria delegada a um subagente QA via ferramenta Task. Nesta simulacao, preenchi diretamente com base nos padroes de teste observados no codebase.
123
+
124
+ 5. **Arquivos NAO criados em docs/**: Conforme instrucao, nao criei os arquivos reais em `docs/telefone-usuario/v1/`. Todo o output foi salvo no workspace da skill.
@@ -0,0 +1 @@
1
+ {"total_tokens": 85600, "duration_ms": 305590, "total_duration_seconds": 305.6}
@@ -0,0 +1,32 @@
1
+ {
2
+ "eval_id": 2,
3
+ "eval_name": "spec-tech-simples-alteracao-pontual",
4
+ "configuration": "without_skill",
5
+ "expectations": [
6
+ {
7
+ "text": "Gera um numero proporcional de tasks (entre 3 e 6) — nao over-engineers com tasks demais para uma alteracao simples",
8
+ "passed": false,
9
+ "evidence": "Gerou 7 tasks (TASK-1 a TASK-7). Excede o limite de 6 para uma alteracao pontual."
10
+ },
11
+ {
12
+ "text": "Respeita a ordem de dependencias das camadas (migracao > SQLC > repository > service > handler > proto)",
13
+ "passed": true,
14
+ "evidence": "Ordem: TASK-1(migracao) -> TASK-2(SQLC) -> TASK-3(repository) -> TASK-4(service) -> TASK-5(proto, paralelo) -> TASK-6(handler) -> TASK-7(testes). Dependencias corretas."
15
+ },
16
+ {
17
+ "text": "Mapeia a US-10 na tabela de rastreabilidade do task_plan",
18
+ "passed": false,
19
+ "evidence": "Nao ha tabela de rastreabilidade US -> Tasks no output. US-10 nao e mencionada em nenhuma secao de rastreabilidade formal."
20
+ },
21
+ {
22
+ "text": "Cada task segue o template completo (secoes 1-8) ou marca secoes N/A com justificativa",
23
+ "passed": false,
24
+ "evidence": "Tasks usam formato simplificado (Camada, Arquivo, Descricao, Alteracoes, Observacoes, Criterio de aceite, Dependencias). Nao seguem template de 8 secoes."
25
+ },
26
+ {
27
+ "text": "Salva task_plan.md como documento de REFERENCIA (sem corpo detalhado de tasks dentro dele)",
28
+ "passed": false,
29
+ "evidence": "Nao ha documento task_plan.md separado. Tudo esta em um unico response.md com tasks detalhadas inline."
30
+ }
31
+ ]
32
+ }
@@ -0,0 +1,458 @@
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-08 |
10
+ | **SPEC_TECH** | docs/feature-telefone-usuario/v1/spec_tech.md |
11
+ | **Total de Tasks** | 7 |
12
+ | **Estimativa Total** | ~2h |
13
+
14
+ ## 2. Resumo
15
+
16
+ Adicionar campo opcional `telefone` a tabela `usuarios` e expor via gRPC em CreateUser, UpdateUser, GetUserLogged e na mensagem User. Inclui migracao de banco, atualizacao de queries SQLC, repository, service (com validacao), handler gRPC e proto.
17
+
18
+ ---
19
+
20
+ ## 3. Tasks
21
+
22
+ ### TASK-1: Criar migracao de banco de dados
23
+
24
+ **Camada:** Database
25
+ **Arquivo a criar:**
26
+ - `internal/db/migrations/003_add_telefone_usuarios.sql`
27
+
28
+ **Descricao:**
29
+ Criar nova migracao para adicionar a coluna `telefone` (TEXT, opcional/nullable) a tabela `usuarios`.
30
+
31
+ **Conteudo:**
32
+ ```sql
33
+ ALTER TABLE usuarios ADD COLUMN telefone TEXT;
34
+ ```
35
+
36
+ **Observacoes:**
37
+ - A coluna e opcional (sem NOT NULL), conforme SPEC_TECH
38
+ - Seguir o padrao de numeracao sequencial (proxima e 003)
39
+ - NAO editar migracoes existentes (001, 002)
40
+ - Sem migracao down pois o SQLite nao suporta DROP COLUMN de forma nativa em versoes antigas
41
+
42
+ **Criterio de aceite:**
43
+ - Arquivo `003_add_telefone_usuarios.sql` criado
44
+ - Migracao executa sem erro na inicializacao da aplicacao
45
+ - Coluna `telefone` existe na tabela `usuarios` apos boot
46
+
47
+ **Dependencias:** Nenhuma
48
+
49
+ ---
50
+
51
+ ### TASK-2: Atualizar queries SQLC
52
+
53
+ **Camada:** SQLC Queries
54
+ **Arquivo a editar:**
55
+ - `internal/db/sqlc/queries/user.sql`
56
+
57
+ **Descricao:**
58
+ Atualizar as queries `CreateUser` e `UpdateUser` para incluir a coluna `telefone`.
59
+
60
+ **Alteracoes:**
61
+
62
+ Na query `CreateUser`, adicionar `telefone` na lista de colunas e valores:
63
+ ```sql
64
+ -- name: CreateUser :one
65
+ INSERT INTO usuarios (id, nome, email, senha_hash, endereco, telefone, data_criacao, data_atualizacao)
66
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
67
+ RETURNING *;
68
+ ```
69
+
70
+ Na query `UpdateUser`, adicionar `telefone` no SET:
71
+ ```sql
72
+ -- name: UpdateUser :one
73
+ UPDATE usuarios
74
+ SET nome = ?,
75
+ email = ?,
76
+ senha_hash = ?,
77
+ endereco = ?,
78
+ telefone = ?,
79
+ data_atualizacao = ?
80
+ WHERE id = ?
81
+ RETURNING *;
82
+ ```
83
+
84
+ **Observacoes:**
85
+ - As queries `GetUserByID` e `GetUserByEmail` usam `SELECT *`, entao ja retornarao o campo `telefone` automaticamente
86
+ - Apos editar, executar `make sqlc` para regenerar codigo em `internal/db/sqlc/`
87
+
88
+ **Criterio de aceite:**
89
+ - Queries atualizadas com coluna `telefone`
90
+ - `make sqlc` executa sem erros
91
+ - Codigo gerado em `internal/db/sqlc/` reflete o novo campo `Telefone`
92
+
93
+ **Dependencias:** TASK-1
94
+
95
+ ---
96
+
97
+ ### TASK-3: Atualizar Repository
98
+
99
+ **Camada:** Repository
100
+ **Arquivo a editar:**
101
+ - `internal/repository/user_repository.go`
102
+
103
+ **Descricao:**
104
+ Adicionar campo `Phone` ao modelo `User` e atualizar mapeamentos entre SQLC e dominio.
105
+
106
+ **Alteracoes:**
107
+
108
+ 1. Adicionar campo `Phone` na struct `User`:
109
+ ```go
110
+ type User struct {
111
+ ID string
112
+ Name string
113
+ Email string
114
+ PasswordHash string
115
+ Address string
116
+ Phone string // novo campo
117
+ CreatedAt time.Time
118
+ UpdatedAt time.Time
119
+ }
120
+ ```
121
+
122
+ 2. Atualizar metodo `Create` para mapear `Phone` -> `Telefone` nos params SQLC:
123
+ ```go
124
+ params := sqlc.CreateUserParams{
125
+ ID: user.ID,
126
+ Nome: user.Name,
127
+ Email: user.Email,
128
+ SenhaHash: user.PasswordHash,
129
+ Endereco: user.Address,
130
+ Telefone: sql.NullString{String: user.Phone, Valid: user.Phone != ""},
131
+ DataCriacao: user.CreatedAt,
132
+ DataAtualizacao: user.UpdatedAt,
133
+ }
134
+ ```
135
+
136
+ 3. Atualizar metodo `Update` da mesma forma, adicionando `Telefone` nos params.
137
+
138
+ 4. Atualizar funcao `toUser` para mapear `Telefone` -> `Phone`:
139
+ ```go
140
+ func toUser(u sqlc.Usuario) *User {
141
+ return &User{
142
+ ID: u.ID,
143
+ Name: u.Nome,
144
+ Email: u.Email,
145
+ PasswordHash: u.SenhaHash,
146
+ Address: u.Endereco,
147
+ Phone: u.Telefone.String, // NullString -> string
148
+ CreatedAt: u.DataCriacao,
149
+ UpdatedAt: u.DataAtualizacao,
150
+ }
151
+ }
152
+ ```
153
+
154
+ **Observacoes:**
155
+ - O tipo SQLC gerado para `telefone` sera `sql.NullString` pois a coluna e nullable
156
+ - Verificar o tipo exato apos `make sqlc` e ajustar o mapeamento se necessario
157
+
158
+ **Criterio de aceite:**
159
+ - Struct `User` possui campo `Phone string`
160
+ - Create e Update mapeiam `Phone` corretamente para `Telefone` do SQLC
161
+ - `toUser` mapeia `Telefone` de volta para `Phone`
162
+ - Compilacao sem erros
163
+
164
+ **Dependencias:** TASK-2
165
+
166
+ ---
167
+
168
+ ### TASK-4: Atualizar Service
169
+
170
+ **Camada:** Service
171
+ **Arquivo a editar:**
172
+ - `internal/service/user_service.go`
173
+
174
+ **Descricao:**
175
+ Adicionar campo `Phone` nos inputs e incluir validacao de tamanho (10-15 caracteres quando informado).
176
+
177
+ **Alteracoes:**
178
+
179
+ 1. Adicionar nova variavel de erro:
180
+ ```go
181
+ ErrInvalidPhone = errors.New("telefone deve ter entre 10 e 15 caracteres")
182
+ ```
183
+
184
+ 2. Adicionar campo `Phone` em `CreateUserInput`:
185
+ ```go
186
+ type CreateUserInput struct {
187
+ Name string
188
+ Email string
189
+ Password string
190
+ Address string
191
+ Phone string // novo, opcional
192
+ }
193
+ ```
194
+
195
+ 3. Adicionar campo `Phone` em `UpdateUserInput`:
196
+ ```go
197
+ type UpdateUserInput struct {
198
+ Name *string
199
+ Email *string
200
+ Address *string
201
+ Phone *string // novo, opcional
202
+ NewPassword *string
203
+ CurrentPassword *string
204
+ }
205
+ ```
206
+
207
+ 4. Em `CreateUser`, adicionar validacao antes de criar o usuario:
208
+ ```go
209
+ if input.Phone != "" {
210
+ if len(input.Phone) < 10 || len(input.Phone) > 15 {
211
+ return nil, ErrInvalidPhone
212
+ }
213
+ }
214
+ ```
215
+ E incluir `Phone: input.Phone` ao criar `repository.User`.
216
+
217
+ 5. Em `UpdateUser`:
218
+ - Adicionar `input.Phone` na verificacao de "nenhum campo" (linha 171)
219
+ - Adicionar bloco para processar phone:
220
+ ```go
221
+ if input.Phone != nil {
222
+ if *input.Phone != "" && (len(*input.Phone) < 10 || len(*input.Phone) > 15) {
223
+ return nil, ErrInvalidPhone
224
+ }
225
+ currentUser.Phone = *input.Phone
226
+ }
227
+ ```
228
+
229
+ **Criterio de aceite:**
230
+ - `CreateUserInput` e `UpdateUserInput` possuem campo Phone
231
+ - Validacao de telefone (10-15 chars) funciona para CreateUser e UpdateUser
232
+ - Telefone vazio e aceito (campo opcional)
233
+ - `ErrInvalidPhone` definido e exportado
234
+
235
+ **Dependencias:** TASK-3
236
+
237
+ ---
238
+
239
+ ### TASK-5: Atualizar Proto (user.proto)
240
+
241
+ **Camada:** Proto/gRPC
242
+ **Arquivo a editar:**
243
+ - `api/proto/v1/user.proto`
244
+
245
+ **Descricao:**
246
+ Adicionar campo `phone` nas mensagens proto relevantes.
247
+
248
+ **Alteracoes:**
249
+
250
+ 1. Mensagem `User` — adicionar campo `phone` (field number 7):
251
+ ```proto
252
+ message User {
253
+ string id = 1;
254
+ string name = 2;
255
+ string email = 3;
256
+ string address = 4;
257
+ string created_at = 5;
258
+ string updated_at = 6;
259
+ string phone = 7;
260
+ }
261
+ ```
262
+
263
+ 2. Mensagem `CreateUserRequest` — adicionar campo `phone` (field number 5):
264
+ ```proto
265
+ message CreateUserRequest {
266
+ string name = 1;
267
+ string email = 2;
268
+ string password = 3;
269
+ string address = 4;
270
+ string phone = 5;
271
+ }
272
+ ```
273
+
274
+ 3. Mensagem `UpdateUserRequest` — adicionar campo `phone` (field number 6):
275
+ ```proto
276
+ message UpdateUserRequest {
277
+ optional string name = 1;
278
+ optional string email = 2;
279
+ optional string address = 3;
280
+ optional string new_password = 4;
281
+ optional string current_password = 5;
282
+ optional string phone = 6;
283
+ }
284
+ ```
285
+
286
+ **Observacoes:**
287
+ - Apos editar, executar `make proto` (ou `buf generate`) para regenerar codigo em `gen/`
288
+ - NAO editar arquivos em `gen/` manualmente
289
+ - `CreateUserResponse` e `LoginResponse` NAO precisam do campo phone (seguem o formato atual que retorna campos selecionados)
290
+
291
+ **Criterio de aceite:**
292
+ - `user.proto` atualizado com campo `phone` nas 3 mensagens
293
+ - `make proto` executa sem erros
294
+ - Codigo gerado em `gen/` reflete os novos campos
295
+
296
+ **Dependencias:** Nenhuma (pode ser feita em paralelo com TASK-1 a TASK-4)
297
+
298
+ ---
299
+
300
+ ### TASK-6: Atualizar Handler gRPC
301
+
302
+ **Camada:** Handler
303
+ **Arquivo a editar:**
304
+ - `internal/handler/grpc/user_handler.go`
305
+
306
+ **Descricao:**
307
+ Atualizar os handlers para passar o campo `phone` entre proto e service, e incluir na conversao dominio->proto.
308
+
309
+ **Alteracoes:**
310
+
311
+ 1. Em `CreateUser`, adicionar `Phone` ao input:
312
+ ```go
313
+ user, err := h.userService.CreateUser(ctx, service.CreateUserInput{
314
+ Name: req.GetName(),
315
+ Email: req.GetEmail(),
316
+ Password: req.GetPassword(),
317
+ Address: req.GetAddress(),
318
+ Phone: req.GetPhone(),
319
+ })
320
+ ```
321
+
322
+ 2. Em `UpdateUser`, adicionar bloco para phone:
323
+ ```go
324
+ if req.Phone != nil {
325
+ input.Phone = req.Phone
326
+ }
327
+ ```
328
+
329
+ 3. Em `domainUserToProto`, adicionar mapeamento de `Phone`:
330
+ ```go
331
+ func domainUserToProto(user *repository.User) *pb.User {
332
+ return &pb.User{
333
+ Id: user.ID,
334
+ Name: user.Name,
335
+ Email: user.Email,
336
+ Address: user.Address,
337
+ Phone: user.Phone,
338
+ CreatedAt: user.CreatedAt.Format(time.RFC3339),
339
+ UpdatedAt: user.UpdatedAt.Format(time.RFC3339),
340
+ }
341
+ }
342
+ ```
343
+
344
+ 4. Em `mapServiceError`, adicionar mapeamento para `ErrInvalidPhone`:
345
+ ```go
346
+ case errors.Is(err, service.ErrInvalidPhone):
347
+ return status.Errorf(codes.InvalidArgument, "%v", err)
348
+ ```
349
+
350
+ **Criterio de aceite:**
351
+ - CreateUser passa `Phone` do request para o service
352
+ - UpdateUser passa `Phone` do request para o service
353
+ - `domainUserToProto` inclui `Phone`
354
+ - `mapServiceError` trata `ErrInvalidPhone`
355
+ - Compilacao sem erros
356
+
357
+ **Dependencias:** TASK-4, TASK-5
358
+
359
+ ---
360
+
361
+ ### TASK-7: Atualizar Testes
362
+
363
+ **Camada:** Testes
364
+ **Arquivos a editar:**
365
+ - `internal/service/user_service_test.go`
366
+ - `internal/handler/grpc/user_handler_test.go`
367
+
368
+ **Descricao:**
369
+ Adicionar testes para o novo campo `phone` e atualizar testes existentes que precisam refletir a presenca do campo.
370
+
371
+ **Alteracoes em `user_service_test.go`:**
372
+
373
+ 1. Adicionar teste `TestCreateUser_WithPhone_Success` — cria usuario com telefone valido
374
+ 2. Adicionar teste `TestCreateUser_PhoneTooShort` — telefone com menos de 10 caracteres deve retornar `ErrInvalidPhone`
375
+ 3. Adicionar teste `TestCreateUser_PhoneTooLong` — telefone com mais de 15 caracteres deve retornar `ErrInvalidPhone`
376
+ 4. Adicionar teste `TestCreateUser_PhoneEmpty_Success` — telefone vazio e aceito (opcional)
377
+ 5. Adicionar teste `TestUpdateUser_PhoneOnly` — atualiza somente telefone
378
+ 6. Adicionar teste `TestUpdateUser_PhoneInvalid` — telefone invalido no update retorna `ErrInvalidPhone`
379
+ 7. Adicionar caso `"telefone invalido"` na table-driven `TestCreateUser_ValidationTableDriven`
380
+
381
+ **Alteracoes em `user_handler_test.go`:**
382
+
383
+ 1. Adicionar teste `TestUserHandler_CreateUser_WithPhone` — verifica passagem do phone do proto para o service
384
+ 2. Adicionar teste `TestUserHandler_UpdateUser_PhoneOnly` — verifica atualizacao de phone
385
+ 3. Atualizar `TestDomainUserToProto` para incluir e validar campo `Phone`
386
+ 4. Adicionar `ErrInvalidPhone` ao `TestMapServiceError_AllErrors` com codigo `InvalidArgument`
387
+ 5. Atualizar testes existentes que criam `repository.User` para incluir campo `Phone` onde relevante (evitar warnings de campos faltantes)
388
+
389
+ **Criterio de aceite:**
390
+ - Todos os testes novos passam
391
+ - Testes existentes continuam passando
392
+ - Cobertura de: phone valido, phone vazio (opcional), phone curto demais, phone longo demais
393
+ - `make test` passa sem erros
394
+
395
+ **Dependencias:** TASK-4, TASK-6
396
+
397
+ ---
398
+
399
+ ## 4. Ordem de Execucao
400
+
401
+ ```
402
+ TASK-1 (migracao) ──> TASK-2 (sqlc queries) ──> TASK-3 (repository) ──> TASK-4 (service) ──┐
403
+ ├──> TASK-6 (handler) ──> TASK-7 (testes)
404
+ TASK-5 (proto) ─────────────────────────────────────────────────────────────────────────────┘
405
+ ```
406
+
407
+ **Caminho critico:** TASK-1 -> TASK-2 -> TASK-3 -> TASK-4 -> TASK-6 -> TASK-7
408
+
409
+ **Paralelismo possivel:** TASK-5 pode ser executada em paralelo com TASK-1 a TASK-4.
410
+
411
+ ---
412
+
413
+ ## 5. Comandos de Geracao/Verificacao
414
+
415
+ Apos as alteracoes, executar na seguinte ordem:
416
+
417
+ ```bash
418
+ # 1. Gerar codigo proto (apos TASK-5)
419
+ make proto
420
+
421
+ # 2. Gerar codigo SQLC (apos TASK-2)
422
+ make sqlc
423
+
424
+ # 3. Compilar para verificar erros
425
+ make build
426
+
427
+ # 4. Rodar todos os testes
428
+ make test
429
+
430
+ # 5. Lint dos protobufs
431
+ make lint
432
+ ```
433
+
434
+ ---
435
+
436
+ ## 6. Arquivos Impactados (Resumo)
437
+
438
+ | Arquivo | Acao |
439
+ |---------|------|
440
+ | `internal/db/migrations/003_add_telefone_usuarios.sql` | Criar |
441
+ | `internal/db/sqlc/queries/user.sql` | Editar |
442
+ | `internal/db/sqlc/` (gerado) | Regenerar via `make sqlc` |
443
+ | `api/proto/v1/user.proto` | Editar |
444
+ | `gen/proto/v1/` (gerado) | Regenerar via `make proto` |
445
+ | `internal/repository/user_repository.go` | Editar |
446
+ | `internal/service/user_service.go` | Editar |
447
+ | `internal/handler/grpc/user_handler.go` | Editar |
448
+ | `internal/service/user_service_test.go` | Editar |
449
+ | `internal/handler/grpc/user_handler_test.go` | Editar |
450
+
451
+ ---
452
+
453
+ ## 7. Riscos e Observacoes
454
+
455
+ 1. **Tipo SQLC para coluna nullable:** A coluna `telefone` e nullable (sem NOT NULL), entao o SQLC gerara `sql.NullString`. O mapeamento no repository precisa tratar isso corretamente (NullString <-> string).
456
+ 2. **Migracao automatica:** A migracao executa no boot da aplicacao. Verificar que o numero sequencial 003 esta correto e nao conflita com outras migracoes em desenvolvimento.
457
+ 3. **Compatibilidade retroativa do proto:** Adicionar campos com novos field numbers (7, 5, 6) e retrocompativel com clientes existentes. Clientes antigos simplesmente ignorarao o campo `phone`.
458
+ 4. **Testes de integracao:** O arquivo `internal/e2e/user_e2e_test.go` pode precisar de atualizacao, mas nao foi incluido no escopo da SPEC_TECH. Avaliar se e necessario.
@@ -0,0 +1,84 @@
1
+ # Transcript — Task Plan Generation (without_skill)
2
+
3
+ ## Ferramentas Utilizadas
4
+
5
+ ### 1. Bash — Listar migracoes existentes
6
+ ```
7
+ ls "H:/repos/flutter_experience/04_2026/cb_vakinhaburger_2025/vakinha-api-review/internal/db/migrations/"
8
+ ```
9
+ **Resultado:** `001_create_usuarios.sql`, `002_add_endereco_usuarios.sql`
10
+
11
+ ### 2. Bash — Listar queries SQLC
12
+ ```
13
+ ls "H:/repos/flutter_experience/04_2026/cb_vakinhaburger_2025/vakinha-api-review/internal/db/queries/"
14
+ ```
15
+ **Resultado:** Diretorio nao existe nesse caminho (queries estao em `internal/db/sqlc/queries/`)
16
+
17
+ ### 3. Bash — Listar arquivos repository, service, handler, proto
18
+ ```
19
+ ls para cada diretorio
20
+ ```
21
+ **Resultado (parcial, outros cancelados por erro no queries):**
22
+ - `api/proto/v1/`: `user.proto`
23
+ - `internal/repository/`: `user_repository.go`, `user_repository_integration_test.go`
24
+ - `internal/service/`: `user_service.go`, `user_service_test.go`
25
+ - `internal/handler/grpc/`: `fx.go`, `user_handler.go`, `user_handler_test.go`
26
+
27
+ ### 4. Bash — Encontrar todos os arquivos Go e SQL no internal
28
+ ```
29
+ find "H:/repos/.../internal" -type f -name "*.go" -o -name "*.sql" | head -60
30
+ ```
31
+ **Resultado:** Lista completa de 24 arquivos no projeto.
32
+
33
+ ### 5. Read — Migracao 001
34
+ **Arquivo:** `internal/db/migrations/001_create_usuarios.sql`
35
+ **Conteudo:** CREATE TABLE usuarios com colunas id, nome, email, senha_hash, data_criacao, data_atualizacao.
36
+
37
+ ### 6. Read — Migracao 002
38
+ **Arquivo:** `internal/db/migrations/002_add_endereco_usuarios.sql`
39
+ **Conteudo:** `ALTER TABLE usuarios ADD COLUMN endereco TEXT NOT NULL DEFAULT '';`
40
+
41
+ ### 7. Read — Queries SQLC
42
+ **Arquivo:** `internal/db/sqlc/queries/user.sql`
43
+ **Conteudo:** 4 queries: CreateUser, GetUserByID, GetUserByEmail, UpdateUser. Todas com colunas em portugues.
44
+
45
+ ### 8. Read — Repository
46
+ **Arquivo:** `internal/repository/user_repository.go`
47
+ **Conteudo:** Struct User (ID, Name, Email, PasswordHash, Address, CreatedAt, UpdatedAt), interface UserRepository, implementacao sqlcUserRepository, funcao toUser para mapeamento.
48
+
49
+ ### 9. Read — Service
50
+ **Arquivo:** `internal/service/user_service.go`
51
+ **Conteudo:** CreateUserInput, UpdateUserInput (com campos opcionais via ponteiro), UserService interface, implementacao com validacoes, login, JWT, etc.
52
+
53
+ ### 10. Read — Handler gRPC
54
+ **Arquivo:** `internal/handler/grpc/user_handler.go`
55
+ **Conteudo:** UserHandler com CreateUser, Login, GetUserLogged, UpdateUser. Funcoes auxiliares domainUserToProto e mapServiceError.
56
+
57
+ ### 11. Read — Proto
58
+ **Arquivo:** `api/proto/v1/user.proto`
59
+ **Conteudo:** Mensagens User, CreateUserRequest/Response, LoginRequest/Response, GetUserLoggedRequest/Response, UpdateUserRequest/Response, servico UserService.
60
+
61
+ ### 12. Read — Service Tests
62
+ **Arquivo:** `internal/service/user_service_test.go`
63
+ **Conteudo:** MockUserRepository, testes table-driven e individuais para CreateUser, Login, GetUserLogged, UpdateUser. Padrao testify/mock.
64
+
65
+ ### 13. Read — Handler Tests
66
+ **Arquivo:** `internal/handler/grpc/user_handler_test.go`
67
+ **Conteudo:** MockUserService, testes para todos os handlers, TestMapServiceError_AllErrors, TestDomainUserToProto.
68
+
69
+ ### 14. Glob — Encontrar sqlc.yaml
70
+ ```
71
+ pattern: **/sqlc.yaml
72
+ ```
73
+ **Resultado:** `internal/db/sqlc/sqlc.yaml`
74
+
75
+ ### 15. Bash — Criar diretorio de output
76
+ ```
77
+ mkdir -p ".../without_skill/outputs"
78
+ ```
79
+
80
+ ### 16. Write — response.md
81
+ Gerado o Task Plan completo com 7 tasks.
82
+
83
+ ### 17. Write — transcript.md
84
+ Este arquivo.