@polymorphism-tech/morph-spec 1.0.4 → 2.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 +1381 -0
- package/LICENSE +72 -0
- package/README.md +89 -6
- package/bin/detect-agents.js +225 -0
- package/bin/morph-spec.js +120 -0
- package/bin/render-template.js +302 -0
- package/bin/semantic-detect-agents.js +246 -0
- package/bin/validate-agents-skills.js +239 -0
- package/bin/validate-agents.js +69 -0
- package/bin/validate-phase.js +263 -0
- package/content/.azure/README.md +293 -0
- package/content/.azure/docs/azure-devops-setup.md +454 -0
- package/content/.azure/docs/branch-strategy.md +398 -0
- package/content/.azure/docs/local-development.md +515 -0
- package/content/.azure/pipelines/pipeline-variables.yml +34 -0
- package/content/.azure/pipelines/prod-pipeline.yml +319 -0
- package/content/.azure/pipelines/staging-pipeline.yml +234 -0
- package/content/.azure/pipelines/templates/build-dotnet.yml +75 -0
- package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -0
- package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -0
- package/content/.azure/pipelines/templates/infra-deploy.yml +90 -0
- package/content/.claude/commands/morph-apply.md +118 -26
- package/content/.claude/commands/morph-archive.md +9 -9
- package/content/.claude/commands/morph-clarify.md +184 -0
- package/content/.claude/commands/morph-design.md +275 -0
- package/content/.claude/commands/morph-proposal.md +56 -15
- package/content/.claude/commands/morph-setup.md +100 -0
- package/content/.claude/commands/morph-status.md +47 -32
- package/content/.claude/commands/morph-tasks.md +319 -0
- package/content/.claude/commands/morph-uiux.md +211 -0
- package/content/.claude/skills/specialists/ai-system-architect.md +604 -0
- package/content/.claude/skills/specialists/ms-agent-expert.md +143 -89
- package/content/.claude/skills/specialists/ui-ux-designer.md +744 -9
- package/content/.claude/skills/stacks/dotnet-blazor.md +244 -8
- package/content/.claude/skills/stacks/dotnet-nextjs.md +2 -2
- package/content/.morph/.morphversion +5 -0
- package/content/.morph/config/agents.json +101 -8
- package/content/.morph/config/azure-pricing.json +70 -0
- package/content/.morph/config/azure-pricing.schema.json +50 -0
- package/content/.morph/config/config.template.json +15 -3
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -0
- package/content/.morph/hooks/README.md +239 -0
- package/content/.morph/hooks/pre-commit-agents.sh +24 -0
- package/content/.morph/hooks/pre-commit-all.sh +48 -0
- package/content/.morph/hooks/pre-commit-costs.sh +91 -0
- package/content/.morph/hooks/pre-commit-specs.sh +49 -0
- package/content/.morph/hooks/pre-commit-tests.sh +60 -0
- package/content/.morph/project.md +5 -4
- package/content/.morph/schemas/agent.schema.json +296 -0
- package/content/.morph/standards/agent-framework-setup.md +453 -0
- package/content/.morph/standards/architecture.md +142 -7
- package/content/.morph/standards/azure.md +218 -23
- package/content/.morph/standards/coding.md +47 -12
- package/content/.morph/standards/dotnet10-migration.md +494 -0
- package/content/.morph/standards/fluent-ui-setup.md +590 -0
- package/content/.morph/standards/migration-guide.md +514 -0
- package/content/.morph/standards/passkeys-auth.md +423 -0
- package/content/.morph/standards/vector-search-rag.md +536 -0
- package/content/.morph/state.json +18 -0
- package/content/.morph/templates/FluentDesignTheme.cs +149 -0
- package/content/.morph/templates/MudTheme.cs +281 -0
- package/content/.morph/templates/contracts.cs +55 -55
- package/content/.morph/templates/decisions.md +4 -4
- package/content/.morph/templates/design-system.css +226 -0
- package/content/.morph/templates/infra/.dockerignore.example +89 -0
- package/content/.morph/templates/infra/Dockerfile.example +82 -0
- package/content/.morph/templates/infra/README.md +286 -0
- package/content/.morph/templates/infra/app-service.bicep +164 -0
- package/content/.morph/templates/infra/deploy.ps1 +229 -0
- package/content/.morph/templates/infra/deploy.sh +208 -0
- package/content/.morph/templates/infra/main.bicep +41 -7
- package/content/.morph/templates/infra/parameters.dev.json +6 -0
- package/content/.morph/templates/infra/parameters.prod.json +6 -0
- package/content/.morph/templates/infra/parameters.staging.json +29 -0
- package/content/.morph/templates/proposal.md +3 -3
- package/content/.morph/templates/recap.md +3 -3
- package/content/.morph/templates/spec.md +9 -8
- package/content/.morph/templates/sprint-status.yaml +68 -0
- package/content/.morph/templates/state.template.json +222 -0
- package/content/.morph/templates/story.md +143 -0
- package/content/.morph/templates/tasks.md +1 -1
- package/content/.morph/templates/ui-components.md +276 -0
- package/content/.morph/templates/ui-design-system.md +286 -0
- package/content/.morph/templates/ui-flows.md +336 -0
- package/content/.morph/templates/ui-mockups.md +133 -0
- package/content/.morph/test-infra/example.bicep +59 -0
- package/content/CLAUDE.md +124 -0
- package/content/README.md +79 -0
- package/detectors/config-detector.js +223 -0
- package/detectors/conversation-analyzer.js +163 -0
- package/detectors/index.js +84 -0
- package/detectors/standards-generator.js +275 -0
- package/detectors/structure-detector.js +221 -0
- package/docs/README.md +149 -0
- package/docs/api/cost-calculator.js.html +513 -0
- package/docs/api/design-system-generator.js.html +382 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.eot +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.woff +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.eot +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.woff +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
- package/docs/api/global.html +5263 -0
- package/docs/api/index.html +96 -0
- package/docs/api/scripts/collapse.js +39 -0
- package/docs/api/scripts/commonNav.js +28 -0
- package/docs/api/scripts/linenumber.js +25 -0
- package/docs/api/scripts/nav.js +12 -0
- package/docs/api/scripts/polyfill.js +4 -0
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -0
- package/docs/api/scripts/prettify/lang-css.js +2 -0
- package/docs/api/scripts/prettify/prettify.js +28 -0
- package/docs/api/scripts/search.js +99 -0
- package/docs/api/state-manager.js.html +423 -0
- package/docs/api/styles/jsdoc.css +776 -0
- package/docs/api/styles/prettify.css +80 -0
- package/docs/examples.md +328 -0
- package/docs/getting-started.md +302 -0
- package/docs/installation.md +361 -0
- package/docs/templates.md +418 -0
- package/docs/validation-checklist.md +266 -0
- package/package.json +39 -12
- package/src/commands/cost.js +181 -0
- package/src/commands/create-story.js +283 -0
- package/src/commands/detect.js +104 -0
- package/src/commands/doctor.js +67 -0
- package/src/commands/generate.js +149 -0
- package/src/commands/init.js +69 -45
- package/src/commands/shard-spec.js +224 -0
- package/src/commands/sprint-status.js +250 -0
- package/src/commands/state.js +333 -0
- package/src/commands/sync.js +167 -0
- package/src/commands/update-pricing.js +206 -0
- package/src/commands/update.js +88 -13
- package/src/lib/complexity-analyzer.js +292 -0
- package/src/lib/cost-calculator.js +429 -0
- package/src/lib/design-system-generator.js +298 -0
- package/src/lib/state-manager.js +340 -0
- package/src/utils/file-copier.js +59 -0
- package/src/utils/version-checker.js +175 -0
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
# Desenvolvimento Local - MORPH-SPEC
|
|
2
|
+
|
|
3
|
+
> Como rodar o projeto localmente e acessar recursos Azure do Staging
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📋 Conceito
|
|
8
|
+
|
|
9
|
+
Developers **não precisam de ambiente próprio**. Ao invés disso:
|
|
10
|
+
|
|
11
|
+
- ✅ **Rodam o projeto LOCAL** (Visual Studio, Rider, VS Code)
|
|
12
|
+
- ✅ **Acessam recursos REMOTOS** do ambiente Staging (SQL, Storage, Key Vault)
|
|
13
|
+
- ✅ **Testam localmente** antes de commitar
|
|
14
|
+
- ✅ **Criam PRs** para Staging quando pronto
|
|
15
|
+
|
|
16
|
+
**Vantagens:**
|
|
17
|
+
- 💰 **Custo zero** para ambiente dev
|
|
18
|
+
- ⚡ **Desenvolvimento mais rápido** (hot reload, debug local)
|
|
19
|
+
- 🔄 **Dados compartilhados** (todos testam com mesmos dados)
|
|
20
|
+
- 🎯 **Ambiente staging sempre atualizado**
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## ⚙️ Setup Inicial (Uma vez)
|
|
25
|
+
|
|
26
|
+
### 1. Instalar Ferramentas
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# .NET SDK
|
|
30
|
+
winget install Microsoft.DotNet.SDK.8
|
|
31
|
+
|
|
32
|
+
# Azure CLI
|
|
33
|
+
winget install Microsoft.AzureCLI
|
|
34
|
+
|
|
35
|
+
# Git
|
|
36
|
+
winget install Git.Git
|
|
37
|
+
|
|
38
|
+
# Visual Studio ou VS Code
|
|
39
|
+
winget install Microsoft.VisualStudio.2022.Community
|
|
40
|
+
# ou
|
|
41
|
+
winget install Microsoft.VisualStudioCode
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 2. Login no Azure
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# Login com sua conta corporativa
|
|
48
|
+
az login
|
|
49
|
+
|
|
50
|
+
# Verificar subscription
|
|
51
|
+
az account show
|
|
52
|
+
|
|
53
|
+
# Se necessário, trocar subscription
|
|
54
|
+
az account set --subscription "<SUBSCRIPTION_ID>"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 3. Obter Permissões Staging
|
|
58
|
+
|
|
59
|
+
Solicite ao tech lead para adicionar você ao ambiente staging:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Tech lead executa:
|
|
63
|
+
az role assignment create \
|
|
64
|
+
--assignee <developer-email> \
|
|
65
|
+
--role "Contributor" \
|
|
66
|
+
--scope "/subscriptions/<SUB_ID>/resourceGroups/rg-myapp-staging"
|
|
67
|
+
|
|
68
|
+
# Permissão SQL Database
|
|
69
|
+
az sql server ad-admin set \
|
|
70
|
+
--resource-group rg-myapp-staging \
|
|
71
|
+
--server-name sql-myapp-staging \
|
|
72
|
+
--display-name "<developer-name>" \
|
|
73
|
+
--object-id <developer-object-id>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 🔧 Configuração do Projeto
|
|
79
|
+
|
|
80
|
+
### 1. Clonar Repositório
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
git clone https://dev.azure.com/org/project/_git/repo
|
|
84
|
+
cd repo
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 2. Criar appsettings.Development.json
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"ConnectionStrings": {
|
|
92
|
+
"DefaultConnection": "Server=sql-myapp-staging.database.windows.net;Database=myapp;Authentication=Active Directory Default;"
|
|
93
|
+
},
|
|
94
|
+
"Azure": {
|
|
95
|
+
"KeyVault": "https://kv-myapp-staging.vault.azure.net/",
|
|
96
|
+
"Storage": {
|
|
97
|
+
"AccountName": "stmyappstaging",
|
|
98
|
+
"BlobEndpoint": "https://stmyappstaging.blob.core.windows.net"
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"ApplicationInsights": {
|
|
102
|
+
"ConnectionString": "<copiar-do-azure-portal-staging>"
|
|
103
|
+
},
|
|
104
|
+
"Logging": {
|
|
105
|
+
"LogLevel": {
|
|
106
|
+
"Default": "Information",
|
|
107
|
+
"Microsoft.AspNetCore": "Warning"
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**⚠️ IMPORTANTE:**
|
|
114
|
+
- ❌ **NUNCA commitar** `appsettings.Development.json`
|
|
115
|
+
- ✅ Já está no `.gitignore`
|
|
116
|
+
- ✅ Cada developer tem seu próprio arquivo local
|
|
117
|
+
|
|
118
|
+
### 3. Configurar DefaultAzureCredential
|
|
119
|
+
|
|
120
|
+
No `Program.cs`:
|
|
121
|
+
|
|
122
|
+
```csharp
|
|
123
|
+
builder.Services.AddDbContext<ApplicationDbContext>(options =>
|
|
124
|
+
{
|
|
125
|
+
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
|
|
126
|
+
options.UseSqlServer(connectionString, sqlOptions =>
|
|
127
|
+
{
|
|
128
|
+
sqlOptions.EnableRetryOnFailure(
|
|
129
|
+
maxRetryCount: 3,
|
|
130
|
+
maxRetryDelay: TimeSpan.FromSeconds(30),
|
|
131
|
+
errorNumbersToAdd: null);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// Azure Key Vault
|
|
136
|
+
if (!builder.Environment.IsDevelopment())
|
|
137
|
+
{
|
|
138
|
+
var keyVaultUrl = builder.Configuration["Azure:KeyVault"];
|
|
139
|
+
builder.Configuration.AddAzureKeyVault(
|
|
140
|
+
new Uri(keyVaultUrl),
|
|
141
|
+
new DefaultAzureCredential());
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Azure Storage
|
|
145
|
+
builder.Services.AddSingleton(x =>
|
|
146
|
+
{
|
|
147
|
+
var accountName = builder.Configuration["Azure:Storage:AccountName"];
|
|
148
|
+
var blobServiceClient = new BlobServiceClient(
|
|
149
|
+
new Uri($"https://{accountName}.blob.core.windows.net"),
|
|
150
|
+
new DefaultAzureCredential());
|
|
151
|
+
return blobServiceClient;
|
|
152
|
+
});
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**DefaultAzureCredential** tenta autenticar nesta ordem:
|
|
156
|
+
1. Environment variables (CI/CD)
|
|
157
|
+
2. Managed Identity (Azure)
|
|
158
|
+
3. **Azure CLI** (← usado localmente)
|
|
159
|
+
4. Visual Studio
|
|
160
|
+
5. VS Code
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 🚀 Rodando Localmente
|
|
165
|
+
|
|
166
|
+
### Opção 1: Visual Studio
|
|
167
|
+
|
|
168
|
+
1. Abrir `.sln`
|
|
169
|
+
2. F5 (Debug) ou Ctrl+F5 (Run)
|
|
170
|
+
3. Projeto abrirá em `https://localhost:7001`
|
|
171
|
+
|
|
172
|
+
### Opção 2: Rider
|
|
173
|
+
|
|
174
|
+
1. Abrir `.sln`
|
|
175
|
+
2. Shift+F10 (Run) ou Shift+F9 (Debug)
|
|
176
|
+
|
|
177
|
+
### Opção 3: VS Code
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
# Restaurar dependências
|
|
181
|
+
dotnet restore
|
|
182
|
+
|
|
183
|
+
# Rodar projeto
|
|
184
|
+
dotnet run --project src/YourApp/YourApp.csproj
|
|
185
|
+
|
|
186
|
+
# Ou com watch (hot reload)
|
|
187
|
+
dotnet watch --project src/YourApp/YourApp.csproj
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Opção 4: CLI direto
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
cd src/YourApp
|
|
194
|
+
dotnet run
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## 🗄️ Acesso ao Banco de Dados
|
|
200
|
+
|
|
201
|
+
### Via Azure Data Studio
|
|
202
|
+
|
|
203
|
+
1. Download: https://aka.ms/azuredatastudio
|
|
204
|
+
2. Conectar:
|
|
205
|
+
- **Server**: `sql-myapp-staging.database.windows.net`
|
|
206
|
+
- **Database**: `myapp`
|
|
207
|
+
- **Authentication**: `Azure Active Directory - Universal with MFA`
|
|
208
|
+
- **Account**: Sua conta corporativa
|
|
209
|
+
|
|
210
|
+
### Via SQL Server Management Studio (SSMS)
|
|
211
|
+
|
|
212
|
+
1. Download: https://aka.ms/ssmsfullsetup
|
|
213
|
+
2. Conectar:
|
|
214
|
+
- **Server**: `sql-myapp-staging.database.windows.net`
|
|
215
|
+
- **Authentication**: `Azure Active Directory - Universal with MFA`
|
|
216
|
+
- **Login**: Sua conta
|
|
217
|
+
|
|
218
|
+
### Via Entity Framework Migrations
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
# Criar migration
|
|
222
|
+
dotnet ef migrations add NomeDaMigration
|
|
223
|
+
|
|
224
|
+
# Aplicar migration no staging (CUIDADO!)
|
|
225
|
+
dotnet ef database update
|
|
226
|
+
|
|
227
|
+
# Reverter migration
|
|
228
|
+
dotnet ef database update PreviousMigration
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
⚠️ **ATENÇÃO**: Migrations aplicadas localmente afetam **TODOS** os developers!
|
|
232
|
+
|
|
233
|
+
**Melhor prática:**
|
|
234
|
+
- Criar migration localmente
|
|
235
|
+
- Commitar migration
|
|
236
|
+
- Deixar pipeline aplicar automaticamente
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 📦 Acesso ao Azure Storage
|
|
241
|
+
|
|
242
|
+
### Via Azure Storage Explorer
|
|
243
|
+
|
|
244
|
+
1. Download: https://aka.ms/storageexplorer
|
|
245
|
+
2. Login com sua conta
|
|
246
|
+
3. Navegue até: `stmyappstaging`
|
|
247
|
+
4. Pode fazer upload/download de blobs
|
|
248
|
+
|
|
249
|
+
### Via Código
|
|
250
|
+
|
|
251
|
+
```csharp
|
|
252
|
+
// Upload blob
|
|
253
|
+
var blobClient = blobServiceClient
|
|
254
|
+
.GetBlobContainerClient("uploads")
|
|
255
|
+
.GetBlobClient("test.txt");
|
|
256
|
+
|
|
257
|
+
await blobClient.UploadAsync(
|
|
258
|
+
BinaryData.FromString("Hello from local!"),
|
|
259
|
+
overwrite: true);
|
|
260
|
+
|
|
261
|
+
// Download blob
|
|
262
|
+
var downloadedData = await blobClient.DownloadContentAsync();
|
|
263
|
+
Console.WriteLine(downloadedData.Value.Content.ToString());
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## 🔐 Acesso ao Key Vault
|
|
269
|
+
|
|
270
|
+
### Via Azure CLI
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
# Listar secrets
|
|
274
|
+
az keyvault secret list \
|
|
275
|
+
--vault-name kv-myapp-staging
|
|
276
|
+
|
|
277
|
+
# Obter secret
|
|
278
|
+
az keyvault secret show \
|
|
279
|
+
--vault-name kv-myapp-staging \
|
|
280
|
+
--name "ConnectionStrings--DefaultConnection"
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Via Código
|
|
284
|
+
|
|
285
|
+
```csharp
|
|
286
|
+
// Program.cs já configurou automaticamente
|
|
287
|
+
// Acesse via IConfiguration normalmente:
|
|
288
|
+
|
|
289
|
+
var secret = builder.Configuration["MySecretKey"];
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## 🧪 Testes Locais
|
|
295
|
+
|
|
296
|
+
### Unit Tests
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
# Rodar todos os testes
|
|
300
|
+
dotnet test
|
|
301
|
+
|
|
302
|
+
# Rodar com cobertura
|
|
303
|
+
dotnet test --collect:"XPlat Code Coverage"
|
|
304
|
+
|
|
305
|
+
# Apenas testes de uma classe
|
|
306
|
+
dotnet test --filter "FullyQualifiedName~MyTests"
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Integration Tests
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
# Integration tests usam staging database
|
|
313
|
+
dotnet test --filter "Category=Integration"
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
⚠️ **Cuidado**: Integration tests modificam dados staging!
|
|
317
|
+
|
|
318
|
+
**Melhor prática:**
|
|
319
|
+
- Use transações que fazem rollback
|
|
320
|
+
- Ou crie/delete dados de teste
|
|
321
|
+
- Ou use database separado para testes
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## 🔄 Workflow Diário
|
|
326
|
+
|
|
327
|
+
### 1. Começar Nova Feature
|
|
328
|
+
|
|
329
|
+
```bash
|
|
330
|
+
# Atualizar staging
|
|
331
|
+
git checkout staging
|
|
332
|
+
git pull origin staging
|
|
333
|
+
|
|
334
|
+
# Criar feature branch
|
|
335
|
+
git checkout -b feature/minha-funcionalidade
|
|
336
|
+
|
|
337
|
+
# Rodar projeto local
|
|
338
|
+
dotnet run
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### 2. Desenvolver
|
|
342
|
+
|
|
343
|
+
```bash
|
|
344
|
+
# Fazer mudanças
|
|
345
|
+
# Testar localmente (conecta em staging resources)
|
|
346
|
+
# Commitar frequentemente
|
|
347
|
+
|
|
348
|
+
git add .
|
|
349
|
+
git commit -m "feat: adiciona funcionalidade X"
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### 3. Testar
|
|
353
|
+
|
|
354
|
+
```bash
|
|
355
|
+
# Unit tests
|
|
356
|
+
dotnet test
|
|
357
|
+
|
|
358
|
+
# Teste manual no browser
|
|
359
|
+
# http://localhost:5000
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
### 4. Push e PR
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
# Push da feature branch
|
|
366
|
+
git push origin feature/minha-funcionalidade
|
|
367
|
+
|
|
368
|
+
# Criar PR para staging no Azure DevOps
|
|
369
|
+
# 1. Vá em Repos → Pull Requests → New Pull Request
|
|
370
|
+
# 2. Source: feature/minha-funcionalidade
|
|
371
|
+
# 3. Target: staging
|
|
372
|
+
# 4. Adicionar reviewers
|
|
373
|
+
# 5. Create
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
### 5. Code Review e Merge
|
|
377
|
+
|
|
378
|
+
```
|
|
379
|
+
# Reviewer faz code review
|
|
380
|
+
# Após aprovação, merge
|
|
381
|
+
# Pipeline staging triggará automaticamente
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### 6. Testar em Staging Deployado
|
|
385
|
+
|
|
386
|
+
```bash
|
|
387
|
+
# Acessar URL staging
|
|
388
|
+
https://ca-myapp-staging.<region>.azurecontainerapps.io
|
|
389
|
+
|
|
390
|
+
# Validar funcionalidade
|
|
391
|
+
# Se OK, criar PR staging → main para prod
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## 🆘 Troubleshooting
|
|
397
|
+
|
|
398
|
+
### Erro: "Login failed for user"
|
|
399
|
+
|
|
400
|
+
**Causa**: Azure CLI não autenticado ou token expirado.
|
|
401
|
+
|
|
402
|
+
**Solução**:
|
|
403
|
+
```bash
|
|
404
|
+
az logout
|
|
405
|
+
az login
|
|
406
|
+
az account show
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
### Erro: "Cannot connect to SQL Server"
|
|
410
|
+
|
|
411
|
+
**Causa**: Firewall SQL bloqueando seu IP.
|
|
412
|
+
|
|
413
|
+
**Solução**:
|
|
414
|
+
```bash
|
|
415
|
+
# Adicionar seu IP ao firewall
|
|
416
|
+
az sql server firewall-rule create \
|
|
417
|
+
--resource-group rg-myapp-staging \
|
|
418
|
+
--server sql-myapp-staging \
|
|
419
|
+
--name "DevIP-$(whoami)" \
|
|
420
|
+
--start-ip-address <SEU_IP> \
|
|
421
|
+
--end-ip-address <SEU_IP>
|
|
422
|
+
|
|
423
|
+
# Obter seu IP público
|
|
424
|
+
curl https://api.ipify.org
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### Erro: "Access denied to Key Vault"
|
|
428
|
+
|
|
429
|
+
**Causa**: Sem permissão no Key Vault.
|
|
430
|
+
|
|
431
|
+
**Solução** (Tech lead):
|
|
432
|
+
```bash
|
|
433
|
+
az keyvault set-policy \
|
|
434
|
+
--name kv-myapp-staging \
|
|
435
|
+
--upn <developer-email> \
|
|
436
|
+
--secret-permissions get list
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
### Erro: "Blob not found"
|
|
440
|
+
|
|
441
|
+
**Causa**: Container não existe ou sem permissão.
|
|
442
|
+
|
|
443
|
+
**Solução** (Tech lead):
|
|
444
|
+
```bash
|
|
445
|
+
# Dar permissão Storage Blob Data Contributor
|
|
446
|
+
az role assignment create \
|
|
447
|
+
--assignee <developer-email> \
|
|
448
|
+
--role "Storage Blob Data Contributor" \
|
|
449
|
+
--scope "/subscriptions/<SUB_ID>/resourceGroups/rg-myapp-staging/providers/Microsoft.Storage/storageAccounts/stmyappstaging"
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### Erro: "DefaultAzureCredential failed"
|
|
453
|
+
|
|
454
|
+
**Causa**: Nenhum método de autenticação funcionou.
|
|
455
|
+
|
|
456
|
+
**Solução**:
|
|
457
|
+
1. Feche Visual Studio/Rider/VS Code
|
|
458
|
+
2. `az logout && az login`
|
|
459
|
+
3. Reabra IDE
|
|
460
|
+
4. Rode novamente
|
|
461
|
+
|
|
462
|
+
### Migration falhou
|
|
463
|
+
|
|
464
|
+
**Causa**: Conflito com migration de outro developer.
|
|
465
|
+
|
|
466
|
+
**Solução**:
|
|
467
|
+
```bash
|
|
468
|
+
# Pull latest
|
|
469
|
+
git pull origin staging
|
|
470
|
+
|
|
471
|
+
# Deletar sua migration
|
|
472
|
+
dotnet ef migrations remove
|
|
473
|
+
|
|
474
|
+
# Aplicar migrations remotas
|
|
475
|
+
dotnet ef database update
|
|
476
|
+
|
|
477
|
+
# Recriar sua migration
|
|
478
|
+
dotnet ef migrations add SuaMigration
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
---
|
|
482
|
+
|
|
483
|
+
## ✅ Checklist de Setup
|
|
484
|
+
|
|
485
|
+
Para novos developers:
|
|
486
|
+
|
|
487
|
+
- [ ] Instalar .NET SDK 8
|
|
488
|
+
- [ ] Instalar Azure CLI
|
|
489
|
+
- [ ] Instalar Git
|
|
490
|
+
- [ ] Instalar IDE (VS/Rider/VS Code)
|
|
491
|
+
- [ ] `az login` com conta corporativa
|
|
492
|
+
- [ ] Solicitar permissões staging (tech lead)
|
|
493
|
+
- [ ] Clonar repositório
|
|
494
|
+
- [ ] Criar `appsettings.Development.json`
|
|
495
|
+
- [ ] Testar conexão SQL (Azure Data Studio)
|
|
496
|
+
- [ ] Rodar projeto local (`dotnet run`)
|
|
497
|
+
- [ ] Acessar `https://localhost:7001`
|
|
498
|
+
- [ ] Rodar testes (`dotnet test`)
|
|
499
|
+
- [ ] Criar feature branch de teste
|
|
500
|
+
- [ ] Fazer commit de teste
|
|
501
|
+
- [ ] Criar PR de teste
|
|
502
|
+
- [ ] Deletar PR/branch de teste
|
|
503
|
+
|
|
504
|
+
---
|
|
505
|
+
|
|
506
|
+
## 📚 Referências
|
|
507
|
+
|
|
508
|
+
- [DefaultAzureCredential](https://learn.microsoft.com/dotnet/api/azure.identity.defaultazurecredential)
|
|
509
|
+
- [Azure SQL with Azure AD](https://learn.microsoft.com/azure/azure-sql/database/authentication-aad-configure)
|
|
510
|
+
- [Azure Storage SDK](https://learn.microsoft.com/azure/storage/blobs/storage-quickstart-blobs-dotnet)
|
|
511
|
+
- [Entity Framework Migrations](https://learn.microsoft.com/ef/core/managing-schemas/migrations/)
|
|
512
|
+
|
|
513
|
+
---
|
|
514
|
+
|
|
515
|
+
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# ==============================================================================
|
|
2
|
+
# MORPH-SPEC - Pipeline Variables
|
|
3
|
+
# Shared variables across all Azure DevOps pipelines
|
|
4
|
+
# ==============================================================================
|
|
5
|
+
|
|
6
|
+
variables:
|
|
7
|
+
# .NET Configuration
|
|
8
|
+
dotnetVersion: '8.x'
|
|
9
|
+
buildConfiguration: 'Release'
|
|
10
|
+
|
|
11
|
+
# Azure Configuration
|
|
12
|
+
azureLocation: 'eastus'
|
|
13
|
+
|
|
14
|
+
# Container Configuration
|
|
15
|
+
dockerfilePath: 'Dockerfile'
|
|
16
|
+
containerRegistry: '$(ACR_NAME).azurecr.io'
|
|
17
|
+
|
|
18
|
+
# Build Paths
|
|
19
|
+
artifactName: 'drop'
|
|
20
|
+
publishPath: '$(Build.ArtifactStagingDirectory)'
|
|
21
|
+
|
|
22
|
+
# Bicep Configuration
|
|
23
|
+
bicepTemplateFile: 'content/.morph/templates/infra/main.bicep'
|
|
24
|
+
|
|
25
|
+
# Versioning
|
|
26
|
+
majorVersion: 1
|
|
27
|
+
minorVersion: 0
|
|
28
|
+
patchVersion: $[counter(format('{0}.{1}', variables['majorVersion'], variables['minorVersion']), 0)]
|
|
29
|
+
imageTag: '$(majorVersion).$(minorVersion).$(patchVersion)'
|
|
30
|
+
|
|
31
|
+
# IMPORTANT: These must be configured as pipeline variables in Azure DevOps:
|
|
32
|
+
# - ACR_NAME: Azure Container Registry name
|
|
33
|
+
# - APP_NAME: Application name
|
|
34
|
+
# - SUBSCRIPTION_ID: Azure subscription ID
|