@polymorphism-tech/morph-spec 4.8.7 → 4.8.8
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/README.md +2 -2
- package/bin/morph-spec.js +22 -1
- package/bin/task-manager.cjs +120 -16
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/agents.json +1854 -1815
- package/framework/hooks/claude-code/pre-compact/save-morph-context.js +141 -23
- package/framework/hooks/claude-code/statusline.py +0 -12
- package/framework/hooks/claude-code/statusline.sh +6 -2
- package/framework/hooks/claude-code/stop/validate-completion.js +70 -23
- package/framework/hooks/dev/guard-version-numbers.js +1 -1
- package/framework/skills/level-0-meta/morph-init/SKILL.md +44 -6
- package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +67 -16
- package/framework/skills/level-1-workflows/phase-clarify/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/phase-codebase-analysis/SKILL.md +77 -7
- package/framework/skills/level-1-workflows/phase-design/SKILL.md +114 -50
- package/framework/skills/level-1-workflows/phase-implement/SKILL.md +139 -1
- package/framework/skills/level-1-workflows/phase-setup/SKILL.md +29 -6
- package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +4 -3
- package/framework/skills/level-1-workflows/phase-uiux/SKILL.md +1 -1
- package/framework/standards/STANDARDS.json +944 -933
- package/framework/standards/architecture/vertical-slice/vertical-slice.md +429 -0
- package/framework/templates/REGISTRY.json +1909 -1888
- package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +282 -0
- package/package.json +1 -1
- package/src/commands/agents/dispatch-agents.js +430 -0
- package/src/commands/agents/index.js +2 -1
- package/src/commands/project/doctor.js +137 -2
- package/src/commands/state/state.js +20 -4
- package/src/commands/templates/generate-contracts.js +445 -0
- package/src/commands/templates/index.js +1 -0
- package/src/lib/validators/validation-runner.js +19 -7
|
@@ -3,7 +3,7 @@ name: phase-codebase-analysis
|
|
|
3
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
4
|
user-invocable: false
|
|
5
5
|
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
6
|
-
cliVersion: "4.8.
|
|
6
|
+
cliVersion: "4.8.8"
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# MORPH Codebase Analysis - Sub-fase de DESIGN
|
|
@@ -44,15 +44,33 @@ Automatiza a análise de código existente para gerar `schema-analysis.md` com d
|
|
|
44
44
|
|
|
45
45
|
### Passo 1: Detectar Método de Análise
|
|
46
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
|
+
|
|
47
50
|
```
|
|
48
|
-
SE MCP Supabase
|
|
49
|
-
|
|
50
|
-
SE
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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)
|
|
54
66
|
```
|
|
55
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
|
+
|
|
56
74
|
### Passo 2A: Método MCP (Preferencial)
|
|
57
75
|
|
|
58
76
|
**Ferramentas:** Supabase MCP
|
|
@@ -128,6 +146,58 @@ Não use Task subagent quando:
|
|
|
128
146
|
- Projeto tem < 10 arquivos de query (Read direto é mais rápido)
|
|
129
147
|
- Padrão de acesso a dados é uniforme (só Supabase OU só EF Core)
|
|
130
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
|
+
|
|
131
201
|
### Passo 3: Mapear Inconsistências
|
|
132
202
|
|
|
133
203
|
Crie um mapa de:
|
|
@@ -4,7 +4,7 @@ description: MORPH-SPEC Phase 2 (Design). Analyzes codebase/schema, then produce
|
|
|
4
4
|
argument-hint: "[feature-name]"
|
|
5
5
|
user-invocable: false
|
|
6
6
|
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
7
|
-
cliVersion: "4.8.
|
|
7
|
+
cliVersion: "4.8.8"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# MORPH Design - FASE 2
|
|
@@ -28,6 +28,9 @@ Expanda a proposta em especificação técnica completa, contracts, decisões ar
|
|
|
28
28
|
| Ação | Ferramenta | Alternativa |
|
|
29
29
|
|------|------------|-------------|
|
|
30
30
|
| Ler proposal + UI specs | **Read** output files | — |
|
|
31
|
+
| Obter dispatch config | **Bash** `npx morph-spec dispatch-agents $ARGUMENTS design` | Agentes a disparar + prompts de task |
|
|
32
|
+
| **Dispatch domain-architect** (paralelo) | **Task** subagent com prompt do dispatch config | Análise de complexidade independente |
|
|
33
|
+
| **Dispatch tech leads ativos** (paralelo) | **Task** subagents (dotnet-senior, nextjs-expert…) | Validação de arquitetura independente |
|
|
31
34
|
| Obter schema do banco | **Supabase MCP** `list_tables()`, `get_table_schema()` | **Grep** queries + **Read** types |
|
|
32
35
|
| Obter relacionamentos de FK | **Supabase MCP** `get_relationships()` | **Grep** JOIN/FK no código |
|
|
33
36
|
| Obter políticas RLS | **Supabase MCP** `query()` com pg_policies | **Read** arquivos de políticas |
|
|
@@ -36,7 +39,8 @@ Expanda a proposta em especificação técnica completa, contracts, decisões ar
|
|
|
36
39
|
| Ler arquivos de query/tipos (fallback) | **Read** cada arquivo encontrado | — |
|
|
37
40
|
| Pesquisar biblioteca para ADR | **Context7 MCP** `query_docs()` | **WebSearch** + **WebFetch** |
|
|
38
41
|
| Buscar padrões no código | **GitHub MCP** `search_code()` | **Grep** padrões no projeto |
|
|
39
|
-
| Renderizar template contracts (
|
|
42
|
+
| Renderizar template contracts (VSA) | **Bash** `npx morph-spec template render code/dotnet/contracts/contracts-vsa.cs ...` | — |
|
|
43
|
+
| Renderizar template contracts (DDD nível detectado) | **Bash** `npx morph-spec template render code/dotnet/contracts/contracts-level{N}.cs ...` onde N = nível detectado no Passo 1.5 | — |
|
|
40
44
|
| Renderizar template spec.md | **Bash** `npx morph-spec template render docs/spec ...` | — |
|
|
41
45
|
| Renderizar template decisions.md | **Bash** `npx morph-spec template render docs/decisions ...` | — |
|
|
42
46
|
| Criar schema-analysis.md | **Write** no diretório de outputs | — |
|
|
@@ -49,66 +53,112 @@ Expanda a proposta em especificação técnica completa, contracts, decisões ar
|
|
|
49
53
|
- ❌ Task agent para ler um único arquivo spec (use Read direto)
|
|
50
54
|
- ❌ WebSearch para schema do banco (use Supabase MCP ou análise de código)
|
|
51
55
|
- ❌ Escrever contracts-level{N}.cs do zero (use template render)
|
|
56
|
+
- ❌ Executar análise de domínio e análise de schema sequencialmente (são independentes — paralelize!)
|
|
57
|
+
- ❌ Fazer análise de domínio inline no contexto principal quando 2+ agentes estão ativos (use Task dispatch)
|
|
52
58
|
|
|
53
59
|
---
|
|
54
60
|
|
|
55
61
|
## Workflow
|
|
56
62
|
|
|
57
|
-
### Passo 1: Carregar Contexto e
|
|
63
|
+
### Passo 1: Carregar Contexto, Agentes e Dispatch Config
|
|
58
64
|
|
|
59
|
-
**Obtenha feature state e
|
|
65
|
+
**Obtenha feature state e dispatch config:**
|
|
60
66
|
|
|
61
67
|
```bash
|
|
62
68
|
npx morph-spec state get $ARGUMENTS
|
|
69
|
+
npx morph-spec dispatch-agents $ARGUMENTS design
|
|
63
70
|
```
|
|
64
71
|
|
|
65
|
-
|
|
66
|
-
- Standards relevantes estão em `.morph/framework/standards/` por agente ativo (paths em `agents.json`)
|
|
67
|
-
- Prioridade: `.morph/context/*.md` > `.morph/framework/standards/` > `framework/standards/`
|
|
72
|
+
O primeiro comando retorna `activeAgents`. O segundo retorna os agentes a disparar e seus prompts de task.
|
|
68
73
|
|
|
69
|
-
**Leia outputs existentes:**
|
|
74
|
+
**Leia outputs existentes em paralelo (Read direto):**
|
|
70
75
|
1. `.morph/features/$ARGUMENTS/0-proposal/proposal.md` - Proposta inicial
|
|
71
76
|
2. `.morph/features/$ARGUMENTS/2-ui/*.md` - UI/UX specs (se existirem)
|
|
72
77
|
|
|
73
|
-
**
|
|
78
|
+
**Standards context** (carregue para o contexto principal os standards dos agentes ativos):
|
|
79
|
+
- Paths dos standards em `agents.json[activeAgent].standards[]`
|
|
80
|
+
- Prioridade: `.morph/context/*.md` > `.morph/framework/standards/` > `framework/standards/`
|
|
74
81
|
- Architecture standards → guiam Technical Architecture section
|
|
75
82
|
- Coding standards → definem contracts-level{N}.cs patterns
|
|
76
|
-
- Azure standards → determinam Infrastructure Requirements
|
|
77
83
|
|
|
78
|
-
### Passo 1.5:
|
|
84
|
+
### Passo 1.5: Análise de Domínio via Task Dispatch
|
|
85
|
+
|
|
86
|
+
**⚠️ OBRIGATÓRIO:** Execute antes de gerar qualquer contrato. Use **Task tool** para isolar esta análise do contexto principal.
|
|
87
|
+
|
|
88
|
+
O arquiteto ativo (lido do dispatch config no Passo 1) pode ser `domain-architect` (DDD) ou `vsa-architect` (VSA) — o prompt vem do dispatch config retornado por `dispatch-agents`.
|
|
89
|
+
|
|
90
|
+
> **Paralelização:** Este Task dispatch pode iniciar SIMULTANEAMENTE com o Passo 2 (schema analysis), pois ambos são independentes. Use dois Task calls em paralelo quando o schema analysis também for necessário.
|
|
79
91
|
|
|
80
|
-
|
|
92
|
+
#### Caminho A: `domain-architect` ativo (config sem `architecture.style: "vertical-slice"`)
|
|
81
93
|
|
|
82
94
|
**Ref:** `framework/standards/architecture/ddd/complexity-levels.md`
|
|
83
95
|
|
|
84
|
-
|
|
96
|
+
**Obtenha o taskPrompt do dispatch config** e use o Task tool:
|
|
85
97
|
|
|
86
98
|
```
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
5. O usuário declarou explicitamente Bounded Context na proposta?
|
|
92
|
-
|
|
93
|
-
→ Nenhuma acima: Nível 1 (CRUD)
|
|
94
|
-
→ 1-4 verdadeiros: Nível 2 (Business Logic)
|
|
95
|
-
→ 5 verdadeiro OU múltiplos domínios com modelos conflitantes: Nível 3 (BC)
|
|
96
|
-
```
|
|
99
|
+
[Task tool — domain-architect]
|
|
100
|
+
Prompt (do dispatch config, enriquecido com conteúdo da proposta):
|
|
101
|
+
|
|
102
|
+
Você é o Domain Architect da feature '$ARGUMENTS'.
|
|
97
103
|
|
|
98
|
-
|
|
104
|
+
Proposta da feature:
|
|
105
|
+
[conteúdo de .morph/features/$ARGUMENTS/0-proposal/proposal.md]
|
|
99
106
|
|
|
100
|
-
|
|
107
|
+
Standards de referência:
|
|
108
|
+
[.morph/framework/standards/architecture/ddd/complexity-levels.md]
|
|
101
109
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
110
|
+
Sua tarefa — responda cada ponto com "SIM" ou "NÃO" e cite trecho da proposta:
|
|
111
|
+
1. A entidade principal tem estados com transições? (ex: Draft → Confirmed → Shipped)
|
|
112
|
+
2. Existem invariants de negócio que impedem operações? (ex: "só cancela se Ativo")
|
|
113
|
+
3. Há cálculos derivados sobre a entidade? (ex: Total, Saldo, Desconto)
|
|
114
|
+
4. Outros módulos precisam reagir a mudanças? (Domain Events com consumidores reais)
|
|
115
|
+
5. A proposta declara explicitamente Bounded Context ou múltiplos domínios conflitantes?
|
|
107
116
|
|
|
108
|
-
|
|
117
|
+
Regra de decisão:
|
|
118
|
+
→ Todas "NÃO": Nível 1 (CRUD simples)
|
|
119
|
+
→ Alguma de 1-4 "SIM": Nível 2 (Business Logic com AggregateRoot)
|
|
120
|
+
→ 5 "SIM" OU múltiplos domínios com modelos conflitantes: Nível 3 (Bounded Context)
|
|
121
|
+
|
|
122
|
+
Retorne:
|
|
123
|
+
- Nível detectado (1, 2 ou 3)
|
|
124
|
+
- Justificativa com citações da proposta
|
|
125
|
+
- Para Nível 2+: Aggregate Blueprint inicial (entidade principal, value objects, invariants)
|
|
126
|
+
```
|
|
109
127
|
|
|
128
|
+
**Após receber o resultado:** Documente no spec.md (seção `## Domain Complexity`).
|
|
129
|
+
**Para Nível 2+:** Preencha o `## Aggregate Blueprint` no spec.md.
|
|
110
130
|
**Para Nível 3:** Adicione `BOUNDED_CONTEXT` como variável ao renderizar o template.
|
|
111
131
|
|
|
132
|
+
#### Caminho B: `vsa-architect` ativo (config com `architecture.style: "vertical-slice"`)
|
|
133
|
+
|
|
134
|
+
**Ref:** `framework/standards/architecture/vertical-slice/vertical-slice.md`
|
|
135
|
+
|
|
136
|
+
**Obtenha o taskPrompt do dispatch config** e use o Task tool:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
[Task tool — vsa-architect]
|
|
140
|
+
Prompt (do dispatch config, enriquecido com conteúdo da proposta):
|
|
141
|
+
|
|
142
|
+
Você é o VSA Specialist da feature '$ARGUMENTS'.
|
|
143
|
+
|
|
144
|
+
Proposta da feature:
|
|
145
|
+
[conteúdo de .morph/features/$ARGUMENTS/0-proposal/proposal.md]
|
|
146
|
+
|
|
147
|
+
Standards de referência:
|
|
148
|
+
[.morph/framework/standards/architecture/vertical-slice/vertical-slice.md]
|
|
149
|
+
|
|
150
|
+
Produza um VSA Blueprint:
|
|
151
|
+
1. ENTITY FIELDS: todos os campos com tipos C# corretos (sem AggregateRoot, sem Value Objects)
|
|
152
|
+
2. OPERATIONS: slices necessários (Create, GetAll, GetById, Update, Delete + operações customizadas)
|
|
153
|
+
3. ROUTES: HTTP method + rota por operação (ex: POST /api/products, GET /api/products/{id:guid})
|
|
154
|
+
4. ERROR TYPES: Error factory methods para {Entity}Errors
|
|
155
|
+
5. VALIDATION RULES: regras FluentValidation por campo por operação
|
|
156
|
+
|
|
157
|
+
Não use AggregateRoot, DomainEvent, CQRS formal, MediatR, Application Service layer.
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**Após receber o resultado:** Documente no spec.md (seção `## Architecture Style: Vertical Slice`).
|
|
161
|
+
|
|
112
162
|
---
|
|
113
163
|
|
|
114
164
|
### Passo 2: Analisar Código Existente (CRÍTICO - FAZER ANTES DE CONTRACTS!)
|
|
@@ -176,43 +226,50 @@ Se houver recursos Azure:
|
|
|
176
226
|
|
|
177
227
|
**SEMPRE usar Bicep para infra!**
|
|
178
228
|
|
|
179
|
-
### Passo 4: Gerar `contracts
|
|
229
|
+
### Passo 4: Gerar `contracts.cs` (BASEADO NO SCHEMA REAL!)
|
|
230
|
+
|
|
231
|
+
**⚠️ IMPORTANTE:** Use `schema-analysis.md` (do Passo 2) para gerar DTOs/campos corretos!
|
|
180
232
|
|
|
181
|
-
|
|
233
|
+
**Selecione o template baseado no arquiteto ativo:**
|
|
234
|
+
|
|
235
|
+
| Arquiteto ativo | Template |
|
|
236
|
+
|-----------------|---------|
|
|
237
|
+
| `vsa-architect` | `code/dotnet/contracts/contracts-vsa.cs` |
|
|
238
|
+
| `domain-architect` (Nível 1) | `code/dotnet/contracts/contracts-level1.cs` |
|
|
239
|
+
| `domain-architect` (Nível 2) | `code/dotnet/contracts/contracts-level2.cs` |
|
|
240
|
+
| `domain-architect` (Nível 3) | `code/dotnet/contracts/contracts-level3.cs` |
|
|
182
241
|
|
|
183
242
|
**Renderizar template:**
|
|
184
243
|
|
|
185
244
|
```bash
|
|
186
|
-
#
|
|
245
|
+
# Para projetos VSA:
|
|
246
|
+
npx morph-spec template render \
|
|
247
|
+
dotnet-contracts-vsa \
|
|
248
|
+
.morph/features/$ARGUMENTS/1-design/contracts.cs \
|
|
249
|
+
'{
|
|
250
|
+
"FEATURE_NAME": "$ARGUMENTS",
|
|
251
|
+
"NAMESPACE": "{ProjectNamespace}",
|
|
252
|
+
"ROUTE": "/api/{kebabCase FEATURE_NAME}s",
|
|
253
|
+
"DATE": "{{DATE}}"
|
|
254
|
+
}'
|
|
255
|
+
|
|
256
|
+
# Para projetos DDD (substituir N pelo nível detectado):
|
|
187
257
|
npx morph-spec template render \
|
|
188
258
|
code/dotnet/contracts/contracts-level{N}.cs \
|
|
189
259
|
.morph/features/$ARGUMENTS/1-design/contracts.cs \
|
|
190
260
|
'{
|
|
191
261
|
"FEATURE_NAME": "$ARGUMENTS",
|
|
192
262
|
"NAMESPACE": "{ProjectNamespace}",
|
|
193
|
-
"dtos": [...],
|
|
263
|
+
"dtos": [...],
|
|
194
264
|
"interfaces": [...],
|
|
195
265
|
"enums": [...],
|
|
196
266
|
"valueObjects": [...]
|
|
197
267
|
}'
|
|
198
268
|
```
|
|
199
269
|
|
|
200
|
-
**
|
|
270
|
+
**Após renderizar (VSA):** Preencha os campos `TODO` no template gerado com os campos reais da entidade, validators e mapeamentos do VSA Blueprint (Passo 1.5 Caminho B).
|
|
201
271
|
|
|
202
|
-
|
|
203
|
-
# Leia o template base:
|
|
204
|
-
Read: .morph/framework/templates/code/dotnet/contracts/contracts-level{N}.cs.hbs
|
|
205
|
-
|
|
206
|
-
# Preencha manualmente usando dados de schema-analysis.md
|
|
207
|
-
# Template contém placeholders para:
|
|
208
|
-
# - {{FEATURE_NAME_PASCAL}}
|
|
209
|
-
# - {{NAMESPACE}}
|
|
210
|
-
# - {{#each dtos}}...{{/each}}
|
|
211
|
-
# - {{#each interfaces}}...{{/each}}
|
|
212
|
-
# - {{#each enums}}...{{/each}}
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
**Padrões obrigatórios (já incluídos no template):**
|
|
272
|
+
**Padrões obrigatórios (DDD — já incluídos no template):**
|
|
216
273
|
- Records para DTOs (immutable)
|
|
217
274
|
- Interfaces para serviços
|
|
218
275
|
- CancellationToken em métodos async
|
|
@@ -221,6 +278,13 @@ Read: .morph/framework/templates/code/dotnet/contracts/contracts-level{N}.cs.hbs
|
|
|
221
278
|
- XML documentation comments
|
|
222
279
|
- Value objects para complex types
|
|
223
280
|
|
|
281
|
+
**Padrões obrigatórios (VSA — já incluídos no template):**
|
|
282
|
+
- Request + Response records no mesmo arquivo do Handler
|
|
283
|
+
- `sealed` em handlers, endpoints, validators, records
|
|
284
|
+
- `Guid.CreateVersion7()` para IDs
|
|
285
|
+
- `result.Match()` nos endpoints
|
|
286
|
+
- `{Entity}Errors` estático compartilhado por todos os slices da feature
|
|
287
|
+
|
|
224
288
|
**⚠️ CHECKPOINT: Verificar contra schema-analysis.md**
|
|
225
289
|
- [ ] Todos os field names correspondem ao schema real?
|
|
226
290
|
- [ ] Tipos de dados corretos (JSONB → JsonObject, não string)?
|
|
@@ -6,7 +6,7 @@ disable-model-invocation: true
|
|
|
6
6
|
context: fork
|
|
7
7
|
agent: general-purpose
|
|
8
8
|
user-invocable: false
|
|
9
|
-
cliVersion: "4.8.
|
|
9
|
+
cliVersion: "4.8.8"
|
|
10
10
|
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
11
11
|
---
|
|
12
12
|
|
|
@@ -31,6 +31,8 @@ Implemente as tasks definidas na FASE 4, com checkpoints a cada 3 tasks e recap
|
|
|
31
31
|
|
|
32
32
|
| Ação | Ferramenta | Alternativa |
|
|
33
33
|
|------|------------|-------------|
|
|
34
|
+
| Verificar viabilidade de paralelização | **Bash** `npx morph-spec dispatch-agents $ARGUMENTS implement` | Grupos de tasks + prompts de subagents |
|
|
35
|
+
| **Dispatch implementadores por domínio** (quando viável) | **Task** subagents — um por grupo | Backend + frontend + infra em paralelo |
|
|
34
36
|
| Ler task details | **Read** tasks.json, spec.md, contracts.cs | — |
|
|
35
37
|
| Criar novos arquivos | **Write** source files | — |
|
|
36
38
|
| Modificar arquivos existentes | **Edit** source files | — |
|
|
@@ -51,14 +53,70 @@ Implemente as tasks definidas na FASE 4, com checkpoints a cada 3 tasks e recap
|
|
|
51
53
|
**Anti-padrões:**
|
|
52
54
|
- ❌ Task agent para editar um único arquivo (use Edit direto)
|
|
53
55
|
- ✅ Task agent para implementar service layer em 5+ arquivos (multi-file legítimo)
|
|
56
|
+
- ✅ Task agents paralelos quando `tasks.total ≥ 6` e feature tem 2+ domínios ativos
|
|
54
57
|
- ❌ Bash `cat` para criar arquivos (use Write tool)
|
|
55
58
|
- ❌ Bash `sed` para modificar código (use Edit tool)
|
|
56
59
|
- ❌ Implementar sem ler contracts.cs primeiro (contracts são a fonte de verdade!)
|
|
60
|
+
- ❌ Implementar tasks de backend e frontend sequencialmente quando são independentes
|
|
61
|
+
- ❌ **(VSA)** Criar Application Service layer — handler acessa IRepository diretamente
|
|
62
|
+
- ❌ **(VSA)** Registrar handlers/endpoints manualmente no Program.cs — auto-discovery via reflection
|
|
63
|
+
- ❌ **(VSA)** Colocar Request/Response em arquivos separados do Handler
|
|
64
|
+
- ❌ **(VSA)** Usar `Guid.NewGuid()` — use `Guid.CreateVersion7()`
|
|
57
65
|
|
|
58
66
|
---
|
|
59
67
|
|
|
60
68
|
## Workflow
|
|
61
69
|
|
|
70
|
+
### Passo 0.5: Planejar Paralelização
|
|
71
|
+
|
|
72
|
+
**Execute antes de qualquer implementação:**
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
npx morph-spec dispatch-agents $ARGUMENTS implement
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Se `shouldDispatch: true` no output:**
|
|
79
|
+
|
|
80
|
+
1. Leia os `taskGroups` retornados (ex: `backend`, `frontend`, `infra`)
|
|
81
|
+
2. Para cada grupo com ≥ 3 tasks e sem dependências cruzadas, use **Task tool** com o `taskPrompt` do dispatch config:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
[Task tool — grupo backend, por exemplo]
|
|
85
|
+
Prompt do dispatch config enriquecido:
|
|
86
|
+
|
|
87
|
+
Você é o implementador do grupo BACKEND da feature '$ARGUMENTS'.
|
|
88
|
+
|
|
89
|
+
Contexto completo:
|
|
90
|
+
- Spec: [conteúdo de .morph/features/$ARGUMENTS/1-design/spec.md]
|
|
91
|
+
- Contracts: [conteúdo de .morph/features/$ARGUMENTS/1-design/contracts.cs]
|
|
92
|
+
- Tasks do grupo: [lista de TXXX do grupo backend]
|
|
93
|
+
|
|
94
|
+
Para cada task do grupo, em ordem:
|
|
95
|
+
1. Execute: npx morph-spec task start $ARGUMENTS TXXX
|
|
96
|
+
2. Leia a descrição completa da task
|
|
97
|
+
3. Implemente os arquivos — use Write (novo) ou Edit (existente)
|
|
98
|
+
4. Verifique build: [dotnet build / npm run build]
|
|
99
|
+
5. Execute: npx morph-spec task done $ARGUMENTS TXXX
|
|
100
|
+
|
|
101
|
+
A cada 3 tasks:
|
|
102
|
+
- Execute: npx morph-spec checkpoint-save $ARGUMENTS
|
|
103
|
+
- Execute: npx morph-spec validate-feature $ARGUMENTS --phase implement
|
|
104
|
+
- Reporte qualquer falha de validação antes de continuar
|
|
105
|
+
|
|
106
|
+
Restrições OBRIGATÓRIAS:
|
|
107
|
+
- Modifique APENAS os arquivos listados nas tasks do grupo BACKEND
|
|
108
|
+
- NÃO toque em arquivos de frontend, UI ou infra
|
|
109
|
+
- Se encontrar dependência em outro grupo, pause e reporte
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
3. Dispare os Task subagents dos grupos em **paralelo** (quando sem dependências entre si)
|
|
113
|
+
4. Após todos completarem, valide integração: `npx morph-spec validate-feature $ARGUMENTS --phase implement`
|
|
114
|
+
|
|
115
|
+
**Se `shouldDispatch: false`** (feature pequena ou single-domain):
|
|
116
|
+
→ Continue para o workflow sequencial normal abaixo.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
62
120
|
### CHECKPOINT DE ENTRADA: Verificar Pré-requisitos
|
|
63
121
|
|
|
64
122
|
**⏸️ Antes de iniciar implementação:**
|
|
@@ -90,6 +148,86 @@ Leia TODOS os outputs antes de implementar:
|
|
|
90
148
|
5. `.morph/features/$ARGUMENTS/1-design/schema-analysis.md` — Schema real (se existir)
|
|
91
149
|
6. `.morph/features/$ARGUMENTS/2-ui/design-system.md` — Design tokens (se existir)
|
|
92
150
|
|
|
151
|
+
**Detectar estilo de arquitetura:**
|
|
152
|
+
```bash
|
|
153
|
+
# Leia config para saber se é VSA ou DDD:
|
|
154
|
+
cat .morph/config/config.json | grep architecture
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Se `config.architecture.style === "vertical-slice"` → siga o **Passo 1.5** antes de implementar.
|
|
158
|
+
Caso contrário → vá direto para o Passo 2.
|
|
159
|
+
|
|
160
|
+
### Passo 1.5: Guia de Implementação VSA (somente se `style: "vertical-slice"`)
|
|
161
|
+
|
|
162
|
+
> **Ref:** `framework/standards/architecture/vertical-slice/vertical-slice.md`
|
|
163
|
+
|
|
164
|
+
**Estrutura de arquivos obrigatória por slice:**
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
Features/
|
|
168
|
+
└── {Entity}Feature/
|
|
169
|
+
├── {Entity}Errors.cs ← 1 arquivo por feature (compartilhado)
|
|
170
|
+
├── Create{Entity}/
|
|
171
|
+
│ ├── Create{Entity}Handler.cs ← Request + Response records + Handler
|
|
172
|
+
│ ├── Create{Entity}Validator.cs ← AbstractValidator<Request>
|
|
173
|
+
│ └── Create{Entity}Endpoint.cs ← IApiEndpoint (internal sealed)
|
|
174
|
+
├── GetAll{Entity}s/
|
|
175
|
+
│ ├── GetAll{Entity}sHandler.cs ← sem Validator (sem parâmetros)
|
|
176
|
+
│ └── GetAll{Entity}sEndpoint.cs
|
|
177
|
+
├── Get{Entity}ById/
|
|
178
|
+
│ ├── Get{Entity}ByIdHandler.cs
|
|
179
|
+
│ ├── Get{Entity}ByIdValidator.cs
|
|
180
|
+
│ └── Get{Entity}ByIdEndpoint.cs
|
|
181
|
+
├── Update{Entity}/
|
|
182
|
+
│ ├── Update{Entity}Handler.cs
|
|
183
|
+
│ ├── Update{Entity}Validator.cs
|
|
184
|
+
│ └── Update{Entity}Endpoint.cs
|
|
185
|
+
└── Delete{Entity}/
|
|
186
|
+
├── Delete{Entity}Handler.cs
|
|
187
|
+
├── Delete{Entity}Validator.cs
|
|
188
|
+
└── Delete{Entity}Endpoint.cs
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**Regras obrigatórias ao implementar cada slice:**
|
|
192
|
+
1. `Request` e `Response` records ficam no **mesmo arquivo** que o `Handler`
|
|
193
|
+
2. Tudo `sealed` — handlers, endpoints, validators, records
|
|
194
|
+
3. `Guid.CreateVersion7()` para gerar IDs (não `Guid.NewGuid()`)
|
|
195
|
+
4. Endpoints usam `result.Match(onSuccess, onFailure)` — nunca acesse `result.Value` sem checar `IsSuccess`
|
|
196
|
+
5. Endpoints são `internal sealed` (não public)
|
|
197
|
+
6. `{Entity}Errors` é static e compartilhado entre todos os slices da feature
|
|
198
|
+
7. Handlers de escrita (Create/Update/Delete) injetam `IRepository<T>` + `IUnitOfWork`
|
|
199
|
+
8. Handlers de leitura (GetAll/GetById) injetam apenas `IRepository<T>`
|
|
200
|
+
9. GetAll não tem Validator
|
|
201
|
+
|
|
202
|
+
**Registrar entidade no DbContext:**
|
|
203
|
+
```csharp
|
|
204
|
+
// Database/ApplicationDbContext.cs — adicionar:
|
|
205
|
+
public DbSet<{Entity}> {Entities} { get; set; } = null!;
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**Criar migration após DbContext atualizado:**
|
|
209
|
+
```bash
|
|
210
|
+
dotnet ef migrations add Add{Entity}
|
|
211
|
+
dotnet ef database update
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**Registrar tag em ApiTags (se necessário):**
|
|
215
|
+
```csharp
|
|
216
|
+
// Constants/ApiTags.cs — adicionar:
|
|
217
|
+
public const string {Entities} = "{entities}";
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**O que NÃO precisa fazer (auto-discovery via reflection):**
|
|
221
|
+
- ❌ Registrar handler manualmente no Program.cs — `AddHandlersFromAssembly()` faz isso
|
|
222
|
+
- ❌ Registrar endpoint manualmente — `RegisterApiEndpointsFromAssembly()` faz isso
|
|
223
|
+
- ❌ Registrar validator manualmente — `AddValidatorsFromAssembly()` faz isso
|
|
224
|
+
- ❌ Criar Application Service layer — handler acessa IRepository diretamente
|
|
225
|
+
|
|
226
|
+
**Verificar build após cada slice completo:**
|
|
227
|
+
```bash
|
|
228
|
+
dotnet build
|
|
229
|
+
```
|
|
230
|
+
|
|
93
231
|
### Passo 2: Iniciar Primeira Task
|
|
94
232
|
|
|
95
233
|
```bash
|
|
@@ -4,7 +4,7 @@ description: MORPH-SPEC Phase 1 (Setup). Reads project context, detects tech sta
|
|
|
4
4
|
argument-hint: "[feature-name]"
|
|
5
5
|
user-invocable: false
|
|
6
6
|
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
7
|
-
cliVersion: "4.8.
|
|
7
|
+
cliVersion: "4.8.8"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# MORPH Setup - FASE 1
|
|
@@ -29,7 +29,8 @@ Inicialize o contexto e prepare o ambiente para uma feature aprovada.
|
|
|
29
29
|
| Verificar state | **Bash** `npx morph-spec state get` | — |
|
|
30
30
|
| Detectar agentes + standards | **Read** `.morph/framework/agents.json` → match keywords → **Bash** `npx morph-spec state add-agent` | — |
|
|
31
31
|
| Ler contexto do projeto | **Read** `.morph/context/README.md` | — |
|
|
32
|
-
| Ler config | **Read** `.morph/config.json` | — |
|
|
32
|
+
| Ler config | **Read** `.morph/config/config.json` | — |
|
|
33
|
+
| Detectar arquitetura VSA | **Read** `.morph/config/config.json` → verificar `config.architecture.style` | — |
|
|
33
34
|
| Escanear estrutura do projeto | **Glob** `src/**/*.{ts,tsx,cs}` | — |
|
|
34
35
|
| Metadata do repositório | **GitHub MCP** `get_repo()` | **Bash** `gh repo view --json` |
|
|
35
36
|
| Atualizar state | **Bash** `npx morph-spec state set` | — |
|
|
@@ -38,7 +39,7 @@ Inicialize o contexto e prepare o ambiente para uma feature aprovada.
|
|
|
38
39
|
|
|
39
40
|
**Anti-padrões:**
|
|
40
41
|
- ❌ Chamar `detect-agents` CLI (não existe — leia `.morph/framework/agents.json` diretamente)
|
|
41
|
-
- ❌ Task agent para
|
|
42
|
+
- ❌ Task agent para o keyword matching inline de stack detection (rápido o suficiente direto)
|
|
42
43
|
- ❌ WebSearch para info local do projeto (use Read/Glob)
|
|
43
44
|
|
|
44
45
|
---
|
|
@@ -70,11 +71,25 @@ Se não existir, volte para FASE 0 (proposal).
|
|
|
70
71
|
|
|
71
72
|
### Passo 2: Detectar Agentes e Carregar Standards
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
#### Passo 2.0: Detectar Estilo de Arquitetura e Ativar Arquiteto
|
|
75
|
+
|
|
76
|
+
**Leia `.morph/config/config.json` e verifique `config.architecture.style`:**
|
|
77
|
+
|
|
78
|
+
| Valor | Ação |
|
|
79
|
+
|-------|------|
|
|
80
|
+
| `"vertical-slice"` | `npx morph-spec state add-agent $ARGUMENTS vsa-architect` |
|
|
81
|
+
| ausente / qualquer outro | `npx morph-spec state add-agent $ARGUMENTS domain-architect` |
|
|
82
|
+
|
|
83
|
+
**Prossiga com keyword detection normal para os demais agentes** (ef-modeler, api-designer, etc.).
|
|
84
|
+
O arquiteto já foi adicionado acima — **ignore-o no keyword matching** para evitar duplicação.
|
|
85
|
+
|
|
86
|
+
#### Passo 2.1: Keyword Detection
|
|
87
|
+
|
|
88
|
+
**Leia agents.json diretamente e faça o match de keywords** (exceto `domain-architect` e `vsa-architect` que já foram tratados no Passo 2.0):
|
|
74
89
|
|
|
75
90
|
1. Leia `.morph/framework/agents.json`
|
|
76
91
|
2. Extraia título e descrição da feature de `0-proposal/proposal.md`
|
|
77
|
-
3. Para cada agente no JSON, verifique se alguma keyword do campo `keywords[]` aparece no texto da proposta
|
|
92
|
+
3. Para cada agente no JSON (exceto arquitetos), verifique se alguma keyword do campo `keywords[]` aparece no texto da proposta
|
|
78
93
|
4. Adicione os agentes correspondentes ao state:
|
|
79
94
|
|
|
80
95
|
```bash
|
|
@@ -104,7 +119,7 @@ Baseado no proposal e contexto, confirme:
|
|
|
104
119
|
- Padrões arquiteturais aplicáveis
|
|
105
120
|
- Componentes reutilizáveis existentes
|
|
106
121
|
|
|
107
|
-
### Passo 4: Listar Agentes Ativos
|
|
122
|
+
### Passo 4: Listar Agentes Ativos e Preview de Dispatch
|
|
108
123
|
|
|
109
124
|
Mostre os agentes detectados no proposal:
|
|
110
125
|
|
|
@@ -114,6 +129,14 @@ npx morph-spec state get $ARGUMENTS
|
|
|
114
129
|
|
|
115
130
|
Parse o JSON e liste os `activeAgents` com seus emojis e responsabilidades (consulte `.morph/framework/agents.json`).
|
|
116
131
|
|
|
132
|
+
**Se houver 2+ agentes especialistas ativos**, mostre o plano de dispatch para as próximas fases:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
npx morph-spec dispatch-agents $ARGUMENTS design
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Isso informa quais agentes serão disparados em paralelo na fase de design e quais tasks eles executarão.
|
|
139
|
+
|
|
117
140
|
### Passo 5: Atualizar State
|
|
118
141
|
|
|
119
142
|
Marque a feature como na fase SETUP:
|
|
@@ -5,7 +5,7 @@ argument-hint: "[feature-name]"
|
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
user-invocable: false
|
|
7
7
|
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
8
|
-
cliVersion: "4.8.
|
|
8
|
+
cliVersion: "4.8.8"
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# MORPH Tasks - FASE 4
|
|
@@ -40,8 +40,9 @@ Quebre a especificação em tasks executáveis, defina ordem de execução e est
|
|
|
40
40
|
**MCPs desta fase:** Context7 (estimar complexidade), GitHub (criar issues).
|
|
41
41
|
|
|
42
42
|
**Anti-padrões:**
|
|
43
|
-
- ❌ Task agent para quebrar spec simples (faça diretamente)
|
|
44
|
-
- ✅ Task agent para specs
|
|
43
|
+
- ❌ Task agent para quebrar spec simples de 1 domínio (faça diretamente)
|
|
44
|
+
- ✅ Task agent para specs multi-domínio (backend + frontend + infra = 3 planners em paralelo)
|
|
45
|
+
- ✅ Task agent quando spec tem 20+ requisitos em múltiplos bounded contexts
|
|
45
46
|
- ❌ Criar tasks.json sem ler todos os outputs primeiro
|
|
46
47
|
|
|
47
48
|
---
|
|
@@ -4,7 +4,7 @@ description: MORPH-SPEC Phase 1.5 (UI/UX). Creates design-system.md, mockups.md,
|
|
|
4
4
|
argument-hint: "[feature-name]"
|
|
5
5
|
user-invocable: false
|
|
6
6
|
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
7
|
-
cliVersion: "4.8.
|
|
7
|
+
cliVersion: "4.8.8"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# MORPH UI/UX Design - FASE 1.5
|