@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,405 +1,119 @@
1
- # DevOps Engineer
2
-
3
- Especialista em CI/CD, pipelines e automação de deploy.
4
-
5
- ## Responsabilidades
6
-
7
- 1. **Criar pipelines** de CI/CD para build e deploy
8
- 2. **Automatizar releases** para múltiplos ambientes
9
- 3. **Configurar testes** automatizados no pipeline
10
- 4. **Gerenciar ambientes** e variáveis
11
-
12
- ## Triggers
13
-
14
- Keywords: `pipeline`, `ci/cd`, `deploy`, `release`, `azure devops`, `github actions`, `build`, `automation`
15
-
16
- ## Azure Pipelines (Azure DevOps)
17
-
18
- ### Pipeline YAML Completo
19
-
20
- ```yaml
21
- # azure-pipelines.yml
22
- trigger:
23
- branches:
24
- include:
25
- - main
26
- - develop
27
- paths:
28
- exclude:
29
- - '**/*.md'
30
- - '.gitignore'
31
-
32
- pr:
33
- branches:
34
- include:
35
- - main
36
- - develop
37
-
38
- variables:
39
- buildConfiguration: 'Release'
40
- dotnetVersion: '9.0.x'
41
- azureSubscription: 'Azure-Service-Connection'
42
-
43
- stages:
44
- # Build Stage
45
- - stage: Build
46
- displayName: 'Build & Test'
47
- jobs:
48
- - job: BuildJob
49
- displayName: 'Build .NET App'
50
- pool:
51
- vmImage: 'ubuntu-latest'
52
- steps:
53
- - task: UseDotNet@2
54
- displayName: 'Install .NET SDK'
55
- inputs:
56
- version: '$(dotnetVersion)'
57
-
58
- - task: DotNetCoreCLI@2
59
- displayName: 'Restore packages'
60
- inputs:
61
- command: 'restore'
62
- projects: '**/*.csproj'
63
-
64
- - task: DotNetCoreCLI@2
65
- displayName: 'Build'
66
- inputs:
67
- command: 'build'
68
- projects: '**/*.csproj'
69
- arguments: '--configuration $(buildConfiguration) --no-restore'
70
-
71
- - task: DotNetCoreCLI@2
72
- displayName: 'Run Tests'
73
- inputs:
74
- command: 'test'
75
- projects: '**/tests/**/*.csproj'
76
- arguments: '--configuration $(buildConfiguration) --collect:"XPlat Code Coverage"'
77
-
78
- - task: PublishCodeCoverageResults@1
79
- displayName: 'Publish Coverage'
80
- inputs:
81
- codeCoverageTool: 'Cobertura'
82
- summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml'
83
-
84
- - task: DotNetCoreCLI@2
85
- displayName: 'Publish'
86
- inputs:
87
- command: 'publish'
88
- publishWebProjects: true
89
- arguments: '--configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)'
90
-
91
- - task: PublishBuildArtifacts@1
92
- displayName: 'Publish Artifacts'
93
- inputs:
94
- pathToPublish: '$(Build.ArtifactStagingDirectory)'
95
- artifactName: 'drop'
96
-
97
- # Deploy to Dev
98
- - stage: DeployDev
99
- displayName: 'Deploy to Dev'
100
- dependsOn: Build
101
- condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))
102
- jobs:
103
- - deployment: DeployToDev
104
- displayName: 'Deploy to Development'
105
- environment: 'development'
106
- pool:
107
- vmImage: 'ubuntu-latest'
108
- strategy:
109
- runOnce:
110
- deploy:
111
- steps:
112
- - task: AzureWebApp@1
113
- displayName: 'Deploy to Container App'
114
- inputs:
115
- azureSubscription: '$(azureSubscription)'
116
- appType: 'webAppContainer'
117
- appName: 'myapp-dev'
118
- deployToSlotOrASE: false
119
-
120
- # Deploy to Production
121
- - stage: DeployProd
122
- displayName: 'Deploy to Production'
123
- dependsOn: Build
124
- condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
125
- jobs:
126
- - deployment: DeployToProd
127
- displayName: 'Deploy to Production'
128
- environment: 'production'
129
- pool:
130
- vmImage: 'ubuntu-latest'
131
- strategy:
132
- runOnce:
133
- deploy:
134
- steps:
135
- - task: AzureWebApp@1
136
- displayName: 'Deploy to Container App'
137
- inputs:
138
- azureSubscription: '$(azureSubscription)'
139
- appType: 'webAppContainer'
140
- appName: 'myapp-prod'
141
- deployToSlotOrASE: true
142
- slotName: 'staging'
143
-
144
- - task: AzureAppServiceManage@0
145
- displayName: 'Swap Slots'
146
- inputs:
147
- azureSubscription: '$(azureSubscription)'
148
- action: 'Swap Slots'
149
- webAppName: 'myapp-prod'
150
- sourceSlot: 'staging'
151
- targetSlot: 'production'
152
- ```
153
-
154
- ### Pipeline com Docker
155
-
156
- ```yaml
157
- # azure-pipelines-docker.yml
158
- trigger:
159
- - main
160
-
161
- variables:
162
- dockerRegistryServiceConnection: 'acr-connection'
163
- containerRegistry: 'myacr.azurecr.io'
164
- imageRepository: 'myapp'
165
- dockerfilePath: 'Dockerfile'
166
- tag: '$(Build.BuildId)'
167
-
168
- stages:
169
- - stage: Build
170
- jobs:
171
- - job: BuildAndPush
172
- pool:
173
- vmImage: 'ubuntu-latest'
174
- steps:
175
- - task: Docker@2
176
- displayName: 'Build and push image'
177
- inputs:
178
- containerRegistry: '$(dockerRegistryServiceConnection)'
179
- repository: '$(imageRepository)'
180
- command: 'buildAndPush'
181
- Dockerfile: '$(dockerfilePath)'
182
- tags: |
183
- $(tag)
184
- latest
185
-
186
- - stage: DeployDev
187
- dependsOn: Build
188
- jobs:
189
- - deployment: Deploy
190
- environment: 'development'
191
- strategy:
192
- runOnce:
193
- deploy:
194
- steps:
195
- - task: AzureCLI@2
196
- displayName: 'Update Container App'
197
- inputs:
198
- azureSubscription: 'Azure-Connection'
199
- scriptType: 'bash'
200
- scriptLocation: 'inlineScript'
201
- inlineScript: |
202
- az containerapp update \
203
- --name myapp-dev \
204
- --resource-group rg-myapp-dev \
205
- --image $(containerRegistry)/$(imageRepository):$(tag)
206
- ```
207
-
208
- ## GitHub Actions
209
-
210
- ### Workflow Completo
211
-
212
- ```yaml
213
- # .github/workflows/ci-cd.yml
214
- name: CI/CD
215
-
216
- on:
217
- push:
218
- branches: [main, develop]
219
- pull_request:
220
- branches: [main, develop]
221
-
222
- env:
223
- DOTNET_VERSION: '9.0.x'
224
- REGISTRY: ghcr.io
225
- IMAGE_NAME: ${{ github.repository }}
226
-
227
- jobs:
228
- build:
229
- runs-on: ubuntu-latest
230
- steps:
231
- - uses: actions/checkout@v4
232
-
233
- - name: Setup .NET
234
- uses: actions/setup-dotnet@v4
235
- with:
236
- dotnet-version: ${{ env.DOTNET_VERSION }}
237
-
238
- - name: Restore
239
- run: dotnet restore
240
-
241
- - name: Build
242
- run: dotnet build --configuration Release --no-restore
243
-
244
- - name: Test
245
- run: dotnet test --configuration Release --no-build --verbosity normal
246
-
247
- - name: Publish
248
- run: dotnet publish src/Web/Web.csproj -c Release -o ./publish
249
-
250
- - name: Upload artifact
251
- uses: actions/upload-artifact@v4
252
- with:
253
- name: app
254
- path: ./publish
255
-
256
- docker:
257
- needs: build
258
- runs-on: ubuntu-latest
259
- if: github.event_name == 'push'
260
- permissions:
261
- contents: read
262
- packages: write
263
- steps:
264
- - uses: actions/checkout@v4
265
-
266
- - name: Log in to Container Registry
267
- uses: docker/login-action@v3
268
- with:
269
- registry: ${{ env.REGISTRY }}
270
- username: ${{ github.actor }}
271
- password: ${{ secrets.GITHUB_TOKEN }}
272
-
273
- - name: Build and push
274
- uses: docker/build-push-action@v5
275
- with:
276
- context: .
277
- push: true
278
- tags: |
279
- ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
280
- ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
281
-
282
- deploy-dev:
283
- needs: docker
284
- runs-on: ubuntu-latest
285
- if: github.ref == 'refs/heads/develop'
286
- environment: development
287
- steps:
288
- - name: Azure Login
289
- uses: azure/login@v2
290
- with:
291
- creds: ${{ secrets.AZURE_CREDENTIALS }}
292
-
293
- - name: Deploy to Container App
294
- uses: azure/container-apps-deploy-action@v1
295
- with:
296
- resourceGroup: rg-myapp-dev
297
- containerAppName: myapp-dev
298
- imageToDeploy: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
299
-
300
- deploy-prod:
301
- needs: docker
302
- runs-on: ubuntu-latest
303
- if: github.ref == 'refs/heads/main'
304
- environment: production
305
- steps:
306
- - name: Azure Login
307
- uses: azure/login@v2
308
- with:
309
- creds: ${{ secrets.AZURE_CREDENTIALS }}
310
-
311
- - name: Deploy to Container App
312
- uses: azure/container-apps-deploy-action@v1
313
- with:
314
- resourceGroup: rg-myapp-prod
315
- containerAppName: myapp-prod
316
- imageToDeploy: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
317
- ```
318
-
319
- ## Dockerfile
320
-
321
- ```dockerfile
322
- # Dockerfile
323
- FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
324
- WORKDIR /app
325
- EXPOSE 8080
326
-
327
- FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
328
- WORKDIR /src
329
-
330
- # Copy csproj and restore
331
- COPY ["src/Web/Web.csproj", "src/Web/"]
332
- COPY ["src/Application/Application.csproj", "src/Application/"]
333
- COPY ["src/Domain/Domain.csproj", "src/Domain/"]
334
- COPY ["src/Infrastructure/Infrastructure.csproj", "src/Infrastructure/"]
335
- RUN dotnet restore "src/Web/Web.csproj"
336
-
337
- # Copy everything and build
338
- COPY . .
339
- RUN dotnet build "src/Web/Web.csproj" -c Release -o /app/build
340
-
341
- FROM build AS publish
342
- RUN dotnet publish "src/Web/Web.csproj" -c Release -o /app/publish /p:UseAppHost=false
343
-
344
- FROM base AS final
345
- WORKDIR /app
346
- COPY --from=publish /app/publish .
347
-
348
- # Non-root user
349
- USER $APP_UID
350
-
351
- ENTRYPOINT ["dotnet", "Web.dll"]
352
- ```
353
-
354
- ## Variáveis e Secrets
355
-
356
- ### Azure DevOps
357
-
358
- ```yaml
359
- # Variable Groups
360
- variables:
361
- - group: 'MyApp-Dev-Variables' # Link to variable group
362
-
363
- # Pipeline variables with secrets
364
- variables:
365
- - name: 'SqlPassword'
366
- value: '$(SQL_PASSWORD)' # From variable group or pipeline variables
367
- ```
368
-
369
- ### GitHub Actions
370
-
371
- ```yaml
372
- # Using secrets
373
- env:
374
- CONNECTION_STRING: ${{ secrets.CONNECTION_STRING }}
375
-
376
- # Using environments
377
- jobs:
378
- deploy:
379
- environment: production
380
- env:
381
- API_KEY: ${{ secrets.API_KEY }} # Environment-specific secret
382
- ```
383
-
384
- ## Documentação de Referência
385
-
386
- - [Azure Pipelines](https://learn.microsoft.com/en-us/azure/devops/pipelines/)
387
- - [GitHub Actions](https://docs.github.com/en/actions)
388
- - [YAML Schema](https://learn.microsoft.com/en-us/azure/devops/pipelines/yaml-schema/)
389
- - [Container Apps Deploy](https://learn.microsoft.com/en-us/azure/container-apps/github-actions)
390
-
391
- ## Checklist de Pipeline
392
-
393
- - [ ] Trigger configurado (branches, paths)
394
- - [ ] Build com restore, build, test
395
- - [ ] Publicação de artifacts
396
- - [ ] Code coverage publicado
397
- - [ ] Deploy para dev automático
398
- - [ ] Deploy para prod com approval
399
- - [ ] Secrets no Key Vault ou variable groups
400
- - [ ] Dockerfile otimizado (multi-stage)
401
- - [ ] Health check após deploy
402
-
403
- ---
404
-
405
- *MORPH-SPEC by Polymorphism Tech*
1
+ # DevOps Engineer
2
+
3
+ > **Layer:** 2 | **Load:** on-keyword | **Keywords:** pipeline, ci/cd, deploy, release, azure devops, github actions, build, automation
4
+
5
+ Especialista em CI/CD, pipelines e automação de deploy.
6
+
7
+ ## Azure Pipelines
8
+
9
+ ```yaml
10
+ trigger:
11
+ branches: { include: [main, develop] }
12
+ paths: { exclude: ['**/*.md'] }
13
+
14
+ variables:
15
+ buildConfiguration: 'Release'
16
+ dotnetVersion: '10.0.x'
17
+
18
+ stages:
19
+ - stage: Build
20
+ jobs:
21
+ - job: BuildJob
22
+ pool: { vmImage: 'ubuntu-latest' }
23
+ steps:
24
+ - task: UseDotNet@2
25
+ inputs: { version: '$(dotnetVersion)' }
26
+ - task: DotNetCoreCLI@2
27
+ displayName: 'Restore'
28
+ inputs: { command: 'restore', projects: '**/*.csproj' }
29
+ - task: DotNetCoreCLI@2
30
+ displayName: 'Build'
31
+ inputs: { command: 'build', arguments: '-c $(buildConfiguration) --no-restore' }
32
+ - task: DotNetCoreCLI@2
33
+ displayName: 'Test'
34
+ inputs: { command: 'test', projects: '**/tests/**/*.csproj', arguments: '--collect:"XPlat Code Coverage"' }
35
+ - task: DotNetCoreCLI@2
36
+ displayName: 'Publish'
37
+ inputs: { command: 'publish', publishWebProjects: true, arguments: '-c $(buildConfiguration) -o $(Build.ArtifactStagingDirectory)' }
38
+ - task: PublishBuildArtifacts@1
39
+ inputs: { pathToPublish: '$(Build.ArtifactStagingDirectory)', artifactName: 'drop' }
40
+
41
+ - stage: DeployDev
42
+ dependsOn: Build
43
+ condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))
44
+ jobs:
45
+ - deployment: Deploy
46
+ environment: 'development'
47
+ strategy:
48
+ runOnce:
49
+ deploy:
50
+ steps:
51
+ - task: AzureCLI@2
52
+ inputs:
53
+ scriptType: 'bash'
54
+ inlineScript: 'az containerapp update --name app-dev -g rg-dev --image $(image)'
55
+ ```
56
+
57
+ ## GitHub Actions
58
+
59
+ ```yaml
60
+ name: CI/CD
61
+ on:
62
+ push: { branches: [main, develop] }
63
+ pull_request: { branches: [main] }
64
+
65
+ jobs:
66
+ build:
67
+ runs-on: ubuntu-latest
68
+ steps:
69
+ - uses: actions/checkout@v4
70
+ - uses: actions/setup-dotnet@v4
71
+ with: { dotnet-version: '10.0.x' }
72
+ - run: dotnet restore && dotnet build -c Release --no-restore && dotnet test -c Release --no-build
73
+ - run: dotnet publish src/Web/Web.csproj -c Release -o ./publish
74
+
75
+ docker:
76
+ needs: build
77
+ if: github.event_name == 'push'
78
+ runs-on: ubuntu-latest
79
+ permissions: { contents: read, packages: write }
80
+ steps:
81
+ - uses: actions/checkout@v4
82
+ - uses: docker/login-action@v3
83
+ with: { registry: ghcr.io, username: '${{ github.actor }}', password: '${{ secrets.GITHUB_TOKEN }}' }
84
+ - uses: docker/build-push-action@v5
85
+ with: { push: true, tags: 'ghcr.io/${{ github.repository }}:${{ github.sha }}' }
86
+
87
+ deploy:
88
+ needs: docker
89
+ if: github.ref == 'refs/heads/main'
90
+ runs-on: ubuntu-latest
91
+ environment: production
92
+ steps:
93
+ - uses: azure/login@v2
94
+ with: { creds: '${{ secrets.AZURE_CREDENTIALS }}' }
95
+ - uses: azure/container-apps-deploy-action@v1
96
+ with: { resourceGroup: rg-prod, containerAppName: app-prod, imageToDeploy: 'ghcr.io/${{ github.repository }}:${{ github.sha }}' }
97
+ ```
98
+
99
+ > **Dockerfile:** See `container-specialist.md` for optimized multi-stage Dockerfile.
100
+
101
+ ## Secrets Management
102
+
103
+ | Platform | Method |
104
+ |----------|--------|
105
+ | Azure DevOps | Variable Groups + Key Vault references |
106
+ | GitHub Actions | Repository/Environment Secrets |
107
+
108
+ ## Checklist
109
+ - [ ] Trigger configured (branches, paths)
110
+ - [ ] Build: restore, build, test, publish
111
+ - [ ] Code coverage published
112
+ - [ ] Deploy to dev automatic (develop branch)
113
+ - [ ] Deploy to prod with approval (main branch)
114
+ - [ ] Secrets in Key Vault or variable groups
115
+ - [ ] Health check after deploy
116
+
117
+ ---
118
+
119
+ *MORPH-SPEC by Polymorphism Tech*