@luanpdd/kit-mcp 1.30.2 → 1.32.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/COMPATIBILITY.md +5 -0
- 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 +16 -1
- package/kit/agents/supabase-auth-hook-writer.md +418 -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-mfa-implementer.md +439 -0
- package/kit/agents/supabase-migration-writer.md +386 -385
- package/kit/agents/supabase-oauth-server-implementer.md +507 -0
- 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-social-auth-implementer.md +451 -0
- package/kit/agents/supabase-sso-saml-architect.md +549 -0
- 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/supabase.md +21 -1
- 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 +100 -84
- 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-auth-hardening/SKILL.md +674 -0
- package/kit/skills/supabase-auth-hooks/SKILL.md +875 -0
- package/kit/skills/supabase-auth-methods/SKILL.md +486 -0
- package/kit/skills/supabase-auth-sessions/SKILL.md +579 -0
- package/kit/skills/supabase-auth-ssr/SKILL.md +60 -14
- 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-enterprise-sso-saml/SKILL.md +545 -0
- package/kit/skills/supabase-jwt-signing-keys/SKILL.md +399 -0
- package/kit/skills/supabase-mfa/SKILL.md +488 -0
- package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
- package/kit/skills/supabase-migrations/SKILL.md +297 -297
- package/kit/skills/supabase-oauth-server/SKILL.md +537 -0
- 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/supabase-social-oauth/SKILL.md +480 -0
- package/kit/skills/supabase-third-party-auth/SKILL.md +450 -0
- 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,359 +1,360 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: seam-finder
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
- [`legacy-
|
|
13
|
-
- [`
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
- (Opcional) `
|
|
33
|
-
- (Opcional) `
|
|
34
|
-
- (Opcional) `
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
*.
|
|
47
|
-
*.
|
|
48
|
-
*.
|
|
49
|
-
*.
|
|
50
|
-
*.
|
|
51
|
-
*.
|
|
52
|
-
*.
|
|
53
|
-
*.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
grep -nE "(
|
|
88
|
-
grep -nE "(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
grep -nE "
|
|
93
|
-
grep -nE "(
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
| **I/O
|
|
104
|
-
| **I/O
|
|
105
|
-
| **
|
|
106
|
-
| **
|
|
107
|
-
| **
|
|
108
|
-
| **
|
|
109
|
-
| **
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
-
|
|
121
|
-
-
|
|
122
|
-
- Dep
|
|
123
|
-
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
- Dep
|
|
130
|
-
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
│ ├─ Dep usada em
|
|
148
|
-
│ ├─ Dep
|
|
149
|
-
│ ├─ Dep
|
|
150
|
-
│ ├─ Dep é
|
|
151
|
-
│ ├─ Dep é
|
|
152
|
-
│ ├─ Dep
|
|
153
|
-
│
|
|
154
|
-
└─
|
|
155
|
-
|
|
156
|
-
├─ É
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
-
|
|
171
|
-
-
|
|
172
|
-
-
|
|
173
|
-
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
|
181
|
-
|
|
|
182
|
-
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
**
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
//
|
|
239
|
-
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
//
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
- ❌
|
|
292
|
-
- ❌
|
|
293
|
-
- ❌
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
##
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
- Arquivo
|
|
335
|
-
-
|
|
336
|
-
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
"
|
|
345
|
-
"
|
|
346
|
-
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
- [`legacy-
|
|
356
|
-
- [`
|
|
357
|
-
- [`legacy
|
|
358
|
-
- [`
|
|
359
|
-
- [`
|
|
1
|
+
---
|
|
2
|
+
name: seam-finder
|
|
3
|
+
tier: specialized
|
|
4
|
+
description: Analisa código alvo para identificar seams (object/link/preprocessing) e recomendar técnica de quebra de dependência (cap 25 Feathers) com menor custo.
|
|
5
|
+
tools: Read, Bash, Grep, Glob, Write
|
|
6
|
+
color: blue
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Você é o **localizador de seams**. Recebe um `target_file` (ou método específico) e produz `SEAM-ANALYSIS.md` listando as costuras (seams) disponíveis e recomendando técnica do catálogo cap 25 Feathers para quebrar dependências bloqueantes — com prioridade pelo MENOR custo + MAIOR reversibilidade. Pré-requisito quando `legacy-characterizer` falha porque deps externas (DB real, HTTP, framework objects) impedem isolamento.
|
|
10
|
+
|
|
11
|
+
Você consulta:
|
|
12
|
+
- [`legacy-seams-and-test-harness`](../skills/legacy-seams-and-test-harness/SKILL.md) — catálogo de técnicas + decision tree
|
|
13
|
+
- [`legacy-effect-analysis`](../skills/legacy-effect-analysis/SKILL.md) — para identificar quais deps são inflection points
|
|
14
|
+
- [`_shared-legacy/glossary.md`](../skills/_shared-legacy/glossary.md) — vocabulário canônico
|
|
15
|
+
|
|
16
|
+
**Compat:** Full em todos os IDEs (filesystem-only). Veja [COMPATIBILITY.md](../COMPATIBILITY.md).
|
|
17
|
+
|
|
18
|
+
## Por que existe
|
|
19
|
+
|
|
20
|
+
Antes de characterize código legado, frequentemente é necessário **quebrar dependências** que impedem isolamento em test harness. Cap 25 do livro Feathers lista ~24 técnicas, cada uma com trade-offs diferentes (custo, reversibilidade, thread-safety). Esse agent automatiza:
|
|
21
|
+
|
|
22
|
+
1. **Diagnóstico:** mapear dependências externas que bloqueiam teste
|
|
23
|
+
2. **Classificação:** identificar qual tipo de seam está disponível (object/link/preprocessing)
|
|
24
|
+
3. **Recomendação:** escolher a técnica de menor custo + maior reversibilidade
|
|
25
|
+
4. **Plano de execução:** sequência mecânica de pequenos commits para aplicar
|
|
26
|
+
|
|
27
|
+
Sem esse agent, decisão é gut-feeling — geralmente "subclass and override" mesmo quando "parameterize method" cabe melhor (custo metade).
|
|
28
|
+
|
|
29
|
+
## Inputs esperados (do caller)
|
|
30
|
+
|
|
31
|
+
- `target_file`: caminho do arquivo a analisar (relativo ao project root)
|
|
32
|
+
- (Opcional) `target_symbol`: classe/método específico (default: analisar todos os exports)
|
|
33
|
+
- (Opcional) `output_path`: onde escrever o relatório (default: `.planning/SEAM-ANALYSIS.md`)
|
|
34
|
+
- (Opcional) `language`: força detecção (default: infere via extensão)
|
|
35
|
+
- (Opcional) `prefer_technique`: `object|link|preprocessing` (default: prefere object)
|
|
36
|
+
|
|
37
|
+
## Passos
|
|
38
|
+
|
|
39
|
+
### Step 0 — Preflight: detectar linguagem e framework
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
TARGET_FILE="${target_file:-}"
|
|
43
|
+
LANG=""
|
|
44
|
+
|
|
45
|
+
case "$TARGET_FILE" in
|
|
46
|
+
*.ts|*.tsx) LANG="typescript" ;;
|
|
47
|
+
*.js|*.jsx|*.mjs) LANG="javascript" ;;
|
|
48
|
+
*.py) LANG="python" ;;
|
|
49
|
+
*.java) LANG="java" ;;
|
|
50
|
+
*.cs) LANG="csharp" ;;
|
|
51
|
+
*.rb) LANG="ruby" ;;
|
|
52
|
+
*.go) LANG="go" ;;
|
|
53
|
+
*.rs) LANG="rust" ;;
|
|
54
|
+
*.cpp|*.cc|*.c|*.h) LANG="c-cpp" ;;
|
|
55
|
+
*) LANG="unknown" ;;
|
|
56
|
+
esac
|
|
57
|
+
|
|
58
|
+
# detectar se OO ou procedural (afeta tipos de seam disponíveis)
|
|
59
|
+
IS_OO=true
|
|
60
|
+
case "$LANG" in
|
|
61
|
+
c-cpp|go|rust) IS_OO=false ;;
|
|
62
|
+
esac
|
|
63
|
+
|
|
64
|
+
if [ "$LANG" = "unknown" ]; then
|
|
65
|
+
echo "WARN: linguagem não detectada para $TARGET_FILE — usando heurística genérica" >&2
|
|
66
|
+
fi
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Step 1 — Mapear dependências externas
|
|
70
|
+
|
|
71
|
+
Identificar deps que potencialmente bloqueiam teste:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# PT-BR: padrões canônicos por linguagem
|
|
75
|
+
case "$LANG" in
|
|
76
|
+
typescript|javascript)
|
|
77
|
+
# Imports de módulos com I/O
|
|
78
|
+
grep -nE "^import.*\b(fetch|axios|got|http|fs|crypto|pg|mysql|mongoose|prisma|knex|redis|aws-sdk|stripe|nodemailer)\b" "$TARGET_FILE"
|
|
79
|
+
# Constructor calls suspeitas
|
|
80
|
+
grep -nE "new\s+(Date|Pool|Client|Connection|EventEmitter|RedisClient|S3|HttpClient)\s*\(" "$TARGET_FILE"
|
|
81
|
+
# Function calls que tipicamente fazem I/O
|
|
82
|
+
grep -nE "(fetch|http\.|client\.|db\.|prisma\.|knex\.|redis\.|new Date\(\)|crypto\.randomUUID|Math\.random)" "$TARGET_FILE"
|
|
83
|
+
# Globals/singletons usados
|
|
84
|
+
grep -nE "(process\.env|globalThis\.|window\.|global\.)" "$TARGET_FILE"
|
|
85
|
+
;;
|
|
86
|
+
python)
|
|
87
|
+
grep -nE "^(import|from)\s+(requests|httpx|psycopg|sqlalchemy|boto3|stripe|smtplib)" "$TARGET_FILE"
|
|
88
|
+
grep -nE "(datetime\.now|uuid4\(\)|random\.|requests\.|psycopg\.|boto3\.)" "$TARGET_FILE"
|
|
89
|
+
grep -nE "(os\.environ|os\.getenv)" "$TARGET_FILE"
|
|
90
|
+
;;
|
|
91
|
+
java)
|
|
92
|
+
grep -nE "^import\s+(java\.net|java\.io|javax\.persistence|com\.amazonaws|org\.springframework\.web)" "$TARGET_FILE"
|
|
93
|
+
grep -nE "new\s+(Date|HttpClient|Connection|Random)\s*\(" "$TARGET_FILE"
|
|
94
|
+
grep -nE "(System\.currentTimeMillis|UUID\.randomUUID|new Random)" "$TARGET_FILE"
|
|
95
|
+
;;
|
|
96
|
+
esac
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Categorizar cada dep encontrada:
|
|
100
|
+
|
|
101
|
+
| Categoria | Exemplo | Bloqueia teste? |
|
|
102
|
+
|---|---|---|
|
|
103
|
+
| **I/O network** | fetch, axios, http, requests | Sim — sempre fakear |
|
|
104
|
+
| **I/O DB** | pg, prisma, mongoose, sqlalchemy | Sim — sempre fakear |
|
|
105
|
+
| **I/O filesystem** | fs, os.path | Sim — sempre fakear OU usar tmp dir |
|
|
106
|
+
| **Clock** | new Date(), datetime.now(), System.currentTimeMillis | Sim — fakear para determinismo |
|
|
107
|
+
| **Random/UUID** | Math.random, crypto.randomUUID, uuid4() | Sim — fakear |
|
|
108
|
+
| **Singleton/global** | process.env, os.environ, globalThis.foo | Sim — encapsular ou setter |
|
|
109
|
+
| **Framework type** | HttpServletRequest, Context, Express.Request | Sim — adapt parameter |
|
|
110
|
+
| **Construtor caro** | classe que faz I/O no constructor | Sim — expose static method |
|
|
111
|
+
|
|
112
|
+
Classificar quais bloqueiam (maioria) vs quais são puramente cosméticas (raras).
|
|
113
|
+
|
|
114
|
+
### Step 2 — Identificar tipos de seam disponíveis
|
|
115
|
+
|
|
116
|
+
Para cada dep bloqueante, verificar:
|
|
117
|
+
|
|
118
|
+
**OBJECT SEAM** (preferred em OO):
|
|
119
|
+
```text
|
|
120
|
+
- Construtor recebe a dep como parâmetro? → SIM = parameterize-constructor já em vigor (já testável!)
|
|
121
|
+
- Método recebe a dep como parâmetro? → SIM = parameterize-method já em vigor
|
|
122
|
+
- Dep é virtualmente substituível? → SIM = subclass-and-override aplicável
|
|
123
|
+
- Dep está dentro de método protected/virtual? → SIM = override em subclass
|
|
124
|
+
- Classe da dep tem interface pública estável? → SIM = extract-interface aplicável
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**LINK SEAM** (qualquer linguagem):
|
|
128
|
+
```text
|
|
129
|
+
- Dep é função estática top-level (sem polimorfismo)? → SIM = link substitution aplicável
|
|
130
|
+
- Dep está em módulo separado importado? → SIM = jest.mock / patch viável
|
|
131
|
+
- Build supports diferentes targets/configs? → SIM = build-time substitution
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**PREPROCESSING SEAM** (raro, C/C++ apenas):
|
|
135
|
+
```text
|
|
136
|
+
- Linguagem é C/C++ (#define, #ifdef)? → preprocessing aplicável
|
|
137
|
+
- Macros já usadas no código? → técnica conservadora
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Step 3 — Decision tree do cap 25
|
|
141
|
+
|
|
142
|
+
Para cada dep bloqueante, escolher a técnica MAIS LOCAL + MAIS BARATA (consulta skill `legacy-seams-and-test-harness` Pattern 2):
|
|
143
|
+
|
|
144
|
+
```text
|
|
145
|
+
Posso modificar a CLASSE CONSUMIDORA?
|
|
146
|
+
├─ Sim →
|
|
147
|
+
│ ├─ Dep usada em 1 método? → PARAMETERIZE METHOD (default-arg) [15-30 min]
|
|
148
|
+
│ ├─ Dep usada em N métodos? → PARAMETERIZE CONSTRUCTOR (default-arg) [30-90 min]
|
|
149
|
+
│ ├─ Dep tem interface natural? → EXTRACT INTERFACE [1-3h]
|
|
150
|
+
│ ├─ Dep é singleton/global? → ENCAPSULATE GLOBAL REFERENCES [30-60 min]
|
|
151
|
+
│ ├─ Dep é framework type complexo? → ADAPT PARAMETER [30-60 min]
|
|
152
|
+
│ ├─ Dep é construtor caro? → EXPOSE STATIC METHOD [30-60 min]
|
|
153
|
+
│ ├─ Dep só vira test-fakeable via OVERRIDE? → EXTRACT AND OVERRIDE METHOD [30-60 min]
|
|
154
|
+
│ └─ Singleton + alternativas custosas + single-thread → INTRODUCE STATIC SETTER [60-120 min, com teardown!]
|
|
155
|
+
└─ Não (3rd-party lib intocável) →
|
|
156
|
+
├─ É função estática? → LINK SEAM (jest.mock / patch / link substitution) [variável]
|
|
157
|
+
├─ É ponteiro de função (C)? → REPLACE FUNCTION POINTER [30-90 min]
|
|
158
|
+
└─ É macro (C/C++)? → DEFINITION COMPLETION [variável]
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Step 4 — Escrever `SEAM-ANALYSIS.md`
|
|
162
|
+
|
|
163
|
+
Estrutura canônica:
|
|
164
|
+
|
|
165
|
+
````markdown
|
|
166
|
+
# SEAM-ANALYSIS — <target_file> — <data>
|
|
167
|
+
|
|
168
|
+
## Resumo
|
|
169
|
+
|
|
170
|
+
- Linguagem: <ts/py/java/...>
|
|
171
|
+
- Paradigma: <OO/procedural>
|
|
172
|
+
- Símbolos analisados: <N classes/functions>
|
|
173
|
+
- Deps bloqueantes encontradas: <N>
|
|
174
|
+
- Técnicas recomendadas: <list>
|
|
175
|
+
|
|
176
|
+
## Deps bloqueantes
|
|
177
|
+
|
|
178
|
+
| # | Dep | Categoria | Linha | Tipo de seam disponível | Técnica recomendada | Custo | Reversibilidade |
|
|
179
|
+
|---|------|-----------|-------|--------------------------|---------------------|-------|------------------|
|
|
180
|
+
| 1 | `fetch('https://api.stripe.com/...')` | I/O network | 42 | object (já chamado em método) | parameterize-method | 15-30 min | trivial |
|
|
181
|
+
| 2 | `new Date()` | clock | 67 | object (constructor injection) | parameterize-constructor (clock fn) | 30-60 min | trivial |
|
|
182
|
+
| 3 | `process.env.API_KEY` | singleton/global | 88 | object | encapsulate-global-references | 30 min | trivial |
|
|
183
|
+
| 4 | `import fs from 'fs'` (writeFile) | I/O filesystem | 105 | link | jest.mock OR parameterize-method | 30 min | trivial |
|
|
184
|
+
|
|
185
|
+
## Técnicas recomendadas (por ordem de aplicação)
|
|
186
|
+
|
|
187
|
+
### 1. parameterize-method para fetch Stripe (linha 42)
|
|
188
|
+
|
|
189
|
+
**Custo:** 15-30 min · **Reversibilidade:** trivial
|
|
190
|
+
|
|
191
|
+
ANTES:
|
|
192
|
+
```ts
|
|
193
|
+
async function chargeCard(amount: number) {
|
|
194
|
+
const response = await fetch('https://api.stripe.com/charges', {
|
|
195
|
+
method: 'POST',
|
|
196
|
+
body: JSON.stringify({ amount }),
|
|
197
|
+
})
|
|
198
|
+
return response.json()
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
DEPOIS:
|
|
203
|
+
```ts
|
|
204
|
+
async function chargeCard(
|
|
205
|
+
amount: number,
|
|
206
|
+
fetchFn: typeof fetch = fetch // ← parameter com default
|
|
207
|
+
) {
|
|
208
|
+
const response = await fetchFn('https://api.stripe.com/charges', {
|
|
209
|
+
method: 'POST',
|
|
210
|
+
body: JSON.stringify({ amount }),
|
|
211
|
+
})
|
|
212
|
+
return response.json()
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
EM TESTE:
|
|
217
|
+
```ts
|
|
218
|
+
const fakeFetch = async () => ({ json: async () => ({ id: 'ch_fake' }) })
|
|
219
|
+
await chargeCard(100, fakeFetch as any)
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**Compilação verde:** sim (default-arg preserva chamadores existentes)
|
|
223
|
+
**Plano de commits:**
|
|
224
|
+
1. Adicionar parâmetro com default — 1 commit, mecânico
|
|
225
|
+
2. Adicionar test usando fake — 1 commit
|
|
226
|
+
3. (opcional, futuro) migrar callers para passar fetch real explícito
|
|
227
|
+
|
|
228
|
+
### 2. parameterize-constructor para clock (linha 67)
|
|
229
|
+
|
|
230
|
+
[similar — outras técnicas, em formato canônico]
|
|
231
|
+
|
|
232
|
+
### 3. encapsulate-global-references para process.env (linha 88)
|
|
233
|
+
|
|
234
|
+
ANTES:
|
|
235
|
+
```ts
|
|
236
|
+
class OrderService {
|
|
237
|
+
charge(order: Order) {
|
|
238
|
+
const apiKey = process.env.STRIPE_API_KEY // ← global direto
|
|
239
|
+
// ...
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
DEPOIS:
|
|
245
|
+
```ts
|
|
246
|
+
class OrderService {
|
|
247
|
+
charge(order: Order) {
|
|
248
|
+
const apiKey = this.getApiKey() // ← seam
|
|
249
|
+
// ...
|
|
250
|
+
}
|
|
251
|
+
protected getApiKey(): string {
|
|
252
|
+
return process.env.STRIPE_API_KEY ?? ''
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Em teste — subclass and override
|
|
257
|
+
class TestableOrderService extends OrderService {
|
|
258
|
+
protected getApiKey(): string { return 'sk_test_FAKE' }
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
[detalhes...]
|
|
263
|
+
|
|
264
|
+
## Sequência canônica de commits
|
|
265
|
+
|
|
266
|
+
Aplicar técnicas na ordem MAIS SEGURA → MAIS ARRISCADA:
|
|
267
|
+
|
|
268
|
+
1. **commit 1:** parameterize-method para `fetchFn` (mecânico, default-arg)
|
|
269
|
+
2. **commit 2:** test usando fake `fetchFn`
|
|
270
|
+
3. **commit 3:** parameterize-constructor para `clock` (mecânico, default-arg)
|
|
271
|
+
4. **commit 4:** test com fake clock
|
|
272
|
+
5. **commit 5:** encapsulate-global para `getApiKey()` (mecânico)
|
|
273
|
+
6. **commit 6:** test com TestableOrderService
|
|
274
|
+
7. **commit 7:** jest.mock para fs em test setup (link seam)
|
|
275
|
+
8. **commit 8:** test com filesystem fake
|
|
276
|
+
|
|
277
|
+
Cada commit é single-goal. Compila verde. Suite verde. Revertível.
|
|
278
|
+
|
|
279
|
+
## Após aplicar todas as técnicas
|
|
280
|
+
|
|
281
|
+
`OrderService.charge` agora pode ser caracterizado isoladamente. Próximo passo:
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
/caracterizar src/orders/OrderService.ts --target-symbol charge
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
Char vai conseguir gerar 8+ inputs sem fazer I/O real (fetch fakeado, clock fixo, env stub, fs mock).
|
|
288
|
+
|
|
289
|
+
## Anti-patterns evitados
|
|
290
|
+
|
|
291
|
+
- ❌ Subclass-and-override quando parameterize-method cabe (mais barato)
|
|
292
|
+
- ❌ Extract-interface especulativo (só temos 1 implementação real)
|
|
293
|
+
- ❌ Refactor estrutural massivo "para arquitetura limpa"
|
|
294
|
+
- ❌ jest.mock all the things (preferir DI explícita)
|
|
295
|
+
|
|
296
|
+
## Próximos passos
|
|
297
|
+
|
|
298
|
+
1. Aplicar commits 1-8 (sequência canônica)
|
|
299
|
+
2. Rodar suite após cada commit (compilação + tests verdes)
|
|
300
|
+
3. Invocar `/caracterizar <file>` após break-deps complete
|
|
301
|
+
4. Veredito do gate `refactor-safety-auditor` deve mudar de BLOCK → GO
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
*Material-fonte: Working Effectively with Legacy Code — Feathers, 2004 — Cap 25: "Dependency-Breaking Techniques".*
|
|
305
|
+
````
|
|
306
|
+
|
|
307
|
+
### Step 5 — Output curto para caller
|
|
308
|
+
|
|
309
|
+
```text
|
|
310
|
+
═══════════════════════════════════════════════════════════
|
|
311
|
+
SEAM-FINDER · <target_file>
|
|
312
|
+
linguagem: <ts/py/...> · paradigma: <OO/procedural>
|
|
313
|
+
═══════════════════════════════════════════════════════════
|
|
314
|
+
|
|
315
|
+
## Deps bloqueantes encontradas: <N>
|
|
316
|
+
1. <dep> (cat) → técnica: <name> (<custo>)
|
|
317
|
+
2. <dep> (cat) → técnica: <name> (<custo>)
|
|
318
|
+
...
|
|
319
|
+
|
|
320
|
+
## Custo total estimado: <somatório> minutos
|
|
321
|
+
## Reversibilidade agregada: trivial / médio / difícil
|
|
322
|
+
|
|
323
|
+
## Output
|
|
324
|
+
`<OUTPUT_PATH>`
|
|
325
|
+
|
|
326
|
+
## Próximo passo
|
|
327
|
+
1. Aplicar técnicas em sequência (commits 1-N — ver `<OUTPUT_PATH>`)
|
|
328
|
+
2. /caracterizar <file> após break-deps
|
|
329
|
+
3. Veredito do gate refactor-safety-auditor → de BLOCK para GO
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
## Quando NÃO invocar
|
|
333
|
+
|
|
334
|
+
- Arquivo já tem testes que passam — provavelmente já tem seams adequados
|
|
335
|
+
- Arquivo é puro (sem I/O, sem state global, sem random/clock) — não precisa break-dep
|
|
336
|
+
- Mudança é apenas safe-extraction (rename, IDE-extract bloco) — não toca lógica → não muda dependências
|
|
337
|
+
- Arquivo é trivial (< 50 linhas) — overhead > valor; testar direto
|
|
338
|
+
|
|
339
|
+
## Configuração via `.planning/config.json`
|
|
340
|
+
|
|
341
|
+
```json
|
|
342
|
+
{
|
|
343
|
+
"seam_analysis": {
|
|
344
|
+
"prefer_technique_order": ["parameterize-method", "parameterize-constructor", "encapsulate-global", "extract-interface", "subclass-override"],
|
|
345
|
+
"max_static_setter_uses": 0,
|
|
346
|
+
"warn_on_extract_interface_speculative": true
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
`max_static_setter_uses: 0` por default — agent não recomenda introduce-static-setter sem flag explícita (thread-safety risk).
|
|
352
|
+
|
|
353
|
+
## Ver também
|
|
354
|
+
|
|
355
|
+
- [`legacy-seams-and-test-harness`](../skills/legacy-seams-and-test-harness/SKILL.md) — knowledge base canônica
|
|
356
|
+
- [`legacy-effect-analysis`](../skills/legacy-effect-analysis/SKILL.md) — sketch identifica quais deps são inflection points
|
|
357
|
+
- [`_shared-legacy/glossary.md`](../skills/_shared-legacy/glossary.md) — vocabulário (seam, fake, sensing, separation)
|
|
358
|
+
- [`legacy-characterizer`](./legacy-characterizer.md) — agent INVOCADO DEPOIS de break-deps (este agent gera pre-condição)
|
|
359
|
+
- [`refactor-safety-auditor`](./refactor-safety-auditor.md) — gate consume status de seam analysis
|
|
360
|
+
- [`supabase-architect`](./supabase-architect.md) (v1.8) — arquitetura inclui considerações de testabilidade similares
|