@polymorphism-tech/morph-spec 2.3.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 +446 -1730
- package/README.md +515 -516
- package/bin/morph-spec.js +366 -294
- package/bin/task-manager.js +429 -368
- package/bin/validate.js +369 -268
- package/content/.claude/commands/morph-apply.md +221 -158
- package/content/.claude/commands/morph-deploy.md +529 -0
- 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/skills/infra/azure-deploy-specialist.md +699 -0
- package/content/.claude/skills/level-0-meta/README.md +7 -0
- package/content/.claude/skills/level-0-meta/code-review.md +226 -0
- package/content/.claude/skills/level-0-meta/morph-checklist.md +117 -0
- package/content/.claude/skills/level-0-meta/simulation-checklist.md +77 -0
- package/content/.claude/skills/level-1-workflows/README.md +7 -0
- package/content/.claude/skills/level-1-workflows/morph-replicate.md +213 -0
- package/content/.claude/{commands/morph-clarify.md → skills/level-1-workflows/phase-clarify.md} +131 -184
- package/content/.claude/{commands/morph-design.md → skills/level-1-workflows/phase-design.md} +213 -275
- package/content/.claude/skills/level-1-workflows/phase-setup.md +106 -0
- package/content/.claude/skills/level-1-workflows/phase-tasks.md +164 -0
- package/content/.claude/{commands/morph-uiux.md → skills/level-1-workflows/phase-uiux.md} +169 -211
- package/content/.claude/skills/level-2-domains/README.md +14 -0
- package/content/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +192 -0
- package/content/.claude/skills/{specialists → level-2-domains/architecture}/po-pm-advisor.md +197 -197
- package/content/.claude/skills/level-2-domains/architecture/standards-architect.md +156 -0
- package/content/.claude/skills/level-2-domains/backend/dotnet-senior.md +287 -0
- package/content/.claude/skills/level-2-domains/backend/ef-modeler.md +113 -0
- package/content/.claude/skills/level-2-domains/backend/hangfire-orchestrator.md +126 -0
- package/content/.claude/skills/level-2-domains/backend/ms-agent-expert.md +109 -0
- package/content/.claude/skills/level-2-domains/frontend/blazor-builder.md +210 -0
- package/content/.claude/skills/level-2-domains/frontend/nextjs-expert.md +154 -0
- package/content/.claude/skills/level-2-domains/frontend/ui-ux-designer.md +191 -0
- package/content/.claude/skills/{specialists → level-2-domains/infrastructure}/azure-architect.md +142 -142
- package/content/.claude/skills/level-2-domains/infrastructure/bicep-architect.md +126 -0
- package/content/.claude/skills/level-2-domains/infrastructure/container-specialist.md +131 -0
- package/content/.claude/skills/level-2-domains/infrastructure/devops-engineer.md +119 -0
- package/content/.claude/skills/level-2-domains/integrations/asaas-financial.md +130 -0
- package/content/.claude/skills/level-2-domains/integrations/azure-identity.md +142 -0
- package/content/.claude/skills/level-2-domains/integrations/clerk-auth.md +108 -0
- package/content/.claude/skills/level-2-domains/integrations/resend-email.md +119 -0
- package/content/.claude/skills/level-2-domains/quality/code-analyzer.md +235 -0
- package/content/.claude/skills/level-2-domains/quality/testing-specialist.md +126 -0
- 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/config/agents.json +762 -242
- package/content/.morph/config/config.template.json +122 -108
- package/content/.morph/docs/workflows/design-impl.md +37 -0
- package/content/.morph/docs/workflows/enforcement-pipeline.md +668 -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/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/hooks/README.md +348 -239
- package/content/.morph/hooks/pre-commit-agents.sh +24 -24
- package/content/.morph/hooks/task-completed.js +73 -0
- package/content/.morph/hooks/teammate-idle.js +68 -0
- package/content/.morph/schemas/tasks.schema.json +220 -0
- 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/agent-teams-workflow.md +474 -0
- package/content/.morph/standards/architecture.md +325 -325
- package/content/.morph/standards/azure.md +605 -379
- package/content/.morph/standards/dotnet10-migration.md +520 -494
- package/content/.morph/templates/CONTEXT-FEATURE.md +276 -0
- package/content/.morph/templates/CONTEXT.md +170 -0
- package/content/.morph/templates/agent.cs +163 -172
- package/content/.morph/templates/clarify-questions.md +159 -0
- 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/decisions.md +123 -106
- package/content/.morph/templates/infra/azure-pipelines-deploy.yml +480 -0
- package/content/.morph/templates/infra/deploy-checklist.md +426 -0
- package/content/.morph/templates/proposal.md +141 -155
- package/content/.morph/templates/recap.md +94 -105
- package/content/.morph/templates/simulation.md +353 -0
- package/content/.morph/templates/spec.md +149 -148
- package/content/.morph/templates/state.template.json +222 -222
- package/content/.morph/templates/tasks.md +257 -235
- package/content/.morph/templates/ui-components.md +362 -276
- package/content/CLAUDE.md +150 -442
- package/detectors/structure-detector.js +245 -250
- package/docs/README.md +144 -149
- package/docs/getting-started.md +301 -302
- package/docs/installation.md +361 -361
- package/docs/validation-checklist.md +265 -266
- package/package.json +80 -80
- package/src/commands/advance-phase.js +266 -0
- package/src/commands/analyze-blazor-concurrency.js +193 -0
- package/src/commands/deploy.js +780 -0
- package/src/commands/detect-agents.js +167 -0
- package/src/commands/doctor.js +356 -280
- package/src/commands/generate-context.js +40 -0
- 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/task.js +78 -75
- 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/context-generator.js +513 -0
- package/src/lib/continuous-validator.js +421 -440
- package/src/lib/css-validator.js +352 -0
- package/src/lib/decision-constraint-loader.js +109 -0
- package/src/lib/design-system-detector.js +187 -0
- package/src/lib/design-system-scaffolder.js +299 -0
- package/src/lib/hook-executor.js +256 -0
- package/src/lib/recap-generator.js +205 -0
- package/src/lib/spec-validator.js +258 -0
- package/src/lib/standards-context-injector.js +287 -0
- package/src/lib/state-manager.js +397 -340
- package/src/lib/team-orchestrator.js +322 -0
- package/src/lib/troubleshoot-grep.js +194 -0
- package/src/lib/troubleshoot-index.js +144 -0
- package/src/lib/validation-runner.js +283 -0
- package/src/lib/validators/contract-compliance-validator.js +273 -0
- package/src/lib/validators/design-system-validator.js +231 -0
- package/src/utils/file-copier.js +187 -139
- package/content/.claude/commands/morph-costs.md +0 -206
- package/content/.claude/commands/morph-setup.md +0 -100
- package/content/.claude/commands/morph-tasks.md +0 -319
- package/content/.claude/skills/infra/bicep-architect.md +0 -419
- package/content/.claude/skills/infra/container-specialist.md +0 -437
- package/content/.claude/skills/infra/devops-engineer.md +0 -405
- package/content/.claude/skills/integrations/asaas-financial.md +0 -333
- package/content/.claude/skills/integrations/azure-identity.md +0 -309
- package/content/.claude/skills/integrations/clerk-auth.md +0 -290
- package/content/.claude/skills/specialists/ai-system-architect.md +0 -604
- package/content/.claude/skills/specialists/cost-guardian.md +0 -110
- package/content/.claude/skills/specialists/ef-modeler.md +0 -211
- package/content/.claude/skills/specialists/hangfire-orchestrator.md +0 -255
- package/content/.claude/skills/specialists/ms-agent-expert.md +0 -263
- package/content/.claude/skills/specialists/standards-architect.md +0 -78
- package/content/.claude/skills/specialists/ui-ux-designer.md +0 -1100
- package/content/.claude/skills/stacks/dotnet-blazor.md +0 -606
- package/content/.claude/skills/stacks/dotnet-nextjs.md +0 -402
- 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,529 @@
|
|
|
1
|
+
# /morph-deploy - Azure Deployment Orchestrator
|
|
2
|
+
|
|
3
|
+
Orquestra deploy completo para Azure Container Apps seguindo playbook rigoroso baseado em licoes aprendidas.
|
|
4
|
+
|
|
5
|
+
## Uso
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/morph-deploy [environment] [options]
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Environments
|
|
12
|
+
|
|
13
|
+
| Environment | Descricao | Aprovacao |
|
|
14
|
+
|-------------|-----------|-----------|
|
|
15
|
+
| `dev` | Ambiente de desenvolvimento | Automatica se custo < $10/mes |
|
|
16
|
+
| `staging` | Ambiente de homologacao | Requer revisao de custos |
|
|
17
|
+
| `prod` | Ambiente de producao | Requer aprovacao explicita |
|
|
18
|
+
|
|
19
|
+
### Options
|
|
20
|
+
|
|
21
|
+
| Option | Descricao |
|
|
22
|
+
|--------|-----------|
|
|
23
|
+
| `--auto` | Modo automatico para CI/CD (sem pausas interativas) |
|
|
24
|
+
| `--skip-build` | Pular build Docker (usar imagem existente) |
|
|
25
|
+
| `--infra-only` | Apenas deploy de infra (Bicep) |
|
|
26
|
+
| `--app-only` | Apenas deploy de app (requer infra existente) |
|
|
27
|
+
| `--dry-run` | Validar sem executar deploy |
|
|
28
|
+
| `--rollback` | Fazer rollback para revisao anterior |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Workflow Completo
|
|
33
|
+
|
|
34
|
+
### FASE 0: ATIVAR AGENTE
|
|
35
|
+
|
|
36
|
+
1. Detectar e ativar `azure-deploy-specialist`:
|
|
37
|
+
```bash
|
|
38
|
+
npx morph-spec detect "deploy to {environment}"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
2. Carregar skill de `.claude/skills/infra/azure-deploy-specialist.md`
|
|
42
|
+
|
|
43
|
+
3. Confirmar ambiente de deploy:
|
|
44
|
+
```markdown
|
|
45
|
+
Ambiente detectado: {environment}
|
|
46
|
+
Correto? (sim/nao)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
### FASE 1: VALIDAR PRE-REQUISITOS
|
|
52
|
+
|
|
53
|
+
Executar verificacoes silenciosamente:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Azure CLI
|
|
57
|
+
az --version
|
|
58
|
+
|
|
59
|
+
# Login status
|
|
60
|
+
az account show
|
|
61
|
+
|
|
62
|
+
# Docker
|
|
63
|
+
docker info
|
|
64
|
+
|
|
65
|
+
# .NET
|
|
66
|
+
dotnet --version
|
|
67
|
+
|
|
68
|
+
# dotnet-ef
|
|
69
|
+
dotnet tool list --global | findstr "dotnet-ef"
|
|
70
|
+
|
|
71
|
+
# Projeto compila
|
|
72
|
+
dotnet build
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Se algum check falhar:**
|
|
76
|
+
```markdown
|
|
77
|
+
## Pre-requisitos Faltando
|
|
78
|
+
|
|
79
|
+
- Azure CLI: https://aka.ms/installazurecliwindows
|
|
80
|
+
- Docker: Iniciar Docker Desktop
|
|
81
|
+
- dotnet-ef: `dotnet tool install --global dotnet-ef`
|
|
82
|
+
|
|
83
|
+
Resolver e tentar novamente.
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Confirmar subscription:**
|
|
87
|
+
```markdown
|
|
88
|
+
Subscription detectada: {name} ({id})
|
|
89
|
+
Esta correto? (sim/nao)
|
|
90
|
+
|
|
91
|
+
Se nao, executar: `az login --tenant <TENANT-ID>`
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
### FASE 2: DETECTAR CONFIGURACAO
|
|
97
|
+
|
|
98
|
+
1. Localizar arquivos de configuracao:
|
|
99
|
+
```bash
|
|
100
|
+
# Encontrar appsettings
|
|
101
|
+
Get-ChildItem -Recurse -Filter "appsettings*.json"
|
|
102
|
+
|
|
103
|
+
# Encontrar Program.cs
|
|
104
|
+
Get-ChildItem -Recurse -Filter "Program.cs"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
2. Parsear e apresentar mapeamento:
|
|
108
|
+
|
|
109
|
+
```markdown
|
|
110
|
+
## Configuracao Detectada
|
|
111
|
+
|
|
112
|
+
### Connection Strings
|
|
113
|
+
| Config Path | Env Var | Tipo |
|
|
114
|
+
|-------------|---------|------|
|
|
115
|
+
| ConnectionStrings:DefaultConnection | CONNECTIONSTRINGS__DEFAULTCONNECTION | Secret |
|
|
116
|
+
| ConnectionStrings:HangfireConnection | CONNECTIONSTRINGS__HANGFIRECONNECTION | Secret |
|
|
117
|
+
|
|
118
|
+
### Azure Services
|
|
119
|
+
| Config Path | Env Var | Tipo |
|
|
120
|
+
|-------------|---------|------|
|
|
121
|
+
| Azure:Storage:ConnectionString | AZURE__STORAGE__CONNECTIONSTRING | Secret |
|
|
122
|
+
| ApplicationInsights:ConnectionString | APPLICATIONINSIGHTS__CONNECTIONSTRING | Secret |
|
|
123
|
+
|
|
124
|
+
### Blazor Server Detectado
|
|
125
|
+
**SIM** - Sticky sessions OBRIGATORIAS
|
|
126
|
+
|
|
127
|
+
### Autenticacao Detectada
|
|
128
|
+
Azure AD - Requer TenantId, ClientId, ClientSecret
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
### FASE 3: COLETAR INFORMACOES SENSIVEIS
|
|
134
|
+
|
|
135
|
+
**PAUSA OBRIGATORIA:**
|
|
136
|
+
|
|
137
|
+
```markdown
|
|
138
|
+
---
|
|
139
|
+
## INFORMACOES SENSIVEIS NECESSARIAS
|
|
140
|
+
|
|
141
|
+
Por favor, forneca os valores abaixo:
|
|
142
|
+
|
|
143
|
+
### 1. SQL Admin Password (obrigatorio)
|
|
144
|
+
**Recomendacao:** Alfanumerico, 16+ chars, SEM caracteres especiais (@!#$)
|
|
145
|
+
**Exemplo valido:** `FishArt2025SecurePwd`
|
|
146
|
+
>
|
|
147
|
+
|
|
148
|
+
### 2. Azure Tenant ID (se auth detectado)
|
|
149
|
+
**Onde encontrar:** Azure Portal > Azure AD > Properties > Tenant ID
|
|
150
|
+
>
|
|
151
|
+
|
|
152
|
+
### 3. Azure Client Secret (se auth detectado)
|
|
153
|
+
**Onde encontrar:** Azure Portal > App Registrations > {App} > Certificates & secrets
|
|
154
|
+
>
|
|
155
|
+
|
|
156
|
+
### 4. Storage Account Key (se storage detectado)
|
|
157
|
+
**Onde encontrar:** Azure Portal > Storage Account > Access keys
|
|
158
|
+
>
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Validar senha:**
|
|
164
|
+
- Se conter @, !, #, $, %, ^, &, * → ALERTAR:
|
|
165
|
+
```markdown
|
|
166
|
+
ATENCAO: Senha contem caracteres especiais que podem causar problemas de escape.
|
|
167
|
+
Recomendamos usar apenas letras e numeros.
|
|
168
|
+
Continuar mesmo assim? (sim/nao)
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
### FASE 4: VALIDAR CUSTOS
|
|
174
|
+
|
|
175
|
+
1. Verificar se existem templates Bicep:
|
|
176
|
+
```bash
|
|
177
|
+
Test-Path "infra/main.bicep"
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Se NAO existir:**
|
|
181
|
+
```markdown
|
|
182
|
+
## Templates Bicep nao encontrados
|
|
183
|
+
|
|
184
|
+
O projeto nao possui arquivos de infraestrutura em `infra/`.
|
|
185
|
+
|
|
186
|
+
Opcoes:
|
|
187
|
+
1. **Criar agora** - Gerar templates baseado no projeto detectado
|
|
188
|
+
2. **Usar /morph-infra init** - Rodar comando de setup de infra primeiro
|
|
189
|
+
3. **Cancelar** - Abortar deploy
|
|
190
|
+
|
|
191
|
+
Qual opcao voce prefere?
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
2. Calcular custos:
|
|
195
|
+
```bash
|
|
196
|
+
npx morph-spec cost infra/main.bicep --verbose
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
3. Validar contra limites:
|
|
200
|
+
- Free tier ($0): Automatico
|
|
201
|
+
- Com aprovacao ($10): Requer confirmacao
|
|
202
|
+
- Requer ADR (>$10): Documentar em decisions.md
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
### FASE 5: DEPLOY DE INFRAESTRUTURA
|
|
207
|
+
|
|
208
|
+
1. Criar Resource Group:
|
|
209
|
+
```bash
|
|
210
|
+
az group create --name rg-{project}-{env} --location brazilsouth
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
2. Executar what-if:
|
|
214
|
+
```bash
|
|
215
|
+
az deployment group what-if \
|
|
216
|
+
--resource-group rg-{project}-{env} \
|
|
217
|
+
--template-file infra/main.bicep \
|
|
218
|
+
--parameters @infra/parameters.{env}.json
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**PAUSA OBRIGATORIA:**
|
|
222
|
+
```markdown
|
|
223
|
+
## Recursos a serem criados/modificados
|
|
224
|
+
|
|
225
|
+
[Output do what-if]
|
|
226
|
+
|
|
227
|
+
### Resumo:
|
|
228
|
+
- Criar: X recursos
|
|
229
|
+
- Modificar: Y recursos
|
|
230
|
+
- Deletar: Z recursos
|
|
231
|
+
|
|
232
|
+
### Custo estimado: $X.XX/mes
|
|
233
|
+
|
|
234
|
+
Deseja prosseguir com o deploy? (sim/nao)
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
3. Executar deploy:
|
|
238
|
+
```bash
|
|
239
|
+
az deployment group create \
|
|
240
|
+
--resource-group rg-{project}-{env} \
|
|
241
|
+
--template-file infra/main.bicep \
|
|
242
|
+
--parameters @infra/parameters.{env}.json \
|
|
243
|
+
--name "deploy-$(Get-Date -Format 'yyyyMMdd-HHmmss')"
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
4. Capturar outputs para proximas fases
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
### FASE 6: DEPLOY DE APLICACAO
|
|
251
|
+
|
|
252
|
+
1. Build Docker:
|
|
253
|
+
```bash
|
|
254
|
+
docker build -t {acr}.azurecr.io/{project}:{tag} .
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
2. Push para ACR:
|
|
258
|
+
```bash
|
|
259
|
+
az acr update --name {acr} --admin-enabled true
|
|
260
|
+
az acr login --name {acr}
|
|
261
|
+
docker push {acr}.azurecr.io/{project}:{tag}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
3. Criar/Atualizar Container App:
|
|
265
|
+
```bash
|
|
266
|
+
$acrPassword = az acr credential show --name {acr} --query "passwords[0].value" -o tsv
|
|
267
|
+
|
|
268
|
+
az containerapp create \
|
|
269
|
+
--name {project}-{env}-app \
|
|
270
|
+
--resource-group rg-{project}-{env} \
|
|
271
|
+
--environment {project}-{env}-app-env \
|
|
272
|
+
--image {acr}.azurecr.io/{project}:{tag} \
|
|
273
|
+
--registry-server {acr}.azurecr.io \
|
|
274
|
+
--registry-username {acr} \
|
|
275
|
+
--registry-password $acrPassword \
|
|
276
|
+
--target-port 8080 \
|
|
277
|
+
--ingress external \
|
|
278
|
+
--min-replicas 1 \
|
|
279
|
+
--max-replicas 3 \
|
|
280
|
+
--cpu 0.25 \
|
|
281
|
+
--memory 0.5Gi
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
4. Configurar Environment Variables:
|
|
285
|
+
```bash
|
|
286
|
+
az containerapp update \
|
|
287
|
+
--name {project}-{env}-app \
|
|
288
|
+
--resource-group rg-{project}-{env} \
|
|
289
|
+
--set-env-vars \
|
|
290
|
+
"ConnectionStrings__DefaultConnection={sql-connection}" \
|
|
291
|
+
"Azure__Storage__ConnectionString={storage-connection}" \
|
|
292
|
+
"ASPNETCORE_ENVIRONMENT=Production"
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
5. **Se Blazor Server detectado**, habilitar sticky sessions:
|
|
296
|
+
```bash
|
|
297
|
+
az containerapp ingress sticky-sessions set \
|
|
298
|
+
--name {project}-{env}-app \
|
|
299
|
+
--resource-group rg-{project}-{env} \
|
|
300
|
+
--affinity sticky
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
6. Configurar SQL Firewall:
|
|
304
|
+
```bash
|
|
305
|
+
az sql server firewall-rule create \
|
|
306
|
+
--resource-group rg-{project}-{env} \
|
|
307
|
+
--server {sql-server} \
|
|
308
|
+
--name AllowAzureServices \
|
|
309
|
+
--start-ip-address 0.0.0.0 \
|
|
310
|
+
--end-ip-address 0.0.0.0
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
7. Executar Migrations:
|
|
314
|
+
```bash
|
|
315
|
+
~/.dotnet/tools/dotnet-ef database update \
|
|
316
|
+
--project src/{project}.Infrastructure \
|
|
317
|
+
--startup-project src/{project}.Web.Blazor \
|
|
318
|
+
--connection "{sql-connection-string}"
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
### FASE 7: VERIFICACAO
|
|
324
|
+
|
|
325
|
+
1. Verificar health:
|
|
326
|
+
```bash
|
|
327
|
+
az containerapp revision list \
|
|
328
|
+
--name {project}-{env}-app \
|
|
329
|
+
--resource-group rg-{project}-{env} \
|
|
330
|
+
--query "[0].properties.healthState" -o tsv
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
2. Obter URL:
|
|
334
|
+
```bash
|
|
335
|
+
az containerapp show \
|
|
336
|
+
--name {project}-{env}-app \
|
|
337
|
+
--resource-group rg-{project}-{env} \
|
|
338
|
+
--query properties.configuration.ingress.fqdn -o tsv
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
3. Testar HTTPS
|
|
342
|
+
|
|
343
|
+
4. **PAUSA OBRIGATORIA:**
|
|
344
|
+
```markdown
|
|
345
|
+
## Verificacao Final
|
|
346
|
+
|
|
347
|
+
URL: https://{app-url}
|
|
348
|
+
|
|
349
|
+
- [ ] Container App rodando (Healthy)
|
|
350
|
+
- [ ] Health check passando (HTTP 200)
|
|
351
|
+
- [ ] HTTPS acessivel
|
|
352
|
+
- [ ] Database conectado
|
|
353
|
+
- [ ] Blazor circuit estabelecido (se aplicavel)
|
|
354
|
+
|
|
355
|
+
Todos os checks passaram? (sim/nao)
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
5. **Se falhar**, executar rollback automatico:
|
|
359
|
+
```bash
|
|
360
|
+
# Listar revisoes
|
|
361
|
+
$revisions = az containerapp revision list \
|
|
362
|
+
--name {project}-{env}-app \
|
|
363
|
+
--resource-group rg-{project}-{env} \
|
|
364
|
+
--query "[].name" -o tsv
|
|
365
|
+
|
|
366
|
+
# Ativar revisao anterior
|
|
367
|
+
az containerapp revision activate \
|
|
368
|
+
--name {project}-{env}-app \
|
|
369
|
+
--resource-group rg-{project}-{env} \
|
|
370
|
+
--revision $revisions[1]
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## Modo --auto para CI/CD
|
|
376
|
+
|
|
377
|
+
Para uso em pipelines Azure DevOps:
|
|
378
|
+
|
|
379
|
+
```bash
|
|
380
|
+
npx morph-spec deploy prod --auto \
|
|
381
|
+
--sql-password "$(SQL_PASSWORD)" \
|
|
382
|
+
--tenant-id "$(TENANT_ID)" \
|
|
383
|
+
--client-secret "$(CLIENT_SECRET)" \
|
|
384
|
+
--skip-confirmation
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### Pipeline Template
|
|
388
|
+
|
|
389
|
+
```yaml
|
|
390
|
+
trigger:
|
|
391
|
+
- main
|
|
392
|
+
|
|
393
|
+
variables:
|
|
394
|
+
- group: 'deploy-secrets'
|
|
395
|
+
|
|
396
|
+
stages:
|
|
397
|
+
- stage: Deploy
|
|
398
|
+
jobs:
|
|
399
|
+
- deployment: DeployToAzure
|
|
400
|
+
environment: 'production'
|
|
401
|
+
strategy:
|
|
402
|
+
runOnce:
|
|
403
|
+
deploy:
|
|
404
|
+
steps:
|
|
405
|
+
- script: |
|
|
406
|
+
npx morph-spec deploy prod --auto \
|
|
407
|
+
--sql-password "$(SqlPassword)" \
|
|
408
|
+
--skip-confirmation
|
|
409
|
+
displayName: 'Deploy to Production'
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
## Rollback Manual
|
|
415
|
+
|
|
416
|
+
```bash
|
|
417
|
+
/morph-deploy --rollback
|
|
418
|
+
|
|
419
|
+
# Ou via CLI:
|
|
420
|
+
npx morph-spec deploy --rollback
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
Lista revisoes disponiveis e permite selecionar qual ativar.
|
|
424
|
+
|
|
425
|
+
---
|
|
426
|
+
|
|
427
|
+
## Troubleshooting Rapido
|
|
428
|
+
|
|
429
|
+
| Erro | Solucao |
|
|
430
|
+
|------|---------|
|
|
431
|
+
| `winget not recognized` | https://aka.ms/installazurecliwindows |
|
|
432
|
+
| `MFA/tenant erro` | `az login --tenant <TENANT-ID>` |
|
|
433
|
+
| `Login failed for user` | Usar senha alfanumerica simples |
|
|
434
|
+
| `CircuitDisconnected` | Verificar sticky sessions |
|
|
435
|
+
| `ContainerCreating` stuck | Verificar push da imagem |
|
|
436
|
+
| `dotnet-ef not found` | `~/.dotnet/tools/dotnet-ef` |
|
|
437
|
+
|
|
438
|
+
---
|
|
439
|
+
|
|
440
|
+
## Exemplo de Uso
|
|
441
|
+
|
|
442
|
+
```
|
|
443
|
+
Usuario: /morph-deploy staging
|
|
444
|
+
|
|
445
|
+
Claude: Iniciando Azure Deploy workflow para STAGING...
|
|
446
|
+
|
|
447
|
+
## Fase 1: Pre-requisitos
|
|
448
|
+
- az version: 2.53.0
|
|
449
|
+
- Logged in as: user@company.com
|
|
450
|
+
- Subscription: MySubscription (abc-123-def)
|
|
451
|
+
|
|
452
|
+
Correto? (sim/nao)
|
|
453
|
+
|
|
454
|
+
Usuario: sim
|
|
455
|
+
|
|
456
|
+
Claude: ## Fase 2: Configuracao Detectada
|
|
457
|
+
|
|
458
|
+
### Connection Strings
|
|
459
|
+
- DefaultConnection: SQL Server
|
|
460
|
+
- HangfireConnection: Hangfire
|
|
461
|
+
|
|
462
|
+
### Blazor Server Detectado
|
|
463
|
+
**SIM** - Sticky sessions serao habilitadas automaticamente
|
|
464
|
+
|
|
465
|
+
## Fase 3: Informacoes Sensiveis
|
|
466
|
+
|
|
467
|
+
SQL Admin Password:
|
|
468
|
+
>
|
|
469
|
+
|
|
470
|
+
Usuario: FishArt2025SecurePwd
|
|
471
|
+
|
|
472
|
+
Claude: ## Fase 4: Validacao de Custos
|
|
473
|
+
|
|
474
|
+
Custo estimado: $4.99/mes (Azure SQL Basic)
|
|
475
|
+
|
|
476
|
+
Aprovar? (sim/nao)
|
|
477
|
+
|
|
478
|
+
Usuario: sim
|
|
479
|
+
|
|
480
|
+
Claude: ## Fase 5: Deploy de Infra
|
|
481
|
+
|
|
482
|
+
Executando what-if...
|
|
483
|
+
[Output do what-if]
|
|
484
|
+
|
|
485
|
+
Confirmar deploy? (sim/nao)
|
|
486
|
+
|
|
487
|
+
Usuario: sim
|
|
488
|
+
|
|
489
|
+
Claude: Executando deploy...
|
|
490
|
+
- Resource Group criado
|
|
491
|
+
- SQL Server provisionado
|
|
492
|
+
- Container App Environment criado
|
|
493
|
+
- ACR criado
|
|
494
|
+
|
|
495
|
+
## Fase 6: Deploy de App
|
|
496
|
+
|
|
497
|
+
- Docker build concluido
|
|
498
|
+
- Push para ACR concluido
|
|
499
|
+
- Container App atualizado
|
|
500
|
+
- Sticky sessions habilitadas
|
|
501
|
+
- SQL Firewall configurado
|
|
502
|
+
- Migrations executadas
|
|
503
|
+
|
|
504
|
+
## Fase 7: Verificacao
|
|
505
|
+
|
|
506
|
+
URL: https://myapp-staging.azurecontainerapps.io
|
|
507
|
+
|
|
508
|
+
- Container App: Healthy
|
|
509
|
+
- HTTPS: OK (200)
|
|
510
|
+
- Database: Conectado
|
|
511
|
+
- Blazor circuit: Estabelecido
|
|
512
|
+
|
|
513
|
+
Deploy concluido com sucesso!
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
---
|
|
517
|
+
|
|
518
|
+
## State Management
|
|
519
|
+
|
|
520
|
+
Apos deploy bem-sucedido:
|
|
521
|
+
|
|
522
|
+
```bash
|
|
523
|
+
npx morph-spec state set {feature} phase deployed
|
|
524
|
+
npx morph-spec state checkpoint {feature} "Deployed to {env} at {timestamp}"
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
---
|
|
528
|
+
|
|
529
|
+
*MORPH-SPEC by Polymorphism Tech*
|