@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
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# Especificação Técnica: Sistema de Relatórios Agendados
|
|
2
|
+
|
|
3
|
+
> Exemplo real de spec.md gerado pelo MORPH-SPEC
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📋 Informações do Documento
|
|
8
|
+
|
|
9
|
+
| Campo | Valor |
|
|
10
|
+
|-------|-------|
|
|
11
|
+
| Feature | scheduled-reports |
|
|
12
|
+
| Versão | 1.0 |
|
|
13
|
+
| Status | Aprovado |
|
|
14
|
+
| Data | 2024-01-15 |
|
|
15
|
+
| Autor | MORPH-SPEC + User |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 1. Visão Geral
|
|
20
|
+
|
|
21
|
+
### 1.1 Objetivo
|
|
22
|
+
Permitir que usuários criem relatórios que são executados automaticamente em horários configurados, gerando arquivos PDF ou Excel e notificando via email.
|
|
23
|
+
|
|
24
|
+
### 1.2 Contexto
|
|
25
|
+
O sistema atual não possui funcionalidade de relatórios agendados. Usuários precisam gerar relatórios manualmente, o que é ineficiente para relatórios recorrentes.
|
|
26
|
+
|
|
27
|
+
### 1.3 Stakeholders
|
|
28
|
+
- **Usuários finais:** Gestores que precisam de relatórios periódicos
|
|
29
|
+
- **Administradores:** Configuração e monitoramento de jobs
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2. Requisitos Funcionais
|
|
34
|
+
|
|
35
|
+
### 2.1 CRUD de Relatórios Agendados
|
|
36
|
+
|
|
37
|
+
#### RF-001: Criar Relatório Agendado
|
|
38
|
+
- [ ] Usuário pode criar relatório com nome e descrição
|
|
39
|
+
- [ ] Usuário pode selecionar tipo de relatório (vendas, estoque, financeiro)
|
|
40
|
+
- [ ] Usuário pode definir formato de saída (PDF, Excel)
|
|
41
|
+
- [ ] Usuário pode definir periodicidade (diário, semanal, mensal, custom CRON)
|
|
42
|
+
- [ ] Usuário pode definir destinatários de email
|
|
43
|
+
|
|
44
|
+
#### RF-002: Listar Relatórios
|
|
45
|
+
- [ ] Listar relatórios do usuário com paginação
|
|
46
|
+
- [ ] Filtrar por status (ativo, pausado, erro)
|
|
47
|
+
- [ ] Ordenar por última execução ou próxima execução
|
|
48
|
+
|
|
49
|
+
#### RF-003: Editar Relatório
|
|
50
|
+
- [ ] Editar todas as propriedades exceto tipo
|
|
51
|
+
- [ ] Pausar/retomar agendamento
|
|
52
|
+
|
|
53
|
+
#### RF-004: Excluir Relatório
|
|
54
|
+
- [ ] Soft delete com confirmação
|
|
55
|
+
- [ ] Cancelar jobs pendentes ao excluir
|
|
56
|
+
|
|
57
|
+
### 2.2 Execução de Relatórios
|
|
58
|
+
|
|
59
|
+
#### RF-005: Execução Automática
|
|
60
|
+
- [ ] Hangfire executa job no horário configurado
|
|
61
|
+
- [ ] Job gera arquivo no formato selecionado
|
|
62
|
+
- [ ] Arquivo é salvo em Azure Blob Storage
|
|
63
|
+
- [ ] Email é enviado aos destinatários com link para download
|
|
64
|
+
|
|
65
|
+
#### RF-006: Execução Manual
|
|
66
|
+
- [ ] Botão "Executar Agora" na UI
|
|
67
|
+
- [ ] Mesma lógica do job automático
|
|
68
|
+
- [ ] Feedback imediato de "em execução"
|
|
69
|
+
|
|
70
|
+
### 2.3 Histórico
|
|
71
|
+
|
|
72
|
+
#### RF-007: Histórico de Execuções
|
|
73
|
+
- [ ] Listar últimas 50 execuções por relatório
|
|
74
|
+
- [ ] Mostrar: data, duração, status, link do arquivo
|
|
75
|
+
- [ ] Filtrar por período
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 3. Requisitos Não-Funcionais
|
|
80
|
+
|
|
81
|
+
### 3.1 Performance
|
|
82
|
+
- **RNF-001:** Geração de PDF deve completar em < 30 segundos
|
|
83
|
+
- **RNF-002:** Lista de relatórios deve carregar em < 500ms
|
|
84
|
+
|
|
85
|
+
### 3.2 Segurança
|
|
86
|
+
- **RNF-003:** Usuário só pode ver/editar seus próprios relatórios
|
|
87
|
+
- **RNF-004:** Links de download expiram em 24h
|
|
88
|
+
- **RNF-005:** Arquivos são criptografados em repouso
|
|
89
|
+
|
|
90
|
+
### 3.3 Escalabilidade
|
|
91
|
+
- **RNF-006:** Suportar até 1000 relatórios agendados simultâneos
|
|
92
|
+
- **RNF-007:** Jobs executam em fila separada para não bloquear app
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 4. Modelo de Dados
|
|
97
|
+
|
|
98
|
+
### 4.1 Entidade: ScheduledReport
|
|
99
|
+
|
|
100
|
+
```csharp
|
|
101
|
+
public class ScheduledReport
|
|
102
|
+
{
|
|
103
|
+
public int Id { get; private set; }
|
|
104
|
+
public int UserId { get; private set; }
|
|
105
|
+
public string Name { get; private set; }
|
|
106
|
+
public string? Description { get; private set; }
|
|
107
|
+
public ReportType Type { get; private set; }
|
|
108
|
+
public OutputFormat Format { get; private set; }
|
|
109
|
+
public string CronExpression { get; private set; }
|
|
110
|
+
public ReportStatus Status { get; private set; }
|
|
111
|
+
public List<string> Recipients { get; private set; }
|
|
112
|
+
public DateTime? LastExecutedAt { get; private set; }
|
|
113
|
+
public DateTime? NextExecutionAt { get; private set; }
|
|
114
|
+
public DateTime CreatedAt { get; private set; }
|
|
115
|
+
public DateTime? UpdatedAt { get; private set; }
|
|
116
|
+
public bool IsDeleted { get; private set; }
|
|
117
|
+
|
|
118
|
+
// Navigation
|
|
119
|
+
public User User { get; private set; }
|
|
120
|
+
public ICollection<ReportExecution> Executions { get; private set; }
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### 4.2 Entidade: ReportExecution
|
|
125
|
+
|
|
126
|
+
```csharp
|
|
127
|
+
public class ReportExecution
|
|
128
|
+
{
|
|
129
|
+
public int Id { get; private set; }
|
|
130
|
+
public int ScheduledReportId { get; private set; }
|
|
131
|
+
public ExecutionStatus Status { get; private set; }
|
|
132
|
+
public DateTime StartedAt { get; private set; }
|
|
133
|
+
public DateTime? CompletedAt { get; private set; }
|
|
134
|
+
public string? FilePath { get; private set; }
|
|
135
|
+
public long? FileSizeBytes { get; private set; }
|
|
136
|
+
public string? ErrorMessage { get; private set; }
|
|
137
|
+
|
|
138
|
+
// Navigation
|
|
139
|
+
public ScheduledReport ScheduledReport { get; private set; }
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 4.3 Enums
|
|
144
|
+
|
|
145
|
+
```csharp
|
|
146
|
+
public enum ReportType { Sales, Inventory, Financial }
|
|
147
|
+
public enum OutputFormat { Pdf, Excel }
|
|
148
|
+
public enum ReportStatus { Active, Paused, Error }
|
|
149
|
+
public enum ExecutionStatus { Pending, Running, Completed, Failed }
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## 5. Arquitetura
|
|
155
|
+
|
|
156
|
+
### 5.1 Componentes
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
160
|
+
│ Blazor UI │
|
|
161
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
|
|
162
|
+
│ │ ReportList │ │ ReportForm │ │ ExecutionHistory │ │
|
|
163
|
+
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
|
|
164
|
+
└─────────────────────────────────────────────────────────────┘
|
|
165
|
+
│
|
|
166
|
+
▼
|
|
167
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
168
|
+
│ Application Layer │
|
|
169
|
+
│ ┌───────────────┐ ┌───────────────┐ ┌─────────────────┐ │
|
|
170
|
+
│ │ CreateReport │ │ ExecuteReport │ │ GetExecutions │ │
|
|
171
|
+
│ │ Handler │ │ Handler │ │ Handler │ │
|
|
172
|
+
│ └───────────────┘ └───────────────┘ └─────────────────┘ │
|
|
173
|
+
└─────────────────────────────────────────────────────────────┘
|
|
174
|
+
│
|
|
175
|
+
▼
|
|
176
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
177
|
+
│ Infrastructure │
|
|
178
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
|
|
179
|
+
│ │ Hangfire │ │ Blob Storage│ │ Email Service │ │
|
|
180
|
+
│ │ Jobs │ │ │ │ │ │
|
|
181
|
+
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
|
|
182
|
+
└─────────────────────────────────────────────────────────────┘
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### 5.2 Fluxo de Execução
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
1. Hangfire dispara job baseado em CRON
|
|
189
|
+
2. Job carrega config do relatório
|
|
190
|
+
3. Job chama ReportGenerator.Generate()
|
|
191
|
+
4. Arquivo é salvo em Blob Storage
|
|
192
|
+
5. EmailService envia notificação
|
|
193
|
+
6. ReportExecution é registrado
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 6. API/Commands
|
|
199
|
+
|
|
200
|
+
### 6.1 Commands
|
|
201
|
+
|
|
202
|
+
| Command | Descrição |
|
|
203
|
+
|---------|-----------|
|
|
204
|
+
| `CreateScheduledReportCommand` | Criar novo relatório |
|
|
205
|
+
| `UpdateScheduledReportCommand` | Atualizar relatório |
|
|
206
|
+
| `DeleteScheduledReportCommand` | Soft delete |
|
|
207
|
+
| `ExecuteReportCommand` | Execução manual |
|
|
208
|
+
| `PauseReportCommand` | Pausar agendamento |
|
|
209
|
+
| `ResumeReportCommand` | Retomar agendamento |
|
|
210
|
+
|
|
211
|
+
### 6.2 Queries
|
|
212
|
+
|
|
213
|
+
| Query | Descrição |
|
|
214
|
+
|-------|-----------|
|
|
215
|
+
| `GetScheduledReportByIdQuery` | Buscar por ID |
|
|
216
|
+
| `GetScheduledReportsQuery` | Listar com paginação |
|
|
217
|
+
| `GetReportExecutionsQuery` | Histórico de execuções |
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## 7. Dependências
|
|
222
|
+
|
|
223
|
+
### 7.1 NuGet Packages
|
|
224
|
+
- `Hangfire.Core` - Background jobs
|
|
225
|
+
- `Hangfire.SqlServer` - Storage para Hangfire
|
|
226
|
+
- `QuestPDF` - Geração de PDF
|
|
227
|
+
- `ClosedXML` - Geração de Excel
|
|
228
|
+
- `Azure.Storage.Blobs` - Blob storage
|
|
229
|
+
|
|
230
|
+
### 7.2 Serviços Externos
|
|
231
|
+
- Azure Blob Storage (arquivos gerados)
|
|
232
|
+
- SendGrid ou SMTP (emails)
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## 8. Edge Cases
|
|
237
|
+
|
|
238
|
+
| Cenário | Comportamento |
|
|
239
|
+
|---------|---------------|
|
|
240
|
+
| Job falha no meio | Status = Error, retry em 5 min (max 3x) |
|
|
241
|
+
| Email inválido | Log warning, continua com outros |
|
|
242
|
+
| Blob storage offline | Status = Error, retry |
|
|
243
|
+
| Relatório sem dados | Gera arquivo vazio com mensagem |
|
|
244
|
+
| Usuário deleta enquanto job roda | Job completa, não envia email |
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## 9. Validações
|
|
249
|
+
|
|
250
|
+
| Campo | Regras |
|
|
251
|
+
|-------|--------|
|
|
252
|
+
| Name | Required, 3-100 chars |
|
|
253
|
+
| CronExpression | Valid CRON, mínimo 1h entre execuções |
|
|
254
|
+
| Recipients | 1-10 emails válidos |
|
|
255
|
+
| Format | Enum válido |
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## 10. Aprovações
|
|
260
|
+
|
|
261
|
+
- [x] **Requisitos:** Aprovados em 2024-01-15
|
|
262
|
+
- [x] **Modelo de Dados:** Aprovado em 2024-01-15
|
|
263
|
+
- [x] **Arquitetura:** Aprovada em 2024-01-15
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
_Gerado por MORPH-SPEC Framework_
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "3.0.0",
|
|
3
|
+
"project": {
|
|
4
|
+
"name": "FishArt",
|
|
5
|
+
"type": "blazor-server",
|
|
6
|
+
"createdAt": "2024-01-15T10:00:00Z",
|
|
7
|
+
"updatedAt": "2024-01-15T14:30:00Z"
|
|
8
|
+
},
|
|
9
|
+
"features": {
|
|
10
|
+
"scheduled-reports": {
|
|
11
|
+
"status": "in_progress",
|
|
12
|
+
"phase": "implement",
|
|
13
|
+
"activeAgents": [
|
|
14
|
+
"standards-architect",
|
|
15
|
+
"blazor-builder",
|
|
16
|
+
"ef-modeler",
|
|
17
|
+
"hangfire-orchestrator"
|
|
18
|
+
],
|
|
19
|
+
"tasks": [
|
|
20
|
+
{
|
|
21
|
+
"id": "T001",
|
|
22
|
+
"title": "Create ScheduledReport entity",
|
|
23
|
+
"status": "completed",
|
|
24
|
+
"completedAt": "2024-01-15T10:30:00Z",
|
|
25
|
+
"completedBy": "claude",
|
|
26
|
+
"dependencies": [],
|
|
27
|
+
"files": [
|
|
28
|
+
"Domain/Entities/ScheduledReport.cs",
|
|
29
|
+
"Infrastructure/Persistence/Config/ScheduledReportConfig.cs"
|
|
30
|
+
],
|
|
31
|
+
"checkpoint": "CHECKPOINT_001"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "T002",
|
|
35
|
+
"title": "Create CreateReportCommand + Handler",
|
|
36
|
+
"status": "completed",
|
|
37
|
+
"completedAt": "2024-01-15T11:15:00Z",
|
|
38
|
+
"completedBy": "claude",
|
|
39
|
+
"dependencies": ["T001"],
|
|
40
|
+
"files": [
|
|
41
|
+
"Application/Commands/CreateReport/CreateReportCommand.cs",
|
|
42
|
+
"Application/Commands/CreateReport/CreateReportHandler.cs"
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": "T003",
|
|
47
|
+
"title": "Create Hangfire job for report generation",
|
|
48
|
+
"status": "completed",
|
|
49
|
+
"completedAt": "2024-01-15T12:00:00Z",
|
|
50
|
+
"completedBy": "claude",
|
|
51
|
+
"dependencies": ["T002"],
|
|
52
|
+
"files": [
|
|
53
|
+
"Infrastructure/Jobs/GenerateReportJob.cs"
|
|
54
|
+
],
|
|
55
|
+
"checkpoint": "CHECKPOINT_002"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "T004",
|
|
59
|
+
"title": "Create ReportList component (Blazor)",
|
|
60
|
+
"status": "in_progress",
|
|
61
|
+
"startedAt": "2024-01-15T13:00:00Z",
|
|
62
|
+
"dependencies": ["T001"],
|
|
63
|
+
"files": [
|
|
64
|
+
"Components/Reports/ReportList.razor",
|
|
65
|
+
"Components/Reports/ReportList.razor.cs",
|
|
66
|
+
"Components/Reports/ReportList.razor.css"
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"id": "T005",
|
|
71
|
+
"title": "Create CreateReportForm component (Blazor)",
|
|
72
|
+
"status": "pending",
|
|
73
|
+
"dependencies": ["T002"],
|
|
74
|
+
"files": [
|
|
75
|
+
"Components/Reports/CreateReportForm.razor",
|
|
76
|
+
"Components/Reports/CreateReportForm.razor.cs",
|
|
77
|
+
"Components/Reports/CreateReportForm.razor.css"
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "T006",
|
|
82
|
+
"title": "Create API controller for reports",
|
|
83
|
+
"status": "pending",
|
|
84
|
+
"dependencies": ["T002"],
|
|
85
|
+
"files": [
|
|
86
|
+
"API/Controllers/ReportsController.cs"
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"id": "T007",
|
|
91
|
+
"title": "Add Hangfire dashboard configuration",
|
|
92
|
+
"status": "pending",
|
|
93
|
+
"dependencies": ["T003"],
|
|
94
|
+
"files": [
|
|
95
|
+
"Program.cs"
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"id": "T008",
|
|
100
|
+
"title": "Create unit tests for CreateReportCommand",
|
|
101
|
+
"status": "pending",
|
|
102
|
+
"dependencies": ["T002"],
|
|
103
|
+
"files": [
|
|
104
|
+
"Tests/Application/Commands/CreateReportCommandTests.cs"
|
|
105
|
+
]
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"id": "T009",
|
|
109
|
+
"title": "Create integration tests for report generation",
|
|
110
|
+
"status": "pending",
|
|
111
|
+
"dependencies": ["T003", "T006"],
|
|
112
|
+
"files": [
|
|
113
|
+
"Tests/Integration/ReportGenerationTests.cs"
|
|
114
|
+
],
|
|
115
|
+
"checkpoint": "CHECKPOINT_003"
|
|
116
|
+
}
|
|
117
|
+
],
|
|
118
|
+
"progress": {
|
|
119
|
+
"total": 9,
|
|
120
|
+
"completed": 3,
|
|
121
|
+
"inProgress": 1,
|
|
122
|
+
"pending": 5,
|
|
123
|
+
"percentage": 33
|
|
124
|
+
},
|
|
125
|
+
"checkpoints": [
|
|
126
|
+
{
|
|
127
|
+
"id": "CHECKPOINT_001",
|
|
128
|
+
"timestamp": "2024-01-15T10:30:00Z",
|
|
129
|
+
"tasksCompleted": ["T001"],
|
|
130
|
+
"note": "Checkpoint: Create ScheduledReport entity"
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"id": "CHECKPOINT_002",
|
|
134
|
+
"timestamp": "2024-01-15T12:00:00Z",
|
|
135
|
+
"tasksCompleted": ["T003"],
|
|
136
|
+
"note": "Checkpoint: Create Hangfire job for report generation"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"id": "CHECKPOINT_AUTO_1705326000000",
|
|
140
|
+
"timestamp": "2024-01-15T12:00:00Z",
|
|
141
|
+
"tasksCompleted": ["T001", "T002", "T003"],
|
|
142
|
+
"note": "Auto-checkpoint: 3 tasks completed"
|
|
143
|
+
}
|
|
144
|
+
],
|
|
145
|
+
"outputs": {
|
|
146
|
+
"proposal": {
|
|
147
|
+
"created": true,
|
|
148
|
+
"path": ".morph/project/outputs/scheduled-reports/proposal.md"
|
|
149
|
+
},
|
|
150
|
+
"spec": {
|
|
151
|
+
"created": true,
|
|
152
|
+
"path": ".morph/project/outputs/scheduled-reports/spec.md"
|
|
153
|
+
},
|
|
154
|
+
"contracts": {
|
|
155
|
+
"created": true,
|
|
156
|
+
"path": ".morph/project/outputs/scheduled-reports/contracts.cs"
|
|
157
|
+
},
|
|
158
|
+
"ui-spec": {
|
|
159
|
+
"created": true,
|
|
160
|
+
"path": ".morph/project/outputs/scheduled-reports/ui-spec.md"
|
|
161
|
+
},
|
|
162
|
+
"tasks": {
|
|
163
|
+
"created": true,
|
|
164
|
+
"note": "Tasks are now inline in state.json (schema 3.0.0)"
|
|
165
|
+
},
|
|
166
|
+
"decisions": {
|
|
167
|
+
"created": true,
|
|
168
|
+
"path": ".morph/project/outputs/scheduled-reports/decisions.md"
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
"costs": {
|
|
172
|
+
"estimated": 5.50,
|
|
173
|
+
"approved": true,
|
|
174
|
+
"breakdown": {
|
|
175
|
+
"hangfire": 0,
|
|
176
|
+
"storage": 0.02,
|
|
177
|
+
"sql": 4.99,
|
|
178
|
+
"containerApp": 0.49
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
"metadata": {
|
|
184
|
+
"totalFeatures": 1,
|
|
185
|
+
"completedFeatures": 0,
|
|
186
|
+
"totalCostEstimated": 5.50
|
|
187
|
+
}
|
|
188
|
+
}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
# Features em Desenvolvimento
|
|
2
|
-
|
|
3
|
-
Esta pasta contém as features ATIVAS em desenvolvimento.
|
|
4
|
-
|
|
5
|
-
## Estrutura
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
features/
|
|
9
|
-
└── {feature-name}/
|
|
10
|
-
├── proposal.md # Proposta (por que e o quê)
|
|
11
|
-
├── spec.md # Especificação técnica
|
|
12
|
-
├── tasks.md # Checklist de implementação
|
|
13
|
-
├── contracts.cs # Interfaces e DTOs
|
|
14
|
-
├── decisions.md # ADRs
|
|
15
|
-
└── recap.md # Resumo pós-implementação
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Workflow
|
|
19
|
-
|
|
20
|
-
1. `/morph-proposal {feature}` - Criar nova feature
|
|
21
|
-
2. Revisar e aprovar proposal
|
|
22
|
-
3. `/morph-apply {feature}` - Implementar
|
|
23
|
-
4. `/morph-archive {feature}` - Arquivar quando concluída
|
|
24
|
-
|
|
25
|
-
*Gerado pelo MORPH Framework*
|
|
1
|
+
# Features em Desenvolvimento
|
|
2
|
+
|
|
3
|
+
Esta pasta contém as features ATIVAS em desenvolvimento.
|
|
4
|
+
|
|
5
|
+
## Estrutura
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
features/
|
|
9
|
+
└── {feature-name}/
|
|
10
|
+
├── proposal.md # Proposta (por que e o quê)
|
|
11
|
+
├── spec.md # Especificação técnica
|
|
12
|
+
├── tasks.md # Checklist de implementação
|
|
13
|
+
├── contracts.cs # Interfaces e DTOs
|
|
14
|
+
├── decisions.md # ADRs
|
|
15
|
+
└── recap.md # Resumo pós-implementação
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Workflow
|
|
19
|
+
|
|
20
|
+
1. `/morph-proposal {feature}` - Criar nova feature
|
|
21
|
+
2. Revisar e aprovar proposal
|
|
22
|
+
3. `/morph-apply {feature}` - Implementar
|
|
23
|
+
4. `/morph-archive {feature}` - Arquivar quando concluída
|
|
24
|
+
|
|
25
|
+
*Gerado pelo MORPH Framework*
|