@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,336 @@
|
|
|
1
|
+
# UI Flows - {{FEATURE_NAME_TITLE}}
|
|
2
|
+
|
|
3
|
+
> Fluxos de usuário completos mostrando navegação, decisões e edge cases.
|
|
4
|
+
> Documenta COMO o usuário se move pela feature do início ao fim.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Fluxo 1: {Nome do Fluxo Principal}
|
|
9
|
+
|
|
10
|
+
### Contexto
|
|
11
|
+
|
|
12
|
+
**Trigger (Gatilho):**
|
|
13
|
+
{O que inicia este fluxo? Ex: "Usuário clica em [+ Novo Pedido]"}
|
|
14
|
+
|
|
15
|
+
**Pré-condições:**
|
|
16
|
+
- {Condição 1 que deve ser verdadeira para iniciar o fluxo}
|
|
17
|
+
- {Condição 2}
|
|
18
|
+
|
|
19
|
+
**Objetivo:**
|
|
20
|
+
{O que o usuário quer alcançar ao final deste fluxo?}
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
### Happy Path (Caminho Ideal)
|
|
25
|
+
|
|
26
|
+
#### Passos
|
|
27
|
+
|
|
28
|
+
**1. {Tela/Componente Inicial}**: {Ação do usuário}
|
|
29
|
+
- Sistema: {Resposta do sistema}
|
|
30
|
+
- UI: {Mudança visual}
|
|
31
|
+
- Navegação: {Para onde vai}
|
|
32
|
+
|
|
33
|
+
**2. {Próxima Tela/Componente}**: {Próxima ação}
|
|
34
|
+
- Sistema: {Processamento backend}
|
|
35
|
+
- UI: {Feedback visual}
|
|
36
|
+
- Validação: {Regras aplicadas}
|
|
37
|
+
|
|
38
|
+
**3. {Tela/Componente Final}**: {Ação de conclusão}
|
|
39
|
+
- Sistema: {Persistência/salvamento}
|
|
40
|
+
- UI: {Mensagem de sucesso}
|
|
41
|
+
- Navegação: {Retorna para onde}
|
|
42
|
+
|
|
43
|
+
**Tempo estimado:** {X segundos/minutos para usuário completar}
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
### Diagrama de Fluxo (Happy Path)
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
┌─────────────────┐
|
|
51
|
+
│ Tela Inicial │
|
|
52
|
+
│ [Dashboard] │
|
|
53
|
+
└────────┬────────┘
|
|
54
|
+
│
|
|
55
|
+
│ Clica [+ Novo Pedido]
|
|
56
|
+
▼
|
|
57
|
+
┌─────────────────┐
|
|
58
|
+
│ Modal/Wizard │
|
|
59
|
+
│ Aberto │
|
|
60
|
+
└────────┬────────┘
|
|
61
|
+
│
|
|
62
|
+
│ ⟨Step 1⟩ Seleciona Cliente
|
|
63
|
+
▼
|
|
64
|
+
┌─────────────────┐
|
|
65
|
+
│ Cliente │
|
|
66
|
+
│ Selecionado │
|
|
67
|
+
└────────┬────────┘
|
|
68
|
+
│
|
|
69
|
+
│ Clica [Próximo]
|
|
70
|
+
▼
|
|
71
|
+
┌─────────────────┐
|
|
72
|
+
│ ⟨Step 2⟩ │
|
|
73
|
+
│ Produtos │
|
|
74
|
+
└────────┬────────┘
|
|
75
|
+
│
|
|
76
|
+
│ Adiciona Produtos
|
|
77
|
+
│ Total Calculado
|
|
78
|
+
▼
|
|
79
|
+
┌─────────────────┐
|
|
80
|
+
│ Lista de │
|
|
81
|
+
│ Produtos OK │
|
|
82
|
+
└────────┬────────┘
|
|
83
|
+
│
|
|
84
|
+
│ Clica [Próximo]
|
|
85
|
+
▼
|
|
86
|
+
┌─────────────────┐
|
|
87
|
+
│ ⟨Step 3⟩ │
|
|
88
|
+
│ Revisão │
|
|
89
|
+
└────────┬────────┘
|
|
90
|
+
│
|
|
91
|
+
│ Clica [Confirmar]
|
|
92
|
+
▼
|
|
93
|
+
┌─────────────────┐
|
|
94
|
+
│ ✅ Pedido │
|
|
95
|
+
│ Criado! │
|
|
96
|
+
└────────┬────────┘
|
|
97
|
+
│
|
|
98
|
+
│ Toast "Sucesso!"
|
|
99
|
+
│ Navega para Detalhes
|
|
100
|
+
▼
|
|
101
|
+
┌─────────────────┐
|
|
102
|
+
│ Tela Detalhes │
|
|
103
|
+
│ Pedido #12345 │
|
|
104
|
+
└─────────────────┘
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
### Edge Cases (Casos de Exceção)
|
|
110
|
+
|
|
111
|
+
#### 1. {Nome do Edge Case}
|
|
112
|
+
|
|
113
|
+
**Cenário:**
|
|
114
|
+
{Descrição da situação excepcional}
|
|
115
|
+
|
|
116
|
+
**Como o sistema lida:**
|
|
117
|
+
```
|
|
118
|
+
┌─────────────────┐
|
|
119
|
+
│ Passo Normal │
|
|
120
|
+
└────────┬────────┘
|
|
121
|
+
│
|
|
122
|
+
│ ❌ {Erro/Condição}
|
|
123
|
+
▼
|
|
124
|
+
┌─────────────────┐
|
|
125
|
+
│ Mensagem Erro │
|
|
126
|
+
│ FluentDialog │
|
|
127
|
+
└────────┬────────┘
|
|
128
|
+
│
|
|
129
|
+
┌────┴────┐
|
|
130
|
+
│ │
|
|
131
|
+
▼ ▼
|
|
132
|
+
[Tentar] [Cancelar]
|
|
133
|
+
Novamente
|
|
134
|
+
│ │
|
|
135
|
+
│ └──▶ [Volta Dashboard]
|
|
136
|
+
│
|
|
137
|
+
└──▶ [Repete Passo]
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**UI:**
|
|
141
|
+
- Componente: {FluentDialog, FluentMessageBar, etc}
|
|
142
|
+
- Mensagem: "{Texto exato da mensagem}"
|
|
143
|
+
- Ações disponíveis: {Botões/links}
|
|
144
|
+
|
|
145
|
+
**Exemplo de código:**
|
|
146
|
+
```razor
|
|
147
|
+
@if (!string.IsNullOrEmpty(_error))
|
|
148
|
+
{
|
|
149
|
+
<FluentMessageBar Intent="MessageIntent.Error">
|
|
150
|
+
@_error
|
|
151
|
+
<FluentButton OnClick="@Retry">Tentar Novamente</FluentButton>
|
|
152
|
+
</FluentMessageBar>
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
#### 2. {Outro Edge Case}
|
|
159
|
+
|
|
160
|
+
{Repita a estrutura acima}
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
### Fluxos Alternativos
|
|
165
|
+
|
|
166
|
+
#### Alt 1: {Nome do Fluxo Alternativo}
|
|
167
|
+
|
|
168
|
+
**Diverge em:** {Em qual passo do happy path este fluxo se ramifica}
|
|
169
|
+
|
|
170
|
+
**Condição:** {O que causa a divergência}
|
|
171
|
+
|
|
172
|
+
**Passos:**
|
|
173
|
+
1. {Passo alternativo 1}
|
|
174
|
+
2. {Passo alternativo 2}
|
|
175
|
+
3. {Convergência de volta ao happy path OU conclusão diferente}
|
|
176
|
+
|
|
177
|
+
**Diagrama:**
|
|
178
|
+
```
|
|
179
|
+
[Happy Path]
|
|
180
|
+
│
|
|
181
|
+
├─{Condição}──▶ [Fluxo Alt]
|
|
182
|
+
│ │
|
|
183
|
+
│ └──▶ [Converge]
|
|
184
|
+
▼
|
|
185
|
+
[Continua...]
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Fluxo 2: {Segundo Fluxo Importante}
|
|
191
|
+
|
|
192
|
+
{Repita toda a estrutura acima para cada fluxo principal}
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Interações Comuns (Micro-Fluxos)
|
|
197
|
+
|
|
198
|
+
### {Ação Rápida - Ex: "Buscar Item"}
|
|
199
|
+
|
|
200
|
+
**Trigger:** {Usuário digita na search bar}
|
|
201
|
+
|
|
202
|
+
**Fluxo:**
|
|
203
|
+
```
|
|
204
|
+
[Input vazio] ──▶ [Usuário digita] ──▶ [Debounce 300ms] ──▶ [API Call]
|
|
205
|
+
│
|
|
206
|
+
▼
|
|
207
|
+
[Resultados]
|
|
208
|
+
│
|
|
209
|
+
┌─────────────┴──────────┐
|
|
210
|
+
▼ ▼
|
|
211
|
+
[Tem Resultados] [Vazio]
|
|
212
|
+
│ │
|
|
213
|
+
▼ ▼
|
|
214
|
+
[Mostra Lista] [Mostra "Não encontrado"]
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**Componente:** `FluentAutocomplete`
|
|
218
|
+
|
|
219
|
+
**Código:**
|
|
220
|
+
```razor
|
|
221
|
+
<FluentAutocomplete TItem="Item"
|
|
222
|
+
SearchAsync="@SearchItemsAsync"
|
|
223
|
+
Placeholder="Buscar item..."
|
|
224
|
+
MinLength="2"
|
|
225
|
+
Debounce="300">
|
|
226
|
+
<ItemTemplate Context="item">
|
|
227
|
+
@item.Name
|
|
228
|
+
</ItemTemplate>
|
|
229
|
+
</FluentAutocomplete>
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## Mapa de Navegação Completo
|
|
235
|
+
|
|
236
|
+
Visão geral de TODAS as telas e como se conectam:
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
┌──────────────┐
|
|
240
|
+
│ Dashboard │
|
|
241
|
+
└──────┬───────┘
|
|
242
|
+
│
|
|
243
|
+
┌─────────────────┼─────────────────┐
|
|
244
|
+
│ │ │
|
|
245
|
+
▼ ▼ ▼
|
|
246
|
+
┌─────────┐ ┌──────────┐ ┌─────────┐
|
|
247
|
+
│ Pedidos │ │ Clientes │ │Produtos │
|
|
248
|
+
└────┬────┘ └────┬─────┘ └────┬────┘
|
|
249
|
+
│ │ │
|
|
250
|
+
▼ ▼ ▼
|
|
251
|
+
[+ Novo] [+ Novo] [+ Novo]
|
|
252
|
+
│ │ │
|
|
253
|
+
└────────────────┴──────────────────┬┘
|
|
254
|
+
│
|
|
255
|
+
▼
|
|
256
|
+
┌───────────────┐
|
|
257
|
+
│ Modal Wizard │
|
|
258
|
+
│ (3 steps) │
|
|
259
|
+
└───────┬───────┘
|
|
260
|
+
│
|
|
261
|
+
▼
|
|
262
|
+
[Confirmar]
|
|
263
|
+
│
|
|
264
|
+
▼
|
|
265
|
+
┌───────────────┐
|
|
266
|
+
│ Tela Detalhes │
|
|
267
|
+
└───────┬───────┘
|
|
268
|
+
│
|
|
269
|
+
┌───────┴───────┐
|
|
270
|
+
│ │
|
|
271
|
+
▼ ▼
|
|
272
|
+
[Editar] [Voltar]
|
|
273
|
+
│ │
|
|
274
|
+
└───────┬───────┘
|
|
275
|
+
│
|
|
276
|
+
▼
|
|
277
|
+
[Dashboard]
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## Estados de Loading
|
|
283
|
+
|
|
284
|
+
### {Onde há loading na feature}
|
|
285
|
+
|
|
286
|
+
**1. Carregamento Inicial:**
|
|
287
|
+
- **Onde:** {Primeira tela ao abrir}
|
|
288
|
+
- **Componente:** `FluentSkeleton` ou `FluentProgress`
|
|
289
|
+
- **Duração esperada:** {X ms}
|
|
290
|
+
|
|
291
|
+
**2. Carregamento de Ação:**
|
|
292
|
+
- **Onde:** {Ao submeter form, por exemplo}
|
|
293
|
+
- **Componente:** `FluentButton` com `Loading="true"`
|
|
294
|
+
- **Duração esperada:** {X ms}
|
|
295
|
+
|
|
296
|
+
**3. Carregamento Incremental:**
|
|
297
|
+
- **Onde:** {Infinite scroll, paginação}
|
|
298
|
+
- **Componente:** `FluentProgress` no rodapé
|
|
299
|
+
- **Duração esperada:** {X ms}
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Validações e Feedback
|
|
304
|
+
|
|
305
|
+
### Validações Client-Side
|
|
306
|
+
|
|
307
|
+
| Campo | Validação | Mensagem de Erro | Componente |
|
|
308
|
+
|-------|-----------|------------------|------------|
|
|
309
|
+
| {Nome} | Required | "Campo obrigatório" | FluentTextField |
|
|
310
|
+
| {Email} | Email format | "Email inválido" | FluentTextField |
|
|
311
|
+
| {CPF} | CPF válido | "CPF inválido" | FluentTextField |
|
|
312
|
+
|
|
313
|
+
### Validações Server-Side
|
|
314
|
+
|
|
315
|
+
| Ação | Validação | Erro Possível | Como Mostra |
|
|
316
|
+
|------|-----------|---------------|-------------|
|
|
317
|
+
| Criar Pedido | Cliente ativo | "Cliente inativo" | FluentMessageBar |
|
|
318
|
+
| Adicionar Produto | Estoque > 0 | "Sem estoque" | FluentDialog |
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## Checklist de Fluxos
|
|
323
|
+
|
|
324
|
+
- [ ] Happy path documentado com todos os passos
|
|
325
|
+
- [ ] Diagramas ASCII de cada fluxo
|
|
326
|
+
- [ ] Edge cases identificados (erro, vazio, retry)
|
|
327
|
+
- [ ] Fluxos alternativos mapeados
|
|
328
|
+
- [ ] Loading states especificados
|
|
329
|
+
- [ ] Validações client-side e server-side listadas
|
|
330
|
+
- [ ] Mensagens de erro/sucesso definidas
|
|
331
|
+
- [ ] Navegação entre telas clara
|
|
332
|
+
- [ ] Tempo estimado de cada fluxo
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
*Template MORPH-SPEC v2.1.0 by Polymorphism Tech*
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# UI Mockups - {{FEATURE_NAME_TITLE}}
|
|
2
|
+
|
|
3
|
+
> Wireframes ASCII e descrições de cada tela/componente da feature.
|
|
4
|
+
> Este arquivo documenta VISUALMENTE como o usuário interagirá com o sistema.
|
|
5
|
+
> Generated: {{DATE}}
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Tela 1: {Nome da Tela}
|
|
10
|
+
|
|
11
|
+
### Wireframe
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
┌─────────────────────────────────────────────────────────┐
|
|
15
|
+
│ [{≡}] {Título da Página} [🔔] [👤] [⚙] │
|
|
16
|
+
├─────────────────────────────────────────────────────────┤
|
|
17
|
+
│ │
|
|
18
|
+
│ {Desenhe o wireframe ASCII aqui} │
|
|
19
|
+
│ │
|
|
20
|
+
│ Dicas: │
|
|
21
|
+
│ - Use ┌─┐└┘├┤ para bordas │
|
|
22
|
+
│ - Use │ para separadores verticais │
|
|
23
|
+
│ - Use ─ para separadores horizontais │
|
|
24
|
+
│ - Use [...] para botões │
|
|
25
|
+
│ - Use [{x}] para checkboxes/toggles │
|
|
26
|
+
│ - Use emojis para ícones (🔍 📊 ⚙ 👤 etc) │
|
|
27
|
+
│ │
|
|
28
|
+
└─────────────────────────────────────────────────────────┘
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Descrição
|
|
32
|
+
|
|
33
|
+
- **Propósito**: {O que o usuário pode fazer nesta tela? Qual problema resolve?}
|
|
34
|
+
- **Componentes Principais**:
|
|
35
|
+
- {Componente 1}: {Descrição breve}
|
|
36
|
+
- {Componente 2}: {Descrição breve}
|
|
37
|
+
- {Componente 3}: {Descrição breve}
|
|
38
|
+
- **Interações**:
|
|
39
|
+
- **Click em {elemento}**: {O que acontece}
|
|
40
|
+
- **Hover em {elemento}**: {Feedback visual}
|
|
41
|
+
- **Submit form**: {Ação realizada}
|
|
42
|
+
- **Estados**:
|
|
43
|
+
- **Default**: {Aparência inicial}
|
|
44
|
+
- **Loading**: {Como mostra carregamento? Skeleton? Spinner?}
|
|
45
|
+
- **Error**: {Como mostra erros? Toast? Message bar?}
|
|
46
|
+
- **Empty**: {Mensagem quando não há dados? CTA para criar?}
|
|
47
|
+
- **Success**: {Feedback de sucesso?}
|
|
48
|
+
|
|
49
|
+
### Responsividade
|
|
50
|
+
|
|
51
|
+
- **Desktop (> 1024px)**: {Descrição do layout desktop}
|
|
52
|
+
- **Tablet (768px - 1024px)**: {Mudanças no layout}
|
|
53
|
+
- **Mobile (< 768px)**: {Layout mobile - stack vertical? Menu hamburger?}
|
|
54
|
+
|
|
55
|
+
### Navegação
|
|
56
|
+
|
|
57
|
+
- **De**: {Tela/componente anterior}
|
|
58
|
+
- **Para**: {Próximas telas possíveis}
|
|
59
|
+
- **Ações**:
|
|
60
|
+
- [{Botão}]: Navega para {tela}
|
|
61
|
+
- [{Link}]: Abre {modal/página}
|
|
62
|
+
|
|
63
|
+
### Acessibilidade
|
|
64
|
+
|
|
65
|
+
- **Foco inicial**: {Onde o cursor deve iniciar?}
|
|
66
|
+
- **Tab order**: {Ordem lógica de navegação}
|
|
67
|
+
- **Screen reader**: {Principais ARIA labels}
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Tela 2: {Nome da Próxima Tela}
|
|
72
|
+
|
|
73
|
+
{Repita a estrutura acima para cada tela}
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Componentes Reutilizáveis
|
|
78
|
+
|
|
79
|
+
### {Nome do Componente}
|
|
80
|
+
|
|
81
|
+
**Wireframe:**
|
|
82
|
+
```
|
|
83
|
+
{ASCII art do componente isolado}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Uso:**
|
|
87
|
+
- Aparece em: {Lista de telas onde este componente aparece}
|
|
88
|
+
- Variantes: {Diferentes versões/estados do componente}
|
|
89
|
+
- Props: {Parâmetros que o componente recebe}
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Fluxo de Navegação (Overview)
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
[Tela Inicial]
|
|
97
|
+
│
|
|
98
|
+
├─[Ação 1]──▶ [Tela A]
|
|
99
|
+
│ │
|
|
100
|
+
│ └─[Voltar]──▶ [Tela Inicial]
|
|
101
|
+
│
|
|
102
|
+
├─[Ação 2]──▶ [Tela B]
|
|
103
|
+
│ │
|
|
104
|
+
│ ├─[Próximo]──▶ [Tela C]
|
|
105
|
+
│ │
|
|
106
|
+
│ └─[Cancelar]──▶ [Tela Inicial]
|
|
107
|
+
│
|
|
108
|
+
└─[Ação 3]──▶ [Tela D]
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Notas de Design
|
|
114
|
+
|
|
115
|
+
### Paleta de Cores
|
|
116
|
+
- **Primária**: {Cor principal da interface}
|
|
117
|
+
- **Secundária**: {Cor para ações secundárias}
|
|
118
|
+
- **Sucesso**: {Verde para feedback positivo}
|
|
119
|
+
- **Erro**: {Vermelho para erros}
|
|
120
|
+
- **Warning**: {Amarelo para alertas}
|
|
121
|
+
|
|
122
|
+
### Tipografia
|
|
123
|
+
- **Títulos**: {Font, tamanho}
|
|
124
|
+
- **Corpo**: {Font, tamanho}
|
|
125
|
+
- **Labels**: {Font, tamanho}
|
|
126
|
+
|
|
127
|
+
### Espaçamento
|
|
128
|
+
- **Padding padrão**: {16px, 24px, etc}
|
|
129
|
+
- **Gap entre elementos**: {8px, 12px, etc}
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
*Template MORPH-SPEC v2.1.0 by Polymorphism Tech*
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Example Bicep file for testing cost calculator
|
|
2
|
+
|
|
3
|
+
param location string = 'eastus2'
|
|
4
|
+
param environment string = 'dev'
|
|
5
|
+
|
|
6
|
+
// Azure SQL Database - Basic tier ($4.99/month)
|
|
7
|
+
resource sqlDatabase 'Microsoft.Sql/servers/databases@2023-05-01-preview' = {
|
|
8
|
+
name: 'sqldb-myapp-${environment}'
|
|
9
|
+
location: location
|
|
10
|
+
sku: {
|
|
11
|
+
name: 'Basic'
|
|
12
|
+
tier: 'Basic'
|
|
13
|
+
}
|
|
14
|
+
properties: {
|
|
15
|
+
collation: 'SQL_Latin1_General_CP1_CI_AS'
|
|
16
|
+
maxSizeBytes: 2147483648 // 2 GB
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Container App - Scale-to-zero ($0/month)
|
|
21
|
+
resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {
|
|
22
|
+
name: 'ca-myapp-${environment}'
|
|
23
|
+
location: location
|
|
24
|
+
properties: {
|
|
25
|
+
configuration: {
|
|
26
|
+
ingress: {
|
|
27
|
+
external: true
|
|
28
|
+
targetPort: 8080
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
template: {
|
|
32
|
+
containers: [
|
|
33
|
+
{
|
|
34
|
+
name: 'main'
|
|
35
|
+
image: 'mcr.microsoft.com/azuredocs/containerapps-helloworld:latest'
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
scale: {
|
|
39
|
+
minReplicas: 0 // Scale-to-zero = FREE
|
|
40
|
+
maxReplicas: 2
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Application Insights - Free tier ($0/month)
|
|
47
|
+
resource appInsights 'Microsoft.Insights/components@2020-02-02' = {
|
|
48
|
+
name: 'appi-myapp-${environment}'
|
|
49
|
+
location: location
|
|
50
|
+
kind: 'web'
|
|
51
|
+
properties: {
|
|
52
|
+
Application_Type: 'web'
|
|
53
|
+
}
|
|
54
|
+
sku: {
|
|
55
|
+
name: 'Free'
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Total: $4.99/month (within $10 limit)
|
package/content/CLAUDE.md
CHANGED
|
@@ -255,6 +255,130 @@ infra/
|
|
|
255
255
|
|
|
256
256
|
---
|
|
257
257
|
|
|
258
|
+
## TEMPLATES E PLACEHOLDERS
|
|
259
|
+
|
|
260
|
+
### Princípio: Templates Auto-Populáveis
|
|
261
|
+
|
|
262
|
+
> SEMPRE use o CLI `bin/render-template.js` para renderizar templates. NUNCA preencha placeholders manualmente.
|
|
263
|
+
|
|
264
|
+
### Placeholders Padrão
|
|
265
|
+
|
|
266
|
+
Todos os templates usam o formato `{{PLACEHOLDER}}` (duplo-chave). Os placeholders são substituídos automaticamente pelo CLI.
|
|
267
|
+
|
|
268
|
+
| Placeholder | Descrição | Exemplo Input | Exemplo Output |
|
|
269
|
+
|-------------|-----------|---------------|----------------|
|
|
270
|
+
| `{{FEATURE_NAME}}` | Nome kebab-case da feature | `"scheduled-reports"` | `scheduled-reports` |
|
|
271
|
+
| `{{FEATURE_NAME_PASCAL}}` | PascalCase (para C#) | `"scheduled-reports"` | `ScheduledReports` |
|
|
272
|
+
| `{{FEATURE_NAME_CAMEL}}` | camelCase (para JS/TS) | `"scheduled-reports"` | `scheduledReports` |
|
|
273
|
+
| `{{FEATURE_NAME_TITLE}}` | Title Case (para títulos) | `"scheduled-reports"` | `Scheduled Reports` |
|
|
274
|
+
| `{{FEATURE_NAME_UPPER_SNAKE}}` | UPPER_SNAKE_CASE | `"scheduled-reports"` | `SCHEDULED_REPORTS` |
|
|
275
|
+
| `{{FEATURE_NAME_LOWER_SNAKE}}` | lower_snake_case | `"scheduled-reports"` | `scheduled_reports` |
|
|
276
|
+
| `{{STACK}}` | Stack do projeto | (auto) | `Blazor`, `Next.js` |
|
|
277
|
+
| `{{DATE}}` | Data atual (YYYY-MM-DD) | (auto) | `2025-12-08` |
|
|
278
|
+
| `{{YEAR}}` | Ano atual | (auto) | `2025` |
|
|
279
|
+
| `{{AUTHOR}}` | Autor (de config.json) | (auto) | `MORPH-SPEC` |
|
|
280
|
+
| `{{PROJECT_NAME}}` | Nome do projeto | (auto) | `MyProject` |
|
|
281
|
+
| `{{NAMESPACE}}` | Namespace C# | (auto) | `MyProject` |
|
|
282
|
+
|
|
283
|
+
**Transformações Automáticas:**
|
|
284
|
+
- Forneça apenas `FEATURE_NAME` em kebab-case (ex: `"my-feature"`)
|
|
285
|
+
- CLI gera automaticamente todas as variações de case
|
|
286
|
+
- Valores auto-populados (DATE, AUTHOR, etc.) vêm de `config.json`
|
|
287
|
+
|
|
288
|
+
### CLI de Renderização
|
|
289
|
+
|
|
290
|
+
#### Uso Básico
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
node bin/render-template.js <template-path> <output-path> <variables-json>
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
#### Exemplos
|
|
297
|
+
|
|
298
|
+
**Renderizar proposal.md:**
|
|
299
|
+
```bash
|
|
300
|
+
node bin/render-template.js \
|
|
301
|
+
content/.morph/templates/proposal.md \
|
|
302
|
+
.morph/project/outputs/scheduled-reports/proposal.md \
|
|
303
|
+
'{"FEATURE_NAME":"scheduled-reports"}'
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
**Renderizar contracts.cs com namespace customizado:**
|
|
307
|
+
```bash
|
|
308
|
+
node bin/render-template.js \
|
|
309
|
+
content/.morph/templates/contracts.cs \
|
|
310
|
+
src/Application/Features/ScheduledReports/Contracts.cs \
|
|
311
|
+
'{"FEATURE_NAME":"scheduled-report","NAMESPACE":"MyProject"}'
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
**Modo verbose (mostra placeholders substituídos):**
|
|
315
|
+
```bash
|
|
316
|
+
node bin/render-template.js \
|
|
317
|
+
content/.morph/templates/spec.md \
|
|
318
|
+
.morph/project/outputs/my-feature/spec.md \
|
|
319
|
+
'{"FEATURE_NAME":"my-feature","STACK":"Blazor"}' \
|
|
320
|
+
--verbose
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
**Dry-run (preview sem escrever arquivo):**
|
|
324
|
+
```bash
|
|
325
|
+
node bin/render-template.js \
|
|
326
|
+
content/.morph/templates/ui-mockups.md \
|
|
327
|
+
/dev/null \
|
|
328
|
+
'{"FEATURE_NAME":"user-dashboard"}' \
|
|
329
|
+
--dry-run
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
#### Flags Disponíveis
|
|
333
|
+
|
|
334
|
+
| Flag | Descrição |
|
|
335
|
+
|------|-----------|
|
|
336
|
+
| `--verbose`, `-v` | Mostra placeholders substituídos e não-substituídos |
|
|
337
|
+
| `--dry-run`, `-d` | Preview sem escrever arquivo |
|
|
338
|
+
| `--help`, `-h` | Mostra ajuda completa |
|
|
339
|
+
|
|
340
|
+
### Templates Disponíveis
|
|
341
|
+
|
|
342
|
+
**Outputs MORPH:**
|
|
343
|
+
- `.morph/templates/proposal.md` - FASE 0 (Proposal)
|
|
344
|
+
- `.morph/templates/ui-design-system.md` - FASE 1.5 (Design System)
|
|
345
|
+
- `.morph/templates/ui-mockups.md` - FASE 1.5 (Wireframes)
|
|
346
|
+
- `.morph/templates/ui-components.md` - FASE 1.5 (Component Specs)
|
|
347
|
+
- `.morph/templates/ui-flows.md` - FASE 1.5 (User Flows)
|
|
348
|
+
- `.morph/templates/spec.md` - FASE 2 (Technical Spec)
|
|
349
|
+
- `.morph/templates/contracts.cs` - FASE 2 (Interfaces/DTOs)
|
|
350
|
+
- `.morph/templates/decisions.md` - FASE 2 (ADRs)
|
|
351
|
+
- `.morph/templates/tasks.md` - FASE 4 (Task Breakdown)
|
|
352
|
+
- `.morph/templates/recap.md` - FASE 5 (Recap)
|
|
353
|
+
|
|
354
|
+
**Templates de Código:**
|
|
355
|
+
- `.morph/templates/service.cs` - Service implementation
|
|
356
|
+
- `.morph/templates/repository.cs` - Repository implementation
|
|
357
|
+
- `.morph/templates/agent.cs` - AI Agent (Microsoft Agent Framework)
|
|
358
|
+
- `.morph/templates/job.cs` - Hangfire background job
|
|
359
|
+
- `.morph/templates/test.cs` - Unit test template
|
|
360
|
+
|
|
361
|
+
### Integração com Slash Commands
|
|
362
|
+
|
|
363
|
+
Os slash commands **devem usar o CLI de renderização** para gerar outputs:
|
|
364
|
+
|
|
365
|
+
```markdown
|
|
366
|
+
# Em morph-proposal.md
|
|
367
|
+
|
|
368
|
+
node bin/render-template.js \
|
|
369
|
+
content/.morph/templates/proposal.md \
|
|
370
|
+
.morph/project/outputs/${FEATURE_NAME}/proposal.md \
|
|
371
|
+
"{\"FEATURE_NAME\":\"${FEATURE_NAME}\"}"
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
**Benefícios:**
|
|
375
|
+
- ✅ **Consistência:** Todos os outputs seguem o mesmo formato
|
|
376
|
+
- ✅ **Economia de tokens:** Claude não precisa preencher manualmente
|
|
377
|
+
- ✅ **Zero erros:** Transformações de case são 100% corretas
|
|
378
|
+
- ✅ **Rapidez:** CLI processa em <100ms
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
258
382
|
## COMANDOS (Slash Commands)
|
|
259
383
|
|
|
260
384
|
| Comando | Ação |
|