@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.
- package/CLAUDE.md +314 -1673
- package/LICENSE +72 -72
- package/README.md +515 -516
- package/bin/detect-agents.js +225 -225
- package/bin/morph-spec.js +358 -173
- package/bin/render-template.js +302 -302
- package/bin/semantic-detect-agents.js +246 -246
- package/bin/task-manager.js +429 -0
- package/bin/validate-agents-skills.js +251 -251
- package/bin/validate-agents.js +69 -69
- package/bin/validate-phase.js +263 -263
- package/bin/validate.js +369 -0
- package/content/.azure/README.md +293 -293
- package/content/.azure/docs/azure-devops-setup.md +454 -454
- package/content/.azure/docs/branch-strategy.md +398 -398
- package/content/.azure/docs/local-development.md +515 -515
- package/content/.azure/pipelines/pipeline-variables.yml +34 -34
- package/content/.azure/pipelines/prod-pipeline.yml +319 -319
- package/content/.azure/pipelines/staging-pipeline.yml +234 -234
- package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
- package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
- package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
- package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
- package/content/.claude/commands/morph-apply.md +221 -158
- package/content/.claude/commands/morph-archive.md +79 -79
- package/content/.claude/commands/morph-infra.md +209 -209
- package/content/.claude/commands/morph-preflight.md +227 -0
- package/content/.claude/commands/morph-proposal.md +122 -101
- package/content/.claude/commands/morph-status.md +86 -86
- package/content/.claude/commands/morph-troubleshoot.md +122 -0
- package/content/.claude/settings.local.json +15 -15
- package/content/.claude/skills/checklists/code-review.md +226 -0
- package/content/.claude/skills/checklists/morph-checklist.md +117 -0
- package/content/.claude/skills/checklists/simulation-checklist.md +77 -0
- package/content/.claude/skills/infra/bicep-architect.md +126 -419
- package/content/.claude/skills/infra/container-specialist.md +131 -437
- package/content/.claude/skills/infra/devops-engineer.md +119 -405
- package/content/.claude/skills/integrations/asaas-financial.md +130 -333
- package/content/.claude/skills/integrations/azure-identity.md +142 -309
- package/content/.claude/skills/integrations/clerk-auth.md +108 -290
- package/content/.claude/skills/integrations/resend-email.md +119 -0
- package/content/.claude/skills/specialists/ai-system-architect.md +192 -604
- package/content/.claude/skills/specialists/azure-architect.md +142 -142
- package/content/.claude/skills/specialists/code-analyzer.md +235 -0
- package/content/.claude/skills/specialists/dotnet-senior.md +287 -0
- package/content/.claude/skills/specialists/ef-modeler.md +113 -200
- package/content/.claude/skills/specialists/hangfire-orchestrator.md +126 -245
- package/content/.claude/skills/specialists/ms-agent-expert.md +109 -263
- package/content/.claude/skills/specialists/po-pm-advisor.md +197 -197
- package/content/.claude/skills/specialists/standards-architect.md +156 -78
- package/content/.claude/skills/specialists/testing-specialist.md +126 -0
- package/content/.claude/skills/specialists/ui-ux-designer.md +191 -1060
- package/content/.claude/skills/stacks/dotnet-blazor.md +210 -588
- package/content/.claude/skills/stacks/dotnet-nextjs.md +154 -402
- package/content/.claude/skills/workflows/morph-replicate.md +213 -0
- package/content/.claude/{commands/morph-clarify.md → skills/workflows/phase-clarify.md} +5 -58
- package/content/.claude/{commands/morph-design.md → skills/workflows/phase-design.md} +16 -86
- package/content/.claude/{commands/morph-setup.md → skills/workflows/phase-setup.md} +9 -17
- package/content/.claude/skills/workflows/phase-tasks.md +164 -0
- package/content/.claude/{commands/morph-uiux.md → skills/workflows/phase-uiux.md} +15 -88
- package/content/.morph/.morphversion +5 -5
- package/content/.morph/archive/.gitkeep +25 -25
- package/content/.morph/config/agents.json +378 -242
- package/content/.morph/config/config.template.json +89 -108
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
- package/content/.morph/docs/workflows/design-impl.md +37 -0
- package/content/.morph/docs/workflows/fast-track.md +29 -0
- package/content/.morph/docs/workflows/full-morph.md +76 -0
- package/content/.morph/docs/workflows/standard.md +44 -0
- package/content/.morph/docs/workflows/ui-refresh.md +39 -0
- package/content/.morph/examples/api-nextjs/README.md +241 -241
- package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
- package/content/.morph/examples/api-nextjs/spec.md +399 -399
- package/content/.morph/examples/api-nextjs/tasks.md +168 -168
- package/content/.morph/examples/micro-saas/README.md +125 -125
- package/content/.morph/examples/micro-saas/contracts.cs +358 -358
- package/content/.morph/examples/micro-saas/decisions.md +246 -246
- package/content/.morph/examples/micro-saas/spec.md +236 -236
- package/content/.morph/examples/micro-saas/tasks.md +150 -150
- package/content/.morph/examples/multi-agent/README.md +309 -309
- package/content/.morph/examples/multi-agent/contracts.cs +433 -433
- package/content/.morph/examples/multi-agent/spec.md +479 -479
- package/content/.morph/examples/multi-agent/tasks.md +185 -185
- package/content/.morph/examples/scheduled-reports/decisions.md +158 -0
- package/content/.morph/examples/scheduled-reports/proposal.md +95 -0
- package/content/.morph/examples/scheduled-reports/spec.md +267 -0
- package/content/.morph/examples/state-v3.json +188 -0
- package/content/.morph/features/.gitkeep +25 -25
- package/content/.morph/hooks/README.md +190 -239
- package/content/.morph/hooks/pre-commit-agents.sh +24 -24
- package/content/.morph/hooks/pre-commit-all.sh +48 -48
- package/content/.morph/hooks/pre-commit-specs.sh +49 -49
- package/content/.morph/hooks/pre-commit-tests.sh +60 -60
- package/content/.morph/project.md +160 -160
- package/content/.morph/schemas/agent.schema.json +296 -296
- package/content/.morph/schemas/tasks.schema.json +220 -0
- package/content/.morph/specs/.gitkeep +20 -20
- package/content/.morph/standards/agent-framework-blazor-ui.md +359 -0
- package/content/.morph/standards/agent-framework-production.md +410 -0
- package/content/.morph/standards/agent-framework-setup.md +413 -453
- package/content/.morph/standards/agent-framework-workflows.md +349 -0
- package/content/.morph/standards/architecture.md +325 -325
- package/content/.morph/standards/azure.md +605 -379
- package/content/.morph/standards/coding.md +377 -377
- package/content/.morph/standards/dotnet10-migration.md +520 -494
- package/content/.morph/standards/fluent-ui-setup.md +590 -590
- package/content/.morph/standards/migration-guide.md +514 -514
- package/content/.morph/standards/passkeys-auth.md +423 -423
- package/content/.morph/standards/vector-search-rag.md +536 -536
- package/content/.morph/state.json +17 -17
- package/content/.morph/templates/FluentDesignTheme.cs +149 -149
- package/content/.morph/templates/MudTheme.cs +281 -281
- package/content/.morph/templates/agent.cs +163 -172
- package/content/.morph/templates/clarify-questions.md +159 -0
- package/content/.morph/templates/component.razor +239 -239
- package/content/.morph/templates/contracts/Commands.cs +74 -0
- package/content/.morph/templates/contracts/Entities.cs +25 -0
- package/content/.morph/templates/contracts/Queries.cs +74 -0
- package/content/.morph/templates/contracts/README.md +74 -0
- package/content/.morph/templates/contracts.cs +217 -217
- package/content/.morph/templates/decisions.md +123 -106
- package/content/.morph/templates/design-system.css +226 -226
- package/content/.morph/templates/infra/.dockerignore.example +89 -89
- package/content/.morph/templates/infra/Dockerfile.example +82 -82
- package/content/.morph/templates/infra/README.md +286 -286
- package/content/.morph/templates/infra/app-insights.bicep +63 -63
- package/content/.morph/templates/infra/app-service.bicep +164 -164
- package/content/.morph/templates/infra/container-app-env.bicep +49 -49
- package/content/.morph/templates/infra/container-app.bicep +156 -156
- package/content/.morph/templates/infra/deploy-checklist.md +426 -0
- package/content/.morph/templates/infra/deploy.ps1 +229 -229
- package/content/.morph/templates/infra/deploy.sh +208 -208
- package/content/.morph/templates/infra/key-vault.bicep +91 -91
- package/content/.morph/templates/infra/main.bicep +189 -189
- package/content/.morph/templates/infra/parameters.dev.json +29 -29
- package/content/.morph/templates/infra/parameters.prod.json +29 -29
- package/content/.morph/templates/infra/parameters.staging.json +29 -29
- package/content/.morph/templates/infra/sql-database.bicep +103 -103
- package/content/.morph/templates/infra/storage.bicep +106 -106
- package/content/.morph/templates/integrations/asaas-client.cs +387 -387
- package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
- package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
- package/content/.morph/templates/integrations/clerk-config.cs +258 -258
- package/content/.morph/templates/job.cs +171 -171
- package/content/.morph/templates/migration.cs +83 -83
- package/content/.morph/templates/proposal.md +141 -155
- package/content/.morph/templates/recap.md +94 -105
- package/content/.morph/templates/repository.cs +141 -141
- package/content/.morph/templates/saas/subscription.cs +347 -347
- package/content/.morph/templates/saas/tenant.cs +338 -338
- package/content/.morph/templates/service.cs +139 -139
- package/content/.morph/templates/simulation.md +353 -0
- package/content/.morph/templates/spec.md +149 -148
- package/content/.morph/templates/sprint-status.yaml +68 -68
- package/content/.morph/templates/state.template.json +222 -222
- package/content/.morph/templates/story.md +143 -143
- package/content/.morph/templates/tasks.md +257 -235
- package/content/.morph/templates/test.cs +239 -239
- package/content/.morph/templates/ui-components.md +362 -276
- package/content/.morph/templates/ui-design-system.md +286 -286
- package/content/.morph/templates/ui-flows.md +336 -336
- package/content/.morph/templates/ui-mockups.md +133 -133
- package/content/.morph/test-infra/example.bicep +59 -59
- package/content/CLAUDE.md +150 -442
- package/content/README.md +79 -79
- package/detectors/config-detector.js +223 -223
- package/detectors/conversation-analyzer.js +163 -163
- package/detectors/index.js +84 -84
- package/detectors/standards-generator.js +275 -275
- package/detectors/structure-detector.js +245 -250
- package/docs/README.md +144 -149
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
- package/docs/api/scripts/collapse.js +38 -38
- package/docs/api/scripts/commonNav.js +28 -28
- package/docs/api/scripts/linenumber.js +25 -25
- package/docs/api/scripts/nav.js +12 -12
- package/docs/api/scripts/polyfill.js +3 -3
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
- package/docs/api/scripts/prettify/lang-css.js +2 -2
- package/docs/api/scripts/prettify/prettify.js +28 -28
- package/docs/api/scripts/search.js +98 -98
- package/docs/api/styles/jsdoc.css +776 -776
- package/docs/api/styles/prettify.css +80 -80
- package/docs/examples.md +328 -328
- package/docs/getting-started.md +301 -302
- package/docs/installation.md +361 -361
- package/docs/templates.md +418 -418
- package/docs/validation-checklist.md +265 -266
- package/package.json +80 -80
- package/scripts/postinstall.js +132 -132
- package/src/commands/advance-phase.js +183 -0
- package/src/commands/analyze-blazor-concurrency.js +193 -0
- package/src/commands/create-story.js +351 -351
- package/src/commands/detect-agents.js +139 -0
- package/src/commands/detect.js +104 -104
- package/src/commands/doctor.js +356 -280
- package/src/commands/generate.js +149 -149
- package/src/commands/init.js +258 -245
- package/src/commands/lint-fluent.js +352 -0
- package/src/commands/rollback-phase.js +185 -0
- package/src/commands/session-summary.js +291 -0
- package/src/commands/shard-spec.js +224 -224
- package/src/commands/sprint-status.js +250 -250
- package/src/commands/state.js +333 -333
- package/src/commands/sync.js +167 -167
- package/src/commands/task.js +78 -0
- package/src/commands/troubleshoot.js +222 -0
- package/src/commands/update.js +192 -159
- package/src/commands/validate-blazor-state.js +210 -0
- package/src/commands/validate-blazor.js +156 -0
- package/src/commands/validate-css.js +84 -0
- package/src/commands/validate-phase.js +221 -0
- package/src/lib/blazor-concurrency-analyzer.js +288 -0
- package/src/lib/blazor-state-validator.js +291 -0
- package/src/lib/blazor-validator.js +374 -0
- package/src/lib/complexity-analyzer.js +441 -292
- package/src/lib/continuous-validator.js +421 -0
- package/src/lib/css-validator.js +352 -0
- package/src/lib/decision-constraint-loader.js +109 -0
- package/src/lib/design-system-generator.js +298 -298
- package/src/lib/learning-system.js +520 -0
- package/src/lib/mockup-generator.js +366 -0
- package/src/lib/recap-generator.js +205 -0
- package/src/lib/state-manager.js +397 -340
- package/src/lib/troubleshoot-grep.js +194 -0
- package/src/lib/troubleshoot-index.js +144 -0
- package/src/lib/ui-detector.js +350 -0
- package/src/lib/validation-runner.js +231 -0
- package/src/lib/validators/architecture-validator.js +387 -0
- package/src/lib/validators/contract-compliance-validator.js +273 -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 +179 -139
- package/src/utils/logger.js +32 -32
- package/src/utils/version-checker.js +175 -175
- package/content/.claude/commands/morph-costs.md +0 -206
- package/content/.claude/commands/morph-tasks.md +0 -319
- package/content/.claude/skills/specialists/cost-guardian.md +0 -110
- package/content/.claude/skills/stacks/shopify.md +0 -445
- package/content/.morph/config/azure-pricing.json +0 -70
- package/content/.morph/config/azure-pricing.schema.json +0 -50
- package/content/.morph/hooks/pre-commit-costs.sh +0 -91
- package/docs/api/cost-calculator.js.html +0 -513
- package/docs/api/design-system-generator.js.html +0 -382
- package/docs/api/global.html +0 -5263
- package/docs/api/index.html +0 -96
- package/docs/api/state-manager.js.html +0 -423
- package/src/commands/cost.js +0 -181
- package/src/commands/update-pricing.js +0 -206
- 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
|
|
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
|