@polymorphism-tech/morph-spec 4.8.18 → 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.
- package/CLAUDE.md +98 -0
- package/README.md +2 -2
- package/bin/morph-spec.js +15 -56
- package/bin/task-manager.js +115 -14
- package/bin/validate.js +67 -33
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +201 -203
- package/docs/QUICKSTART.md +2 -2
- package/framework/CLAUDE.md +21 -0
- package/framework/agents.json +758 -164
- package/framework/hooks/claude-code/post-tool-use/context-refresh.js +1 -1
- package/framework/hooks/claude-code/post-tool-use/dispatch.js +2 -2
- package/framework/hooks/claude-code/post-tool-use/skill-reminder.js +155 -0
- package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +1 -1
- package/framework/hooks/claude-code/session-start/inject-morph-context.js +71 -2
- package/framework/hooks/claude-code/statusline.py +76 -30
- package/framework/hooks/claude-code/user-prompt/set-terminal-title.js +14 -6
- package/framework/hooks/shared/activity-logger.js +0 -24
- package/framework/hooks/shared/phase-utils.js +3 -0
- package/framework/hooks/shared/skill-reminder-helpers.js +79 -0
- package/framework/hooks/shared/stale-task-reset.js +57 -0
- package/framework/hooks/shared/state-reader.js +2 -2
- package/framework/hooks/shared/worktree-helpers.js +53 -0
- package/framework/phases.json +40 -8
- package/framework/skills/level-0-meta/brainstorming/SKILL.md +1 -1
- package/framework/skills/level-0-meta/code-review/SKILL.md +1 -1
- package/framework/skills/level-0-meta/code-review-nextjs/SKILL.md +163 -163
- package/framework/skills/level-0-meta/frontend-review/SKILL.md +5 -5
- package/framework/skills/level-0-meta/morph-checklist/SKILL.md +2 -2
- package/framework/skills/level-0-meta/morph-init/SKILL.md +5 -5
- package/framework/skills/level-0-meta/morph-replicate/SKILL.md +4 -4
- package/framework/skills/level-0-meta/morph-replicate/references/blazor-html-mapping.md +1 -1
- package/framework/skills/level-0-meta/post-implementation/SKILL.md +59 -12
- package/framework/skills/level-0-meta/simulation-checklist/SKILL.md +1 -1
- package/framework/skills/level-0-meta/terminal-title/SKILL.md +1 -1
- package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +1 -1
- package/framework/skills/level-0-meta/tool-usage-guide/references/tools-per-phase.md +6 -5
- package/framework/skills/level-0-meta/verification-before-completion/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/phase-clarify/SKILL.md +215 -189
- package/framework/skills/level-1-workflows/phase-codebase-analysis/SKILL.md +251 -251
- package/framework/skills/level-1-workflows/phase-design/SKILL.md +382 -365
- package/framework/skills/level-1-workflows/phase-implement/SKILL.md +492 -450
- package/framework/skills/level-1-workflows/phase-setup/SKILL.md +194 -190
- package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +270 -270
- package/framework/skills/level-1-workflows/phase-uiux/SKILL.md +285 -285
- package/framework/standards/STANDARDS.json +640 -88
- package/framework/standards/infrastructure/vercel/vercel-database.md +106 -0
- package/framework/templates/REGISTRY.json +1825 -1909
- package/framework/templates/context/CONTEXT-FEATURE.md +276 -276
- package/framework/templates/docs/onboarding.md +1 -5
- package/framework/workflows/configs/nodejs-cli.json +40 -0
- package/package.json +2 -6
- package/src/commands/agents/dispatch-agents.js +55 -4
- package/src/commands/project/doctor.js +16 -47
- package/src/commands/project/init.js +1 -1
- package/src/commands/project/status.js +2 -2
- package/src/commands/project/update.js +381 -365
- package/src/commands/project/worktree.js +154 -0
- package/src/commands/state/advance-phase.js +120 -30
- package/src/commands/state/approve.js +2 -2
- package/src/commands/state/index.js +7 -8
- package/src/commands/state/phase-runner.js +1 -1
- package/src/commands/state/state.js +61 -6
- package/src/commands/tasks/task.js +78 -99
- package/src/commands/templates/template-render.js +93 -173
- package/src/commands/trust/trust.js +26 -21
- package/src/core/paths/output-schema.js +15 -0
- package/src/core/state/state-manager.js +28 -54
- package/src/core/workflows/workflow-detector.js +9 -87
- package/src/lib/phase-chain/phase-validator.js +330 -0
- package/src/lib/stack/stack-profile.js +88 -0
- package/src/lib/tasks/task-classifier.js +16 -0
- package/src/lib/tasks/test-runner.js +77 -0
- package/src/lib/trust/trust-manager.js +32 -144
- package/src/lib/validators/spec-validator.js +58 -4
- package/src/lib/validators/validation-runner.js +23 -11
- package/src/scripts/setup-infra.js +240 -224
- package/src/utils/agents-installer.js +2 -2
- package/src/utils/banner.js +1 -1
- package/src/utils/claude-settings-manager.js +1 -1
- package/src/utils/file-copier.js +1 -0
- package/src/utils/hooks-installer.js +258 -8
- package/framework/hooks/dev/check-sync-health.js +0 -117
- package/framework/hooks/dev/guard-version-numbers.js +0 -57
- package/framework/hooks/dev/sync-standards-registry.js +0 -60
- package/framework/hooks/dev/sync-template-registry.js +0 -60
- package/framework/hooks/dev/validate-skill-format.js +0 -70
- package/framework/hooks/dev/validate-standard-format.js +0 -73
- package/framework/templates/meta-prompts/hops/hop-retry.md +0 -78
- package/framework/templates/meta-prompts/hops/hop-validation.md +0 -97
- package/framework/templates/meta-prompts/hops/hop-wrapper.md +0 -36
- package/framework/workflows/configs/design-impl.json +0 -49
- package/framework/workflows/configs/express.json +0 -45
- package/framework/workflows/configs/fast-track.json +0 -42
- package/framework/workflows/configs/full-morph.json +0 -79
- package/framework/workflows/configs/fusion.json +0 -39
- package/framework/workflows/configs/long-running.json +0 -33
- package/framework/workflows/configs/spec-only.json +0 -43
- package/framework/workflows/configs/ui-refresh.json +0 -49
- package/framework/workflows/configs/zero-touch.json +0 -82
- package/src/commands/project/monitor.js +0 -295
- package/src/commands/project/tutorial.js +0 -115
- package/src/commands/state/validate-phase.js +0 -238
- package/src/commands/templates/generate-contracts.js +0 -445
- package/src/core/orchestrator.js +0 -171
- package/src/core/registry/command-registry.js +0 -28
- package/src/core/registry/index.js +0 -8
- package/src/core/registry/validator-registry.js +0 -204
- package/src/core/templates/template-validator.js +0 -296
- package/src/generator/config-generator.js +0 -206
- package/src/generator/templates/config.json.template +0 -40
- package/src/generator/templates/project.md.template +0 -67
- package/src/lib/agents/micro-agent-factory.js +0 -161
- package/src/lib/analysis/complexity-analyzer.js +0 -441
- package/src/lib/analysis/index.js +0 -7
- package/src/lib/analytics/analytics-engine.js +0 -345
- package/src/lib/checkpoints/checkpoint-hooks.js +0 -298
- package/src/lib/checkpoints/index.js +0 -7
- package/src/lib/context/context-bundler.js +0 -241
- package/src/lib/context/context-optimizer.js +0 -212
- package/src/lib/context/context-tracker.js +0 -273
- package/src/lib/context/core-four-tracker.js +0 -201
- package/src/lib/context/mcp-optimizer.js +0 -200
- package/src/lib/execution/fusion-executor.js +0 -304
- package/src/lib/execution/parallel-executor.js +0 -270
- package/src/lib/hooks/stop-hook-executor.js +0 -286
- package/src/lib/hops/hop-composer.js +0 -221
- package/src/lib/phase-chain/eligibility-checker.js +0 -243
- package/src/lib/threads/thread-coordinator.js +0 -238
- package/src/lib/threads/thread-manager.js +0 -317
- package/src/lib/tracking/artifact-trail.js +0 -202
- package/src/scanner/project-scanner.js +0 -242
- package/src/ui/diff-display.js +0 -91
- package/src/ui/interactive-wizard.js +0 -96
- package/src/ui/user-review.js +0 -211
- package/src/ui/wizard-questions.js +0 -188
- package/src/utils/color-utils.js +0 -70
- 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.
|
|
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*
|