@polymorphism-tech/morph-spec 2.4.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.
- package/CLAUDE.md +158 -26
- package/LICENSE +72 -72
- package/bin/detect-agents.js +225 -225
- package/bin/morph-spec.js +8 -0
- package/bin/render-template.js +302 -302
- package/bin/semantic-detect-agents.js +246 -246
- package/bin/validate-agents-skills.js +251 -251
- package/bin/validate-agents.js +69 -69
- package/bin/validate-phase.js +263 -263
- 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-archive.md +79 -79
- package/content/.claude/commands/morph-deploy.md +529 -0
- package/content/.claude/commands/morph-infra.md +209 -209
- package/content/.claude/commands/morph-preflight.md +227 -227
- package/content/.claude/commands/morph-troubleshoot.md +122 -122
- package/content/.claude/settings.local.json +15 -15
- package/content/.claude/skills/infra/azure-deploy-specialist.md +699 -0
- package/content/.claude/skills/level-0-meta/README.md +7 -0
- package/content/.claude/skills/{checklists → level-0-meta}/morph-checklist.md +117 -117
- package/content/.claude/skills/level-1-workflows/README.md +7 -0
- package/content/.claude/skills/{workflows → level-1-workflows}/morph-replicate.md +213 -213
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-clarify.md +131 -131
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-design.md +213 -205
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-setup.md +106 -92
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-tasks.md +164 -164
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-uiux.md +169 -138
- package/content/.claude/skills/level-2-domains/README.md +14 -0
- package/content/.claude/skills/{specialists → level-2-domains/quality}/testing-specialist.md +126 -126
- package/content/.claude/skills/level-3-technologies/README.md +7 -0
- package/content/.claude/skills/level-4-patterns/README.md +7 -0
- package/content/.claude/skills/specialists/prompt-engineer.md +189 -0
- package/content/.claude/skills/specialists/seo-growth-hacker.md +320 -0
- package/content/.morph/.morphversion +5 -5
- package/content/.morph/archive/.gitkeep +25 -25
- package/content/.morph/config/agents.json +742 -358
- package/content/.morph/config/config.template.json +33 -0
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
- package/content/.morph/docs/workflows/enforcement-pipeline.md +668 -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 -158
- package/content/.morph/examples/scheduled-reports/proposal.md +95 -95
- package/content/.morph/examples/scheduled-reports/spec.md +267 -267
- package/content/.morph/examples/state-v3.json +188 -188
- package/content/.morph/features/.gitkeep +25 -25
- package/content/.morph/hooks/README.md +158 -0
- 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/hooks/task-completed.js +73 -0
- package/content/.morph/hooks/teammate-idle.js +68 -0
- package/content/.morph/project.md +160 -160
- package/content/.morph/schemas/agent.schema.json +296 -296
- package/content/.morph/schemas/tasks.schema.json +220 -220
- package/content/.morph/specs/.gitkeep +20 -20
- package/content/.morph/standards/agent-teams-workflow.md +474 -0
- package/content/.morph/standards/coding.md +377 -377
- 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/CONTEXT-FEATURE.md +276 -0
- package/content/.morph/templates/CONTEXT.md +170 -0
- package/content/.morph/templates/FluentDesignTheme.cs +149 -149
- package/content/.morph/templates/MudTheme.cs +281 -281
- package/content/.morph/templates/clarify-questions.md +159 -159
- package/content/.morph/templates/component.razor +239 -239
- package/content/.morph/templates/contracts/Commands.cs +74 -74
- package/content/.morph/templates/contracts/Entities.cs +25 -25
- package/content/.morph/templates/contracts/Queries.cs +74 -74
- package/content/.morph/templates/contracts/README.md +74 -74
- package/content/.morph/templates/contracts.cs +217 -217
- 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/azure-pipelines-deploy.yml +480 -0
- 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 -426
- 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/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/sprint-status.yaml +68 -68
- package/content/.morph/templates/story.md +143 -143
- package/content/.morph/templates/test.cs +239 -239
- 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/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/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/templates.md +418 -418
- package/package.json +1 -1
- package/scripts/postinstall.js +132 -132
- package/src/commands/advance-phase.js +83 -0
- package/src/commands/analyze-blazor-concurrency.js +193 -193
- package/src/commands/create-story.js +351 -351
- package/src/commands/deploy.js +780 -0
- package/src/commands/detect-agents.js +34 -6
- package/src/commands/detect.js +104 -104
- package/src/commands/generate-context.js +40 -0
- package/src/commands/generate.js +149 -149
- package/src/commands/lint-fluent.js +352 -352
- package/src/commands/rollback-phase.js +185 -185
- package/src/commands/session-summary.js +291 -291
- 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/troubleshoot.js +222 -222
- package/src/commands/validate-blazor-state.js +210 -210
- package/src/commands/validate-blazor.js +156 -156
- package/src/commands/validate-css.js +84 -84
- package/src/commands/validate-phase.js +221 -221
- package/src/lib/blazor-concurrency-analyzer.js +288 -288
- package/src/lib/blazor-state-validator.js +291 -291
- package/src/lib/blazor-validator.js +374 -374
- package/src/lib/context-generator.js +513 -0
- package/src/lib/css-validator.js +352 -352
- package/src/lib/design-system-detector.js +187 -0
- package/src/lib/design-system-generator.js +298 -298
- package/src/lib/design-system-scaffolder.js +299 -0
- package/src/lib/hook-executor.js +256 -0
- package/src/lib/learning-system.js +520 -520
- package/src/lib/mockup-generator.js +366 -366
- package/src/lib/spec-validator.js +258 -0
- package/src/lib/standards-context-injector.js +287 -0
- package/src/lib/team-orchestrator.js +322 -0
- package/src/lib/troubleshoot-grep.js +194 -194
- package/src/lib/troubleshoot-index.js +144 -144
- package/src/lib/ui-detector.js +350 -350
- package/src/lib/validation-runner.js +65 -13
- package/src/lib/validators/architecture-validator.js +387 -387
- package/src/lib/validators/design-system-validator.js +231 -0
- package/src/lib/validators/package-validator.js +360 -360
- package/src/lib/validators/ui-contrast-validator.js +422 -422
- package/src/utils/file-copier.js +9 -1
- package/src/utils/logger.js +32 -32
- package/src/utils/version-checker.js +175 -175
- /package/content/.claude/skills/{checklists → level-0-meta}/code-review.md +0 -0
- /package/content/.claude/skills/{checklists → level-0-meta}/simulation-checklist.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/ai-agents}/ai-system-architect.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/architecture}/po-pm-advisor.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/architecture}/standards-architect.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/dotnet-senior.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/ef-modeler.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/hangfire-orchestrator.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/ms-agent-expert.md +0 -0
- /package/content/.claude/skills/{stacks/dotnet-blazor.md → level-2-domains/frontend/blazor-builder.md} +0 -0
- /package/content/.claude/skills/{stacks/dotnet-nextjs.md → level-2-domains/frontend/nextjs-expert.md} +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/frontend}/ui-ux-designer.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/infrastructure}/azure-architect.md +0 -0
- /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/bicep-architect.md +0 -0
- /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/container-specialist.md +0 -0
- /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/devops-engineer.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/asaas-financial.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/azure-identity.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/clerk-auth.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/resend-email.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/quality}/code-analyzer.md +0 -0
|
@@ -1,185 +1,185 @@
|
|
|
1
|
-
# Multi-Agent System - Tasks
|
|
2
|
-
|
|
3
|
-
## Fase 1: Setup do Projeto
|
|
4
|
-
|
|
5
|
-
| ID | Task | Dependências | Estimativa |
|
|
6
|
-
|----|------|--------------|------------|
|
|
7
|
-
| T001 | Criar solution e projetos | - | S |
|
|
8
|
-
| T002 | Configurar packages (Semantic Kernel, etc) | T001 | S |
|
|
9
|
-
| T003 | Configurar appsettings.json | T001 | S |
|
|
10
|
-
| T004 | Criar estrutura de pastas | T001 | S |
|
|
11
|
-
|
|
12
|
-
## Fase 2: Infrastructure Layer
|
|
13
|
-
|
|
14
|
-
| ID | Task | Dependências | Estimativa |
|
|
15
|
-
|----|------|--------------|------------|
|
|
16
|
-
| T005 | Implementar AzureOpenAIService | T002 | M |
|
|
17
|
-
| T006 | Implementar EmbeddingService | T005 | M |
|
|
18
|
-
| T007 | Implementar InMemoryVectorStore | T006 | M |
|
|
19
|
-
| T008 | Implementar ConversationStore (in-memory) | T002 | M |
|
|
20
|
-
|
|
21
|
-
## Fase 3: Plugin Layer
|
|
22
|
-
|
|
23
|
-
| ID | Task | Dependências | Estimativa |
|
|
24
|
-
|----|------|--------------|------------|
|
|
25
|
-
| T009 | Criar WebSearchPlugin | T005 | M |
|
|
26
|
-
| T010 | Configurar Bing Search API | T009 | S |
|
|
27
|
-
| T011 | Criar DocumentPlugin | T007 | M |
|
|
28
|
-
| T012 | Criar CalculatorPlugin | T005 | S |
|
|
29
|
-
| T013 | Criar DateTimePlugin | T005 | S |
|
|
30
|
-
|
|
31
|
-
## Fase 4: Agent Layer - Base
|
|
32
|
-
|
|
33
|
-
| ID | Task | Dependências | Estimativa |
|
|
34
|
-
|----|------|--------------|------------|
|
|
35
|
-
| T014 | Criar BaseAgent abstract class | T005 | M |
|
|
36
|
-
| T015 | Implementar AgentFactory | T014 | M |
|
|
37
|
-
| T016 | Criar AgentContext (DI scope) | T015 | M |
|
|
38
|
-
|
|
39
|
-
## Fase 5: Agent Layer - Agents
|
|
40
|
-
|
|
41
|
-
| ID | Task | Dependências | Estimativa |
|
|
42
|
-
|----|------|--------------|------------|
|
|
43
|
-
| T017 | Implementar ResearchAgent | T014, T009, T011 | L |
|
|
44
|
-
| T018 | Implementar AnalysisAgent | T014, T012 | M |
|
|
45
|
-
| T019 | Implementar WritingAgent | T014 | M |
|
|
46
|
-
| T020 | Implementar OrchestratorAgent | T017-T019 | L |
|
|
47
|
-
|
|
48
|
-
## Fase 6: Orchestration Layer
|
|
49
|
-
|
|
50
|
-
| ID | Task | Dependências | Estimativa |
|
|
51
|
-
|----|------|--------------|------------|
|
|
52
|
-
| T021 | Implementar TaskDecomposer | T020 | M |
|
|
53
|
-
| T022 | Implementar AgentRouter | T015, T021 | M |
|
|
54
|
-
| T023 | Implementar ResultAggregator | T020 | M |
|
|
55
|
-
| T024 | Implementar Orchestrator | T021-T023 | L |
|
|
56
|
-
|
|
57
|
-
## Fase 7: Memory Layer
|
|
58
|
-
|
|
59
|
-
| ID | Task | Dependências | Estimativa |
|
|
60
|
-
|----|------|--------------|------------|
|
|
61
|
-
| T025 | Implementar ConversationMemory | T008 | M |
|
|
62
|
-
| T026 | Implementar SemanticMemory | T007 | M |
|
|
63
|
-
| T027 | Integrar memória com Orchestrator | T024-T026 | M |
|
|
64
|
-
|
|
65
|
-
## Fase 8: API Layer
|
|
66
|
-
|
|
67
|
-
| ID | Task | Dependências | Estimativa |
|
|
68
|
-
|----|------|--------------|------------|
|
|
69
|
-
| T028 | Configurar Program.cs base | T001 | M |
|
|
70
|
-
| T029 | Criar ChatEndpoints | T024, T027 | M |
|
|
71
|
-
| T030 | Implementar streaming (SSE) | T029 | M |
|
|
72
|
-
| T031 | Criar AgentEndpoints | T015 | S |
|
|
73
|
-
| T032 | Criar HealthEndpoints | T028 | S |
|
|
74
|
-
| T033 | Configurar API Key auth | T028 | S |
|
|
75
|
-
|
|
76
|
-
## Fase 9: Error Handling & Resilience
|
|
77
|
-
|
|
78
|
-
| ID | Task | Dependências | Estimativa |
|
|
79
|
-
|----|------|--------------|------------|
|
|
80
|
-
| T034 | Implementar retry policies | T024 | M |
|
|
81
|
-
| T035 | Implementar circuit breaker | T034 | M |
|
|
82
|
-
| T036 | Implementar timeout handling | T024 | M |
|
|
83
|
-
| T037 | Criar error logging middleware | T028 | S |
|
|
84
|
-
|
|
85
|
-
## Fase 10: Monitoring & Metrics
|
|
86
|
-
|
|
87
|
-
| ID | Task | Dependências | Estimativa |
|
|
88
|
-
|----|------|--------------|------------|
|
|
89
|
-
| T038 | Implementar token tracking | T005 | M |
|
|
90
|
-
| T039 | Implementar usage metrics | T038 | M |
|
|
91
|
-
| T040 | Criar cost estimation | T039 | S |
|
|
92
|
-
| T041 | Integrar com App Insights | T028 | M |
|
|
93
|
-
|
|
94
|
-
## Fase 11: Infrastructure (IaC)
|
|
95
|
-
|
|
96
|
-
| ID | Task | Dependências | Estimativa |
|
|
97
|
-
|----|------|--------------|------------|
|
|
98
|
-
| T042 | Criar main.bicep | - | M |
|
|
99
|
-
| T043 | Configurar Container App | T042 | M |
|
|
100
|
-
| T044 | Configurar Azure OpenAI (manual) | - | M |
|
|
101
|
-
| T045 | Configurar Key Vault | T042 | S |
|
|
102
|
-
| T046 | Configurar App Insights | T042 | S |
|
|
103
|
-
|
|
104
|
-
## Fase 12: Testes
|
|
105
|
-
|
|
106
|
-
| ID | Task | Dependências | Estimativa |
|
|
107
|
-
|----|------|--------------|------------|
|
|
108
|
-
| T047 | Criar testes unitários - Plugins | T009-T013 | M |
|
|
109
|
-
| T048 | Criar testes unitários - Agents | T017-T020 | M |
|
|
110
|
-
| T049 | Criar testes integração - Orchestrator | T024 | L |
|
|
111
|
-
| T050 | Criar testes E2E - API | T029-T032 | L |
|
|
112
|
-
|
|
113
|
-
## Fase 13: Documentação
|
|
114
|
-
|
|
115
|
-
| ID | Task | Dependências | Estimativa |
|
|
116
|
-
|----|------|--------------|------------|
|
|
117
|
-
| T051 | Documentar APIs (OpenAPI) | T029-T032 | M |
|
|
118
|
-
| T052 | Criar guia de extensibilidade | T014-T020 | M |
|
|
119
|
-
| T053 | Criar exemplos de uso | T029 | M |
|
|
120
|
-
|
|
121
|
-
## Checkpoints
|
|
122
|
-
|
|
123
|
-
| Checkpoint | Após Tasks | Validação |
|
|
124
|
-
|------------|------------|-----------|
|
|
125
|
-
| CP1 | T004 | Projeto compila |
|
|
126
|
-
| CP2 | T008 | Infrastructure funcionando |
|
|
127
|
-
| CP3 | T013 | Plugins funcionando |
|
|
128
|
-
| CP4 | T020 | Agents funcionando |
|
|
129
|
-
| CP5 | T024 | Orchestrator funcionando |
|
|
130
|
-
| CP6 | T027 | Memória integrada |
|
|
131
|
-
| CP7 | T033 | API completa |
|
|
132
|
-
| CP8 | T037 | Error handling completo |
|
|
133
|
-
| CP9 | T041 | Monitoring ativo |
|
|
134
|
-
| CP10 | T046 | IaC pronto |
|
|
135
|
-
| CP11 | T053 | Projeto completo |
|
|
136
|
-
|
|
137
|
-
## Legenda
|
|
138
|
-
|
|
139
|
-
- **S** = Small (< 1h)
|
|
140
|
-
- **M** = Medium (1-3h)
|
|
141
|
-
- **L** = Large (3-8h)
|
|
142
|
-
|
|
143
|
-
## Dependências Críticas
|
|
144
|
-
|
|
145
|
-
```
|
|
146
|
-
Azure OpenAI Setup (T044) - BLOQUEANTE para todos os testes reais
|
|
147
|
-
|
|
148
|
-
T005 (LLM Service) → T014 (BaseAgent) → T017-T020 (Agents) → T024 (Orchestrator)
|
|
149
|
-
↓
|
|
150
|
-
T006 (Embedding) → T007 (VectorStore) → T011 (DocumentPlugin)
|
|
151
|
-
↓
|
|
152
|
-
T009 (WebSearch) → T017 (ResearchAgent)
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
## Ordem de Execução Recomendada
|
|
156
|
-
|
|
157
|
-
### Fase Paralela 1 (Setup)
|
|
158
|
-
- T001-T004 (Setup)
|
|
159
|
-
- T042 (IaC base)
|
|
160
|
-
|
|
161
|
-
### Fase Paralela 2 (Foundation)
|
|
162
|
-
- T005-T008 (Infrastructure)
|
|
163
|
-
- T044 (Azure OpenAI manual)
|
|
164
|
-
|
|
165
|
-
### Fase Paralela 3 (Building Blocks)
|
|
166
|
-
- T009-T013 (Plugins)
|
|
167
|
-
- T014-T016 (Agent base)
|
|
168
|
-
|
|
169
|
-
### Fase Sequencial 4 (Core)
|
|
170
|
-
- T017-T020 (Agents)
|
|
171
|
-
- T021-T024 (Orchestration)
|
|
172
|
-
- T025-T027 (Memory)
|
|
173
|
-
|
|
174
|
-
### Fase Paralela 5 (API + Supporting)
|
|
175
|
-
- T028-T033 (API)
|
|
176
|
-
- T034-T037 (Resilience)
|
|
177
|
-
- T038-T041 (Monitoring)
|
|
178
|
-
|
|
179
|
-
### Fase Final
|
|
180
|
-
- T043-T046 (IaC complete)
|
|
181
|
-
- T047-T053 (Tests + Docs)
|
|
182
|
-
|
|
183
|
-
---
|
|
184
|
-
|
|
185
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
1
|
+
# Multi-Agent System - Tasks
|
|
2
|
+
|
|
3
|
+
## Fase 1: Setup do Projeto
|
|
4
|
+
|
|
5
|
+
| ID | Task | Dependências | Estimativa |
|
|
6
|
+
|----|------|--------------|------------|
|
|
7
|
+
| T001 | Criar solution e projetos | - | S |
|
|
8
|
+
| T002 | Configurar packages (Semantic Kernel, etc) | T001 | S |
|
|
9
|
+
| T003 | Configurar appsettings.json | T001 | S |
|
|
10
|
+
| T004 | Criar estrutura de pastas | T001 | S |
|
|
11
|
+
|
|
12
|
+
## Fase 2: Infrastructure Layer
|
|
13
|
+
|
|
14
|
+
| ID | Task | Dependências | Estimativa |
|
|
15
|
+
|----|------|--------------|------------|
|
|
16
|
+
| T005 | Implementar AzureOpenAIService | T002 | M |
|
|
17
|
+
| T006 | Implementar EmbeddingService | T005 | M |
|
|
18
|
+
| T007 | Implementar InMemoryVectorStore | T006 | M |
|
|
19
|
+
| T008 | Implementar ConversationStore (in-memory) | T002 | M |
|
|
20
|
+
|
|
21
|
+
## Fase 3: Plugin Layer
|
|
22
|
+
|
|
23
|
+
| ID | Task | Dependências | Estimativa |
|
|
24
|
+
|----|------|--------------|------------|
|
|
25
|
+
| T009 | Criar WebSearchPlugin | T005 | M |
|
|
26
|
+
| T010 | Configurar Bing Search API | T009 | S |
|
|
27
|
+
| T011 | Criar DocumentPlugin | T007 | M |
|
|
28
|
+
| T012 | Criar CalculatorPlugin | T005 | S |
|
|
29
|
+
| T013 | Criar DateTimePlugin | T005 | S |
|
|
30
|
+
|
|
31
|
+
## Fase 4: Agent Layer - Base
|
|
32
|
+
|
|
33
|
+
| ID | Task | Dependências | Estimativa |
|
|
34
|
+
|----|------|--------------|------------|
|
|
35
|
+
| T014 | Criar BaseAgent abstract class | T005 | M |
|
|
36
|
+
| T015 | Implementar AgentFactory | T014 | M |
|
|
37
|
+
| T016 | Criar AgentContext (DI scope) | T015 | M |
|
|
38
|
+
|
|
39
|
+
## Fase 5: Agent Layer - Agents
|
|
40
|
+
|
|
41
|
+
| ID | Task | Dependências | Estimativa |
|
|
42
|
+
|----|------|--------------|------------|
|
|
43
|
+
| T017 | Implementar ResearchAgent | T014, T009, T011 | L |
|
|
44
|
+
| T018 | Implementar AnalysisAgent | T014, T012 | M |
|
|
45
|
+
| T019 | Implementar WritingAgent | T014 | M |
|
|
46
|
+
| T020 | Implementar OrchestratorAgent | T017-T019 | L |
|
|
47
|
+
|
|
48
|
+
## Fase 6: Orchestration Layer
|
|
49
|
+
|
|
50
|
+
| ID | Task | Dependências | Estimativa |
|
|
51
|
+
|----|------|--------------|------------|
|
|
52
|
+
| T021 | Implementar TaskDecomposer | T020 | M |
|
|
53
|
+
| T022 | Implementar AgentRouter | T015, T021 | M |
|
|
54
|
+
| T023 | Implementar ResultAggregator | T020 | M |
|
|
55
|
+
| T024 | Implementar Orchestrator | T021-T023 | L |
|
|
56
|
+
|
|
57
|
+
## Fase 7: Memory Layer
|
|
58
|
+
|
|
59
|
+
| ID | Task | Dependências | Estimativa |
|
|
60
|
+
|----|------|--------------|------------|
|
|
61
|
+
| T025 | Implementar ConversationMemory | T008 | M |
|
|
62
|
+
| T026 | Implementar SemanticMemory | T007 | M |
|
|
63
|
+
| T027 | Integrar memória com Orchestrator | T024-T026 | M |
|
|
64
|
+
|
|
65
|
+
## Fase 8: API Layer
|
|
66
|
+
|
|
67
|
+
| ID | Task | Dependências | Estimativa |
|
|
68
|
+
|----|------|--------------|------------|
|
|
69
|
+
| T028 | Configurar Program.cs base | T001 | M |
|
|
70
|
+
| T029 | Criar ChatEndpoints | T024, T027 | M |
|
|
71
|
+
| T030 | Implementar streaming (SSE) | T029 | M |
|
|
72
|
+
| T031 | Criar AgentEndpoints | T015 | S |
|
|
73
|
+
| T032 | Criar HealthEndpoints | T028 | S |
|
|
74
|
+
| T033 | Configurar API Key auth | T028 | S |
|
|
75
|
+
|
|
76
|
+
## Fase 9: Error Handling & Resilience
|
|
77
|
+
|
|
78
|
+
| ID | Task | Dependências | Estimativa |
|
|
79
|
+
|----|------|--------------|------------|
|
|
80
|
+
| T034 | Implementar retry policies | T024 | M |
|
|
81
|
+
| T035 | Implementar circuit breaker | T034 | M |
|
|
82
|
+
| T036 | Implementar timeout handling | T024 | M |
|
|
83
|
+
| T037 | Criar error logging middleware | T028 | S |
|
|
84
|
+
|
|
85
|
+
## Fase 10: Monitoring & Metrics
|
|
86
|
+
|
|
87
|
+
| ID | Task | Dependências | Estimativa |
|
|
88
|
+
|----|------|--------------|------------|
|
|
89
|
+
| T038 | Implementar token tracking | T005 | M |
|
|
90
|
+
| T039 | Implementar usage metrics | T038 | M |
|
|
91
|
+
| T040 | Criar cost estimation | T039 | S |
|
|
92
|
+
| T041 | Integrar com App Insights | T028 | M |
|
|
93
|
+
|
|
94
|
+
## Fase 11: Infrastructure (IaC)
|
|
95
|
+
|
|
96
|
+
| ID | Task | Dependências | Estimativa |
|
|
97
|
+
|----|------|--------------|------------|
|
|
98
|
+
| T042 | Criar main.bicep | - | M |
|
|
99
|
+
| T043 | Configurar Container App | T042 | M |
|
|
100
|
+
| T044 | Configurar Azure OpenAI (manual) | - | M |
|
|
101
|
+
| T045 | Configurar Key Vault | T042 | S |
|
|
102
|
+
| T046 | Configurar App Insights | T042 | S |
|
|
103
|
+
|
|
104
|
+
## Fase 12: Testes
|
|
105
|
+
|
|
106
|
+
| ID | Task | Dependências | Estimativa |
|
|
107
|
+
|----|------|--------------|------------|
|
|
108
|
+
| T047 | Criar testes unitários - Plugins | T009-T013 | M |
|
|
109
|
+
| T048 | Criar testes unitários - Agents | T017-T020 | M |
|
|
110
|
+
| T049 | Criar testes integração - Orchestrator | T024 | L |
|
|
111
|
+
| T050 | Criar testes E2E - API | T029-T032 | L |
|
|
112
|
+
|
|
113
|
+
## Fase 13: Documentação
|
|
114
|
+
|
|
115
|
+
| ID | Task | Dependências | Estimativa |
|
|
116
|
+
|----|------|--------------|------------|
|
|
117
|
+
| T051 | Documentar APIs (OpenAPI) | T029-T032 | M |
|
|
118
|
+
| T052 | Criar guia de extensibilidade | T014-T020 | M |
|
|
119
|
+
| T053 | Criar exemplos de uso | T029 | M |
|
|
120
|
+
|
|
121
|
+
## Checkpoints
|
|
122
|
+
|
|
123
|
+
| Checkpoint | Após Tasks | Validação |
|
|
124
|
+
|------------|------------|-----------|
|
|
125
|
+
| CP1 | T004 | Projeto compila |
|
|
126
|
+
| CP2 | T008 | Infrastructure funcionando |
|
|
127
|
+
| CP3 | T013 | Plugins funcionando |
|
|
128
|
+
| CP4 | T020 | Agents funcionando |
|
|
129
|
+
| CP5 | T024 | Orchestrator funcionando |
|
|
130
|
+
| CP6 | T027 | Memória integrada |
|
|
131
|
+
| CP7 | T033 | API completa |
|
|
132
|
+
| CP8 | T037 | Error handling completo |
|
|
133
|
+
| CP9 | T041 | Monitoring ativo |
|
|
134
|
+
| CP10 | T046 | IaC pronto |
|
|
135
|
+
| CP11 | T053 | Projeto completo |
|
|
136
|
+
|
|
137
|
+
## Legenda
|
|
138
|
+
|
|
139
|
+
- **S** = Small (< 1h)
|
|
140
|
+
- **M** = Medium (1-3h)
|
|
141
|
+
- **L** = Large (3-8h)
|
|
142
|
+
|
|
143
|
+
## Dependências Críticas
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
Azure OpenAI Setup (T044) - BLOQUEANTE para todos os testes reais
|
|
147
|
+
|
|
148
|
+
T005 (LLM Service) → T014 (BaseAgent) → T017-T020 (Agents) → T024 (Orchestrator)
|
|
149
|
+
↓
|
|
150
|
+
T006 (Embedding) → T007 (VectorStore) → T011 (DocumentPlugin)
|
|
151
|
+
↓
|
|
152
|
+
T009 (WebSearch) → T017 (ResearchAgent)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Ordem de Execução Recomendada
|
|
156
|
+
|
|
157
|
+
### Fase Paralela 1 (Setup)
|
|
158
|
+
- T001-T004 (Setup)
|
|
159
|
+
- T042 (IaC base)
|
|
160
|
+
|
|
161
|
+
### Fase Paralela 2 (Foundation)
|
|
162
|
+
- T005-T008 (Infrastructure)
|
|
163
|
+
- T044 (Azure OpenAI manual)
|
|
164
|
+
|
|
165
|
+
### Fase Paralela 3 (Building Blocks)
|
|
166
|
+
- T009-T013 (Plugins)
|
|
167
|
+
- T014-T016 (Agent base)
|
|
168
|
+
|
|
169
|
+
### Fase Sequencial 4 (Core)
|
|
170
|
+
- T017-T020 (Agents)
|
|
171
|
+
- T021-T024 (Orchestration)
|
|
172
|
+
- T025-T027 (Memory)
|
|
173
|
+
|
|
174
|
+
### Fase Paralela 5 (API + Supporting)
|
|
175
|
+
- T028-T033 (API)
|
|
176
|
+
- T034-T037 (Resilience)
|
|
177
|
+
- T038-T041 (Monitoring)
|
|
178
|
+
|
|
179
|
+
### Fase Final
|
|
180
|
+
- T043-T046 (IaC complete)
|
|
181
|
+
- T047-T053 (Tests + Docs)
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,158 +1,158 @@
|
|
|
1
|
-
# Decisões Arquiteturais - Scheduled Reports
|
|
2
|
-
|
|
3
|
-
> Exemplo real de decisions.md gerado pelo MORPH-SPEC
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## ADR-001: Biblioteca de Background Jobs
|
|
8
|
-
|
|
9
|
-
**Data:** 2024-01-15
|
|
10
|
-
**Status:** Aceito
|
|
11
|
-
**Contexto:** Precisamos executar relatórios em horários agendados.
|
|
12
|
-
|
|
13
|
-
### Opções Consideradas
|
|
14
|
-
|
|
15
|
-
| Opção | Pros | Cons |
|
|
16
|
-
|-------|------|------|
|
|
17
|
-
| **Hangfire** | Dashboard, retry, SQL storage | Licença para recursos avançados |
|
|
18
|
-
| Azure Functions (Timer) | Serverless, escalável | Mais complexo, cold start |
|
|
19
|
-
| Quartz.NET | Open source completo | Sem dashboard built-in |
|
|
20
|
-
|
|
21
|
-
### Decisão
|
|
22
|
-
|
|
23
|
-
**Hangfire** - Já usado no projeto, dashboard útil para monitoramento, integração simples com DI.
|
|
24
|
-
|
|
25
|
-
### Consequências
|
|
26
|
-
- ✅ Fácil implementação
|
|
27
|
-
- ✅ Dashboard para operações
|
|
28
|
-
- ⚠️ Considerar licença Pro se precisar de batches
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## ADR-002: Geração de PDF
|
|
33
|
-
|
|
34
|
-
**Data:** 2024-01-15
|
|
35
|
-
**Status:** Aceito
|
|
36
|
-
**Contexto:** Precisamos gerar PDFs dos relatórios.
|
|
37
|
-
|
|
38
|
-
### Opções Consideradas
|
|
39
|
-
|
|
40
|
-
| Opção | Pros | Cons |
|
|
41
|
-
|-------|------|------|
|
|
42
|
-
| **QuestPDF** | Fluent API, .NET nativo, gratuito | Mais novo, menos exemplos |
|
|
43
|
-
| iTextSharp | Maduro, muitos exemplos | Licença AGPL (viral) |
|
|
44
|
-
| PuppeteerSharp | HTML→PDF | Requer Chrome, pesado |
|
|
45
|
-
|
|
46
|
-
### Decisão
|
|
47
|
-
|
|
48
|
-
**QuestPDF** - API moderna, totalmente .NET, licença MIT.
|
|
49
|
-
|
|
50
|
-
### Consequências
|
|
51
|
-
- ✅ Código limpo e legível
|
|
52
|
-
- ✅ Sem dependências externas
|
|
53
|
-
- ⚠️ Curva de aprendizado para layouts complexos
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## ADR-003: Biblioteca UI
|
|
58
|
-
|
|
59
|
-
**Data:** 2024-01-15
|
|
60
|
-
**Status:** Aceito
|
|
61
|
-
**Contexto:** Componentes UI para as telas de relatórios.
|
|
62
|
-
|
|
63
|
-
### Opções Consideradas
|
|
64
|
-
|
|
65
|
-
| Opção | Pros | Cons |
|
|
66
|
-
|-------|------|------|
|
|
67
|
-
| **Fluent UI Blazor** | Já no projeto, design MS | Menos componentes |
|
|
68
|
-
| MudBlazor | Mais componentes | Adicionar dependência |
|
|
69
|
-
|
|
70
|
-
### Decisão
|
|
71
|
-
|
|
72
|
-
**Fluent UI Blazor** - Já instalado no projeto, manter consistência.
|
|
73
|
-
|
|
74
|
-
### Consequências
|
|
75
|
-
- ✅ Sem nova dependência
|
|
76
|
-
- ✅ Visual consistente
|
|
77
|
-
- ⚠️ Pode precisar criar componentes custom
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## ADR-004: Armazenamento de Arquivos
|
|
82
|
-
|
|
83
|
-
**Data:** 2024-01-15
|
|
84
|
-
**Status:** Aceito
|
|
85
|
-
**Contexto:** Onde armazenar os PDFs/Excels gerados.
|
|
86
|
-
|
|
87
|
-
### Opções Consideradas
|
|
88
|
-
|
|
89
|
-
| Opção | Pros | Cons |
|
|
90
|
-
|-------|------|------|
|
|
91
|
-
| **Azure Blob Storage** | Escalável, barato, SAS tokens | Requer setup |
|
|
92
|
-
| Sistema de arquivos | Simples | Não escala, perde em redeploy |
|
|
93
|
-
| Database (BLOB) | Tudo junto | Performance ruim |
|
|
94
|
-
|
|
95
|
-
### Decisão
|
|
96
|
-
|
|
97
|
-
**Azure Blob Storage** - Já usado para outros arquivos, suporta SAS tokens para links temporários.
|
|
98
|
-
|
|
99
|
-
### Consequências
|
|
100
|
-
- ✅ Escalável
|
|
101
|
-
- ✅ Links com expiração
|
|
102
|
-
- ⚠️ Custo adicional (baixo)
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
## ADR-005: Padrão CQRS
|
|
107
|
-
|
|
108
|
-
**Data:** 2024-01-15
|
|
109
|
-
**Status:** Aceito
|
|
110
|
-
**Contexto:** Estruturar commands e queries.
|
|
111
|
-
|
|
112
|
-
### Decisão
|
|
113
|
-
|
|
114
|
-
**CQRS com MediatR** - Separação clara de responsabilidades, já é o padrão do projeto.
|
|
115
|
-
|
|
116
|
-
### Commands
|
|
117
|
-
- `CreateScheduledReportCommand`
|
|
118
|
-
- `UpdateScheduledReportCommand`
|
|
119
|
-
- `DeleteScheduledReportCommand`
|
|
120
|
-
- `ExecuteReportCommand`
|
|
121
|
-
|
|
122
|
-
### Queries
|
|
123
|
-
- `GetScheduledReportByIdQuery`
|
|
124
|
-
- `GetScheduledReportsQuery`
|
|
125
|
-
- `GetReportExecutionsQuery`
|
|
126
|
-
|
|
127
|
-
---
|
|
128
|
-
|
|
129
|
-
## ADR-006: Estratégia de Retry
|
|
130
|
-
|
|
131
|
-
**Data:** 2024-01-15
|
|
132
|
-
**Status:** Aceito
|
|
133
|
-
**Contexto:** Como lidar com falhas na execução de jobs.
|
|
134
|
-
|
|
135
|
-
### Decisão
|
|
136
|
-
|
|
137
|
-
**Exponential backoff com limite:**
|
|
138
|
-
- Retry 1: 1 minuto
|
|
139
|
-
- Retry 2: 5 minutos
|
|
140
|
-
- Retry 3: 15 minutos
|
|
141
|
-
- Após 3 falhas: marcar como Error, notificar admin
|
|
142
|
-
|
|
143
|
-
```csharp
|
|
144
|
-
[AutomaticRetry(Attempts = 3, DelaysInSeconds = new[] { 60, 300, 900 })]
|
|
145
|
-
public async Task ExecuteReportJob(int reportId) { ... }
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
---
|
|
149
|
-
|
|
150
|
-
## Histórico de Mudanças
|
|
151
|
-
|
|
152
|
-
| Data | ADR | Mudança |
|
|
153
|
-
|------|-----|---------|
|
|
154
|
-
| 2024-01-15 | 001-006 | Decisões iniciais |
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
_Gerado por MORPH-SPEC Framework_
|
|
1
|
+
# Decisões Arquiteturais - Scheduled Reports
|
|
2
|
+
|
|
3
|
+
> Exemplo real de decisions.md gerado pelo MORPH-SPEC
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## ADR-001: Biblioteca de Background Jobs
|
|
8
|
+
|
|
9
|
+
**Data:** 2024-01-15
|
|
10
|
+
**Status:** Aceito
|
|
11
|
+
**Contexto:** Precisamos executar relatórios em horários agendados.
|
|
12
|
+
|
|
13
|
+
### Opções Consideradas
|
|
14
|
+
|
|
15
|
+
| Opção | Pros | Cons |
|
|
16
|
+
|-------|------|------|
|
|
17
|
+
| **Hangfire** | Dashboard, retry, SQL storage | Licença para recursos avançados |
|
|
18
|
+
| Azure Functions (Timer) | Serverless, escalável | Mais complexo, cold start |
|
|
19
|
+
| Quartz.NET | Open source completo | Sem dashboard built-in |
|
|
20
|
+
|
|
21
|
+
### Decisão
|
|
22
|
+
|
|
23
|
+
**Hangfire** - Já usado no projeto, dashboard útil para monitoramento, integração simples com DI.
|
|
24
|
+
|
|
25
|
+
### Consequências
|
|
26
|
+
- ✅ Fácil implementação
|
|
27
|
+
- ✅ Dashboard para operações
|
|
28
|
+
- ⚠️ Considerar licença Pro se precisar de batches
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## ADR-002: Geração de PDF
|
|
33
|
+
|
|
34
|
+
**Data:** 2024-01-15
|
|
35
|
+
**Status:** Aceito
|
|
36
|
+
**Contexto:** Precisamos gerar PDFs dos relatórios.
|
|
37
|
+
|
|
38
|
+
### Opções Consideradas
|
|
39
|
+
|
|
40
|
+
| Opção | Pros | Cons |
|
|
41
|
+
|-------|------|------|
|
|
42
|
+
| **QuestPDF** | Fluent API, .NET nativo, gratuito | Mais novo, menos exemplos |
|
|
43
|
+
| iTextSharp | Maduro, muitos exemplos | Licença AGPL (viral) |
|
|
44
|
+
| PuppeteerSharp | HTML→PDF | Requer Chrome, pesado |
|
|
45
|
+
|
|
46
|
+
### Decisão
|
|
47
|
+
|
|
48
|
+
**QuestPDF** - API moderna, totalmente .NET, licença MIT.
|
|
49
|
+
|
|
50
|
+
### Consequências
|
|
51
|
+
- ✅ Código limpo e legível
|
|
52
|
+
- ✅ Sem dependências externas
|
|
53
|
+
- ⚠️ Curva de aprendizado para layouts complexos
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## ADR-003: Biblioteca UI
|
|
58
|
+
|
|
59
|
+
**Data:** 2024-01-15
|
|
60
|
+
**Status:** Aceito
|
|
61
|
+
**Contexto:** Componentes UI para as telas de relatórios.
|
|
62
|
+
|
|
63
|
+
### Opções Consideradas
|
|
64
|
+
|
|
65
|
+
| Opção | Pros | Cons |
|
|
66
|
+
|-------|------|------|
|
|
67
|
+
| **Fluent UI Blazor** | Já no projeto, design MS | Menos componentes |
|
|
68
|
+
| MudBlazor | Mais componentes | Adicionar dependência |
|
|
69
|
+
|
|
70
|
+
### Decisão
|
|
71
|
+
|
|
72
|
+
**Fluent UI Blazor** - Já instalado no projeto, manter consistência.
|
|
73
|
+
|
|
74
|
+
### Consequências
|
|
75
|
+
- ✅ Sem nova dependência
|
|
76
|
+
- ✅ Visual consistente
|
|
77
|
+
- ⚠️ Pode precisar criar componentes custom
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## ADR-004: Armazenamento de Arquivos
|
|
82
|
+
|
|
83
|
+
**Data:** 2024-01-15
|
|
84
|
+
**Status:** Aceito
|
|
85
|
+
**Contexto:** Onde armazenar os PDFs/Excels gerados.
|
|
86
|
+
|
|
87
|
+
### Opções Consideradas
|
|
88
|
+
|
|
89
|
+
| Opção | Pros | Cons |
|
|
90
|
+
|-------|------|------|
|
|
91
|
+
| **Azure Blob Storage** | Escalável, barato, SAS tokens | Requer setup |
|
|
92
|
+
| Sistema de arquivos | Simples | Não escala, perde em redeploy |
|
|
93
|
+
| Database (BLOB) | Tudo junto | Performance ruim |
|
|
94
|
+
|
|
95
|
+
### Decisão
|
|
96
|
+
|
|
97
|
+
**Azure Blob Storage** - Já usado para outros arquivos, suporta SAS tokens para links temporários.
|
|
98
|
+
|
|
99
|
+
### Consequências
|
|
100
|
+
- ✅ Escalável
|
|
101
|
+
- ✅ Links com expiração
|
|
102
|
+
- ⚠️ Custo adicional (baixo)
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## ADR-005: Padrão CQRS
|
|
107
|
+
|
|
108
|
+
**Data:** 2024-01-15
|
|
109
|
+
**Status:** Aceito
|
|
110
|
+
**Contexto:** Estruturar commands e queries.
|
|
111
|
+
|
|
112
|
+
### Decisão
|
|
113
|
+
|
|
114
|
+
**CQRS com MediatR** - Separação clara de responsabilidades, já é o padrão do projeto.
|
|
115
|
+
|
|
116
|
+
### Commands
|
|
117
|
+
- `CreateScheduledReportCommand`
|
|
118
|
+
- `UpdateScheduledReportCommand`
|
|
119
|
+
- `DeleteScheduledReportCommand`
|
|
120
|
+
- `ExecuteReportCommand`
|
|
121
|
+
|
|
122
|
+
### Queries
|
|
123
|
+
- `GetScheduledReportByIdQuery`
|
|
124
|
+
- `GetScheduledReportsQuery`
|
|
125
|
+
- `GetReportExecutionsQuery`
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## ADR-006: Estratégia de Retry
|
|
130
|
+
|
|
131
|
+
**Data:** 2024-01-15
|
|
132
|
+
**Status:** Aceito
|
|
133
|
+
**Contexto:** Como lidar com falhas na execução de jobs.
|
|
134
|
+
|
|
135
|
+
### Decisão
|
|
136
|
+
|
|
137
|
+
**Exponential backoff com limite:**
|
|
138
|
+
- Retry 1: 1 minuto
|
|
139
|
+
- Retry 2: 5 minutos
|
|
140
|
+
- Retry 3: 15 minutos
|
|
141
|
+
- Após 3 falhas: marcar como Error, notificar admin
|
|
142
|
+
|
|
143
|
+
```csharp
|
|
144
|
+
[AutomaticRetry(Attempts = 3, DelaysInSeconds = new[] { 60, 300, 900 })]
|
|
145
|
+
public async Task ExecuteReportJob(int reportId) { ... }
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Histórico de Mudanças
|
|
151
|
+
|
|
152
|
+
| Data | ADR | Mudança |
|
|
153
|
+
|------|-----|---------|
|
|
154
|
+
| 2024-01-15 | 001-006 | Decisões iniciais |
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
_Gerado por MORPH-SPEC Framework_
|