@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.
- package/README.md +279 -0
- package/bin/morph-spec.js +53 -0
- package/content/.claude/commands/morph-apply.md +66 -0
- package/content/.claude/commands/morph-archive.md +79 -0
- package/content/.claude/commands/morph-costs.md +206 -0
- package/content/.claude/commands/morph-infra.md +209 -0
- package/content/.claude/commands/morph-proposal.md +60 -0
- package/content/.claude/commands/morph-status.md +71 -0
- package/content/.claude/settings.local.json +15 -0
- package/content/.claude/skills/infra/bicep-architect.md +419 -0
- package/content/.claude/skills/infra/container-specialist.md +437 -0
- package/content/.claude/skills/infra/devops-engineer.md +405 -0
- package/content/.claude/skills/integrations/asaas-financial.md +333 -0
- package/content/.claude/skills/integrations/azure-identity.md +309 -0
- package/content/.claude/skills/integrations/clerk-auth.md +290 -0
- package/content/.claude/skills/specialists/azure-architect.md +142 -0
- package/content/.claude/skills/specialists/cost-guardian.md +110 -0
- package/content/.claude/skills/specialists/ef-modeler.md +200 -0
- package/content/.claude/skills/specialists/hangfire-orchestrator.md +245 -0
- package/content/.claude/skills/specialists/ms-agent-expert.md +209 -0
- package/content/.claude/skills/specialists/po-pm-advisor.md +197 -0
- package/content/.claude/skills/specialists/standards-architect.md +78 -0
- package/content/.claude/skills/specialists/ui-ux-designer.md +325 -0
- package/content/.claude/skills/stacks/dotnet-blazor.md +352 -0
- package/content/.claude/skills/stacks/dotnet-nextjs.md +402 -0
- package/content/.claude/skills/stacks/shopify.md +445 -0
- package/content/.morph/archive/.gitkeep +25 -0
- package/content/.morph/config/agents.json +149 -0
- package/content/.morph/config/config.template.json +96 -0
- package/content/.morph/examples/api-nextjs/README.md +241 -0
- package/content/.morph/examples/api-nextjs/contracts.ts +307 -0
- package/content/.morph/examples/api-nextjs/spec.md +399 -0
- package/content/.morph/examples/api-nextjs/tasks.md +168 -0
- package/content/.morph/examples/micro-saas/README.md +125 -0
- package/content/.morph/examples/micro-saas/contracts.cs +358 -0
- package/content/.morph/examples/micro-saas/decisions.md +246 -0
- package/content/.morph/examples/micro-saas/spec.md +236 -0
- package/content/.morph/examples/micro-saas/tasks.md +150 -0
- package/content/.morph/examples/multi-agent/README.md +309 -0
- package/content/.morph/examples/multi-agent/contracts.cs +433 -0
- package/content/.morph/examples/multi-agent/spec.md +479 -0
- package/content/.morph/examples/multi-agent/tasks.md +185 -0
- package/content/.morph/features/.gitkeep +25 -0
- package/content/.morph/project.md +159 -0
- package/content/.morph/specs/.gitkeep +20 -0
- package/content/.morph/standards/architecture.md +190 -0
- package/content/.morph/standards/azure.md +184 -0
- package/content/.morph/standards/coding.md +342 -0
- package/content/.morph/templates/agent.cs +172 -0
- package/content/.morph/templates/component.razor +239 -0
- package/content/.morph/templates/contracts.cs +217 -0
- package/content/.morph/templates/decisions.md +106 -0
- package/content/.morph/templates/infra/app-insights.bicep +63 -0
- package/content/.morph/templates/infra/container-app-env.bicep +49 -0
- package/content/.morph/templates/infra/container-app.bicep +156 -0
- package/content/.morph/templates/infra/key-vault.bicep +91 -0
- package/content/.morph/templates/infra/main.bicep +155 -0
- package/content/.morph/templates/infra/parameters.dev.json +23 -0
- package/content/.morph/templates/infra/parameters.prod.json +23 -0
- package/content/.morph/templates/infra/sql-database.bicep +103 -0
- package/content/.morph/templates/infra/storage.bicep +106 -0
- package/content/.morph/templates/integrations/asaas-client.cs +387 -0
- package/content/.morph/templates/integrations/asaas-webhook.cs +351 -0
- package/content/.morph/templates/integrations/azure-identity-config.cs +288 -0
- package/content/.morph/templates/integrations/clerk-config.cs +258 -0
- package/content/.morph/templates/job.cs +171 -0
- package/content/.morph/templates/migration.cs +83 -0
- package/content/.morph/templates/proposal.md +155 -0
- package/content/.morph/templates/recap.md +105 -0
- package/content/.morph/templates/repository.cs +141 -0
- package/content/.morph/templates/saas/subscription.cs +347 -0
- package/content/.morph/templates/saas/tenant.cs +338 -0
- package/content/.morph/templates/service.cs +139 -0
- package/content/.morph/templates/spec.md +147 -0
- package/content/.morph/templates/tasks.md +235 -0
- package/content/.morph/templates/test.cs +239 -0
- package/content/CLAUDE.md +318 -0
- package/package.json +50 -0
- package/src/commands/doctor.js +132 -0
- package/src/commands/init.js +121 -0
- package/src/commands/update.js +84 -0
- package/src/utils/file-copier.js +50 -0
- 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*
|