@polymorphism-tech/morph-spec 2.2.0 → 2.4.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 (251) hide show
  1. package/CLAUDE.md +314 -1673
  2. package/LICENSE +72 -72
  3. package/README.md +515 -516
  4. package/bin/detect-agents.js +225 -225
  5. package/bin/morph-spec.js +358 -173
  6. package/bin/render-template.js +302 -302
  7. package/bin/semantic-detect-agents.js +246 -246
  8. package/bin/task-manager.js +429 -0
  9. package/bin/validate-agents-skills.js +251 -251
  10. package/bin/validate-agents.js +69 -69
  11. package/bin/validate-phase.js +263 -263
  12. package/bin/validate.js +369 -0
  13. package/content/.azure/README.md +293 -293
  14. package/content/.azure/docs/azure-devops-setup.md +454 -454
  15. package/content/.azure/docs/branch-strategy.md +398 -398
  16. package/content/.azure/docs/local-development.md +515 -515
  17. package/content/.azure/pipelines/pipeline-variables.yml +34 -34
  18. package/content/.azure/pipelines/prod-pipeline.yml +319 -319
  19. package/content/.azure/pipelines/staging-pipeline.yml +234 -234
  20. package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
  21. package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
  22. package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
  23. package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
  24. package/content/.claude/commands/morph-apply.md +221 -158
  25. package/content/.claude/commands/morph-archive.md +79 -79
  26. package/content/.claude/commands/morph-infra.md +209 -209
  27. package/content/.claude/commands/morph-preflight.md +227 -0
  28. package/content/.claude/commands/morph-proposal.md +122 -101
  29. package/content/.claude/commands/morph-status.md +86 -86
  30. package/content/.claude/commands/morph-troubleshoot.md +122 -0
  31. package/content/.claude/settings.local.json +15 -15
  32. package/content/.claude/skills/checklists/code-review.md +226 -0
  33. package/content/.claude/skills/checklists/morph-checklist.md +117 -0
  34. package/content/.claude/skills/checklists/simulation-checklist.md +77 -0
  35. package/content/.claude/skills/infra/bicep-architect.md +126 -419
  36. package/content/.claude/skills/infra/container-specialist.md +131 -437
  37. package/content/.claude/skills/infra/devops-engineer.md +119 -405
  38. package/content/.claude/skills/integrations/asaas-financial.md +130 -333
  39. package/content/.claude/skills/integrations/azure-identity.md +142 -309
  40. package/content/.claude/skills/integrations/clerk-auth.md +108 -290
  41. package/content/.claude/skills/integrations/resend-email.md +119 -0
  42. package/content/.claude/skills/specialists/ai-system-architect.md +192 -604
  43. package/content/.claude/skills/specialists/azure-architect.md +142 -142
  44. package/content/.claude/skills/specialists/code-analyzer.md +235 -0
  45. package/content/.claude/skills/specialists/dotnet-senior.md +287 -0
  46. package/content/.claude/skills/specialists/ef-modeler.md +113 -200
  47. package/content/.claude/skills/specialists/hangfire-orchestrator.md +126 -245
  48. package/content/.claude/skills/specialists/ms-agent-expert.md +109 -263
  49. package/content/.claude/skills/specialists/po-pm-advisor.md +197 -197
  50. package/content/.claude/skills/specialists/standards-architect.md +156 -78
  51. package/content/.claude/skills/specialists/testing-specialist.md +126 -0
  52. package/content/.claude/skills/specialists/ui-ux-designer.md +191 -1060
  53. package/content/.claude/skills/stacks/dotnet-blazor.md +210 -588
  54. package/content/.claude/skills/stacks/dotnet-nextjs.md +154 -402
  55. package/content/.claude/skills/workflows/morph-replicate.md +213 -0
  56. package/content/.claude/{commands/morph-clarify.md → skills/workflows/phase-clarify.md} +5 -58
  57. package/content/.claude/{commands/morph-design.md → skills/workflows/phase-design.md} +16 -86
  58. package/content/.claude/{commands/morph-setup.md → skills/workflows/phase-setup.md} +9 -17
  59. package/content/.claude/skills/workflows/phase-tasks.md +164 -0
  60. package/content/.claude/{commands/morph-uiux.md → skills/workflows/phase-uiux.md} +15 -88
  61. package/content/.morph/.morphversion +5 -5
  62. package/content/.morph/archive/.gitkeep +25 -25
  63. package/content/.morph/config/agents.json +378 -242
  64. package/content/.morph/config/config.template.json +89 -108
  65. package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
  66. package/content/.morph/docs/workflows/design-impl.md +37 -0
  67. package/content/.morph/docs/workflows/fast-track.md +29 -0
  68. package/content/.morph/docs/workflows/full-morph.md +76 -0
  69. package/content/.morph/docs/workflows/standard.md +44 -0
  70. package/content/.morph/docs/workflows/ui-refresh.md +39 -0
  71. package/content/.morph/examples/api-nextjs/README.md +241 -241
  72. package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
  73. package/content/.morph/examples/api-nextjs/spec.md +399 -399
  74. package/content/.morph/examples/api-nextjs/tasks.md +168 -168
  75. package/content/.morph/examples/micro-saas/README.md +125 -125
  76. package/content/.morph/examples/micro-saas/contracts.cs +358 -358
  77. package/content/.morph/examples/micro-saas/decisions.md +246 -246
  78. package/content/.morph/examples/micro-saas/spec.md +236 -236
  79. package/content/.morph/examples/micro-saas/tasks.md +150 -150
  80. package/content/.morph/examples/multi-agent/README.md +309 -309
  81. package/content/.morph/examples/multi-agent/contracts.cs +433 -433
  82. package/content/.morph/examples/multi-agent/spec.md +479 -479
  83. package/content/.morph/examples/multi-agent/tasks.md +185 -185
  84. package/content/.morph/examples/scheduled-reports/decisions.md +158 -0
  85. package/content/.morph/examples/scheduled-reports/proposal.md +95 -0
  86. package/content/.morph/examples/scheduled-reports/spec.md +267 -0
  87. package/content/.morph/examples/state-v3.json +188 -0
  88. package/content/.morph/features/.gitkeep +25 -25
  89. package/content/.morph/hooks/README.md +190 -239
  90. package/content/.morph/hooks/pre-commit-agents.sh +24 -24
  91. package/content/.morph/hooks/pre-commit-all.sh +48 -48
  92. package/content/.morph/hooks/pre-commit-specs.sh +49 -49
  93. package/content/.morph/hooks/pre-commit-tests.sh +60 -60
  94. package/content/.morph/project.md +160 -160
  95. package/content/.morph/schemas/agent.schema.json +296 -296
  96. package/content/.morph/schemas/tasks.schema.json +220 -0
  97. package/content/.morph/specs/.gitkeep +20 -20
  98. package/content/.morph/standards/agent-framework-blazor-ui.md +359 -0
  99. package/content/.morph/standards/agent-framework-production.md +410 -0
  100. package/content/.morph/standards/agent-framework-setup.md +413 -453
  101. package/content/.morph/standards/agent-framework-workflows.md +349 -0
  102. package/content/.morph/standards/architecture.md +325 -325
  103. package/content/.morph/standards/azure.md +605 -379
  104. package/content/.morph/standards/coding.md +377 -377
  105. package/content/.morph/standards/dotnet10-migration.md +520 -494
  106. package/content/.morph/standards/fluent-ui-setup.md +590 -590
  107. package/content/.morph/standards/migration-guide.md +514 -514
  108. package/content/.morph/standards/passkeys-auth.md +423 -423
  109. package/content/.morph/standards/vector-search-rag.md +536 -536
  110. package/content/.morph/state.json +17 -17
  111. package/content/.morph/templates/FluentDesignTheme.cs +149 -149
  112. package/content/.morph/templates/MudTheme.cs +281 -281
  113. package/content/.morph/templates/agent.cs +163 -172
  114. package/content/.morph/templates/clarify-questions.md +159 -0
  115. package/content/.morph/templates/component.razor +239 -239
  116. package/content/.morph/templates/contracts/Commands.cs +74 -0
  117. package/content/.morph/templates/contracts/Entities.cs +25 -0
  118. package/content/.morph/templates/contracts/Queries.cs +74 -0
  119. package/content/.morph/templates/contracts/README.md +74 -0
  120. package/content/.morph/templates/contracts.cs +217 -217
  121. package/content/.morph/templates/decisions.md +123 -106
  122. package/content/.morph/templates/design-system.css +226 -226
  123. package/content/.morph/templates/infra/.dockerignore.example +89 -89
  124. package/content/.morph/templates/infra/Dockerfile.example +82 -82
  125. package/content/.morph/templates/infra/README.md +286 -286
  126. package/content/.morph/templates/infra/app-insights.bicep +63 -63
  127. package/content/.morph/templates/infra/app-service.bicep +164 -164
  128. package/content/.morph/templates/infra/container-app-env.bicep +49 -49
  129. package/content/.morph/templates/infra/container-app.bicep +156 -156
  130. package/content/.morph/templates/infra/deploy-checklist.md +426 -0
  131. package/content/.morph/templates/infra/deploy.ps1 +229 -229
  132. package/content/.morph/templates/infra/deploy.sh +208 -208
  133. package/content/.morph/templates/infra/key-vault.bicep +91 -91
  134. package/content/.morph/templates/infra/main.bicep +189 -189
  135. package/content/.morph/templates/infra/parameters.dev.json +29 -29
  136. package/content/.morph/templates/infra/parameters.prod.json +29 -29
  137. package/content/.morph/templates/infra/parameters.staging.json +29 -29
  138. package/content/.morph/templates/infra/sql-database.bicep +103 -103
  139. package/content/.morph/templates/infra/storage.bicep +106 -106
  140. package/content/.morph/templates/integrations/asaas-client.cs +387 -387
  141. package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
  142. package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
  143. package/content/.morph/templates/integrations/clerk-config.cs +258 -258
  144. package/content/.morph/templates/job.cs +171 -171
  145. package/content/.morph/templates/migration.cs +83 -83
  146. package/content/.morph/templates/proposal.md +141 -155
  147. package/content/.morph/templates/recap.md +94 -105
  148. package/content/.morph/templates/repository.cs +141 -141
  149. package/content/.morph/templates/saas/subscription.cs +347 -347
  150. package/content/.morph/templates/saas/tenant.cs +338 -338
  151. package/content/.morph/templates/service.cs +139 -139
  152. package/content/.morph/templates/simulation.md +353 -0
  153. package/content/.morph/templates/spec.md +149 -148
  154. package/content/.morph/templates/sprint-status.yaml +68 -68
  155. package/content/.morph/templates/state.template.json +222 -222
  156. package/content/.morph/templates/story.md +143 -143
  157. package/content/.morph/templates/tasks.md +257 -235
  158. package/content/.morph/templates/test.cs +239 -239
  159. package/content/.morph/templates/ui-components.md +362 -276
  160. package/content/.morph/templates/ui-design-system.md +286 -286
  161. package/content/.morph/templates/ui-flows.md +336 -336
  162. package/content/.morph/templates/ui-mockups.md +133 -133
  163. package/content/.morph/test-infra/example.bicep +59 -59
  164. package/content/CLAUDE.md +150 -442
  165. package/content/README.md +79 -79
  166. package/detectors/config-detector.js +223 -223
  167. package/detectors/conversation-analyzer.js +163 -163
  168. package/detectors/index.js +84 -84
  169. package/detectors/standards-generator.js +275 -275
  170. package/detectors/structure-detector.js +245 -250
  171. package/docs/README.md +144 -149
  172. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
  173. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
  174. package/docs/api/scripts/collapse.js +38 -38
  175. package/docs/api/scripts/commonNav.js +28 -28
  176. package/docs/api/scripts/linenumber.js +25 -25
  177. package/docs/api/scripts/nav.js +12 -12
  178. package/docs/api/scripts/polyfill.js +3 -3
  179. package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
  180. package/docs/api/scripts/prettify/lang-css.js +2 -2
  181. package/docs/api/scripts/prettify/prettify.js +28 -28
  182. package/docs/api/scripts/search.js +98 -98
  183. package/docs/api/styles/jsdoc.css +776 -776
  184. package/docs/api/styles/prettify.css +80 -80
  185. package/docs/examples.md +328 -328
  186. package/docs/getting-started.md +301 -302
  187. package/docs/installation.md +361 -361
  188. package/docs/templates.md +418 -418
  189. package/docs/validation-checklist.md +265 -266
  190. package/package.json +80 -80
  191. package/scripts/postinstall.js +132 -132
  192. package/src/commands/advance-phase.js +183 -0
  193. package/src/commands/analyze-blazor-concurrency.js +193 -0
  194. package/src/commands/create-story.js +351 -351
  195. package/src/commands/detect-agents.js +139 -0
  196. package/src/commands/detect.js +104 -104
  197. package/src/commands/doctor.js +356 -280
  198. package/src/commands/generate.js +149 -149
  199. package/src/commands/init.js +258 -245
  200. package/src/commands/lint-fluent.js +352 -0
  201. package/src/commands/rollback-phase.js +185 -0
  202. package/src/commands/session-summary.js +291 -0
  203. package/src/commands/shard-spec.js +224 -224
  204. package/src/commands/sprint-status.js +250 -250
  205. package/src/commands/state.js +333 -333
  206. package/src/commands/sync.js +167 -167
  207. package/src/commands/task.js +78 -0
  208. package/src/commands/troubleshoot.js +222 -0
  209. package/src/commands/update.js +192 -159
  210. package/src/commands/validate-blazor-state.js +210 -0
  211. package/src/commands/validate-blazor.js +156 -0
  212. package/src/commands/validate-css.js +84 -0
  213. package/src/commands/validate-phase.js +221 -0
  214. package/src/lib/blazor-concurrency-analyzer.js +288 -0
  215. package/src/lib/blazor-state-validator.js +291 -0
  216. package/src/lib/blazor-validator.js +374 -0
  217. package/src/lib/complexity-analyzer.js +441 -292
  218. package/src/lib/continuous-validator.js +421 -0
  219. package/src/lib/css-validator.js +352 -0
  220. package/src/lib/decision-constraint-loader.js +109 -0
  221. package/src/lib/design-system-generator.js +298 -298
  222. package/src/lib/learning-system.js +520 -0
  223. package/src/lib/mockup-generator.js +366 -0
  224. package/src/lib/recap-generator.js +205 -0
  225. package/src/lib/state-manager.js +397 -340
  226. package/src/lib/troubleshoot-grep.js +194 -0
  227. package/src/lib/troubleshoot-index.js +144 -0
  228. package/src/lib/ui-detector.js +350 -0
  229. package/src/lib/validation-runner.js +231 -0
  230. package/src/lib/validators/architecture-validator.js +387 -0
  231. package/src/lib/validators/contract-compliance-validator.js +273 -0
  232. package/src/lib/validators/package-validator.js +360 -0
  233. package/src/lib/validators/ui-contrast-validator.js +422 -0
  234. package/src/utils/file-copier.js +179 -139
  235. package/src/utils/logger.js +32 -32
  236. package/src/utils/version-checker.js +175 -175
  237. package/content/.claude/commands/morph-costs.md +0 -206
  238. package/content/.claude/commands/morph-tasks.md +0 -319
  239. package/content/.claude/skills/specialists/cost-guardian.md +0 -110
  240. package/content/.claude/skills/stacks/shopify.md +0 -445
  241. package/content/.morph/config/azure-pricing.json +0 -70
  242. package/content/.morph/config/azure-pricing.schema.json +0 -50
  243. package/content/.morph/hooks/pre-commit-costs.sh +0 -91
  244. package/docs/api/cost-calculator.js.html +0 -513
  245. package/docs/api/design-system-generator.js.html +0 -382
  246. package/docs/api/global.html +0 -5263
  247. package/docs/api/index.html +0 -96
  248. package/docs/api/state-manager.js.html +0 -423
  249. package/src/commands/cost.js +0 -181
  250. package/src/commands/update-pricing.js +0 -206
  251. 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