@polymorphism-tech/morph-spec 4.8.19 → 4.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/CLAUDE.md +21 -0
  2. package/README.md +2 -2
  3. package/bin/morph-spec.js +15 -56
  4. package/bin/task-manager.js +115 -14
  5. package/bin/validate.js +67 -33
  6. package/claude-plugin.json +1 -1
  7. package/docs/CHEATSHEET.md +201 -203
  8. package/docs/QUICKSTART.md +2 -2
  9. package/framework/CLAUDE.md +21 -0
  10. package/framework/agents.json +698 -176
  11. package/framework/hooks/claude-code/post-tool-use/context-refresh.js +1 -1
  12. package/framework/hooks/claude-code/post-tool-use/dispatch.js +2 -2
  13. package/framework/hooks/claude-code/post-tool-use/skill-reminder.js +155 -0
  14. package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +1 -1
  15. package/framework/hooks/claude-code/session-start/inject-morph-context.js +71 -2
  16. package/framework/hooks/claude-code/statusline.py +76 -30
  17. package/framework/hooks/claude-code/user-prompt/set-terminal-title.js +14 -6
  18. package/framework/hooks/shared/activity-logger.js +0 -24
  19. package/framework/hooks/shared/phase-utils.js +3 -0
  20. package/framework/hooks/shared/skill-reminder-helpers.js +79 -0
  21. package/framework/hooks/shared/stale-task-reset.js +57 -0
  22. package/framework/hooks/shared/state-reader.js +2 -2
  23. package/framework/hooks/shared/worktree-helpers.js +53 -0
  24. package/framework/phases.json +40 -8
  25. package/framework/skills/level-0-meta/brainstorming/SKILL.md +1 -1
  26. package/framework/skills/level-0-meta/code-review/SKILL.md +1 -1
  27. package/framework/skills/level-0-meta/code-review-nextjs/SKILL.md +163 -163
  28. package/framework/skills/level-0-meta/frontend-review/SKILL.md +5 -5
  29. package/framework/skills/level-0-meta/morph-checklist/SKILL.md +2 -2
  30. package/framework/skills/level-0-meta/morph-init/SKILL.md +5 -5
  31. package/framework/skills/level-0-meta/morph-replicate/SKILL.md +4 -4
  32. package/framework/skills/level-0-meta/morph-replicate/references/blazor-html-mapping.md +1 -1
  33. package/framework/skills/level-0-meta/post-implementation/SKILL.md +59 -12
  34. package/framework/skills/level-0-meta/simulation-checklist/SKILL.md +1 -1
  35. package/framework/skills/level-0-meta/terminal-title/SKILL.md +1 -1
  36. package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +1 -1
  37. package/framework/skills/level-0-meta/tool-usage-guide/references/tools-per-phase.md +6 -5
  38. package/framework/skills/level-0-meta/verification-before-completion/SKILL.md +1 -1
  39. package/framework/skills/level-1-workflows/phase-clarify/SKILL.md +215 -189
  40. package/framework/skills/level-1-workflows/phase-codebase-analysis/SKILL.md +251 -251
  41. package/framework/skills/level-1-workflows/phase-design/SKILL.md +382 -365
  42. package/framework/skills/level-1-workflows/phase-implement/SKILL.md +492 -450
  43. package/framework/skills/level-1-workflows/phase-setup/SKILL.md +194 -190
  44. package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +270 -270
  45. package/framework/skills/level-1-workflows/phase-uiux/SKILL.md +285 -285
  46. package/framework/standards/STANDARDS.json +640 -88
  47. package/framework/standards/infrastructure/vercel/vercel-database.md +106 -0
  48. package/framework/templates/REGISTRY.json +1825 -1909
  49. package/framework/templates/context/CONTEXT-FEATURE.md +276 -276
  50. package/framework/templates/docs/onboarding.md +1 -5
  51. package/package.json +2 -6
  52. package/src/commands/agents/dispatch-agents.js +55 -4
  53. package/src/commands/project/doctor.js +16 -47
  54. package/src/commands/project/init.js +1 -1
  55. package/src/commands/project/status.js +2 -2
  56. package/src/commands/project/update.js +381 -365
  57. package/src/commands/project/worktree.js +154 -0
  58. package/src/commands/state/advance-phase.js +120 -30
  59. package/src/commands/state/approve.js +2 -2
  60. package/src/commands/state/index.js +7 -8
  61. package/src/commands/state/phase-runner.js +1 -1
  62. package/src/commands/state/state.js +61 -6
  63. package/src/commands/tasks/task.js +78 -99
  64. package/src/commands/templates/template-render.js +93 -173
  65. package/src/commands/trust/trust.js +26 -21
  66. package/src/core/paths/output-schema.js +15 -0
  67. package/src/core/state/state-manager.js +28 -54
  68. package/src/core/workflows/workflow-detector.js +9 -87
  69. package/src/lib/phase-chain/phase-validator.js +330 -0
  70. package/src/lib/stack/stack-profile.js +88 -0
  71. package/src/lib/tasks/task-classifier.js +16 -0
  72. package/src/lib/tasks/test-runner.js +77 -0
  73. package/src/lib/trust/trust-manager.js +32 -144
  74. package/src/lib/validators/spec-validator.js +58 -4
  75. package/src/lib/validators/validation-runner.js +23 -11
  76. package/src/scripts/setup-infra.js +240 -224
  77. package/src/utils/agents-installer.js +2 -2
  78. package/src/utils/banner.js +1 -1
  79. package/src/utils/claude-settings-manager.js +1 -1
  80. package/src/utils/file-copier.js +1 -0
  81. package/src/utils/hooks-installer.js +258 -8
  82. package/framework/hooks/dev/check-sync-health.js +0 -117
  83. package/framework/hooks/dev/guard-version-numbers.js +0 -57
  84. package/framework/hooks/dev/sync-standards-registry.js +0 -60
  85. package/framework/hooks/dev/sync-template-registry.js +0 -60
  86. package/framework/hooks/dev/validate-skill-format.js +0 -70
  87. package/framework/hooks/dev/validate-standard-format.js +0 -73
  88. package/framework/templates/meta-prompts/hops/hop-retry.md +0 -78
  89. package/framework/templates/meta-prompts/hops/hop-validation.md +0 -97
  90. package/framework/templates/meta-prompts/hops/hop-wrapper.md +0 -36
  91. package/framework/workflows/configs/design-impl.json +0 -49
  92. package/framework/workflows/configs/express.json +0 -45
  93. package/framework/workflows/configs/fast-track.json +0 -42
  94. package/framework/workflows/configs/full-morph.json +0 -79
  95. package/framework/workflows/configs/fusion.json +0 -39
  96. package/framework/workflows/configs/long-running.json +0 -33
  97. package/framework/workflows/configs/spec-only.json +0 -43
  98. package/framework/workflows/configs/ui-refresh.json +0 -49
  99. package/framework/workflows/configs/zero-touch.json +0 -82
  100. package/src/commands/project/monitor.js +0 -295
  101. package/src/commands/project/tutorial.js +0 -115
  102. package/src/commands/state/validate-phase.js +0 -238
  103. package/src/commands/templates/generate-contracts.js +0 -445
  104. package/src/core/orchestrator.js +0 -171
  105. package/src/core/registry/command-registry.js +0 -28
  106. package/src/core/registry/index.js +0 -8
  107. package/src/core/registry/validator-registry.js +0 -204
  108. package/src/core/templates/template-validator.js +0 -296
  109. package/src/generator/config-generator.js +0 -206
  110. package/src/generator/templates/config.json.template +0 -40
  111. package/src/generator/templates/project.md.template +0 -67
  112. package/src/lib/agents/micro-agent-factory.js +0 -161
  113. package/src/lib/analysis/complexity-analyzer.js +0 -441
  114. package/src/lib/analysis/index.js +0 -7
  115. package/src/lib/analytics/analytics-engine.js +0 -345
  116. package/src/lib/checkpoints/checkpoint-hooks.js +0 -298
  117. package/src/lib/checkpoints/index.js +0 -7
  118. package/src/lib/context/context-bundler.js +0 -241
  119. package/src/lib/context/context-optimizer.js +0 -212
  120. package/src/lib/context/context-tracker.js +0 -273
  121. package/src/lib/context/core-four-tracker.js +0 -201
  122. package/src/lib/context/mcp-optimizer.js +0 -200
  123. package/src/lib/execution/fusion-executor.js +0 -304
  124. package/src/lib/execution/parallel-executor.js +0 -270
  125. package/src/lib/hooks/stop-hook-executor.js +0 -286
  126. package/src/lib/hops/hop-composer.js +0 -221
  127. package/src/lib/phase-chain/eligibility-checker.js +0 -243
  128. package/src/lib/threads/thread-coordinator.js +0 -238
  129. package/src/lib/threads/thread-manager.js +0 -317
  130. package/src/lib/tracking/artifact-trail.js +0 -202
  131. package/src/scanner/project-scanner.js +0 -242
  132. package/src/ui/diff-display.js +0 -91
  133. package/src/ui/interactive-wizard.js +0 -96
  134. package/src/ui/user-review.js +0 -211
  135. package/src/ui/wizard-questions.js +0 -188
  136. package/src/utils/color-utils.js +0 -70
  137. package/src/utils/process-handler.js +0 -97
@@ -1,252 +1,252 @@
1
- ---
2
- name: phase-codebase-analysis
3
- description: MORPH-SPEC Design sub-phase that analyzes existing codebase and database schema, producing schema-analysis.md with real column names, types, relationships, and field mismatches. Use at the start of Design phase before generating contracts.cs to prevent incorrect field names or types.
4
- user-invocable: false
5
- allowed-tools: Read, Write, Edit, Bash, Glob, Grep
6
- cliVersion: "4.8.19"
7
- ---
8
-
9
- # MORPH Codebase Analysis - Sub-fase de DESIGN
10
-
11
- > INTERNAL: Automation skill for schema analysis step within Phase 2 (Design).
12
- > Called by `phase-design.md` Passo 2. Not a standalone user command.
13
-
14
- Automatiza a análise de código existente para gerar `schema-analysis.md` com dados reais do banco/código.
15
-
16
- ## Pré-requisitos
17
-
18
- - [ ] FASE 1 (Setup) concluída
19
- - [ ] Feature tem `proposal.md` aprovado
20
- - [ ] Contexto do projeto carregado (stack, agentes)
21
-
22
- ## Ferramentas Recomendadas
23
-
24
- > **Ref:** `framework/skills/level-0-meta/tool-usage-guide/SKILL.md` para guia completo.
25
- > **Ref:** `framework/standards/integration/mcp/mcp-tools.md` para referência MCP.
26
-
27
- | Ação | Ferramenta | Alternativa |
28
- |------|------------|-------------|
29
- | Listar tabelas do banco | **Supabase MCP** `list_tables()` | **Grep** `.from(` no código |
30
- | Obter schema de tabela | **Supabase MCP** `get_table_schema()` | **Read** type definitions |
31
- | Obter relacionamentos FK | **Supabase MCP** `get_relationships()` | **Grep** JOIN/FK patterns |
32
- | Obter políticas RLS | **Supabase MCP** `query()` | **Read** policy files |
33
- | Encontrar queries no código | **Grep** `\.from\(` em `*.ts,*.tsx,*.js,*.cs` | — |
34
- | Encontrar type definitions | **Glob** `src/**/types/**/*.ts` ou `**/Entities/**/*.cs` | — |
35
- | Ler arquivos encontrados | **Read** cada arquivo | — |
36
- | Análise multi-arquivo complexa | **Task** (subagent Explore) | Read individual |
37
- | Gerar schema-analysis.md | **Write** usando template | **Bash** template render |
38
-
39
- **MCPs desta fase:** Supabase (schema — **PRIORITÁRIO**), Database MCPs genéricos.
40
-
41
- ---
42
-
43
- ## Workflow Automatizado
44
-
45
- ### Passo 1: Detectar Método de Análise
46
-
47
- **IMPORTANTE (Problem 8 fix):** Não assuma que o MCP está disponível e acessível.
48
- Verifique primeiro com uma chamada de teste antes de tentar usá-lo.
49
-
50
- ```
51
- 1. SE MCP Supabase configurado no settings.json:
52
- → Tentar mcp__supabase__list_tables() com timeout implícito
53
- → SE retornar dados válidos (array de tabelas com conteúdo):
54
- → Usar Método A (MCP direto)
55
- → SE retornar erro, timeout, array vazio, ou dados inacessíveis:
56
- → Logar: "MCP Supabase configurado mas inacessível (CloudSQL? Auth? Permissões?)"
57
- → Usar Método B (análise estática de código)
58
-
59
- 2. SE MCP Database (outro) configurado:
60
- → Testar conectividade com query trivial antes de usar
61
- → SE OK: Usar Método A adaptado
62
- → SE falhar: Usar Método B
63
-
64
- 3. SE nenhum MCP disponível:
65
- → Usar Método B (análise estática de código)
66
- ```
67
-
68
- **Sinais de MCP inacessível:**
69
- - Resposta vazia ou `[]` em `list_tables()`
70
- - Erro de autenticação / permissão negada
71
- - Schema retornado não bate com o código (ex: tabelas existem no código mas não no MCP)
72
- - Projeto usa banco diferente do Supabase (CloudSQL, RDS, Azure SQL, etc.)
73
-
74
- ### Passo 2A: Método MCP (Preferencial)
75
-
76
- **Ferramentas:** Supabase MCP
77
-
78
- ```javascript
79
- // 1. Listar todas as tabelas
80
- const tables = await mcp__supabase__list_tables();
81
-
82
- // 2. Para cada tabela relevante à feature:
83
- for (const table of relevantTables) {
84
- // 2a. Schema completo
85
- const schema = await mcp__supabase__get_table_schema({ table: table.name });
86
- // → column_name, data_type, is_nullable, column_default
87
-
88
- // 2b. Relacionamentos
89
- const rels = await mcp__supabase__get_relationships({ table: table.name });
90
- // → foreign_table, foreign_column, constraint_type
91
-
92
- // 2c. Indexes
93
- const indexes = await mcp__supabase__query({
94
- query: `SELECT indexname, indexdef FROM pg_indexes WHERE tablename = '${table.name}'`
95
- });
96
-
97
- // 2d. RLS policies (segurança)
98
- const policies = await mcp__supabase__query({
99
- query: `SELECT policyname, cmd, qual FROM pg_policies WHERE tablename = '${table.name}'`
100
- });
101
- }
102
- ```
103
-
104
- ### Passo 2B: Método Análise Estática (Fallback)
105
-
106
- **Ferramentas:** Grep, Glob, Read, Task (subagent para projetos grandes)
107
-
108
- **Fase B1: Encontrar Queries**
109
-
110
- ```
111
- Grep: "\.from\(|\.select\(|SELECT |supabase\.|context\.|dbContext\.|DbSet<"
112
- Type: ts,tsx,js,jsx,cs
113
- Output: files_with_matches
114
- ```
115
-
116
- **Fase B2: Ler Arquivos de Query**
117
-
118
- Para cada arquivo encontrado, use **Read** para extrair:
119
- - Nomes de tabelas: `from('leads')`, `DbSet<Lead>`, `FROM leads`
120
- - Nomes de colunas: `.select('fullname, phonenumber')`, `l.FullName`
121
- - Tipos de dados: TypeScript interfaces, C# DTOs
122
- - Relacionamentos: JOIN clauses, navigation properties
123
-
124
- **Fase B3: Encontrar Type Definitions**
125
-
126
- ```
127
- # TypeScript/JavaScript:
128
- Glob: "src/**/types/**/*.ts"
129
- Glob: "src/**/*.d.ts"
130
- Glob: "src/**/interfaces/*.ts"
131
-
132
- # .NET:
133
- Glob: "**/*Dto.cs"
134
- Glob: "**/Entities/**/*.cs"
135
- Glob: "**/Models/**/*.cs"
136
- ```
137
-
138
- **Fase B4: Quando usar Task (subagent)**
139
-
140
- Use Task subagent **APENAS** quando:
141
- - Projeto tem 20+ arquivos de query
142
- - Múltiplos padrões de acesso a dados (Supabase + EF Core + raw SQL)
143
- - Análise precisa de contexto cruzado entre muitos arquivos
144
-
145
- Não use Task subagent quando:
146
- - Projeto tem < 10 arquivos de query (Read direto é mais rápido)
147
- - Padrão de acesso a dados é uniforme (só Supabase OU só EF Core)
148
-
149
- ### Passo 2B-Formato: Formato Padronizado para Análise Estática
150
-
151
- **IMPORTANTE (Problem 10 fix):** Quando usar Método B (análise estática), **sempre use o template oficial**.
152
- Isso garante que `contracts.cs` pode ser gerado mecanicamente, sem interpretação manual.
153
-
154
- O template está em `framework/templates/docs/schema-analysis.md`. Use-o via:
155
-
156
- ```bash
157
- npx morph-spec template render docs/schema-analysis \
158
- .morph/features/{feature}/1-design/schema-analysis.md \
159
- '{
160
- "FEATURE_NAME": "{feature}",
161
- "FEATURE_NAME_TITLE": "{Feature Display Name}",
162
- "DATE": "YYYY-MM-DD",
163
- "AUTHOR": "Claude Code (Sonnet 4.6)",
164
- "method": "Static Code Analysis",
165
- "mcpUsed": "No",
166
- "tableCount": N,
167
- "fileCount": N,
168
- "tables": [
169
- {
170
- "name": "table_name",
171
- "codeSource": "path/to/file.ts",
172
- "columns": [
173
- { "name": "column_name", "type": "string", "nullable": false, "notes": "from SELECT query" }
174
- ],
175
- "relationships": [{ "description": "belongs to users via user_id" }],
176
- "indexes": [{ "description": "idx_leads_created_at (created_at DESC)" }]
177
- }
178
- ],
179
- "fieldMismatches": [
180
- { "description": "Code uses user.name but DB column is users.fullname" }
181
- ],
182
- "typeMismatches": [],
183
- "relationshipIssues": [],
184
- "dtoRecommendations": [
185
- {
186
- "tableName": "leads",
187
- "dtoName": "LeadDto",
188
- "fields": [
189
- { "type": "Guid", "name": "Id", "nullable": false, "comment": "PK" },
190
- { "type": "string", "name": "FullName", "nullable": false, "comment": "leads.fullname" }
191
- ]
192
- }
193
- ]
194
- }'
195
- ```
196
-
197
- **Se o template render não estiver disponível**, use **Write** tool para criar o arquivo diretamente
198
- seguindo a estrutura acima. O formato das tabelas e mismatches é OBRIGATÓRIO — sem formato padrão
199
- não é possível gerar contracts.cs mecanicamente.
200
-
201
- ### Passo 3: Mapear Inconsistências
202
-
203
- Crie um mapa de:
204
-
205
- | Frontend/Código | Banco de Dados | Tipo | Problema |
206
- |----------------|----------------|------|----------|
207
- | user.name | users.fullname | string | ❌ MISMATCH |
208
- | lead.phone | leads.phonenumber | string | ❌ MISMATCH |
209
- | order.metadata | orders.metadata | JSONB | ⚠️ Type complex |
210
-
211
- ### Passo 4: Gerar `schema-analysis.md`
212
-
213
- Use o template em `framework/templates/docs/schema-analysis.md`:
214
-
215
- ```bash
216
- npx morph-spec template render docs/schema-analysis \
217
- .morph/features/{feature-name}/1-design/schema-analysis.md \
218
- '{ "FEATURE_NAME": "{feature-name}", "DATE": "..." }'
219
- ```
220
-
221
- OU use **Write** tool para criar diretamente com os dados coletados.
222
-
223
- ### Passo 5: Atualizar State
224
-
225
- ```bash
226
- npx morph-spec state mark-output {feature-name} schema-analysis
227
- ```
228
-
229
- ---
230
-
231
- ## Outputs
232
-
233
- - `.morph/features/{feature}/1-design/schema-analysis.md`
234
- - State atualizado com output `schemaAnalysis`
235
-
236
- ## CHECKPOINT
237
-
238
- Antes de prosseguir para contracts.cs, apresente ao usuário:
239
-
240
- - [ ] Analisei {N} tabelas
241
- - [ ] Encontrei {N} field name mismatches
242
- - [ ] Encontrei {N} type mismatches
243
- - [ ] Mapeei {N} relacionamentos
244
- - [ ] `schema-analysis.md` criado
245
-
246
- **Perguntas obrigatórias:**
247
- 1. "O schema analysis está correto?"
248
- 2. "Posso gerar contracts.cs com base nesse schema real?"
249
-
250
- ---
251
-
1
+ ---
2
+ name: morph:phase-codebase-analysis
3
+ description: MORPH-SPEC Design sub-phase that analyzes existing codebase and database schema, producing schema-analysis.md with real column names, types, relationships, and field mismatches. Use at the start of Design phase before generating contracts.cs to prevent incorrect field names or types.
4
+ user-invocable: false
5
+ allowed-tools: Read, Write, Edit, Bash, Glob, Grep
6
+ cliVersion: "4.9.0"
7
+ ---
8
+
9
+ # MORPH Codebase Analysis - Sub-fase de DESIGN
10
+
11
+ > INTERNAL: Automation skill for schema analysis step within Phase 2 (Design).
12
+ > Called by `phase-design.md` Passo 2. Not a standalone user command.
13
+
14
+ Automatiza a análise de código existente para gerar `schema-analysis.md` com dados reais do banco/código.
15
+
16
+ ## Pré-requisitos
17
+
18
+ - [ ] FASE 1 (Setup) concluída
19
+ - [ ] Feature tem `proposal.md` aprovado
20
+ - [ ] Contexto do projeto carregado (stack, agentes)
21
+
22
+ ## Ferramentas Recomendadas
23
+
24
+ > **Ref:** `framework/skills/level-0-meta/tool-usage-guide/SKILL.md` para guia completo.
25
+ > **Ref:** `framework/standards/integration/mcp/mcp-tools.md` para referência MCP.
26
+
27
+ | Ação | Ferramenta | Alternativa |
28
+ |------|------------|-------------|
29
+ | Listar tabelas do banco | **Supabase MCP** `list_tables()` | **Grep** `.from(` no código |
30
+ | Obter schema de tabela | **Supabase MCP** `get_table_schema()` | **Read** type definitions |
31
+ | Obter relacionamentos FK | **Supabase MCP** `get_relationships()` | **Grep** JOIN/FK patterns |
32
+ | Obter políticas RLS | **Supabase MCP** `query()` | **Read** policy files |
33
+ | Encontrar queries no código | **Grep** `\.from\(` em `*.ts,*.tsx,*.js,*.cs` | — |
34
+ | Encontrar type definitions | **Glob** `src/**/types/**/*.ts` ou `**/Entities/**/*.cs` | — |
35
+ | Ler arquivos encontrados | **Read** cada arquivo | — |
36
+ | Análise multi-arquivo complexa | **Task** (subagent Explore) | Read individual |
37
+ | Gerar schema-analysis.md | **Write** usando template | **Bash** template render |
38
+
39
+ **MCPs desta fase:** Supabase (schema — **PRIORITÁRIO**), Database MCPs genéricos.
40
+
41
+ ---
42
+
43
+ ## Workflow Automatizado
44
+
45
+ ### Passo 1: Detectar Método de Análise
46
+
47
+ **IMPORTANTE (Problem 8 fix):** Não assuma que o MCP está disponível e acessível.
48
+ Verifique primeiro com uma chamada de teste antes de tentar usá-lo.
49
+
50
+ ```
51
+ 1. SE MCP Supabase configurado no settings.json:
52
+ → Tentar mcp__supabase__list_tables() com timeout implícito
53
+ → SE retornar dados válidos (array de tabelas com conteúdo):
54
+ → Usar Método A (MCP direto)
55
+ → SE retornar erro, timeout, array vazio, ou dados inacessíveis:
56
+ → Logar: "MCP Supabase configurado mas inacessível (CloudSQL? Auth? Permissões?)"
57
+ → Usar Método B (análise estática de código)
58
+
59
+ 2. SE MCP Database (outro) configurado:
60
+ → Testar conectividade com query trivial antes de usar
61
+ → SE OK: Usar Método A adaptado
62
+ → SE falhar: Usar Método B
63
+
64
+ 3. SE nenhum MCP disponível:
65
+ → Usar Método B (análise estática de código)
66
+ ```
67
+
68
+ **Sinais de MCP inacessível:**
69
+ - Resposta vazia ou `[]` em `list_tables()`
70
+ - Erro de autenticação / permissão negada
71
+ - Schema retornado não bate com o código (ex: tabelas existem no código mas não no MCP)
72
+ - Projeto usa banco diferente do Supabase (CloudSQL, RDS, Azure SQL, etc.)
73
+
74
+ ### Passo 2A: Método MCP (Preferencial)
75
+
76
+ **Ferramentas:** Supabase MCP
77
+
78
+ ```javascript
79
+ // 1. Listar todas as tabelas
80
+ const tables = await mcp__supabase__list_tables();
81
+
82
+ // 2. Para cada tabela relevante à feature:
83
+ for (const table of relevantTables) {
84
+ // 2a. Schema completo
85
+ const schema = await mcp__supabase__get_table_schema({ table: table.name });
86
+ // → column_name, data_type, is_nullable, column_default
87
+
88
+ // 2b. Relacionamentos
89
+ const rels = await mcp__supabase__get_relationships({ table: table.name });
90
+ // → foreign_table, foreign_column, constraint_type
91
+
92
+ // 2c. Indexes
93
+ const indexes = await mcp__supabase__query({
94
+ query: `SELECT indexname, indexdef FROM pg_indexes WHERE tablename = '${table.name}'`
95
+ });
96
+
97
+ // 2d. RLS policies (segurança)
98
+ const policies = await mcp__supabase__query({
99
+ query: `SELECT policyname, cmd, qual FROM pg_policies WHERE tablename = '${table.name}'`
100
+ });
101
+ }
102
+ ```
103
+
104
+ ### Passo 2B: Método Análise Estática (Fallback)
105
+
106
+ **Ferramentas:** Grep, Glob, Read, Task (subagent para projetos grandes)
107
+
108
+ **Fase B1: Encontrar Queries**
109
+
110
+ ```
111
+ Grep: "\.from\(|\.select\(|SELECT |supabase\.|context\.|dbContext\.|DbSet<"
112
+ Type: ts,tsx,js,jsx,cs
113
+ Output: files_with_matches
114
+ ```
115
+
116
+ **Fase B2: Ler Arquivos de Query**
117
+
118
+ Para cada arquivo encontrado, use **Read** para extrair:
119
+ - Nomes de tabelas: `from('leads')`, `DbSet<Lead>`, `FROM leads`
120
+ - Nomes de colunas: `.select('fullname, phonenumber')`, `l.FullName`
121
+ - Tipos de dados: TypeScript interfaces, C# DTOs
122
+ - Relacionamentos: JOIN clauses, navigation properties
123
+
124
+ **Fase B3: Encontrar Type Definitions**
125
+
126
+ ```
127
+ # TypeScript/JavaScript:
128
+ Glob: "src/**/types/**/*.ts"
129
+ Glob: "src/**/*.d.ts"
130
+ Glob: "src/**/interfaces/*.ts"
131
+
132
+ # .NET:
133
+ Glob: "**/*Dto.cs"
134
+ Glob: "**/Entities/**/*.cs"
135
+ Glob: "**/Models/**/*.cs"
136
+ ```
137
+
138
+ **Fase B4: Quando usar Task (subagent)**
139
+
140
+ Use Task subagent **APENAS** quando:
141
+ - Projeto tem 20+ arquivos de query
142
+ - Múltiplos padrões de acesso a dados (Supabase + EF Core + raw SQL)
143
+ - Análise precisa de contexto cruzado entre muitos arquivos
144
+
145
+ Não use Task subagent quando:
146
+ - Projeto tem < 10 arquivos de query (Read direto é mais rápido)
147
+ - Padrão de acesso a dados é uniforme (só Supabase OU só EF Core)
148
+
149
+ ### Passo 2B-Formato: Formato Padronizado para Análise Estática
150
+
151
+ **IMPORTANTE (Problem 10 fix):** Quando usar Método B (análise estática), **sempre use o template oficial**.
152
+ Isso garante que `contracts.cs` pode ser gerado mecanicamente, sem interpretação manual.
153
+
154
+ O template está em `framework/templates/docs/schema-analysis.md`. Use-o via:
155
+
156
+ ```bash
157
+ npx morph-spec template render docs/schema-analysis \
158
+ .morph/features/{feature}/1-design/schema-analysis.md \
159
+ '{
160
+ "FEATURE_NAME": "{feature}",
161
+ "FEATURE_NAME_TITLE": "{Feature Display Name}",
162
+ "DATE": "YYYY-MM-DD",
163
+ "AUTHOR": "Claude Code (Sonnet 4.6)",
164
+ "method": "Static Code Analysis",
165
+ "mcpUsed": "No",
166
+ "tableCount": N,
167
+ "fileCount": N,
168
+ "tables": [
169
+ {
170
+ "name": "table_name",
171
+ "codeSource": "path/to/file.ts",
172
+ "columns": [
173
+ { "name": "column_name", "type": "string", "nullable": false, "notes": "from SELECT query" }
174
+ ],
175
+ "relationships": [{ "description": "belongs to users via user_id" }],
176
+ "indexes": [{ "description": "idx_leads_created_at (created_at DESC)" }]
177
+ }
178
+ ],
179
+ "fieldMismatches": [
180
+ { "description": "Code uses user.name but DB column is users.fullname" }
181
+ ],
182
+ "typeMismatches": [],
183
+ "relationshipIssues": [],
184
+ "dtoRecommendations": [
185
+ {
186
+ "tableName": "leads",
187
+ "dtoName": "LeadDto",
188
+ "fields": [
189
+ { "type": "Guid", "name": "Id", "nullable": false, "comment": "PK" },
190
+ { "type": "string", "name": "FullName", "nullable": false, "comment": "leads.fullname" }
191
+ ]
192
+ }
193
+ ]
194
+ }'
195
+ ```
196
+
197
+ **Se o template render não estiver disponível**, use **Write** tool para criar o arquivo diretamente
198
+ seguindo a estrutura acima. O formato das tabelas e mismatches é OBRIGATÓRIO — sem formato padrão
199
+ não é possível gerar contracts.cs mecanicamente.
200
+
201
+ ### Passo 3: Mapear Inconsistências
202
+
203
+ Crie um mapa de:
204
+
205
+ | Frontend/Código | Banco de Dados | Tipo | Problema |
206
+ |----------------|----------------|------|----------|
207
+ | user.name | users.fullname | string | ❌ MISMATCH |
208
+ | lead.phone | leads.phonenumber | string | ❌ MISMATCH |
209
+ | order.metadata | orders.metadata | JSONB | ⚠️ Type complex |
210
+
211
+ ### Passo 4: Gerar `schema-analysis.md`
212
+
213
+ Use o template em `framework/templates/docs/schema-analysis.md`:
214
+
215
+ ```bash
216
+ npx morph-spec template render docs/schema-analysis \
217
+ .morph/features/{feature-name}/1-design/schema-analysis.md \
218
+ '{ "FEATURE_NAME": "{feature-name}", "DATE": "..." }'
219
+ ```
220
+
221
+ OU use **Write** tool para criar diretamente com os dados coletados.
222
+
223
+ ### Passo 5: Atualizar State
224
+
225
+ ```bash
226
+ npx morph-spec state mark-output {feature-name} schema-analysis
227
+ ```
228
+
229
+ ---
230
+
231
+ ## Outputs
232
+
233
+ - `.morph/features/{feature}/1-design/schema-analysis.md`
234
+ - State atualizado com output `schemaAnalysis`
235
+
236
+ ## CHECKPOINT
237
+
238
+ Antes de prosseguir para contracts.cs, apresente ao usuário:
239
+
240
+ - [ ] Analisei {N} tabelas
241
+ - [ ] Encontrei {N} field name mismatches
242
+ - [ ] Encontrei {N} type mismatches
243
+ - [ ] Mapeei {N} relacionamentos
244
+ - [ ] `schema-analysis.md` criado
245
+
246
+ **Perguntas obrigatórias:**
247
+ 1. "O schema analysis está correto?"
248
+ 2. "Posso gerar contracts.cs com base nesse schema real?"
249
+
250
+ ---
251
+
252
252
  *MORPH-SPEC by Polymorphism Tech*