@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
|
@@ -1,419 +1,126 @@
|
|
|
1
|
-
# Bicep Architect
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Key Vault
|
|
131
|
-
module keyVault 'modules/key-vault.bicep' = {
|
|
132
|
-
name: 'keyVault'
|
|
133
|
-
params: {
|
|
134
|
-
name: '${resourcePrefix}-kv'
|
|
135
|
-
location: location
|
|
136
|
-
tags: tags
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Outputs
|
|
141
|
-
output containerAppUrl string = containerApp.outputs.url
|
|
142
|
-
output sqlConnectionString string = sqlDatabase.outputs.connectionString
|
|
143
|
-
output keyVaultUri string = keyVault.outputs.uri
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
## Módulos
|
|
147
|
-
|
|
148
|
-
### Container App Environment
|
|
149
|
-
|
|
150
|
-
```bicep
|
|
151
|
-
// modules/container-app-env.bicep
|
|
152
|
-
@description('Environment name')
|
|
153
|
-
param name string
|
|
154
|
-
|
|
155
|
-
@description('Location')
|
|
156
|
-
param location string
|
|
157
|
-
|
|
158
|
-
@description('Tags')
|
|
159
|
-
param tags object = {}
|
|
160
|
-
|
|
161
|
-
@description('Log Analytics Workspace ID')
|
|
162
|
-
param logAnalyticsWorkspaceId string
|
|
163
|
-
|
|
164
|
-
resource containerAppEnv 'Microsoft.App/managedEnvironments@2023-05-01' = {
|
|
165
|
-
name: name
|
|
166
|
-
location: location
|
|
167
|
-
tags: tags
|
|
168
|
-
properties: {
|
|
169
|
-
appLogsConfiguration: {
|
|
170
|
-
destination: 'log-analytics'
|
|
171
|
-
logAnalyticsConfiguration: {
|
|
172
|
-
customerId: reference(logAnalyticsWorkspaceId, '2022-10-01').customerId
|
|
173
|
-
sharedKey: listKeys(logAnalyticsWorkspaceId, '2022-10-01').primarySharedKey
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
output id string = containerAppEnv.id
|
|
180
|
-
output name string = containerAppEnv.name
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
### Container App
|
|
184
|
-
|
|
185
|
-
```bicep
|
|
186
|
-
// modules/container-app.bicep
|
|
187
|
-
@description('App name')
|
|
188
|
-
param name string
|
|
189
|
-
|
|
190
|
-
@description('Location')
|
|
191
|
-
param location string
|
|
192
|
-
|
|
193
|
-
@description('Tags')
|
|
194
|
-
param tags object = {}
|
|
195
|
-
|
|
196
|
-
@description('Container App Environment ID')
|
|
197
|
-
param environmentId string
|
|
198
|
-
|
|
199
|
-
@description('Container image')
|
|
200
|
-
param containerImage string
|
|
201
|
-
|
|
202
|
-
@description('App Insights connection string')
|
|
203
|
-
param appInsightsConnectionString string = ''
|
|
204
|
-
|
|
205
|
-
@description('CPU cores')
|
|
206
|
-
param cpu string = '0.25'
|
|
207
|
-
|
|
208
|
-
@description('Memory')
|
|
209
|
-
param memory string = '0.5Gi'
|
|
210
|
-
|
|
211
|
-
@description('Min replicas')
|
|
212
|
-
param minReplicas int = 0
|
|
213
|
-
|
|
214
|
-
@description('Max replicas')
|
|
215
|
-
param maxReplicas int = 3
|
|
216
|
-
|
|
217
|
-
resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {
|
|
218
|
-
name: name
|
|
219
|
-
location: location
|
|
220
|
-
tags: tags
|
|
221
|
-
properties: {
|
|
222
|
-
managedEnvironmentId: environmentId
|
|
223
|
-
configuration: {
|
|
224
|
-
ingress: {
|
|
225
|
-
external: true
|
|
226
|
-
targetPort: 8080
|
|
227
|
-
transport: 'http'
|
|
228
|
-
allowInsecure: false
|
|
229
|
-
}
|
|
230
|
-
secrets: appInsightsConnectionString != '' ? [
|
|
231
|
-
{
|
|
232
|
-
name: 'appinsights-connection-string'
|
|
233
|
-
value: appInsightsConnectionString
|
|
234
|
-
}
|
|
235
|
-
] : []
|
|
236
|
-
}
|
|
237
|
-
template: {
|
|
238
|
-
containers: [
|
|
239
|
-
{
|
|
240
|
-
name: name
|
|
241
|
-
image: containerImage
|
|
242
|
-
resources: {
|
|
243
|
-
cpu: json(cpu)
|
|
244
|
-
memory: memory
|
|
245
|
-
}
|
|
246
|
-
env: appInsightsConnectionString != '' ? [
|
|
247
|
-
{
|
|
248
|
-
name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
|
|
249
|
-
secretRef: 'appinsights-connection-string'
|
|
250
|
-
}
|
|
251
|
-
] : []
|
|
252
|
-
}
|
|
253
|
-
]
|
|
254
|
-
scale: {
|
|
255
|
-
minReplicas: minReplicas
|
|
256
|
-
maxReplicas: maxReplicas
|
|
257
|
-
rules: [
|
|
258
|
-
{
|
|
259
|
-
name: 'http-scale'
|
|
260
|
-
http: {
|
|
261
|
-
metadata: {
|
|
262
|
-
concurrentRequests: '100'
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
]
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
output id string = containerApp.id
|
|
273
|
-
output name string = containerApp.name
|
|
274
|
-
output url string = 'https://${containerApp.properties.configuration.ingress.fqdn}'
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
### SQL Database (Free Tier)
|
|
278
|
-
|
|
279
|
-
```bicep
|
|
280
|
-
// modules/sql-database.bicep
|
|
281
|
-
@description('SQL Server name')
|
|
282
|
-
param serverName string
|
|
283
|
-
|
|
284
|
-
@description('Database name')
|
|
285
|
-
param databaseName string
|
|
286
|
-
|
|
287
|
-
@description('Location')
|
|
288
|
-
param location string
|
|
289
|
-
|
|
290
|
-
@description('Tags')
|
|
291
|
-
param tags object = {}
|
|
292
|
-
|
|
293
|
-
@description('Admin username')
|
|
294
|
-
param adminUsername string = 'sqladmin'
|
|
295
|
-
|
|
296
|
-
@description('Admin password')
|
|
297
|
-
@secure()
|
|
298
|
-
param adminPassword string
|
|
299
|
-
|
|
300
|
-
@description('Use free tier')
|
|
301
|
-
param useFree bool = true
|
|
302
|
-
|
|
303
|
-
resource sqlServer 'Microsoft.Sql/servers@2023-05-01-preview' = {
|
|
304
|
-
name: serverName
|
|
305
|
-
location: location
|
|
306
|
-
tags: tags
|
|
307
|
-
properties: {
|
|
308
|
-
administratorLogin: adminUsername
|
|
309
|
-
administratorLoginPassword: adminPassword
|
|
310
|
-
version: '12.0'
|
|
311
|
-
minimalTlsVersion: '1.2'
|
|
312
|
-
publicNetworkAccess: 'Enabled'
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
resource sqlDatabase 'Microsoft.Sql/servers/databases@2023-05-01-preview' = {
|
|
317
|
-
parent: sqlServer
|
|
318
|
-
name: databaseName
|
|
319
|
-
location: location
|
|
320
|
-
tags: tags
|
|
321
|
-
sku: useFree ? {
|
|
322
|
-
name: 'Free'
|
|
323
|
-
tier: 'Free'
|
|
324
|
-
} : {
|
|
325
|
-
name: 'Basic'
|
|
326
|
-
tier: 'Basic'
|
|
327
|
-
}
|
|
328
|
-
properties: {
|
|
329
|
-
collation: 'SQL_Latin1_General_CP1_CI_AS'
|
|
330
|
-
maxSizeBytes: useFree ? 32212254720 : 2147483648 // 32GB free, 2GB basic
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// Allow Azure services
|
|
335
|
-
resource firewallRule 'Microsoft.Sql/servers/firewallRules@2023-05-01-preview' = {
|
|
336
|
-
parent: sqlServer
|
|
337
|
-
name: 'AllowAllAzureIps'
|
|
338
|
-
properties: {
|
|
339
|
-
startIpAddress: '0.0.0.0'
|
|
340
|
-
endIpAddress: '0.0.0.0'
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
output connectionString string = 'Server=tcp:${sqlServer.properties.fullyQualifiedDomainName},1433;Database=${databaseName};User ID=${adminUsername};Password=${adminPassword};Encrypt=true;Connection Timeout=30;'
|
|
345
|
-
output serverFqdn string = sqlServer.properties.fullyQualifiedDomainName
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
## Commands
|
|
349
|
-
|
|
350
|
-
```bash
|
|
351
|
-
# Validar Bicep
|
|
352
|
-
az bicep build --file infra/main.bicep
|
|
353
|
-
|
|
354
|
-
# What-if (preview de mudanças)
|
|
355
|
-
az deployment group what-if \
|
|
356
|
-
--resource-group rg-myapp-dev \
|
|
357
|
-
--template-file infra/main.bicep \
|
|
358
|
-
--parameters @infra/parameters.dev.json
|
|
359
|
-
|
|
360
|
-
# Deploy
|
|
361
|
-
az deployment group create \
|
|
362
|
-
--resource-group rg-myapp-dev \
|
|
363
|
-
--template-file infra/main.bicep \
|
|
364
|
-
--parameters @infra/parameters.dev.json
|
|
365
|
-
|
|
366
|
-
# Criar resource group primeiro
|
|
367
|
-
az group create --name rg-myapp-dev --location brazilsouth
|
|
368
|
-
|
|
369
|
-
# Deletar deployment
|
|
370
|
-
az group delete --name rg-myapp-dev --yes --no-wait
|
|
371
|
-
```
|
|
372
|
-
|
|
373
|
-
## Parameters File
|
|
374
|
-
|
|
375
|
-
```json
|
|
376
|
-
// parameters.dev.json
|
|
377
|
-
{
|
|
378
|
-
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
|
|
379
|
-
"contentVersion": "1.0.0.0",
|
|
380
|
-
"parameters": {
|
|
381
|
-
"environment": {
|
|
382
|
-
"value": "dev"
|
|
383
|
-
},
|
|
384
|
-
"appName": {
|
|
385
|
-
"value": "myapp"
|
|
386
|
-
},
|
|
387
|
-
"sqlAdminPassword": {
|
|
388
|
-
"reference": {
|
|
389
|
-
"keyVault": {
|
|
390
|
-
"id": "/subscriptions/{sub-id}/resourceGroups/{rg}/providers/Microsoft.KeyVault/vaults/{kv-name}"
|
|
391
|
-
},
|
|
392
|
-
"secretName": "sql-admin-password"
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
## Documentação de Referência
|
|
400
|
-
|
|
401
|
-
- [Azure Bicep](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/)
|
|
402
|
-
- [Bicep Reference](https://learn.microsoft.com/en-us/azure/templates/)
|
|
403
|
-
- [Bicep Modules](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/modules)
|
|
404
|
-
- [Best Practices](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/best-practices)
|
|
405
|
-
|
|
406
|
-
## Checklist de IaC
|
|
407
|
-
|
|
408
|
-
- [ ] Bicep válido (`az bicep build`)
|
|
409
|
-
- [ ] Modules para recursos reutilizáveis
|
|
410
|
-
- [ ] Parâmetros para dev e prod
|
|
411
|
-
- [ ] Secrets referenciados do Key Vault
|
|
412
|
-
- [ ] Tags em todos os recursos
|
|
413
|
-
- [ ] What-if executado antes de deploy
|
|
414
|
-
- [ ] Outputs para valores importantes
|
|
415
|
-
- [ ] Documentação dos parâmetros
|
|
416
|
-
|
|
417
|
-
---
|
|
418
|
-
|
|
419
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
1
|
+
# Bicep Architect
|
|
2
|
+
|
|
3
|
+
> **Layer:** 2 | **Load:** on-keyword | **Keywords:** bicep, iac, infrastructure as code, provision, azure resource, deploy
|
|
4
|
+
|
|
5
|
+
Especialista em Infrastructure as Code com Azure Bicep. **Zero Portal** — all infra via code.
|
|
6
|
+
|
|
7
|
+
## Structure
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
infra/
|
|
11
|
+
├── main.bicep # Entry point
|
|
12
|
+
├── main.bicepparam # Parameters (alt to JSON)
|
|
13
|
+
├── parameters.dev.json
|
|
14
|
+
├── parameters.prod.json
|
|
15
|
+
└── modules/
|
|
16
|
+
├── container-app.bicep
|
|
17
|
+
├── container-app-env.bicep
|
|
18
|
+
├── sql-database.bicep
|
|
19
|
+
├── storage.bicep
|
|
20
|
+
├── key-vault.bicep
|
|
21
|
+
├── app-insights.bicep
|
|
22
|
+
├── service-bus.bicep
|
|
23
|
+
└── redis-cache.bicep
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Main Template Pattern
|
|
27
|
+
|
|
28
|
+
```bicep
|
|
29
|
+
targetScope = 'resourceGroup'
|
|
30
|
+
|
|
31
|
+
@allowed(['dev', 'staging', 'prod'])
|
|
32
|
+
param environment string = 'dev'
|
|
33
|
+
param location string = resourceGroup().location
|
|
34
|
+
@minLength(3) @maxLength(20) param appName string
|
|
35
|
+
@secure() param sqlAdminPassword string
|
|
36
|
+
|
|
37
|
+
var resourcePrefix = '${appName}-${environment}'
|
|
38
|
+
var tags = { environment: environment, application: appName, managedBy: 'bicep' }
|
|
39
|
+
|
|
40
|
+
resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2022-10-01' = {
|
|
41
|
+
name: '${resourcePrefix}-logs'
|
|
42
|
+
location: location
|
|
43
|
+
tags: tags
|
|
44
|
+
properties: { sku: { name: 'PerGB2018' }, retentionInDays: 30 }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
module appInsights 'modules/app-insights.bicep' = { name: 'appInsights', params: { ... } }
|
|
48
|
+
module containerAppEnv 'modules/container-app-env.bicep' = { name: 'env', params: { ... } }
|
|
49
|
+
module containerApp 'modules/container-app.bicep' = { name: 'app', params: { ... } }
|
|
50
|
+
module sqlDatabase 'modules/sql-database.bicep' = { name: 'sql', params: { ... } }
|
|
51
|
+
module keyVault 'modules/key-vault.bicep' = { name: 'kv', params: { ... } }
|
|
52
|
+
|
|
53
|
+
output containerAppUrl string = containerApp.outputs.url
|
|
54
|
+
output sqlConnectionString string = sqlDatabase.outputs.connectionString
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## SQL Database Module (Free Tier)
|
|
58
|
+
|
|
59
|
+
```bicep
|
|
60
|
+
// modules/sql-database.bicep
|
|
61
|
+
param serverName string
|
|
62
|
+
param databaseName string
|
|
63
|
+
param location string
|
|
64
|
+
param tags object = {}
|
|
65
|
+
param adminUsername string = 'sqladmin'
|
|
66
|
+
@secure() param adminPassword string
|
|
67
|
+
param useFree bool = true
|
|
68
|
+
|
|
69
|
+
resource sqlServer 'Microsoft.Sql/servers@2023-05-01-preview' = {
|
|
70
|
+
name: serverName
|
|
71
|
+
location: location
|
|
72
|
+
tags: tags
|
|
73
|
+
properties: { administratorLogin: adminUsername, administratorLoginPassword: adminPassword,
|
|
74
|
+
version: '12.0', minimalTlsVersion: '1.2', publicNetworkAccess: 'Enabled' }
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
resource db 'Microsoft.Sql/servers/databases@2023-05-01-preview' = {
|
|
78
|
+
parent: sqlServer
|
|
79
|
+
name: databaseName
|
|
80
|
+
location: location
|
|
81
|
+
sku: useFree ? { name: 'Free', tier: 'Free' } : { name: 'Basic', tier: 'Basic' }
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
resource firewall 'Microsoft.Sql/servers/firewallRules@2023-05-01-preview' = {
|
|
85
|
+
parent: sqlServer
|
|
86
|
+
name: 'AllowAllAzureIps'
|
|
87
|
+
properties: { startIpAddress: '0.0.0.0', endIpAddress: '0.0.0.0' }
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
> **Container App module:** See `container-specialist.md` for full Container App + ACR Bicep.
|
|
92
|
+
|
|
93
|
+
## Commands
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
az bicep build --file infra/main.bicep # Validate
|
|
97
|
+
az deployment group what-if -g rg-app-dev -f infra/main.bicep -p @infra/parameters.dev.json # Preview
|
|
98
|
+
az deployment group create -g rg-app-dev -f infra/main.bicep -p @infra/parameters.dev.json # Deploy
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Parameters File
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
|
|
106
|
+
"contentVersion": "1.0.0.0",
|
|
107
|
+
"parameters": {
|
|
108
|
+
"environment": { "value": "dev" },
|
|
109
|
+
"appName": { "value": "myapp" },
|
|
110
|
+
"sqlAdminPassword": { "reference": { "keyVault": { "id": "/subscriptions/.../vaults/{kv}" }, "secretName": "sql-admin-password" } }
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Checklist
|
|
116
|
+
- [ ] Bicep valid (`az bicep build`)
|
|
117
|
+
- [ ] Modules for reusable resources
|
|
118
|
+
- [ ] Parameters for dev and prod
|
|
119
|
+
- [ ] Secrets referenced from Key Vault
|
|
120
|
+
- [ ] Tags on all resources
|
|
121
|
+
- [ ] What-if executed before deploy
|
|
122
|
+
- [ ] Outputs for important values
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
*MORPH-SPEC by Polymorphism Tech*
|