@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,236 +1,236 @@
|
|
|
1
|
-
# Micro-SaaS - Especificação
|
|
2
|
-
|
|
3
|
-
## 1. Visão Geral
|
|
4
|
-
|
|
5
|
-
Sistema Micro-SaaS multi-tenant com gestão de assinaturas e billing integrado via Asaas.
|
|
6
|
-
|
|
7
|
-
### 1.1 Objetivos
|
|
8
|
-
|
|
9
|
-
- Permitir criação de tenants isolados
|
|
10
|
-
- Gerenciar assinaturas e pagamentos
|
|
11
|
-
- Fornecer dashboard administrativo por tenant
|
|
12
|
-
- Escalar de forma econômica (scale-to-zero)
|
|
13
|
-
|
|
14
|
-
### 1.2 Personas
|
|
15
|
-
|
|
16
|
-
| Persona | Descrição |
|
|
17
|
-
|---------|-----------|
|
|
18
|
-
| **Tenant Owner** | Cria e administra o tenant |
|
|
19
|
-
| **Tenant Admin** | Gerencia usuários e configurações |
|
|
20
|
-
| **Tenant Member** | Usuário regular do sistema |
|
|
21
|
-
| **Platform Admin** | Administrador da plataforma (super admin) |
|
|
22
|
-
|
|
23
|
-
## 2. Requisitos Funcionais
|
|
24
|
-
|
|
25
|
-
### 2.1 Autenticação & Autorização
|
|
26
|
-
|
|
27
|
-
| ID | Requisito |
|
|
28
|
-
|----|-----------|
|
|
29
|
-
| AUTH-001 | Login via Clerk (email, Google, Microsoft) |
|
|
30
|
-
| AUTH-002 | Criação automática de tenant no primeiro login |
|
|
31
|
-
| AUTH-003 | Convite de usuários para tenant existente |
|
|
32
|
-
| AUTH-004 | Roles: Owner, Admin, Member, Viewer |
|
|
33
|
-
| AUTH-005 | Permissões granulares por role |
|
|
34
|
-
|
|
35
|
-
### 2.2 Multi-Tenancy
|
|
36
|
-
|
|
37
|
-
| ID | Requisito |
|
|
38
|
-
|----|-----------|
|
|
39
|
-
| MT-001 | Isolamento completo de dados por tenant |
|
|
40
|
-
| MT-002 | Subdomínio customizado (acme.app.com) |
|
|
41
|
-
| MT-003 | Domínio customizado opcional |
|
|
42
|
-
| MT-004 | Configurações independentes por tenant |
|
|
43
|
-
| MT-005 | Branding básico (logo, cores) |
|
|
44
|
-
|
|
45
|
-
### 2.3 Subscription & Billing
|
|
46
|
-
|
|
47
|
-
| ID | Requisito |
|
|
48
|
-
|----|-----------|
|
|
49
|
-
| SUB-001 | Planos: Free, Starter, Pro, Enterprise |
|
|
50
|
-
| SUB-002 | Ciclos: Mensal e Anual |
|
|
51
|
-
| SUB-003 | Métodos: PIX, Boleto, Cartão de Crédito |
|
|
52
|
-
| SUB-004 | Trial period de 14 dias |
|
|
53
|
-
| SUB-005 | Upgrade/Downgrade de plano |
|
|
54
|
-
| SUB-006 | Cancelamento com período de carência |
|
|
55
|
-
| SUB-007 | Webhooks Asaas para status de pagamento |
|
|
56
|
-
|
|
57
|
-
### 2.4 Dashboard
|
|
58
|
-
|
|
59
|
-
| ID | Requisito |
|
|
60
|
-
|----|-----------|
|
|
61
|
-
| DASH-001 | Overview com métricas principais |
|
|
62
|
-
| DASH-002 | Gestão de usuários do tenant |
|
|
63
|
-
| DASH-003 | Histórico de pagamentos |
|
|
64
|
-
| DASH-004 | Configurações do tenant |
|
|
65
|
-
| DASH-005 | Upgrade de plano |
|
|
66
|
-
|
|
67
|
-
## 3. Requisitos Não-Funcionais
|
|
68
|
-
|
|
69
|
-
### 3.1 Performance
|
|
70
|
-
|
|
71
|
-
| ID | Requisito |
|
|
72
|
-
|----|-----------|
|
|
73
|
-
| PERF-001 | Tempo de resposta < 200ms (P95) |
|
|
74
|
-
| PERF-002 | Scale-to-zero quando inativo |
|
|
75
|
-
| PERF-003 | Auto-scaling até 10 instâncias |
|
|
76
|
-
|
|
77
|
-
### 3.2 Segurança
|
|
78
|
-
|
|
79
|
-
| ID | Requisito |
|
|
80
|
-
|----|-----------|
|
|
81
|
-
| SEC-001 | HTTPS obrigatório |
|
|
82
|
-
| SEC-002 | Validação de webhook signature |
|
|
83
|
-
| SEC-003 | Rate limiting por tenant |
|
|
84
|
-
| SEC-004 | Audit log de ações críticas |
|
|
85
|
-
|
|
86
|
-
### 3.3 Disponibilidade
|
|
87
|
-
|
|
88
|
-
| ID | Requisito |
|
|
89
|
-
|----|-----------|
|
|
90
|
-
| AVAIL-001 | SLA 99.5% |
|
|
91
|
-
| AVAIL-002 | Health checks ativos |
|
|
92
|
-
| AVAIL-003 | Retry automático em falhas |
|
|
93
|
-
|
|
94
|
-
## 4. Planos e Limites
|
|
95
|
-
|
|
96
|
-
| Feature | Free | Starter | Pro | Enterprise |
|
|
97
|
-
|---------|------|---------|-----|------------|
|
|
98
|
-
| Usuários | 2 | 5 | 20 | Ilimitado |
|
|
99
|
-
| Storage | 100MB | 1GB | 10GB | 100GB |
|
|
100
|
-
| API Requests/mês | 1K | 10K | 100K | Ilimitado |
|
|
101
|
-
| Suporte | Community | Email | Priority | Dedicated |
|
|
102
|
-
| Preço/mês | R$0 | R$49 | R$149 | R$499 |
|
|
103
|
-
|
|
104
|
-
## 5. Integrações
|
|
105
|
-
|
|
106
|
-
### 5.1 Asaas
|
|
107
|
-
|
|
108
|
-
- Customer management
|
|
109
|
-
- Subscription lifecycle
|
|
110
|
-
- Payment processing
|
|
111
|
-
- Webhook handling
|
|
112
|
-
|
|
113
|
-
### 5.2 Clerk
|
|
114
|
-
|
|
115
|
-
- User authentication
|
|
116
|
-
- Session management
|
|
117
|
-
- Organization (tenant) mapping
|
|
118
|
-
|
|
119
|
-
## 6. Arquitetura
|
|
120
|
-
|
|
121
|
-
### 6.1 Componentes
|
|
122
|
-
|
|
123
|
-
```
|
|
124
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
125
|
-
│ Blazor Server │
|
|
126
|
-
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
|
|
127
|
-
│ │ Pages │ │ Components │ │ Services │ │
|
|
128
|
-
│ │ /dashboard │ │ NavMenu │ │ TenantContext │ │
|
|
129
|
-
│ │ /settings │ │ DataGrid │ │ SubscriptionService │ │
|
|
130
|
-
│ │ /billing │ │ Charts │ │ UserService │ │
|
|
131
|
-
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
|
|
132
|
-
└─────────────────────────────────────────────────────────────┘
|
|
133
|
-
│
|
|
134
|
-
▼
|
|
135
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
136
|
-
│ Application Layer │
|
|
137
|
-
│ ┌─────────────────────────────────────────────────────┐ │
|
|
138
|
-
│ │ Commands: CreateTenant, InviteUser, ChangePlan │ │
|
|
139
|
-
│ │ Queries: GetDashboard, GetUsers, GetPayments │ │
|
|
140
|
-
│ └─────────────────────────────────────────────────────┘ │
|
|
141
|
-
└─────────────────────────────────────────────────────────────┘
|
|
142
|
-
│
|
|
143
|
-
▼
|
|
144
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
145
|
-
│ Infrastructure │
|
|
146
|
-
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
|
|
147
|
-
│ │ EF Core │ │ Asaas │ │ Clerk │ │
|
|
148
|
-
│ │ Repository │ │ Client │ │ Integration │ │
|
|
149
|
-
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
|
|
150
|
-
└─────────────────────────────────────────────────────────────┘
|
|
151
|
-
│
|
|
152
|
-
▼
|
|
153
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
154
|
-
│ SQL Database │ Azure Storage │ Key Vault (secrets) │
|
|
155
|
-
└─────────────────────────────────────────────────────────────┘
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### 6.2 Tenant Resolution
|
|
159
|
-
|
|
160
|
-
1. Subdomínio: `{tenant}.app.com`
|
|
161
|
-
2. Header: `X-Tenant-ID`
|
|
162
|
-
3. Route: `/tenant/{slug}/...`
|
|
163
|
-
4. Claim: JWT tenant_id
|
|
164
|
-
|
|
165
|
-
## 7. Modelo de Dados
|
|
166
|
-
|
|
167
|
-
### 7.1 Entidades Principais
|
|
168
|
-
|
|
169
|
-
```
|
|
170
|
-
Tenant
|
|
171
|
-
├── Id (int)
|
|
172
|
-
├── Name (string)
|
|
173
|
-
├── Slug (string) [unique]
|
|
174
|
-
├── Status (Active, Suspended, Deleted)
|
|
175
|
-
├── AsaasCustomerId (string)
|
|
176
|
-
├── CurrentSubscription → Subscription
|
|
177
|
-
└── Users → TenantUser[]
|
|
178
|
-
|
|
179
|
-
TenantUser
|
|
180
|
-
├── Id (int)
|
|
181
|
-
├── TenantId → Tenant
|
|
182
|
-
├── ExternalUserId (string) [Clerk ID]
|
|
183
|
-
├── Email (string)
|
|
184
|
-
├── Role (Owner, Admin, Member, Viewer)
|
|
185
|
-
└── Status (Pending, Active, Inactive)
|
|
186
|
-
|
|
187
|
-
Plan
|
|
188
|
-
├── Id (int)
|
|
189
|
-
├── Name (string)
|
|
190
|
-
├── PriceMonthly (decimal)
|
|
191
|
-
├── PriceYearly (decimal)
|
|
192
|
-
├── Features (JSON)
|
|
193
|
-
└── Limits (JSON)
|
|
194
|
-
|
|
195
|
-
Subscription
|
|
196
|
-
├── Id (int)
|
|
197
|
-
├── TenantId → Tenant
|
|
198
|
-
├── PlanId → Plan
|
|
199
|
-
├── AsaasSubscriptionId (string)
|
|
200
|
-
├── Status (Trial, Active, PastDue, Canceled)
|
|
201
|
-
├── BillingCycle (Monthly, Yearly)
|
|
202
|
-
├── CurrentPeriodStart (DateTime)
|
|
203
|
-
└── CurrentPeriodEnd (DateTime)
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
## 8. APIs
|
|
207
|
-
|
|
208
|
-
### 8.1 Tenant Management
|
|
209
|
-
|
|
210
|
-
| Endpoint | Method | Descrição |
|
|
211
|
-
|----------|--------|-----------|
|
|
212
|
-
| `/api/tenants` | POST | Criar tenant |
|
|
213
|
-
| `/api/tenants/{id}` | GET | Obter tenant |
|
|
214
|
-
| `/api/tenants/{id}` | PUT | Atualizar tenant |
|
|
215
|
-
| `/api/tenants/{id}/users` | GET | Listar usuários |
|
|
216
|
-
| `/api/tenants/{id}/users` | POST | Convidar usuário |
|
|
217
|
-
|
|
218
|
-
### 8.2 Subscription
|
|
219
|
-
|
|
220
|
-
| Endpoint | Method | Descrição |
|
|
221
|
-
|----------|--------|-----------|
|
|
222
|
-
| `/api/subscriptions` | POST | Criar subscription |
|
|
223
|
-
| `/api/subscriptions/{id}` | GET | Obter subscription |
|
|
224
|
-
| `/api/subscriptions/{id}/upgrade` | POST | Upgrade de plano |
|
|
225
|
-
| `/api/subscriptions/{id}/cancel` | POST | Cancelar |
|
|
226
|
-
|
|
227
|
-
### 8.3 Webhooks
|
|
228
|
-
|
|
229
|
-
| Endpoint | Method | Descrição |
|
|
230
|
-
|----------|--------|-----------|
|
|
231
|
-
| `/webhooks/asaas` | POST | Eventos Asaas |
|
|
232
|
-
| `/webhooks/clerk` | POST | Eventos Clerk |
|
|
233
|
-
|
|
234
|
-
---
|
|
235
|
-
|
|
236
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
1
|
+
# Micro-SaaS - Especificação
|
|
2
|
+
|
|
3
|
+
## 1. Visão Geral
|
|
4
|
+
|
|
5
|
+
Sistema Micro-SaaS multi-tenant com gestão de assinaturas e billing integrado via Asaas.
|
|
6
|
+
|
|
7
|
+
### 1.1 Objetivos
|
|
8
|
+
|
|
9
|
+
- Permitir criação de tenants isolados
|
|
10
|
+
- Gerenciar assinaturas e pagamentos
|
|
11
|
+
- Fornecer dashboard administrativo por tenant
|
|
12
|
+
- Escalar de forma econômica (scale-to-zero)
|
|
13
|
+
|
|
14
|
+
### 1.2 Personas
|
|
15
|
+
|
|
16
|
+
| Persona | Descrição |
|
|
17
|
+
|---------|-----------|
|
|
18
|
+
| **Tenant Owner** | Cria e administra o tenant |
|
|
19
|
+
| **Tenant Admin** | Gerencia usuários e configurações |
|
|
20
|
+
| **Tenant Member** | Usuário regular do sistema |
|
|
21
|
+
| **Platform Admin** | Administrador da plataforma (super admin) |
|
|
22
|
+
|
|
23
|
+
## 2. Requisitos Funcionais
|
|
24
|
+
|
|
25
|
+
### 2.1 Autenticação & Autorização
|
|
26
|
+
|
|
27
|
+
| ID | Requisito |
|
|
28
|
+
|----|-----------|
|
|
29
|
+
| AUTH-001 | Login via Clerk (email, Google, Microsoft) |
|
|
30
|
+
| AUTH-002 | Criação automática de tenant no primeiro login |
|
|
31
|
+
| AUTH-003 | Convite de usuários para tenant existente |
|
|
32
|
+
| AUTH-004 | Roles: Owner, Admin, Member, Viewer |
|
|
33
|
+
| AUTH-005 | Permissões granulares por role |
|
|
34
|
+
|
|
35
|
+
### 2.2 Multi-Tenancy
|
|
36
|
+
|
|
37
|
+
| ID | Requisito |
|
|
38
|
+
|----|-----------|
|
|
39
|
+
| MT-001 | Isolamento completo de dados por tenant |
|
|
40
|
+
| MT-002 | Subdomínio customizado (acme.app.com) |
|
|
41
|
+
| MT-003 | Domínio customizado opcional |
|
|
42
|
+
| MT-004 | Configurações independentes por tenant |
|
|
43
|
+
| MT-005 | Branding básico (logo, cores) |
|
|
44
|
+
|
|
45
|
+
### 2.3 Subscription & Billing
|
|
46
|
+
|
|
47
|
+
| ID | Requisito |
|
|
48
|
+
|----|-----------|
|
|
49
|
+
| SUB-001 | Planos: Free, Starter, Pro, Enterprise |
|
|
50
|
+
| SUB-002 | Ciclos: Mensal e Anual |
|
|
51
|
+
| SUB-003 | Métodos: PIX, Boleto, Cartão de Crédito |
|
|
52
|
+
| SUB-004 | Trial period de 14 dias |
|
|
53
|
+
| SUB-005 | Upgrade/Downgrade de plano |
|
|
54
|
+
| SUB-006 | Cancelamento com período de carência |
|
|
55
|
+
| SUB-007 | Webhooks Asaas para status de pagamento |
|
|
56
|
+
|
|
57
|
+
### 2.4 Dashboard
|
|
58
|
+
|
|
59
|
+
| ID | Requisito |
|
|
60
|
+
|----|-----------|
|
|
61
|
+
| DASH-001 | Overview com métricas principais |
|
|
62
|
+
| DASH-002 | Gestão de usuários do tenant |
|
|
63
|
+
| DASH-003 | Histórico de pagamentos |
|
|
64
|
+
| DASH-004 | Configurações do tenant |
|
|
65
|
+
| DASH-005 | Upgrade de plano |
|
|
66
|
+
|
|
67
|
+
## 3. Requisitos Não-Funcionais
|
|
68
|
+
|
|
69
|
+
### 3.1 Performance
|
|
70
|
+
|
|
71
|
+
| ID | Requisito |
|
|
72
|
+
|----|-----------|
|
|
73
|
+
| PERF-001 | Tempo de resposta < 200ms (P95) |
|
|
74
|
+
| PERF-002 | Scale-to-zero quando inativo |
|
|
75
|
+
| PERF-003 | Auto-scaling até 10 instâncias |
|
|
76
|
+
|
|
77
|
+
### 3.2 Segurança
|
|
78
|
+
|
|
79
|
+
| ID | Requisito |
|
|
80
|
+
|----|-----------|
|
|
81
|
+
| SEC-001 | HTTPS obrigatório |
|
|
82
|
+
| SEC-002 | Validação de webhook signature |
|
|
83
|
+
| SEC-003 | Rate limiting por tenant |
|
|
84
|
+
| SEC-004 | Audit log de ações críticas |
|
|
85
|
+
|
|
86
|
+
### 3.3 Disponibilidade
|
|
87
|
+
|
|
88
|
+
| ID | Requisito |
|
|
89
|
+
|----|-----------|
|
|
90
|
+
| AVAIL-001 | SLA 99.5% |
|
|
91
|
+
| AVAIL-002 | Health checks ativos |
|
|
92
|
+
| AVAIL-003 | Retry automático em falhas |
|
|
93
|
+
|
|
94
|
+
## 4. Planos e Limites
|
|
95
|
+
|
|
96
|
+
| Feature | Free | Starter | Pro | Enterprise |
|
|
97
|
+
|---------|------|---------|-----|------------|
|
|
98
|
+
| Usuários | 2 | 5 | 20 | Ilimitado |
|
|
99
|
+
| Storage | 100MB | 1GB | 10GB | 100GB |
|
|
100
|
+
| API Requests/mês | 1K | 10K | 100K | Ilimitado |
|
|
101
|
+
| Suporte | Community | Email | Priority | Dedicated |
|
|
102
|
+
| Preço/mês | R$0 | R$49 | R$149 | R$499 |
|
|
103
|
+
|
|
104
|
+
## 5. Integrações
|
|
105
|
+
|
|
106
|
+
### 5.1 Asaas
|
|
107
|
+
|
|
108
|
+
- Customer management
|
|
109
|
+
- Subscription lifecycle
|
|
110
|
+
- Payment processing
|
|
111
|
+
- Webhook handling
|
|
112
|
+
|
|
113
|
+
### 5.2 Clerk
|
|
114
|
+
|
|
115
|
+
- User authentication
|
|
116
|
+
- Session management
|
|
117
|
+
- Organization (tenant) mapping
|
|
118
|
+
|
|
119
|
+
## 6. Arquitetura
|
|
120
|
+
|
|
121
|
+
### 6.1 Componentes
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
125
|
+
│ Blazor Server │
|
|
126
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
|
|
127
|
+
│ │ Pages │ │ Components │ │ Services │ │
|
|
128
|
+
│ │ /dashboard │ │ NavMenu │ │ TenantContext │ │
|
|
129
|
+
│ │ /settings │ │ DataGrid │ │ SubscriptionService │ │
|
|
130
|
+
│ │ /billing │ │ Charts │ │ UserService │ │
|
|
131
|
+
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
|
|
132
|
+
└─────────────────────────────────────────────────────────────┘
|
|
133
|
+
│
|
|
134
|
+
▼
|
|
135
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
136
|
+
│ Application Layer │
|
|
137
|
+
│ ┌─────────────────────────────────────────────────────┐ │
|
|
138
|
+
│ │ Commands: CreateTenant, InviteUser, ChangePlan │ │
|
|
139
|
+
│ │ Queries: GetDashboard, GetUsers, GetPayments │ │
|
|
140
|
+
│ └─────────────────────────────────────────────────────┘ │
|
|
141
|
+
└─────────────────────────────────────────────────────────────┘
|
|
142
|
+
│
|
|
143
|
+
▼
|
|
144
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
145
|
+
│ Infrastructure │
|
|
146
|
+
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
|
|
147
|
+
│ │ EF Core │ │ Asaas │ │ Clerk │ │
|
|
148
|
+
│ │ Repository │ │ Client │ │ Integration │ │
|
|
149
|
+
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
|
|
150
|
+
└─────────────────────────────────────────────────────────────┘
|
|
151
|
+
│
|
|
152
|
+
▼
|
|
153
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
154
|
+
│ SQL Database │ Azure Storage │ Key Vault (secrets) │
|
|
155
|
+
└─────────────────────────────────────────────────────────────┘
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### 6.2 Tenant Resolution
|
|
159
|
+
|
|
160
|
+
1. Subdomínio: `{tenant}.app.com`
|
|
161
|
+
2. Header: `X-Tenant-ID`
|
|
162
|
+
3. Route: `/tenant/{slug}/...`
|
|
163
|
+
4. Claim: JWT tenant_id
|
|
164
|
+
|
|
165
|
+
## 7. Modelo de Dados
|
|
166
|
+
|
|
167
|
+
### 7.1 Entidades Principais
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
Tenant
|
|
171
|
+
├── Id (int)
|
|
172
|
+
├── Name (string)
|
|
173
|
+
├── Slug (string) [unique]
|
|
174
|
+
├── Status (Active, Suspended, Deleted)
|
|
175
|
+
├── AsaasCustomerId (string)
|
|
176
|
+
├── CurrentSubscription → Subscription
|
|
177
|
+
└── Users → TenantUser[]
|
|
178
|
+
|
|
179
|
+
TenantUser
|
|
180
|
+
├── Id (int)
|
|
181
|
+
├── TenantId → Tenant
|
|
182
|
+
├── ExternalUserId (string) [Clerk ID]
|
|
183
|
+
├── Email (string)
|
|
184
|
+
├── Role (Owner, Admin, Member, Viewer)
|
|
185
|
+
└── Status (Pending, Active, Inactive)
|
|
186
|
+
|
|
187
|
+
Plan
|
|
188
|
+
├── Id (int)
|
|
189
|
+
├── Name (string)
|
|
190
|
+
├── PriceMonthly (decimal)
|
|
191
|
+
├── PriceYearly (decimal)
|
|
192
|
+
├── Features (JSON)
|
|
193
|
+
└── Limits (JSON)
|
|
194
|
+
|
|
195
|
+
Subscription
|
|
196
|
+
├── Id (int)
|
|
197
|
+
├── TenantId → Tenant
|
|
198
|
+
├── PlanId → Plan
|
|
199
|
+
├── AsaasSubscriptionId (string)
|
|
200
|
+
├── Status (Trial, Active, PastDue, Canceled)
|
|
201
|
+
├── BillingCycle (Monthly, Yearly)
|
|
202
|
+
├── CurrentPeriodStart (DateTime)
|
|
203
|
+
└── CurrentPeriodEnd (DateTime)
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## 8. APIs
|
|
207
|
+
|
|
208
|
+
### 8.1 Tenant Management
|
|
209
|
+
|
|
210
|
+
| Endpoint | Method | Descrição |
|
|
211
|
+
|----------|--------|-----------|
|
|
212
|
+
| `/api/tenants` | POST | Criar tenant |
|
|
213
|
+
| `/api/tenants/{id}` | GET | Obter tenant |
|
|
214
|
+
| `/api/tenants/{id}` | PUT | Atualizar tenant |
|
|
215
|
+
| `/api/tenants/{id}/users` | GET | Listar usuários |
|
|
216
|
+
| `/api/tenants/{id}/users` | POST | Convidar usuário |
|
|
217
|
+
|
|
218
|
+
### 8.2 Subscription
|
|
219
|
+
|
|
220
|
+
| Endpoint | Method | Descrição |
|
|
221
|
+
|----------|--------|-----------|
|
|
222
|
+
| `/api/subscriptions` | POST | Criar subscription |
|
|
223
|
+
| `/api/subscriptions/{id}` | GET | Obter subscription |
|
|
224
|
+
| `/api/subscriptions/{id}/upgrade` | POST | Upgrade de plano |
|
|
225
|
+
| `/api/subscriptions/{id}/cancel` | POST | Cancelar |
|
|
226
|
+
|
|
227
|
+
### 8.3 Webhooks
|
|
228
|
+
|
|
229
|
+
| Endpoint | Method | Descrição |
|
|
230
|
+
|----------|--------|-----------|
|
|
231
|
+
| `/webhooks/asaas` | POST | Eventos Asaas |
|
|
232
|
+
| `/webhooks/clerk` | POST | Eventos Clerk |
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
*MORPH-SPEC by Polymorphism Tech*
|