@polymorphism-tech/morph-spec 2.4.0 → 3.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/CLAUDE.md +158 -26
- package/LICENSE +72 -72
- package/bin/detect-agents.js +225 -225
- package/bin/morph-spec.js +8 -0
- package/bin/render-template.js +302 -302
- package/bin/semantic-detect-agents.js +246 -246
- package/bin/validate-agents-skills.js +251 -251
- package/bin/validate-agents.js +69 -69
- package/bin/validate-phase.js +263 -263
- package/content/.azure/README.md +293 -293
- package/content/.azure/docs/azure-devops-setup.md +454 -454
- package/content/.azure/docs/branch-strategy.md +398 -398
- package/content/.azure/docs/local-development.md +515 -515
- package/content/.azure/pipelines/pipeline-variables.yml +34 -34
- package/content/.azure/pipelines/prod-pipeline.yml +319 -319
- package/content/.azure/pipelines/staging-pipeline.yml +234 -234
- package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
- package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
- package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
- package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
- package/content/.claude/commands/morph-archive.md +79 -79
- package/content/.claude/commands/morph-deploy.md +529 -0
- package/content/.claude/commands/morph-infra.md +209 -209
- package/content/.claude/commands/morph-preflight.md +227 -227
- package/content/.claude/commands/morph-troubleshoot.md +122 -122
- package/content/.claude/settings.local.json +15 -15
- package/content/.claude/skills/infra/azure-deploy-specialist.md +699 -0
- package/content/.claude/skills/level-0-meta/README.md +7 -0
- package/content/.claude/skills/{checklists → level-0-meta}/morph-checklist.md +117 -117
- package/content/.claude/skills/level-1-workflows/README.md +7 -0
- package/content/.claude/skills/{workflows → level-1-workflows}/morph-replicate.md +213 -213
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-clarify.md +131 -131
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-design.md +213 -205
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-setup.md +106 -92
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-tasks.md +164 -164
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-uiux.md +169 -138
- package/content/.claude/skills/level-2-domains/README.md +14 -0
- package/content/.claude/skills/{specialists → level-2-domains/quality}/testing-specialist.md +126 -126
- package/content/.claude/skills/level-3-technologies/README.md +7 -0
- package/content/.claude/skills/level-4-patterns/README.md +7 -0
- package/content/.claude/skills/specialists/prompt-engineer.md +189 -0
- package/content/.claude/skills/specialists/seo-growth-hacker.md +320 -0
- package/content/.morph/.morphversion +5 -5
- package/content/.morph/archive/.gitkeep +25 -25
- package/content/.morph/config/agents.json +742 -358
- package/content/.morph/config/config.template.json +33 -0
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
- package/content/.morph/docs/workflows/enforcement-pipeline.md +668 -0
- package/content/.morph/examples/api-nextjs/README.md +241 -241
- package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
- package/content/.morph/examples/api-nextjs/spec.md +399 -399
- package/content/.morph/examples/api-nextjs/tasks.md +168 -168
- package/content/.morph/examples/micro-saas/README.md +125 -125
- package/content/.morph/examples/micro-saas/contracts.cs +358 -358
- package/content/.morph/examples/micro-saas/decisions.md +246 -246
- package/content/.morph/examples/micro-saas/spec.md +236 -236
- package/content/.morph/examples/micro-saas/tasks.md +150 -150
- package/content/.morph/examples/multi-agent/README.md +309 -309
- package/content/.morph/examples/multi-agent/contracts.cs +433 -433
- package/content/.morph/examples/multi-agent/spec.md +479 -479
- package/content/.morph/examples/multi-agent/tasks.md +185 -185
- package/content/.morph/examples/scheduled-reports/decisions.md +158 -158
- package/content/.morph/examples/scheduled-reports/proposal.md +95 -95
- package/content/.morph/examples/scheduled-reports/spec.md +267 -267
- package/content/.morph/examples/state-v3.json +188 -188
- package/content/.morph/features/.gitkeep +25 -25
- package/content/.morph/hooks/README.md +158 -0
- package/content/.morph/hooks/pre-commit-all.sh +48 -48
- package/content/.morph/hooks/pre-commit-specs.sh +49 -49
- package/content/.morph/hooks/pre-commit-tests.sh +60 -60
- package/content/.morph/hooks/task-completed.js +73 -0
- package/content/.morph/hooks/teammate-idle.js +68 -0
- package/content/.morph/project.md +160 -160
- package/content/.morph/schemas/agent.schema.json +296 -296
- package/content/.morph/schemas/tasks.schema.json +220 -220
- package/content/.morph/specs/.gitkeep +20 -20
- package/content/.morph/standards/agent-teams-workflow.md +474 -0
- package/content/.morph/standards/coding.md +377 -377
- package/content/.morph/standards/fluent-ui-setup.md +590 -590
- package/content/.morph/standards/migration-guide.md +514 -514
- package/content/.morph/standards/passkeys-auth.md +423 -423
- package/content/.morph/standards/vector-search-rag.md +536 -536
- package/content/.morph/state.json +17 -17
- package/content/.morph/templates/CONTEXT-FEATURE.md +276 -0
- package/content/.morph/templates/CONTEXT.md +170 -0
- package/content/.morph/templates/FluentDesignTheme.cs +149 -149
- package/content/.morph/templates/MudTheme.cs +281 -281
- package/content/.morph/templates/clarify-questions.md +159 -159
- package/content/.morph/templates/component.razor +239 -239
- package/content/.morph/templates/contracts/Commands.cs +74 -74
- package/content/.morph/templates/contracts/Entities.cs +25 -25
- package/content/.morph/templates/contracts/Queries.cs +74 -74
- package/content/.morph/templates/contracts/README.md +74 -74
- package/content/.morph/templates/contracts.cs +217 -217
- package/content/.morph/templates/design-system.css +226 -226
- package/content/.morph/templates/infra/.dockerignore.example +89 -89
- package/content/.morph/templates/infra/Dockerfile.example +82 -82
- package/content/.morph/templates/infra/README.md +286 -286
- package/content/.morph/templates/infra/app-insights.bicep +63 -63
- package/content/.morph/templates/infra/app-service.bicep +164 -164
- package/content/.morph/templates/infra/azure-pipelines-deploy.yml +480 -0
- package/content/.morph/templates/infra/container-app-env.bicep +49 -49
- package/content/.morph/templates/infra/container-app.bicep +156 -156
- package/content/.morph/templates/infra/deploy-checklist.md +426 -426
- package/content/.morph/templates/infra/deploy.ps1 +229 -229
- package/content/.morph/templates/infra/deploy.sh +208 -208
- package/content/.morph/templates/infra/key-vault.bicep +91 -91
- package/content/.morph/templates/infra/main.bicep +189 -189
- package/content/.morph/templates/infra/parameters.dev.json +29 -29
- package/content/.morph/templates/infra/parameters.prod.json +29 -29
- package/content/.morph/templates/infra/parameters.staging.json +29 -29
- package/content/.morph/templates/infra/sql-database.bicep +103 -103
- package/content/.morph/templates/infra/storage.bicep +106 -106
- package/content/.morph/templates/integrations/asaas-client.cs +387 -387
- package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
- package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
- package/content/.morph/templates/integrations/clerk-config.cs +258 -258
- package/content/.morph/templates/job.cs +171 -171
- package/content/.morph/templates/migration.cs +83 -83
- package/content/.morph/templates/repository.cs +141 -141
- package/content/.morph/templates/saas/subscription.cs +347 -347
- package/content/.morph/templates/saas/tenant.cs +338 -338
- package/content/.morph/templates/service.cs +139 -139
- package/content/.morph/templates/sprint-status.yaml +68 -68
- package/content/.morph/templates/story.md +143 -143
- package/content/.morph/templates/test.cs +239 -239
- package/content/.morph/templates/ui-design-system.md +286 -286
- package/content/.morph/templates/ui-flows.md +336 -336
- package/content/.morph/templates/ui-mockups.md +133 -133
- package/content/.morph/test-infra/example.bicep +59 -59
- package/content/README.md +79 -79
- package/detectors/config-detector.js +223 -223
- package/detectors/conversation-analyzer.js +163 -163
- package/detectors/index.js +84 -84
- package/detectors/standards-generator.js +275 -275
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
- package/docs/api/scripts/collapse.js +38 -38
- package/docs/api/scripts/commonNav.js +28 -28
- package/docs/api/scripts/linenumber.js +25 -25
- package/docs/api/scripts/nav.js +12 -12
- package/docs/api/scripts/polyfill.js +3 -3
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
- package/docs/api/scripts/prettify/lang-css.js +2 -2
- package/docs/api/scripts/prettify/prettify.js +28 -28
- package/docs/api/scripts/search.js +98 -98
- package/docs/api/styles/jsdoc.css +776 -776
- package/docs/api/styles/prettify.css +80 -80
- package/docs/examples.md +328 -328
- package/docs/templates.md +418 -418
- package/package.json +1 -1
- package/scripts/postinstall.js +132 -132
- package/src/commands/advance-phase.js +83 -0
- package/src/commands/analyze-blazor-concurrency.js +193 -193
- package/src/commands/create-story.js +351 -351
- package/src/commands/deploy.js +780 -0
- package/src/commands/detect-agents.js +34 -6
- package/src/commands/detect.js +104 -104
- package/src/commands/generate-context.js +40 -0
- package/src/commands/generate.js +149 -149
- package/src/commands/lint-fluent.js +352 -352
- package/src/commands/rollback-phase.js +185 -185
- package/src/commands/session-summary.js +291 -291
- package/src/commands/shard-spec.js +224 -224
- package/src/commands/sprint-status.js +250 -250
- package/src/commands/state.js +333 -333
- package/src/commands/sync.js +167 -167
- package/src/commands/troubleshoot.js +222 -222
- package/src/commands/validate-blazor-state.js +210 -210
- package/src/commands/validate-blazor.js +156 -156
- package/src/commands/validate-css.js +84 -84
- package/src/commands/validate-phase.js +221 -221
- package/src/lib/blazor-concurrency-analyzer.js +288 -288
- package/src/lib/blazor-state-validator.js +291 -291
- package/src/lib/blazor-validator.js +374 -374
- package/src/lib/context-generator.js +513 -0
- package/src/lib/css-validator.js +352 -352
- package/src/lib/design-system-detector.js +187 -0
- package/src/lib/design-system-generator.js +298 -298
- package/src/lib/design-system-scaffolder.js +299 -0
- package/src/lib/hook-executor.js +256 -0
- package/src/lib/learning-system.js +520 -520
- package/src/lib/mockup-generator.js +366 -366
- package/src/lib/spec-validator.js +258 -0
- package/src/lib/standards-context-injector.js +287 -0
- package/src/lib/team-orchestrator.js +322 -0
- package/src/lib/troubleshoot-grep.js +194 -194
- package/src/lib/troubleshoot-index.js +144 -144
- package/src/lib/ui-detector.js +350 -350
- package/src/lib/validation-runner.js +65 -13
- package/src/lib/validators/architecture-validator.js +387 -387
- package/src/lib/validators/design-system-validator.js +231 -0
- package/src/lib/validators/package-validator.js +360 -360
- package/src/lib/validators/ui-contrast-validator.js +422 -422
- package/src/utils/file-copier.js +9 -1
- package/src/utils/logger.js +32 -32
- package/src/utils/version-checker.js +175 -175
- /package/content/.claude/skills/{checklists → level-0-meta}/code-review.md +0 -0
- /package/content/.claude/skills/{checklists → level-0-meta}/simulation-checklist.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/ai-agents}/ai-system-architect.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/architecture}/po-pm-advisor.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/architecture}/standards-architect.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/dotnet-senior.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/ef-modeler.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/hangfire-orchestrator.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/ms-agent-expert.md +0 -0
- /package/content/.claude/skills/{stacks/dotnet-blazor.md → level-2-domains/frontend/blazor-builder.md} +0 -0
- /package/content/.claude/skills/{stacks/dotnet-nextjs.md → level-2-domains/frontend/nextjs-expert.md} +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/frontend}/ui-ux-designer.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/infrastructure}/azure-architect.md +0 -0
- /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/bicep-architect.md +0 -0
- /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/container-specialist.md +0 -0
- /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/devops-engineer.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/asaas-financial.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/azure-identity.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/clerk-auth.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/resend-email.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/quality}/code-analyzer.md +0 -0
|
@@ -1,117 +1,117 @@
|
|
|
1
|
-
# Skill: /morph-checklist
|
|
2
|
-
|
|
3
|
-
> **Layer:** 2 | **Load:** on-keyword | **Keywords:** checklist, deploy, security, seo, performance, accessibility, lgpd, legal
|
|
4
|
-
|
|
5
|
-
Types: `deploy`, `security`, `seo`, `performance`, `accessibility`, `legal-brazil`, `simulation` (see [simulation-checklist.md](simulation-checklist.md))
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Deploy
|
|
10
|
-
|
|
11
|
-
### Pre-Deploy
|
|
12
|
-
- [ ] `dotnet build --configuration Release` passes
|
|
13
|
-
- [ ] `dotnet test` passes
|
|
14
|
-
- [ ] Migrations applied (`dotnet ef database update`)
|
|
15
|
-
- [ ] Env vars configured (connection strings, API keys, feature flags)
|
|
16
|
-
|
|
17
|
-
### Infrastructure
|
|
18
|
-
- [ ] Bicep/IaC updated (`az deployment group what-if`)
|
|
19
|
-
- [ ] SSL/HTTPS configured
|
|
20
|
-
- [ ] DNS pointing correctly
|
|
21
|
-
- [ ] Health checks configured
|
|
22
|
-
|
|
23
|
-
### Security & Monitoring
|
|
24
|
-
- [ ] Secrets in Key Vault (not in code)
|
|
25
|
-
- [ ] Managed Identity configured
|
|
26
|
-
- [ ] CORS configured
|
|
27
|
-
- [ ] Rate limiting enabled
|
|
28
|
-
- [ ] Application Insights + alerts configured
|
|
29
|
-
|
|
30
|
-
### Post-Deploy
|
|
31
|
-
- [ ] Smoke tests executed
|
|
32
|
-
- [ ] Rollback plan documented
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## Security
|
|
37
|
-
|
|
38
|
-
### Auth & Authorization
|
|
39
|
-
- [ ] Passwords hashed (bcrypt/Argon2), MFA available
|
|
40
|
-
- [ ] JWT with short expiration + refresh tokens
|
|
41
|
-
- [ ] RBAC + resource-based authorization
|
|
42
|
-
- [ ] Ownership verification (user sees only their data)
|
|
43
|
-
|
|
44
|
-
### Input & Headers
|
|
45
|
-
- [ ] Server-side validation (never trust client)
|
|
46
|
-
- [ ] HTML sanitized (XSS), parametrized queries (SQLi)
|
|
47
|
-
- [ ] File upload validation (type, size, content)
|
|
48
|
-
- [ ] Security headers: `X-Content-Type-Options: nosniff`, `X-Frame-Options: DENY`, `CSP: default-src 'self'`
|
|
49
|
-
|
|
50
|
-
### Data
|
|
51
|
-
- [ ] PII encrypted at rest, masked in logs
|
|
52
|
-
- [ ] Card data never stored (use tokenization)
|
|
53
|
-
- [ ] `dotnet list package --vulnerable` clean
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## SEO
|
|
58
|
-
|
|
59
|
-
- [ ] `<title>` + `<meta description>` (150-160 chars)
|
|
60
|
-
- [ ] `<link rel="canonical">` + `robots.txt` + `sitemap.xml`
|
|
61
|
-
- [ ] Open Graph tags (og:title, og:description, og:image)
|
|
62
|
-
- [ ] URLs friendly, heading hierarchy (H1>H2>H3)
|
|
63
|
-
- [ ] Images optimized (WebP, lazy loading, alt text)
|
|
64
|
-
- [ ] Core Web Vitals: LCP < 2.5s, FID < 100ms, CLS < 0.1
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
## Performance
|
|
69
|
-
|
|
70
|
-
### Backend
|
|
71
|
-
- [ ] `.AsNoTracking()` for reads, no N+1, projections (`.Select()`)
|
|
72
|
-
- [ ] Indexes on search columns
|
|
73
|
-
- [ ] Response/distributed caching with invalidation
|
|
74
|
-
- [ ] All I/O operations are async (no `.Result` / `.Wait()`)
|
|
75
|
-
|
|
76
|
-
### Frontend (Blazor)
|
|
77
|
-
- [ ] Lazy loading, virtualization for large lists
|
|
78
|
-
- [ ] Debounce search inputs
|
|
79
|
-
- [ ] `@key` in loops, `ShouldRender()` for perf
|
|
80
|
-
|
|
81
|
-
### Infrastructure
|
|
82
|
-
- [ ] CDN for static assets, gzip/brotli compression
|
|
83
|
-
- [ ] Connection pooling, scale-to-zero
|
|
84
|
-
|
|
85
|
-
---
|
|
86
|
-
|
|
87
|
-
## Accessibility (WCAG 2.1)
|
|
88
|
-
|
|
89
|
-
- [ ] Alt text on images, captions on videos
|
|
90
|
-
- [ ] Contrast >= 4.5:1 (AA), color not sole indicator
|
|
91
|
-
- [ ] Keyboard navigation works, focus visible
|
|
92
|
-
- [ ] Skip links, `<html lang="pt-BR">`
|
|
93
|
-
- [ ] Labels on all inputs, clear error messages
|
|
94
|
-
- [ ] Valid HTML, ARIA used correctly
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## Legal Brazil (LGPD)
|
|
99
|
-
|
|
100
|
-
### Documentation
|
|
101
|
-
- [ ] Privacy policy (data collected, purpose, legal basis, DPO contact)
|
|
102
|
-
- [ ] Terms of use (service description, responsibilities, forum)
|
|
103
|
-
|
|
104
|
-
### Consent & Rights
|
|
105
|
-
- [ ] Cookie banner with granular options
|
|
106
|
-
- [ ] Explicit consent for marketing, revocation option
|
|
107
|
-
- [ ] Data access, correction, deletion, portability
|
|
108
|
-
|
|
109
|
-
### Technical
|
|
110
|
-
- [ ] Data minimization, defined retention periods
|
|
111
|
-
- [ ] Anonymization/pseudonymization where possible
|
|
112
|
-
- [ ] Access logs for personal data
|
|
113
|
-
- [ ] Incident response plan (ANPD notification in 72h)
|
|
114
|
-
|
|
115
|
-
---
|
|
116
|
-
|
|
117
|
-
*MORPH-SPEC Checklist Skill*
|
|
1
|
+
# Skill: /morph-checklist
|
|
2
|
+
|
|
3
|
+
> **Layer:** 2 | **Load:** on-keyword | **Keywords:** checklist, deploy, security, seo, performance, accessibility, lgpd, legal
|
|
4
|
+
|
|
5
|
+
Types: `deploy`, `security`, `seo`, `performance`, `accessibility`, `legal-brazil`, `simulation` (see [simulation-checklist.md](simulation-checklist.md))
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Deploy
|
|
10
|
+
|
|
11
|
+
### Pre-Deploy
|
|
12
|
+
- [ ] `dotnet build --configuration Release` passes
|
|
13
|
+
- [ ] `dotnet test` passes
|
|
14
|
+
- [ ] Migrations applied (`dotnet ef database update`)
|
|
15
|
+
- [ ] Env vars configured (connection strings, API keys, feature flags)
|
|
16
|
+
|
|
17
|
+
### Infrastructure
|
|
18
|
+
- [ ] Bicep/IaC updated (`az deployment group what-if`)
|
|
19
|
+
- [ ] SSL/HTTPS configured
|
|
20
|
+
- [ ] DNS pointing correctly
|
|
21
|
+
- [ ] Health checks configured
|
|
22
|
+
|
|
23
|
+
### Security & Monitoring
|
|
24
|
+
- [ ] Secrets in Key Vault (not in code)
|
|
25
|
+
- [ ] Managed Identity configured
|
|
26
|
+
- [ ] CORS configured
|
|
27
|
+
- [ ] Rate limiting enabled
|
|
28
|
+
- [ ] Application Insights + alerts configured
|
|
29
|
+
|
|
30
|
+
### Post-Deploy
|
|
31
|
+
- [ ] Smoke tests executed
|
|
32
|
+
- [ ] Rollback plan documented
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Security
|
|
37
|
+
|
|
38
|
+
### Auth & Authorization
|
|
39
|
+
- [ ] Passwords hashed (bcrypt/Argon2), MFA available
|
|
40
|
+
- [ ] JWT with short expiration + refresh tokens
|
|
41
|
+
- [ ] RBAC + resource-based authorization
|
|
42
|
+
- [ ] Ownership verification (user sees only their data)
|
|
43
|
+
|
|
44
|
+
### Input & Headers
|
|
45
|
+
- [ ] Server-side validation (never trust client)
|
|
46
|
+
- [ ] HTML sanitized (XSS), parametrized queries (SQLi)
|
|
47
|
+
- [ ] File upload validation (type, size, content)
|
|
48
|
+
- [ ] Security headers: `X-Content-Type-Options: nosniff`, `X-Frame-Options: DENY`, `CSP: default-src 'self'`
|
|
49
|
+
|
|
50
|
+
### Data
|
|
51
|
+
- [ ] PII encrypted at rest, masked in logs
|
|
52
|
+
- [ ] Card data never stored (use tokenization)
|
|
53
|
+
- [ ] `dotnet list package --vulnerable` clean
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## SEO
|
|
58
|
+
|
|
59
|
+
- [ ] `<title>` + `<meta description>` (150-160 chars)
|
|
60
|
+
- [ ] `<link rel="canonical">` + `robots.txt` + `sitemap.xml`
|
|
61
|
+
- [ ] Open Graph tags (og:title, og:description, og:image)
|
|
62
|
+
- [ ] URLs friendly, heading hierarchy (H1>H2>H3)
|
|
63
|
+
- [ ] Images optimized (WebP, lazy loading, alt text)
|
|
64
|
+
- [ ] Core Web Vitals: LCP < 2.5s, FID < 100ms, CLS < 0.1
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Performance
|
|
69
|
+
|
|
70
|
+
### Backend
|
|
71
|
+
- [ ] `.AsNoTracking()` for reads, no N+1, projections (`.Select()`)
|
|
72
|
+
- [ ] Indexes on search columns
|
|
73
|
+
- [ ] Response/distributed caching with invalidation
|
|
74
|
+
- [ ] All I/O operations are async (no `.Result` / `.Wait()`)
|
|
75
|
+
|
|
76
|
+
### Frontend (Blazor)
|
|
77
|
+
- [ ] Lazy loading, virtualization for large lists
|
|
78
|
+
- [ ] Debounce search inputs
|
|
79
|
+
- [ ] `@key` in loops, `ShouldRender()` for perf
|
|
80
|
+
|
|
81
|
+
### Infrastructure
|
|
82
|
+
- [ ] CDN for static assets, gzip/brotli compression
|
|
83
|
+
- [ ] Connection pooling, scale-to-zero
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Accessibility (WCAG 2.1)
|
|
88
|
+
|
|
89
|
+
- [ ] Alt text on images, captions on videos
|
|
90
|
+
- [ ] Contrast >= 4.5:1 (AA), color not sole indicator
|
|
91
|
+
- [ ] Keyboard navigation works, focus visible
|
|
92
|
+
- [ ] Skip links, `<html lang="pt-BR">`
|
|
93
|
+
- [ ] Labels on all inputs, clear error messages
|
|
94
|
+
- [ ] Valid HTML, ARIA used correctly
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Legal Brazil (LGPD)
|
|
99
|
+
|
|
100
|
+
### Documentation
|
|
101
|
+
- [ ] Privacy policy (data collected, purpose, legal basis, DPO contact)
|
|
102
|
+
- [ ] Terms of use (service description, responsibilities, forum)
|
|
103
|
+
|
|
104
|
+
### Consent & Rights
|
|
105
|
+
- [ ] Cookie banner with granular options
|
|
106
|
+
- [ ] Explicit consent for marketing, revocation option
|
|
107
|
+
- [ ] Data access, correction, deletion, portability
|
|
108
|
+
|
|
109
|
+
### Technical
|
|
110
|
+
- [ ] Data minimization, defined retention periods
|
|
111
|
+
- [ ] Anonymization/pseudonymization where possible
|
|
112
|
+
- [ ] Access logs for personal data
|
|
113
|
+
- [ ] Incident response plan (ANPD notification in 72h)
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
*MORPH-SPEC Checklist Skill*
|
|
@@ -1,213 +1,213 @@
|
|
|
1
|
-
# Skill: /morph-replicate
|
|
2
|
-
|
|
3
|
-
> Workflow simplificado para replicar prototipos HTML em Blazor.
|
|
4
|
-
> Use quando tiver um prototipo HTML pronto e precisar converter para codigo Blazor funcional.
|
|
5
|
-
|
|
6
|
-
## Comando
|
|
7
|
-
|
|
8
|
-
```bash
|
|
9
|
-
/morph-replicate {feature-name} {prototype-path}
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
**Exemplo:**
|
|
13
|
-
```bash
|
|
14
|
-
/morph-replicate ui-redesign prototipo/
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Workflow Simplificado
|
|
20
|
-
|
|
21
|
-
### FASE 1: ANALISE DO PROTOTIPO
|
|
22
|
-
|
|
23
|
-
1. **Ler todos os arquivos HTML em `{prototype-path}/`**
|
|
24
|
-
```bash
|
|
25
|
-
# Encontrar todos os arquivos HTML
|
|
26
|
-
glob: {prototype-path}/**/*.html
|
|
27
|
-
glob: {prototype-path}/**/code.html # Pattern comum de prototipos
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
2. **Extrair padroes de cada arquivo:**
|
|
31
|
-
- Layout (grid, flexbox, estrutura)
|
|
32
|
-
- Componentes (cards, buttons, forms, modals)
|
|
33
|
-
- Cores (extrair de inline styles e CSS)
|
|
34
|
-
- Fontes (font-family, sizes)
|
|
35
|
-
- Espacamentos (padding, margin, gap)
|
|
36
|
-
- Classes CSS usadas
|
|
37
|
-
|
|
38
|
-
3. **Gerar mapeamento HTML → Blazor:**
|
|
39
|
-
|
|
40
|
-
| HTML Pattern | Blazor Equivalente |
|
|
41
|
-
|--------------|-------------------|
|
|
42
|
-
| `<button class="btn-primary">` | `<FluentButton Appearance="Appearance.Accent">` |
|
|
43
|
-
| `<div class="card">` | `<FluentCard>` ou HTML customizado |
|
|
44
|
-
| `<input type="text">` | `<FluentTextField>` |
|
|
45
|
-
| `<div class="modal">` | Modal customizado (se design especifico) |
|
|
46
|
-
|
|
47
|
-
4. **Gerar lista de classes CSS a criar:**
|
|
48
|
-
```markdown
|
|
49
|
-
## Classes CSS Necessarias
|
|
50
|
-
|
|
51
|
-
- [ ] .page-layout
|
|
52
|
-
- [ ] .home-hero
|
|
53
|
-
- [ ] .card-premium
|
|
54
|
-
- [ ] .checkout-form
|
|
55
|
-
- [ ] .modal-overlay
|
|
56
|
-
- [ ] .animate-slideInUp
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
**PAUSA:** Aprovar mapeamento e lista de CSS
|
|
60
|
-
|
|
61
|
-
---
|
|
62
|
-
|
|
63
|
-
### FASE 2: TASKS (Lista de Telas)
|
|
64
|
-
|
|
65
|
-
Gerar lista de telas para implementar na ordem correta:
|
|
66
|
-
|
|
67
|
-
```markdown
|
|
68
|
-
## Tasks de Implementacao
|
|
69
|
-
|
|
70
|
-
### T001: Setup Design System
|
|
71
|
-
- Criar/atualizar wwwroot/css/design-system.css
|
|
72
|
-
- Adicionar todas as classes CSS listadas
|
|
73
|
-
- Validar com `morph-spec validate-css`
|
|
74
|
-
|
|
75
|
-
### T002: {Nome da Tela 1}
|
|
76
|
-
- Ler: {prototype-path}/{tela1}.html
|
|
77
|
-
- Criar/Atualizar: Pages/{Tela1}.razor
|
|
78
|
-
- Componentes: FluentCard, FluentButton, etc.
|
|
79
|
-
- CSS: .home-hero, .card-premium
|
|
80
|
-
|
|
81
|
-
### T003: {Nome da Tela 2}
|
|
82
|
-
- Ler: {prototype-path}/{tela2}.html
|
|
83
|
-
- Criar/Atualizar: Pages/{Tela2}.razor
|
|
84
|
-
- ...
|
|
85
|
-
|
|
86
|
-
### TXXX: Validacao Final
|
|
87
|
-
- Build completo
|
|
88
|
-
- `morph-spec validate-css`
|
|
89
|
-
- Testar responsividade
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
**PAUSA:** Aprovar lista de tasks
|
|
93
|
-
|
|
94
|
-
---
|
|
95
|
-
|
|
96
|
-
### FASE 3: IMPLEMENT (Por Tela)
|
|
97
|
-
|
|
98
|
-
Para cada tela, seguir este fluxo:
|
|
99
|
-
|
|
100
|
-
1. **Ler HTML do prototipo**
|
|
101
|
-
```
|
|
102
|
-
Read: {prototype-path}/{tela}.html
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
2. **Ler arquivo .razor atual** (se existir)
|
|
106
|
-
```
|
|
107
|
-
Read: Pages/{Tela}.razor
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
3. **Reescrever .razor usando Fluent UI/MudBlazor**
|
|
111
|
-
- Manter estrutura de layout do prototipo
|
|
112
|
-
- Substituir elementos HTML por componentes Blazor
|
|
113
|
-
- Aplicar classes CSS do design-system
|
|
114
|
-
|
|
115
|
-
4. **Adicionar CSS ao design-system.css**
|
|
116
|
-
- Se classe nova foi usada no .razor
|
|
117
|
-
- Seguir padrao de nomenclatura (prefixo por pagina)
|
|
118
|
-
|
|
119
|
-
5. **Build para validar**
|
|
120
|
-
```bash
|
|
121
|
-
dotnet build
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
6. **Validar CSS**
|
|
125
|
-
```bash
|
|
126
|
-
morph-spec validate-css src/MyApp.Web
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
---
|
|
130
|
-
|
|
131
|
-
## Outputs
|
|
132
|
-
|
|
133
|
-
Este workflow gera apenas:
|
|
134
|
-
|
|
135
|
-
| Arquivo | Descricao |
|
|
136
|
-
|---------|-----------|
|
|
137
|
-
| `.razor` files | Paginas convertidas |
|
|
138
|
-
| `design-system.css` | CSS atualizado |
|
|
139
|
-
| `recap.md` | Resumo da implementacao (ao final) |
|
|
140
|
-
|
|
141
|
-
**NAO gera:** proposal.md, spec.md, contracts.cs, tasks.json
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
## Exemplo de Execucao
|
|
146
|
-
|
|
147
|
-
```markdown
|
|
148
|
-
/morph-replicate checkout-redesign prototipo/checkout/
|
|
149
|
-
|
|
150
|
-
📁 Analisando prototipo em prototipo/checkout/...
|
|
151
|
-
|
|
152
|
-
**Arquivos encontrados:**
|
|
153
|
-
- step1-cart.html
|
|
154
|
-
- step2-payment.html
|
|
155
|
-
- step3-confirmation.html
|
|
156
|
-
|
|
157
|
-
**Padroes extraidos:**
|
|
158
|
-
|
|
159
|
-
Cores:
|
|
160
|
-
- Primary: #FF6B35
|
|
161
|
-
- Secondary: #2D3047
|
|
162
|
-
- Background: #FAFAFA
|
|
163
|
-
|
|
164
|
-
Classes CSS a criar:
|
|
165
|
-
- [ ] .checkout-layout
|
|
166
|
-
- [ ] .checkout-steps
|
|
167
|
-
- [ ] .checkout-form
|
|
168
|
-
- [ ] .checkout-summary
|
|
169
|
-
- [ ] .payment-options
|
|
170
|
-
- [ ] .confirmation-message
|
|
171
|
-
|
|
172
|
-
Mapeamento HTML → Blazor:
|
|
173
|
-
- form.checkout-form → EditForm + FluentTextField
|
|
174
|
-
- div.payment-card → FluentCard
|
|
175
|
-
- button.btn-pay → FluentButton Accent
|
|
176
|
-
|
|
177
|
-
---
|
|
178
|
-
|
|
179
|
-
⛔ **PAUSA OBRIGATORIA**
|
|
180
|
-
|
|
181
|
-
**Proximos passos:**
|
|
182
|
-
1. ✅ Aprovar e gerar tasks de implementacao
|
|
183
|
-
2. 🔄 Ajustar mapeamento
|
|
184
|
-
3. 📋 Ver mais detalhes dos componentes
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
## Quando Usar
|
|
190
|
-
|
|
191
|
-
- ✅ Prototipo HTML pronto (Figma export, hand-coded, etc.)
|
|
192
|
-
- ✅ Design ja aprovado pelo cliente
|
|
193
|
-
- ✅ Apenas conversao visual (sem logica de negocio nova)
|
|
194
|
-
- ✅ Codigo Blazor existente para atualizar
|
|
195
|
-
|
|
196
|
-
## Quando NAO Usar
|
|
197
|
-
|
|
198
|
-
- ❌ Feature nova com logica complexa (use FULL MORPH)
|
|
199
|
-
- ❌ Infraestrutura Azure necessaria (use FULL MORPH)
|
|
200
|
-
- ❌ Sem prototipo definido (use STANDARD ou FULL MORPH)
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
## Referencias
|
|
205
|
-
|
|
206
|
-
- [HTML to Blazor Guide](../../../../framework/standards/html-to-blazor.md)
|
|
207
|
-
- [CSS Naming Convention](../../../../framework/standards/css-naming.md)
|
|
208
|
-
- [CSS Animations](../../../../framework/standards/css-animations.md)
|
|
209
|
-
- [Fluent UI Blazor](../../../../framework/standards/fluent-ui-blazor.md)
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
*MORPH-SPEC v2.2.0 by Polymorphism Tech*
|
|
1
|
+
# Skill: /morph-replicate
|
|
2
|
+
|
|
3
|
+
> Workflow simplificado para replicar prototipos HTML em Blazor.
|
|
4
|
+
> Use quando tiver um prototipo HTML pronto e precisar converter para codigo Blazor funcional.
|
|
5
|
+
|
|
6
|
+
## Comando
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
/morph-replicate {feature-name} {prototype-path}
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
**Exemplo:**
|
|
13
|
+
```bash
|
|
14
|
+
/morph-replicate ui-redesign prototipo/
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Workflow Simplificado
|
|
20
|
+
|
|
21
|
+
### FASE 1: ANALISE DO PROTOTIPO
|
|
22
|
+
|
|
23
|
+
1. **Ler todos os arquivos HTML em `{prototype-path}/`**
|
|
24
|
+
```bash
|
|
25
|
+
# Encontrar todos os arquivos HTML
|
|
26
|
+
glob: {prototype-path}/**/*.html
|
|
27
|
+
glob: {prototype-path}/**/code.html # Pattern comum de prototipos
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
2. **Extrair padroes de cada arquivo:**
|
|
31
|
+
- Layout (grid, flexbox, estrutura)
|
|
32
|
+
- Componentes (cards, buttons, forms, modals)
|
|
33
|
+
- Cores (extrair de inline styles e CSS)
|
|
34
|
+
- Fontes (font-family, sizes)
|
|
35
|
+
- Espacamentos (padding, margin, gap)
|
|
36
|
+
- Classes CSS usadas
|
|
37
|
+
|
|
38
|
+
3. **Gerar mapeamento HTML → Blazor:**
|
|
39
|
+
|
|
40
|
+
| HTML Pattern | Blazor Equivalente |
|
|
41
|
+
|--------------|-------------------|
|
|
42
|
+
| `<button class="btn-primary">` | `<FluentButton Appearance="Appearance.Accent">` |
|
|
43
|
+
| `<div class="card">` | `<FluentCard>` ou HTML customizado |
|
|
44
|
+
| `<input type="text">` | `<FluentTextField>` |
|
|
45
|
+
| `<div class="modal">` | Modal customizado (se design especifico) |
|
|
46
|
+
|
|
47
|
+
4. **Gerar lista de classes CSS a criar:**
|
|
48
|
+
```markdown
|
|
49
|
+
## Classes CSS Necessarias
|
|
50
|
+
|
|
51
|
+
- [ ] .page-layout
|
|
52
|
+
- [ ] .home-hero
|
|
53
|
+
- [ ] .card-premium
|
|
54
|
+
- [ ] .checkout-form
|
|
55
|
+
- [ ] .modal-overlay
|
|
56
|
+
- [ ] .animate-slideInUp
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**PAUSA:** Aprovar mapeamento e lista de CSS
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
### FASE 2: TASKS (Lista de Telas)
|
|
64
|
+
|
|
65
|
+
Gerar lista de telas para implementar na ordem correta:
|
|
66
|
+
|
|
67
|
+
```markdown
|
|
68
|
+
## Tasks de Implementacao
|
|
69
|
+
|
|
70
|
+
### T001: Setup Design System
|
|
71
|
+
- Criar/atualizar wwwroot/css/design-system.css
|
|
72
|
+
- Adicionar todas as classes CSS listadas
|
|
73
|
+
- Validar com `morph-spec validate-css`
|
|
74
|
+
|
|
75
|
+
### T002: {Nome da Tela 1}
|
|
76
|
+
- Ler: {prototype-path}/{tela1}.html
|
|
77
|
+
- Criar/Atualizar: Pages/{Tela1}.razor
|
|
78
|
+
- Componentes: FluentCard, FluentButton, etc.
|
|
79
|
+
- CSS: .home-hero, .card-premium
|
|
80
|
+
|
|
81
|
+
### T003: {Nome da Tela 2}
|
|
82
|
+
- Ler: {prototype-path}/{tela2}.html
|
|
83
|
+
- Criar/Atualizar: Pages/{Tela2}.razor
|
|
84
|
+
- ...
|
|
85
|
+
|
|
86
|
+
### TXXX: Validacao Final
|
|
87
|
+
- Build completo
|
|
88
|
+
- `morph-spec validate-css`
|
|
89
|
+
- Testar responsividade
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**PAUSA:** Aprovar lista de tasks
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
### FASE 3: IMPLEMENT (Por Tela)
|
|
97
|
+
|
|
98
|
+
Para cada tela, seguir este fluxo:
|
|
99
|
+
|
|
100
|
+
1. **Ler HTML do prototipo**
|
|
101
|
+
```
|
|
102
|
+
Read: {prototype-path}/{tela}.html
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
2. **Ler arquivo .razor atual** (se existir)
|
|
106
|
+
```
|
|
107
|
+
Read: Pages/{Tela}.razor
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
3. **Reescrever .razor usando Fluent UI/MudBlazor**
|
|
111
|
+
- Manter estrutura de layout do prototipo
|
|
112
|
+
- Substituir elementos HTML por componentes Blazor
|
|
113
|
+
- Aplicar classes CSS do design-system
|
|
114
|
+
|
|
115
|
+
4. **Adicionar CSS ao design-system.css**
|
|
116
|
+
- Se classe nova foi usada no .razor
|
|
117
|
+
- Seguir padrao de nomenclatura (prefixo por pagina)
|
|
118
|
+
|
|
119
|
+
5. **Build para validar**
|
|
120
|
+
```bash
|
|
121
|
+
dotnet build
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
6. **Validar CSS**
|
|
125
|
+
```bash
|
|
126
|
+
morph-spec validate-css src/MyApp.Web
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Outputs
|
|
132
|
+
|
|
133
|
+
Este workflow gera apenas:
|
|
134
|
+
|
|
135
|
+
| Arquivo | Descricao |
|
|
136
|
+
|---------|-----------|
|
|
137
|
+
| `.razor` files | Paginas convertidas |
|
|
138
|
+
| `design-system.css` | CSS atualizado |
|
|
139
|
+
| `recap.md` | Resumo da implementacao (ao final) |
|
|
140
|
+
|
|
141
|
+
**NAO gera:** proposal.md, spec.md, contracts.cs, tasks.json
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Exemplo de Execucao
|
|
146
|
+
|
|
147
|
+
```markdown
|
|
148
|
+
/morph-replicate checkout-redesign prototipo/checkout/
|
|
149
|
+
|
|
150
|
+
📁 Analisando prototipo em prototipo/checkout/...
|
|
151
|
+
|
|
152
|
+
**Arquivos encontrados:**
|
|
153
|
+
- step1-cart.html
|
|
154
|
+
- step2-payment.html
|
|
155
|
+
- step3-confirmation.html
|
|
156
|
+
|
|
157
|
+
**Padroes extraidos:**
|
|
158
|
+
|
|
159
|
+
Cores:
|
|
160
|
+
- Primary: #FF6B35
|
|
161
|
+
- Secondary: #2D3047
|
|
162
|
+
- Background: #FAFAFA
|
|
163
|
+
|
|
164
|
+
Classes CSS a criar:
|
|
165
|
+
- [ ] .checkout-layout
|
|
166
|
+
- [ ] .checkout-steps
|
|
167
|
+
- [ ] .checkout-form
|
|
168
|
+
- [ ] .checkout-summary
|
|
169
|
+
- [ ] .payment-options
|
|
170
|
+
- [ ] .confirmation-message
|
|
171
|
+
|
|
172
|
+
Mapeamento HTML → Blazor:
|
|
173
|
+
- form.checkout-form → EditForm + FluentTextField
|
|
174
|
+
- div.payment-card → FluentCard
|
|
175
|
+
- button.btn-pay → FluentButton Accent
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
⛔ **PAUSA OBRIGATORIA**
|
|
180
|
+
|
|
181
|
+
**Proximos passos:**
|
|
182
|
+
1. ✅ Aprovar e gerar tasks de implementacao
|
|
183
|
+
2. 🔄 Ajustar mapeamento
|
|
184
|
+
3. 📋 Ver mais detalhes dos componentes
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Quando Usar
|
|
190
|
+
|
|
191
|
+
- ✅ Prototipo HTML pronto (Figma export, hand-coded, etc.)
|
|
192
|
+
- ✅ Design ja aprovado pelo cliente
|
|
193
|
+
- ✅ Apenas conversao visual (sem logica de negocio nova)
|
|
194
|
+
- ✅ Codigo Blazor existente para atualizar
|
|
195
|
+
|
|
196
|
+
## Quando NAO Usar
|
|
197
|
+
|
|
198
|
+
- ❌ Feature nova com logica complexa (use FULL MORPH)
|
|
199
|
+
- ❌ Infraestrutura Azure necessaria (use FULL MORPH)
|
|
200
|
+
- ❌ Sem prototipo definido (use STANDARD ou FULL MORPH)
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Referencias
|
|
205
|
+
|
|
206
|
+
- [HTML to Blazor Guide](../../../../framework/standards/html-to-blazor.md)
|
|
207
|
+
- [CSS Naming Convention](../../../../framework/standards/css-naming.md)
|
|
208
|
+
- [CSS Animations](../../../../framework/standards/css-animations.md)
|
|
209
|
+
- [Fluent UI Blazor](../../../../framework/standards/fluent-ui-blazor.md)
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
*MORPH-SPEC v2.2.0 by Polymorphism Tech*
|