@polymorphism-tech/morph-spec 2.3.0 → 3.0.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.
Files changed (166) hide show
  1. package/CLAUDE.md +446 -1730
  2. package/README.md +515 -516
  3. package/bin/morph-spec.js +366 -294
  4. package/bin/task-manager.js +429 -368
  5. package/bin/validate.js +369 -268
  6. package/content/.claude/commands/morph-apply.md +221 -158
  7. package/content/.claude/commands/morph-deploy.md +529 -0
  8. package/content/.claude/commands/morph-preflight.md +227 -0
  9. package/content/.claude/commands/morph-proposal.md +122 -101
  10. package/content/.claude/commands/morph-status.md +86 -86
  11. package/content/.claude/commands/morph-troubleshoot.md +122 -0
  12. package/content/.claude/skills/infra/azure-deploy-specialist.md +699 -0
  13. package/content/.claude/skills/level-0-meta/README.md +7 -0
  14. package/content/.claude/skills/level-0-meta/code-review.md +226 -0
  15. package/content/.claude/skills/level-0-meta/morph-checklist.md +117 -0
  16. package/content/.claude/skills/level-0-meta/simulation-checklist.md +77 -0
  17. package/content/.claude/skills/level-1-workflows/README.md +7 -0
  18. package/content/.claude/skills/level-1-workflows/morph-replicate.md +213 -0
  19. package/content/.claude/{commands/morph-clarify.md → skills/level-1-workflows/phase-clarify.md} +131 -184
  20. package/content/.claude/{commands/morph-design.md → skills/level-1-workflows/phase-design.md} +213 -275
  21. package/content/.claude/skills/level-1-workflows/phase-setup.md +106 -0
  22. package/content/.claude/skills/level-1-workflows/phase-tasks.md +164 -0
  23. package/content/.claude/{commands/morph-uiux.md → skills/level-1-workflows/phase-uiux.md} +169 -211
  24. package/content/.claude/skills/level-2-domains/README.md +14 -0
  25. package/content/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +192 -0
  26. package/content/.claude/skills/{specialists → level-2-domains/architecture}/po-pm-advisor.md +197 -197
  27. package/content/.claude/skills/level-2-domains/architecture/standards-architect.md +156 -0
  28. package/content/.claude/skills/level-2-domains/backend/dotnet-senior.md +287 -0
  29. package/content/.claude/skills/level-2-domains/backend/ef-modeler.md +113 -0
  30. package/content/.claude/skills/level-2-domains/backend/hangfire-orchestrator.md +126 -0
  31. package/content/.claude/skills/level-2-domains/backend/ms-agent-expert.md +109 -0
  32. package/content/.claude/skills/level-2-domains/frontend/blazor-builder.md +210 -0
  33. package/content/.claude/skills/level-2-domains/frontend/nextjs-expert.md +154 -0
  34. package/content/.claude/skills/level-2-domains/frontend/ui-ux-designer.md +191 -0
  35. package/content/.claude/skills/{specialists → level-2-domains/infrastructure}/azure-architect.md +142 -142
  36. package/content/.claude/skills/level-2-domains/infrastructure/bicep-architect.md +126 -0
  37. package/content/.claude/skills/level-2-domains/infrastructure/container-specialist.md +131 -0
  38. package/content/.claude/skills/level-2-domains/infrastructure/devops-engineer.md +119 -0
  39. package/content/.claude/skills/level-2-domains/integrations/asaas-financial.md +130 -0
  40. package/content/.claude/skills/level-2-domains/integrations/azure-identity.md +142 -0
  41. package/content/.claude/skills/level-2-domains/integrations/clerk-auth.md +108 -0
  42. package/content/.claude/skills/level-2-domains/integrations/resend-email.md +119 -0
  43. package/content/.claude/skills/level-2-domains/quality/code-analyzer.md +235 -0
  44. package/content/.claude/skills/level-2-domains/quality/testing-specialist.md +126 -0
  45. package/content/.claude/skills/level-3-technologies/README.md +7 -0
  46. package/content/.claude/skills/level-4-patterns/README.md +7 -0
  47. package/content/.claude/skills/specialists/prompt-engineer.md +189 -0
  48. package/content/.claude/skills/specialists/seo-growth-hacker.md +320 -0
  49. package/content/.morph/config/agents.json +762 -242
  50. package/content/.morph/config/config.template.json +122 -108
  51. package/content/.morph/docs/workflows/design-impl.md +37 -0
  52. package/content/.morph/docs/workflows/enforcement-pipeline.md +668 -0
  53. package/content/.morph/docs/workflows/fast-track.md +29 -0
  54. package/content/.morph/docs/workflows/full-morph.md +76 -0
  55. package/content/.morph/docs/workflows/standard.md +44 -0
  56. package/content/.morph/docs/workflows/ui-refresh.md +39 -0
  57. package/content/.morph/examples/scheduled-reports/decisions.md +158 -0
  58. package/content/.morph/examples/scheduled-reports/proposal.md +95 -0
  59. package/content/.morph/examples/scheduled-reports/spec.md +267 -0
  60. package/content/.morph/hooks/README.md +348 -239
  61. package/content/.morph/hooks/pre-commit-agents.sh +24 -24
  62. package/content/.morph/hooks/task-completed.js +73 -0
  63. package/content/.morph/hooks/teammate-idle.js +68 -0
  64. package/content/.morph/schemas/tasks.schema.json +220 -0
  65. package/content/.morph/standards/agent-framework-blazor-ui.md +359 -0
  66. package/content/.morph/standards/agent-framework-production.md +410 -0
  67. package/content/.morph/standards/agent-framework-setup.md +413 -453
  68. package/content/.morph/standards/agent-framework-workflows.md +349 -0
  69. package/content/.morph/standards/agent-teams-workflow.md +474 -0
  70. package/content/.morph/standards/architecture.md +325 -325
  71. package/content/.morph/standards/azure.md +605 -379
  72. package/content/.morph/standards/dotnet10-migration.md +520 -494
  73. package/content/.morph/templates/CONTEXT-FEATURE.md +276 -0
  74. package/content/.morph/templates/CONTEXT.md +170 -0
  75. package/content/.morph/templates/agent.cs +163 -172
  76. package/content/.morph/templates/clarify-questions.md +159 -0
  77. package/content/.morph/templates/contracts/Commands.cs +74 -0
  78. package/content/.morph/templates/contracts/Entities.cs +25 -0
  79. package/content/.morph/templates/contracts/Queries.cs +74 -0
  80. package/content/.morph/templates/contracts/README.md +74 -0
  81. package/content/.morph/templates/decisions.md +123 -106
  82. package/content/.morph/templates/infra/azure-pipelines-deploy.yml +480 -0
  83. package/content/.morph/templates/infra/deploy-checklist.md +426 -0
  84. package/content/.morph/templates/proposal.md +141 -155
  85. package/content/.morph/templates/recap.md +94 -105
  86. package/content/.morph/templates/simulation.md +353 -0
  87. package/content/.morph/templates/spec.md +149 -148
  88. package/content/.morph/templates/state.template.json +222 -222
  89. package/content/.morph/templates/tasks.md +257 -235
  90. package/content/.morph/templates/ui-components.md +362 -276
  91. package/content/CLAUDE.md +150 -442
  92. package/detectors/structure-detector.js +245 -250
  93. package/docs/README.md +144 -149
  94. package/docs/getting-started.md +301 -302
  95. package/docs/installation.md +361 -361
  96. package/docs/validation-checklist.md +265 -266
  97. package/package.json +80 -80
  98. package/src/commands/advance-phase.js +266 -0
  99. package/src/commands/analyze-blazor-concurrency.js +193 -0
  100. package/src/commands/deploy.js +780 -0
  101. package/src/commands/detect-agents.js +167 -0
  102. package/src/commands/doctor.js +356 -280
  103. package/src/commands/generate-context.js +40 -0
  104. package/src/commands/init.js +258 -245
  105. package/src/commands/lint-fluent.js +352 -0
  106. package/src/commands/rollback-phase.js +185 -0
  107. package/src/commands/session-summary.js +291 -0
  108. package/src/commands/task.js +78 -75
  109. package/src/commands/troubleshoot.js +222 -0
  110. package/src/commands/update.js +192 -159
  111. package/src/commands/validate-blazor-state.js +210 -0
  112. package/src/commands/validate-blazor.js +156 -0
  113. package/src/commands/validate-css.js +84 -0
  114. package/src/commands/validate-phase.js +221 -0
  115. package/src/lib/blazor-concurrency-analyzer.js +288 -0
  116. package/src/lib/blazor-state-validator.js +291 -0
  117. package/src/lib/blazor-validator.js +374 -0
  118. package/src/lib/complexity-analyzer.js +441 -292
  119. package/src/lib/context-generator.js +513 -0
  120. package/src/lib/continuous-validator.js +421 -440
  121. package/src/lib/css-validator.js +352 -0
  122. package/src/lib/decision-constraint-loader.js +109 -0
  123. package/src/lib/design-system-detector.js +187 -0
  124. package/src/lib/design-system-scaffolder.js +299 -0
  125. package/src/lib/hook-executor.js +256 -0
  126. package/src/lib/recap-generator.js +205 -0
  127. package/src/lib/spec-validator.js +258 -0
  128. package/src/lib/standards-context-injector.js +287 -0
  129. package/src/lib/state-manager.js +397 -340
  130. package/src/lib/team-orchestrator.js +322 -0
  131. package/src/lib/troubleshoot-grep.js +194 -0
  132. package/src/lib/troubleshoot-index.js +144 -0
  133. package/src/lib/validation-runner.js +283 -0
  134. package/src/lib/validators/contract-compliance-validator.js +273 -0
  135. package/src/lib/validators/design-system-validator.js +231 -0
  136. package/src/utils/file-copier.js +187 -139
  137. package/content/.claude/commands/morph-costs.md +0 -206
  138. package/content/.claude/commands/morph-setup.md +0 -100
  139. package/content/.claude/commands/morph-tasks.md +0 -319
  140. package/content/.claude/skills/infra/bicep-architect.md +0 -419
  141. package/content/.claude/skills/infra/container-specialist.md +0 -437
  142. package/content/.claude/skills/infra/devops-engineer.md +0 -405
  143. package/content/.claude/skills/integrations/asaas-financial.md +0 -333
  144. package/content/.claude/skills/integrations/azure-identity.md +0 -309
  145. package/content/.claude/skills/integrations/clerk-auth.md +0 -290
  146. package/content/.claude/skills/specialists/ai-system-architect.md +0 -604
  147. package/content/.claude/skills/specialists/cost-guardian.md +0 -110
  148. package/content/.claude/skills/specialists/ef-modeler.md +0 -211
  149. package/content/.claude/skills/specialists/hangfire-orchestrator.md +0 -255
  150. package/content/.claude/skills/specialists/ms-agent-expert.md +0 -263
  151. package/content/.claude/skills/specialists/standards-architect.md +0 -78
  152. package/content/.claude/skills/specialists/ui-ux-designer.md +0 -1100
  153. package/content/.claude/skills/stacks/dotnet-blazor.md +0 -606
  154. package/content/.claude/skills/stacks/dotnet-nextjs.md +0 -402
  155. package/content/.claude/skills/stacks/shopify.md +0 -445
  156. package/content/.morph/config/azure-pricing.json +0 -70
  157. package/content/.morph/config/azure-pricing.schema.json +0 -50
  158. package/content/.morph/hooks/pre-commit-costs.sh +0 -91
  159. package/docs/api/cost-calculator.js.html +0 -513
  160. package/docs/api/design-system-generator.js.html +0 -382
  161. package/docs/api/global.html +0 -5263
  162. package/docs/api/index.html +0 -96
  163. package/docs/api/state-manager.js.html +0 -423
  164. package/src/commands/cost.js +0 -181
  165. package/src/commands/update-pricing.js +0 -206
  166. package/src/lib/cost-calculator.js +0 -429
@@ -1,325 +1,325 @@
1
- # Padrões de Arquitetura - MORPH Framework
2
-
3
- ## 🏗️ Clean Architecture Simplificada
4
-
5
- ```
6
- ┌────────────────────────────────────────────────┐
7
- │ Web │
8
- │ (Blazor Server, Controllers) │
9
- ├────────────────────────────────────────────────┤
10
- │ Application │
11
- │ (Services, Commands, Queries, DTOs) │
12
- ├────────────────────────────────────────────────┤
13
- │ Domain │
14
- │ (Entities, Value Objects, Enums) │
15
- ├────────────────────────────────────────────────┤
16
- │ Infrastructure │
17
- │ (EF Core, External Services, Repositories) │
18
- ├────────────────────────────────────────────────┤
19
- │ Agents │
20
- │ (MS Agent Framework, AI Services) │
21
- └────────────────────────────────────────────────┘
22
- ```
23
-
24
- ### Regras de Dependência
25
- - Web → Application, Infrastructure, Agents
26
- - Application → Domain
27
- - Infrastructure → Domain, Application (interfaces)
28
- - Agents → Domain, Application (interfaces)
29
- - Domain → Nada (núcleo isolado)
30
-
31
- ---
32
-
33
- ## 📁 Organização por Feature
34
-
35
- ```
36
- Application/
37
- ├── Features/
38
- │ ├── Reports/
39
- │ │ ├── Commands/
40
- │ │ │ └── CreateReportSchedule/
41
- │ │ ├── Queries/
42
- │ │ │ └── GetReportSchedule/
43
- │ │ ├── Services/
44
- │ │ │ ├── IReportScheduleService.cs
45
- │ │ │ └── ReportScheduleService.cs
46
- │ │ └── DTOs/
47
- │ │ └── ReportScheduleDto.cs
48
- │ │
49
- │ └── Users/
50
- │ ├── Commands/
51
- │ ├── Queries/
52
- │ └── Services/
53
-
54
- └── Common/
55
- ├── Interfaces/
56
- └── Exceptions/
57
- ```
58
-
59
- ---
60
-
61
- ## 🔄 CQRS Simplificado (Sem MediatR)
62
-
63
- ```csharp
64
- // Application/Features/Reports/Services/IReportScheduleService.cs
65
- public interface IReportScheduleService
66
- {
67
- // Queries
68
- Task<ReportScheduleDto?> GetByIdAsync(int id);
69
- Task<List<ReportScheduleDto>> GetAllAsync();
70
-
71
- // Commands
72
- Task<ReportScheduleDto> CreateAsync(CreateReportScheduleRequest request);
73
- Task UpdateAsync(int id, UpdateReportScheduleRequest request);
74
- Task DeleteAsync(int id);
75
- }
76
- ```
77
-
78
- ---
79
-
80
- ## 🔐 Segurança
81
-
82
- ### Authorization - Policy-Based
83
- ```csharp
84
- // Program.cs
85
- builder.Services.AddAuthorization(options =>
86
- {
87
- options.AddPolicy("CanManageReports", policy =>
88
- policy.RequireRole("Admin", "ReportManager"));
89
- });
90
-
91
- // No componente Blazor
92
- @attribute [Authorize(Policy = "CanManageReports")]
93
- ```
94
-
95
- ### Current User Service
96
- ```csharp
97
- public interface ICurrentUserService
98
- {
99
- string? UserId { get; }
100
- string? UserName { get; }
101
- bool IsAuthenticated { get; }
102
- }
103
- ```
104
-
105
- ---
106
-
107
- ## ⚠️ Exception Handling
108
-
109
- ### Hierarquia
110
- ```csharp
111
- public abstract class DomainException : Exception
112
- {
113
- protected DomainException(string message) : base(message) { }
114
- }
115
-
116
- public class NotFoundException : DomainException
117
- {
118
- public NotFoundException(string entityName, object key)
119
- : base($"Entity \"{entityName}\" ({key}) was not found.") { }
120
- }
121
-
122
- public class ValidationException : DomainException
123
- {
124
- public IDictionary<string, string[]> Errors { get; }
125
- }
126
-
127
- // Feature-specific
128
- public class ReportScheduleNotFoundException : NotFoundException
129
- {
130
- public ReportScheduleNotFoundException(int id)
131
- : base("ReportSchedule", id) { }
132
- }
133
- ```
134
-
135
- ---
136
-
137
- ## 🔌 HTTP Clients com Polly
138
-
139
- ```csharp
140
- services.AddHttpClient<IMemberKitClient, MemberKitClient>(client =>
141
- {
142
- client.BaseAddress = new Uri(configuration["MemberKit:BaseUrl"]!);
143
- })
144
- .AddTransientHttpErrorPolicy(p =>
145
- p.WaitAndRetryAsync(3, _ => TimeSpan.FromSeconds(2)));
146
- ```
147
-
148
- ---
149
-
150
- ## 🤖 Agents como Services (.NET 10)
151
-
152
- > **IMPORTANTE:** Use exclusivamente Microsoft Agent Framework.
153
-
154
- ```csharp
155
- // Agents/DependencyInjection.cs
156
- using Microsoft.Extensions.AI;
157
-
158
- public static IServiceCollection AddAgents(this IServiceCollection services, IConfiguration configuration)
159
- {
160
- // Registrar ChatClient
161
- services.AddSingleton<IChatClient>(sp =>
162
- {
163
- var config = sp.GetRequiredService<IConfiguration>();
164
-
165
- return new ChatClient(
166
- model: "gpt-4o-mini",
167
- credential: new ApiKeyCredential(config["AzureOpenAI:ApiKey"]!),
168
- endpoint: new Uri(config["AzureOpenAI:Endpoint"]!)
169
- );
170
- });
171
-
172
- // Registrar agents como services
173
- services.AddScoped<IReportAnalyzerAgent, ReportAnalyzerAgent>();
174
-
175
- return services;
176
- }
177
-
178
- // Uso transparente nos services
179
- public class ReportGeneratorJob(IReportAnalyzerAgent analyzer)
180
- {
181
- public async Task ExecuteAsync(int scheduleId, CancellationToken ct)
182
- {
183
- var analysis = await analyzer.AnalyzeAsync(data, ct);
184
- }
185
- }
186
-
187
- // Implementação do agent
188
- public class ReportAnalyzerAgent : IReportAnalyzerAgent
189
- {
190
- private readonly IChatClient _chatClient;
191
-
192
- public ReportAnalyzerAgent(IChatClient chatClient)
193
- {
194
- _chatClient = chatClient;
195
- }
196
-
197
- public async Task<string> AnalyzeAsync(object data, CancellationToken ct)
198
- {
199
- var agent = _chatClient.CreateAgent(
200
- instructions: "Você é um especialista em análise de relatórios...",
201
- name: "ReportAnalyzer"
202
- );
203
-
204
- var response = await agent.RunAsync($"Analise: {data}", cancellationToken: ct);
205
- return response.Content;
206
- }
207
- }
208
- ```
209
-
210
- **Referência completa:** [Agent Framework Setup](./agent-framework-setup.md)
211
-
212
- ---
213
-
214
- ## 🎨 UI Component Libraries
215
-
216
- ### Decisão Arquitetural (ADR)
217
-
218
- **Contexto:**
219
- Projetos Blazor no MORPH-SPEC precisam de componentes UI consistentes, especialmente para features AI-first.
220
-
221
- **Decisão:**
222
- - **Padrão recomendado:** Fluent UI Blazor para projetos AI-first
223
- - **Alternativa:** MudBlazor para SaaS tradicional
224
- - **Híbrido:** Permitido quando justificado
225
-
226
- **Razões:**
227
-
228
- | Critério | Fluent UI | MudBlazor |
229
- |----------|-----------|-----------|
230
- | **AI Components** | ✅ Nativos (chat, streaming) | ❌ Não tem |
231
- | **Microsoft Integration** | ✅ Agent Framework, Aspire | ❌ Terceiro |
232
- | **Performance** | ✅ ~200KB | ⚠️ ~500KB |
233
- | **Componentes** | ⚠️ ~50 | ✅ ~140 |
234
- | **Future-proof** | ✅ Microsoft mantém | ❓ Comunidade |
235
-
236
- **Consequências:**
237
- - ✅ Melhor integração com stack Microsoft (.NET 10, Agent Framework)
238
- - ✅ Performance otimizada (menor bundle)
239
- - ✅ UX consistente com produtos Microsoft (Copilot, Teams)
240
- - ⚠️ Pode precisar MudBlazor para grids/charts complexos
241
- - ⚠️ Menos templates prontos que MudBlazor
242
-
243
- ### Matriz de Decisão
244
-
245
- | Tipo de Projeto | UI Library Recomendada |
246
- |-----------------|------------------------|
247
- | SaaS com AI/chat | **Fluent UI** |
248
- | SaaS com analytics pesados | **Fluent UI + MudBlazor** |
249
- | Dashboard tradicional | **MudBlazor** |
250
- | Admin panel simples | **Fluent UI** |
251
- | Produto enterprise complexo | **Fluent UI + MudBlazor** |
252
-
253
- ### Pattern de Uso Híbrido
254
-
255
- ```csharp
256
- // Program.cs - Registrar ambas libs
257
- builder.Services.AddFluentUIComponents();
258
- builder.Services.AddMudServices(); // Só se necessário
259
- ```
260
-
261
- ```razor
262
- <!-- Usar Fluent UI para estrutura principal -->
263
- <FluentLayout>
264
- <FluentHeader>
265
- <FluentToolbar>...</FluentToolbar>
266
- </FluentHeader>
267
-
268
- <FluentNavMenu>
269
- <FluentNavLink>...</FluentNavLink>
270
- </FluentNavMenu>
271
-
272
- <FluentMain>
273
- <!-- Usar MudBlazor para componentes específicos -->
274
- <MudDataGrid T="Order" ...>
275
- <!-- Grid complexo -->
276
- </MudDataGrid>
277
-
278
- <MudChart>
279
- <!-- Charts analytics -->
280
- </MudChart>
281
-
282
- <!-- Voltar para Fluent UI para AI -->
283
- <FluentMessageBar>
284
- AI response
285
- </FluentMessageBar>
286
- </FluentMain>
287
- </FluentLayout>
288
- ```
289
-
290
- ### Checklist de Escolha
291
-
292
- **Use Fluent UI quando:**
293
- - [ ] Projeto tem features de AI/chat
294
- - [ ] Integração com Agent Framework
295
- - [ ] Performance é prioridade
296
- - [ ] UX tipo Copilot/Microsoft 365
297
- - [ ] Budget de bundle size limitado
298
-
299
- **Adicione MudBlazor quando:**
300
- - [ ] Precisa de DataGrid avançado (filtros, agrupamento, export)
301
- - [ ] Dashboards com charts customizados
302
- - [ ] Componentes que Fluent UI não oferece
303
- - [ ] Time já conhece MudBlazor
304
-
305
- **Use MudBlazor 100% quando:**
306
- - [ ] Projeto não tem AI
307
- - [ ] Já existe codebase MudBlazor
308
- - [ ] Precisa de 100+ componentes diferentes
309
- - [ ] Material Design é requisito
310
-
311
- **Referência completa:** [Fluent UI Setup](./fluent-ui-setup.md)
312
-
313
- ---
314
-
315
- ## ✅ Checklist de Arquitetura
316
-
317
- - [ ] Domain sem dependências externas
318
- - [ ] Features organizadas por pasta
319
- - [ ] Interfaces em Application, implementações em Infrastructure
320
- - [ ] DTOs para comunicação entre camadas
321
- - [ ] Exceptions customizadas para domínio
322
- - [ ] DI via construtor (não Service Locator)
323
- - [ ] Agents tratados como services
324
- - [ ] Authorization via policies
325
- - [ ] HTTP Clients tipados com retry
1
+ # Padrões de Arquitetura - MORPH Framework
2
+
3
+ ## 🏗️ Clean Architecture Simplificada
4
+
5
+ ```
6
+ ┌────────────────────────────────────────────────┐
7
+ │ Web │
8
+ │ (Blazor Server, Controllers) │
9
+ ├────────────────────────────────────────────────┤
10
+ │ Application │
11
+ │ (Services, Commands, Queries, DTOs) │
12
+ ├────────────────────────────────────────────────┤
13
+ │ Domain │
14
+ │ (Entities, Value Objects, Enums) │
15
+ ├────────────────────────────────────────────────┤
16
+ │ Infrastructure │
17
+ │ (EF Core, External Services, Repositories) │
18
+ ├────────────────────────────────────────────────┤
19
+ │ Agents │
20
+ │ (MS Agent Framework, AI Services) │
21
+ └────────────────────────────────────────────────┘
22
+ ```
23
+
24
+ ### Regras de Dependência
25
+ - Web → Application, Infrastructure, Agents
26
+ - Application → Domain
27
+ - Infrastructure → Domain, Application (interfaces)
28
+ - Agents → Domain, Application (interfaces)
29
+ - Domain → Nada (núcleo isolado)
30
+
31
+ ---
32
+
33
+ ## 📁 Organização por Feature
34
+
35
+ ```
36
+ Application/
37
+ ├── Features/
38
+ │ ├── Reports/
39
+ │ │ ├── Commands/
40
+ │ │ │ └── CreateReportSchedule/
41
+ │ │ ├── Queries/
42
+ │ │ │ └── GetReportSchedule/
43
+ │ │ ├── Services/
44
+ │ │ │ ├── IReportScheduleService.cs
45
+ │ │ │ └── ReportScheduleService.cs
46
+ │ │ └── DTOs/
47
+ │ │ └── ReportScheduleDto.cs
48
+ │ │
49
+ │ └── Users/
50
+ │ ├── Commands/
51
+ │ ├── Queries/
52
+ │ └── Services/
53
+
54
+ └── Common/
55
+ ├── Interfaces/
56
+ └── Exceptions/
57
+ ```
58
+
59
+ ---
60
+
61
+ ## 🔄 CQRS Simplificado (Sem MediatR)
62
+
63
+ ```csharp
64
+ // Application/Features/Reports/Services/IReportScheduleService.cs
65
+ public interface IReportScheduleService
66
+ {
67
+ // Queries
68
+ Task<ReportScheduleDto?> GetByIdAsync(int id);
69
+ Task<List<ReportScheduleDto>> GetAllAsync();
70
+
71
+ // Commands
72
+ Task<ReportScheduleDto> CreateAsync(CreateReportScheduleRequest request);
73
+ Task UpdateAsync(int id, UpdateReportScheduleRequest request);
74
+ Task DeleteAsync(int id);
75
+ }
76
+ ```
77
+
78
+ ---
79
+
80
+ ## 🔐 Segurança
81
+
82
+ ### Authorization - Policy-Based
83
+ ```csharp
84
+ // Program.cs
85
+ builder.Services.AddAuthorization(options =>
86
+ {
87
+ options.AddPolicy("CanManageReports", policy =>
88
+ policy.RequireRole("Admin", "ReportManager"));
89
+ });
90
+
91
+ // No componente Blazor
92
+ @attribute [Authorize(Policy = "CanManageReports")]
93
+ ```
94
+
95
+ ### Current User Service
96
+ ```csharp
97
+ public interface ICurrentUserService
98
+ {
99
+ string? UserId { get; }
100
+ string? UserName { get; }
101
+ bool IsAuthenticated { get; }
102
+ }
103
+ ```
104
+
105
+ ---
106
+
107
+ ## ⚠️ Exception Handling
108
+
109
+ ### Hierarquia
110
+ ```csharp
111
+ public abstract class DomainException : Exception
112
+ {
113
+ protected DomainException(string message) : base(message) { }
114
+ }
115
+
116
+ public class NotFoundException : DomainException
117
+ {
118
+ public NotFoundException(string entityName, object key)
119
+ : base($"Entity \"{entityName}\" ({key}) was not found.") { }
120
+ }
121
+
122
+ public class ValidationException : DomainException
123
+ {
124
+ public IDictionary<string, string[]> Errors { get; }
125
+ }
126
+
127
+ // Feature-specific
128
+ public class ReportScheduleNotFoundException : NotFoundException
129
+ {
130
+ public ReportScheduleNotFoundException(int id)
131
+ : base("ReportSchedule", id) { }
132
+ }
133
+ ```
134
+
135
+ ---
136
+
137
+ ## 🔌 HTTP Clients com Polly
138
+
139
+ ```csharp
140
+ services.AddHttpClient<IMemberKitClient, MemberKitClient>(client =>
141
+ {
142
+ client.BaseAddress = new Uri(configuration["MemberKit:BaseUrl"]!);
143
+ })
144
+ .AddTransientHttpErrorPolicy(p =>
145
+ p.WaitAndRetryAsync(3, _ => TimeSpan.FromSeconds(2)));
146
+ ```
147
+
148
+ ---
149
+
150
+ ## 🤖 Agents como Services (.NET 10)
151
+
152
+ > **IMPORTANTE:** Use exclusivamente Microsoft Agent Framework.
153
+
154
+ ```csharp
155
+ // Agents/DependencyInjection.cs
156
+ using Microsoft.Extensions.AI;
157
+
158
+ public static IServiceCollection AddAgents(this IServiceCollection services, IConfiguration configuration)
159
+ {
160
+ // Registrar ChatClient
161
+ services.AddSingleton<IChatClient>(sp =>
162
+ {
163
+ var config = sp.GetRequiredService<IConfiguration>();
164
+
165
+ return new ChatClient(
166
+ model: "gpt-4o-mini",
167
+ credential: new ApiKeyCredential(config["AzureOpenAI:ApiKey"]!),
168
+ endpoint: new Uri(config["AzureOpenAI:Endpoint"]!)
169
+ );
170
+ });
171
+
172
+ // Registrar agents como services
173
+ services.AddScoped<IReportAnalyzerAgent, ReportAnalyzerAgent>();
174
+
175
+ return services;
176
+ }
177
+
178
+ // Uso transparente nos services
179
+ public class ReportGeneratorJob(IReportAnalyzerAgent analyzer)
180
+ {
181
+ public async Task ExecuteAsync(int scheduleId, CancellationToken ct)
182
+ {
183
+ var analysis = await analyzer.AnalyzeAsync(data, ct);
184
+ }
185
+ }
186
+
187
+ // Implementação do agent
188
+ public class ReportAnalyzerAgent : IReportAnalyzerAgent
189
+ {
190
+ private readonly IChatClient _chatClient;
191
+
192
+ public ReportAnalyzerAgent(IChatClient chatClient)
193
+ {
194
+ _chatClient = chatClient;
195
+ }
196
+
197
+ public async Task<string> AnalyzeAsync(object data, CancellationToken ct)
198
+ {
199
+ var agent = _chatClient.CreateAgent(
200
+ instructions: "Você é um especialista em análise de relatórios...",
201
+ name: "ReportAnalyzer"
202
+ );
203
+
204
+ var response = await agent.RunAsync($"Analise: {data}", cancellationToken: ct);
205
+ return response.Content;
206
+ }
207
+ }
208
+ ```
209
+
210
+ **Referência completa:** [Agent Framework Setup](./agent-framework-setup.md)
211
+
212
+ ---
213
+
214
+ ## 🎨 UI Component Libraries
215
+
216
+ ### Decisão Arquitetural (ADR)
217
+
218
+ **Contexto:**
219
+ Projetos Blazor no MORPH-SPEC precisam de componentes UI consistentes, especialmente para features AI-first.
220
+
221
+ **Decisão:**
222
+ - **Padrão recomendado:** Fluent UI Blazor para projetos AI-first
223
+ - **Alternativa:** MudBlazor para SaaS tradicional
224
+ - **Híbrido:** Permitido quando justificado
225
+
226
+ **Razões:**
227
+
228
+ | Critério | Fluent UI | MudBlazor |
229
+ |----------|-----------|-----------|
230
+ | **AI Components** | ✅ Nativos (chat, streaming) | ❌ Não tem |
231
+ | **Microsoft Integration** | ✅ Agent Framework, Aspire | ❌ Terceiro |
232
+ | **Performance** | ✅ ~200KB | ⚠️ ~500KB |
233
+ | **Componentes** | ⚠️ ~50 | ✅ ~140 |
234
+ | **Future-proof** | ✅ Microsoft mantém | ❓ Comunidade |
235
+
236
+ **Consequências:**
237
+ - ✅ Melhor integração com stack Microsoft (.NET 10, Agent Framework)
238
+ - ✅ Performance otimizada (menor bundle)
239
+ - ✅ UX consistente com produtos Microsoft (Copilot, Teams)
240
+ - ⚠️ Pode precisar MudBlazor para grids/charts complexos
241
+ - ⚠️ Menos templates prontos que MudBlazor
242
+
243
+ ### Matriz de Decisão
244
+
245
+ | Tipo de Projeto | UI Library Recomendada |
246
+ |-----------------|------------------------|
247
+ | SaaS com AI/chat | **Fluent UI** |
248
+ | SaaS com analytics pesados | **Fluent UI + MudBlazor** |
249
+ | Dashboard tradicional | **MudBlazor** |
250
+ | Admin panel simples | **Fluent UI** |
251
+ | Produto enterprise complexo | **Fluent UI + MudBlazor** |
252
+
253
+ ### Pattern de Uso Híbrido
254
+
255
+ ```csharp
256
+ // Program.cs - Registrar ambas libs
257
+ builder.Services.AddFluentUIComponents();
258
+ builder.Services.AddMudServices(); // Só se necessário
259
+ ```
260
+
261
+ ```razor
262
+ <!-- Usar Fluent UI para estrutura principal -->
263
+ <FluentLayout>
264
+ <FluentHeader>
265
+ <FluentToolbar>...</FluentToolbar>
266
+ </FluentHeader>
267
+
268
+ <FluentNavMenu>
269
+ <FluentNavLink>...</FluentNavLink>
270
+ </FluentNavMenu>
271
+
272
+ <FluentMain>
273
+ <!-- Usar MudBlazor para componentes específicos -->
274
+ <MudDataGrid T="Order" ...>
275
+ <!-- Grid complexo -->
276
+ </MudDataGrid>
277
+
278
+ <MudChart>
279
+ <!-- Charts analytics -->
280
+ </MudChart>
281
+
282
+ <!-- Voltar para Fluent UI para AI -->
283
+ <FluentMessageBar>
284
+ AI response
285
+ </FluentMessageBar>
286
+ </FluentMain>
287
+ </FluentLayout>
288
+ ```
289
+
290
+ ### Checklist de Escolha
291
+
292
+ **Use Fluent UI quando:**
293
+ - [ ] Projeto tem features de AI/chat
294
+ - [ ] Integração com Agent Framework
295
+ - [ ] Performance é prioridade
296
+ - [ ] UX tipo Copilot/Microsoft 365
297
+ - [ ] Budget de bundle size limitado
298
+
299
+ **Adicione MudBlazor quando:**
300
+ - [ ] Precisa de DataGrid avançado (filtros, agrupamento, export)
301
+ - [ ] Dashboards com charts customizados
302
+ - [ ] Componentes que Fluent UI não oferece
303
+ - [ ] Time já conhece MudBlazor
304
+
305
+ **Use MudBlazor 100% quando:**
306
+ - [ ] Projeto não tem AI
307
+ - [ ] Já existe codebase MudBlazor
308
+ - [ ] Precisa de 100+ componentes diferentes
309
+ - [ ] Material Design é requisito
310
+
311
+ **Referência completa:** [Fluent UI Blazor](../../../framework/standards/fluent-ui-blazor.md)
312
+
313
+ ---
314
+
315
+ ## ✅ Checklist de Arquitetura
316
+
317
+ - [ ] Domain sem dependências externas
318
+ - [ ] Features organizadas por pasta
319
+ - [ ] Interfaces em Application, implementações em Infrastructure
320
+ - [ ] DTOs para comunicação entre camadas
321
+ - [ ] Exceptions customizadas para domínio
322
+ - [ ] DI via construtor (não Service Locator)
323
+ - [ ] Agents tratados como services
324
+ - [ ] Authorization via policies
325
+ - [ ] HTTP Clients tipados com retry