@luanpdd/kit-mcp 1.30.2 → 1.31.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.
- package/LICENSE +21 -21
- package/README.md +168 -168
- package/gates/agent-no-recursive-dispatch.md +84 -82
- package/kit/COMANDOS.md +138 -138
- package/kit/README.md +76 -76
- package/kit/agents/advisor-researcher.md +107 -106
- package/kit/agents/ai-mutation-tester.md +1 -0
- package/kit/agents/assumptions-analyzer.md +108 -107
- package/kit/agents/audit-log-implementer.md +314 -313
- package/kit/agents/auditor-consistencia-isolamento.md +414 -413
- package/kit/agents/b2b-saas-architect.md +157 -156
- package/kit/agents/burn-rate-forecaster.md +1 -0
- package/kit/agents/cascading-failures-auditor.md +299 -298
- package/kit/agents/codebase-mapper.md +769 -768
- package/kit/agents/crm-pipeline-implementer.md +257 -256
- package/kit/agents/debugger.md +814 -813
- package/kit/agents/detector-tenant-quente.md +338 -337
- package/kit/agents/evolution-go-integrator.md +201 -200
- package/kit/agents/example-reviewer.md +22 -21
- package/kit/agents/executor.md +565 -564
- package/kit/agents/golden-signals-instrumenter.md +1 -0
- package/kit/agents/incident-investigator.md +1 -0
- package/kit/agents/integration-checker.md +201 -200
- package/kit/agents/invite-flow-implementer.md +190 -189
- package/kit/agents/legacy-characterizer.md +369 -368
- package/kit/agents/lgpd-compliance-auditor.md +296 -295
- package/kit/agents/load-shedding-instrumenter.md +1 -0
- package/kit/agents/multi-tenant-isolation-auditor.md +254 -253
- package/kit/agents/multi-tenant-rls-writer.md +341 -340
- package/kit/agents/nyquist-auditor.md +179 -178
- package/kit/agents/observability-coverage-auditor.md +316 -315
- package/kit/agents/observability-instrumenter.md +1 -0
- package/kit/agents/omm-auditor.md +1 -0
- package/kit/agents/org-onboarding-implementer.md +224 -223
- package/kit/agents/payload-capture-instrumenter.md +274 -273
- package/kit/agents/phase-researcher.md +697 -696
- package/kit/agents/plan-checker.md +273 -272
- package/kit/agents/planner.md +923 -922
- package/kit/agents/postmortem-writer.md +1 -0
- package/kit/agents/project-researcher.md +653 -652
- package/kit/agents/prr-conductor.md +1 -0
- package/kit/agents/refactor-safety-auditor.md +405 -404
- package/kit/agents/release-pipeline-auditor.md +1 -0
- package/kit/agents/research-synthesizer.md +246 -245
- package/kit/agents/roadmapper.md +678 -677
- package/kit/agents/schema-checker.md +1 -0
- package/kit/agents/seam-finder.md +360 -359
- package/kit/agents/shotgun-surgery-detector.md +350 -349
- package/kit/agents/slo-engineer.md +1 -0
- package/kit/agents/storytelling-analyst.md +1 -0
- package/kit/agents/supabase-architect.md +1 -0
- package/kit/agents/supabase-auth-bootstrapper.md +1 -0
- package/kit/agents/supabase-branching-architect.md +563 -562
- package/kit/agents/supabase-cicd-pipeline-implementer.md +778 -777
- package/kit/agents/supabase-column-privileges-writer.md +400 -399
- package/kit/agents/supabase-edge-fn-tester.md +2 -1
- package/kit/agents/supabase-edge-fn-writer.md +2 -1
- package/kit/agents/supabase-migration-writer.md +386 -385
- package/kit/agents/supabase-rbac-implementer.md +393 -392
- package/kit/agents/supabase-realtime-implementer.md +364 -363
- package/kit/agents/supabase-rls-hardener.md +522 -521
- package/kit/agents/supabase-rls-writer.md +324 -323
- package/kit/agents/supabase-roles-implementer.md +356 -355
- package/kit/agents/supabase-storage-implementer.md +1 -0
- package/kit/agents/super-admin-implementer.md +282 -281
- package/kit/agents/toil-auditor.md +1 -0
- package/kit/agents/ui-auditor.md +438 -437
- package/kit/agents/ui-checker.md +303 -302
- package/kit/agents/ui-researcher.md +356 -355
- package/kit/agents/user-profiler.md +176 -175
- package/kit/agents/validador-evolucao-schema.md +336 -335
- package/kit/agents/verifier.md +729 -728
- package/kit/commands/adicionar-backlog.md +75 -75
- package/kit/commands/adicionar-fase.md +42 -42
- package/kit/commands/adicionar-tarefa.md +45 -45
- package/kit/commands/adicionar-testes.md +41 -41
- package/kit/commands/ajuda.md +21 -21
- package/kit/commands/atualizar.md +37 -37
- package/kit/commands/auditar-cascading.md +111 -111
- package/kit/commands/auditar-marco.md +179 -179
- package/kit/commands/auditar-observabilidade-cobertura.md +183 -183
- package/kit/commands/auditar-refactor.md +219 -219
- package/kit/commands/auditar-release.md +109 -109
- package/kit/commands/auditar-uat.md +23 -23
- package/kit/commands/autonomo.md +40 -40
- package/kit/commands/branch-pr.md +24 -24
- package/kit/commands/burn-rate-status.md +408 -408
- package/kit/commands/capturar-payloads.md +193 -193
- package/kit/commands/caracterizar.md +212 -212
- package/kit/commands/concluir-marco.md +247 -247
- package/kit/commands/configuracoes.md +36 -36
- package/kit/commands/dados-distribuidos.md +188 -188
- package/kit/commands/definir-perfil.md +10 -10
- package/kit/commands/depurar.md +190 -190
- package/kit/commands/detectar-duplicacao.md +197 -197
- package/kit/commands/discutir-fase.md +131 -131
- package/kit/commands/encontrar-seams.md +136 -136
- package/kit/commands/entrar-discord.md +17 -17
- package/kit/commands/estatisticas.md +18 -18
- package/kit/commands/example-greeting.md +33 -33
- package/kit/commands/executar-fase.md +58 -58
- package/kit/commands/expresso.md +56 -56
- package/kit/commands/fase-ui.md +34 -34
- package/kit/commands/fazer.md +57 -57
- package/kit/commands/fio.md +125 -125
- package/kit/commands/fluxos-trabalho.md +64 -64
- package/kit/commands/forense.md +176 -176
- package/kit/commands/gerenciador.md +38 -38
- package/kit/commands/inserir-fase.md +31 -31
- package/kit/commands/legacy.md +263 -263
- package/kit/commands/limpeza.md +17 -17
- package/kit/commands/listar-hipoteses-fase.md +45 -45
- package/kit/commands/listar-workspaces.md +18 -18
- package/kit/commands/load-shedding.md +117 -117
- package/kit/commands/mapear-codebase.md +70 -70
- package/kit/commands/multi-tenant.md +163 -163
- package/kit/commands/nota.md +33 -33
- package/kit/commands/novo-marco.md +43 -43
- package/kit/commands/novo-projeto.md +41 -41
- package/kit/commands/novo-workspace.md +43 -43
- package/kit/commands/pausar-trabalho.md +37 -37
- package/kit/commands/perfil-usuario.md +45 -45
- package/kit/commands/pesquisar-fase.md +195 -195
- package/kit/commands/planejar-fase.md +67 -67
- package/kit/commands/planejar-lacunas.md +33 -33
- package/kit/commands/plantar-ideia.md +25 -25
- package/kit/commands/progresso.md +24 -24
- package/kit/commands/proximo.md +30 -30
- package/kit/commands/publicar.md +490 -490
- package/kit/commands/rapido.md +35 -35
- package/kit/commands/reaplicar-patches.md +124 -124
- package/kit/commands/refactor-seguro.md +321 -321
- package/kit/commands/relatorio-sessao.md +19 -19
- package/kit/commands/remover-fase.md +31 -31
- package/kit/commands/remover-workspace.md +26 -26
- package/kit/commands/resumo-marco.md +50 -50
- package/kit/commands/retomar-trabalho.md +40 -40
- package/kit/commands/revisar-backlog.md +60 -60
- package/kit/commands/revisar-ui.md +32 -32
- package/kit/commands/revisar.md +37 -37
- package/kit/commands/saude.md +21 -21
- package/kit/commands/setup-notion.md +93 -93
- package/kit/commands/storytelling.md +179 -179
- package/kit/commands/sync-main.md +68 -68
- package/kit/commands/validar-fase.md +35 -35
- package/kit/commands/verificar-tarefas.md +44 -44
- package/kit/commands/verificar-trabalho.md +64 -64
- package/kit/file-manifest.json +82 -81
- package/kit/framework/bin/lib/commands.cjs +959 -959
- package/kit/framework/bin/lib/config.cjs +442 -442
- package/kit/framework/bin/lib/core.cjs +1230 -1230
- package/kit/framework/bin/lib/frontmatter.cjs +336 -336
- package/kit/framework/bin/lib/init.cjs +1442 -1442
- package/kit/framework/bin/lib/milestone.cjs +252 -252
- package/kit/framework/bin/lib/model-profiles.cjs +68 -68
- package/kit/framework/bin/lib/phase.cjs +888 -888
- package/kit/framework/bin/lib/profile-output.cjs +952 -952
- package/kit/framework/bin/lib/profile-pipeline.cjs +539 -539
- package/kit/framework/bin/lib/roadmap.cjs +329 -329
- package/kit/framework/bin/lib/security.cjs +382 -382
- package/kit/framework/bin/lib/state.cjs +1031 -1031
- package/kit/framework/bin/lib/template.cjs +222 -222
- package/kit/framework/bin/lib/uat.cjs +282 -282
- package/kit/framework/bin/lib/verify.cjs +888 -888
- package/kit/framework/bin/lib/workstream.cjs +491 -491
- package/kit/framework/bin/tools.cjs +918 -918
- package/kit/framework/commands/workstreams.md +63 -63
- package/kit/framework/references/checkpoints.md +778 -778
- package/kit/framework/references/continuation-format.md +249 -249
- package/kit/framework/references/decimal-phase-calculation.md +64 -64
- package/kit/framework/references/git-integration.md +295 -295
- package/kit/framework/references/git-planning-commit.md +38 -38
- package/kit/framework/references/model-profile-resolution.md +36 -36
- package/kit/framework/references/model-profiles.md +139 -139
- package/kit/framework/references/phase-argument-parsing.md +61 -61
- package/kit/framework/references/planning-config.md +202 -202
- package/kit/framework/references/questioning.md +162 -162
- package/kit/framework/references/tdd.md +263 -263
- package/kit/framework/references/ui-brand.md +160 -160
- package/kit/framework/references/user-profiling.md +657 -657
- package/kit/framework/references/verification-patterns.md +612 -612
- package/kit/framework/references/workstream-flag.md +58 -58
- package/kit/framework/templates/DEBUG.md +164 -164
- package/kit/framework/templates/UAT.md +265 -265
- package/kit/framework/templates/UI-SPEC.md +100 -100
- package/kit/framework/templates/VALIDATION.md +76 -76
- package/kit/framework/templates/claude-md.md +122 -122
- package/kit/framework/templates/codebase/architecture.md +185 -185
- package/kit/framework/templates/codebase/concerns.md +205 -205
- package/kit/framework/templates/codebase/conventions.md +204 -204
- package/kit/framework/templates/codebase/integrations.md +192 -192
- package/kit/framework/templates/codebase/stack.md +158 -158
- package/kit/framework/templates/codebase/structure.md +199 -199
- package/kit/framework/templates/codebase/testing.md +301 -301
- package/kit/framework/templates/config.json +44 -44
- package/kit/framework/templates/context.md +352 -352
- package/kit/framework/templates/continue-here.md +78 -78
- package/kit/framework/templates/copilot-instructions.md +7 -7
- package/kit/framework/templates/debug-subagent-prompt.md +91 -91
- package/kit/framework/templates/dev-preferences.md +20 -20
- package/kit/framework/templates/discovery.md +146 -146
- package/kit/framework/templates/discussion-log.md +63 -63
- package/kit/framework/templates/milestone-archive.md +123 -123
- package/kit/framework/templates/milestone.md +115 -115
- package/kit/framework/templates/phase-prompt.md +610 -610
- package/kit/framework/templates/planner-subagent-prompt.md +117 -117
- package/kit/framework/templates/project.md +186 -186
- package/kit/framework/templates/requirements.md +231 -231
- package/kit/framework/templates/research-project/ARCHITECTURE.md +204 -204
- package/kit/framework/templates/research-project/FEATURES.md +147 -147
- package/kit/framework/templates/research-project/PITFALLS.md +200 -200
- package/kit/framework/templates/research-project/STACK.md +120 -120
- package/kit/framework/templates/research-project/SUMMARY.md +170 -170
- package/kit/framework/templates/research.md +419 -419
- package/kit/framework/templates/retrospective.md +54 -54
- package/kit/framework/templates/roadmap.md +202 -202
- package/kit/framework/templates/state.md +176 -176
- package/kit/framework/templates/summary-complex.md +59 -59
- package/kit/framework/templates/summary-minimal.md +41 -41
- package/kit/framework/templates/summary-standard.md +48 -48
- package/kit/framework/templates/summary.md +209 -209
- package/kit/framework/templates/user-profile.md +146 -146
- package/kit/framework/templates/user-setup.md +256 -256
- package/kit/framework/templates/verification-report.md +258 -258
- package/kit/framework/workflows/add-phase.md +112 -112
- package/kit/framework/workflows/add-tests.md +351 -351
- package/kit/framework/workflows/add-todo.md +158 -158
- package/kit/framework/workflows/audit-milestone.md +340 -340
- package/kit/framework/workflows/audit-uat.md +109 -109
- package/kit/framework/workflows/autonomous.md +891 -891
- package/kit/framework/workflows/check-todos.md +177 -177
- package/kit/framework/workflows/cleanup.md +152 -152
- package/kit/framework/workflows/complete-milestone.md +696 -696
- package/kit/framework/workflows/diagnose-issues.md +231 -231
- package/kit/framework/workflows/discovery-phase.md +289 -289
- package/kit/framework/workflows/discuss-phase-assumptions.md +653 -653
- package/kit/framework/workflows/discuss-phase.md +784 -784
- package/kit/framework/workflows/do.md +104 -104
- package/kit/framework/workflows/execute-phase.md +838 -838
- package/kit/framework/workflows/execute-plan.md +510 -510
- package/kit/framework/workflows/fast.md +102 -102
- package/kit/framework/workflows/forensics.md +265 -265
- package/kit/framework/workflows/health.md +181 -181
- package/kit/framework/workflows/help.md +619 -619
- package/kit/framework/workflows/insert-phase.md +130 -130
- package/kit/framework/workflows/list-phase-assumptions.md +178 -178
- package/kit/framework/workflows/list-workspaces.md +56 -56
- package/kit/framework/workflows/manager.md +362 -362
- package/kit/framework/workflows/map-codebase.md +377 -377
- package/kit/framework/workflows/milestone-summary.md +223 -223
- package/kit/framework/workflows/new-milestone.md +486 -486
- package/kit/framework/workflows/new-project.md +1159 -1159
- package/kit/framework/workflows/new-workspace.md +237 -237
- package/kit/framework/workflows/next.md +97 -97
- package/kit/framework/workflows/node-repair.md +92 -92
- package/kit/framework/workflows/note.md +156 -156
- package/kit/framework/workflows/pause-work.md +176 -176
- package/kit/framework/workflows/plan-milestone-gaps.md +273 -273
- package/kit/framework/workflows/plan-phase.md +765 -765
- package/kit/framework/workflows/plant-seed.md +169 -169
- package/kit/framework/workflows/pr-branch.md +129 -129
- package/kit/framework/workflows/profile-user.md +450 -450
- package/kit/framework/workflows/progress.md +507 -507
- package/kit/framework/workflows/quick.md +757 -757
- package/kit/framework/workflows/remove-phase.md +155 -155
- package/kit/framework/workflows/remove-workspace.md +90 -90
- package/kit/framework/workflows/research-phase.md +82 -82
- package/kit/framework/workflows/resume-project.md +326 -326
- package/kit/framework/workflows/review.md +228 -228
- package/kit/framework/workflows/session-report.md +146 -146
- package/kit/framework/workflows/settings.md +283 -283
- package/kit/framework/workflows/ship.md +228 -228
- package/kit/framework/workflows/stats.md +60 -60
- package/kit/framework/workflows/transition.md +671 -671
- package/kit/framework/workflows/ui-phase.md +302 -302
- package/kit/framework/workflows/ui-review.md +165 -165
- package/kit/framework/workflows/update.md +323 -323
- package/kit/framework/workflows/validate-phase.md +174 -174
- package/kit/framework/workflows/verify-phase.md +252 -252
- package/kit/framework/workflows/verify-work.md +637 -637
- package/kit/hooks/check-update.js +118 -118
- package/kit/hooks/context-monitor.js +163 -163
- package/kit/hooks/kit-attribution-reminder.cjs +29 -50
- package/kit/hooks/kit-router.cjs +137 -0
- package/kit/hooks/prompt-guard.js +103 -103
- package/kit/hooks/statusline.js +125 -125
- package/kit/hooks/workflow-guard.js +101 -101
- package/kit/settings.json +45 -45
- package/kit/skills/ai-prompt-characterization/SKILL.md +335 -335
- package/kit/skills/armadilhas-sistemas-distribuidos/SKILL.md +447 -447
- package/kit/skills/audit-log-multi-tenant/SKILL.md +340 -340
- package/kit/skills/b2b-saas-architecture/SKILL.md +300 -300
- package/kit/skills/consistencia-leitura-replica/SKILL.md +385 -385
- package/kit/skills/crm-lead-pipeline-patterns/SKILL.md +343 -343
- package/kit/skills/escolha-modelo-consistencia/SKILL.md +494 -494
- package/kit/skills/evolucao-schema-compativel/SKILL.md +448 -448
- package/kit/skills/evolution-go-whatsapp-integration/SKILL.md +322 -322
- package/kit/skills/example-skill/SKILL.md +42 -42
- package/kit/skills/legacy-api-only-applications/SKILL.md +358 -358
- package/kit/skills/legacy-characterization-tests/SKILL.md +330 -330
- package/kit/skills/legacy-effect-analysis/SKILL.md +331 -331
- package/kit/skills/legacy-extract-class/SKILL.md +203 -203
- package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -252
- package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -460
- package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -286
- package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -434
- package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -270
- package/kit/skills/lgpd-multi-tenant-compliance/SKILL.md +340 -340
- package/kit/skills/member-invite-flow/SKILL.md +305 -305
- package/kit/skills/member-management-react-shadcn/SKILL.md +328 -328
- package/kit/skills/multi-tenant-performance-scaling/SKILL.md +316 -316
- package/kit/skills/multi-tenant-rls-hierarchy/SKILL.md +342 -342
- package/kit/skills/org-onboarding-flow/SKILL.md +257 -257
- package/kit/skills/org-switcher-react-pattern/SKILL.md +349 -349
- package/kit/skills/permission-gate-react-pattern/SKILL.md +271 -271
- package/kit/skills/postgres-isolamento-concorrencia/SKILL.md +552 -552
- package/kit/skills/pre-refactor-characterization/SKILL.md +421 -421
- package/kit/skills/rbac-permissions-matrix-supabase/SKILL.md +338 -338
- package/kit/skills/streams-eventos-cdc/SKILL.md +711 -711
- package/kit/skills/supabase-branching-workflow/SKILL.md +544 -544
- package/kit/skills/supabase-ci-cd-github-actions/SKILL.md +880 -880
- package/kit/skills/supabase-column-level-security/SKILL.md +426 -426
- package/kit/skills/supabase-config-toml-remotes/SKILL.md +807 -807
- package/kit/skills/supabase-custom-claims-rbac/SKILL.md +472 -472
- package/kit/skills/supabase-edge-functions/SKILL.md +1 -1
- package/kit/skills/supabase-edge-functions-auth/SKILL.md +1 -1
- package/kit/skills/supabase-edge-functions-limits/SKILL.md +1 -1
- package/kit/skills/supabase-edge-functions-mcp-server/SKILL.md +1 -1
- package/kit/skills/supabase-edge-functions-testing/SKILL.md +1 -1
- package/kit/skills/supabase-edge-runtime-builtins/SKILL.md +1 -1
- package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
- package/kit/skills/supabase-migrations/SKILL.md +297 -297
- package/kit/skills/supabase-pgtap-testing/SKILL.md +1053 -1053
- package/kit/skills/supabase-postgres-roles/SKILL.md +392 -392
- package/kit/skills/supabase-realtime/SKILL.md +460 -460
- package/kit/skills/supabase-rls-defense-in-depth/SKILL.md +418 -418
- package/kit/skills/supabase-rls-policies/SKILL.md +635 -635
- package/kit/skills/super-admin-platform-pattern/SKILL.md +326 -326
- package/kit/skills/tenant-quente-mitigacao/SKILL.md +605 -605
- package/kit/skills/whatsapp-conversation-state-machine/SKILL.md +287 -287
- package/package.json +1 -1
- package/src/core/kit.js +216 -216
- package/src/core/reflect.js +247 -247
- package/src/core/reverse-sync.js +372 -372
- package/src/core/sync.js +437 -418
- package/src/core/watch.js +121 -121
- package/src/mcp-server/index.js +794 -746
|
@@ -1,612 +1,612 @@
|
|
|
1
|
-
# Padrões de Verificação
|
|
2
|
-
|
|
3
|
-
Como verificar se diferentes tipos de artefatos são implementações reais, não stubs ou placeholders.
|
|
4
|
-
|
|
5
|
-
<core_principle>
|
|
6
|
-
**Existência ≠ Implementação**
|
|
7
|
-
|
|
8
|
-
Um arquivo existindo não significa que a funcionalidade funciona. A verificação deve verificar:
|
|
9
|
-
1. **Existe** - Arquivo está presente no caminho esperado
|
|
10
|
-
2. **Substantivo** - Conteúdo é implementação real, não placeholder
|
|
11
|
-
3. **Conectado** - Ligado ao restante do sistema
|
|
12
|
-
4. **Funcional** - Realmente funciona quando invocado
|
|
13
|
-
|
|
14
|
-
Os níveis 1-3 podem ser verificados programaticamente. O nível 4 frequentemente requer verificação humana.
|
|
15
|
-
</core_principle>
|
|
16
|
-
|
|
17
|
-
<stub_detection>
|
|
18
|
-
|
|
19
|
-
## Padrões Universais de Stub
|
|
20
|
-
|
|
21
|
-
Estes padrões indicam código placeholder independentemente do tipo de arquivo:
|
|
22
|
-
|
|
23
|
-
**Stubs baseados em comentários:**
|
|
24
|
-
```bash
|
|
25
|
-
# Padrões grep para comentários de stub
|
|
26
|
-
grep -E "(TODO|FIXME|XXX|HACK|PLACEHOLDER)" "$file"
|
|
27
|
-
grep -E "implement|add later|coming soon|will be" "$file" -i
|
|
28
|
-
grep -E "// \.\.\.|/\* \.\.\. \*/|# \.\.\." "$file"
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
**Texto placeholder na saída:**
|
|
32
|
-
```bash
|
|
33
|
-
# Padrões de placeholder de UI
|
|
34
|
-
grep -E "placeholder|lorem ipsum|coming soon|under construction" "$file" -i
|
|
35
|
-
grep -E "sample|example|test data|dummy" "$file" -i
|
|
36
|
-
grep -E "\[.*\]|<.*>|\{.*\}" "$file" # Colchetes de template deixados no arquivo
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
**Implementações vazias ou triviais:**
|
|
40
|
-
```bash
|
|
41
|
-
# Funções que não fazem nada
|
|
42
|
-
grep -E "return null|return undefined|return \{\}|return \[\]" "$file"
|
|
43
|
-
grep -E "pass$|\.\.\.|\bnothing\b" "$file"
|
|
44
|
-
grep -E "console\.(log|warn|error).*only" "$file" # Funções apenas com log
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
**Valores codificados onde dinâmico é esperado:**
|
|
48
|
-
```bash
|
|
49
|
-
# IDs, contagens ou conteúdo codificados
|
|
50
|
-
grep -E "id.*=.*['\"].*['\"]" "$file" # IDs de string codificados
|
|
51
|
-
grep -E "count.*=.*\d+|length.*=.*\d+" "$file" # Contagens codificadas
|
|
52
|
-
grep -E "\\\$\d+\.\d{2}|\d+ items" "$file" # Valores de exibição codificados
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
</stub_detection>
|
|
56
|
-
|
|
57
|
-
<react_components>
|
|
58
|
-
|
|
59
|
-
## Componentes React/Next.js
|
|
60
|
-
|
|
61
|
-
**Verificação de existência:**
|
|
62
|
-
```bash
|
|
63
|
-
# Arquivo existe e exporta componente
|
|
64
|
-
[ -f "$component_path" ] && grep -E "export (default |)function|export const.*=.*\(" "$component_path"
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**Verificação de substantivo:**
|
|
68
|
-
```bash
|
|
69
|
-
# Retorna JSX real, não placeholder
|
|
70
|
-
grep -E "return.*<" "$component_path" | grep -v "return.*null" | grep -v "placeholder" -i
|
|
71
|
-
|
|
72
|
-
# Tem conteúdo significativo (não apenas wrapper div)
|
|
73
|
-
grep -E "<[A-Z][a-zA-Z]+|className=|onClick=|onChange=" "$component_path"
|
|
74
|
-
|
|
75
|
-
# Usa props ou estado (não estático)
|
|
76
|
-
grep -E "props\.|useState|useEffect|useContext|\{.*\}" "$component_path"
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
**Padrões de stub específicos do React:**
|
|
80
|
-
```javascript
|
|
81
|
-
// SINAIS DE ALERTA - Estes são stubs:
|
|
82
|
-
return <div>Component</div>
|
|
83
|
-
return <div>Placeholder</div>
|
|
84
|
-
return <div>{/* TODO */}</div>
|
|
85
|
-
return <p>Coming soon</p>
|
|
86
|
-
return null
|
|
87
|
-
return <></>
|
|
88
|
-
|
|
89
|
-
// Também são stubs — handlers vazios:
|
|
90
|
-
onClick={() => {}}
|
|
91
|
-
onChange={() => console.log('clicked')}
|
|
92
|
-
onSubmit={(e) => e.preventDefault()} // Apenas previne o padrão, não faz nada
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
**Verificação de conexão:**
|
|
96
|
-
```bash
|
|
97
|
-
# Componente importa o que precisa
|
|
98
|
-
grep -E "^import.*from" "$component_path"
|
|
99
|
-
|
|
100
|
-
# Props são realmente usadas (não apenas recebidas)
|
|
101
|
-
# Procure por desestruturação ou uso de props.X
|
|
102
|
-
grep -E "\{ .* \}.*props|\bprops\.[a-zA-Z]+" "$component_path"
|
|
103
|
-
|
|
104
|
-
# Chamadas de API existem (para componentes de busca de dados)
|
|
105
|
-
grep -E "fetch\(|axios\.|useSWR|useQuery|getServerSideProps|getStaticProps" "$component_path"
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
**Verificação funcional (requer humano):**
|
|
109
|
-
- O componente renderiza conteúdo visível?
|
|
110
|
-
- Os elementos interativos respondem a cliques?
|
|
111
|
-
- Os dados carregam e são exibidos?
|
|
112
|
-
- Os estados de erro aparecem adequadamente?
|
|
113
|
-
|
|
114
|
-
</react_components>
|
|
115
|
-
|
|
116
|
-
<api_routes>
|
|
117
|
-
|
|
118
|
-
## Rotas de API (Next.js App Router / Express / etc.)
|
|
119
|
-
|
|
120
|
-
**Verificação de existência:**
|
|
121
|
-
```bash
|
|
122
|
-
# Arquivo de rota existe
|
|
123
|
-
[ -f "$route_path" ]
|
|
124
|
-
|
|
125
|
-
# Exporta handlers de métodos HTTP (Next.js App Router)
|
|
126
|
-
grep -E "export (async )?(function|const) (GET|POST|PUT|PATCH|DELETE)" "$route_path"
|
|
127
|
-
|
|
128
|
-
# Ou handlers no estilo Express
|
|
129
|
-
grep -E "\.(get|post|put|patch|delete)\(" "$route_path"
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
**Verificação de substantivo:**
|
|
133
|
-
```bash
|
|
134
|
-
# Tem lógica real, não apenas instrução de retorno
|
|
135
|
-
wc -l "$route_path" # Mais de 10-15 linhas sugere implementação real
|
|
136
|
-
|
|
137
|
-
# Interage com fonte de dados
|
|
138
|
-
grep -E "prisma\.|db\.|mongoose\.|sql|query|find|create|update|delete" "$route_path" -i
|
|
139
|
-
|
|
140
|
-
# Tem tratamento de erros
|
|
141
|
-
grep -E "try|catch|throw|error|Error" "$route_path"
|
|
142
|
-
|
|
143
|
-
# Retorna resposta significativa
|
|
144
|
-
grep -E "Response\.json|res\.json|res\.send|return.*\{" "$route_path" | grep -v "message.*not implemented" -i
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
**Padrões de stub específicos para rotas de API:**
|
|
148
|
-
```typescript
|
|
149
|
-
// SINAIS DE ALERTA - Estes são stubs:
|
|
150
|
-
export async function POST() {
|
|
151
|
-
return Response.json({ message: "Not implemented" })
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export async function GET() {
|
|
155
|
-
return Response.json([]) // Array vazio sem query ao banco
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
export async function PUT() {
|
|
159
|
-
return new Response() // Resposta vazia
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// Apenas console log:
|
|
163
|
-
export async function POST(req) {
|
|
164
|
-
console.log(await req.json())
|
|
165
|
-
return Response.json({ ok: true })
|
|
166
|
-
}
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
**Verificação de conexão:**
|
|
170
|
-
```bash
|
|
171
|
-
# Importa clientes de banco/serviço
|
|
172
|
-
grep -E "^import.*prisma|^import.*db|^import.*client" "$route_path"
|
|
173
|
-
|
|
174
|
-
# Realmente usa o corpo da requisição (para POST/PUT)
|
|
175
|
-
grep -E "req\.json\(\)|req\.body|request\.json\(\)" "$route_path"
|
|
176
|
-
|
|
177
|
-
# Valida entrada (não apenas confia na requisição)
|
|
178
|
-
grep -E "schema\.parse|validate|zod|yup|joi" "$route_path"
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
**Verificação funcional (humano ou automatizado):**
|
|
182
|
-
- O GET retorna dados reais do banco?
|
|
183
|
-
- O POST realmente cria um registro?
|
|
184
|
-
- A resposta de erro tem o código de status correto?
|
|
185
|
-
- As verificações de autenticação são realmente aplicadas?
|
|
186
|
-
|
|
187
|
-
</api_routes>
|
|
188
|
-
|
|
189
|
-
<database_schema>
|
|
190
|
-
|
|
191
|
-
## Schema de Banco de Dados (Prisma / Drizzle / SQL)
|
|
192
|
-
|
|
193
|
-
**Verificação de existência:**
|
|
194
|
-
```bash
|
|
195
|
-
# Arquivo de schema existe
|
|
196
|
-
[ -f "prisma/schema.prisma" ] || [ -f "drizzle/schema.ts" ] || [ -f "src/db/schema.sql" ]
|
|
197
|
-
|
|
198
|
-
# Modelo/tabela está definido
|
|
199
|
-
grep -E "^model $model_name|CREATE TABLE $table_name|export const $table_name" "$schema_path"
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
**Verificação de substantivo:**
|
|
203
|
-
```bash
|
|
204
|
-
# Tem campos esperados (não apenas id)
|
|
205
|
-
grep -A 20 "model $model_name" "$schema_path" | grep -E "^\s+\w+\s+\w+"
|
|
206
|
-
|
|
207
|
-
# Tem relacionamentos se esperado
|
|
208
|
-
grep -E "@relation|REFERENCES|FOREIGN KEY" "$schema_path"
|
|
209
|
-
|
|
210
|
-
# Tem tipos de campo adequados (não todos String)
|
|
211
|
-
grep -A 20 "model $model_name" "$schema_path" | grep -E "Int|DateTime|Boolean|Float|Decimal|Json"
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
**Padrões de stub específicos para schemas:**
|
|
215
|
-
```prisma
|
|
216
|
-
// SINAIS DE ALERTA - Estes são stubs:
|
|
217
|
-
model User {
|
|
218
|
-
id String @id
|
|
219
|
-
// TODO: add fields
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
model Message {
|
|
223
|
-
id String @id
|
|
224
|
-
content String // Apenas um campo real
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// Campos críticos ausentes:
|
|
228
|
-
model Order {
|
|
229
|
-
id String @id
|
|
230
|
-
// Sem: userId, items, total, status, createdAt
|
|
231
|
-
}
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
**Verificação de conexão:**
|
|
235
|
-
```bash
|
|
236
|
-
# Migrações existem e estão aplicadas
|
|
237
|
-
ls prisma/migrations/ 2>/dev/null | wc -l # Deve ser > 0
|
|
238
|
-
npx prisma migrate status 2>/dev/null | grep -v "pending"
|
|
239
|
-
|
|
240
|
-
# Client está gerado
|
|
241
|
-
[ -d "node_modules/.prisma/client" ]
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
**Verificação funcional:**
|
|
245
|
-
```bash
|
|
246
|
-
# Pode fazer query na tabela (automatizado)
|
|
247
|
-
npx prisma db execute --stdin <<< "SELECT COUNT(*) FROM $table_name"
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
</database_schema>
|
|
251
|
-
|
|
252
|
-
<hooks_utilities>
|
|
253
|
-
|
|
254
|
-
## Hooks e Utilitários Personalizados
|
|
255
|
-
|
|
256
|
-
**Verificação de existência:**
|
|
257
|
-
```bash
|
|
258
|
-
# Arquivo existe e exporta função
|
|
259
|
-
[ -f "$hook_path" ] && grep -E "export (default )?(function|const)" "$hook_path"
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
**Verificação de substantivo:**
|
|
263
|
-
```bash
|
|
264
|
-
# Hook usa React hooks (para hooks personalizados)
|
|
265
|
-
grep -E "useState|useEffect|useCallback|useMemo|useRef|useContext" "$hook_path"
|
|
266
|
-
|
|
267
|
-
# Tem valor de retorno significativo
|
|
268
|
-
grep -E "return \{|return \[" "$hook_path"
|
|
269
|
-
|
|
270
|
-
# Mais do que comprimento trivial
|
|
271
|
-
[ $(wc -l < "$hook_path") -gt 10 ]
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
**Padrões de stub específicos para hooks:**
|
|
275
|
-
```typescript
|
|
276
|
-
// SINAIS DE ALERTA - Estes são stubs:
|
|
277
|
-
export function useAuth() {
|
|
278
|
-
return { user: null, login: () => {}, logout: () => {} }
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
export function useCart() {
|
|
282
|
-
const [items, setItems] = useState([])
|
|
283
|
-
return { items, addItem: () => console.log('add'), removeItem: () => {} }
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// Retorno codificado:
|
|
287
|
-
export function useUser() {
|
|
288
|
-
return { name: "Test User", email: "test@example.com" }
|
|
289
|
-
}
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
**Verificação de conexão:**
|
|
293
|
-
```bash
|
|
294
|
-
# Hook é realmente importado em algum lugar
|
|
295
|
-
grep -r "import.*$hook_name" src/ --include="*.tsx" --include="*.ts" | grep -v "$hook_path"
|
|
296
|
-
|
|
297
|
-
# Hook é realmente chamado
|
|
298
|
-
grep -r "$hook_name()" src/ --include="*.tsx" --include="*.ts" | grep -v "$hook_path"
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
</hooks_utilities>
|
|
302
|
-
|
|
303
|
-
<environment_config>
|
|
304
|
-
|
|
305
|
-
## Variáveis de Ambiente e Configuração
|
|
306
|
-
|
|
307
|
-
**Verificação de existência:**
|
|
308
|
-
```bash
|
|
309
|
-
# Arquivo .env existe
|
|
310
|
-
[ -f ".env" ] || [ -f ".env.local" ]
|
|
311
|
-
|
|
312
|
-
# Variável requerida está definida
|
|
313
|
-
grep -E "^$VAR_NAME=" .env .env.local 2>/dev/null
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
**Verificação de substantivo:**
|
|
317
|
-
```bash
|
|
318
|
-
# Variável tem valor real (não placeholder)
|
|
319
|
-
grep -E "^$VAR_NAME=.+" .env .env.local 2>/dev/null | grep -v "your-.*-here|xxx|placeholder|TODO" -i
|
|
320
|
-
|
|
321
|
-
# O valor parece válido para o tipo:
|
|
322
|
-
# - URLs devem começar com http
|
|
323
|
-
# - Chaves devem ser longas o suficiente
|
|
324
|
-
# - Booleanos devem ser true/false
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
**Padrões de stub específicos para env:**
|
|
328
|
-
```bash
|
|
329
|
-
# SINAIS DE ALERTA - Estes são stubs:
|
|
330
|
-
DATABASE_URL=your-database-url-here
|
|
331
|
-
STRIPE_SECRET_KEY=sk_test_xxx
|
|
332
|
-
API_KEY=placeholder
|
|
333
|
-
NEXT_PUBLIC_API_URL=http://localhost:3000 # Ainda apontando para localhost em prod
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
**Verificação de conexão:**
|
|
337
|
-
```bash
|
|
338
|
-
# Variável é realmente usada no código
|
|
339
|
-
grep -r "process\.env\.$VAR_NAME|env\.$VAR_NAME" src/ --include="*.ts" --include="*.tsx"
|
|
340
|
-
|
|
341
|
-
# Variável está no schema de validação (se usando zod/etc para env)
|
|
342
|
-
grep -E "$VAR_NAME" src/env.ts src/env.mjs 2>/dev/null
|
|
343
|
-
```
|
|
344
|
-
|
|
345
|
-
</environment_config>
|
|
346
|
-
|
|
347
|
-
<wiring_verification>
|
|
348
|
-
|
|
349
|
-
## Padrões de Verificação de Conexão
|
|
350
|
-
|
|
351
|
-
A verificação de conexão verifica se os componentes realmente se comunicam. É onde a maioria dos stubs se esconde.
|
|
352
|
-
|
|
353
|
-
### Padrão: Componente → API
|
|
354
|
-
|
|
355
|
-
**Verificação:** O componente realmente chama a API?
|
|
356
|
-
|
|
357
|
-
```bash
|
|
358
|
-
# Encontrar a chamada fetch/axios
|
|
359
|
-
grep -E "fetch\(['\"].*$api_path|axios\.(get|post).*$api_path" "$component_path"
|
|
360
|
-
|
|
361
|
-
# Verificar se não está comentado
|
|
362
|
-
grep -E "fetch\(|axios\." "$component_path" | grep -v "^.*//.*fetch"
|
|
363
|
-
|
|
364
|
-
# Verificar se a resposta é usada
|
|
365
|
-
grep -E "await.*fetch|\.then\(|setData|setState" "$component_path"
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
**Sinais de alerta:**
|
|
369
|
-
```typescript
|
|
370
|
-
// Fetch existe mas resposta ignorada:
|
|
371
|
-
fetch('/api/messages') // Sem await, sem .then, sem atribuição
|
|
372
|
-
|
|
373
|
-
// Fetch comentado:
|
|
374
|
-
// fetch('/api/messages').then(r => r.json()).then(setMessages)
|
|
375
|
-
|
|
376
|
-
// Fetch para endpoint errado:
|
|
377
|
-
fetch('/api/message') // Typo - deveria ser /api/messages
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
### Padrão: API → Banco de Dados
|
|
381
|
-
|
|
382
|
-
**Verificação:** A rota de API realmente faz query no banco?
|
|
383
|
-
|
|
384
|
-
```bash
|
|
385
|
-
# Encontrar a chamada ao banco
|
|
386
|
-
grep -E "prisma\.$model|db\.query|Model\.find" "$route_path"
|
|
387
|
-
|
|
388
|
-
# Verificar se é awaited
|
|
389
|
-
grep -E "await.*prisma|await.*db\." "$route_path"
|
|
390
|
-
|
|
391
|
-
# Verificar se resultado é retornado
|
|
392
|
-
grep -E "return.*json.*data|res\.json.*result" "$route_path"
|
|
393
|
-
```
|
|
394
|
-
|
|
395
|
-
**Sinais de alerta:**
|
|
396
|
-
```typescript
|
|
397
|
-
// Query existe mas resultado não é retornado:
|
|
398
|
-
await prisma.message.findMany()
|
|
399
|
-
return Response.json({ ok: true }) // Retorna estático, não resultado da query
|
|
400
|
-
|
|
401
|
-
// Query sem await:
|
|
402
|
-
const messages = prisma.message.findMany() // Await ausente
|
|
403
|
-
return Response.json(messages) // Retorna Promise, não dados
|
|
404
|
-
```
|
|
405
|
-
|
|
406
|
-
### Padrão: Formulário → Handler
|
|
407
|
-
|
|
408
|
-
**Verificação:** O envio do formulário realmente faz algo?
|
|
409
|
-
|
|
410
|
-
```bash
|
|
411
|
-
# Encontrar handler onSubmit
|
|
412
|
-
grep -E "onSubmit=\{|handleSubmit" "$component_path"
|
|
413
|
-
|
|
414
|
-
# Verificar se handler tem conteúdo
|
|
415
|
-
grep -A 10 "onSubmit.*=" "$component_path" | grep -E "fetch|axios|mutate|dispatch"
|
|
416
|
-
|
|
417
|
-
# Verificar se não é apenas preventDefault
|
|
418
|
-
grep -A 5 "onSubmit" "$component_path" | grep -v "only.*preventDefault" -i
|
|
419
|
-
```
|
|
420
|
-
|
|
421
|
-
**Sinais de alerta:**
|
|
422
|
-
```typescript
|
|
423
|
-
// Handler apenas previne o padrão:
|
|
424
|
-
onSubmit={(e) => e.preventDefault()}
|
|
425
|
-
|
|
426
|
-
// Handler apenas loga:
|
|
427
|
-
const handleSubmit = (data) => {
|
|
428
|
-
console.log(data)
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
// Handler vazio:
|
|
432
|
-
onSubmit={() => {}}
|
|
433
|
-
```
|
|
434
|
-
|
|
435
|
-
### Padrão: Estado → Render
|
|
436
|
-
|
|
437
|
-
**Verificação:** O componente renderiza estado, não conteúdo codificado?
|
|
438
|
-
|
|
439
|
-
```bash
|
|
440
|
-
# Encontrar uso de estado no JSX
|
|
441
|
-
grep -E "\{.*messages.*\}|\{.*data.*\}|\{.*items.*\}" "$component_path"
|
|
442
|
-
|
|
443
|
-
# Verificar map/render do estado
|
|
444
|
-
grep -E "\.map\(|\.filter\(|\.reduce\(" "$component_path"
|
|
445
|
-
|
|
446
|
-
# Verificar conteúdo dinâmico
|
|
447
|
-
grep -E "\{[a-zA-Z_]+\." "$component_path" # Interpolação de variável
|
|
448
|
-
```
|
|
449
|
-
|
|
450
|
-
**Sinais de alerta:**
|
|
451
|
-
```tsx
|
|
452
|
-
// Codificado em vez de estado:
|
|
453
|
-
return <div>
|
|
454
|
-
<p>Mensagem 1</p>
|
|
455
|
-
<p>Mensagem 2</p>
|
|
456
|
-
</div>
|
|
457
|
-
|
|
458
|
-
// Estado existe mas não é renderizado:
|
|
459
|
-
const [messages, setMessages] = useState([])
|
|
460
|
-
return <div>Sem mensagens</div> // Sempre mostra "sem mensagens"
|
|
461
|
-
|
|
462
|
-
// Estado errado renderizado:
|
|
463
|
-
const [messages, setMessages] = useState([])
|
|
464
|
-
return <div>{otherData.map(...)}</div> // Usa dados diferentes
|
|
465
|
-
```
|
|
466
|
-
|
|
467
|
-
</wiring_verification>
|
|
468
|
-
|
|
469
|
-
<verification_checklist>
|
|
470
|
-
|
|
471
|
-
## Checklist Rápido de Verificação
|
|
472
|
-
|
|
473
|
-
Para cada tipo de artefato, percorra este checklist:
|
|
474
|
-
|
|
475
|
-
### Checklist de Componente
|
|
476
|
-
- [ ] Arquivo existe no caminho esperado
|
|
477
|
-
- [ ] Exporta um componente função/const
|
|
478
|
-
- [ ] Retorna JSX (não null/vazio)
|
|
479
|
-
- [ ] Sem texto placeholder no render
|
|
480
|
-
- [ ] Usa props ou estado (não estático)
|
|
481
|
-
- [ ] Event handlers têm implementações reais
|
|
482
|
-
- [ ] Imports resolvem corretamente
|
|
483
|
-
- [ ] Usado em algum lugar no app
|
|
484
|
-
|
|
485
|
-
### Checklist de Rota de API
|
|
486
|
-
- [ ] Arquivo existe no caminho esperado
|
|
487
|
-
- [ ] Exporta handlers de métodos HTTP
|
|
488
|
-
- [ ] Handlers têm mais de 5 linhas
|
|
489
|
-
- [ ] Faz query no banco ou serviço
|
|
490
|
-
- [ ] Retorna resposta significativa (não vazia/placeholder)
|
|
491
|
-
- [ ] Tem tratamento de erros
|
|
492
|
-
- [ ] Valida entrada
|
|
493
|
-
- [ ] Chamado do frontend
|
|
494
|
-
|
|
495
|
-
### Checklist de Schema
|
|
496
|
-
- [ ] Modelo/tabela definido
|
|
497
|
-
- [ ] Tem todos os campos esperados
|
|
498
|
-
- [ ] Campos têm tipos apropriados
|
|
499
|
-
- [ ] Relacionamentos definidos se necessário
|
|
500
|
-
- [ ] Migrações existem e aplicadas
|
|
501
|
-
- [ ] Client gerado
|
|
502
|
-
|
|
503
|
-
### Checklist de Hook/Utilitário
|
|
504
|
-
- [ ] Arquivo existe no caminho esperado
|
|
505
|
-
- [ ] Exporta função
|
|
506
|
-
- [ ] Tem implementação significativa (não retornos vazios)
|
|
507
|
-
- [ ] Usado em algum lugar no app
|
|
508
|
-
- [ ] Valores de retorno consumidos
|
|
509
|
-
|
|
510
|
-
### Checklist de Conexão
|
|
511
|
-
- [ ] Componente → API: chamada fetch/axios existe e usa a resposta
|
|
512
|
-
- [ ] API → Banco: query existe e resultado é retornado
|
|
513
|
-
- [ ] Formulário → Handler: onSubmit chama API/mutation
|
|
514
|
-
- [ ] Estado → Render: variáveis de estado aparecem no JSX
|
|
515
|
-
|
|
516
|
-
</verification_checklist>
|
|
517
|
-
|
|
518
|
-
<automated_verification_script>
|
|
519
|
-
|
|
520
|
-
## Abordagem de Verificação Automatizada
|
|
521
|
-
|
|
522
|
-
Para o subagente de verificação, use este padrão:
|
|
523
|
-
|
|
524
|
-
```bash
|
|
525
|
-
# 1. Verificar existência
|
|
526
|
-
check_exists() {
|
|
527
|
-
[ -f "$1" ] && echo "EXISTS: $1" || echo "MISSING: $1"
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
# 2. Verificar padrões de stub
|
|
531
|
-
check_stubs() {
|
|
532
|
-
local file="$1"
|
|
533
|
-
local stubs=$(grep -c -E "TODO|FIXME|placeholder|not implemented" "$file" 2>/dev/null || echo 0)
|
|
534
|
-
[ "$stubs" -gt 0 ] && echo "STUB_PATTERNS: $stubs in $file"
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
# 3. Verificar conexão (componente chama API)
|
|
538
|
-
check_wiring() {
|
|
539
|
-
local component="$1"
|
|
540
|
-
local api_path="$2"
|
|
541
|
-
grep -q "$api_path" "$component" && echo "WIRED: $component → $api_path" || echo "NOT_WIRED: $component → $api_path"
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
# 4. Verificar substantivo (mais de N linhas, tem padrões esperados)
|
|
545
|
-
check_substantive() {
|
|
546
|
-
local file="$1"
|
|
547
|
-
local min_lines="$2"
|
|
548
|
-
local pattern="$3"
|
|
549
|
-
local lines=$(wc -l < "$file" 2>/dev/null || echo 0)
|
|
550
|
-
local has_pattern=$(grep -c -E "$pattern" "$file" 2>/dev/null || echo 0)
|
|
551
|
-
[ "$lines" -ge "$min_lines" ] && [ "$has_pattern" -gt 0 ] && echo "SUBSTANTIVE: $file" || echo "THIN: $file ($lines lines, $has_pattern matches)"
|
|
552
|
-
}
|
|
553
|
-
```
|
|
554
|
-
|
|
555
|
-
Execute estas verificações em cada artefato must-have. Agregue os resultados no VERIFICATION.md.
|
|
556
|
-
|
|
557
|
-
</automated_verification_script>
|
|
558
|
-
|
|
559
|
-
<human_verification_triggers>
|
|
560
|
-
|
|
561
|
-
## Quando Requerer Verificação Humana
|
|
562
|
-
|
|
563
|
-
Algumas coisas não podem ser verificadas programaticamente. Sinalize para teste humano:
|
|
564
|
-
|
|
565
|
-
**Sempre humano:**
|
|
566
|
-
- Aparência visual (parece certo?)
|
|
567
|
-
- Conclusão do fluxo do usuário (você consegue realmente fazer a coisa?)
|
|
568
|
-
- Comportamento em tempo real (WebSocket, SSE)
|
|
569
|
-
- Integração com serviço externo (Stripe, envio de email)
|
|
570
|
-
- Clareza da mensagem de erro (a mensagem é útil?)
|
|
571
|
-
- Sensação de desempenho (parece rápido?)
|
|
572
|
-
|
|
573
|
-
**Humano se incerto:**
|
|
574
|
-
- Conexão complexa que grep não consegue rastrear
|
|
575
|
-
- Comportamento dinâmico dependendo do estado
|
|
576
|
-
- Casos extremos e estados de erro
|
|
577
|
-
- Responsividade mobile
|
|
578
|
-
- Acessibilidade
|
|
579
|
-
|
|
580
|
-
**Formato para requisição de verificação humana:**
|
|
581
|
-
```markdown
|
|
582
|
-
## Verificação Humana Necessária
|
|
583
|
-
|
|
584
|
-
### 1. Envio de mensagem no chat
|
|
585
|
-
**Teste:** Digite uma mensagem e clique em Enviar
|
|
586
|
-
**Esperado:** Mensagem aparece na lista, input limpa
|
|
587
|
-
**Verificar:** A mensagem persiste após atualizar?
|
|
588
|
-
|
|
589
|
-
### 2. Tratamento de erros
|
|
590
|
-
**Teste:** Desconecte a rede, tente enviar
|
|
591
|
-
**Esperado:** Mensagem de erro aparece, mensagem não é perdida
|
|
592
|
-
**Verificar:** É possível tentar novamente após reconectar?
|
|
593
|
-
```
|
|
594
|
-
|
|
595
|
-
</human_verification_triggers>
|
|
596
|
-
|
|
597
|
-
<checkpoint_automation_reference>
|
|
598
|
-
|
|
599
|
-
## Automação Pré-Checkpoint
|
|
600
|
-
|
|
601
|
-
Para padrões de checkpoint com automação em primeiro lugar, gerenciamento do ciclo de vida do servidor, tratamento de instalação de CLI e protocolos de recuperação de erros, consulte:
|
|
602
|
-
|
|
603
|
-
**@./.claude/framework/references/checkpoints.md** → seção `<automation_reference>`
|
|
604
|
-
|
|
605
|
-
Princípios chave:
|
|
606
|
-
- Claude configura o ambiente de verificação ANTES de apresentar checkpoints
|
|
607
|
-
- Usuários nunca executam comandos CLI (apenas visitam URLs)
|
|
608
|
-
- Ciclo de vida do servidor: inicie antes do checkpoint, trate conflitos de porta, mantenha em execução durante a duração
|
|
609
|
-
- Instalação de CLI: instale automaticamente onde for seguro, checkpoint para escolha do usuário caso contrário
|
|
610
|
-
- Tratamento de erros: corrija o ambiente quebrado antes do checkpoint, nunca apresente checkpoint com configuração falhada
|
|
611
|
-
|
|
612
|
-
</checkpoint_automation_reference>
|
|
1
|
+
# Padrões de Verificação
|
|
2
|
+
|
|
3
|
+
Como verificar se diferentes tipos de artefatos são implementações reais, não stubs ou placeholders.
|
|
4
|
+
|
|
5
|
+
<core_principle>
|
|
6
|
+
**Existência ≠ Implementação**
|
|
7
|
+
|
|
8
|
+
Um arquivo existindo não significa que a funcionalidade funciona. A verificação deve verificar:
|
|
9
|
+
1. **Existe** - Arquivo está presente no caminho esperado
|
|
10
|
+
2. **Substantivo** - Conteúdo é implementação real, não placeholder
|
|
11
|
+
3. **Conectado** - Ligado ao restante do sistema
|
|
12
|
+
4. **Funcional** - Realmente funciona quando invocado
|
|
13
|
+
|
|
14
|
+
Os níveis 1-3 podem ser verificados programaticamente. O nível 4 frequentemente requer verificação humana.
|
|
15
|
+
</core_principle>
|
|
16
|
+
|
|
17
|
+
<stub_detection>
|
|
18
|
+
|
|
19
|
+
## Padrões Universais de Stub
|
|
20
|
+
|
|
21
|
+
Estes padrões indicam código placeholder independentemente do tipo de arquivo:
|
|
22
|
+
|
|
23
|
+
**Stubs baseados em comentários:**
|
|
24
|
+
```bash
|
|
25
|
+
# Padrões grep para comentários de stub
|
|
26
|
+
grep -E "(TODO|FIXME|XXX|HACK|PLACEHOLDER)" "$file"
|
|
27
|
+
grep -E "implement|add later|coming soon|will be" "$file" -i
|
|
28
|
+
grep -E "// \.\.\.|/\* \.\.\. \*/|# \.\.\." "$file"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Texto placeholder na saída:**
|
|
32
|
+
```bash
|
|
33
|
+
# Padrões de placeholder de UI
|
|
34
|
+
grep -E "placeholder|lorem ipsum|coming soon|under construction" "$file" -i
|
|
35
|
+
grep -E "sample|example|test data|dummy" "$file" -i
|
|
36
|
+
grep -E "\[.*\]|<.*>|\{.*\}" "$file" # Colchetes de template deixados no arquivo
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Implementações vazias ou triviais:**
|
|
40
|
+
```bash
|
|
41
|
+
# Funções que não fazem nada
|
|
42
|
+
grep -E "return null|return undefined|return \{\}|return \[\]" "$file"
|
|
43
|
+
grep -E "pass$|\.\.\.|\bnothing\b" "$file"
|
|
44
|
+
grep -E "console\.(log|warn|error).*only" "$file" # Funções apenas com log
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Valores codificados onde dinâmico é esperado:**
|
|
48
|
+
```bash
|
|
49
|
+
# IDs, contagens ou conteúdo codificados
|
|
50
|
+
grep -E "id.*=.*['\"].*['\"]" "$file" # IDs de string codificados
|
|
51
|
+
grep -E "count.*=.*\d+|length.*=.*\d+" "$file" # Contagens codificadas
|
|
52
|
+
grep -E "\\\$\d+\.\d{2}|\d+ items" "$file" # Valores de exibição codificados
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
</stub_detection>
|
|
56
|
+
|
|
57
|
+
<react_components>
|
|
58
|
+
|
|
59
|
+
## Componentes React/Next.js
|
|
60
|
+
|
|
61
|
+
**Verificação de existência:**
|
|
62
|
+
```bash
|
|
63
|
+
# Arquivo existe e exporta componente
|
|
64
|
+
[ -f "$component_path" ] && grep -E "export (default |)function|export const.*=.*\(" "$component_path"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Verificação de substantivo:**
|
|
68
|
+
```bash
|
|
69
|
+
# Retorna JSX real, não placeholder
|
|
70
|
+
grep -E "return.*<" "$component_path" | grep -v "return.*null" | grep -v "placeholder" -i
|
|
71
|
+
|
|
72
|
+
# Tem conteúdo significativo (não apenas wrapper div)
|
|
73
|
+
grep -E "<[A-Z][a-zA-Z]+|className=|onClick=|onChange=" "$component_path"
|
|
74
|
+
|
|
75
|
+
# Usa props ou estado (não estático)
|
|
76
|
+
grep -E "props\.|useState|useEffect|useContext|\{.*\}" "$component_path"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Padrões de stub específicos do React:**
|
|
80
|
+
```javascript
|
|
81
|
+
// SINAIS DE ALERTA - Estes são stubs:
|
|
82
|
+
return <div>Component</div>
|
|
83
|
+
return <div>Placeholder</div>
|
|
84
|
+
return <div>{/* TODO */}</div>
|
|
85
|
+
return <p>Coming soon</p>
|
|
86
|
+
return null
|
|
87
|
+
return <></>
|
|
88
|
+
|
|
89
|
+
// Também são stubs — handlers vazios:
|
|
90
|
+
onClick={() => {}}
|
|
91
|
+
onChange={() => console.log('clicked')}
|
|
92
|
+
onSubmit={(e) => e.preventDefault()} // Apenas previne o padrão, não faz nada
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Verificação de conexão:**
|
|
96
|
+
```bash
|
|
97
|
+
# Componente importa o que precisa
|
|
98
|
+
grep -E "^import.*from" "$component_path"
|
|
99
|
+
|
|
100
|
+
# Props são realmente usadas (não apenas recebidas)
|
|
101
|
+
# Procure por desestruturação ou uso de props.X
|
|
102
|
+
grep -E "\{ .* \}.*props|\bprops\.[a-zA-Z]+" "$component_path"
|
|
103
|
+
|
|
104
|
+
# Chamadas de API existem (para componentes de busca de dados)
|
|
105
|
+
grep -E "fetch\(|axios\.|useSWR|useQuery|getServerSideProps|getStaticProps" "$component_path"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Verificação funcional (requer humano):**
|
|
109
|
+
- O componente renderiza conteúdo visível?
|
|
110
|
+
- Os elementos interativos respondem a cliques?
|
|
111
|
+
- Os dados carregam e são exibidos?
|
|
112
|
+
- Os estados de erro aparecem adequadamente?
|
|
113
|
+
|
|
114
|
+
</react_components>
|
|
115
|
+
|
|
116
|
+
<api_routes>
|
|
117
|
+
|
|
118
|
+
## Rotas de API (Next.js App Router / Express / etc.)
|
|
119
|
+
|
|
120
|
+
**Verificação de existência:**
|
|
121
|
+
```bash
|
|
122
|
+
# Arquivo de rota existe
|
|
123
|
+
[ -f "$route_path" ]
|
|
124
|
+
|
|
125
|
+
# Exporta handlers de métodos HTTP (Next.js App Router)
|
|
126
|
+
grep -E "export (async )?(function|const) (GET|POST|PUT|PATCH|DELETE)" "$route_path"
|
|
127
|
+
|
|
128
|
+
# Ou handlers no estilo Express
|
|
129
|
+
grep -E "\.(get|post|put|patch|delete)\(" "$route_path"
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Verificação de substantivo:**
|
|
133
|
+
```bash
|
|
134
|
+
# Tem lógica real, não apenas instrução de retorno
|
|
135
|
+
wc -l "$route_path" # Mais de 10-15 linhas sugere implementação real
|
|
136
|
+
|
|
137
|
+
# Interage com fonte de dados
|
|
138
|
+
grep -E "prisma\.|db\.|mongoose\.|sql|query|find|create|update|delete" "$route_path" -i
|
|
139
|
+
|
|
140
|
+
# Tem tratamento de erros
|
|
141
|
+
grep -E "try|catch|throw|error|Error" "$route_path"
|
|
142
|
+
|
|
143
|
+
# Retorna resposta significativa
|
|
144
|
+
grep -E "Response\.json|res\.json|res\.send|return.*\{" "$route_path" | grep -v "message.*not implemented" -i
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**Padrões de stub específicos para rotas de API:**
|
|
148
|
+
```typescript
|
|
149
|
+
// SINAIS DE ALERTA - Estes são stubs:
|
|
150
|
+
export async function POST() {
|
|
151
|
+
return Response.json({ message: "Not implemented" })
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export async function GET() {
|
|
155
|
+
return Response.json([]) // Array vazio sem query ao banco
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export async function PUT() {
|
|
159
|
+
return new Response() // Resposta vazia
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Apenas console log:
|
|
163
|
+
export async function POST(req) {
|
|
164
|
+
console.log(await req.json())
|
|
165
|
+
return Response.json({ ok: true })
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Verificação de conexão:**
|
|
170
|
+
```bash
|
|
171
|
+
# Importa clientes de banco/serviço
|
|
172
|
+
grep -E "^import.*prisma|^import.*db|^import.*client" "$route_path"
|
|
173
|
+
|
|
174
|
+
# Realmente usa o corpo da requisição (para POST/PUT)
|
|
175
|
+
grep -E "req\.json\(\)|req\.body|request\.json\(\)" "$route_path"
|
|
176
|
+
|
|
177
|
+
# Valida entrada (não apenas confia na requisição)
|
|
178
|
+
grep -E "schema\.parse|validate|zod|yup|joi" "$route_path"
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Verificação funcional (humano ou automatizado):**
|
|
182
|
+
- O GET retorna dados reais do banco?
|
|
183
|
+
- O POST realmente cria um registro?
|
|
184
|
+
- A resposta de erro tem o código de status correto?
|
|
185
|
+
- As verificações de autenticação são realmente aplicadas?
|
|
186
|
+
|
|
187
|
+
</api_routes>
|
|
188
|
+
|
|
189
|
+
<database_schema>
|
|
190
|
+
|
|
191
|
+
## Schema de Banco de Dados (Prisma / Drizzle / SQL)
|
|
192
|
+
|
|
193
|
+
**Verificação de existência:**
|
|
194
|
+
```bash
|
|
195
|
+
# Arquivo de schema existe
|
|
196
|
+
[ -f "prisma/schema.prisma" ] || [ -f "drizzle/schema.ts" ] || [ -f "src/db/schema.sql" ]
|
|
197
|
+
|
|
198
|
+
# Modelo/tabela está definido
|
|
199
|
+
grep -E "^model $model_name|CREATE TABLE $table_name|export const $table_name" "$schema_path"
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**Verificação de substantivo:**
|
|
203
|
+
```bash
|
|
204
|
+
# Tem campos esperados (não apenas id)
|
|
205
|
+
grep -A 20 "model $model_name" "$schema_path" | grep -E "^\s+\w+\s+\w+"
|
|
206
|
+
|
|
207
|
+
# Tem relacionamentos se esperado
|
|
208
|
+
grep -E "@relation|REFERENCES|FOREIGN KEY" "$schema_path"
|
|
209
|
+
|
|
210
|
+
# Tem tipos de campo adequados (não todos String)
|
|
211
|
+
grep -A 20 "model $model_name" "$schema_path" | grep -E "Int|DateTime|Boolean|Float|Decimal|Json"
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**Padrões de stub específicos para schemas:**
|
|
215
|
+
```prisma
|
|
216
|
+
// SINAIS DE ALERTA - Estes são stubs:
|
|
217
|
+
model User {
|
|
218
|
+
id String @id
|
|
219
|
+
// TODO: add fields
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
model Message {
|
|
223
|
+
id String @id
|
|
224
|
+
content String // Apenas um campo real
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Campos críticos ausentes:
|
|
228
|
+
model Order {
|
|
229
|
+
id String @id
|
|
230
|
+
// Sem: userId, items, total, status, createdAt
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Verificação de conexão:**
|
|
235
|
+
```bash
|
|
236
|
+
# Migrações existem e estão aplicadas
|
|
237
|
+
ls prisma/migrations/ 2>/dev/null | wc -l # Deve ser > 0
|
|
238
|
+
npx prisma migrate status 2>/dev/null | grep -v "pending"
|
|
239
|
+
|
|
240
|
+
# Client está gerado
|
|
241
|
+
[ -d "node_modules/.prisma/client" ]
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**Verificação funcional:**
|
|
245
|
+
```bash
|
|
246
|
+
# Pode fazer query na tabela (automatizado)
|
|
247
|
+
npx prisma db execute --stdin <<< "SELECT COUNT(*) FROM $table_name"
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
</database_schema>
|
|
251
|
+
|
|
252
|
+
<hooks_utilities>
|
|
253
|
+
|
|
254
|
+
## Hooks e Utilitários Personalizados
|
|
255
|
+
|
|
256
|
+
**Verificação de existência:**
|
|
257
|
+
```bash
|
|
258
|
+
# Arquivo existe e exporta função
|
|
259
|
+
[ -f "$hook_path" ] && grep -E "export (default )?(function|const)" "$hook_path"
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**Verificação de substantivo:**
|
|
263
|
+
```bash
|
|
264
|
+
# Hook usa React hooks (para hooks personalizados)
|
|
265
|
+
grep -E "useState|useEffect|useCallback|useMemo|useRef|useContext" "$hook_path"
|
|
266
|
+
|
|
267
|
+
# Tem valor de retorno significativo
|
|
268
|
+
grep -E "return \{|return \[" "$hook_path"
|
|
269
|
+
|
|
270
|
+
# Mais do que comprimento trivial
|
|
271
|
+
[ $(wc -l < "$hook_path") -gt 10 ]
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**Padrões de stub específicos para hooks:**
|
|
275
|
+
```typescript
|
|
276
|
+
// SINAIS DE ALERTA - Estes são stubs:
|
|
277
|
+
export function useAuth() {
|
|
278
|
+
return { user: null, login: () => {}, logout: () => {} }
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
export function useCart() {
|
|
282
|
+
const [items, setItems] = useState([])
|
|
283
|
+
return { items, addItem: () => console.log('add'), removeItem: () => {} }
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Retorno codificado:
|
|
287
|
+
export function useUser() {
|
|
288
|
+
return { name: "Test User", email: "test@example.com" }
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
**Verificação de conexão:**
|
|
293
|
+
```bash
|
|
294
|
+
# Hook é realmente importado em algum lugar
|
|
295
|
+
grep -r "import.*$hook_name" src/ --include="*.tsx" --include="*.ts" | grep -v "$hook_path"
|
|
296
|
+
|
|
297
|
+
# Hook é realmente chamado
|
|
298
|
+
grep -r "$hook_name()" src/ --include="*.tsx" --include="*.ts" | grep -v "$hook_path"
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
</hooks_utilities>
|
|
302
|
+
|
|
303
|
+
<environment_config>
|
|
304
|
+
|
|
305
|
+
## Variáveis de Ambiente e Configuração
|
|
306
|
+
|
|
307
|
+
**Verificação de existência:**
|
|
308
|
+
```bash
|
|
309
|
+
# Arquivo .env existe
|
|
310
|
+
[ -f ".env" ] || [ -f ".env.local" ]
|
|
311
|
+
|
|
312
|
+
# Variável requerida está definida
|
|
313
|
+
grep -E "^$VAR_NAME=" .env .env.local 2>/dev/null
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
**Verificação de substantivo:**
|
|
317
|
+
```bash
|
|
318
|
+
# Variável tem valor real (não placeholder)
|
|
319
|
+
grep -E "^$VAR_NAME=.+" .env .env.local 2>/dev/null | grep -v "your-.*-here|xxx|placeholder|TODO" -i
|
|
320
|
+
|
|
321
|
+
# O valor parece válido para o tipo:
|
|
322
|
+
# - URLs devem começar com http
|
|
323
|
+
# - Chaves devem ser longas o suficiente
|
|
324
|
+
# - Booleanos devem ser true/false
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
**Padrões de stub específicos para env:**
|
|
328
|
+
```bash
|
|
329
|
+
# SINAIS DE ALERTA - Estes são stubs:
|
|
330
|
+
DATABASE_URL=your-database-url-here
|
|
331
|
+
STRIPE_SECRET_KEY=sk_test_xxx
|
|
332
|
+
API_KEY=placeholder
|
|
333
|
+
NEXT_PUBLIC_API_URL=http://localhost:3000 # Ainda apontando para localhost em prod
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
**Verificação de conexão:**
|
|
337
|
+
```bash
|
|
338
|
+
# Variável é realmente usada no código
|
|
339
|
+
grep -r "process\.env\.$VAR_NAME|env\.$VAR_NAME" src/ --include="*.ts" --include="*.tsx"
|
|
340
|
+
|
|
341
|
+
# Variável está no schema de validação (se usando zod/etc para env)
|
|
342
|
+
grep -E "$VAR_NAME" src/env.ts src/env.mjs 2>/dev/null
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
</environment_config>
|
|
346
|
+
|
|
347
|
+
<wiring_verification>
|
|
348
|
+
|
|
349
|
+
## Padrões de Verificação de Conexão
|
|
350
|
+
|
|
351
|
+
A verificação de conexão verifica se os componentes realmente se comunicam. É onde a maioria dos stubs se esconde.
|
|
352
|
+
|
|
353
|
+
### Padrão: Componente → API
|
|
354
|
+
|
|
355
|
+
**Verificação:** O componente realmente chama a API?
|
|
356
|
+
|
|
357
|
+
```bash
|
|
358
|
+
# Encontrar a chamada fetch/axios
|
|
359
|
+
grep -E "fetch\(['\"].*$api_path|axios\.(get|post).*$api_path" "$component_path"
|
|
360
|
+
|
|
361
|
+
# Verificar se não está comentado
|
|
362
|
+
grep -E "fetch\(|axios\." "$component_path" | grep -v "^.*//.*fetch"
|
|
363
|
+
|
|
364
|
+
# Verificar se a resposta é usada
|
|
365
|
+
grep -E "await.*fetch|\.then\(|setData|setState" "$component_path"
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
**Sinais de alerta:**
|
|
369
|
+
```typescript
|
|
370
|
+
// Fetch existe mas resposta ignorada:
|
|
371
|
+
fetch('/api/messages') // Sem await, sem .then, sem atribuição
|
|
372
|
+
|
|
373
|
+
// Fetch comentado:
|
|
374
|
+
// fetch('/api/messages').then(r => r.json()).then(setMessages)
|
|
375
|
+
|
|
376
|
+
// Fetch para endpoint errado:
|
|
377
|
+
fetch('/api/message') // Typo - deveria ser /api/messages
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### Padrão: API → Banco de Dados
|
|
381
|
+
|
|
382
|
+
**Verificação:** A rota de API realmente faz query no banco?
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
# Encontrar a chamada ao banco
|
|
386
|
+
grep -E "prisma\.$model|db\.query|Model\.find" "$route_path"
|
|
387
|
+
|
|
388
|
+
# Verificar se é awaited
|
|
389
|
+
grep -E "await.*prisma|await.*db\." "$route_path"
|
|
390
|
+
|
|
391
|
+
# Verificar se resultado é retornado
|
|
392
|
+
grep -E "return.*json.*data|res\.json.*result" "$route_path"
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
**Sinais de alerta:**
|
|
396
|
+
```typescript
|
|
397
|
+
// Query existe mas resultado não é retornado:
|
|
398
|
+
await prisma.message.findMany()
|
|
399
|
+
return Response.json({ ok: true }) // Retorna estático, não resultado da query
|
|
400
|
+
|
|
401
|
+
// Query sem await:
|
|
402
|
+
const messages = prisma.message.findMany() // Await ausente
|
|
403
|
+
return Response.json(messages) // Retorna Promise, não dados
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
### Padrão: Formulário → Handler
|
|
407
|
+
|
|
408
|
+
**Verificação:** O envio do formulário realmente faz algo?
|
|
409
|
+
|
|
410
|
+
```bash
|
|
411
|
+
# Encontrar handler onSubmit
|
|
412
|
+
grep -E "onSubmit=\{|handleSubmit" "$component_path"
|
|
413
|
+
|
|
414
|
+
# Verificar se handler tem conteúdo
|
|
415
|
+
grep -A 10 "onSubmit.*=" "$component_path" | grep -E "fetch|axios|mutate|dispatch"
|
|
416
|
+
|
|
417
|
+
# Verificar se não é apenas preventDefault
|
|
418
|
+
grep -A 5 "onSubmit" "$component_path" | grep -v "only.*preventDefault" -i
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
**Sinais de alerta:**
|
|
422
|
+
```typescript
|
|
423
|
+
// Handler apenas previne o padrão:
|
|
424
|
+
onSubmit={(e) => e.preventDefault()}
|
|
425
|
+
|
|
426
|
+
// Handler apenas loga:
|
|
427
|
+
const handleSubmit = (data) => {
|
|
428
|
+
console.log(data)
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// Handler vazio:
|
|
432
|
+
onSubmit={() => {}}
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### Padrão: Estado → Render
|
|
436
|
+
|
|
437
|
+
**Verificação:** O componente renderiza estado, não conteúdo codificado?
|
|
438
|
+
|
|
439
|
+
```bash
|
|
440
|
+
# Encontrar uso de estado no JSX
|
|
441
|
+
grep -E "\{.*messages.*\}|\{.*data.*\}|\{.*items.*\}" "$component_path"
|
|
442
|
+
|
|
443
|
+
# Verificar map/render do estado
|
|
444
|
+
grep -E "\.map\(|\.filter\(|\.reduce\(" "$component_path"
|
|
445
|
+
|
|
446
|
+
# Verificar conteúdo dinâmico
|
|
447
|
+
grep -E "\{[a-zA-Z_]+\." "$component_path" # Interpolação de variável
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
**Sinais de alerta:**
|
|
451
|
+
```tsx
|
|
452
|
+
// Codificado em vez de estado:
|
|
453
|
+
return <div>
|
|
454
|
+
<p>Mensagem 1</p>
|
|
455
|
+
<p>Mensagem 2</p>
|
|
456
|
+
</div>
|
|
457
|
+
|
|
458
|
+
// Estado existe mas não é renderizado:
|
|
459
|
+
const [messages, setMessages] = useState([])
|
|
460
|
+
return <div>Sem mensagens</div> // Sempre mostra "sem mensagens"
|
|
461
|
+
|
|
462
|
+
// Estado errado renderizado:
|
|
463
|
+
const [messages, setMessages] = useState([])
|
|
464
|
+
return <div>{otherData.map(...)}</div> // Usa dados diferentes
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
</wiring_verification>
|
|
468
|
+
|
|
469
|
+
<verification_checklist>
|
|
470
|
+
|
|
471
|
+
## Checklist Rápido de Verificação
|
|
472
|
+
|
|
473
|
+
Para cada tipo de artefato, percorra este checklist:
|
|
474
|
+
|
|
475
|
+
### Checklist de Componente
|
|
476
|
+
- [ ] Arquivo existe no caminho esperado
|
|
477
|
+
- [ ] Exporta um componente função/const
|
|
478
|
+
- [ ] Retorna JSX (não null/vazio)
|
|
479
|
+
- [ ] Sem texto placeholder no render
|
|
480
|
+
- [ ] Usa props ou estado (não estático)
|
|
481
|
+
- [ ] Event handlers têm implementações reais
|
|
482
|
+
- [ ] Imports resolvem corretamente
|
|
483
|
+
- [ ] Usado em algum lugar no app
|
|
484
|
+
|
|
485
|
+
### Checklist de Rota de API
|
|
486
|
+
- [ ] Arquivo existe no caminho esperado
|
|
487
|
+
- [ ] Exporta handlers de métodos HTTP
|
|
488
|
+
- [ ] Handlers têm mais de 5 linhas
|
|
489
|
+
- [ ] Faz query no banco ou serviço
|
|
490
|
+
- [ ] Retorna resposta significativa (não vazia/placeholder)
|
|
491
|
+
- [ ] Tem tratamento de erros
|
|
492
|
+
- [ ] Valida entrada
|
|
493
|
+
- [ ] Chamado do frontend
|
|
494
|
+
|
|
495
|
+
### Checklist de Schema
|
|
496
|
+
- [ ] Modelo/tabela definido
|
|
497
|
+
- [ ] Tem todos os campos esperados
|
|
498
|
+
- [ ] Campos têm tipos apropriados
|
|
499
|
+
- [ ] Relacionamentos definidos se necessário
|
|
500
|
+
- [ ] Migrações existem e aplicadas
|
|
501
|
+
- [ ] Client gerado
|
|
502
|
+
|
|
503
|
+
### Checklist de Hook/Utilitário
|
|
504
|
+
- [ ] Arquivo existe no caminho esperado
|
|
505
|
+
- [ ] Exporta função
|
|
506
|
+
- [ ] Tem implementação significativa (não retornos vazios)
|
|
507
|
+
- [ ] Usado em algum lugar no app
|
|
508
|
+
- [ ] Valores de retorno consumidos
|
|
509
|
+
|
|
510
|
+
### Checklist de Conexão
|
|
511
|
+
- [ ] Componente → API: chamada fetch/axios existe e usa a resposta
|
|
512
|
+
- [ ] API → Banco: query existe e resultado é retornado
|
|
513
|
+
- [ ] Formulário → Handler: onSubmit chama API/mutation
|
|
514
|
+
- [ ] Estado → Render: variáveis de estado aparecem no JSX
|
|
515
|
+
|
|
516
|
+
</verification_checklist>
|
|
517
|
+
|
|
518
|
+
<automated_verification_script>
|
|
519
|
+
|
|
520
|
+
## Abordagem de Verificação Automatizada
|
|
521
|
+
|
|
522
|
+
Para o subagente de verificação, use este padrão:
|
|
523
|
+
|
|
524
|
+
```bash
|
|
525
|
+
# 1. Verificar existência
|
|
526
|
+
check_exists() {
|
|
527
|
+
[ -f "$1" ] && echo "EXISTS: $1" || echo "MISSING: $1"
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
# 2. Verificar padrões de stub
|
|
531
|
+
check_stubs() {
|
|
532
|
+
local file="$1"
|
|
533
|
+
local stubs=$(grep -c -E "TODO|FIXME|placeholder|not implemented" "$file" 2>/dev/null || echo 0)
|
|
534
|
+
[ "$stubs" -gt 0 ] && echo "STUB_PATTERNS: $stubs in $file"
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
# 3. Verificar conexão (componente chama API)
|
|
538
|
+
check_wiring() {
|
|
539
|
+
local component="$1"
|
|
540
|
+
local api_path="$2"
|
|
541
|
+
grep -q "$api_path" "$component" && echo "WIRED: $component → $api_path" || echo "NOT_WIRED: $component → $api_path"
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
# 4. Verificar substantivo (mais de N linhas, tem padrões esperados)
|
|
545
|
+
check_substantive() {
|
|
546
|
+
local file="$1"
|
|
547
|
+
local min_lines="$2"
|
|
548
|
+
local pattern="$3"
|
|
549
|
+
local lines=$(wc -l < "$file" 2>/dev/null || echo 0)
|
|
550
|
+
local has_pattern=$(grep -c -E "$pattern" "$file" 2>/dev/null || echo 0)
|
|
551
|
+
[ "$lines" -ge "$min_lines" ] && [ "$has_pattern" -gt 0 ] && echo "SUBSTANTIVE: $file" || echo "THIN: $file ($lines lines, $has_pattern matches)"
|
|
552
|
+
}
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
Execute estas verificações em cada artefato must-have. Agregue os resultados no VERIFICATION.md.
|
|
556
|
+
|
|
557
|
+
</automated_verification_script>
|
|
558
|
+
|
|
559
|
+
<human_verification_triggers>
|
|
560
|
+
|
|
561
|
+
## Quando Requerer Verificação Humana
|
|
562
|
+
|
|
563
|
+
Algumas coisas não podem ser verificadas programaticamente. Sinalize para teste humano:
|
|
564
|
+
|
|
565
|
+
**Sempre humano:**
|
|
566
|
+
- Aparência visual (parece certo?)
|
|
567
|
+
- Conclusão do fluxo do usuário (você consegue realmente fazer a coisa?)
|
|
568
|
+
- Comportamento em tempo real (WebSocket, SSE)
|
|
569
|
+
- Integração com serviço externo (Stripe, envio de email)
|
|
570
|
+
- Clareza da mensagem de erro (a mensagem é útil?)
|
|
571
|
+
- Sensação de desempenho (parece rápido?)
|
|
572
|
+
|
|
573
|
+
**Humano se incerto:**
|
|
574
|
+
- Conexão complexa que grep não consegue rastrear
|
|
575
|
+
- Comportamento dinâmico dependendo do estado
|
|
576
|
+
- Casos extremos e estados de erro
|
|
577
|
+
- Responsividade mobile
|
|
578
|
+
- Acessibilidade
|
|
579
|
+
|
|
580
|
+
**Formato para requisição de verificação humana:**
|
|
581
|
+
```markdown
|
|
582
|
+
## Verificação Humana Necessária
|
|
583
|
+
|
|
584
|
+
### 1. Envio de mensagem no chat
|
|
585
|
+
**Teste:** Digite uma mensagem e clique em Enviar
|
|
586
|
+
**Esperado:** Mensagem aparece na lista, input limpa
|
|
587
|
+
**Verificar:** A mensagem persiste após atualizar?
|
|
588
|
+
|
|
589
|
+
### 2. Tratamento de erros
|
|
590
|
+
**Teste:** Desconecte a rede, tente enviar
|
|
591
|
+
**Esperado:** Mensagem de erro aparece, mensagem não é perdida
|
|
592
|
+
**Verificar:** É possível tentar novamente após reconectar?
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
</human_verification_triggers>
|
|
596
|
+
|
|
597
|
+
<checkpoint_automation_reference>
|
|
598
|
+
|
|
599
|
+
## Automação Pré-Checkpoint
|
|
600
|
+
|
|
601
|
+
Para padrões de checkpoint com automação em primeiro lugar, gerenciamento do ciclo de vida do servidor, tratamento de instalação de CLI e protocolos de recuperação de erros, consulte:
|
|
602
|
+
|
|
603
|
+
**@./.claude/framework/references/checkpoints.md** → seção `<automation_reference>`
|
|
604
|
+
|
|
605
|
+
Princípios chave:
|
|
606
|
+
- Claude configura o ambiente de verificação ANTES de apresentar checkpoints
|
|
607
|
+
- Usuários nunca executam comandos CLI (apenas visitam URLs)
|
|
608
|
+
- Ciclo de vida do servidor: inicie antes do checkpoint, trate conflitos de porta, mantenha em execução durante a duração
|
|
609
|
+
- Instalação de CLI: instale automaticamente onde for seguro, checkpoint para escolha do usuário caso contrário
|
|
610
|
+
- Tratamento de erros: corrija o ambiente quebrado antes do checkpoint, nunca apresente checkpoint com configuração falhada
|
|
611
|
+
|
|
612
|
+
</checkpoint_automation_reference>
|