@polymorphism-tech/morph-spec 4.8.7 → 4.8.9

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 (35) hide show
  1. package/README.md +2 -2
  2. package/bin/morph-spec.js +22 -1
  3. package/bin/task-manager.cjs +120 -16
  4. package/claude-plugin.json +1 -1
  5. package/docs/CHEATSHEET.md +1 -1
  6. package/docs/QUICKSTART.md +1 -1
  7. package/framework/agents.json +1855 -1815
  8. package/framework/hooks/claude-code/pre-compact/save-morph-context.js +141 -23
  9. package/framework/hooks/claude-code/statusline.py +0 -12
  10. package/framework/hooks/claude-code/statusline.sh +6 -2
  11. package/framework/hooks/claude-code/stop/validate-completion.js +70 -23
  12. package/framework/hooks/dev/guard-version-numbers.js +1 -1
  13. package/framework/skills/level-0-meta/morph-init/SKILL.md +44 -6
  14. package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +67 -16
  15. package/framework/skills/level-1-workflows/phase-clarify/SKILL.md +1 -1
  16. package/framework/skills/level-1-workflows/phase-codebase-analysis/SKILL.md +77 -7
  17. package/framework/skills/level-1-workflows/phase-design/SKILL.md +115 -51
  18. package/framework/skills/level-1-workflows/phase-implement/SKILL.md +139 -1
  19. package/framework/skills/level-1-workflows/phase-setup/SKILL.md +29 -6
  20. package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +115 -5
  21. package/framework/skills/level-1-workflows/phase-tasks/references/tasks-example.md +173 -0
  22. package/framework/skills/level-1-workflows/phase-uiux/SKILL.md +1 -1
  23. package/framework/standards/STANDARDS.json +944 -933
  24. package/framework/standards/architecture/vertical-slice/vertical-slice.md +429 -0
  25. package/framework/templates/REGISTRY.json +1909 -1888
  26. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +282 -0
  27. package/framework/templates/docs/spec.md +33 -1
  28. package/package.json +1 -1
  29. package/src/commands/agents/dispatch-agents.js +430 -0
  30. package/src/commands/agents/index.js +2 -1
  31. package/src/commands/project/doctor.js +138 -2
  32. package/src/commands/state/state.js +20 -4
  33. package/src/commands/templates/generate-contracts.js +445 -0
  34. package/src/commands/templates/index.js +1 -0
  35. 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.7"
6
+ cliVersion: "4.8.9"
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 disponível:
49
- Usar Método A (MCP direto)
50
- SE MCP Database disponível:
51
- → Usar Método A adaptado
52
- SENÃO:
53
- Usar Método B (análise estática de código)
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:
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: phase-design
3
- description: MORPH-SPEC Phase 2 (Design). Analyzes codebase/schema, then produces spec.md, contracts-level{N}.cs, schema-analysis.md, and decisions.md for the feature. Use after setup phase to create a full technical specification with C# contracts based on the real database schema and architecture decision records.
3
+ description: MORPH-SPEC Phase 2 (Design). Analyzes codebase/schema, then produces spec.md, contracts.cs (contracts-vsa.cs for VSA or contracts-level{N}.cs for DDD), schema-analysis.md, and decisions.md for the feature. Use after setup phase to create a full technical specification with C# contracts based on the real database schema and architecture decision records.
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"
7
+ cliVersion: "4.8.9"
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 (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 | — |
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 Standards
63
+ ### Passo 1: Carregar Contexto, Agentes e Dispatch Config
58
64
 
59
- **Obtenha feature state e standards context:**
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
- Parse o JSON para obter `activeAgents`, então carregue os standards context da FASE 1:
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
- **Use standards context ao gerar spec.md:**
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: Detectar Nível de Domínio (domain-architect)
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
- **⚠️ OBRIGATÓRIO:** Execute antes de gerar qualquer contrato.
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
- O `domain-architect` analisa a `proposal.md` e responde às seguintes perguntas:
96
+ **Obtenha o taskPrompt do dispatch config** e use o Task tool:
85
97
 
86
98
  ```
87
- 1. A entidade principal tem estados com transições? (Draft → Confirmed → Shipped)
88
- 2. Existem invariants de negócio? ("só cancela se estiver Ativo")
89
- 3. Cálculos derivados existem? (Total, Saldo, Desconto)
90
- 4. Outros módulos precisam reagir a mudanças? (Domain Events com consumidores)
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
- **Documente no spec.md** (seção `## Domain Complexity`) antes de continuar para o Passo 3.
104
+ Proposta da feature:
105
+ [conteúdo de .morph/features/$ARGUMENTS/0-proposal/proposal.md]
99
106
 
100
- **Template a usar no Passo 4 (contracts-level{N}.cs):**
107
+ Standards de referência:
108
+ [.morph/framework/standards/architecture/ddd/complexity-levels.md]
101
109
 
102
- | Nível | Template |
103
- |-------|----------|
104
- | 1 | `code/dotnet/contracts/contracts-level1.cs` |
105
- | 2 | `code/dotnet/contracts/contracts-level2.cs` |
106
- | 3 | `code/dotnet/contracts/contracts-level3.cs` |
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. 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
- **Para Nível 2+:** Preencha o `## Aggregate Blueprint` no spec.md antes de gerar contracts-level{N}.cs.
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-level{N}.cs` (BASEADO NO SCHEMA REAL!)
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
- **⚠️ IMPORTANTE:** Use `schema-analysis.md` (do Passo 2) para gerar DTOs corretos!
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
- # Use o template de contracts com dados do schema-analysis.md:
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": [...], # Extrair de schema-analysis.md
263
+ "dtos": [...],
194
264
  "interfaces": [...],
195
265
  "enums": [...],
196
266
  "valueObjects": [...]
197
267
  }'
198
268
  ```
199
269
 
200
- **OU use Read tool para ler template:**
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
- ```bash
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.7"
9
+ cliVersion: "4.8.9"
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"
7
+ cliVersion: "4.8.9"
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 detectar stack (leia agents.json e faça o match de keywords inline)
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
- **Leia agents.json diretamente e faça o match de keywords:**
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: