@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.
Files changed (251) hide show
  1. package/CLAUDE.md +314 -1673
  2. package/LICENSE +72 -72
  3. package/README.md +515 -516
  4. package/bin/detect-agents.js +225 -225
  5. package/bin/morph-spec.js +358 -173
  6. package/bin/render-template.js +302 -302
  7. package/bin/semantic-detect-agents.js +246 -246
  8. package/bin/task-manager.js +429 -0
  9. package/bin/validate-agents-skills.js +251 -251
  10. package/bin/validate-agents.js +69 -69
  11. package/bin/validate-phase.js +263 -263
  12. package/bin/validate.js +369 -0
  13. package/content/.azure/README.md +293 -293
  14. package/content/.azure/docs/azure-devops-setup.md +454 -454
  15. package/content/.azure/docs/branch-strategy.md +398 -398
  16. package/content/.azure/docs/local-development.md +515 -515
  17. package/content/.azure/pipelines/pipeline-variables.yml +34 -34
  18. package/content/.azure/pipelines/prod-pipeline.yml +319 -319
  19. package/content/.azure/pipelines/staging-pipeline.yml +234 -234
  20. package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
  21. package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
  22. package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
  23. package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
  24. package/content/.claude/commands/morph-apply.md +221 -158
  25. package/content/.claude/commands/morph-archive.md +79 -79
  26. package/content/.claude/commands/morph-infra.md +209 -209
  27. package/content/.claude/commands/morph-preflight.md +227 -0
  28. package/content/.claude/commands/morph-proposal.md +122 -101
  29. package/content/.claude/commands/morph-status.md +86 -86
  30. package/content/.claude/commands/morph-troubleshoot.md +122 -0
  31. package/content/.claude/settings.local.json +15 -15
  32. package/content/.claude/skills/checklists/code-review.md +226 -0
  33. package/content/.claude/skills/checklists/morph-checklist.md +117 -0
  34. package/content/.claude/skills/checklists/simulation-checklist.md +77 -0
  35. package/content/.claude/skills/infra/bicep-architect.md +126 -419
  36. package/content/.claude/skills/infra/container-specialist.md +131 -437
  37. package/content/.claude/skills/infra/devops-engineer.md +119 -405
  38. package/content/.claude/skills/integrations/asaas-financial.md +130 -333
  39. package/content/.claude/skills/integrations/azure-identity.md +142 -309
  40. package/content/.claude/skills/integrations/clerk-auth.md +108 -290
  41. package/content/.claude/skills/integrations/resend-email.md +119 -0
  42. package/content/.claude/skills/specialists/ai-system-architect.md +192 -604
  43. package/content/.claude/skills/specialists/azure-architect.md +142 -142
  44. package/content/.claude/skills/specialists/code-analyzer.md +235 -0
  45. package/content/.claude/skills/specialists/dotnet-senior.md +287 -0
  46. package/content/.claude/skills/specialists/ef-modeler.md +113 -200
  47. package/content/.claude/skills/specialists/hangfire-orchestrator.md +126 -245
  48. package/content/.claude/skills/specialists/ms-agent-expert.md +109 -263
  49. package/content/.claude/skills/specialists/po-pm-advisor.md +197 -197
  50. package/content/.claude/skills/specialists/standards-architect.md +156 -78
  51. package/content/.claude/skills/specialists/testing-specialist.md +126 -0
  52. package/content/.claude/skills/specialists/ui-ux-designer.md +191 -1060
  53. package/content/.claude/skills/stacks/dotnet-blazor.md +210 -588
  54. package/content/.claude/skills/stacks/dotnet-nextjs.md +154 -402
  55. package/content/.claude/skills/workflows/morph-replicate.md +213 -0
  56. package/content/.claude/{commands/morph-clarify.md → skills/workflows/phase-clarify.md} +5 -58
  57. package/content/.claude/{commands/morph-design.md → skills/workflows/phase-design.md} +16 -86
  58. package/content/.claude/{commands/morph-setup.md → skills/workflows/phase-setup.md} +9 -17
  59. package/content/.claude/skills/workflows/phase-tasks.md +164 -0
  60. package/content/.claude/{commands/morph-uiux.md → skills/workflows/phase-uiux.md} +15 -88
  61. package/content/.morph/.morphversion +5 -5
  62. package/content/.morph/archive/.gitkeep +25 -25
  63. package/content/.morph/config/agents.json +378 -242
  64. package/content/.morph/config/config.template.json +89 -108
  65. package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
  66. package/content/.morph/docs/workflows/design-impl.md +37 -0
  67. package/content/.morph/docs/workflows/fast-track.md +29 -0
  68. package/content/.morph/docs/workflows/full-morph.md +76 -0
  69. package/content/.morph/docs/workflows/standard.md +44 -0
  70. package/content/.morph/docs/workflows/ui-refresh.md +39 -0
  71. package/content/.morph/examples/api-nextjs/README.md +241 -241
  72. package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
  73. package/content/.morph/examples/api-nextjs/spec.md +399 -399
  74. package/content/.morph/examples/api-nextjs/tasks.md +168 -168
  75. package/content/.morph/examples/micro-saas/README.md +125 -125
  76. package/content/.morph/examples/micro-saas/contracts.cs +358 -358
  77. package/content/.morph/examples/micro-saas/decisions.md +246 -246
  78. package/content/.morph/examples/micro-saas/spec.md +236 -236
  79. package/content/.morph/examples/micro-saas/tasks.md +150 -150
  80. package/content/.morph/examples/multi-agent/README.md +309 -309
  81. package/content/.morph/examples/multi-agent/contracts.cs +433 -433
  82. package/content/.morph/examples/multi-agent/spec.md +479 -479
  83. package/content/.morph/examples/multi-agent/tasks.md +185 -185
  84. package/content/.morph/examples/scheduled-reports/decisions.md +158 -0
  85. package/content/.morph/examples/scheduled-reports/proposal.md +95 -0
  86. package/content/.morph/examples/scheduled-reports/spec.md +267 -0
  87. package/content/.morph/examples/state-v3.json +188 -0
  88. package/content/.morph/features/.gitkeep +25 -25
  89. package/content/.morph/hooks/README.md +190 -239
  90. package/content/.morph/hooks/pre-commit-agents.sh +24 -24
  91. package/content/.morph/hooks/pre-commit-all.sh +48 -48
  92. package/content/.morph/hooks/pre-commit-specs.sh +49 -49
  93. package/content/.morph/hooks/pre-commit-tests.sh +60 -60
  94. package/content/.morph/project.md +160 -160
  95. package/content/.morph/schemas/agent.schema.json +296 -296
  96. package/content/.morph/schemas/tasks.schema.json +220 -0
  97. package/content/.morph/specs/.gitkeep +20 -20
  98. package/content/.morph/standards/agent-framework-blazor-ui.md +359 -0
  99. package/content/.morph/standards/agent-framework-production.md +410 -0
  100. package/content/.morph/standards/agent-framework-setup.md +413 -453
  101. package/content/.morph/standards/agent-framework-workflows.md +349 -0
  102. package/content/.morph/standards/architecture.md +325 -325
  103. package/content/.morph/standards/azure.md +605 -379
  104. package/content/.morph/standards/coding.md +377 -377
  105. package/content/.morph/standards/dotnet10-migration.md +520 -494
  106. package/content/.morph/standards/fluent-ui-setup.md +590 -590
  107. package/content/.morph/standards/migration-guide.md +514 -514
  108. package/content/.morph/standards/passkeys-auth.md +423 -423
  109. package/content/.morph/standards/vector-search-rag.md +536 -536
  110. package/content/.morph/state.json +17 -17
  111. package/content/.morph/templates/FluentDesignTheme.cs +149 -149
  112. package/content/.morph/templates/MudTheme.cs +281 -281
  113. package/content/.morph/templates/agent.cs +163 -172
  114. package/content/.morph/templates/clarify-questions.md +159 -0
  115. package/content/.morph/templates/component.razor +239 -239
  116. package/content/.morph/templates/contracts/Commands.cs +74 -0
  117. package/content/.morph/templates/contracts/Entities.cs +25 -0
  118. package/content/.morph/templates/contracts/Queries.cs +74 -0
  119. package/content/.morph/templates/contracts/README.md +74 -0
  120. package/content/.morph/templates/contracts.cs +217 -217
  121. package/content/.morph/templates/decisions.md +123 -106
  122. package/content/.morph/templates/design-system.css +226 -226
  123. package/content/.morph/templates/infra/.dockerignore.example +89 -89
  124. package/content/.morph/templates/infra/Dockerfile.example +82 -82
  125. package/content/.morph/templates/infra/README.md +286 -286
  126. package/content/.morph/templates/infra/app-insights.bicep +63 -63
  127. package/content/.morph/templates/infra/app-service.bicep +164 -164
  128. package/content/.morph/templates/infra/container-app-env.bicep +49 -49
  129. package/content/.morph/templates/infra/container-app.bicep +156 -156
  130. package/content/.morph/templates/infra/deploy-checklist.md +426 -0
  131. package/content/.morph/templates/infra/deploy.ps1 +229 -229
  132. package/content/.morph/templates/infra/deploy.sh +208 -208
  133. package/content/.morph/templates/infra/key-vault.bicep +91 -91
  134. package/content/.morph/templates/infra/main.bicep +189 -189
  135. package/content/.morph/templates/infra/parameters.dev.json +29 -29
  136. package/content/.morph/templates/infra/parameters.prod.json +29 -29
  137. package/content/.morph/templates/infra/parameters.staging.json +29 -29
  138. package/content/.morph/templates/infra/sql-database.bicep +103 -103
  139. package/content/.morph/templates/infra/storage.bicep +106 -106
  140. package/content/.morph/templates/integrations/asaas-client.cs +387 -387
  141. package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
  142. package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
  143. package/content/.morph/templates/integrations/clerk-config.cs +258 -258
  144. package/content/.morph/templates/job.cs +171 -171
  145. package/content/.morph/templates/migration.cs +83 -83
  146. package/content/.morph/templates/proposal.md +141 -155
  147. package/content/.morph/templates/recap.md +94 -105
  148. package/content/.morph/templates/repository.cs +141 -141
  149. package/content/.morph/templates/saas/subscription.cs +347 -347
  150. package/content/.morph/templates/saas/tenant.cs +338 -338
  151. package/content/.morph/templates/service.cs +139 -139
  152. package/content/.morph/templates/simulation.md +353 -0
  153. package/content/.morph/templates/spec.md +149 -148
  154. package/content/.morph/templates/sprint-status.yaml +68 -68
  155. package/content/.morph/templates/state.template.json +222 -222
  156. package/content/.morph/templates/story.md +143 -143
  157. package/content/.morph/templates/tasks.md +257 -235
  158. package/content/.morph/templates/test.cs +239 -239
  159. package/content/.morph/templates/ui-components.md +362 -276
  160. package/content/.morph/templates/ui-design-system.md +286 -286
  161. package/content/.morph/templates/ui-flows.md +336 -336
  162. package/content/.morph/templates/ui-mockups.md +133 -133
  163. package/content/.morph/test-infra/example.bicep +59 -59
  164. package/content/CLAUDE.md +150 -442
  165. package/content/README.md +79 -79
  166. package/detectors/config-detector.js +223 -223
  167. package/detectors/conversation-analyzer.js +163 -163
  168. package/detectors/index.js +84 -84
  169. package/detectors/standards-generator.js +275 -275
  170. package/detectors/structure-detector.js +245 -250
  171. package/docs/README.md +144 -149
  172. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
  173. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
  174. package/docs/api/scripts/collapse.js +38 -38
  175. package/docs/api/scripts/commonNav.js +28 -28
  176. package/docs/api/scripts/linenumber.js +25 -25
  177. package/docs/api/scripts/nav.js +12 -12
  178. package/docs/api/scripts/polyfill.js +3 -3
  179. package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
  180. package/docs/api/scripts/prettify/lang-css.js +2 -2
  181. package/docs/api/scripts/prettify/prettify.js +28 -28
  182. package/docs/api/scripts/search.js +98 -98
  183. package/docs/api/styles/jsdoc.css +776 -776
  184. package/docs/api/styles/prettify.css +80 -80
  185. package/docs/examples.md +328 -328
  186. package/docs/getting-started.md +301 -302
  187. package/docs/installation.md +361 -361
  188. package/docs/templates.md +418 -418
  189. package/docs/validation-checklist.md +265 -266
  190. package/package.json +80 -80
  191. package/scripts/postinstall.js +132 -132
  192. package/src/commands/advance-phase.js +183 -0
  193. package/src/commands/analyze-blazor-concurrency.js +193 -0
  194. package/src/commands/create-story.js +351 -351
  195. package/src/commands/detect-agents.js +139 -0
  196. package/src/commands/detect.js +104 -104
  197. package/src/commands/doctor.js +356 -280
  198. package/src/commands/generate.js +149 -149
  199. package/src/commands/init.js +258 -245
  200. package/src/commands/lint-fluent.js +352 -0
  201. package/src/commands/rollback-phase.js +185 -0
  202. package/src/commands/session-summary.js +291 -0
  203. package/src/commands/shard-spec.js +224 -224
  204. package/src/commands/sprint-status.js +250 -250
  205. package/src/commands/state.js +333 -333
  206. package/src/commands/sync.js +167 -167
  207. package/src/commands/task.js +78 -0
  208. package/src/commands/troubleshoot.js +222 -0
  209. package/src/commands/update.js +192 -159
  210. package/src/commands/validate-blazor-state.js +210 -0
  211. package/src/commands/validate-blazor.js +156 -0
  212. package/src/commands/validate-css.js +84 -0
  213. package/src/commands/validate-phase.js +221 -0
  214. package/src/lib/blazor-concurrency-analyzer.js +288 -0
  215. package/src/lib/blazor-state-validator.js +291 -0
  216. package/src/lib/blazor-validator.js +374 -0
  217. package/src/lib/complexity-analyzer.js +441 -292
  218. package/src/lib/continuous-validator.js +421 -0
  219. package/src/lib/css-validator.js +352 -0
  220. package/src/lib/decision-constraint-loader.js +109 -0
  221. package/src/lib/design-system-generator.js +298 -298
  222. package/src/lib/learning-system.js +520 -0
  223. package/src/lib/mockup-generator.js +366 -0
  224. package/src/lib/recap-generator.js +205 -0
  225. package/src/lib/state-manager.js +397 -340
  226. package/src/lib/troubleshoot-grep.js +194 -0
  227. package/src/lib/troubleshoot-index.js +144 -0
  228. package/src/lib/ui-detector.js +350 -0
  229. package/src/lib/validation-runner.js +231 -0
  230. package/src/lib/validators/architecture-validator.js +387 -0
  231. package/src/lib/validators/contract-compliance-validator.js +273 -0
  232. package/src/lib/validators/package-validator.js +360 -0
  233. package/src/lib/validators/ui-contrast-validator.js +422 -0
  234. package/src/utils/file-copier.js +179 -139
  235. package/src/utils/logger.js +32 -32
  236. package/src/utils/version-checker.js +175 -175
  237. package/content/.claude/commands/morph-costs.md +0 -206
  238. package/content/.claude/commands/morph-tasks.md +0 -319
  239. package/content/.claude/skills/specialists/cost-guardian.md +0 -110
  240. package/content/.claude/skills/stacks/shopify.md +0 -445
  241. package/content/.morph/config/azure-pricing.json +0 -70
  242. package/content/.morph/config/azure-pricing.schema.json +0 -50
  243. package/content/.morph/hooks/pre-commit-costs.sh +0 -91
  244. package/docs/api/cost-calculator.js.html +0 -513
  245. package/docs/api/design-system-generator.js.html +0 -382
  246. package/docs/api/global.html +0 -5263
  247. package/docs/api/index.html +0 -96
  248. package/docs/api/state-manager.js.html +0 -423
  249. package/src/commands/cost.js +0 -181
  250. package/src/commands/update-pricing.js +0 -206
  251. package/src/lib/cost-calculator.js +0 -429
@@ -1,419 +1,126 @@
1
- # Bicep Architect
2
-
3
- Especialista em Infrastructure as Code com Azure Bicep.
4
-
5
- ## Responsabilidades
6
-
7
- 1. **Criar templates Bicep** para provisionar recursos Azure
8
- 2. **Garantir zero portal** - toda infra via código
9
- 3. **Modularizar templates** para reusabilidade
10
- 4. **Validar e testar** antes de deploy
11
-
12
- ## Triggers
13
-
14
- Keywords: `bicep`, `iac`, `infrastructure as code`, `provision`, `azure resource`, `arm template`, `deploy`
15
-
16
- ## Princípio: Zero Portal
17
-
18
- > **NUNCA** criar recursos Azure manualmente no portal. Tudo via Bicep.
19
-
20
- ## Estrutura IaC
21
-
22
- ```
23
- infra/
24
- ├── main.bicep # Entry point
25
- ├── main.bicepparam # Parameters (alternativa a JSON)
26
- ├── parameters.dev.json # Params ambiente dev
27
- ├── parameters.prod.json # Params ambiente prod
28
- └── modules/
29
- ├── container-app.bicep # Container Apps
30
- ├── container-app-env.bicep # Environment
31
- ├── sql-database.bicep # Azure SQL
32
- ├── storage.bicep # Storage Account
33
- ├── key-vault.bicep # Key Vault
34
- ├── app-insights.bicep # Monitoring
35
- ├── service-bus.bicep # Mensageria
36
- └── redis-cache.bicep # Cache
37
- ```
38
-
39
- ## Main Template
40
-
41
- ```bicep
42
- // infra/main.bicep
43
- targetScope = 'resourceGroup'
44
-
45
- // Parameters
46
- @description('Environment name')
47
- @allowed(['dev', 'staging', 'prod'])
48
- param environment string = 'dev'
49
-
50
- @description('Location for resources')
51
- param location string = resourceGroup().location
52
-
53
- @description('Application name')
54
- @minLength(3)
55
- @maxLength(20)
56
- param appName string
57
-
58
- @description('SQL Admin password')
59
- @secure()
60
- param sqlAdminPassword string
61
-
62
- // Variables
63
- var resourcePrefix = '${appName}-${environment}'
64
- var tags = {
65
- environment: environment
66
- application: appName
67
- managedBy: 'bicep'
68
- }
69
-
70
- // Log Analytics (required for Container Apps)
71
- resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2022-10-01' = {
72
- name: '${resourcePrefix}-logs'
73
- location: location
74
- tags: tags
75
- properties: {
76
- sku: {
77
- name: 'PerGB2018'
78
- }
79
- retentionInDays: 30
80
- }
81
- }
82
-
83
- // Application Insights
84
- module appInsights 'modules/app-insights.bicep' = {
85
- name: 'appInsights'
86
- params: {
87
- name: '${resourcePrefix}-insights'
88
- location: location
89
- tags: tags
90
- logAnalyticsWorkspaceId: logAnalytics.id
91
- }
92
- }
93
-
94
- // Container Apps Environment
95
- module containerAppEnv 'modules/container-app-env.bicep' = {
96
- name: 'containerAppEnv'
97
- params: {
98
- name: '${resourcePrefix}-env'
99
- location: location
100
- tags: tags
101
- logAnalyticsWorkspaceId: logAnalytics.id
102
- }
103
- }
104
-
105
- // Container App
106
- module containerApp 'modules/container-app.bicep' = {
107
- name: 'containerApp'
108
- params: {
109
- name: resourcePrefix
110
- location: location
111
- tags: tags
112
- environmentId: containerAppEnv.outputs.id
113
- containerImage: 'mcr.microsoft.com/hello-world:latest'
114
- appInsightsConnectionString: appInsights.outputs.connectionString
115
- }
116
- }
117
-
118
- // SQL Database
119
- module sqlDatabase 'modules/sql-database.bicep' = {
120
- name: 'sqlDatabase'
121
- params: {
122
- serverName: '${resourcePrefix}-sql'
123
- databaseName: appName
124
- location: location
125
- tags: tags
126
- adminPassword: sqlAdminPassword
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*