@polymorphism-tech/morph-spec 4.9.0 → 4.10.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 (124) hide show
  1. package/README.md +2 -2
  2. package/bin/morph-spec.js +30 -0
  3. package/bin/task-manager.js +34 -22
  4. package/claude-plugin.json +1 -1
  5. package/docs/CHEATSHEET.md +1 -1
  6. package/docs/QUICKSTART.md +1 -1
  7. package/framework/CLAUDE.md +99 -98
  8. package/framework/agents.json +37 -7
  9. package/framework/commands/commit.md +166 -0
  10. package/framework/commands/morph-apply.md +13 -2
  11. package/framework/commands/morph-archive.md +8 -2
  12. package/framework/commands/morph-infra.md +6 -0
  13. package/framework/commands/morph-preflight.md +6 -0
  14. package/framework/commands/morph-proposal.md +56 -7
  15. package/framework/commands/morph-status.md +6 -0
  16. package/framework/commands/morph-troubleshoot.md +6 -0
  17. package/framework/hooks/claude-code/notification/approval-reminder.js +3 -2
  18. package/framework/hooks/claude-code/post-tool-use/dispatch.js +154 -31
  19. package/framework/hooks/claude-code/post-tool-use/skill-reminder.js +7 -84
  20. package/framework/hooks/claude-code/post-tool-use/validator-feedback.js +8 -17
  21. package/framework/hooks/claude-code/pre-compact/save-morph-context.js +16 -3
  22. package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +4 -3
  23. package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +3 -2
  24. package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +60 -0
  25. package/framework/hooks/claude-code/session-start/inject-morph-context.js +55 -2
  26. package/framework/hooks/claude-code/session-start/post-compact-restore.js +41 -0
  27. package/framework/hooks/claude-code/stop/validate-completion.js +2 -15
  28. package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +23 -5
  29. package/framework/hooks/shared/compact-restore.js +100 -0
  30. package/framework/hooks/shared/dispatch-helpers.js +116 -0
  31. package/framework/hooks/shared/phase-utils.js +9 -5
  32. package/framework/hooks/shared/state-reader.js +27 -3
  33. package/framework/phases.json +30 -7
  34. package/framework/rules/morph-workflow.md +88 -86
  35. package/framework/skills/level-0-meta/mcp-registry.json +86 -51
  36. package/framework/skills/level-0-meta/{brainstorming → morph-brainstorming}/SKILL.md +13 -16
  37. package/framework/skills/level-0-meta/{code-review → morph-code-review}/SKILL.md +1 -1
  38. package/framework/skills/level-0-meta/{code-review-nextjs → morph-code-review-nextjs}/SKILL.md +2 -2
  39. package/framework/skills/level-0-meta/{frontend-review → morph-frontend-review}/SKILL.md +5 -5
  40. package/framework/skills/level-0-meta/morph-init/SKILL.md +72 -7
  41. package/framework/skills/level-0-meta/{post-implementation → morph-post-implementation}/SKILL.md +9 -9
  42. package/framework/skills/level-0-meta/morph-replicate/SKILL.md +1 -1
  43. package/framework/skills/level-0-meta/{terminal-title → morph-terminal-title}/SKILL.md +1 -1
  44. package/framework/skills/level-0-meta/{tool-usage-guide → morph-tool-usage-guide}/SKILL.md +2 -3
  45. package/framework/skills/level-0-meta/{tool-usage-guide → morph-tool-usage-guide}/references/tools-per-phase.md +1 -2
  46. package/framework/skills/level-0-meta/{verification-before-completion → morph-verification-before-completion}/SKILL.md +1 -1
  47. package/framework/skills/level-0-meta/{verification-before-completion → morph-verification-before-completion}/scripts/check-phase-outputs.mjs +2 -2
  48. package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +238 -0
  49. package/framework/skills/level-1-workflows/{phase-codebase-analysis → morph-phase-codebase-analysis}/SKILL.md +251 -251
  50. package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +507 -0
  51. package/framework/skills/level-1-workflows/{phase-implement → morph-phase-implement}/SKILL.md +590 -491
  52. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/code-quality-reviewer-prompt.md +50 -0
  53. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +45 -0
  54. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/spec-reviewer-prompt.md +47 -0
  55. package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +254 -0
  56. package/framework/skills/level-1-workflows/{phase-setup → morph-phase-setup}/SKILL.md +237 -194
  57. package/framework/skills/level-1-workflows/{phase-tasks → morph-phase-tasks}/SKILL.md +307 -270
  58. package/framework/skills/level-1-workflows/{phase-tasks → morph-phase-tasks}/scripts/validate-tasks.mjs +3 -3
  59. package/framework/skills/level-1-workflows/{phase-uiux → morph-phase-uiux}/SKILL.md +320 -285
  60. package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +97 -0
  61. package/framework/standards/integration/mcp/mcp-tools.md +25 -7
  62. package/framework/templates/docs/onboarding.md +2 -2
  63. package/package.json +1 -2
  64. package/src/commands/agents/dispatch-agents.js +50 -3
  65. package/src/commands/mcp/mcp-setup.js +39 -2
  66. package/src/commands/phase/phase-reset.js +74 -0
  67. package/src/commands/project/doctor.js +19 -5
  68. package/src/commands/scope/escalate.js +215 -0
  69. package/src/commands/state/advance-phase.js +27 -53
  70. package/src/commands/state/state.js +1 -1
  71. package/src/commands/task/expand.js +100 -0
  72. package/src/core/paths/output-schema.js +4 -3
  73. package/src/core/state/phase-state-machine.js +7 -4
  74. package/src/core/state/state-manager.js +4 -3
  75. package/src/lib/detectors/claude-config-detector.js +93 -347
  76. package/src/lib/detectors/design-system-detector.js +189 -189
  77. package/src/lib/detectors/index.js +155 -57
  78. package/src/lib/generators/context-generator.js +2 -2
  79. package/src/lib/installers/mcp-installer.js +37 -5
  80. package/src/lib/phase-chain/phase-validator.js +22 -16
  81. package/src/lib/scope/impact-analyzer.js +106 -0
  82. package/src/lib/tasks/task-parser.js +1 -1
  83. package/src/lib/validators/shared/emit-validator-dispatch.js +64 -0
  84. package/src/scripts/setup-infra.js +15 -0
  85. package/src/utils/agents-installer.js +32 -12
  86. package/src/utils/file-copier.js +0 -1
  87. package/src/utils/hooks-installer.js +15 -1
  88. package/framework/skills/level-1-workflows/phase-clarify/SKILL.md +0 -216
  89. package/framework/skills/level-1-workflows/phase-design/SKILL.md +0 -383
  90. package/src/commands/project/index.js +0 -8
  91. package/src/core/index.js +0 -10
  92. package/src/core/state/index.js +0 -8
  93. package/src/core/templates/index.js +0 -9
  94. package/src/core/templates/template-data-sources.js +0 -325
  95. package/src/core/workflows/index.js +0 -7
  96. package/src/lib/detectors/config-detector.js +0 -223
  97. package/src/lib/detectors/standards-generator.js +0 -335
  98. package/src/lib/detectors/structure-detector.js +0 -275
  99. package/src/lib/monitor/agent-resolver.js +0 -144
  100. package/src/lib/monitor/renderer.js +0 -230
  101. package/src/lib/orchestration/index.js +0 -7
  102. package/src/lib/orchestration/team-orchestrator.js +0 -404
  103. package/src/sanitizer/context-sanitizer.js +0 -221
  104. package/src/sanitizer/patterns.js +0 -163
  105. package/src/writer/file-writer.js +0 -86
  106. /package/framework/skills/level-0-meta/{brainstorming → morph-brainstorming}/references/proposal-example.md +0 -0
  107. /package/framework/skills/level-0-meta/{code-review → morph-code-review}/references/review-example.md +0 -0
  108. /package/framework/skills/level-0-meta/{code-review → morph-code-review}/references/review-guidelines.md +0 -0
  109. /package/framework/skills/level-0-meta/{code-review → morph-code-review}/scripts/scan-csharp.mjs +0 -0
  110. /package/framework/skills/level-0-meta/{code-review-nextjs → morph-code-review-nextjs}/references/review-example-nextjs.md +0 -0
  111. /package/framework/skills/level-0-meta/{code-review-nextjs → morph-code-review-nextjs}/scripts/scan-nextjs.mjs +0 -0
  112. /package/framework/skills/level-0-meta/{frontend-review → morph-frontend-review}/scripts/scan-accessibility.mjs +0 -0
  113. /package/framework/skills/level-0-meta/{post-implementation → morph-post-implementation}/scripts/detect-dev-server.mjs +0 -0
  114. /package/framework/skills/level-0-meta/{post-implementation → morph-post-implementation}/scripts/detect-stack.mjs +0 -0
  115. /package/framework/skills/level-0-meta/{simulation-checklist → morph-simulation-checklist}/SKILL.md +0 -0
  116. /package/framework/skills/level-0-meta/{terminal-title → morph-terminal-title}/scripts/set_title.sh +0 -0
  117. /package/framework/skills/level-1-workflows/{phase-clarify → morph-phase-clarify}/references/clarifications-example.md +0 -0
  118. /package/framework/skills/level-1-workflows/{phase-design → morph-phase-design}/references/architecture-analysis-guide.md +0 -0
  119. /package/framework/skills/level-1-workflows/{phase-design → morph-phase-design}/references/spec-authoring-guide.md +0 -0
  120. /package/framework/skills/level-1-workflows/{phase-design → morph-phase-design}/references/spec-example.md +0 -0
  121. /package/framework/skills/level-1-workflows/{phase-implement → morph-phase-implement}/references/recap-example.md +0 -0
  122. /package/framework/skills/level-1-workflows/{phase-implement → morph-phase-implement}/references/vsa-implementation-guide.md +0 -0
  123. /package/framework/skills/level-1-workflows/{phase-tasks → morph-phase-tasks}/references/task-planning-patterns.md +0 -0
  124. /package/framework/skills/level-1-workflows/{phase-tasks → morph-phase-tasks}/references/tasks-example.md +0 -0
@@ -1,252 +1,252 @@
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
-
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.10.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/morph-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*