@polymorphism-tech/morph-spec 4.3.3 → 4.3.4
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/.morph/analytics/threads-log.jsonl +9 -0
- package/{stacks/blazor-azure/.morph → .morph}/config/config.json +9 -9
- package/.morph/state.json +48 -0
- package/bin/detect-agents.js +1 -2
- package/bin/morph-spec.js +2 -15
- package/{stacks/blazor-azure/.morph/config → framework}/agents.json +948 -948
- package/{stacks/nextjs-supabase/.claude → framework}/commands/morph-infra.md +1 -1
- package/framework/hooks/README.md +282 -0
- package/framework/hooks/agent-stop/validate-and-continue.js +96 -0
- package/framework/hooks/agent-stop/validate-checkpoints.js +101 -0
- package/framework/hooks/agent-stop/validate-tests.js +109 -0
- package/framework/hooks/agent-teams/dispatch.js +67 -0
- package/framework/hooks/agent-teams/phase-advanced.js +80 -0
- package/framework/hooks/agent-teams/task-completed.js +76 -0
- package/framework/hooks/agent-teams/teammate-idle.js +70 -0
- package/framework/hooks/commit-msg/conventional-commits.sh +33 -0
- package/framework/hooks/pre-commit/agents.sh +25 -0
- package/framework/hooks/pre-commit/orchestrator.sh +64 -0
- package/framework/hooks/pre-commit/specs.sh +50 -0
- package/framework/hooks/pre-push/run-tests.sh +44 -0
- package/framework/index/troubleshooting-index.json +184 -0
- package/framework/memory/patterns-learned.md +766 -0
- package/framework/skills/level-0-meta/README.md +7 -0
- package/framework/skills/level-0-meta/code-review.md +226 -0
- package/framework/skills/level-0-meta/morph-checklist.md +117 -0
- package/framework/skills/level-0-meta/simulation-checklist.md +77 -0
- package/framework/skills/level-1-workflows/README.md +7 -0
- package/framework/skills/level-1-workflows/morph-replicate.md +213 -0
- package/framework/skills/level-1-workflows/phase-clarify.md +131 -0
- package/framework/skills/level-1-workflows/phase-design.md +213 -0
- package/framework/skills/level-1-workflows/phase-setup.md +106 -0
- package/framework/skills/level-1-workflows/phase-tasks.md +164 -0
- package/framework/skills/level-1-workflows/phase-uiux.md +169 -0
- package/framework/skills/level-2-domains/README.md +14 -0
- package/framework/skills/level-2-domains/ai-agents/ai-system-architect.md +192 -0
- package/framework/skills/level-2-domains/architecture/po-pm-advisor.md +197 -0
- package/framework/skills/level-2-domains/architecture/prompt-engineer.md +189 -0
- package/framework/skills/level-2-domains/architecture/seo-growth-hacker.md +320 -0
- package/framework/skills/level-2-domains/architecture/standards-architect.md +156 -0
- package/framework/skills/level-2-domains/backend/api-designer.md +59 -0
- package/framework/skills/level-2-domains/backend/dotnet-senior.md +77 -0
- package/framework/skills/level-2-domains/backend/ef-modeler.md +58 -0
- package/framework/skills/level-2-domains/backend/hangfire-orchestrator.md +126 -0
- package/framework/skills/level-2-domains/backend/ms-agent-expert.md +45 -0
- package/framework/skills/level-2-domains/frontend/blazor-builder.md +210 -0
- package/framework/skills/level-2-domains/frontend/nextjs-expert.md +154 -0
- package/framework/skills/level-2-domains/frontend/ui-ux-designer.md +191 -0
- package/framework/skills/level-2-domains/infrastructure/azure-architect.md +142 -0
- package/framework/skills/level-2-domains/infrastructure/azure-deploy-specialist.md +699 -0
- package/framework/skills/level-2-domains/infrastructure/bicep-architect.md +126 -0
- package/framework/skills/level-2-domains/infrastructure/container-specialist.md +131 -0
- package/framework/skills/level-2-domains/infrastructure/devops-engineer.md +119 -0
- package/framework/skills/level-2-domains/integrations/asaas-financial.md +130 -0
- package/framework/skills/level-2-domains/integrations/azure-identity.md +142 -0
- package/framework/skills/level-2-domains/integrations/clerk-auth.md +108 -0
- package/framework/skills/level-2-domains/integrations/hangfire-orchestrator.md +64 -0
- package/framework/skills/level-2-domains/integrations/resend-email.md +119 -0
- package/framework/skills/level-2-domains/quality/code-analyzer.md +235 -0
- package/framework/skills/level-2-domains/quality/testing-specialist.md +126 -0
- package/framework/skills/level-3-technologies/README.md +7 -0
- package/framework/skills/level-4-patterns/README.md +7 -0
- package/framework/squad-templates/backend-only.json +34 -0
- package/framework/squad-templates/frontend-only.json +34 -0
- package/framework/squad-templates/full-stack.json +52 -0
- package/framework/templates/.idea/morph-templates.xml +92 -0
- package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
- package/framework/templates/IDE-SNIPPETS.md +266 -0
- package/framework/templates/README.md +814 -0
- package/framework/templates/REGISTRY.json +1677 -0
- package/framework/templates/code/dotnet/backend/repository.cs +141 -0
- package/framework/templates/code/dotnet/backend/service.cs +139 -0
- package/framework/templates/code/dotnet/contracts/Commands.cs +74 -0
- package/framework/templates/code/dotnet/contracts/Entities.cs +25 -0
- package/framework/templates/code/dotnet/contracts/Queries.cs +74 -0
- package/framework/templates/code/dotnet/contracts/README.md +74 -0
- package/framework/templates/code/dotnet/contracts/api-contracts.cs +173 -0
- package/framework/templates/code/dotnet/contracts/contracts.cs +217 -0
- package/framework/templates/code/dotnet/database/migration.cs +83 -0
- package/framework/templates/code/dotnet/frontend/component.razor +239 -0
- package/framework/templates/code/dotnet/jobs/agent.cs +163 -0
- package/framework/templates/code/dotnet/jobs/job.cs +171 -0
- package/framework/templates/code/dotnet/test.cs +239 -0
- package/framework/templates/code/sql/rls-policy.sql +57 -0
- package/framework/templates/code/sql/supabase-migration.sql +100 -0
- package/framework/templates/code/sql/supabase-migration.template.sql +113 -0
- package/framework/templates/code/typescript/contracts.ts +168 -0
- package/framework/templates/context/CONTEXT-FEATURE.md +276 -0
- package/framework/templates/context/CONTEXT.md +181 -0
- package/framework/templates/docs/proposal.md +182 -0
- package/framework/templates/docs/spec.md +149 -0
- package/framework/templates/examples/design-system-examples.md +357 -0
- package/framework/templates/examples/spec-examples.md +90 -0
- package/framework/templates/feature/decisions.md +187 -0
- package/framework/templates/feature/recap.md +146 -0
- package/framework/templates/feature/tasks.md +199 -0
- package/framework/templates/infrastructure/azure/Dockerfile.example +82 -0
- package/framework/templates/infrastructure/azure/README.md +286 -0
- package/framework/templates/infrastructure/azure/app-insights.bicep +63 -0
- package/framework/templates/infrastructure/azure/app-service.bicep +164 -0
- package/framework/templates/infrastructure/azure/container-app-env.bicep +49 -0
- package/framework/templates/infrastructure/azure/container-app.bicep +156 -0
- package/framework/templates/infrastructure/azure/deploy-checklist.md +426 -0
- package/framework/templates/infrastructure/azure/deploy.ps1 +229 -0
- package/framework/templates/infrastructure/azure/deploy.sh +208 -0
- package/framework/templates/infrastructure/azure/key-vault.bicep +91 -0
- package/framework/templates/infrastructure/azure/main.bicep +189 -0
- package/framework/templates/infrastructure/azure/parameters.dev.json +29 -0
- package/framework/templates/infrastructure/azure/parameters.prod.json +29 -0
- package/framework/templates/infrastructure/azure/parameters.staging.json +29 -0
- package/framework/templates/infrastructure/azure/sql-database.bicep +103 -0
- package/framework/templates/infrastructure/azure/storage.bicep +106 -0
- package/framework/templates/infrastructure/docker/Dockerfile.template +58 -0
- package/framework/templates/infrastructure/docker/docker-compose.template.yml +67 -0
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -0
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -0
- package/framework/templates/infrastructure/docker/easypanel.template.json +54 -0
- package/framework/templates/infrastructure/github/README.md +593 -0
- package/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +22 -0
- package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -0
- package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -0
- package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +61 -0
- package/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +31 -0
- package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -0
- package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -0
- package/framework/templates/integrations/asaas-client.cs +387 -0
- package/framework/templates/integrations/asaas-webhook.cs +351 -0
- package/framework/templates/integrations/azure-identity-config.cs +288 -0
- package/framework/templates/integrations/clerk-config.cs +258 -0
- package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -0
- package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -0
- package/framework/templates/meta-prompts/hops/hop-retry.md +78 -0
- package/framework/templates/meta-prompts/hops/hop-validation.md +97 -0
- package/framework/templates/meta-prompts/hops/hop-wrapper.md +36 -0
- package/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +113 -0
- package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +80 -0
- package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +90 -0
- package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +126 -0
- package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +43 -0
- package/framework/templates/meta-prompts/validators/checkpoint-validator.md +107 -0
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -0
- package/framework/templates/saas/subscription.cs +347 -0
- package/framework/templates/saas/tenant.cs +338 -0
- package/framework/templates/state.template.json +17 -0
- package/framework/templates/ui/FluentDesignTheme.cs +149 -0
- package/framework/templates/ui/MudTheme.cs +281 -0
- package/framework/templates/ui/design-system.css +226 -0
- package/framework/workflows/README.md +1041 -0
- package/framework/workflows/configs/design-impl.json +49 -0
- package/framework/workflows/configs/fast-track.json +42 -0
- package/framework/workflows/configs/full-morph.json +79 -0
- package/framework/workflows/configs/fusion.json +39 -0
- package/framework/workflows/configs/long-running.json +33 -0
- package/framework/workflows/configs/standard.json +60 -0
- package/framework/workflows/configs/ui-refresh.json +49 -0
- package/framework/workflows/configs/zero-touch.json +75 -0
- package/framework/workflows/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -0
- package/framework/workflows/docs/design-impl.md +37 -0
- package/framework/workflows/docs/enforcement-pipeline.md +668 -0
- package/framework/workflows/docs/fast-track.md +29 -0
- package/framework/workflows/docs/full-morph.md +76 -0
- package/framework/workflows/docs/standard.md +44 -0
- package/framework/workflows/docs/ui-refresh.md +39 -0
- package/package.json +3 -3
- package/src/commands/feature/create-story.js +11 -7
- package/src/commands/project/detect-agents.js +1 -2
- package/src/commands/project/init.js +69 -32
- package/src/commands/project/update.js +2 -2
- package/src/commands/templates/template-customize.js +3 -17
- package/src/commands/templates/template-list.js +1 -15
- package/src/commands/templates/template-render.js +2 -3
- package/src/commands/templates/template-show.js +3 -5
- package/src/core/templates/template-registry.js +9 -23
- package/src/lib/detectors/structure-detector.js +3 -3
- package/src/lib/generators/context-generator.js +18 -6
- package/src/lib/hooks/hook-executor.js +0 -2
- package/src/lib/orchestration/team-orchestrator.js +1 -2
- package/src/lib/standards/standards-context-injector.js +3 -4
- package/src/lib/troubleshooting/troubleshoot-grep.js +3 -9
- package/src/lib/validators/validation-runner.js +1 -2
- package/src/utils/file-copier.js +1 -2
- package/docs/README.md +0 -144
- package/docs/api/fonts/Montserrat/Montserrat-Bold.eot +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.woff +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.eot +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.woff +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +0 -978
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +0 -1049
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
- package/docs/api/scripts/collapse.js +0 -39
- package/docs/api/scripts/commonNav.js +0 -28
- package/docs/api/scripts/linenumber.js +0 -25
- package/docs/api/scripts/nav.js +0 -12
- package/docs/api/scripts/polyfill.js +0 -4
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +0 -202
- package/docs/api/scripts/prettify/lang-css.js +0 -2
- package/docs/api/scripts/prettify/prettify.js +0 -28
- package/docs/api/scripts/search.js +0 -99
- package/docs/api/styles/jsdoc.css +0 -776
- package/docs/api/styles/prettify.css +0 -80
- package/docs/cli-auto-detection.md +0 -219
- package/docs/getting-started.md +0 -296
- package/docs/installation.md +0 -361
- package/docs/next-generation/AGENTS.md +0 -521
- package/docs/next-generation/ANALYSIS.md +0 -555
- package/docs/next-generation/ARCHITECTURE.md +0 -436
- package/docs/next-generation/CONTEXT-OPTIMIZATION.md +0 -267
- package/docs/next-generation/EXECUTION-FLOW.md +0 -274
- package/docs/next-generation/FEATURES.md +0 -688
- package/docs/next-generation/META-PROMPTS.md +0 -235
- package/docs/next-generation/MIGRATION-GUIDE.md +0 -253
- package/docs/next-generation/README.md +0 -231
- package/docs/next-generation/ROADMAP.md +0 -801
- package/docs/next-generation/THREAD-MANAGEMENT.md +0 -240
- package/docs/templates.md +0 -418
- package/docs/troubleshooting.md +0 -269
- package/docs/validation-checklist.md +0 -264
- package/scripts/postinstall.js +0 -132
- package/src/lib/stacks/index.js +0 -7
- package/src/lib/stacks/stack-resolver.js +0 -180
- package/stacks/blazor-azure/.claude/commands/morph-deploy.md +0 -529
- package/stacks/blazor-azure/.claude/commands/morph-infra.md +0 -209
- package/stacks/blazor-azure/.morph/.morphversion +0 -5
- package/stacks/blazor-azure/.morph/project/context/README.md +0 -17
- package/stacks/blazor-azure/CLAUDE.md +0 -155
- package/stacks/blazor-azure/README.md +0 -79
- package/stacks/nextjs-supabase/.claude/commands/morph-apply.md +0 -221
- package/stacks/nextjs-supabase/.claude/commands/morph-archive.md +0 -79
- package/stacks/nextjs-supabase/.claude/commands/morph-deploy.md +0 -529
- package/stacks/nextjs-supabase/.claude/commands/morph-preflight.md +0 -227
- package/stacks/nextjs-supabase/.claude/commands/morph-proposal.md +0 -122
- package/stacks/nextjs-supabase/.claude/commands/morph-status.md +0 -86
- package/stacks/nextjs-supabase/.claude/commands/morph-troubleshoot.md +0 -122
- package/stacks/nextjs-supabase/.morph/.morphversion +0 -5
- package/stacks/nextjs-supabase/.morph/config/agents.json +0 -345
- package/stacks/nextjs-supabase/.morph/config/config.json +0 -9
- package/stacks/nextjs-supabase/.morph/project/context/README.md +0 -17
- package/stacks/nextjs-supabase/.morph/standards/ai-agents/blazor-ui.md +0 -364
- package/stacks/nextjs-supabase/.morph/standards/ai-agents/production.md +0 -415
- package/stacks/nextjs-supabase/.morph/standards/ai-agents/setup.md +0 -418
- package/stacks/nextjs-supabase/.morph/standards/ai-agents/team-orchestration.md +0 -479
- package/stacks/nextjs-supabase/.morph/standards/ai-agents/workflows.md +0 -354
- package/stacks/nextjs-supabase/.morph/standards/architecture/ddd/aggregates.md +0 -120
- package/stacks/nextjs-supabase/.morph/standards/architecture/ddd/entities.md +0 -99
- package/stacks/nextjs-supabase/.morph/standards/architecture/ddd/value-objects.md +0 -124
- package/stacks/nextjs-supabase/.morph/standards/backend/api/minimal-api.md +0 -494
- package/stacks/nextjs-supabase/.morph/standards/backend/api/rest.md +0 -492
- package/stacks/nextjs-supabase/.morph/standards/backend/api/validation.md +0 -88
- package/stacks/nextjs-supabase/.morph/standards/backend/authentication/passkeys.md +0 -428
- package/stacks/nextjs-supabase/.morph/standards/backend/database/ef-core.md +0 -199
- package/stacks/nextjs-supabase/.morph/standards/backend/database/migrations.md +0 -393
- package/stacks/nextjs-supabase/.morph/standards/backend/database/postgresql/database.md +0 -352
- package/stacks/nextjs-supabase/.morph/standards/backend/database/repository-patterns.md +0 -528
- package/stacks/nextjs-supabase/.morph/standards/backend/database/vector-search-rag.md +0 -541
- package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/async.md +0 -366
- package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/core.md +0 -117
- package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/di.md +0 -439
- package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/program-cs-checklist.md +0 -92
- package/stacks/nextjs-supabase/.morph/standards/backend/integrations/asaas/asaas-api.md +0 -216
- package/stacks/nextjs-supabase/.morph/standards/backend/integrations/clerk/clerk-auth.md +0 -290
- package/stacks/nextjs-supabase/.morph/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
- package/stacks/nextjs-supabase/.morph/standards/backend/integrations/resend/resend-email.md +0 -385
- package/stacks/nextjs-supabase/.morph/standards/context/analytics.md +0 -96
- package/stacks/nextjs-supabase/.morph/standards/context/bundles.md +0 -110
- package/stacks/nextjs-supabase/.morph/standards/context/priming.md +0 -78
- package/stacks/nextjs-supabase/.morph/standards/core/architecture.md +0 -185
- package/stacks/nextjs-supabase/.morph/standards/core/coding.md +0 -214
- package/stacks/nextjs-supabase/.morph/standards/core/git-branching-strategy.md +0 -403
- package/stacks/nextjs-supabase/.morph/standards/core/git.md +0 -185
- package/stacks/nextjs-supabase/.morph/standards/core/testing.md +0 -295
- package/stacks/nextjs-supabase/.morph/standards/data/nosql/blob-storage.md +0 -102
- package/stacks/nextjs-supabase/.morph/standards/data/nosql/cache/redis.md +0 -97
- package/stacks/nextjs-supabase/.morph/standards/data/nosql/cosmos-db.md +0 -118
- package/stacks/nextjs-supabase/.morph/standards/data/vector-search/azure-ai-search.md +0 -121
- package/stacks/nextjs-supabase/.morph/standards/data/vector-search/rag-chunking.md +0 -104
- package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/design-checklist.md +0 -222
- package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/fluent-ui-setup.md +0 -595
- package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/fluent-ui.md +0 -137
- package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/html-conversion.md +0 -184
- package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/lifecycle.md +0 -195
- package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/pitfalls.md +0 -198
- package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/state.md +0 -191
- package/stacks/nextjs-supabase/.morph/standards/frontend/design-system/animations.md +0 -151
- package/stacks/nextjs-supabase/.morph/standards/frontend/design-system/naming.md +0 -64
- package/stacks/nextjs-supabase/.morph/standards/frontend/nextjs/nextjs-patterns.md +0 -198
- package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/azure.md +0 -624
- package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
- package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
- package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/devops/local-development.md +0 -520
- package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/services/functions.md +0 -486
- package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/services/service-bus.md +0 -459
- package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/services/storage.md +0 -407
- package/stacks/nextjs-supabase/.morph/standards/infrastructure/docker/easypanel-deploy.md +0 -196
- package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/mcp-setup.md +0 -252
- package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-auth.md +0 -176
- package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
- package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-rls.md +0 -184
- package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-storage.md +0 -153
- package/stacks/nextjs-supabase/.morph/standards/integration/api/graphql.md +0 -91
- package/stacks/nextjs-supabase/.morph/standards/integration/api/grpc.md +0 -114
- package/stacks/nextjs-supabase/.morph/standards/integration/api/rest-design.md +0 -95
- package/stacks/nextjs-supabase/.morph/standards/integration/event-driven/cqrs.md +0 -101
- package/stacks/nextjs-supabase/.morph/standards/integration/event-driven/event-sourcing.md +0 -124
- package/stacks/nextjs-supabase/.morph/standards/integration/event-driven/service-bus.md +0 -95
- package/stacks/nextjs-supabase/.morph/standards/observability/logging.md +0 -131
- package/stacks/nextjs-supabase/.morph/standards/observability/metrics.md +0 -121
- package/stacks/nextjs-supabase/.morph/standards/observability/monitoring.md +0 -114
- package/stacks/nextjs-supabase/.morph/standards/observability/tracing.md +0 -132
- package/stacks/nextjs-supabase/.morph/standards/workflows/parallel-execution.md +0 -112
- package/stacks/nextjs-supabase/.morph/standards/workflows/thread-management.md +0 -113
- package/stacks/nextjs-supabase/CLAUDE.md +0 -155
- package/stacks/nextjs-supabase/README.md +0 -103
- /package/{stacks/blazor-azure/.claude → framework}/commands/morph-apply.md +0 -0
- /package/{stacks/blazor-azure/.claude → framework}/commands/morph-archive.md +0 -0
- /package/{stacks/blazor-azure/.claude → framework}/commands/morph-preflight.md +0 -0
- /package/{stacks/blazor-azure/.claude → framework}/commands/morph-proposal.md +0 -0
- /package/{stacks/blazor-azure/.claude → framework}/commands/morph-status.md +0 -0
- /package/{stacks/blazor-azure/.claude → framework}/commands/morph-troubleshoot.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/blazor-ui.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/production.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/setup.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/team-orchestration.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/workflows.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/architecture/ddd/aggregates.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/architecture/ddd/entities.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/architecture/ddd/value-objects.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/api/minimal-api.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/api/rest.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/api/validation.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/authentication/passkeys.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/ef-core.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/migrations.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/postgresql/database.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/repository-patterns.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/vector-search-rag.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/async.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/core.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/di.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/program-cs-checklist.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/asaas/asaas-api.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/clerk/clerk-auth.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/resend/resend-email.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/context/analytics.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/context/bundles.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/context/priming.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/core/architecture.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/core/coding.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/core/git-branching-strategy.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/core/git.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/core/testing.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/data/nosql/blob-storage.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/data/nosql/cache/redis.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/data/nosql/cosmos-db.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/data/vector-search/azure-ai-search.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/data/vector-search/rag-chunking.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/design-checklist.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/fluent-ui-setup.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/fluent-ui.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/html-conversion.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/lifecycle.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/pitfalls.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/state.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/design-system/animations.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/design-system/naming.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/nextjs/nextjs-patterns.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/azure.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/devops/local-development.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/services/functions.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/services/service-bus.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/services/storage.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/docker/easypanel-deploy.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/mcp-setup.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-auth.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-pgvector.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-rls.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-storage.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/integration/api/graphql.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/integration/api/grpc.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/integration/api/rest-design.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/integration/event-driven/cqrs.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/integration/event-driven/event-sourcing.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/integration/event-driven/service-bus.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/observability/logging.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/observability/metrics.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/observability/monitoring.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/observability/tracing.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/workflows/parallel-execution.md +0 -0
- /package/{stacks/blazor-azure/.morph → framework}/standards/workflows/thread-management.md +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "backend-only",
|
|
3
|
+
"name": "Backend Squad",
|
|
4
|
+
"description": "Backend-focused squad: API + data + domain logic",
|
|
5
|
+
"parallel": true,
|
|
6
|
+
"coordination": "dotnet-senior",
|
|
7
|
+
"waitForAll": true,
|
|
8
|
+
"agents": [
|
|
9
|
+
{
|
|
10
|
+
"id": "dotnet-senior",
|
|
11
|
+
"role": "Backend Squad Leader",
|
|
12
|
+
"domain": "backend",
|
|
13
|
+
"standards": ["coding.md", "architecture.md", "dotnet10-compatibility.md"]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"id": "ef-modeler",
|
|
17
|
+
"role": "Database/EF Core Layer",
|
|
18
|
+
"domain": "backend",
|
|
19
|
+
"standards": ["coding.md", "ef-core.md"]
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "api-designer",
|
|
23
|
+
"role": "REST Endpoints + DTOs",
|
|
24
|
+
"domain": "backend",
|
|
25
|
+
"standards": ["coding.md", "integration/api/rest-design.md"]
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"deliverables": {
|
|
29
|
+
"dotnet-senior": "Application services, business logic, command/query handlers",
|
|
30
|
+
"ef-modeler": "Entity models, DbContext, migrations",
|
|
31
|
+
"api-designer": "Controllers, DTOs, Swagger docs"
|
|
32
|
+
},
|
|
33
|
+
"estimatedParallelGain": "2-3x throughput vs sequential"
|
|
34
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "frontend-only",
|
|
3
|
+
"name": "Frontend Squad",
|
|
4
|
+
"description": "Frontend-focused squad: Blazor components + CSS + UX",
|
|
5
|
+
"parallel": true,
|
|
6
|
+
"coordination": "ui-designer",
|
|
7
|
+
"waitForAll": true,
|
|
8
|
+
"agents": [
|
|
9
|
+
{
|
|
10
|
+
"id": "ui-designer",
|
|
11
|
+
"role": "UI Design Lead",
|
|
12
|
+
"domain": "frontend",
|
|
13
|
+
"standards": ["css-architecture.md", "css-design-system.md"]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"id": "blazor-builder",
|
|
17
|
+
"role": "Blazor Component Developer",
|
|
18
|
+
"domain": "frontend",
|
|
19
|
+
"standards": ["coding.md", "blazor-components.md", "blazor-state.md"]
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "css-specialist",
|
|
23
|
+
"role": "CSS/Design System Specialist",
|
|
24
|
+
"domain": "frontend",
|
|
25
|
+
"standards": ["css-architecture.md", "css-design-system.md"]
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"deliverables": {
|
|
29
|
+
"ui-designer": "Design system tokens, component specs, mockup annotations",
|
|
30
|
+
"blazor-builder": ".razor components, code-behind, state management",
|
|
31
|
+
"css-specialist": "CSS modules, design system implementation, responsive layout"
|
|
32
|
+
},
|
|
33
|
+
"estimatedParallelGain": "2x throughput vs sequential"
|
|
34
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "full-stack",
|
|
3
|
+
"name": "Full Stack Squad",
|
|
4
|
+
"description": "Full-stack feature squad: backend API + Blazor frontend + Azure infra",
|
|
5
|
+
"parallel": true,
|
|
6
|
+
"coordination": "thread-orchestrator",
|
|
7
|
+
"waitForAll": true,
|
|
8
|
+
"agents": [
|
|
9
|
+
{
|
|
10
|
+
"id": "dotnet-senior",
|
|
11
|
+
"role": "Backend Squad Leader",
|
|
12
|
+
"domain": "backend",
|
|
13
|
+
"standards": ["coding.md", "architecture.md", "dotnet10-compatibility.md"]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"id": "blazor-builder",
|
|
17
|
+
"role": "Frontend Developer",
|
|
18
|
+
"domain": "frontend",
|
|
19
|
+
"standards": ["coding.md", "blazor-components.md", "blazor-state.md"]
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "bicep-architect",
|
|
23
|
+
"role": "Infrastructure Engineer",
|
|
24
|
+
"domain": "infrastructure",
|
|
25
|
+
"standards": ["azure.md", "bicep.md"]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "thread-orchestrator",
|
|
29
|
+
"role": "Parallel Coordinator",
|
|
30
|
+
"domain": "developer-experience",
|
|
31
|
+
"standards": []
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "context-optimizer",
|
|
35
|
+
"role": "Context Manager",
|
|
36
|
+
"domain": "developer-experience",
|
|
37
|
+
"standards": []
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "observability-expert",
|
|
41
|
+
"role": "Observability Specialist",
|
|
42
|
+
"domain": "observability",
|
|
43
|
+
"standards": ["observability/monitoring.md", "observability/logging.md"]
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
"deliverables": {
|
|
47
|
+
"backend": "Services, controllers, DTOs, EF Core entities",
|
|
48
|
+
"frontend": "Blazor components, pages, CSS",
|
|
49
|
+
"infrastructure": "Bicep templates, deployment scripts"
|
|
50
|
+
},
|
|
51
|
+
"estimatedParallelGain": "3-5x throughput vs sequential"
|
|
52
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
<templateSet group="MORPH Templates">
|
|
2
|
+
<template name="morph-pascal" value="{{pascalCase $FEATURE_NAME$}}" description="Convert to PascalCase (UserAuth)" toReformat="false" toShortenFQNames="true">
|
|
3
|
+
<variable name="FEATURE_NAME" expression="" defaultValue=""FEATURE_NAME"" alwaysStopAt="true" />
|
|
4
|
+
<context>
|
|
5
|
+
<option name="OTHER" value="true" />
|
|
6
|
+
</context>
|
|
7
|
+
</template>
|
|
8
|
+
|
|
9
|
+
<template name="morph-camel" value="{{camelCase $FEATURE_NAME$}}" description="Convert to camelCase (userAuth)" toReformat="false" toShortenFQNames="true">
|
|
10
|
+
<variable name="FEATURE_NAME" expression="" defaultValue=""FEATURE_NAME"" alwaysStopAt="true" />
|
|
11
|
+
<context>
|
|
12
|
+
<option name="OTHER" value="true" />
|
|
13
|
+
</context>
|
|
14
|
+
</template>
|
|
15
|
+
|
|
16
|
+
<template name="morph-snake" value="{{snakeCase $FEATURE_NAME$}}" description="Convert to snake_case (user_auth)" toReformat="false" toShortenFQNames="true">
|
|
17
|
+
<variable name="FEATURE_NAME" expression="" defaultValue=""FEATURE_NAME"" alwaysStopAt="true" />
|
|
18
|
+
<context>
|
|
19
|
+
<option name="OTHER" value="true" />
|
|
20
|
+
</context>
|
|
21
|
+
</template>
|
|
22
|
+
|
|
23
|
+
<template name="morph-title" value="{{titleCase $FEATURE_NAME$}}" description="Convert to Title Case (User Auth)" toReformat="false" toShortenFQNames="true">
|
|
24
|
+
<variable name="FEATURE_NAME" expression="" defaultValue=""FEATURE_NAME"" alwaysStopAt="true" />
|
|
25
|
+
<context>
|
|
26
|
+
<option name="OTHER" value="true" />
|
|
27
|
+
</context>
|
|
28
|
+
</template>
|
|
29
|
+
|
|
30
|
+
<template name="morph-kebab" value="{{kebabCase $FEATURE_NAME$}}" description="Convert to kebab-case (user-auth)" toReformat="false" toShortenFQNames="true">
|
|
31
|
+
<variable name="FEATURE_NAME" expression="" defaultValue=""FEATURE_NAME"" alwaysStopAt="true" />
|
|
32
|
+
<context>
|
|
33
|
+
<option name="OTHER" value="true" />
|
|
34
|
+
</context>
|
|
35
|
+
</template>
|
|
36
|
+
|
|
37
|
+
<template name="morph-if" value="{{#if $CONDITION$}} $END$ {{/if}}" description="Handlebars if block" toReformat="false" toShortenFQNames="true">
|
|
38
|
+
<variable name="CONDITION" expression="" defaultValue=""condition"" alwaysStopAt="true" />
|
|
39
|
+
<context>
|
|
40
|
+
<option name="OTHER" value="true" />
|
|
41
|
+
</context>
|
|
42
|
+
</template>
|
|
43
|
+
|
|
44
|
+
<template name="morph-if-else" value="{{#if $CONDITION$}} $TRUE_BRANCH$ {{else}} $FALSE_BRANCH$ {{/if}}" description="Handlebars if-else block" toReformat="false" toShortenFQNames="true">
|
|
45
|
+
<variable name="CONDITION" expression="" defaultValue=""condition"" alwaysStopAt="true" />
|
|
46
|
+
<variable name="TRUE_BRANCH" expression="" defaultValue="""" alwaysStopAt="true" />
|
|
47
|
+
<variable name="FALSE_BRANCH" expression="" defaultValue="""" alwaysStopAt="true" />
|
|
48
|
+
<context>
|
|
49
|
+
<option name="OTHER" value="true" />
|
|
50
|
+
</context>
|
|
51
|
+
</template>
|
|
52
|
+
|
|
53
|
+
<template name="morph-each" value="{{#each $ITEMS$}} {{this.$PROPERTY$}} {{/each}}" description="Handlebars each loop" toReformat="false" toShortenFQNames="true">
|
|
54
|
+
<variable name="ITEMS" expression="" defaultValue=""items"" alwaysStopAt="true" />
|
|
55
|
+
<variable name="PROPERTY" expression="" defaultValue=""name"" alwaysStopAt="true" />
|
|
56
|
+
<context>
|
|
57
|
+
<option name="OTHER" value="true" />
|
|
58
|
+
</context>
|
|
59
|
+
</template>
|
|
60
|
+
|
|
61
|
+
<template name="morph-service" value="namespace {{NAMESPACE}}.Application.Features.{{pascalCase FEATURE_NAME}}.Services; public class {{pascalCase FEATURE_NAME}}Service( I{{pascalCase FEATURE_NAME}}Repository repository, ILogger<{{pascalCase FEATURE_NAME}}Service> logger) : I{{pascalCase FEATURE_NAME}}Service { public async Task<{{pascalCase FEATURE_NAME}}Dto?> GetByIdAsync(int id, CancellationToken cancellationToken = default) { $END$ } }" description="MORPH .NET Service class template" toReformat="false" toShortenFQNames="true">
|
|
62
|
+
<context>
|
|
63
|
+
<option name="C_SHARP" value="true" />
|
|
64
|
+
</context>
|
|
65
|
+
</template>
|
|
66
|
+
|
|
67
|
+
<template name="morph-repository" value="public class {{pascalCase FEATURE_NAME}}Repository(AppDbContext context) : I{{pascalCase FEATURE_NAME}}Repository { private readonly DbSet<{{pascalCase FEATURE_NAME}}> _dbSet = context.Set<{{pascalCase FEATURE_NAME}}>(); public async Task<{{pascalCase FEATURE_NAME}}?> GetByIdAsync(int id, CancellationToken cancellationToken = default) { $END$ } }" description="MORPH .NET Repository class template" toReformat="false" toShortenFQNames="true">
|
|
68
|
+
<context>
|
|
69
|
+
<option name="C_SHARP" value="true" />
|
|
70
|
+
</context>
|
|
71
|
+
</template>
|
|
72
|
+
|
|
73
|
+
<template name="morph-component" value="@page "/{{kebabCase FEATURE_NAME}}" @inject I{{pascalCase FEATURE_NAME}}Service {{pascalCase FEATURE_NAME}}Service @inject ILogger<{{pascalCase FEATURE_NAME}}Page> Logger <PageTitle>{{pascalCase FEATURE_NAME}}</PageTitle> <div class="container-fluid"> $END$ </div> @code { }" description="MORPH Blazor component template" toReformat="false" toShortenFQNames="true">
|
|
74
|
+
<context>
|
|
75
|
+
<option name="HTML" value="true" />
|
|
76
|
+
</context>
|
|
77
|
+
</template>
|
|
78
|
+
|
|
79
|
+
<template name="morph-migration" value="public partial class Add{{pascalCase FEATURE_NAME}} : Migration { protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( name: "{{pascalCase FEATURE_NAME}}s", columns: table => new { Id = table.Column<int>(type: "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), $END$ }, constraints: table => { table.PrimaryKey("PK_{{pascalCase FEATURE_NAME}}s", x => x.Id); }); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable(name: "{{pascalCase FEATURE_NAME}}s"); } }" description="MORPH EF Core migration template" toReformat="false" toShortenFQNames="true">
|
|
80
|
+
<context>
|
|
81
|
+
<option name="C_SHARP" value="true" />
|
|
82
|
+
</context>
|
|
83
|
+
</template>
|
|
84
|
+
|
|
85
|
+
<template name="morph-ts-contract" value="export interface {{pascalCase FEATURE_NAME}} { id: number; $FIELD1$ } export interface Create{{pascalCase FEATURE_NAME}}Request { $FIELD2$ } export interface Update{{pascalCase FEATURE_NAME}}Request { $END$ }" description="MORPH TypeScript contract template" toReformat="false" toShortenFQNames="true">
|
|
86
|
+
<variable name="FIELD1" expression="" defaultValue="""" alwaysStopAt="true" />
|
|
87
|
+
<variable name="FIELD2" expression="" defaultValue="""" alwaysStopAt="true" />
|
|
88
|
+
<context>
|
|
89
|
+
<option name="TypeScript" value="true" />
|
|
90
|
+
</context>
|
|
91
|
+
</template>
|
|
92
|
+
</templateSet>
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
{
|
|
2
|
+
"MORPH Template - PascalCase": {
|
|
3
|
+
"prefix": "morph-pascal",
|
|
4
|
+
"body": ["{{pascalCase ${1:FEATURE_NAME}}}"],
|
|
5
|
+
"description": "Convert to PascalCase (UserAuth)"
|
|
6
|
+
},
|
|
7
|
+
"MORPH Template - camelCase": {
|
|
8
|
+
"prefix": "morph-camel",
|
|
9
|
+
"body": ["{{camelCase ${1:FEATURE_NAME}}}"],
|
|
10
|
+
"description": "Convert to camelCase (userAuth)"
|
|
11
|
+
},
|
|
12
|
+
"MORPH Template - snake_case": {
|
|
13
|
+
"prefix": "morph-snake",
|
|
14
|
+
"body": ["{{snakeCase ${1:FEATURE_NAME}}}"],
|
|
15
|
+
"description": "Convert to snake_case (user_auth)"
|
|
16
|
+
},
|
|
17
|
+
"MORPH Template - Title Case": {
|
|
18
|
+
"prefix": "morph-title",
|
|
19
|
+
"body": ["{{titleCase ${1:FEATURE_NAME}}}"],
|
|
20
|
+
"description": "Convert to Title Case (User Auth)"
|
|
21
|
+
},
|
|
22
|
+
"MORPH Template - kebab-case": {
|
|
23
|
+
"prefix": "morph-kebab",
|
|
24
|
+
"body": ["{{kebabCase ${1:FEATURE_NAME}}}"],
|
|
25
|
+
"description": "Convert to kebab-case (user-auth)"
|
|
26
|
+
},
|
|
27
|
+
"MORPH Template - UPPER_SNAKE_CASE": {
|
|
28
|
+
"prefix": "morph-upper-snake",
|
|
29
|
+
"body": ["{{upperSnakeCase ${1:FEATURE_NAME}}}"],
|
|
30
|
+
"description": "Convert to UPPER_SNAKE_CASE (USER_AUTH)"
|
|
31
|
+
},
|
|
32
|
+
"MORPH Template - Conditional If": {
|
|
33
|
+
"prefix": "morph-if",
|
|
34
|
+
"body": [
|
|
35
|
+
"{{#if ${1:condition}}}",
|
|
36
|
+
" $2",
|
|
37
|
+
"{{/if}}"
|
|
38
|
+
],
|
|
39
|
+
"description": "Handlebars if block"
|
|
40
|
+
},
|
|
41
|
+
"MORPH Template - Conditional If-Else": {
|
|
42
|
+
"prefix": "morph-if-else",
|
|
43
|
+
"body": [
|
|
44
|
+
"{{#if ${1:condition}}}",
|
|
45
|
+
" $2",
|
|
46
|
+
"{{else}}",
|
|
47
|
+
" $3",
|
|
48
|
+
"{{/if}}"
|
|
49
|
+
],
|
|
50
|
+
"description": "Handlebars if-else block"
|
|
51
|
+
},
|
|
52
|
+
"MORPH Template - Each Loop": {
|
|
53
|
+
"prefix": "morph-each",
|
|
54
|
+
"body": [
|
|
55
|
+
"{{#each ${1:items}}}",
|
|
56
|
+
" {{this.$2}}",
|
|
57
|
+
"{{/each}}"
|
|
58
|
+
],
|
|
59
|
+
"description": "Handlebars each loop"
|
|
60
|
+
},
|
|
61
|
+
"MORPH Template - Unless": {
|
|
62
|
+
"prefix": "morph-unless",
|
|
63
|
+
"body": [
|
|
64
|
+
"{{#unless ${1:condition}}}",
|
|
65
|
+
" $2",
|
|
66
|
+
"{{/unless}}"
|
|
67
|
+
],
|
|
68
|
+
"description": "Handlebars unless block"
|
|
69
|
+
},
|
|
70
|
+
"MORPH Template - .NET Service Class": {
|
|
71
|
+
"prefix": "morph-service",
|
|
72
|
+
"body": [
|
|
73
|
+
"namespace {{NAMESPACE}}.Application.Features.{{pascalCase FEATURE_NAME}}.Services;",
|
|
74
|
+
"",
|
|
75
|
+
"public class {{pascalCase FEATURE_NAME}}Service(",
|
|
76
|
+
" I{{pascalCase FEATURE_NAME}}Repository repository,",
|
|
77
|
+
" ILogger<{{pascalCase FEATURE_NAME}}Service> logger) : I{{pascalCase FEATURE_NAME}}Service",
|
|
78
|
+
"{",
|
|
79
|
+
" public async Task<{{pascalCase FEATURE_NAME}}Dto?> GetByIdAsync(int id, CancellationToken cancellationToken = default)",
|
|
80
|
+
" {",
|
|
81
|
+
" $1",
|
|
82
|
+
" }",
|
|
83
|
+
"}"
|
|
84
|
+
],
|
|
85
|
+
"description": "MORPH .NET Service class template"
|
|
86
|
+
},
|
|
87
|
+
"MORPH Template - .NET Repository Class": {
|
|
88
|
+
"prefix": "morph-repository",
|
|
89
|
+
"body": [
|
|
90
|
+
"public class {{pascalCase FEATURE_NAME}}Repository(AppDbContext context) : I{{pascalCase FEATURE_NAME}}Repository",
|
|
91
|
+
"{",
|
|
92
|
+
" private readonly DbSet<{{pascalCase FEATURE_NAME}}> _dbSet = context.Set<{{pascalCase FEATURE_NAME}}>();",
|
|
93
|
+
"",
|
|
94
|
+
" public async Task<{{pascalCase FEATURE_NAME}}?> GetByIdAsync(int id, CancellationToken cancellationToken = default)",
|
|
95
|
+
" {",
|
|
96
|
+
" $1",
|
|
97
|
+
" }",
|
|
98
|
+
"}"
|
|
99
|
+
],
|
|
100
|
+
"description": "MORPH .NET Repository class template"
|
|
101
|
+
},
|
|
102
|
+
"MORPH Template - Blazor Component": {
|
|
103
|
+
"prefix": "morph-component",
|
|
104
|
+
"body": [
|
|
105
|
+
"@page \"/{{kebabCase FEATURE_NAME}}\"",
|
|
106
|
+
"@inject I{{pascalCase FEATURE_NAME}}Service {{pascalCase FEATURE_NAME}}Service",
|
|
107
|
+
"@inject ILogger<{{pascalCase FEATURE_NAME}}Page> Logger",
|
|
108
|
+
"",
|
|
109
|
+
"<PageTitle>{{pascalCase FEATURE_NAME}}</PageTitle>",
|
|
110
|
+
"",
|
|
111
|
+
"<div class=\"container-fluid\">",
|
|
112
|
+
" $1",
|
|
113
|
+
"</div>",
|
|
114
|
+
"",
|
|
115
|
+
"@code {",
|
|
116
|
+
" $2",
|
|
117
|
+
"}"
|
|
118
|
+
],
|
|
119
|
+
"description": "MORPH Blazor component template"
|
|
120
|
+
},
|
|
121
|
+
"MORPH Template - EF Core Migration": {
|
|
122
|
+
"prefix": "morph-migration",
|
|
123
|
+
"body": [
|
|
124
|
+
"public partial class Add{{pascalCase FEATURE_NAME}} : Migration",
|
|
125
|
+
"{",
|
|
126
|
+
" protected override void Up(MigrationBuilder migrationBuilder)",
|
|
127
|
+
" {",
|
|
128
|
+
" migrationBuilder.CreateTable(",
|
|
129
|
+
" name: \"{{pascalCase FEATURE_NAME}}s\",",
|
|
130
|
+
" columns: table => new",
|
|
131
|
+
" {",
|
|
132
|
+
" Id = table.Column<int>(type: \"int\", nullable: false)",
|
|
133
|
+
" .Annotation(\"SqlServer:Identity\", \"1, 1\"),",
|
|
134
|
+
" $1",
|
|
135
|
+
" },",
|
|
136
|
+
" constraints: table =>",
|
|
137
|
+
" {",
|
|
138
|
+
" table.PrimaryKey(\"PK_{{pascalCase FEATURE_NAME}}s\", x => x.Id);",
|
|
139
|
+
" });",
|
|
140
|
+
" }",
|
|
141
|
+
"",
|
|
142
|
+
" protected override void Down(MigrationBuilder migrationBuilder)",
|
|
143
|
+
" {",
|
|
144
|
+
" migrationBuilder.DropTable(name: \"{{pascalCase FEATURE_NAME}}s\");",
|
|
145
|
+
" }",
|
|
146
|
+
"}"
|
|
147
|
+
],
|
|
148
|
+
"description": "MORPH EF Core migration template"
|
|
149
|
+
},
|
|
150
|
+
"MORPH Template - Hangfire Job": {
|
|
151
|
+
"prefix": "morph-job",
|
|
152
|
+
"body": [
|
|
153
|
+
"public class {{pascalCase FEATURE_NAME}}ProcessorJob(",
|
|
154
|
+
" I{{pascalCase FEATURE_NAME}}Service service,",
|
|
155
|
+
" ILogger<{{pascalCase FEATURE_NAME}}ProcessorJob> logger) : I{{pascalCase FEATURE_NAME}}ProcessorJob",
|
|
156
|
+
"{",
|
|
157
|
+
" [AutomaticRetry(Attempts = 3, DelaysInSeconds = new[] { 60, 300, 900 })]",
|
|
158
|
+
" [Queue(\"default\")]",
|
|
159
|
+
" [JobDisplayName(\"{{pascalCase FEATURE_NAME}} Processing - ID: {0}\")]",
|
|
160
|
+
" public async Task ExecuteAsync(int id, CancellationToken cancellationToken)",
|
|
161
|
+
" {",
|
|
162
|
+
" $1",
|
|
163
|
+
" }",
|
|
164
|
+
"}"
|
|
165
|
+
],
|
|
166
|
+
"description": "MORPH Hangfire job template"
|
|
167
|
+
},
|
|
168
|
+
"MORPH Template - TypeScript Contract": {
|
|
169
|
+
"prefix": "morph-ts-contract",
|
|
170
|
+
"body": [
|
|
171
|
+
"export interface {{pascalCase FEATURE_NAME}} {",
|
|
172
|
+
" id: number;",
|
|
173
|
+
" $1",
|
|
174
|
+
"}",
|
|
175
|
+
"",
|
|
176
|
+
"export interface Create{{pascalCase FEATURE_NAME}}Request {",
|
|
177
|
+
" $2",
|
|
178
|
+
"}",
|
|
179
|
+
"",
|
|
180
|
+
"export interface Update{{pascalCase FEATURE_NAME}}Request {",
|
|
181
|
+
" $3",
|
|
182
|
+
"}"
|
|
183
|
+
],
|
|
184
|
+
"description": "MORPH TypeScript contract template"
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# IDE Snippets for MORPH Templates
|
|
2
|
+
|
|
3
|
+
> Boost your productivity with IDE snippets for Handlebars template syntax
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📦 Installation
|
|
8
|
+
|
|
9
|
+
### VS Code
|
|
10
|
+
|
|
11
|
+
**Option 1: Project Snippets (Recommended)**
|
|
12
|
+
|
|
13
|
+
Snippets are already configured in `framework/templates/.vscode/morph-templates.code-snippets`.
|
|
14
|
+
|
|
15
|
+
To use them:
|
|
16
|
+
1. Open your project in VS Code
|
|
17
|
+
2. Snippets auto-activate when editing template files
|
|
18
|
+
3. Type a prefix (e.g., `morph-pascal`) and press `Tab`
|
|
19
|
+
|
|
20
|
+
**Option 2: Global Snippets**
|
|
21
|
+
|
|
22
|
+
To use snippets across all projects:
|
|
23
|
+
1. Open VS Code
|
|
24
|
+
2. Go to `File > Preferences > Configure User Snippets`
|
|
25
|
+
3. Select `New Global Snippets file...`
|
|
26
|
+
4. Name it `morph-templates.code-snippets`
|
|
27
|
+
5. Copy content from `framework/templates/.vscode/morph-templates.code-snippets`
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
### JetBrains IDEs (Rider, WebStorm, IntelliJ IDEA)
|
|
32
|
+
|
|
33
|
+
**Installation:**
|
|
34
|
+
|
|
35
|
+
1. Open your IDE
|
|
36
|
+
2. Go to `File > Settings > Editor > Live Templates`
|
|
37
|
+
3. Click the `⚙️` gear icon → `Import Settings...`
|
|
38
|
+
4. Select `framework/templates/.idea/morph-templates.xml`
|
|
39
|
+
5. Click `OK` to import
|
|
40
|
+
|
|
41
|
+
**Activation:**
|
|
42
|
+
|
|
43
|
+
Snippets will be available in the "MORPH Templates" group. Type the prefix and press `Tab`.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 🎯 Available Snippets
|
|
48
|
+
|
|
49
|
+
### Handlebars Helpers (Case Transformations)
|
|
50
|
+
|
|
51
|
+
| Prefix | Output | Example Result |
|
|
52
|
+
|--------|--------|----------------|
|
|
53
|
+
| `morph-pascal` | `{{pascalCase FEATURE_NAME}}` | `UserAuthentication` |
|
|
54
|
+
| `morph-camel` | `{{camelCase FEATURE_NAME}}` | `userAuthentication` |
|
|
55
|
+
| `morph-snake` | `{{snakeCase FEATURE_NAME}}` | `user_authentication` |
|
|
56
|
+
| `morph-title` | `{{titleCase FEATURE_NAME}}` | `User Authentication` |
|
|
57
|
+
| `morph-kebab` | `{{kebabCase FEATURE_NAME}}` | `user-authentication` |
|
|
58
|
+
| `morph-upper-snake` | `{{upperSnakeCase FEATURE_NAME}}` | `USER_AUTHENTICATION` |
|
|
59
|
+
|
|
60
|
+
### Handlebars Control Flow
|
|
61
|
+
|
|
62
|
+
| Prefix | Description | Example |
|
|
63
|
+
|--------|-------------|---------|
|
|
64
|
+
| `morph-if` | If block | `{{#if condition}}...{{/if}}` |
|
|
65
|
+
| `morph-if-else` | If-else block | `{{#if condition}}...{{else}}...{{/if}}` |
|
|
66
|
+
| `morph-each` | Loop over array | `{{#each items}}{{this.name}}{{/each}}` |
|
|
67
|
+
| `morph-unless` | Unless block | `{{#unless condition}}...{{/unless}}` |
|
|
68
|
+
|
|
69
|
+
### .NET Templates
|
|
70
|
+
|
|
71
|
+
| Prefix | Template | File Extension |
|
|
72
|
+
|--------|----------|----------------|
|
|
73
|
+
| `morph-service` | Service class (business logic) | `.cs` |
|
|
74
|
+
| `morph-repository` | Repository class (data access) | `.cs` |
|
|
75
|
+
| `morph-component` | Blazor component | `.razor` |
|
|
76
|
+
| `morph-migration` | EF Core migration | `.cs` |
|
|
77
|
+
| `morph-job` | Hangfire background job | `.cs` |
|
|
78
|
+
|
|
79
|
+
### TypeScript Templates
|
|
80
|
+
|
|
81
|
+
| Prefix | Template | File Extension |
|
|
82
|
+
|--------|----------|----------------|
|
|
83
|
+
| `morph-ts-contract` | TypeScript interfaces (DTOs) | `.ts` |
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 🚀 Usage Examples
|
|
88
|
+
|
|
89
|
+
### Example 1: Creating a Service Template
|
|
90
|
+
|
|
91
|
+
**Steps:**
|
|
92
|
+
1. Create new file: `UserService.cs`
|
|
93
|
+
2. Type `morph-service` → Press `Tab`
|
|
94
|
+
3. Result:
|
|
95
|
+
```csharp
|
|
96
|
+
namespace {{NAMESPACE}}.Application.Features.{{pascalCase FEATURE_NAME}}.Services;
|
|
97
|
+
|
|
98
|
+
public class {{pascalCase FEATURE_NAME}}Service(
|
|
99
|
+
I{{pascalCase FEATURE_NAME}}Repository repository,
|
|
100
|
+
ILogger<{{pascalCase FEATURE_NAME}}Service> logger) : I{{pascalCase FEATURE_NAME}}Service
|
|
101
|
+
{
|
|
102
|
+
public async Task<{{pascalCase FEATURE_NAME}}Dto?> GetByIdAsync(int id, CancellationToken cancellationToken = default)
|
|
103
|
+
{
|
|
104
|
+
// Cursor here
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Example 2: Using Case Helpers
|
|
110
|
+
|
|
111
|
+
**Scenario:** Convert `user-authentication` to different cases
|
|
112
|
+
|
|
113
|
+
```handlebars
|
|
114
|
+
// Type: morph-pascal → Tab
|
|
115
|
+
{{pascalCase FEATURE_NAME}} // Output: UserAuthentication
|
|
116
|
+
|
|
117
|
+
// Type: morph-camel → Tab
|
|
118
|
+
{{camelCase FEATURE_NAME}} // Output: userAuthentication
|
|
119
|
+
|
|
120
|
+
// Type: morph-snake → Tab
|
|
121
|
+
{{snakeCase FEATURE_NAME}} // Output: user_authentication
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Example 3: Conditional Rendering
|
|
125
|
+
|
|
126
|
+
**Scenario:** Show different content based on stack
|
|
127
|
+
|
|
128
|
+
```handlebars
|
|
129
|
+
// Type: morph-if-else → Tab
|
|
130
|
+
{{#if (eq STACK "Blazor")}}
|
|
131
|
+
// Blazor-specific code
|
|
132
|
+
{{else}}
|
|
133
|
+
// Generic code
|
|
134
|
+
{{/if}}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Example 4: Looping Over Items
|
|
138
|
+
|
|
139
|
+
**Scenario:** Generate multiple DTOs
|
|
140
|
+
|
|
141
|
+
```handlebars
|
|
142
|
+
// Type: morph-each → Tab
|
|
143
|
+
{{#each entities}}
|
|
144
|
+
public class {{pascalCase this.name}}Dto
|
|
145
|
+
{
|
|
146
|
+
// Properties
|
|
147
|
+
}
|
|
148
|
+
{{/each}}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## 📝 Customizing Snippets
|
|
154
|
+
|
|
155
|
+
### VS Code
|
|
156
|
+
|
|
157
|
+
Edit `framework/templates/.vscode/morph-templates.code-snippets`:
|
|
158
|
+
|
|
159
|
+
```json
|
|
160
|
+
{
|
|
161
|
+
"MORPH Template - Custom": {
|
|
162
|
+
"prefix": "morph-custom",
|
|
163
|
+
"body": [
|
|
164
|
+
"// Your custom template",
|
|
165
|
+
"$1"
|
|
166
|
+
],
|
|
167
|
+
"description": "Your description"
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### JetBrains IDEs
|
|
173
|
+
|
|
174
|
+
1. Go to `File > Settings > Editor > Live Templates`
|
|
175
|
+
2. Select "MORPH Templates" group
|
|
176
|
+
3. Click `+` → `Live Template`
|
|
177
|
+
4. Set abbreviation (prefix), description, and template text
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 🎨 Snippet Scopes
|
|
182
|
+
|
|
183
|
+
| Snippet | VS Code Scope | JetBrains Scope |
|
|
184
|
+
|---------|---------------|-----------------|
|
|
185
|
+
| Handlebars helpers | All files | All files |
|
|
186
|
+
| .NET templates | `.cs`, `.razor` | C#, HTML |
|
|
187
|
+
| TypeScript templates | `.ts`, `.tsx` | TypeScript |
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 💡 Best Practices
|
|
192
|
+
|
|
193
|
+
**1. Use Helpers Over Pre-computed Variables**
|
|
194
|
+
|
|
195
|
+
```handlebars
|
|
196
|
+
✅ GOOD: {{pascalCase FEATURE_NAME}}Service
|
|
197
|
+
❌ BAD: {{FEATURE_NAME_PASCAL}}Service // Deprecated
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**2. Chain Helpers for Complex Transformations**
|
|
201
|
+
|
|
202
|
+
```handlebars
|
|
203
|
+
// Pluralize a PascalCase name
|
|
204
|
+
{{pascalCase (pluralize FEATURE_NAME)}} // Users, Orders, etc.
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**3. Use Conditional Blocks for Stack-Specific Code**
|
|
208
|
+
|
|
209
|
+
```handlebars
|
|
210
|
+
{{#if (eq STACK "Blazor")}}
|
|
211
|
+
@inject NavigationManager Navigation
|
|
212
|
+
{{/if}}
|
|
213
|
+
{{#if (eq STACK "Nextjs")}}
|
|
214
|
+
import { useRouter } from 'next/navigation';
|
|
215
|
+
{{/if}}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**4. Extract Common Patterns to Snippets**
|
|
219
|
+
|
|
220
|
+
If you find yourself typing the same template code repeatedly, create a custom snippet!
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## 🔧 Troubleshooting
|
|
225
|
+
|
|
226
|
+
### Snippets Not Showing Up (VS Code)
|
|
227
|
+
|
|
228
|
+
**Solution:**
|
|
229
|
+
1. Check file extension matches snippet scope (e.g., `.cs` for C# snippets)
|
|
230
|
+
2. Reload VS Code: `Ctrl+Shift+P` → `Developer: Reload Window`
|
|
231
|
+
3. Verify snippet file location: `framework/templates/.vscode/morph-templates.code-snippets`
|
|
232
|
+
|
|
233
|
+
### Snippets Not Showing Up (JetBrains)
|
|
234
|
+
|
|
235
|
+
**Solution:**
|
|
236
|
+
1. Verify import: `File > Settings > Editor > Live Templates` → Check "MORPH Templates" group exists
|
|
237
|
+
2. Check snippet scope: Click snippet → Verify "Applicable in" contexts
|
|
238
|
+
3. Restart IDE
|
|
239
|
+
|
|
240
|
+
### Tab Not Expanding Snippet
|
|
241
|
+
|
|
242
|
+
**Solution:**
|
|
243
|
+
- **VS Code:** Ensure `editor.tabCompletion` is enabled in settings
|
|
244
|
+
- **JetBrains:** Ensure `Tab` is set as expansion key in `Settings > Editor > Live Templates`
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## 📚 Related Documentation
|
|
249
|
+
|
|
250
|
+
- [Template System README](framework/templates/README.md) - Complete template system documentation
|
|
251
|
+
- [Handlebars Helpers](framework/templates/README.md#handlebars-helpers) - Full list of available helpers
|
|
252
|
+
- [CLI Template Commands](CLAUDE.md#templates) - Command-line template management
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## 🎁 Contributing Custom Snippets
|
|
257
|
+
|
|
258
|
+
Have a useful snippet? Share it!
|
|
259
|
+
|
|
260
|
+
1. Add snippet to appropriate file (`.vscode/` or `.idea/`)
|
|
261
|
+
2. Document it in this README (add row to tables)
|
|
262
|
+
3. Submit PR with description of use case
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
*MORPH-SPEC Template Snippets by Polymorphism Tech*
|