@polymorphism-tech/morph-spec 1.0.4 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +1381 -0
- package/LICENSE +72 -0
- package/README.md +89 -6
- package/bin/detect-agents.js +225 -0
- package/bin/morph-spec.js +120 -0
- package/bin/render-template.js +302 -0
- package/bin/semantic-detect-agents.js +246 -0
- package/bin/validate-agents-skills.js +239 -0
- package/bin/validate-agents.js +69 -0
- package/bin/validate-phase.js +263 -0
- package/content/.azure/README.md +293 -0
- package/content/.azure/docs/azure-devops-setup.md +454 -0
- package/content/.azure/docs/branch-strategy.md +398 -0
- package/content/.azure/docs/local-development.md +515 -0
- package/content/.azure/pipelines/pipeline-variables.yml +34 -0
- package/content/.azure/pipelines/prod-pipeline.yml +319 -0
- package/content/.azure/pipelines/staging-pipeline.yml +234 -0
- package/content/.azure/pipelines/templates/build-dotnet.yml +75 -0
- package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -0
- package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -0
- package/content/.azure/pipelines/templates/infra-deploy.yml +90 -0
- package/content/.claude/commands/morph-apply.md +118 -26
- package/content/.claude/commands/morph-archive.md +9 -9
- package/content/.claude/commands/morph-clarify.md +184 -0
- package/content/.claude/commands/morph-design.md +275 -0
- package/content/.claude/commands/morph-proposal.md +56 -15
- package/content/.claude/commands/morph-setup.md +100 -0
- package/content/.claude/commands/morph-status.md +47 -32
- package/content/.claude/commands/morph-tasks.md +319 -0
- package/content/.claude/commands/morph-uiux.md +211 -0
- package/content/.claude/skills/specialists/ai-system-architect.md +604 -0
- package/content/.claude/skills/specialists/ms-agent-expert.md +143 -89
- package/content/.claude/skills/specialists/ui-ux-designer.md +744 -9
- package/content/.claude/skills/stacks/dotnet-blazor.md +244 -8
- package/content/.claude/skills/stacks/dotnet-nextjs.md +2 -2
- package/content/.morph/.morphversion +5 -0
- package/content/.morph/config/agents.json +101 -8
- package/content/.morph/config/azure-pricing.json +70 -0
- package/content/.morph/config/azure-pricing.schema.json +50 -0
- package/content/.morph/config/config.template.json +15 -3
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -0
- package/content/.morph/hooks/README.md +239 -0
- package/content/.morph/hooks/pre-commit-agents.sh +24 -0
- package/content/.morph/hooks/pre-commit-all.sh +48 -0
- package/content/.morph/hooks/pre-commit-costs.sh +91 -0
- package/content/.morph/hooks/pre-commit-specs.sh +49 -0
- package/content/.morph/hooks/pre-commit-tests.sh +60 -0
- package/content/.morph/project.md +5 -4
- package/content/.morph/schemas/agent.schema.json +296 -0
- package/content/.morph/standards/agent-framework-setup.md +453 -0
- package/content/.morph/standards/architecture.md +142 -7
- package/content/.morph/standards/azure.md +218 -23
- package/content/.morph/standards/coding.md +47 -12
- package/content/.morph/standards/dotnet10-migration.md +494 -0
- package/content/.morph/standards/fluent-ui-setup.md +590 -0
- package/content/.morph/standards/migration-guide.md +514 -0
- package/content/.morph/standards/passkeys-auth.md +423 -0
- package/content/.morph/standards/vector-search-rag.md +536 -0
- package/content/.morph/state.json +18 -0
- package/content/.morph/templates/FluentDesignTheme.cs +149 -0
- package/content/.morph/templates/MudTheme.cs +281 -0
- package/content/.morph/templates/contracts.cs +55 -55
- package/content/.morph/templates/decisions.md +4 -4
- package/content/.morph/templates/design-system.css +226 -0
- package/content/.morph/templates/infra/.dockerignore.example +89 -0
- package/content/.morph/templates/infra/Dockerfile.example +82 -0
- package/content/.morph/templates/infra/README.md +286 -0
- package/content/.morph/templates/infra/app-service.bicep +164 -0
- package/content/.morph/templates/infra/deploy.ps1 +229 -0
- package/content/.morph/templates/infra/deploy.sh +208 -0
- package/content/.morph/templates/infra/main.bicep +41 -7
- package/content/.morph/templates/infra/parameters.dev.json +6 -0
- package/content/.morph/templates/infra/parameters.prod.json +6 -0
- package/content/.morph/templates/infra/parameters.staging.json +29 -0
- package/content/.morph/templates/proposal.md +3 -3
- package/content/.morph/templates/recap.md +3 -3
- package/content/.morph/templates/spec.md +9 -8
- package/content/.morph/templates/sprint-status.yaml +68 -0
- package/content/.morph/templates/state.template.json +222 -0
- package/content/.morph/templates/story.md +143 -0
- package/content/.morph/templates/tasks.md +1 -1
- package/content/.morph/templates/ui-components.md +276 -0
- package/content/.morph/templates/ui-design-system.md +286 -0
- package/content/.morph/templates/ui-flows.md +336 -0
- package/content/.morph/templates/ui-mockups.md +133 -0
- package/content/.morph/test-infra/example.bicep +59 -0
- package/content/CLAUDE.md +124 -0
- package/content/README.md +79 -0
- package/detectors/config-detector.js +223 -0
- package/detectors/conversation-analyzer.js +163 -0
- package/detectors/index.js +84 -0
- package/detectors/standards-generator.js +275 -0
- package/detectors/structure-detector.js +221 -0
- package/docs/README.md +149 -0
- package/docs/api/cost-calculator.js.html +513 -0
- package/docs/api/design-system-generator.js.html +382 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.eot +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.woff +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.eot +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.woff +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
- package/docs/api/global.html +5263 -0
- package/docs/api/index.html +96 -0
- package/docs/api/scripts/collapse.js +39 -0
- package/docs/api/scripts/commonNav.js +28 -0
- package/docs/api/scripts/linenumber.js +25 -0
- package/docs/api/scripts/nav.js +12 -0
- package/docs/api/scripts/polyfill.js +4 -0
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -0
- package/docs/api/scripts/prettify/lang-css.js +2 -0
- package/docs/api/scripts/prettify/prettify.js +28 -0
- package/docs/api/scripts/search.js +99 -0
- package/docs/api/state-manager.js.html +423 -0
- package/docs/api/styles/jsdoc.css +776 -0
- package/docs/api/styles/prettify.css +80 -0
- package/docs/examples.md +328 -0
- package/docs/getting-started.md +302 -0
- package/docs/installation.md +361 -0
- package/docs/templates.md +418 -0
- package/docs/validation-checklist.md +266 -0
- package/package.json +39 -12
- package/src/commands/cost.js +181 -0
- package/src/commands/create-story.js +283 -0
- package/src/commands/detect.js +104 -0
- package/src/commands/doctor.js +67 -0
- package/src/commands/generate.js +149 -0
- package/src/commands/init.js +69 -45
- package/src/commands/shard-spec.js +224 -0
- package/src/commands/sprint-status.js +250 -0
- package/src/commands/state.js +333 -0
- package/src/commands/sync.js +167 -0
- package/src/commands/update-pricing.js +206 -0
- package/src/commands/update.js +88 -13
- package/src/lib/complexity-analyzer.js +292 -0
- package/src/lib/cost-calculator.js +429 -0
- package/src/lib/design-system-generator.js +298 -0
- package/src/lib/state-manager.js +340 -0
- package/src/utils/file-copier.js +59 -0
- package/src/utils/version-checker.js +175 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# MORPH Clarify - FASE 3
|
|
2
|
+
|
|
3
|
+
Identifique ambiguidades na especificação e faça perguntas de clarificação para garantir que todos os edge cases estão cobertos.
|
|
4
|
+
|
|
5
|
+
## Uso
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/morph-clarify {feature-name}
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Pré-requisitos
|
|
12
|
+
|
|
13
|
+
- [ ] FASE 2 (Design) concluída
|
|
14
|
+
- [ ] `spec.md` aprovado pelo usuário
|
|
15
|
+
- [ ] `contracts.cs` definidos
|
|
16
|
+
|
|
17
|
+
## Workflow
|
|
18
|
+
|
|
19
|
+
### Passo 1: Analisar Spec
|
|
20
|
+
|
|
21
|
+
Leia `.morph/project/outputs/{feature}/spec.md` em detalhes e identifique:
|
|
22
|
+
|
|
23
|
+
#### 1.1. Ambiguidades
|
|
24
|
+
- Requisitos vagos ou genéricos
|
|
25
|
+
- Termos sem definição clara
|
|
26
|
+
- Comportamentos não especificados
|
|
27
|
+
|
|
28
|
+
#### 1.2. Edge Cases Não Documentados
|
|
29
|
+
- O que acontece se...?
|
|
30
|
+
- Como lidar com entradas inválidas?
|
|
31
|
+
- Comportamento em caso de erro?
|
|
32
|
+
- Estados intermediários (loading, empty)
|
|
33
|
+
|
|
34
|
+
#### 1.3. Requisitos Conflitantes
|
|
35
|
+
- Duas funcionalidades que parecem incompatíveis
|
|
36
|
+
- Prioridades não claras (o que vem primeiro?)
|
|
37
|
+
|
|
38
|
+
#### 1.4. Dados Faltantes
|
|
39
|
+
- Validações de negócio não especificadas
|
|
40
|
+
- Limites e constraints (tamanhos, quantidades)
|
|
41
|
+
- Formatos de dados (datas, moedas, etc.)
|
|
42
|
+
|
|
43
|
+
### Passo 2: Gerar Perguntas de Clarificação
|
|
44
|
+
|
|
45
|
+
Com base na análise, gere **3-7 perguntas** focadas e específicas:
|
|
46
|
+
|
|
47
|
+
**Formato de pergunta:**
|
|
48
|
+
```markdown
|
|
49
|
+
### Q{N}: {Categoria} - {Título}
|
|
50
|
+
|
|
51
|
+
**Context:** {Por que esta pergunta é importante}
|
|
52
|
+
|
|
53
|
+
**Question:** {Pergunta clara e objetiva}
|
|
54
|
+
|
|
55
|
+
**Options (if applicable):**
|
|
56
|
+
- A) {Opção 1}
|
|
57
|
+
- B) {Opção 2}
|
|
58
|
+
- C) {Deixar em aberto/usuário decidir}
|
|
59
|
+
|
|
60
|
+
**Impact:** {Como a resposta afeta a implementação}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Exemplo:**
|
|
64
|
+
|
|
65
|
+
```markdown
|
|
66
|
+
### Q1: Validação - Limite de Nome de Projeto
|
|
67
|
+
|
|
68
|
+
**Context:** O spec menciona "nome de projeto" mas não especifica limites.
|
|
69
|
+
|
|
70
|
+
**Question:** Qual o comprimento máximo do nome de projeto?
|
|
71
|
+
|
|
72
|
+
**Options:**
|
|
73
|
+
- A) 50 caracteres (padrão curto)
|
|
74
|
+
- B) 100 caracteres (padrão médio)
|
|
75
|
+
- C) 255 caracteres (padrão longo)
|
|
76
|
+
- D) Sem limite (validar apenas se não vazio)
|
|
77
|
+
|
|
78
|
+
**Impact:** Afeta validação do DTO, schema do banco, e UI (tamanho do input).
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Passo 3: Categorizar Perguntas
|
|
82
|
+
|
|
83
|
+
Organize perguntas por categoria:
|
|
84
|
+
|
|
85
|
+
| Categoria | Descrição | Exemplos |
|
|
86
|
+
|-----------|-----------|----------|
|
|
87
|
+
| **Validação** | Regras de negócio, constraints | Limites de tamanho, formatos aceitos |
|
|
88
|
+
| **Comportamento** | O que acontece quando... | Error handling, estados vazios |
|
|
89
|
+
| **Prioridade** | O que é must-have vs nice-to-have | MVP vs futuras iterações |
|
|
90
|
+
| **Integração** | Como interage com sistemas externos | APIs, webhooks, formato de dados |
|
|
91
|
+
| **Performance** | Requisitos de velocidade/volume | Quantos registros? Tempo de resposta? |
|
|
92
|
+
| **UX** | Experiência do usuário | Feedback visual, mensagens de erro |
|
|
93
|
+
|
|
94
|
+
### Passo 4: Apresentar Perguntas ao Usuário
|
|
95
|
+
|
|
96
|
+
Liste todas as perguntas de forma clara e estruturada.
|
|
97
|
+
|
|
98
|
+
**IMPORTANTE:** Não prossiga para próxima fase até ter respostas!
|
|
99
|
+
|
|
100
|
+
### Passo 5: Atualizar `spec.md` com Respostas
|
|
101
|
+
|
|
102
|
+
Após receber respostas do usuário, atualize o spec com:
|
|
103
|
+
|
|
104
|
+
1. **Seção de Clarificações** no início do spec:
|
|
105
|
+
```markdown
|
|
106
|
+
## Clarifications (FASE 3)
|
|
107
|
+
|
|
108
|
+
### Q1: {Título}
|
|
109
|
+
**Answer:** {Resposta do usuário}
|
|
110
|
+
**Date:** {YYYY-MM-DD}
|
|
111
|
+
|
|
112
|
+
### Q2: {Título}
|
|
113
|
+
**Answer:** {Resposta do usuário}
|
|
114
|
+
**Date:** {YYYY-MM-DD}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
2. **Atualizar seções relevantes** com detalhes adicionados:
|
|
118
|
+
- Requisitos funcionais mais específicos
|
|
119
|
+
- Validações documentadas
|
|
120
|
+
- Edge cases cobertos
|
|
121
|
+
|
|
122
|
+
### Passo 6: Validar Edge Cases
|
|
123
|
+
|
|
124
|
+
Documente no spec como lidar com cada edge case identificado:
|
|
125
|
+
|
|
126
|
+
```markdown
|
|
127
|
+
## Edge Cases
|
|
128
|
+
|
|
129
|
+
### EC001: {Nome do Edge Case}
|
|
130
|
+
**Scenario:** {Quando acontece}
|
|
131
|
+
**Expected Behavior:** {Como o sistema deve reagir}
|
|
132
|
+
**Implementation Notes:** {Dicas para implementação}
|
|
133
|
+
|
|
134
|
+
**Example:**
|
|
135
|
+
- Input: {exemplo de entrada problemática}
|
|
136
|
+
- Output: {comportamento esperado}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Passo 7: Atualizar State
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# Marcar fase como clarify
|
|
143
|
+
node bin/state-manager.js set {feature-name} phase clarify
|
|
144
|
+
|
|
145
|
+
# State permanece in_progress até usuário responder todas as perguntas
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Outputs Gerados/Atualizados
|
|
149
|
+
|
|
150
|
+
- `.morph/project/outputs/{feature}/spec.md` - Atualizado com:
|
|
151
|
+
- Seção "Clarifications" com perguntas e respostas
|
|
152
|
+
- Edge cases documentados
|
|
153
|
+
- Requisitos mais específicos
|
|
154
|
+
|
|
155
|
+
## ⛔ PAUSA OBRIGATÓRIA
|
|
156
|
+
|
|
157
|
+
Apresente perguntas de clarificação e aguarde respostas do usuário.
|
|
158
|
+
|
|
159
|
+
**Não prossiga até ter todas as respostas!**
|
|
160
|
+
|
|
161
|
+
Após receber respostas, atualizar spec e apresentar:
|
|
162
|
+
|
|
163
|
+
1. ✅ **Aprovar clarificações e continuar para tasks**
|
|
164
|
+
Prosseguir para `/morph-tasks` (FASE 4)
|
|
165
|
+
|
|
166
|
+
2. 🔄 **Fazer mais perguntas** (se ainda houver dúvidas)
|
|
167
|
+
Iterar novamente nesta fase
|
|
168
|
+
|
|
169
|
+
3. 📋 **Revisar spec atualizado**
|
|
170
|
+
Validar que clarificações foram bem incorporadas
|
|
171
|
+
|
|
172
|
+
## Critérios de Avanço
|
|
173
|
+
|
|
174
|
+
- [x] Perguntas de clarificação identificadas (3-7)
|
|
175
|
+
- [x] Perguntas apresentadas ao usuário
|
|
176
|
+
- [x] Respostas do usuário recebidas
|
|
177
|
+
- [x] `spec.md` atualizado com clarificações
|
|
178
|
+
- [x] Edge cases documentados
|
|
179
|
+
- [x] State atualizado
|
|
180
|
+
- [x] Nenhuma ambiguidade crítica remanescente
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
**Feature:** $ARGUMENTS
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
# MORPH Design - FASE 2
|
|
2
|
+
|
|
3
|
+
Expanda a proposta em especificação técnica completa, contracts, decisões arquiteturais e estimativa de custos.
|
|
4
|
+
|
|
5
|
+
## Uso
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/morph-design {feature-name}
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Pré-requisitos
|
|
12
|
+
|
|
13
|
+
- [ ] FASE 1 (Setup) concluída
|
|
14
|
+
- [ ] FASE 1.5 (UI/UX) concluída OU pulada (se não houver front-end)
|
|
15
|
+
- [ ] Proposta aprovada pelo usuário
|
|
16
|
+
|
|
17
|
+
## Workflow
|
|
18
|
+
|
|
19
|
+
### Passo 1: Carregar Contexto
|
|
20
|
+
|
|
21
|
+
Leia os arquivos existentes da feature:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Verificar outputs existentes
|
|
25
|
+
node bin/state-manager.js get {feature-name}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Leia:
|
|
29
|
+
1. `.morph/project/outputs/{feature}/proposal.md` - Proposta inicial
|
|
30
|
+
2. `.morph/project/outputs/{feature}/ui-*.md` - UI/UX specs (se existirem)
|
|
31
|
+
3. `framework/standards/` e `.morph/project/standards/` - Padrões aplicáveis
|
|
32
|
+
|
|
33
|
+
### Passo 2: Gerar `spec.md`
|
|
34
|
+
|
|
35
|
+
Crie `.morph/project/outputs/{feature}/spec.md` com:
|
|
36
|
+
|
|
37
|
+
#### 2.1. Overview
|
|
38
|
+
- **Objetivo:** Resumo de 1-2 parágrafos
|
|
39
|
+
- **Usuários afetados:** Quem vai usar?
|
|
40
|
+
- **Problema resolvido:** Qual dor/necessidade?
|
|
41
|
+
|
|
42
|
+
#### 2.2. Functional Requirements
|
|
43
|
+
Lista detalhada de requisitos funcionais:
|
|
44
|
+
```markdown
|
|
45
|
+
### FR001: {Requisito}
|
|
46
|
+
**Description:** {O que deve fazer}
|
|
47
|
+
**Acceptance Criteria:**
|
|
48
|
+
- [ ] Critério 1
|
|
49
|
+
- [ ] Critério 2
|
|
50
|
+
**Priority:** High/Medium/Low
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
#### 2.3. Non-Functional Requirements
|
|
54
|
+
- Performance (tempos de resposta esperados)
|
|
55
|
+
- Segurança (autenticação, autorização)
|
|
56
|
+
- Escalabilidade (volume de dados/usuários)
|
|
57
|
+
- Disponibilidade (uptime esperado)
|
|
58
|
+
|
|
59
|
+
#### 2.4. Technical Architecture
|
|
60
|
+
- **Camadas:** (Presentation, Application, Domain, Infrastructure)
|
|
61
|
+
- **Patterns:** (Repository, CQRS, DI, etc.)
|
|
62
|
+
- **Dependências:** Bibliotecas/serviços externos necessários
|
|
63
|
+
|
|
64
|
+
#### 2.5. Data Model
|
|
65
|
+
- Entities principais
|
|
66
|
+
- Relacionamentos (1:1, 1:N, N:N)
|
|
67
|
+
- Campos obrigatórios vs opcionais
|
|
68
|
+
- Validações de negócio
|
|
69
|
+
|
|
70
|
+
#### 2.6. Infrastructure Requirements
|
|
71
|
+
Se houver recursos Azure:
|
|
72
|
+
- Banco de dados (Azure SQL, Cosmos DB)
|
|
73
|
+
- Storage (Blob Storage)
|
|
74
|
+
- Compute (Container Apps, App Service)
|
|
75
|
+
- Monitoring (App Insights)
|
|
76
|
+
|
|
77
|
+
**SEMPRE usar Bicep para infra!**
|
|
78
|
+
|
|
79
|
+
### Passo 3: Gerar `contracts.cs`
|
|
80
|
+
|
|
81
|
+
Crie `.morph/project/outputs/{feature}/contracts.cs` com:
|
|
82
|
+
|
|
83
|
+
```csharp
|
|
84
|
+
// Interfaces, DTOs, Enums, Value Objects
|
|
85
|
+
|
|
86
|
+
namespace {ProjectName}.Features.{FeatureName};
|
|
87
|
+
|
|
88
|
+
// DTOs (Data Transfer Objects)
|
|
89
|
+
public record {Feature}CreateDto(
|
|
90
|
+
string Name,
|
|
91
|
+
DateTime Date
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
public record {Feature}ResponseDto(
|
|
95
|
+
Guid Id,
|
|
96
|
+
string Name,
|
|
97
|
+
DateTime Date,
|
|
98
|
+
DateTime CreatedAt
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
// Interfaces
|
|
102
|
+
public interface I{Feature}Service
|
|
103
|
+
{
|
|
104
|
+
Task<{Feature}ResponseDto> CreateAsync({Feature}CreateDto dto, CancellationToken ct);
|
|
105
|
+
Task<{Feature}ResponseDto?> GetByIdAsync(Guid id, CancellationToken ct);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Enums
|
|
109
|
+
public enum {Feature}Status
|
|
110
|
+
{
|
|
111
|
+
Pending,
|
|
112
|
+
Active,
|
|
113
|
+
Completed
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Padrões obrigatórios:**
|
|
118
|
+
- Records para DTOs (immutable)
|
|
119
|
+
- Interfaces para serviços
|
|
120
|
+
- CancellationToken em métodos async
|
|
121
|
+
- Nullable reference types habilitados
|
|
122
|
+
|
|
123
|
+
### Passo 4: Iniciar `decisions.md`
|
|
124
|
+
|
|
125
|
+
Crie `.morph/project/outputs/{feature}/decisions.md` com ADRs relevantes:
|
|
126
|
+
|
|
127
|
+
```markdown
|
|
128
|
+
# Architectural Decision Records (ADRs)
|
|
129
|
+
|
|
130
|
+
## ADR-001: {Decisão Arquitetural}
|
|
131
|
+
|
|
132
|
+
**Status:** Proposed/Accepted/Deprecated
|
|
133
|
+
|
|
134
|
+
**Context:**
|
|
135
|
+
{Por que esta decisão foi necessária}
|
|
136
|
+
|
|
137
|
+
**Decision:**
|
|
138
|
+
{O que foi decidido}
|
|
139
|
+
|
|
140
|
+
**Consequences:**
|
|
141
|
+
**Pros:**
|
|
142
|
+
- Pro 1
|
|
143
|
+
- Pro 2
|
|
144
|
+
|
|
145
|
+
**Cons:**
|
|
146
|
+
- Con 1
|
|
147
|
+
- Con 2
|
|
148
|
+
|
|
149
|
+
**Alternatives Considered:**
|
|
150
|
+
- Alternativa 1: {Por que foi rejeitada}
|
|
151
|
+
- Alternativa 2: {Por que foi rejeitada}
|
|
152
|
+
|
|
153
|
+
**Date:** {YYYY-MM-DD}
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**ADRs obrigatórios:**
|
|
159
|
+
- Escolha de biblioteca UI (se FASE 1.5 executou)
|
|
160
|
+
- Padrões arquiteturais (CQRS, Repository, etc.)
|
|
161
|
+
- Recursos Azure (se houver infra)
|
|
162
|
+
- Integrações externas (APIs, webhooks, etc.)
|
|
163
|
+
|
|
164
|
+
### Passo 5: Estimar Custos
|
|
165
|
+
|
|
166
|
+
Se houver recursos Azure na spec (arquivos Bicep):
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
# Calcular custos automaticamente
|
|
170
|
+
node bin/calculate-costs.js .morph/project/outputs/{feature}/infra/*.bicep --verbose
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
O cost calculator:
|
|
174
|
+
- Parseia arquivos Bicep e extrai recursos + SKUs
|
|
175
|
+
- Calcula custo mensal baseado em pricing table do Azure
|
|
176
|
+
- Valida contra limites configurados em `.morph/config/config.json`
|
|
177
|
+
- Exit code 1 se exceder o limite `requiresADR` (padrão: $10)
|
|
178
|
+
|
|
179
|
+
**Limites configuráveis** (em config.json):
|
|
180
|
+
- `costs.limits.freeTierOnly`: $0 (apenas free tier)
|
|
181
|
+
- `costs.limits.withApproval`: $10 (requer confirmação do usuário)
|
|
182
|
+
- `costs.limits.requiresADR`: $10 (requer ADR documentado)
|
|
183
|
+
|
|
184
|
+
**Exemplo de output:**
|
|
185
|
+
```
|
|
186
|
+
╔════════════════════════════════════════════════╗
|
|
187
|
+
║ MORPH-SPEC COST CALCULATOR ║
|
|
188
|
+
╠════════════════════════════════════════════════╣
|
|
189
|
+
║ sqlDatabase (Basic) $4.99/mo ║
|
|
190
|
+
║ containerApp (Consumption) $0.00/mo ║
|
|
191
|
+
║ appInsights (Free) $0.00/mo ║
|
|
192
|
+
╠════════════════════════════════════════════════╣
|
|
193
|
+
║ Total Monthly Cost: $4.99 ║
|
|
194
|
+
║ Requires Approval: YES ║
|
|
195
|
+
║ Requires ADR: NO ║
|
|
196
|
+
╚════════════════════════════════════════════════╝
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**Documente custos em `decisions.md`:**
|
|
200
|
+
|
|
201
|
+
```markdown
|
|
202
|
+
## ADR-XXX: Infrastructure Costs
|
|
203
|
+
|
|
204
|
+
**Estimated Monthly Cost:** $X.XX
|
|
205
|
+
|
|
206
|
+
**Breakdown:**
|
|
207
|
+
- Azure SQL Basic: $5.00
|
|
208
|
+
- Container App (scale-to-zero): $0.00
|
|
209
|
+
- Storage LRS (1GB): $0.02
|
|
210
|
+
- App Insights Free: $0.00
|
|
211
|
+
|
|
212
|
+
**Total:** $5.02/month
|
|
213
|
+
|
|
214
|
+
**Approval Required:** {Yes/No - based on $10 threshold}
|
|
215
|
+
|
|
216
|
+
**Justification:**
|
|
217
|
+
{Se > $10, justificar aqui}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
4. Atualizar state com custo:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
node bin/state-manager.js set {feature-name} costs.estimated {X.XX}
|
|
224
|
+
node bin/state-manager.js set {feature-name} costs.approved {true/false}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Passo 6: Atualizar State
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
# Marcar fase como design
|
|
231
|
+
node bin/state-manager.js set {feature-name} phase design
|
|
232
|
+
|
|
233
|
+
# Marcar outputs criados
|
|
234
|
+
node bin/state-manager.js mark-output {feature-name} spec
|
|
235
|
+
node bin/state-manager.js mark-output {feature-name} contracts
|
|
236
|
+
node bin/state-manager.js mark-output {feature-name} decisions
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Outputs Gerados
|
|
240
|
+
|
|
241
|
+
- `.morph/project/outputs/{feature}/spec.md` - Especificação técnica completa
|
|
242
|
+
- `.morph/project/outputs/{feature}/contracts.cs` - Interfaces, DTOs, Enums
|
|
243
|
+
- `.morph/project/outputs/{feature}/decisions.md` - ADRs (novo ou atualizado)
|
|
244
|
+
- State atualizado com custos estimados
|
|
245
|
+
|
|
246
|
+
## ⛔ PAUSA OBRIGATÓRIA
|
|
247
|
+
|
|
248
|
+
Apresente ao usuário 3 ações sugeridas:
|
|
249
|
+
|
|
250
|
+
1. ✅ **Aprovar design e continuar para clarificação**
|
|
251
|
+
Prosseguir para `/morph-clarify` (FASE 3)
|
|
252
|
+
|
|
253
|
+
2. 🔄 **Ajustar escopo/complexidade**
|
|
254
|
+
Revisar spec.md para reduzir ou expandir funcionalidades
|
|
255
|
+
|
|
256
|
+
3. 💰 **Revisar custos estimados** (se houver recursos Azure)
|
|
257
|
+
Ajustar SKUs ou recursos para ficar dentro do budget
|
|
258
|
+
|
|
259
|
+
4. 📋 **Modificar contracts**
|
|
260
|
+
Ajustar interfaces/DTOs se necessário
|
|
261
|
+
|
|
262
|
+
**Formato:** Escolher 3 das opções acima, contextualizadas para a feature
|
|
263
|
+
|
|
264
|
+
## Critérios de Avanço
|
|
265
|
+
|
|
266
|
+
- [x] `spec.md` completo com todos os requisitos
|
|
267
|
+
- [x] `contracts.cs` com interfaces e DTOs
|
|
268
|
+
- [x] `decisions.md` com ADRs relevantes
|
|
269
|
+
- [x] Custos estimados e documentados (se houver infra)
|
|
270
|
+
- [x] State atualizado
|
|
271
|
+
- [x] Usuário aprovou design
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
**Feature:** $ARGUMENTS
|
|
@@ -5,56 +5,97 @@ Crie uma nova proposta de feature seguindo o workflow MORPH.
|
|
|
5
5
|
## Contexto
|
|
6
6
|
|
|
7
7
|
Leia os seguintes arquivos para entender o projeto:
|
|
8
|
-
- `.morph/project.md` - Contexto
|
|
9
|
-
- `.morph/standards/` - Padrões técnicos
|
|
8
|
+
- `.morph/project/context/README.md` - Contexto do projeto
|
|
9
|
+
- `framework/standards/` e `.morph/project/standards/` - Padrões técnicos
|
|
10
10
|
- `.morph/config/agents.json` - Agentes disponíveis
|
|
11
11
|
|
|
12
12
|
## Workflow
|
|
13
13
|
|
|
14
|
-
1. **
|
|
14
|
+
1. **Detecte agentes automaticamente**:
|
|
15
|
+
```bash
|
|
16
|
+
node bin/detect-agents.js "$ARGUMENTS"
|
|
17
|
+
```
|
|
18
|
+
Isso retorna quais agentes devem ser ativados baseado em keywords.
|
|
19
|
+
|
|
20
|
+
2. **Invoque skills dos agentes detectados**:
|
|
21
|
+
- Para agentes com `skillPath` em agents.json, invoque o Skill correspondente
|
|
22
|
+
- Exemplo: Se detectou `uiux-designer`, consulte `.claude/skills/specialists/ui-ux-designer.md`
|
|
23
|
+
- Skills contêm conhecimento especializado, workflows e prompts detalhados
|
|
24
|
+
- Use conhecimento dos skills para enriquecer a proposta
|
|
25
|
+
|
|
26
|
+
3. **Analise a solicitação** e identifique:
|
|
15
27
|
- Problema a resolver
|
|
16
28
|
- Usuários afetados
|
|
17
29
|
- Impacto esperado
|
|
18
30
|
|
|
19
|
-
|
|
31
|
+
4. **Crie a estrutura da feature**:
|
|
20
32
|
```
|
|
21
|
-
.morph/
|
|
33
|
+
.morph/project/outputs/{feature-name}/
|
|
22
34
|
├── proposal.md # Proposta inicial
|
|
23
35
|
├── spec.md # Especificação técnica (iniciar)
|
|
24
|
-
└── tasks.
|
|
36
|
+
└── tasks.json # Lista de tasks (iniciar)
|
|
25
37
|
```
|
|
26
38
|
|
|
27
|
-
|
|
39
|
+
5. **Preencha `proposal.md`** baseado em `framework/templates/proposal.md`:
|
|
28
40
|
- Problem Statement
|
|
29
41
|
- Proposed Solution
|
|
30
42
|
- Success Metrics
|
|
31
43
|
- Scope (In/Out)
|
|
32
44
|
- Estimated Effort
|
|
33
45
|
- Cost Impact
|
|
46
|
+
- **Agents Activated** (lista dos agentes detectados)
|
|
34
47
|
|
|
35
|
-
|
|
48
|
+
6. **Inicie `spec.md`** com:
|
|
36
49
|
- User Stories principais
|
|
37
50
|
- Arquitetura proposta
|
|
38
51
|
- Data Model inicial
|
|
39
52
|
|
|
40
|
-
|
|
41
|
-
- Tasks de alto nível identificadas
|
|
53
|
+
7. **Inicie `tasks.json`** com:
|
|
54
|
+
- Tasks de alto nível identificadas (formato JSON)
|
|
42
55
|
- Checkpoints sugeridos
|
|
43
56
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
57
|
+
## State Management
|
|
58
|
+
|
|
59
|
+
Após criar o proposal, **SEMPRE** registre a feature no state.json:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Criar entrada no state
|
|
63
|
+
node bin/state-manager.js set {feature-name} status draft
|
|
64
|
+
node bin/state-manager.js set {feature-name} phase proposal
|
|
65
|
+
|
|
66
|
+
# Marcar output como criado
|
|
67
|
+
node bin/state-manager.js mark-output {feature-name} proposal
|
|
68
|
+
|
|
69
|
+
# Adicionar agentes ativados (todos os detectados)
|
|
70
|
+
# Parsear output do detect-agents.js e adicionar cada um:
|
|
71
|
+
for agent in $(node bin/detect-agents.js --ids-only "$ARGUMENTS"); do
|
|
72
|
+
node bin/state-manager.js add-agent {feature-name} $agent
|
|
73
|
+
done
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Exemplo completo:**
|
|
77
|
+
```bash
|
|
78
|
+
# Detectar e registrar agentes
|
|
79
|
+
AGENTS=$(node bin/detect-agents.js --ids-only "implementar dashboard com charts")
|
|
80
|
+
# Retorna: standards-architect, azure-architect, ..., uiux-designer
|
|
81
|
+
|
|
82
|
+
# Para cada agente
|
|
83
|
+
echo "$AGENTS" | while read agent; do
|
|
84
|
+
node bin/state-manager.js add-agent my-feature "$agent"
|
|
85
|
+
done
|
|
86
|
+
```
|
|
48
87
|
|
|
49
88
|
## Output
|
|
50
89
|
|
|
51
90
|
Ao final, apresente:
|
|
52
91
|
1. Resumo da proposta
|
|
53
|
-
2. Agentes ativados
|
|
92
|
+
2. Agentes ativados (e registrados no state)
|
|
54
93
|
3. Custo estimado
|
|
55
94
|
4. Perguntas de clarificação (se houver)
|
|
56
95
|
5. Solicitar aprovação para prosseguir para DESIGN
|
|
57
96
|
|
|
97
|
+
**IMPORTANTE:** Confirme que a feature foi registrada no state.json executando `node bin/state-manager.js list`.
|
|
98
|
+
|
|
58
99
|
---
|
|
59
100
|
|
|
60
101
|
**Feature solicitada:** $ARGUMENTS
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# MORPH Setup - FASE 1
|
|
2
|
+
|
|
3
|
+
Inicialize o contexto e prepare o ambiente para uma feature aprovada.
|
|
4
|
+
|
|
5
|
+
## Uso
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/morph-setup {feature-name}
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Pré-requisitos
|
|
12
|
+
|
|
13
|
+
- [ ] Feature tem `proposal.md` criado (FASE 0 concluída)
|
|
14
|
+
- [ ] Proposal foi aprovado pelo usuário
|
|
15
|
+
- [ ] Agentes foram detectados e registrados no state
|
|
16
|
+
|
|
17
|
+
## Workflow
|
|
18
|
+
|
|
19
|
+
### Passo 1: Verificar State
|
|
20
|
+
|
|
21
|
+
Confirme que a feature existe no state:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
node bin/state-manager.js get {feature-name}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Se não existir, volte para `/morph-proposal`.
|
|
28
|
+
|
|
29
|
+
### Passo 2: Carregar Contexto do Projeto
|
|
30
|
+
|
|
31
|
+
Leia os seguintes arquivos para entender o projeto:
|
|
32
|
+
|
|
33
|
+
1. **Contexto geral**:
|
|
34
|
+
- `.morph/project/context/README.md` - Overview do projeto
|
|
35
|
+
- `.morph/config.json` - Configurações
|
|
36
|
+
|
|
37
|
+
2. **Standards do framework**:
|
|
38
|
+
- `framework/standards/coding.md` - Padrões de código
|
|
39
|
+
- `framework/standards/architecture.md` - Padrões de arquitetura
|
|
40
|
+
- `framework/standards/azure.md` - Padrões Azure e IaC
|
|
41
|
+
|
|
42
|
+
3. **Standards do projeto** (sobrescrevem framework se existirem):
|
|
43
|
+
- `.morph/project/standards/coding.md`
|
|
44
|
+
- `.morph/project/standards/architecture.md`
|
|
45
|
+
- `.morph/project/standards/inferred.md` - Standards detectados
|
|
46
|
+
|
|
47
|
+
### Passo 3: Confirmar Stack
|
|
48
|
+
|
|
49
|
+
Baseado no proposal e contexto, confirme:
|
|
50
|
+
- Stack tecnológica (Blazor Server, Next.js, Shopify, etc.)
|
|
51
|
+
- Padrões arquiteturais aplicáveis
|
|
52
|
+
- Componentes reutilizáveis existentes
|
|
53
|
+
|
|
54
|
+
### Passo 4: Listar Agentes Ativos
|
|
55
|
+
|
|
56
|
+
Mostre os agentes detectados no proposal:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
node bin/state-manager.js get {feature-name}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Parse o JSON e liste os `activeAgents` com seus emojis e responsabilidades (consulte `.morph/config/agents.json`).
|
|
63
|
+
|
|
64
|
+
### Passo 5: Atualizar State
|
|
65
|
+
|
|
66
|
+
Marque a feature como na fase SETUP:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
node bin/state-manager.js set {feature-name} phase setup
|
|
70
|
+
node bin/state-manager.js set {feature-name} status in_progress
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Outputs
|
|
74
|
+
|
|
75
|
+
**Apresente ao usuário:**
|
|
76
|
+
|
|
77
|
+
1. **Contexto carregado**:
|
|
78
|
+
- Nome do projeto
|
|
79
|
+
- Stack confirmado
|
|
80
|
+
- Standards aplicáveis
|
|
81
|
+
|
|
82
|
+
2. **Agentes ativos**:
|
|
83
|
+
- Lista de agentes com emojis
|
|
84
|
+
- Responsabilidades de cada um
|
|
85
|
+
|
|
86
|
+
3. **Próximos passos**:
|
|
87
|
+
- Se feature tem UI/UX keywords → `/morph-uiux` (FASE 1.5)
|
|
88
|
+
- Se NÃO tem UI/UX → `/morph-design` (FASE 2)
|
|
89
|
+
|
|
90
|
+
## Critérios de Avanço
|
|
91
|
+
|
|
92
|
+
- [x] Contexto do projeto carregado
|
|
93
|
+
- [x] Standards identificados (framework + project)
|
|
94
|
+
- [x] Stack confirmado
|
|
95
|
+
- [x] Agentes listados
|
|
96
|
+
- [x] State atualizado para phase: setup
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
**Feature:** $ARGUMENTS
|