@polymorphism-tech/morph-spec 4.9.0 → 4.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/bin/morph-spec.js +30 -0
- package/bin/task-manager.js +34 -22
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/CLAUDE.md +99 -98
- package/framework/agents.json +37 -7
- package/framework/commands/commit.md +166 -0
- package/framework/commands/morph-apply.md +13 -2
- package/framework/commands/morph-archive.md +8 -2
- package/framework/commands/morph-infra.md +6 -0
- package/framework/commands/morph-preflight.md +6 -0
- package/framework/commands/morph-proposal.md +56 -7
- package/framework/commands/morph-status.md +6 -0
- package/framework/commands/morph-troubleshoot.md +6 -0
- package/framework/hooks/claude-code/notification/approval-reminder.js +3 -2
- package/framework/hooks/claude-code/post-tool-use/dispatch.js +154 -31
- package/framework/hooks/claude-code/post-tool-use/skill-reminder.js +7 -84
- package/framework/hooks/claude-code/post-tool-use/validator-feedback.js +8 -17
- package/framework/hooks/claude-code/pre-compact/save-morph-context.js +16 -3
- package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +4 -3
- package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +3 -2
- package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +60 -0
- package/framework/hooks/claude-code/session-start/inject-morph-context.js +55 -2
- package/framework/hooks/claude-code/session-start/post-compact-restore.js +41 -0
- package/framework/hooks/claude-code/stop/validate-completion.js +2 -15
- package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +23 -5
- package/framework/hooks/shared/compact-restore.js +100 -0
- package/framework/hooks/shared/dispatch-helpers.js +116 -0
- package/framework/hooks/shared/phase-utils.js +9 -5
- package/framework/hooks/shared/state-reader.js +27 -3
- package/framework/phases.json +30 -7
- package/framework/rules/morph-workflow.md +88 -86
- package/framework/skills/level-0-meta/mcp-registry.json +86 -51
- package/framework/skills/level-0-meta/{brainstorming → morph-brainstorming}/SKILL.md +13 -16
- package/framework/skills/level-0-meta/{code-review → morph-code-review}/SKILL.md +1 -1
- package/framework/skills/level-0-meta/{code-review-nextjs → morph-code-review-nextjs}/SKILL.md +2 -2
- package/framework/skills/level-0-meta/{frontend-review → morph-frontend-review}/SKILL.md +5 -5
- package/framework/skills/level-0-meta/morph-init/SKILL.md +72 -7
- package/framework/skills/level-0-meta/{post-implementation → morph-post-implementation}/SKILL.md +9 -9
- package/framework/skills/level-0-meta/morph-replicate/SKILL.md +1 -1
- package/framework/skills/level-0-meta/{terminal-title → morph-terminal-title}/SKILL.md +1 -1
- package/framework/skills/level-0-meta/{tool-usage-guide → morph-tool-usage-guide}/SKILL.md +2 -3
- package/framework/skills/level-0-meta/{tool-usage-guide → morph-tool-usage-guide}/references/tools-per-phase.md +1 -2
- package/framework/skills/level-0-meta/{verification-before-completion → morph-verification-before-completion}/SKILL.md +1 -1
- package/framework/skills/level-0-meta/{verification-before-completion → morph-verification-before-completion}/scripts/check-phase-outputs.mjs +2 -2
- package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +238 -0
- package/framework/skills/level-1-workflows/{phase-codebase-analysis → morph-phase-codebase-analysis}/SKILL.md +251 -251
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +507 -0
- package/framework/skills/level-1-workflows/{phase-implement → morph-phase-implement}/SKILL.md +590 -491
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/code-quality-reviewer-prompt.md +50 -0
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +45 -0
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/spec-reviewer-prompt.md +47 -0
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +254 -0
- package/framework/skills/level-1-workflows/{phase-setup → morph-phase-setup}/SKILL.md +237 -194
- package/framework/skills/level-1-workflows/{phase-tasks → morph-phase-tasks}/SKILL.md +307 -270
- package/framework/skills/level-1-workflows/{phase-tasks → morph-phase-tasks}/scripts/validate-tasks.mjs +3 -3
- package/framework/skills/level-1-workflows/{phase-uiux → morph-phase-uiux}/SKILL.md +320 -285
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +97 -0
- package/framework/standards/integration/mcp/mcp-tools.md +25 -7
- package/framework/templates/docs/onboarding.md +2 -2
- package/package.json +1 -2
- package/src/commands/agents/dispatch-agents.js +50 -3
- package/src/commands/mcp/mcp-setup.js +39 -2
- package/src/commands/phase/phase-reset.js +74 -0
- package/src/commands/project/doctor.js +19 -5
- package/src/commands/scope/escalate.js +215 -0
- package/src/commands/state/advance-phase.js +27 -53
- package/src/commands/state/state.js +1 -1
- package/src/commands/task/expand.js +100 -0
- package/src/core/paths/output-schema.js +4 -3
- package/src/core/state/phase-state-machine.js +7 -4
- package/src/core/state/state-manager.js +4 -3
- package/src/lib/detectors/claude-config-detector.js +93 -347
- package/src/lib/detectors/design-system-detector.js +189 -189
- package/src/lib/detectors/index.js +155 -57
- package/src/lib/generators/context-generator.js +2 -2
- package/src/lib/installers/mcp-installer.js +37 -5
- package/src/lib/phase-chain/phase-validator.js +22 -16
- package/src/lib/scope/impact-analyzer.js +106 -0
- package/src/lib/tasks/task-parser.js +1 -1
- package/src/lib/validators/shared/emit-validator-dispatch.js +64 -0
- package/src/scripts/setup-infra.js +15 -0
- package/src/utils/agents-installer.js +32 -12
- package/src/utils/file-copier.js +0 -1
- package/src/utils/hooks-installer.js +15 -1
- package/framework/skills/level-1-workflows/phase-clarify/SKILL.md +0 -216
- package/framework/skills/level-1-workflows/phase-design/SKILL.md +0 -383
- package/src/commands/project/index.js +0 -8
- package/src/core/index.js +0 -10
- package/src/core/state/index.js +0 -8
- package/src/core/templates/index.js +0 -9
- package/src/core/templates/template-data-sources.js +0 -325
- package/src/core/workflows/index.js +0 -7
- package/src/lib/detectors/config-detector.js +0 -223
- package/src/lib/detectors/standards-generator.js +0 -335
- package/src/lib/detectors/structure-detector.js +0 -275
- package/src/lib/monitor/agent-resolver.js +0 -144
- package/src/lib/monitor/renderer.js +0 -230
- package/src/lib/orchestration/index.js +0 -7
- package/src/lib/orchestration/team-orchestrator.js +0 -404
- package/src/sanitizer/context-sanitizer.js +0 -221
- package/src/sanitizer/patterns.js +0 -163
- package/src/writer/file-writer.js +0 -86
- /package/framework/skills/level-0-meta/{brainstorming → morph-brainstorming}/references/proposal-example.md +0 -0
- /package/framework/skills/level-0-meta/{code-review → morph-code-review}/references/review-example.md +0 -0
- /package/framework/skills/level-0-meta/{code-review → morph-code-review}/references/review-guidelines.md +0 -0
- /package/framework/skills/level-0-meta/{code-review → morph-code-review}/scripts/scan-csharp.mjs +0 -0
- /package/framework/skills/level-0-meta/{code-review-nextjs → morph-code-review-nextjs}/references/review-example-nextjs.md +0 -0
- /package/framework/skills/level-0-meta/{code-review-nextjs → morph-code-review-nextjs}/scripts/scan-nextjs.mjs +0 -0
- /package/framework/skills/level-0-meta/{frontend-review → morph-frontend-review}/scripts/scan-accessibility.mjs +0 -0
- /package/framework/skills/level-0-meta/{post-implementation → morph-post-implementation}/scripts/detect-dev-server.mjs +0 -0
- /package/framework/skills/level-0-meta/{post-implementation → morph-post-implementation}/scripts/detect-stack.mjs +0 -0
- /package/framework/skills/level-0-meta/{simulation-checklist → morph-simulation-checklist}/SKILL.md +0 -0
- /package/framework/skills/level-0-meta/{terminal-title → morph-terminal-title}/scripts/set_title.sh +0 -0
- /package/framework/skills/level-1-workflows/{phase-clarify → morph-phase-clarify}/references/clarifications-example.md +0 -0
- /package/framework/skills/level-1-workflows/{phase-design → morph-phase-design}/references/architecture-analysis-guide.md +0 -0
- /package/framework/skills/level-1-workflows/{phase-design → morph-phase-design}/references/spec-authoring-guide.md +0 -0
- /package/framework/skills/level-1-workflows/{phase-design → morph-phase-design}/references/spec-example.md +0 -0
- /package/framework/skills/level-1-workflows/{phase-implement → morph-phase-implement}/references/recap-example.md +0 -0
- /package/framework/skills/level-1-workflows/{phase-implement → morph-phase-implement}/references/vsa-implementation-guide.md +0 -0
- /package/framework/skills/level-1-workflows/{phase-tasks → morph-phase-tasks}/references/task-planning-patterns.md +0 -0
- /package/framework/skills/level-1-workflows/{phase-tasks → morph-phase-tasks}/references/tasks-example.md +0 -0
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: morph:phase-design
|
|
3
|
+
description: MORPH-SPEC Phase 2 (Design). Schema-first interactive design: reads EF models/Supabase/DB, validates findings with user, then routes to VSA Blueprint or DDD Architecture Blueprint based on config.architecture.style, producing spec.md, contracts.cs, schema-analysis.md, and decisions.md through a quality loop (score 0-100). Use after setup phase to create technical specifications grounded in the real database schema.
|
|
4
|
+
argument-hint: "[feature-name]"
|
|
5
|
+
user-invocable: false
|
|
6
|
+
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
7
|
+
cliVersion: "4.10.0"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# MORPH Design - FASE 2
|
|
11
|
+
|
|
12
|
+
> INTERNAL: Workflow skill used by /morph-proposal during automated phase orchestration. Not a user command.
|
|
13
|
+
|
|
14
|
+
Design técnico interativo: schema primeiro, blueprint validado, artefatos gerados com loop de qualidade.
|
|
15
|
+
|
|
16
|
+
## Pré-requisitos
|
|
17
|
+
|
|
18
|
+
- [ ] FASE 1 (Setup) concluída
|
|
19
|
+
- [ ] FASE 1.5 (UI/UX) concluída OU pulada
|
|
20
|
+
- [ ] Proposta aprovada pelo usuário
|
|
21
|
+
|
|
22
|
+
## Ferramentas Recomendadas
|
|
23
|
+
|
|
24
|
+
> **Ref:** `framework/skills/level-0-meta/morph-tool-usage-guide/SKILL.md` para guia completo.
|
|
25
|
+
> **Example:** `references/spec-example.md` — filled-in spec.md showing expected output quality.
|
|
26
|
+
|
|
27
|
+
| Ação | Ferramenta | Alternativa |
|
|
28
|
+
|------|------------|-------------|
|
|
29
|
+
| Ler proposal + UI specs | **Read** output files | — |
|
|
30
|
+
| **Detectar arquitetura** | **Bash** `cat .morph/config/config.json \| grep -A3 '"architecture"'` | **Read** config.json |
|
|
31
|
+
| **Schema: Supabase** | **Supabase MCP** `list_tables()`, `get_table_schema()`, `get_relationships()` | — |
|
|
32
|
+
| **Schema: EF Core** | **Glob** `**/Entities/**/*.cs` + **Glob** `**/*Context.cs` → **Read** | **Grep** `DbSet<` |
|
|
33
|
+
| **Schema: Next.js/TS** | **Glob** `src/**/types/**/*.ts` + **Grep** `interface\|type.*=` | — |
|
|
34
|
+
| Schema: políticas RLS | **Supabase MCP** `query()` com `pg_policies` | **Read** policy files |
|
|
35
|
+
| Dispatch vsa-architect | **Agent** `subagent_type=vsa-architect` + `prompt=agent.taskPrompt` | — |
|
|
36
|
+
| Dispatch domain-architect | **Agent** `subagent_type=domain-architect` + `prompt=agent.taskPrompt` | — |
|
|
37
|
+
| Dispatch tech leads | **Agent** para cada agente ativo do dispatch config | — |
|
|
38
|
+
| Research biblioteca | **Context7 MCP** `query_docs()` | **WebSearch** + **WebFetch** |
|
|
39
|
+
| Renderizar contracts VSA | **Bash** `npx morph-spec template render dotnet-contracts-vsa ...` | — |
|
|
40
|
+
| Renderizar contracts DDD | **Bash** `npx morph-spec template render dotnet-contracts-level{N} ...` | — |
|
|
41
|
+
| Renderizar spec.md | **Bash** `npx morph-spec template render docs/spec ...` | — |
|
|
42
|
+
| Renderizar decisions.md | **Bash** `npx morph-spec template render docs/decisions ...` | — |
|
|
43
|
+
| Atualizar state | **Bash** `npx morph-spec state mark-output $ARGUMENTS <type>` | — |
|
|
44
|
+
|
|
45
|
+
**Anti-padrões:**
|
|
46
|
+
- ❌ Gerar contratos antes de ler o schema real — campos adivinhados corrompem todo o design
|
|
47
|
+
- ❌ Apresentar Blueprint sem validar com o usuário primeiro
|
|
48
|
+
- ❌ Perguntas como texto simples — sempre use `AskUserQuestion`
|
|
49
|
+
- ❌ Executar schema analysis e blueprint em sequência — são independentes, paralelize
|
|
50
|
+
- ❌ Ignorar `config.architecture.style` — sempre detecte antes do CHECKPOINT 2
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## ✅ PRÉ-VOO
|
|
55
|
+
|
|
56
|
+
**PASSO 0 (ANTES de qualquer leitura ou escrita) — Garantir fase design:**
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx morph-spec state get $ARGUMENTS
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Verifique o campo `"phase"` no output:
|
|
63
|
+
|
|
64
|
+
**Se `"phase": "design"`** → ✅ fase correta, prossiga.
|
|
65
|
+
|
|
66
|
+
**Se `"phase": "proposal"`** → execute em sequência:
|
|
67
|
+
1. `npx morph-spec state mark-output $ARGUMENTS proposal`
|
|
68
|
+
2. `npx morph-spec phase advance $ARGUMENTS` (→ setup)
|
|
69
|
+
3. `npx morph-spec phase advance $ARGUMENTS` (→ design)
|
|
70
|
+
|
|
71
|
+
**Se `"phase": "setup"`** → execute:
|
|
72
|
+
1. `npx morph-spec phase advance $ARGUMENTS` (→ design)
|
|
73
|
+
|
|
74
|
+
**Qualquer outro valor** → ⛔ não prossiga — estado inconsistente, reporte ao usuário.
|
|
75
|
+
|
|
76
|
+
> **Regra:** Nunca escreva em `1-design/` enquanto a fase não for `design`. O hook bloqueará e a sequência ficará corrompida.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
Leia em paralelo:
|
|
81
|
+
```
|
|
82
|
+
Read: .morph/features/$ARGUMENTS/0-proposal/proposal.md
|
|
83
|
+
+ Read: .morph/config/config.json ← detectar architecture.style
|
|
84
|
+
+ Read: .morph/context/README.md
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Detectar estilo de arquitetura:**
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
cat .morph/config/config.json | grep -A3 '"architecture"'
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
| Valor de `config.architecture.style` | Caminho |
|
|
94
|
+
|--------------------------------------|---------|
|
|
95
|
+
| `"vertical-slice"` | → **VSA** (CHECKPOINT 2-VSA + contratos VSA) |
|
|
96
|
+
| qualquer outro valor ou ausente | → **DDD** (CHECKPOINT 2-DDD + contratos DDD) |
|
|
97
|
+
|
|
98
|
+
Se escopo ≥ 20 tasks ou refactor toca ≥ 5 arquivos de domínio → **EnterPlanMode** antes de continuar.
|
|
99
|
+
|
|
100
|
+
Crie tasks de sessão:
|
|
101
|
+
```
|
|
102
|
+
TaskCreate: "Analisar schema" → activeForm: "Lendo schema real"
|
|
103
|
+
TaskCreate: "Validar Blueprint" → activeForm: "Gerando blueprint"
|
|
104
|
+
TaskCreate: "Gerar spec + contracts" → activeForm: "Gerando artefatos"
|
|
105
|
+
TaskCreate: "Loop de qualidade" → activeForm: "Refinando design"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## CHECKPOINT 1 — Schema Real (OBRIGATÓRIO antes de qualquer geração)
|
|
111
|
+
|
|
112
|
+
> **Regra:** Nunca assuma nomes de campos. Todo DTO gerado deve ter origem rastreável no schema.
|
|
113
|
+
|
|
114
|
+
### 1.1 Ler schema real
|
|
115
|
+
|
|
116
|
+
Execute em paralelo conforme o stack detectado em `config.json`:
|
|
117
|
+
|
|
118
|
+
**Supabase (preferencial se disponível):**
|
|
119
|
+
```
|
|
120
|
+
Supabase MCP: list_tables() → get_table_schema(table) para cada tabela relevante
|
|
121
|
+
+ get_relationships() → políticas RLS se aplicável
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**EF Core (.NET):**
|
|
125
|
+
```
|
|
126
|
+
Glob: **/Entities/**/*.cs → Read cada arquivo de entidade
|
|
127
|
+
Glob: **/*DbContext.cs → Read para ver DbSet<> e relações
|
|
128
|
+
Grep: "DbSet<" → confirmar entidades mapeadas
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**TypeScript/Next.js:**
|
|
132
|
+
```
|
|
133
|
+
Glob: src/**/types/**/*.ts, src/**/models/**/*.ts
|
|
134
|
+
Grep: "export interface|export type" → Read arquivos encontrados
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 1.2 Gerar schema-analysis.md
|
|
138
|
+
|
|
139
|
+
Escreva `.morph/features/$ARGUMENTS/1-design/schema-analysis.md` com:
|
|
140
|
+
|
|
141
|
+
```markdown
|
|
142
|
+
# Schema Analysis — {Feature}
|
|
143
|
+
|
|
144
|
+
## Entidades Relevantes
|
|
145
|
+
|
|
146
|
+
### {EntityName}
|
|
147
|
+
| Campo | Tipo DB | Tipo C#/TS | Nullable | Notas |
|
|
148
|
+
|-------|---------|-----------|----------|-------|
|
|
149
|
+
| id | uuid | Guid | No | PK |
|
|
150
|
+
| ... | ... | ... | ... | ... |
|
|
151
|
+
|
|
152
|
+
## Relacionamentos
|
|
153
|
+
- {Entity A} 1—N {Entity B} via {campo FK}
|
|
154
|
+
|
|
155
|
+
## Campos JSONB / Complexos
|
|
156
|
+
- {campo}: estrutura interna {chaves conhecidas}
|
|
157
|
+
|
|
158
|
+
## Campos sem uso identificado
|
|
159
|
+
- {campo}: presente no schema mas sem referência na proposta
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### 1.3 Validar com usuário
|
|
163
|
+
|
|
164
|
+
Use `AskUserQuestion`:
|
|
165
|
+
|
|
166
|
+
```json
|
|
167
|
+
{
|
|
168
|
+
"questions": [{
|
|
169
|
+
"header": "Schema OK?",
|
|
170
|
+
"question": "Encontrei estas entidades e campos no schema. Estão corretos antes de gerar os contratos?",
|
|
171
|
+
"multiSelect": false,
|
|
172
|
+
"options": [
|
|
173
|
+
{ "label": "Confirmar e continuar", "description": "Schema mapeado corretamente" },
|
|
174
|
+
{ "label": "Tenho correções", "description": "Use Other para descrever o que está errado" }
|
|
175
|
+
]
|
|
176
|
+
}]
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
- **"Confirmar"** → prosseguir para Checkpoint 2
|
|
181
|
+
- **"Tenho correções" / Other** → aplicar correções no schema-analysis.md e repetir 1.3
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## CHECKPOINT 2 — Blueprint de Arquitetura (OBRIGATÓRIO antes de gerar contracts)
|
|
186
|
+
|
|
187
|
+
> Use o caminho correspondente ao estilo detectado no PRÉ-VOO.
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
### CHECKPOINT 2-VSA — Vertical Slice Architecture
|
|
192
|
+
|
|
193
|
+
#### 2-VSA.1 Dispatch vsa-architect
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
npx morph-spec dispatch-agents $ARGUMENTS design
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Use o `taskPrompt` do agente `vsa-architect` do resultado. Chame:
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
Agent(subagent_type=vsa-architect, prompt=<taskPrompt + conteúdo de proposal.md + schema-analysis.md>)
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
O agente produz um VSA Blueprint com:
|
|
206
|
+
- Entity fields (baseados no schema validado no Checkpoint 1)
|
|
207
|
+
- Operations (GetAll, GetById, Create, Update, Delete + custom)
|
|
208
|
+
- Routes (`GET /api/{feature}s`, `POST /api/{feature}s`, etc.)
|
|
209
|
+
- Error types (`{Entity}Errors.NotFound`, `{Entity}Errors.AlreadyExists`, etc.)
|
|
210
|
+
- Validation rules por campo
|
|
211
|
+
|
|
212
|
+
**Paralelize** com outros agentes ativos do dispatch config.
|
|
213
|
+
|
|
214
|
+
#### 2-VSA.2 Validar Blueprint com usuário
|
|
215
|
+
|
|
216
|
+
Apresente o blueprint gerado de forma legível e use `AskUserQuestion`:
|
|
217
|
+
|
|
218
|
+
```json
|
|
219
|
+
{
|
|
220
|
+
"questions": [{
|
|
221
|
+
"header": "Blueprint OK?",
|
|
222
|
+
"question": "Planejei estes slices e operações para a feature. Confirmar antes de gerar spec e contracts?",
|
|
223
|
+
"multiSelect": false,
|
|
224
|
+
"options": [
|
|
225
|
+
{ "label": "Confirmar blueprint", "description": "Gerar spec.md e contracts-vsa.cs com este blueprint" },
|
|
226
|
+
{ "label": "Preciso ajustar", "description": "Use Other para descrever o que mudar no blueprint" }
|
|
227
|
+
]
|
|
228
|
+
}]
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
- **"Confirmar"** → prosseguir para geração VSA
|
|
233
|
+
- **"Preciso ajustar" / Other** → atualizar blueprint e repetir 2-VSA.2
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
### CHECKPOINT 2-DDD — Domain-Driven Design
|
|
238
|
+
|
|
239
|
+
#### 2-DDD.1 Determinar Nível de Complexidade
|
|
240
|
+
|
|
241
|
+
Leia a proposta e avalie com base nas 5 perguntas de detecção em `framework/standards/architecture/ddd/complexity-levels.md`:
|
|
242
|
+
|
|
243
|
+
| Nível | Quando usar |
|
|
244
|
+
|-------|-------------|
|
|
245
|
+
| **Nível 1 (CRUD)** | Entidades simples, sem regras de negócio complexas, CRUD básico |
|
|
246
|
+
| **Nível 2 (Business Logic)** | Invariantes de domínio, workflows de negócio, múltiplas entidades relacionadas |
|
|
247
|
+
| **Nível 3 (Bounded Context)** | Isolamento de contexto, eventos de integração, sistemas distribuídos |
|
|
248
|
+
|
|
249
|
+
> Se incerto, assuma Nível 1 e use `AskUserQuestion` para confirmar.
|
|
250
|
+
|
|
251
|
+
#### 2-DDD.2 Dispatch domain-architect
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
npx morph-spec dispatch-agents $ARGUMENTS design
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
Use o `taskPrompt` do agente `domain-architect` do resultado. Chame:
|
|
258
|
+
|
|
259
|
+
```
|
|
260
|
+
Agent(subagent_type=domain-architect, prompt=<taskPrompt + conteúdo de proposal.md + schema-analysis.md + nível detectado>)
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
O agente produz um Architecture Blueprint com:
|
|
264
|
+
- **Nível 1:** Entidades, repositórios, services, DTOs
|
|
265
|
+
- **Nível 2:** AggregateRoot, Value Objects, Domain Events, CQRS handlers
|
|
266
|
+
- **Nível 3:** BC setup, Integration Events, Anti-corruption layer
|
|
267
|
+
|
|
268
|
+
**Paralelize** com outros agentes ativos do dispatch config.
|
|
269
|
+
|
|
270
|
+
#### 2-DDD.3 Validar Blueprint com usuário
|
|
271
|
+
|
|
272
|
+
Apresente o blueprint gerado de forma legível e use `AskUserQuestion`:
|
|
273
|
+
|
|
274
|
+
```json
|
|
275
|
+
{
|
|
276
|
+
"questions": [{
|
|
277
|
+
"header": "Blueprint OK?",
|
|
278
|
+
"question": "Planejei esta arquitetura de domínio para a feature. Confirmar antes de gerar spec e contracts?",
|
|
279
|
+
"multiSelect": false,
|
|
280
|
+
"options": [
|
|
281
|
+
{ "label": "Confirmar blueprint", "description": "Gerar spec.md e contracts-level{N}.cs com este blueprint" },
|
|
282
|
+
{ "label": "Preciso ajustar", "description": "Use Other para descrever o que mudar no blueprint" }
|
|
283
|
+
]
|
|
284
|
+
}]
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
- **"Confirmar"** → prosseguir para geração DDD
|
|
289
|
+
- **"Preciso ajustar" / Other** → atualizar blueprint e repetir 2-DDD.3
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Geração de Artefatos
|
|
294
|
+
|
|
295
|
+
Com schema validado (Checkpoint 1) e blueprint confirmado (Checkpoint 2):
|
|
296
|
+
|
|
297
|
+
### Gerar spec.md
|
|
298
|
+
|
|
299
|
+
> Estrutura detalhada: `references/spec-authoring-guide.md`
|
|
300
|
+
|
|
301
|
+
Crie `.morph/features/$ARGUMENTS/1-design/spec.md` com:
|
|
302
|
+
- Overview, Functional Requirements (FR001...) com critérios de aceitação mensuráveis
|
|
303
|
+
- Non-Functional Requirements, Data Model
|
|
304
|
+
- **VSA:** seção `## Architecture Style: Vertical Slice` com slices e operações
|
|
305
|
+
- **DDD:** seção `## Domain Complexity` com nível (1/2/3) e justificativa
|
|
306
|
+
- Infrastructure Requirements (se aplicável)
|
|
307
|
+
|
|
308
|
+
### Gerar contracts.cs — VSA
|
|
309
|
+
|
|
310
|
+
**Fonte obrigatória:** campos do `schema-analysis.md` + operações do VSA Blueprint.
|
|
311
|
+
|
|
312
|
+
```bash
|
|
313
|
+
npx morph-spec template render \
|
|
314
|
+
dotnet-contracts-vsa \
|
|
315
|
+
.morph/features/$ARGUMENTS/1-design/contracts.cs \
|
|
316
|
+
'{
|
|
317
|
+
"FEATURE_NAME": "$ARGUMENTS",
|
|
318
|
+
"NAMESPACE": "{ProjectNamespace}",
|
|
319
|
+
"ROUTE": "/api/{kebabCase FEATURE_NAME}s",
|
|
320
|
+
"DATE": "{{TODAY}}"
|
|
321
|
+
}'
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
Após renderizar, preencha os `// placeholder:` com os campos reais do schema-analysis.md.
|
|
325
|
+
|
|
326
|
+
**Padrões obrigatórios (VSA):**
|
|
327
|
+
- `sealed` em handlers, endpoints, validators, records
|
|
328
|
+
- `Guid.CreateVersion7()` para IDs
|
|
329
|
+
- `result.Match()` nos endpoints
|
|
330
|
+
- `{Entity}Errors` estático compartilhado por todos os slices
|
|
331
|
+
- CancellationToken em todos os métodos async
|
|
332
|
+
|
|
333
|
+
### Gerar contracts.cs — DDD
|
|
334
|
+
|
|
335
|
+
**Fonte obrigatória:** campos do `schema-analysis.md` + componentes do DDD Blueprint.
|
|
336
|
+
|
|
337
|
+
```bash
|
|
338
|
+
# Substituir {N} pelo nível detectado (1, 2 ou 3):
|
|
339
|
+
npx morph-spec template render \
|
|
340
|
+
dotnet-contracts-level{N} \
|
|
341
|
+
.morph/features/$ARGUMENTS/1-design/contracts.cs \
|
|
342
|
+
'{
|
|
343
|
+
"FEATURE_NAME": "$ARGUMENTS",
|
|
344
|
+
"NAMESPACE": "{ProjectNamespace}",
|
|
345
|
+
"DATE": "{{TODAY}}"
|
|
346
|
+
}'
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
Após renderizar, preencha os `// placeholder:` com os campos reais do schema-analysis.md.
|
|
350
|
+
|
|
351
|
+
**Padrões obrigatórios (DDD):**
|
|
352
|
+
- Nível 1: interfaces de repositório + service com métodos mapeados
|
|
353
|
+
- Nível 2: AggregateRoot com invariantes + Value Objects imutáveis + Domain Events
|
|
354
|
+
- Nível 3: adiciona Integration Events + Bounded Context boundary
|
|
355
|
+
|
|
356
|
+
### Gerar decisions.md
|
|
357
|
+
|
|
358
|
+
```bash
|
|
359
|
+
npx morph-spec template render docs/decisions \
|
|
360
|
+
.morph/features/$ARGUMENTS/1-design/decisions.md \
|
|
361
|
+
'{"FEATURE_NAME": "$ARGUMENTS", "DATE": "{{TODAY}}", "decisions": []}'
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
ADRs obrigatórios: escolha de arquitetura (VSA vs DDD + justificativa), biblioteca UI (se UI/UX executou), integrações externas, recursos Azure com estimativa de custos.
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## Sistema de Pontuação de Qualidade
|
|
369
|
+
|
|
370
|
+
Após gerar os artefatos, avalie o design com o **Quality Score (0–100)**:
|
|
371
|
+
|
|
372
|
+
| Dimensão | Pts | Critério de máxima pontuação |
|
|
373
|
+
|----------|-----|------------------------------|
|
|
374
|
+
| **Fidelidade ao schema** | 25 | Todos os campos em contracts.cs têm origem rastreável no schema-analysis.md — zero adivinhados |
|
|
375
|
+
| **Cobertura funcional** | 20 | Todos os FRs da proposta estão no spec com critérios de aceitação mensuráveis |
|
|
376
|
+
| **Blueprint completo** | 20 | **VSA:** todos os slices têm handler, validator (exceto GetAll), endpoint e errors \| **DDD:** todas as entidades/aggregates/services têm componentes do nível detectado |
|
|
377
|
+
| **Integrações externas** | 20 | APIs/services com payload, error format e retry policy documentados |
|
|
378
|
+
| **Infra / custos** | 15 | Azure resources estimados com custo, ou "N/A" explícito documentado |
|
|
379
|
+
|
|
380
|
+
**Thresholds:**
|
|
381
|
+
|
|
382
|
+
| Score | Ação |
|
|
383
|
+
|-------|------|
|
|
384
|
+
| ≥ 85 | Design satisfatório. Oferecer encerrar ou refinar opcionalmente |
|
|
385
|
+
| 70–84 | Continuar. Focar nas dimensões mais fracas |
|
|
386
|
+
| < 70 | Continuar. Questões técnicas abertas bloqueam implementação |
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
## Loop de Qualidade
|
|
391
|
+
|
|
392
|
+
**Repita até: score ≥ 85 OU usuário aprova.**
|
|
393
|
+
|
|
394
|
+
### A. Calcular score
|
|
395
|
+
|
|
396
|
+
Pontue cada dimensão com base nos artefatos gerados. Identifique as lacunas mais impactantes.
|
|
397
|
+
|
|
398
|
+
### B. Identificar questões abertas
|
|
399
|
+
|
|
400
|
+
Perguntas típicas por dimensão:
|
|
401
|
+
|
|
402
|
+
| Dimensão fraca | Exemplos de questões |
|
|
403
|
+
|----------------|----------------------|
|
|
404
|
+
| Schema fidelity | "O campo `metadata` (JSONB) tem estrutura definida? Quais chaves?" |
|
|
405
|
+
| Cobertura funcional | "FR003 diz 'notificar usuário' — por email, push ou ambos?" |
|
|
406
|
+
| Blueprint VSA | "O slice CreateOrder deve disparar um job de email ou é síncrono?" |
|
|
407
|
+
| Blueprint DDD | "O método `Place()` do OrderAggregate deve emitir `OrderPlacedEvent`?" |
|
|
408
|
+
| Integrações | "A API de pagamento usa webhook ou polling para confirmar?" |
|
|
409
|
+
| Infra/custos | "Este feature precisa de storage Azure? Qual tier?" |
|
|
410
|
+
|
|
411
|
+
### C. Perguntar via AskUserQuestion
|
|
412
|
+
|
|
413
|
+
Máximo 3 questões técnicas por chamada. Na última chamada de cada round, inclua sempre:
|
|
414
|
+
|
|
415
|
+
```json
|
|
416
|
+
{
|
|
417
|
+
"header": "Encerrar?",
|
|
418
|
+
"question": "Deseja encerrar o design agora ou continuar refinando?",
|
|
419
|
+
"multiSelect": false,
|
|
420
|
+
"options": [
|
|
421
|
+
{ "label": "Continuar refinando", "description": "Claude identificou mais questões abertas" },
|
|
422
|
+
{ "label": "Encerrar design", "description": "Prosseguir para Clarify com o design atual" }
|
|
423
|
+
]
|
|
424
|
+
}
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
> Se score ≥ 85, ajuste: `"Continuar (opcional)"` com description `"Score {N}/100 — design está satisfatório"`
|
|
428
|
+
|
|
429
|
+
### D. Incorporar respostas
|
|
430
|
+
|
|
431
|
+
Atualize spec.md, contracts.cs e decisions.md com as respostas recebidas. Recalcule o score.
|
|
432
|
+
|
|
433
|
+
### E. Condição de saída
|
|
434
|
+
|
|
435
|
+
- Usuário escolheu **"Encerrar design"** → sair do loop
|
|
436
|
+
- Score ≥ 85 E sem questões novas → sair do loop
|
|
437
|
+
|
|
438
|
+
---
|
|
439
|
+
|
|
440
|
+
## Pós-Loop: Atualizar State
|
|
441
|
+
|
|
442
|
+
```bash
|
|
443
|
+
npx morph-spec state mark-output $ARGUMENTS schema-analysis
|
|
444
|
+
npx morph-spec state mark-output $ARGUMENTS spec
|
|
445
|
+
npx morph-spec state mark-output $ARGUMENTS contracts
|
|
446
|
+
npx morph-spec state mark-output $ARGUMENTS decisions
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
Se houver custos Azure estimados:
|
|
450
|
+
```bash
|
|
451
|
+
npx morph-spec state set $ARGUMENTS costs.estimated {X.XX}
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
## PAUSA OBRIGATÓRIA
|
|
455
|
+
|
|
456
|
+
```json
|
|
457
|
+
{
|
|
458
|
+
"questions": [{
|
|
459
|
+
"header": "Aprovação",
|
|
460
|
+
"question": "Design gerado. Aprovar para continuar para Clarify?",
|
|
461
|
+
"multiSelect": false,
|
|
462
|
+
"options": [
|
|
463
|
+
{ "label": "Aprovar e continuar", "description": "Avançar para fase Clarify" },
|
|
464
|
+
{ "label": "Tenho feedback", "description": "Digite o que deseja mudar (Other)" }
|
|
465
|
+
]
|
|
466
|
+
}]
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
- **"Aprovar e continuar"** →
|
|
471
|
+
```bash
|
|
472
|
+
npx morph-spec approve $ARGUMENTS design
|
|
473
|
+
npx morph-spec phase advance $ARGUMENTS
|
|
474
|
+
```
|
|
475
|
+
- **"Tenho feedback" / Other** → aplicar feedback e repetir PAUSA
|
|
476
|
+
|
|
477
|
+
## Outputs Gerados
|
|
478
|
+
|
|
479
|
+
- `.morph/features/$ARGUMENTS/1-design/schema-analysis.md` — Schema real mapeado e validado
|
|
480
|
+
- `.morph/features/$ARGUMENTS/1-design/spec.md` — Especificação técnica completa
|
|
481
|
+
- `.morph/features/$ARGUMENTS/1-design/contracts.cs` — Contracts baseados no schema real (VSA ou DDD)
|
|
482
|
+
- `.morph/features/$ARGUMENTS/1-design/decisions.md` — ADRs documentados
|
|
483
|
+
|
|
484
|
+
## Critérios de Avanço
|
|
485
|
+
|
|
486
|
+
- [x] Estilo de arquitetura detectado em `config.architecture.style`
|
|
487
|
+
- [x] Schema validado pelo usuário (Checkpoint 1)
|
|
488
|
+
- [x] Blueprint confirmado pelo usuário (Checkpoint 2-VSA ou 2-DDD)
|
|
489
|
+
- [x] Score de qualidade ≥ 85 OU usuário encerrou
|
|
490
|
+
- [x] Todos os field names em contracts.cs rastreáveis ao schema-analysis.md
|
|
491
|
+
- [x] State atualizado
|
|
492
|
+
- [x] Usuário aprovou na PAUSA OBRIGATÓRIA
|
|
493
|
+
|
|
494
|
+
---
|
|
495
|
+
|
|
496
|
+
<!-- morph:outputs:design -->
|
|
497
|
+
| Output | Caminho |
|
|
498
|
+
|--------|---------|
|
|
499
|
+
| `schemaAnalysis` | `.morph/features/{feature}/1-design/schema-analysis.md` |
|
|
500
|
+
| `spec` | `.morph/features/{feature}/1-design/spec.md` |
|
|
501
|
+
| `contracts` | `.morph/features/{feature}/1-design/contracts.cs` |
|
|
502
|
+
| `contractsTs` | `.morph/features/{feature}/1-design/contracts.ts` |
|
|
503
|
+
| `contractsVsa` | `.morph/features/{feature}/1-design/contracts-vsa.cs` |
|
|
504
|
+
| `decisions` | `.morph/features/{feature}/1-design/decisions.md` |
|
|
505
|
+
<!-- /morph:outputs -->
|
|
506
|
+
|
|
507
|
+
Continuar automaticamente para FASE 3 (Clarify) após aprovação.
|