@polymorphism-tech/morph-spec 2.1.2 → 2.3.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 +389 -40
- package/bin/morph-spec.js +121 -0
- package/bin/task-manager.js +368 -0
- package/bin/validate-agents-skills.js +17 -5
- package/bin/validate.js +268 -0
- package/content/.claude/skills/specialists/ef-modeler.md +11 -0
- package/content/.claude/skills/specialists/hangfire-orchestrator.md +10 -0
- package/content/.claude/skills/specialists/ui-ux-designer.md +40 -0
- package/content/.claude/skills/stacks/dotnet-blazor.md +18 -0
- package/content/.morph/examples/state-v3.json +188 -0
- package/detectors/structure-detector.js +32 -3
- package/package.json +1 -1
- package/src/commands/create-story.js +68 -0
- package/src/commands/init.js +59 -5
- package/src/commands/state.js +1 -1
- package/src/commands/task.js +75 -0
- package/src/lib/continuous-validator.js +440 -0
- package/src/lib/learning-system.js +520 -0
- package/src/lib/mockup-generator.js +366 -0
- package/src/lib/ui-detector.js +350 -0
- package/src/lib/validators/architecture-validator.js +387 -0
- package/src/lib/validators/package-validator.js +360 -0
- package/src/lib/validators/ui-contrast-validator.js +422 -0
- package/src/utils/file-copier.js +26 -0
package/CLAUDE.md
CHANGED
|
@@ -17,6 +17,7 @@ Você é um sistema de desenvolvimento orientado por especificações. Opera com
|
|
|
17
17
|
- Ultrapassar limites de custo sem aprovação
|
|
18
18
|
- Criar recursos Azure manualmente no portal (use Bicep)
|
|
19
19
|
- Gerar código sem contracts definidos
|
|
20
|
+
- **Tomar decisões técnicas sozinho (infraestrutura, bibliotecas, patterns, schemas)**
|
|
20
21
|
|
|
21
22
|
### SEMPRE:
|
|
22
23
|
- Seguir as 8 fases obrigatórias (incluindo FASE 0.5: CONTEXT e FASE 1.5: UI/UX)
|
|
@@ -27,6 +28,7 @@ Você é um sistema de desenvolvimento orientado por especificações. Opera com
|
|
|
27
28
|
- Usar Infrastructure as Code (Bicep)
|
|
28
29
|
- Usar exclusivamente Microsoft Agent Framework (.NET 10)
|
|
29
30
|
- Coletar input do usuário na FASE 1.5 (layout, referências, imagens)
|
|
31
|
+
- **Consultar usuário em DECISION POINTS (ver seção DECISION POINTS)**
|
|
30
32
|
|
|
31
33
|
---
|
|
32
34
|
|
|
@@ -67,10 +69,13 @@ Use o CLI para validar consistência:
|
|
|
67
69
|
|
|
68
70
|
```bash
|
|
69
71
|
# Validar que todos skillPaths existem
|
|
70
|
-
|
|
72
|
+
npx morph-spec validate-agents-skills
|
|
71
73
|
|
|
72
74
|
# Modo verbose (mostra todos os mappings)
|
|
73
|
-
|
|
75
|
+
npx morph-spec validate-agents-skills --verbose
|
|
76
|
+
|
|
77
|
+
# OU, se em desenvolvimento local do framework:
|
|
78
|
+
# node bin/validate-agents-skills.js
|
|
74
79
|
```
|
|
75
80
|
|
|
76
81
|
Warnings de "orphan skills" são OK - são skills extras (infra/integrations) que podem ser usadas manualmente mas não têm agentes auto-ativados.
|
|
@@ -81,20 +86,23 @@ Warnings de "orphan skills" são OK - são skills extras (infra/integrations) qu
|
|
|
81
86
|
|
|
82
87
|
### Detecção Automática de Agentes
|
|
83
88
|
|
|
84
|
-
**SEMPRE** use o CLI
|
|
89
|
+
**SEMPRE** use o CLI para detectar automaticamente quais agentes ativar:
|
|
85
90
|
|
|
86
91
|
```bash
|
|
87
92
|
# Detectar agentes baseado no input do usuário
|
|
88
|
-
|
|
93
|
+
npx morph-spec detect "implementar jobs agendados"
|
|
89
94
|
# Output: ["standards-architect","azure-architect","blazor-builder","ef-modeler","cost-guardian","ms-agent-expert","hangfire-orchestrator"]
|
|
90
95
|
|
|
91
96
|
# Modo verbose para ver matches
|
|
92
|
-
|
|
97
|
+
npx morph-spec detect --verbose "criar dashboard com charts"
|
|
93
98
|
# Mostra quais keywords fizeram match
|
|
94
99
|
|
|
95
100
|
# Modo JSON completo
|
|
96
|
-
|
|
101
|
+
npx morph-spec detect --json "adicionar RAG pipeline"
|
|
97
102
|
# Retorna objeto completo com core, specialists, matches
|
|
103
|
+
|
|
104
|
+
# OU, se em desenvolvimento local do framework:
|
|
105
|
+
# node bin/detect-agents.js "text..."
|
|
98
106
|
```
|
|
99
107
|
|
|
100
108
|
### Quando Detectar
|
|
@@ -127,7 +135,10 @@ Após detectar agentes, **SEMPRE** registrar no state.json:
|
|
|
127
135
|
|
|
128
136
|
```bash
|
|
129
137
|
# Para cada agente detectado
|
|
130
|
-
|
|
138
|
+
morph-spec state add-agent {feature} {agent-id}
|
|
139
|
+
|
|
140
|
+
# OU, se em desenvolvimento local do framework:
|
|
141
|
+
# node bin/state-manager.js add-agent {feature} {agent-id}
|
|
131
142
|
```
|
|
132
143
|
|
|
133
144
|
### Benefícios
|
|
@@ -383,14 +394,14 @@ Modo Degradado (sem framework):
|
|
|
383
394
|
Gatilho: Nova feature request do usuário
|
|
384
395
|
Ações:
|
|
385
396
|
1. **Detectar agentes automaticamente:**
|
|
386
|
-
|
|
397
|
+
npx morph-spec detect "{user-request}"
|
|
387
398
|
|
|
388
399
|
2. Analisar a solicitação inicial
|
|
389
400
|
3. Identificar stack provável (Blazor, Next.js, Shopify)
|
|
390
401
|
4. Estimar complexidade (baixa, média, alta)
|
|
391
402
|
5. Gerar proposal.md com análise inicial
|
|
392
403
|
6. Registrar agentes no state.json:
|
|
393
|
-
|
|
404
|
+
morph-spec state add-agent {feature} {agent-id}
|
|
394
405
|
|
|
395
406
|
Output: .morph/project/outputs/{feature}/proposal.md
|
|
396
407
|
|
|
@@ -433,9 +444,11 @@ Ações:
|
|
|
433
444
|
- Use Read tool para ler screenshots
|
|
434
445
|
- Extrair padrões: layout, componentes, cores
|
|
435
446
|
|
|
436
|
-
3.
|
|
437
|
-
-
|
|
438
|
-
-
|
|
447
|
+
3. **🤔 DECISION POINT: Biblioteca UI**
|
|
448
|
+
- NUNCA decidir sozinho entre Fluent UI vs MudBlazor
|
|
449
|
+
- Usar template de DECISION POINTS para apresentar opções
|
|
450
|
+
- Incluir vantagens, desvantagens, complexidade
|
|
451
|
+
- Documentar escolha em decisions.md com ADR
|
|
439
452
|
|
|
440
453
|
4. Gerar deliverables:
|
|
441
454
|
- ui-mockups.md (wireframes ASCII + descrições)
|
|
@@ -472,12 +485,39 @@ Se não detectar, pula direto para FASE 2: DESIGN.
|
|
|
472
485
|
### FASE 2: DESIGN
|
|
473
486
|
```
|
|
474
487
|
Gatilho: Contexto confirmado (ou UI/UX aprovado se FASE 1.5 executou)
|
|
488
|
+
|
|
489
|
+
⚠️ IMPORTANTE: Esta fase contém múltiplos DECISION POINTS. NUNCA tome decisões
|
|
490
|
+
técnicas sozinho. Sempre apresente opções usando o template de DECISION POINTS.
|
|
491
|
+
|
|
475
492
|
Ações:
|
|
476
493
|
1. Gerar `spec.md` com requisitos completos
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
494
|
+
|
|
495
|
+
2. **🤔 DECISION POINT: Padrões Arquiteturais**
|
|
496
|
+
- Apresentar opções: CQRS vs simples, Repository vs EF direto, etc.
|
|
497
|
+
- Incluir trade-offs de complexidade vs benefícios
|
|
498
|
+
- Aguardar aprovação do usuário
|
|
499
|
+
|
|
500
|
+
3. **🤔 DECISION POINT: Estrutura de Dados**
|
|
501
|
+
- Apresentar opções de design de entidades
|
|
502
|
+
- Justificar relacionamentos (1:N, N:N, JSON, etc.)
|
|
503
|
+
- Aguardar aprovação do usuário
|
|
504
|
+
|
|
505
|
+
4. Gerar `contracts.cs` com interfaces/DTOs aprovados
|
|
506
|
+
|
|
507
|
+
5. **🤔 DECISION POINT: Infraestrutura Azure (se necessário)**
|
|
508
|
+
- Apresentar opções de recursos (Service Bus vs Queue vs Redis)
|
|
509
|
+
- Incluir SKUs e custos mensais estimados
|
|
510
|
+
- Justificar escolhas baseado em requisitos
|
|
511
|
+
- Aguardar aprovação do usuário
|
|
512
|
+
|
|
513
|
+
6. Estimar custos totais e validar contra limites
|
|
514
|
+
|
|
515
|
+
7. **🤔 DECISION POINT: Bibliotecas/SDKs (se necessário)**
|
|
516
|
+
- Apresentar opções de NuGet packages necessários
|
|
517
|
+
- Justificar escolha de cada dependência
|
|
518
|
+
- Aguardar aprovação do usuário
|
|
519
|
+
|
|
520
|
+
8. Documentar TODAS as decisões em `decisions.md` com ADRs
|
|
481
521
|
|
|
482
522
|
Outputs:
|
|
483
523
|
- .morph/project/outputs/{feature}/spec.md
|
|
@@ -530,17 +570,74 @@ Formato: Sempre as 3 ações acima (padrão para esta fase)
|
|
|
530
570
|
|
|
531
571
|
### FASE 5: IMPLEMENT
|
|
532
572
|
```
|
|
533
|
-
Gatilho: Tasks aprovadas
|
|
573
|
+
Gatilho: Tasks aprovadas (FASE 4 concluída)
|
|
574
|
+
|
|
534
575
|
Ações:
|
|
535
|
-
1. Implementar task por task
|
|
536
|
-
2.
|
|
537
|
-
|
|
538
|
-
|
|
576
|
+
1. Implementar task por task seguindo tasks em state.json
|
|
577
|
+
2. **SEMPRE chamar CLI após completar cada task:**
|
|
578
|
+
```bash
|
|
579
|
+
npx morph-spec task done {feature} {task-id}
|
|
580
|
+
```
|
|
581
|
+
3. Aguardar confirmação do CLI (validação de dependencies)
|
|
582
|
+
4. Framework atualiza state.json automaticamente:
|
|
583
|
+
- Marca task como completed
|
|
584
|
+
- Atualiza progress (percentage, counters)
|
|
585
|
+
- Detecta checkpoints automaticamente (a cada 3 tasks ou flag checkpoint)
|
|
586
|
+
- Mostra próxima task sugerida
|
|
587
|
+
5. Executar testes quando task requer
|
|
588
|
+
6. Gerar recap.md ao final de todas as tasks
|
|
589
|
+
|
|
590
|
+
**Workflow de implementação:**
|
|
591
|
+
|
|
592
|
+
# Claude implementa T001
|
|
593
|
+
Claude: "Vou criar a entidade ScheduledReport..."
|
|
594
|
+
[Gera Domain/Entities/ScheduledReport.cs]
|
|
595
|
+
[Gera Infrastructure/Persistence/Config/ScheduledReportConfig.cs]
|
|
596
|
+
|
|
597
|
+
# Claude chama CLI explicitamente
|
|
598
|
+
Claude executa:
|
|
599
|
+
npx morph-spec task done scheduled-reports T001
|
|
600
|
+
|
|
601
|
+
# CLI valida e atualiza state.json
|
|
602
|
+
CLI output:
|
|
603
|
+
✅ Task T001 completed!
|
|
604
|
+
📊 Progress: 11% (1/9)
|
|
605
|
+
[█████░░░░░░░░░░░░░░░░░░░░░░░░] 11%
|
|
606
|
+
⏭️ Next: T002 - Create CreateReportCommand + Handler
|
|
607
|
+
|
|
608
|
+
# Claude confirma ao usuário
|
|
609
|
+
Claude: "✅ T001 concluída!
|
|
610
|
+
Entidade ScheduledReport criada com EF Core mapping.
|
|
611
|
+
Progresso: 11% (1/9)
|
|
612
|
+
Próxima: T002 - Create CreateReportCommand + Handler"
|
|
613
|
+
|
|
614
|
+
# Após completar 3 tasks
|
|
615
|
+
npx morph-spec task done scheduled-reports T003
|
|
616
|
+
|
|
617
|
+
CLI output:
|
|
618
|
+
✅ Task T003 completed!
|
|
619
|
+
🎉 Auto-checkpoint reached! 3 tasks completed
|
|
620
|
+
📊 Progress: 33% (3/9)
|
|
621
|
+
⏭️ Next: T004 - Create ReportList component
|
|
622
|
+
|
|
623
|
+
**NUNCA:**
|
|
624
|
+
- ❌ Atualizar state.json manualmente
|
|
625
|
+
- ❌ Atualizar tasks.json (não existe mais em schema 3.0.0)
|
|
626
|
+
- ❌ Criar scripts PowerShell para atualizar tasks
|
|
627
|
+
- ❌ Pular tasks com dependencies não completadas
|
|
628
|
+
- ❌ Esquecer de chamar CLI após implementar task
|
|
629
|
+
|
|
630
|
+
**SEMPRE:**
|
|
631
|
+
- ✅ Chamar `npx morph-spec task done` após cada task
|
|
632
|
+
- ✅ Verificar output do CLI (validações, próxima task)
|
|
633
|
+
- ✅ Respeitar ordem de dependencies
|
|
634
|
+
- ✅ Deixar framework gerenciar checkpoints automaticamente
|
|
539
635
|
|
|
540
636
|
Outputs:
|
|
541
|
-
- Código implementado
|
|
542
|
-
- Testes criados
|
|
543
|
-
- .
|
|
637
|
+
- Código implementado (task por task)
|
|
638
|
+
- Testes criados (quando task requer)
|
|
639
|
+
- state.json atualizado automaticamente pelo CLI
|
|
640
|
+
- .morph/project/outputs/{feature}/recap.md (ao final)
|
|
544
641
|
```
|
|
545
642
|
|
|
546
643
|
### FASE 6: SYNC (condicional)
|
|
@@ -728,6 +825,7 @@ Toda pausa obrigatória DEVE terminar com **exatamente 3 itens** que ajudem o us
|
|
|
728
825
|
| ❓ | Pergunta Aberta | Para clarificar intenções | "Qual a prioridade: performance ou custo?" |
|
|
729
826
|
| 💡 | Sugestão Estratégica | Para propor alternativas | "Considerar serverless em vez de Container App?" |
|
|
730
827
|
| ⚡ | Ação Rápida | Atalho para comum | "Usar padrão CQRS nesta feature?" |
|
|
828
|
+
| 🤔 | Decisão Técnica | Apresentar opções para decisões críticas | "Service Bus vs Storage Queue: qual usar?" (Ver DECISION POINTS) |
|
|
731
829
|
|
|
732
830
|
### Estratégia por Fase
|
|
733
831
|
|
|
@@ -784,6 +882,251 @@ Complexidade estimada: **MÉDIA** | Stack: **.NET + Blazor** | Custo: **~$5/mês
|
|
|
784
882
|
|
|
785
883
|
---
|
|
786
884
|
|
|
885
|
+
## DECISION POINTS
|
|
886
|
+
|
|
887
|
+
### ⚠️ REGRA CRÍTICA: NUNCA DECIDA SOZINHO
|
|
888
|
+
|
|
889
|
+
Você DEVE pausar e consultar o usuário em tempo real quando encontrar decisões técnicas significativas.
|
|
890
|
+
|
|
891
|
+
**Decisões que SEMPRE requerem aprovação do usuário:**
|
|
892
|
+
|
|
893
|
+
#### 1. **Infraestrutura Azure**
|
|
894
|
+
- Escolha de recursos (Service Bus vs Storage Queue vs Redis vs Event Grid)
|
|
895
|
+
- SKUs e tiers (Basic vs Standard vs Premium)
|
|
896
|
+
- Regiões e replicação
|
|
897
|
+
- Recursos pagos vs free tier
|
|
898
|
+
|
|
899
|
+
**Exemplo de decisão automática (ERRADO):**
|
|
900
|
+
```
|
|
901
|
+
❌ "Vou usar Azure Service Bus Standard tier para mensageria."
|
|
902
|
+
```
|
|
903
|
+
|
|
904
|
+
**Exemplo correto:**
|
|
905
|
+
```
|
|
906
|
+
✅ "Para mensageria assíncrona, temos 3 opções:
|
|
907
|
+
1. Service Bus Standard ($10/mês): Suporta tópicos, sessões, até 1GB
|
|
908
|
+
2. Storage Queue ($0.05/mês): Apenas filas simples, até 500TB
|
|
909
|
+
3. Event Grid ($0.30/mi eventos): Pub/sub nativo, serverless
|
|
910
|
+
|
|
911
|
+
Recomendo Storage Queue se você precisa apenas de filas simples e baratas.
|
|
912
|
+
Qual prefere?"
|
|
913
|
+
```
|
|
914
|
+
|
|
915
|
+
#### 2. **Bibliotecas e Frameworks**
|
|
916
|
+
- NuGet packages (.NET libraries)
|
|
917
|
+
- UI libraries (Fluent UI vs MudBlazor vs Radzen)
|
|
918
|
+
- ORMs além do padrão
|
|
919
|
+
- Auth providers (Clerk vs Azure AD vs Auth0)
|
|
920
|
+
- SDKs de terceiros
|
|
921
|
+
|
|
922
|
+
**Exemplo de decisão automática (ERRADO):**
|
|
923
|
+
```
|
|
924
|
+
❌ "Vou usar MudBlazor para os componentes UI."
|
|
925
|
+
```
|
|
926
|
+
|
|
927
|
+
**Exemplo correto:**
|
|
928
|
+
```
|
|
929
|
+
✅ "Para componentes UI no Blazor, temos 2 opções principais:
|
|
930
|
+
1. Fluent UI Blazor: Design Microsoft 365, componentes AI-ready, mais moderno
|
|
931
|
+
2. MudBlazor: Material Design, mais componentes prontos, comunidade maior
|
|
932
|
+
|
|
933
|
+
Recomendo Fluent UI se você quer visual moderno e integração com IA.
|
|
934
|
+
Qual prefere?"
|
|
935
|
+
```
|
|
936
|
+
|
|
937
|
+
#### 3. **Padrões Arquiteturais**
|
|
938
|
+
- CQRS vs operações simples
|
|
939
|
+
- Repository Pattern vs EF direto no Service
|
|
940
|
+
- Mediator (MediatR) vs chamadas diretas
|
|
941
|
+
- Event Sourcing vs CRUD tradicional
|
|
942
|
+
- DDD patterns complexos
|
|
943
|
+
|
|
944
|
+
**Exemplo de decisão automática (ERRADO):**
|
|
945
|
+
```
|
|
946
|
+
❌ "Vou implementar CQRS para separar leitura e escrita."
|
|
947
|
+
```
|
|
948
|
+
|
|
949
|
+
**Exemplo correto:**
|
|
950
|
+
```
|
|
951
|
+
✅ "Para essa feature de relatórios, podemos usar:
|
|
952
|
+
1. CQRS: Separar comandos e queries, melhor performance em leitura
|
|
953
|
+
Complexidade: Média-Alta | Benefício: Escalabilidade
|
|
954
|
+
2. Repositórios simples: Um repositório por entidade
|
|
955
|
+
Complexidade: Baixa | Benefício: Mais rápido de implementar
|
|
956
|
+
|
|
957
|
+
Recomendo CQRS se você planeja escalar leituras independentemente.
|
|
958
|
+
Qual abordagem prefere?"
|
|
959
|
+
```
|
|
960
|
+
|
|
961
|
+
#### 4. **Estrutura de Dados**
|
|
962
|
+
- Design de entidades e relacionamentos
|
|
963
|
+
- Normalização vs denormalização
|
|
964
|
+
- Schemas de API (DTOs, contratos)
|
|
965
|
+
- Índices e otimizações de banco
|
|
966
|
+
|
|
967
|
+
**Exemplo de decisão automática (ERRADO):**
|
|
968
|
+
```
|
|
969
|
+
❌ "Vou criar uma entidade User com relacionamento N:N com Roles."
|
|
970
|
+
```
|
|
971
|
+
|
|
972
|
+
**Exemplo correto:**
|
|
973
|
+
```
|
|
974
|
+
✅ "Para relacionamento User-Roles, temos 2 opções:
|
|
975
|
+
1. N:N com tabela intermediária UserRoles
|
|
976
|
+
Pros: Flexível, pode adicionar metadados (data de atribuição)
|
|
977
|
+
Cons: Mais complexo, mais JOINs
|
|
978
|
+
2. JSON array em User.Roles
|
|
979
|
+
Pros: Mais simples, menos JOINs
|
|
980
|
+
Cons: Menos flexível, dificulta queries por role
|
|
981
|
+
|
|
982
|
+
Recomendo N:N se você precisa saber quando role foi atribuída.
|
|
983
|
+
Qual estrutura prefere?"
|
|
984
|
+
```
|
|
985
|
+
|
|
986
|
+
---
|
|
987
|
+
|
|
988
|
+
### Template de Decisão
|
|
989
|
+
|
|
990
|
+
Quando encontrar uma decisão técnica, SEMPRE use este formato:
|
|
991
|
+
|
|
992
|
+
```markdown
|
|
993
|
+
---
|
|
994
|
+
🤔 **DECISÃO TÉCNICA NECESSÁRIA**
|
|
995
|
+
|
|
996
|
+
**Contexto:** {Por que precisamos decidir isso agora}
|
|
997
|
+
|
|
998
|
+
**Opções disponíveis:**
|
|
999
|
+
|
|
1000
|
+
**Opção 1: {Nome}**
|
|
1001
|
+
- ✅ Vantagens: {lista concisa}
|
|
1002
|
+
- ❌ Desvantagens: {lista concisa}
|
|
1003
|
+
- 💰 Custo: {se Azure} ou N/A
|
|
1004
|
+
- ⚡ Complexidade: {baixa/média/alta}
|
|
1005
|
+
|
|
1006
|
+
**Opção 2: {Nome}**
|
|
1007
|
+
- ✅ Vantagens: {lista concisa}
|
|
1008
|
+
- ❌ Desvantagens: {lista concisa}
|
|
1009
|
+
- 💰 Custo: {se Azure} ou N/A
|
|
1010
|
+
- ⚡ Complexidade: {baixa/média/alta}
|
|
1011
|
+
|
|
1012
|
+
**Opção 3: {Nome}** (se houver)
|
|
1013
|
+
- ...
|
|
1014
|
+
|
|
1015
|
+
**💡 Minha recomendação:**
|
|
1016
|
+
{Opção X} porque {justificativa técnica baseada no contexto do projeto}
|
|
1017
|
+
|
|
1018
|
+
**Trade-offs principais:**
|
|
1019
|
+
- {Trade-off 1: ex: performance vs custo}
|
|
1020
|
+
- {Trade-off 2: ex: simplicidade vs escalabilidade}
|
|
1021
|
+
|
|
1022
|
+
**Qual opção você prefere?** Ou quer ajustar alguma delas?
|
|
1023
|
+
|
|
1024
|
+
---
|
|
1025
|
+
```
|
|
1026
|
+
|
|
1027
|
+
---
|
|
1028
|
+
|
|
1029
|
+
### Quando NÃO pausar (decisões triviais)
|
|
1030
|
+
|
|
1031
|
+
Decisões automáticas permitidas (não precisa consultar):
|
|
1032
|
+
- ✅ Nomenclatura de variáveis/métodos (seguir standards)
|
|
1033
|
+
- ✅ Estrutura de pastas (seguir Clean Architecture padrão do projeto)
|
|
1034
|
+
- ✅ Imports e usings
|
|
1035
|
+
- ✅ Formatação de código
|
|
1036
|
+
- ✅ Tipos primitivos (string vs int, etc.)
|
|
1037
|
+
- ✅ Validações básicas (Required, MaxLength, etc.)
|
|
1038
|
+
- ✅ Padrões já definidos em project/standards/
|
|
1039
|
+
|
|
1040
|
+
**Regra de ouro:** Se a decisão afeta **custo**, **arquitetura**, **dependências externas** ou **estrutura de dados**, SEMPRE consultar.
|
|
1041
|
+
|
|
1042
|
+
---
|
|
1043
|
+
|
|
1044
|
+
### Exemplo Real Completo
|
|
1045
|
+
|
|
1046
|
+
**Situação:** Usuário pediu "adicionar cache para melhorar performance"
|
|
1047
|
+
|
|
1048
|
+
**❌ ERRADO (decisão automática):**
|
|
1049
|
+
```
|
|
1050
|
+
Vou implementar cache usando Redis Premium tier.
|
|
1051
|
+
```
|
|
1052
|
+
|
|
1053
|
+
**✅ CORRETO (apresentar opções):**
|
|
1054
|
+
|
|
1055
|
+
```markdown
|
|
1056
|
+
---
|
|
1057
|
+
🤔 **DECISÃO TÉCNICA NECESSÁRIA**
|
|
1058
|
+
|
|
1059
|
+
**Contexto:** Você pediu cache para melhorar performance das queries de produtos. Precisamos decidir qual estratégia usar.
|
|
1060
|
+
|
|
1061
|
+
**Opções disponíveis:**
|
|
1062
|
+
|
|
1063
|
+
**Opção 1: In-Memory Cache (IMemoryCache .NET)**
|
|
1064
|
+
- ✅ Vantagens: Zero custo, simples, rápido para dados pequenos
|
|
1065
|
+
- ❌ Desvantagens: Limitado à memória do servidor, perdido em restart, não compartilhado entre instâncias
|
|
1066
|
+
- 💰 Custo: $0
|
|
1067
|
+
- ⚡ Complexidade: Baixa
|
|
1068
|
+
|
|
1069
|
+
**Opção 2: Redis (Azure Cache for Redis - Basic tier)**
|
|
1070
|
+
- ✅ Vantagens: Persistente, compartilhado, suporta estruturas complexas
|
|
1071
|
+
- ❌ Desvantagens: Custo adicional, latência de rede
|
|
1072
|
+
- 💰 Custo: ~$16/mês (Basic C0)
|
|
1073
|
+
- ⚡ Complexidade: Média
|
|
1074
|
+
|
|
1075
|
+
**Opção 3: Distributed Memory Cache (SQL Server)**
|
|
1076
|
+
- ✅ Vantagens: Usa SQL existente, sem custo adicional, compartilhado
|
|
1077
|
+
- ❌ Desvantagens: Mais lento que Redis, usa DB para cache
|
|
1078
|
+
- 💰 Custo: $0 (usa SQL existente)
|
|
1079
|
+
- ⚡ Complexidade: Baixa-Média
|
|
1080
|
+
|
|
1081
|
+
**💡 Minha recomendação:**
|
|
1082
|
+
Opção 1 (IMemoryCache) se você tem apenas 1 instância do app e dados de cache < 100MB.
|
|
1083
|
+
Opção 3 (SQL Distributed Cache) se você tem múltiplas instâncias mas quer evitar custo de Redis.
|
|
1084
|
+
|
|
1085
|
+
**Trade-offs principais:**
|
|
1086
|
+
- Performance vs Custo: Redis é mais rápido mas custa $16/mês
|
|
1087
|
+
- Simplicidade vs Escalabilidade: IMemoryCache é simples mas não escala para múltiplas instâncias
|
|
1088
|
+
|
|
1089
|
+
**Qual opção você prefere?** Ou quer ajustar alguma delas?
|
|
1090
|
+
---
|
|
1091
|
+
```
|
|
1092
|
+
|
|
1093
|
+
---
|
|
1094
|
+
|
|
1095
|
+
### Integração com Fases
|
|
1096
|
+
|
|
1097
|
+
**FASE 1.5 (UI/UX):**
|
|
1098
|
+
- ❓ Perguntar: Fluent UI vs MudBlazor vs outra biblioteca
|
|
1099
|
+
- ❓ Perguntar: Preferências de layout, cores, componentes
|
|
1100
|
+
|
|
1101
|
+
**FASE 2 (DESIGN):**
|
|
1102
|
+
- ❓ Perguntar: Padrões arquiteturais (CQRS, Repository, etc.)
|
|
1103
|
+
- ❓ Perguntar: Infraestrutura Azure (recursos, SKUs)
|
|
1104
|
+
- ❓ Perguntar: Bibliotecas e SDKs necessários
|
|
1105
|
+
- ❓ Perguntar: Estrutura de dados (entidades, relacionamentos)
|
|
1106
|
+
|
|
1107
|
+
**Durante IMPLEMENTAÇÃO:**
|
|
1108
|
+
- ❓ Pausar: Se encontrar decisão não prevista no design
|
|
1109
|
+
- ❓ Pausar: Se precisar adicionar dependência nova
|
|
1110
|
+
- ❓ Pausar: Se precisar mudar estrutura de dados aprovada
|
|
1111
|
+
|
|
1112
|
+
---
|
|
1113
|
+
|
|
1114
|
+
### Validação Automática (CLI)
|
|
1115
|
+
|
|
1116
|
+
Use o comando `morph-spec validate-decisions` para verificar se decisões foram documentadas:
|
|
1117
|
+
|
|
1118
|
+
```bash
|
|
1119
|
+
# Validar decisions.md de uma feature
|
|
1120
|
+
morph-spec validate-decisions {feature-name}
|
|
1121
|
+
|
|
1122
|
+
# O comando verifica:
|
|
1123
|
+
# - Decisões de infraestrutura têm ADRs?
|
|
1124
|
+
# - Bibliotecas escolhidas estão documentadas?
|
|
1125
|
+
# - Padrões arquiteturais estão justificados?
|
|
1126
|
+
```
|
|
1127
|
+
|
|
1128
|
+
---
|
|
1129
|
+
|
|
787
1130
|
## AGENTES
|
|
788
1131
|
|
|
789
1132
|
### Core Agents (Sempre Ativos)
|
|
@@ -867,13 +1210,16 @@ Os limites de custo são definidos em `.morph/config/config.json` e podem ser cu
|
|
|
867
1210
|
|
|
868
1211
|
```bash
|
|
869
1212
|
# Calcular custos de arquivos Bicep
|
|
870
|
-
|
|
1213
|
+
morph-spec cost infra/main.bicep --verbose
|
|
871
1214
|
|
|
872
1215
|
# Múltiplos arquivos (glob pattern)
|
|
873
|
-
|
|
1216
|
+
morph-spec cost "infra/**/*.bicep" --json
|
|
874
1217
|
|
|
875
1218
|
# Usar config customizado
|
|
876
|
-
|
|
1219
|
+
morph-spec cost infra/main.bicep --config .morph/config/config.json
|
|
1220
|
+
|
|
1221
|
+
# OU, se em desenvolvimento local do framework:
|
|
1222
|
+
# node bin/calculate-costs.js infra/main.bicep --verbose
|
|
877
1223
|
```
|
|
878
1224
|
|
|
879
1225
|
**Funcionalidades:**
|
|
@@ -921,7 +1267,7 @@ ln -s ../../.morph/hooks/pre-commit-costs.sh .git/hooks/pre-commit
|
|
|
921
1267
|
|------|------|-----|
|
|
922
1268
|
| **FASE 2 (Design)** | Estimar custos de infra proposta | `/morph-design` (integrado) |
|
|
923
1269
|
| **Antes de commit** | Validar custos automaticamente | Pre-commit hook |
|
|
924
|
-
| **Revisão manual** | Verificar custos de Bicep | `
|
|
1270
|
+
| **Revisão manual** | Verificar custos de Bicep | `morph-spec cost <bicep-files> --verbose` |
|
|
925
1271
|
|
|
926
1272
|
### Exemplo de ADR de Custo
|
|
927
1273
|
|
|
@@ -1062,35 +1408,38 @@ O MORPH-SPEC rastreia automaticamente o progresso de features usando `.morph/sta
|
|
|
1062
1408
|
|
|
1063
1409
|
### CLI para State Management
|
|
1064
1410
|
|
|
1065
|
-
Use `
|
|
1411
|
+
Use o comando `morph-spec state` para manipular o state:
|
|
1066
1412
|
|
|
1067
1413
|
```bash
|
|
1068
1414
|
# Inicializar state (primeira vez)
|
|
1069
|
-
|
|
1415
|
+
morph-spec state init
|
|
1070
1416
|
|
|
1071
1417
|
# Criar/atualizar feature
|
|
1072
|
-
|
|
1073
|
-
|
|
1418
|
+
morph-spec state set feature-name phase design
|
|
1419
|
+
morph-spec state set feature-name status in_progress
|
|
1074
1420
|
|
|
1075
1421
|
# Atualizar tasks
|
|
1076
|
-
|
|
1077
|
-
|
|
1422
|
+
morph-spec state set feature-name tasks.completed 5
|
|
1423
|
+
morph-spec state set feature-name tasks.total 12
|
|
1078
1424
|
|
|
1079
1425
|
# Adicionar agentes
|
|
1080
|
-
|
|
1426
|
+
morph-spec state add-agent feature-name blazor-builder
|
|
1081
1427
|
|
|
1082
1428
|
# Marcar outputs como criados
|
|
1083
|
-
|
|
1084
|
-
|
|
1429
|
+
morph-spec state mark-output feature-name spec
|
|
1430
|
+
morph-spec state mark-output feature-name contracts
|
|
1085
1431
|
|
|
1086
1432
|
# Registrar checkpoint
|
|
1087
|
-
|
|
1433
|
+
morph-spec state checkpoint feature-name "Completadas tasks T001-T003"
|
|
1088
1434
|
|
|
1089
1435
|
# Listar todas as features
|
|
1090
|
-
|
|
1436
|
+
morph-spec state list
|
|
1091
1437
|
|
|
1092
1438
|
# Obter detalhes de uma feature (JSON)
|
|
1093
|
-
|
|
1439
|
+
morph-spec state get feature-name
|
|
1440
|
+
|
|
1441
|
+
# OU, se em desenvolvimento local do framework:
|
|
1442
|
+
# node bin/state-manager.js <command>
|
|
1094
1443
|
```
|
|
1095
1444
|
|
|
1096
1445
|
### Quando Atualizar State
|