@polymorphism-tech/morph-spec 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +279 -0
  2. package/bin/morph-spec.js +53 -0
  3. package/content/.claude/commands/morph-apply.md +66 -0
  4. package/content/.claude/commands/morph-archive.md +79 -0
  5. package/content/.claude/commands/morph-costs.md +206 -0
  6. package/content/.claude/commands/morph-infra.md +209 -0
  7. package/content/.claude/commands/morph-proposal.md +60 -0
  8. package/content/.claude/commands/morph-status.md +71 -0
  9. package/content/.claude/settings.local.json +15 -0
  10. package/content/.claude/skills/infra/bicep-architect.md +419 -0
  11. package/content/.claude/skills/infra/container-specialist.md +437 -0
  12. package/content/.claude/skills/infra/devops-engineer.md +405 -0
  13. package/content/.claude/skills/integrations/asaas-financial.md +333 -0
  14. package/content/.claude/skills/integrations/azure-identity.md +309 -0
  15. package/content/.claude/skills/integrations/clerk-auth.md +290 -0
  16. package/content/.claude/skills/specialists/azure-architect.md +142 -0
  17. package/content/.claude/skills/specialists/cost-guardian.md +110 -0
  18. package/content/.claude/skills/specialists/ef-modeler.md +200 -0
  19. package/content/.claude/skills/specialists/hangfire-orchestrator.md +245 -0
  20. package/content/.claude/skills/specialists/ms-agent-expert.md +209 -0
  21. package/content/.claude/skills/specialists/po-pm-advisor.md +197 -0
  22. package/content/.claude/skills/specialists/standards-architect.md +78 -0
  23. package/content/.claude/skills/specialists/ui-ux-designer.md +325 -0
  24. package/content/.claude/skills/stacks/dotnet-blazor.md +352 -0
  25. package/content/.claude/skills/stacks/dotnet-nextjs.md +402 -0
  26. package/content/.claude/skills/stacks/shopify.md +445 -0
  27. package/content/.morph/archive/.gitkeep +25 -0
  28. package/content/.morph/config/agents.json +149 -0
  29. package/content/.morph/config/config.template.json +96 -0
  30. package/content/.morph/examples/api-nextjs/README.md +241 -0
  31. package/content/.morph/examples/api-nextjs/contracts.ts +307 -0
  32. package/content/.morph/examples/api-nextjs/spec.md +399 -0
  33. package/content/.morph/examples/api-nextjs/tasks.md +168 -0
  34. package/content/.morph/examples/micro-saas/README.md +125 -0
  35. package/content/.morph/examples/micro-saas/contracts.cs +358 -0
  36. package/content/.morph/examples/micro-saas/decisions.md +246 -0
  37. package/content/.morph/examples/micro-saas/spec.md +236 -0
  38. package/content/.morph/examples/micro-saas/tasks.md +150 -0
  39. package/content/.morph/examples/multi-agent/README.md +309 -0
  40. package/content/.morph/examples/multi-agent/contracts.cs +433 -0
  41. package/content/.morph/examples/multi-agent/spec.md +479 -0
  42. package/content/.morph/examples/multi-agent/tasks.md +185 -0
  43. package/content/.morph/features/.gitkeep +25 -0
  44. package/content/.morph/project.md +159 -0
  45. package/content/.morph/specs/.gitkeep +20 -0
  46. package/content/.morph/standards/architecture.md +190 -0
  47. package/content/.morph/standards/azure.md +184 -0
  48. package/content/.morph/standards/coding.md +342 -0
  49. package/content/.morph/templates/agent.cs +172 -0
  50. package/content/.morph/templates/component.razor +239 -0
  51. package/content/.morph/templates/contracts.cs +217 -0
  52. package/content/.morph/templates/decisions.md +106 -0
  53. package/content/.morph/templates/infra/app-insights.bicep +63 -0
  54. package/content/.morph/templates/infra/container-app-env.bicep +49 -0
  55. package/content/.morph/templates/infra/container-app.bicep +156 -0
  56. package/content/.morph/templates/infra/key-vault.bicep +91 -0
  57. package/content/.morph/templates/infra/main.bicep +155 -0
  58. package/content/.morph/templates/infra/parameters.dev.json +23 -0
  59. package/content/.morph/templates/infra/parameters.prod.json +23 -0
  60. package/content/.morph/templates/infra/sql-database.bicep +103 -0
  61. package/content/.morph/templates/infra/storage.bicep +106 -0
  62. package/content/.morph/templates/integrations/asaas-client.cs +387 -0
  63. package/content/.morph/templates/integrations/asaas-webhook.cs +351 -0
  64. package/content/.morph/templates/integrations/azure-identity-config.cs +288 -0
  65. package/content/.morph/templates/integrations/clerk-config.cs +258 -0
  66. package/content/.morph/templates/job.cs +171 -0
  67. package/content/.morph/templates/migration.cs +83 -0
  68. package/content/.morph/templates/proposal.md +155 -0
  69. package/content/.morph/templates/recap.md +105 -0
  70. package/content/.morph/templates/repository.cs +141 -0
  71. package/content/.morph/templates/saas/subscription.cs +347 -0
  72. package/content/.morph/templates/saas/tenant.cs +338 -0
  73. package/content/.morph/templates/service.cs +139 -0
  74. package/content/.morph/templates/spec.md +147 -0
  75. package/content/.morph/templates/tasks.md +235 -0
  76. package/content/.morph/templates/test.cs +239 -0
  77. package/content/CLAUDE.md +318 -0
  78. package/package.json +50 -0
  79. package/src/commands/doctor.js +132 -0
  80. package/src/commands/init.js +121 -0
  81. package/src/commands/update.js +84 -0
  82. package/src/utils/file-copier.js +50 -0
  83. package/src/utils/logger.js +32 -0
@@ -0,0 +1,419 @@
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*