@polymorphism-tech/morph-spec 4.7.2 → 4.8.1
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 +54 -5
- package/.morph/state.json +152 -2
- package/LICENSE +1 -2
- package/README.md +379 -414
- package/bin/morph-spec.js +57 -394
- package/bin/validate.js +2 -26
- package/claude-plugin.json +2 -2
- package/docs/ARCHITECTURE.md +43 -46
- package/docs/CHEATSHEET.md +203 -221
- package/docs/COMMAND-FLOWS.md +319 -289
- package/docs/QUICKSTART.md +2 -8
- package/docs/plans/2026-02-22-claude-docs-morph-alignment-analysis.md +2 -0
- package/docs/plans/2026-02-22-claude-settings.md +2 -0
- package/docs/plans/2026-02-22-morph-cc-alignment-impl.md +2 -0
- package/docs/plans/2026-02-22-morph-spec-next.md +2 -0
- package/docs/plans/2026-02-22-native-alignment-design.md +2 -0
- package/docs/plans/2026-02-22-native-alignment-impl.md +2 -0
- package/docs/plans/2026-02-22-native-enrichment-design.md +2 -0
- package/docs/plans/2026-02-22-native-enrichment.md +2 -0
- package/docs/plans/2026-02-23-ddd-architecture-refactor.md +2 -0
- package/docs/plans/2026-02-23-ddd-nextsteps.md +2 -0
- package/docs/plans/2026-02-23-infra-architect-refactor.md +2 -0
- package/docs/plans/2026-02-23-nextjs-code-review-design.md +2 -1
- package/docs/plans/2026-02-23-nextjs-code-review-impl.md +2 -0
- package/docs/plans/2026-02-23-nextjs-standards-design.md +2 -1
- package/docs/plans/2026-02-23-nextjs-standards-impl.md +2 -0
- package/docs/plans/2026-02-24-cli-radical-simplification.md +592 -0
- package/docs/plans/2026-02-24-framework-failure-points.md +125 -0
- package/docs/plans/2026-02-24-morph-init-design.md +337 -0
- package/docs/plans/2026-02-24-morph-init-impl.md +1269 -0
- package/docs/plans/2026-02-24-tutorial-command-design.md +71 -0
- package/docs/plans/2026-02-24-tutorial-command.md +298 -0
- package/framework/CLAUDE.md +1 -1
- package/framework/commands/morph-proposal.md +3 -3
- package/framework/hooks/README.md +2 -5
- package/framework/hooks/claude-code/pre-tool-use/protect-readonly-files.js +4 -55
- package/framework/hooks/claude-code/session-start/inject-morph-context.js +20 -5
- package/framework/hooks/claude-code/statusline.py +6 -1
- package/framework/hooks/dev/check-sync-health.js +117 -0
- package/framework/hooks/dev/guard-version-numbers.js +57 -0
- package/framework/hooks/dev/sync-standards-registry.js +60 -0
- package/framework/hooks/dev/sync-template-registry.js +60 -0
- package/framework/hooks/dev/validate-skill-format.js +70 -0
- package/framework/hooks/dev/validate-standard-format.js +73 -0
- package/framework/hooks/shared/payload-utils.js +39 -0
- package/framework/hooks/shared/state-reader.js +25 -1
- package/framework/rules/morph-workflow.md +1 -1
- package/framework/skills/level-0-meta/morph-init/SKILL.md +216 -0
- package/framework/skills/level-0-meta/morph-replicate/SKILL.md +4 -4
- package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +4 -4
- package/framework/skills/level-0-meta/verification-before-completion/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/phase-clarify/SKILL.md +192 -191
- package/framework/skills/level-1-workflows/phase-codebase-analysis/SKILL.md +181 -180
- package/framework/skills/level-1-workflows/phase-design/SKILL.md +339 -338
- package/framework/skills/level-1-workflows/phase-implement/SKILL.md +254 -253
- package/framework/skills/level-1-workflows/phase-setup/SKILL.md +168 -170
- package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +284 -283
- package/framework/skills/level-1-workflows/phase-uiux/SKILL.md +246 -245
- package/framework/templates/examples/design-system-examples.md +1 -1
- package/framework/templates/ui/FluentDesignTheme.cs +1 -1
- package/framework/templates/ui/MudTheme.cs +1 -1
- package/framework/templates/ui/design-system.css +1 -1
- package/package.json +4 -2
- package/scripts/bump-version.js +248 -0
- package/scripts/install-dev-hooks.js +138 -0
- package/src/commands/agents/index.js +1 -2
- package/src/commands/index.js +13 -16
- package/src/commands/project/doctor.js +100 -14
- package/src/commands/project/index.js +7 -10
- package/src/commands/project/init.js +398 -528
- package/src/commands/project/install-plugin-cmd.js +28 -0
- package/src/commands/project/setup-infra-cmd.js +12 -0
- package/src/commands/project/tutorial.js +115 -0
- package/src/commands/state/approve.js +213 -221
- package/src/commands/state/index.js +0 -1
- package/src/commands/state/state.js +337 -365
- package/src/commands/templates/index.js +0 -4
- package/src/commands/trust/trust.js +1 -93
- package/src/commands/utils/index.js +1 -5
- package/src/commands/validation/index.js +1 -5
- package/src/core/registry/command-registry.js +11 -285
- package/src/core/state/state-manager.js +5 -2
- package/src/lib/detectors/index.js +81 -87
- package/src/lib/detectors/structure-detector.js +275 -273
- package/src/lib/generators/recap-generator.js +232 -225
- package/src/scripts/global-install.js +34 -0
- package/src/scripts/install-plugin.js +126 -0
- package/src/scripts/setup-infra.js +203 -0
- package/src/utils/agents-installer.js +10 -1
- package/src/utils/hooks-installer.js +66 -3
- package/.morph/.morphversion +0 -5
- package/.morph/config/config.json +0 -8
- package/.morph/framework/agents.json +0 -1815
- package/.morph/framework/hooks/README.md +0 -205
- package/.morph/framework/hooks/claude-code/notification/approval-reminder.js +0 -54
- package/.morph/framework/hooks/claude-code/post-tool-use/dispatch.js +0 -83
- package/.morph/framework/hooks/claude-code/post-tool-use/handle-tool-failure.js +0 -42
- package/.morph/framework/hooks/claude-code/pre-compact/save-morph-context.js +0 -61
- package/.morph/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +0 -71
- package/.morph/framework/hooks/claude-code/pre-tool-use/protect-readonly-files.js +0 -58
- package/.morph/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +0 -64
- package/.morph/framework/hooks/claude-code/session-start/inject-morph-context.js +0 -94
- package/.morph/framework/hooks/claude-code/statusline.py +0 -538
- package/.morph/framework/hooks/claude-code/statusline.sh +0 -7
- package/.morph/framework/hooks/claude-code/stop/validate-completion.js +0 -88
- package/.morph/framework/hooks/claude-code/user-prompt/enrich-prompt.js +0 -91
- package/.morph/framework/hooks/git/commit-msg/conventional-commits.sh +0 -33
- package/.morph/framework/hooks/git/pre-commit/agents.sh +0 -25
- package/.morph/framework/hooks/git/pre-commit/orchestrator.sh +0 -64
- package/.morph/framework/hooks/git/pre-commit/specs.sh +0 -50
- package/.morph/framework/hooks/git/pre-push/run-tests.sh +0 -44
- package/.morph/framework/hooks/shared/hook-response.js +0 -45
- package/.morph/framework/hooks/shared/phase-utils.js +0 -129
- package/.morph/framework/hooks/shared/state-reader.js +0 -138
- package/.morph/framework/hooks/shared/stdin-reader.js +0 -26
- package/.morph/framework/standards/STANDARDS.json +0 -933
- package/.morph/framework/standards/ai-agents/blazor-ui.md +0 -364
- package/.morph/framework/standards/ai-agents/production.md +0 -415
- package/.morph/framework/standards/ai-agents/setup.md +0 -418
- package/.morph/framework/standards/ai-agents/team-orchestration.md +0 -479
- package/.morph/framework/standards/ai-agents/workflows.md +0 -354
- package/.morph/framework/standards/architecture/ddd/aggregates.md +0 -120
- package/.morph/framework/standards/architecture/ddd/bounded-contexts.md +0 -105
- package/.morph/framework/standards/architecture/ddd/complexity-levels.md +0 -108
- package/.morph/framework/standards/architecture/ddd/entities.md +0 -99
- package/.morph/framework/standards/architecture/ddd/ubiquitous-language.md +0 -58
- package/.morph/framework/standards/architecture/ddd/value-objects.md +0 -124
- package/.morph/framework/standards/backend/api/minimal-api.md +0 -494
- package/.morph/framework/standards/backend/api/rest.md +0 -492
- package/.morph/framework/standards/backend/api/validation.md +0 -88
- package/.morph/framework/standards/backend/authentication/passkeys.md +0 -428
- package/.morph/framework/standards/backend/database/ef-core.md +0 -199
- package/.morph/framework/standards/backend/database/migrations.md +0 -393
- package/.morph/framework/standards/backend/database/postgresql/database.md +0 -352
- package/.morph/framework/standards/backend/database/repository-patterns.md +0 -528
- package/.morph/framework/standards/backend/database/vector-search-rag.md +0 -541
- package/.morph/framework/standards/backend/dotnet/async.md +0 -366
- package/.morph/framework/standards/backend/dotnet/core.md +0 -117
- package/.morph/framework/standards/backend/dotnet/di.md +0 -439
- package/.morph/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
- package/.morph/framework/standards/backend/integrations/asaas/asaas-api.md +0 -216
- package/.morph/framework/standards/backend/integrations/clerk/clerk-auth.md +0 -290
- package/.morph/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
- package/.morph/framework/standards/backend/integrations/resend/resend-email.md +0 -385
- package/.morph/framework/standards/context/analytics.md +0 -96
- package/.morph/framework/standards/context/bundles.md +0 -110
- package/.morph/framework/standards/context/priming.md +0 -78
- package/.morph/framework/standards/core/architecture.md +0 -185
- package/.morph/framework/standards/core/coding.md +0 -214
- package/.morph/framework/standards/core/git-branching-strategy.md +0 -403
- package/.morph/framework/standards/core/git.md +0 -185
- package/.morph/framework/standards/core/testing.md +0 -295
- package/.morph/framework/standards/data/nosql/blob-storage.md +0 -102
- package/.morph/framework/standards/data/nosql/cache/redis.md +0 -97
- package/.morph/framework/standards/data/nosql/cosmos-db.md +0 -118
- package/.morph/framework/standards/data/vector-search/azure-ai-search.md +0 -121
- package/.morph/framework/standards/data/vector-search/rag-chunking.md +0 -104
- package/.morph/framework/standards/frontend/blazor/design-checklist.md +0 -222
- package/.morph/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
- package/.morph/framework/standards/frontend/blazor/fluent-ui.md +0 -137
- package/.morph/framework/standards/frontend/blazor/html-conversion.md +0 -184
- package/.morph/framework/standards/frontend/blazor/lifecycle.md +0 -195
- package/.morph/framework/standards/frontend/blazor/pitfalls.md +0 -198
- package/.morph/framework/standards/frontend/blazor/state.md +0 -191
- package/.morph/framework/standards/frontend/design-system/animations.md +0 -151
- package/.morph/framework/standards/frontend/design-system/naming.md +0 -64
- package/.morph/framework/standards/frontend/nextjs/app-router.md +0 -123
- package/.morph/framework/standards/frontend/nextjs/components.md +0 -132
- package/.morph/framework/standards/frontend/nextjs/data-fetching.md +0 -126
- package/.morph/framework/standards/frontend/nextjs/forms.md +0 -128
- package/.morph/framework/standards/frontend/nextjs/naming-conventions.md +0 -67
- package/.morph/framework/standards/frontend/nextjs/nextjs-patterns.md +0 -215
- package/.morph/framework/standards/frontend/nextjs/project-structure.md +0 -102
- package/.morph/framework/standards/frontend/nextjs/state-management.md +0 -72
- package/.morph/framework/standards/frontend/nextjs/testing.md +0 -111
- package/.morph/framework/standards/infrastructure/azure/azure.md +0 -624
- package/.morph/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
- package/.morph/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
- package/.morph/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
- package/.morph/framework/standards/infrastructure/azure/services/functions.md +0 -486
- package/.morph/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
- package/.morph/framework/standards/infrastructure/azure/services/storage.md +0 -407
- package/.morph/framework/standards/infrastructure/docker/easypanel-deploy.md +0 -196
- package/.morph/framework/standards/infrastructure/supabase/mcp-setup.md +0 -252
- package/.morph/framework/standards/infrastructure/supabase/supabase-auth.md +0 -176
- package/.morph/framework/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
- package/.morph/framework/standards/infrastructure/supabase/supabase-rls.md +0 -184
- package/.morph/framework/standards/infrastructure/supabase/supabase-storage.md +0 -153
- package/.morph/framework/standards/integration/api/graphql.md +0 -91
- package/.morph/framework/standards/integration/api/grpc.md +0 -114
- package/.morph/framework/standards/integration/api/rest-design.md +0 -95
- package/.morph/framework/standards/integration/event-driven/cqrs.md +0 -101
- package/.morph/framework/standards/integration/event-driven/event-sourcing.md +0 -124
- package/.morph/framework/standards/integration/event-driven/service-bus.md +0 -95
- package/.morph/framework/standards/integration/mcp/mcp-tools.md +0 -384
- package/.morph/framework/standards/observability/logging.md +0 -131
- package/.morph/framework/standards/observability/metrics.md +0 -121
- package/.morph/framework/standards/observability/monitoring.md +0 -114
- package/.morph/framework/standards/observability/tracing.md +0 -132
- package/.morph/framework/standards/workflows/parallel-execution.md +0 -112
- package/.morph/framework/standards/workflows/thread-management.md +0 -113
- package/.morph/framework/templates/.idea/morph-templates.xml +0 -92
- package/.morph/framework/templates/.vscode/morph-templates.code-snippets +0 -186
- package/.morph/framework/templates/IDE-SNIPPETS.md +0 -266
- package/.morph/framework/templates/README.md +0 -814
- package/.morph/framework/templates/REGISTRY.json +0 -1888
- package/.morph/framework/templates/code/dotnet/backend/repository.cs +0 -141
- package/.morph/framework/templates/code/dotnet/backend/service.cs +0 -139
- package/.morph/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
- package/.morph/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/README.md +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
- package/.morph/framework/templates/code/dotnet/contracts/contracts-level1.cs +0 -69
- package/.morph/framework/templates/code/dotnet/contracts/contracts-level2.cs +0 -86
- package/.morph/framework/templates/code/dotnet/contracts/contracts-level3.cs +0 -41
- package/.morph/framework/templates/code/dotnet/database/migration.cs +0 -83
- package/.morph/framework/templates/code/dotnet/frontend/component.razor +0 -239
- package/.morph/framework/templates/code/dotnet/jobs/agent.cs +0 -163
- package/.morph/framework/templates/code/dotnet/jobs/job.cs +0 -171
- package/.morph/framework/templates/code/dotnet/test.cs +0 -239
- package/.morph/framework/templates/code/sql/rls-policy.sql +0 -57
- package/.morph/framework/templates/code/sql/supabase-migration.sql +0 -100
- package/.morph/framework/templates/code/sql/supabase-migration.template.sql +0 -113
- package/.morph/framework/templates/code/typescript/contracts.ts +0 -168
- package/.morph/framework/templates/context/CONTEXT-FEATURE.md +0 -276
- package/.morph/framework/templates/context/CONTEXT.md +0 -181
- package/.morph/framework/templates/docs/clarifications.md +0 -253
- package/.morph/framework/templates/docs/onboarding.md +0 -123
- package/.morph/framework/templates/docs/proposal.md +0 -182
- package/.morph/framework/templates/docs/schema-analysis.md +0 -119
- package/.morph/framework/templates/docs/spec.md +0 -198
- package/.morph/framework/templates/docs/ui-components.md +0 -124
- package/.morph/framework/templates/docs/ui-design-system.md +0 -76
- package/.morph/framework/templates/docs/ui-flows.md +0 -167
- package/.morph/framework/templates/docs/ui-mockups.md +0 -98
- package/.morph/framework/templates/docs/user-stories.md +0 -34
- package/.morph/framework/templates/examples/design-system-examples.md +0 -357
- package/.morph/framework/templates/examples/spec-examples.md +0 -90
- package/.morph/framework/templates/feature/decisions.md +0 -187
- package/.morph/framework/templates/feature/recap.md +0 -146
- package/.morph/framework/templates/feature/tasks.md +0 -199
- package/.morph/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +0 -43
- package/.morph/framework/templates/frontend/nextjs/client-component.tsx.hbs +0 -26
- package/.morph/framework/templates/frontend/nextjs/env.mjs.hbs +0 -32
- package/.morph/framework/templates/frontend/nextjs/feature-form.tsx.hbs +0 -56
- package/.morph/framework/templates/frontend/nextjs/page.tsx.hbs +0 -22
- package/.morph/framework/templates/frontend/nextjs/tsconfig.json.hbs +0 -26
- package/.morph/framework/templates/frontend/nextjs/use-feature.ts.hbs +0 -54
- package/.morph/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
- package/.morph/framework/templates/infrastructure/azure/README.md +0 -286
- package/.morph/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
- package/.morph/framework/templates/infrastructure/azure/app-service.bicep +0 -164
- package/.morph/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
- package/.morph/framework/templates/infrastructure/azure/container-app.bicep +0 -156
- package/.morph/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
- package/.morph/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
- package/.morph/framework/templates/infrastructure/azure/deploy.sh +0 -208
- package/.morph/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
- package/.morph/framework/templates/infrastructure/azure/main.bicep +0 -189
- package/.morph/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
- package/.morph/framework/templates/infrastructure/azure/storage.bicep +0 -106
- package/.morph/framework/templates/infrastructure/docker/Dockerfile.template +0 -58
- package/.morph/framework/templates/infrastructure/docker/docker-compose.template.yml +0 -67
- package/.morph/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +0 -38
- package/.morph/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +0 -48
- package/.morph/framework/templates/infrastructure/docker/easypanel.template.json +0 -54
- package/.morph/framework/templates/infrastructure/github/README.md +0 -593
- package/.morph/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
- package/.morph/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -45
- package/.morph/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +0 -27
- package/.morph/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
- package/.morph/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -31
- package/.morph/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -59
- package/.morph/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -39
- package/.morph/framework/templates/integrations/asaas-client.cs +0 -387
- package/.morph/framework/templates/integrations/asaas-webhook.cs +0 -351
- package/.morph/framework/templates/integrations/azure-identity-config.cs +0 -288
- package/.morph/framework/templates/integrations/clerk-config.cs +0 -258
- package/.morph/framework/templates/meta-prompts/fusion/fusion-agent.md +0 -76
- package/.morph/framework/templates/meta-prompts/fusion/fusion-aggregator.md +0 -100
- package/.morph/framework/templates/meta-prompts/hops/hop-retry.md +0 -78
- package/.morph/framework/templates/meta-prompts/hops/hop-validation.md +0 -97
- package/.morph/framework/templates/meta-prompts/hops/hop-wrapper.md +0 -36
- package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +0 -113
- package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +0 -80
- package/.morph/framework/templates/meta-prompts/squad-leaders/backend-squad.md +0 -90
- package/.morph/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +0 -126
- package/.morph/framework/templates/meta-prompts/squad-leaders/squad-leader.md +0 -43
- package/.morph/framework/templates/meta-prompts/validators/checkpoint-validator.md +0 -107
- package/.morph/framework/templates/meta-prompts/validators/pre-commit-validator.md +0 -95
- package/.morph/framework/templates/project-structure/dotnet-ddd.md +0 -70
- package/.morph/framework/templates/saas/subscription.cs +0 -347
- package/.morph/framework/templates/saas/tenant.cs +0 -338
- package/.morph/framework/templates/state.template.json +0 -17
- package/.morph/framework/templates/ui/FluentDesignTheme.cs +0 -149
- package/.morph/framework/templates/ui/MudTheme.cs +0 -281
- package/.morph/framework/templates/ui/design-system.css +0 -226
- package/.morph/logs/tool-failures.log +0 -17
- package/.morph/memory/pre-compact-2026-02-24T17-43-30-049Z.json +0 -16
- package/.morph/plans/eager-watching-bunny.md +0 -105
- package/.morph/plans/temporal-seeking-nebula.md +0 -45
- package/CLAUDE.md +0 -77
- package/docs/claude-alignment-report.md +0 -137
- package/docs/examples/order-management/contracts.cs +0 -84
- package/docs/examples/order-management/proposal.md +0 -24
- package/docs/examples/order-management/spec.md +0 -162
- package/src/commands/feature/create-story.js +0 -362
- package/src/commands/feature/index.js +0 -6
- package/src/commands/feature/shard-spec.js +0 -225
- package/src/commands/feature/sprint-status.js +0 -250
- package/src/commands/generation/generate-onboarding.js +0 -169
- package/src/commands/generation/generate.js +0 -276
- package/src/commands/generation/index.js +0 -5
- package/src/commands/learning/capture-pattern.js +0 -121
- package/src/commands/learning/index.js +0 -5
- package/src/commands/learning/search-patterns.js +0 -126
- package/src/commands/mcp/mcp.js +0 -102
- package/src/commands/project/changes.js +0 -66
- package/src/commands/project/cost.js +0 -179
- package/src/commands/project/diff.js +0 -278
- package/src/commands/project/revert.js +0 -173
- package/src/commands/project/standards.js +0 -80
- package/src/commands/project/sync.js +0 -167
- package/src/commands/project/update-agents.js +0 -23
- package/src/commands/state/rollback-phase.js +0 -185
- package/src/commands/templates/template-customize.js +0 -87
- package/src/commands/templates/template-list.js +0 -114
- package/src/commands/templates/template-show.js +0 -129
- package/src/commands/templates/template-validate.js +0 -91
- package/src/commands/utils/troubleshoot.js +0 -222
- package/src/commands/validation/analyze-blazor-concurrency.js +0 -193
- package/src/commands/validation/lint-fluent.js +0 -352
- package/src/commands/validation/validate-blazor-state.js +0 -210
- package/src/commands/validation/validate-blazor.js +0 -156
- package/src/commands/validation/validate-css.js +0 -84
- package/src/lib/detectors/conversation-analyzer.js +0 -163
- package/src/lib/learning/index.js +0 -7
- package/src/lib/learning/learning-system.js +0 -520
- package/src/lib/troubleshooting/index.js +0 -8
- package/src/lib/troubleshooting/troubleshoot-grep.js +0 -198
- package/src/lib/troubleshooting/troubleshoot-index.js +0 -144
- package/src/llm/environment-detector.js +0 -43
|
@@ -1,439 +0,0 @@
|
|
|
1
|
-
# .NET Dependency Injection Standards
|
|
2
|
-
|
|
3
|
-
> **Scope:** universal
|
|
4
|
-
> **Layer:** 0 (always load)
|
|
5
|
-
> **Keywords:** di, dependency injection, ioc, lifetime, scoped, singleton, transient
|
|
6
|
-
> **Load When:** always
|
|
7
|
-
|
|
8
|
-
Dependency Injection patterns and lifetimes for .NET applications
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Service Lifetimes
|
|
13
|
-
|
|
14
|
-
### Transient
|
|
15
|
-
|
|
16
|
-
**Created every time they're requested**
|
|
17
|
-
|
|
18
|
-
Use for: Lightweight, stateless services
|
|
19
|
-
|
|
20
|
-
```csharp
|
|
21
|
-
// Program.cs
|
|
22
|
-
builder.Services.AddTransient<IEmailService, EmailService>();
|
|
23
|
-
builder.Services.AddTransient<IPdfGenerator, PdfGenerator>();
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
### Scoped
|
|
27
|
-
|
|
28
|
-
**Created once per request (HTTP request in web apps)**
|
|
29
|
-
|
|
30
|
-
Use for: DbContext, repositories, request-specific services
|
|
31
|
-
|
|
32
|
-
```csharp
|
|
33
|
-
// Program.cs
|
|
34
|
-
builder.Services.AddScoped<IUserRepository, UserRepository>();
|
|
35
|
-
builder.Services.AddScoped<IOrderService, OrderService>();
|
|
36
|
-
builder.Services.AddDbContext<AppDbContext>(); // Scoped by default
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
### Singleton
|
|
40
|
-
|
|
41
|
-
**Created once for application lifetime**
|
|
42
|
-
|
|
43
|
-
Use for: Caching, configuration, thread-safe services
|
|
44
|
-
|
|
45
|
-
```csharp
|
|
46
|
-
// Program.cs
|
|
47
|
-
builder.Services.AddSingleton<IMemoryCache, MemoryCache>();
|
|
48
|
-
builder.Services.AddSingleton<IConfiguration>(builder.Configuration);
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
## Registration Patterns
|
|
54
|
-
|
|
55
|
-
### Interface + Implementation
|
|
56
|
-
|
|
57
|
-
```csharp
|
|
58
|
-
// ✅ CORRECT
|
|
59
|
-
builder.Services.AddScoped<IUserService, UserService>();
|
|
60
|
-
builder.Services.AddScoped<IOrderRepository, OrderRepository>();
|
|
61
|
-
|
|
62
|
-
// ❌ WRONG (concrete types in constructor)
|
|
63
|
-
public class OrderController
|
|
64
|
-
{
|
|
65
|
-
private readonly OrderRepository _repo; // Don't inject concrete types!
|
|
66
|
-
|
|
67
|
-
public OrderController(OrderRepository repo) { }
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Multiple Implementations
|
|
72
|
-
|
|
73
|
-
```csharp
|
|
74
|
-
// Register multiple implementations
|
|
75
|
-
builder.Services.AddScoped<INotificationService, EmailNotificationService>();
|
|
76
|
-
builder.Services.AddScoped<INotificationService, SmsNotificationService>();
|
|
77
|
-
|
|
78
|
-
// Inject IEnumerable<T>
|
|
79
|
-
public class NotificationManager
|
|
80
|
-
{
|
|
81
|
-
private readonly IEnumerable<INotificationService> _services;
|
|
82
|
-
|
|
83
|
-
public NotificationManager(IEnumerable<INotificationService> services)
|
|
84
|
-
{
|
|
85
|
-
_services = services;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
public async Task NotifyAllAsync(string message)
|
|
89
|
-
{
|
|
90
|
-
foreach (var service in _services)
|
|
91
|
-
{
|
|
92
|
-
await service.SendAsync(message);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### Factory Pattern
|
|
99
|
-
|
|
100
|
-
```csharp
|
|
101
|
-
// For services that need per-operation instances
|
|
102
|
-
builder.Services.AddScoped<IUserRepositoryFactory, UserRepositoryFactory>();
|
|
103
|
-
|
|
104
|
-
public interface IUserRepositoryFactory
|
|
105
|
-
{
|
|
106
|
-
IScopedUserRepository CreateScoped();
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
public class UserRepositoryFactory : IUserRepositoryFactory
|
|
110
|
-
{
|
|
111
|
-
private readonly IDbContextFactory<AppDbContext> _contextFactory;
|
|
112
|
-
|
|
113
|
-
public UserRepositoryFactory(IDbContextFactory<AppDbContext> contextFactory)
|
|
114
|
-
{
|
|
115
|
-
_contextFactory = contextFactory;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
public IScopedUserRepository CreateScoped()
|
|
119
|
-
{
|
|
120
|
-
var context = _contextFactory.CreateDbContext();
|
|
121
|
-
return new ScopedUserRepository(context);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
---
|
|
127
|
-
|
|
128
|
-
## Constructor Injection
|
|
129
|
-
|
|
130
|
-
### Primary Constructors (.NET 8+)
|
|
131
|
-
|
|
132
|
-
```csharp
|
|
133
|
-
// ✅ CORRECT (modern syntax)
|
|
134
|
-
public class UserService(
|
|
135
|
-
IUserRepository repository,
|
|
136
|
-
ILogger<UserService> logger,
|
|
137
|
-
IEmailService emailService) : IUserService
|
|
138
|
-
{
|
|
139
|
-
public async Task<User> GetUserAsync(int id)
|
|
140
|
-
{
|
|
141
|
-
logger.LogInformation("Getting user {UserId}", id);
|
|
142
|
-
return await repository.GetByIdAsync(id);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
### Traditional Constructors
|
|
148
|
-
|
|
149
|
-
```csharp
|
|
150
|
-
// ✅ CORRECT
|
|
151
|
-
public class UserService : IUserService
|
|
152
|
-
{
|
|
153
|
-
private readonly IUserRepository _repository;
|
|
154
|
-
private readonly ILogger<UserService> _logger;
|
|
155
|
-
|
|
156
|
-
public UserService(IUserRepository repository, ILogger<UserService> logger)
|
|
157
|
-
{
|
|
158
|
-
_repository = repository;
|
|
159
|
-
_logger = logger;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
## Blazor-Specific DI
|
|
167
|
-
|
|
168
|
-
### DbContext in Blazor Components
|
|
169
|
-
|
|
170
|
-
**❌ WRONG: Direct DbContext Injection**
|
|
171
|
-
|
|
172
|
-
```csharp
|
|
173
|
-
// ❌ WRONG (DbContext lifecycle issue)
|
|
174
|
-
@inject AppDbContext DbContext
|
|
175
|
-
|
|
176
|
-
@code {
|
|
177
|
-
protected override async Task OnInitializedAsync()
|
|
178
|
-
{
|
|
179
|
-
users = await DbContext.Users.ToListAsync(); // May be disposed!
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
**✅ CORRECT: Use IDbContextFactory**
|
|
185
|
-
|
|
186
|
-
```csharp
|
|
187
|
-
// Program.cs
|
|
188
|
-
builder.Services.AddDbContextFactory<AppDbContext>(options =>
|
|
189
|
-
options.UseSqlServer(connectionString));
|
|
190
|
-
|
|
191
|
-
// Component
|
|
192
|
-
@inject IDbContextFactory<AppDbContext> DbFactory
|
|
193
|
-
|
|
194
|
-
@code {
|
|
195
|
-
protected override async Task OnInitializedAsync()
|
|
196
|
-
{
|
|
197
|
-
await using var context = await DbFactory.CreateDbContextAsync();
|
|
198
|
-
users = await context.Users.ToListAsync();
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
### Service Injection in Components
|
|
204
|
-
|
|
205
|
-
```csharp
|
|
206
|
-
@inject IUserService UserService
|
|
207
|
-
@inject NavigationManager Navigation
|
|
208
|
-
@inject ILogger<UserList> Logger
|
|
209
|
-
|
|
210
|
-
@code {
|
|
211
|
-
private List<User> users = new();
|
|
212
|
-
|
|
213
|
-
protected override async Task OnInitializedAsync()
|
|
214
|
-
{
|
|
215
|
-
try
|
|
216
|
-
{
|
|
217
|
-
users = await UserService.GetAllAsync();
|
|
218
|
-
}
|
|
219
|
-
catch (Exception ex)
|
|
220
|
-
{
|
|
221
|
-
Logger.LogError(ex, "Failed to load users");
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
---
|
|
228
|
-
|
|
229
|
-
## Lifetime Conflicts
|
|
230
|
-
|
|
231
|
-
### Problem: Scoped in Singleton
|
|
232
|
-
|
|
233
|
-
```csharp
|
|
234
|
-
// ❌ WRONG (Scoped DbContext injected in Singleton)
|
|
235
|
-
builder.Services.AddSingleton<CacheService>(); // Singleton
|
|
236
|
-
builder.Services.AddDbContext<AppDbContext>(); // Scoped
|
|
237
|
-
|
|
238
|
-
public class CacheService
|
|
239
|
-
{
|
|
240
|
-
private readonly AppDbContext _context; // ❌ WRONG!
|
|
241
|
-
|
|
242
|
-
public CacheService(AppDbContext context)
|
|
243
|
-
{
|
|
244
|
-
_context = context; // Scoped injected in Singleton!
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
**✅ CORRECT: Use IServiceProvider or Factory**
|
|
250
|
-
|
|
251
|
-
```csharp
|
|
252
|
-
public class CacheService
|
|
253
|
-
{
|
|
254
|
-
private readonly IDbContextFactory<AppDbContext> _factory;
|
|
255
|
-
|
|
256
|
-
public CacheService(IDbContextFactory<AppDbContext> factory)
|
|
257
|
-
{
|
|
258
|
-
_factory = factory;
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
public async Task<User> GetUserAsync(int id)
|
|
262
|
-
{
|
|
263
|
-
await using var context = await _factory.CreateDbContextAsync();
|
|
264
|
-
return await context.Users.FindAsync(id);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
---
|
|
270
|
-
|
|
271
|
-
## Registration Order
|
|
272
|
-
|
|
273
|
-
### Program.cs Order
|
|
274
|
-
|
|
275
|
-
```csharp
|
|
276
|
-
var builder = WebApplication.CreateBuilder(args);
|
|
277
|
-
|
|
278
|
-
// 1. Configuration
|
|
279
|
-
var config = builder.Configuration;
|
|
280
|
-
|
|
281
|
-
// 2. Logging
|
|
282
|
-
builder.Services.AddLogging();
|
|
283
|
-
|
|
284
|
-
// 3. Database
|
|
285
|
-
builder.Services.AddDbContextFactory<AppDbContext>(options =>
|
|
286
|
-
options.UseSqlServer(config.GetConnectionString("DefaultConnection")));
|
|
287
|
-
|
|
288
|
-
// 4. Repositories (depend on DbContext)
|
|
289
|
-
builder.Services.AddScoped<IUserRepository, UserRepository>();
|
|
290
|
-
builder.Services.AddScoped<IOrderRepository, OrderRepository>();
|
|
291
|
-
|
|
292
|
-
// 5. Services (depend on repositories)
|
|
293
|
-
builder.Services.AddScoped<IUserService, UserService>();
|
|
294
|
-
builder.Services.AddScoped<IOrderService, OrderService>();
|
|
295
|
-
|
|
296
|
-
// 6. Infrastructure
|
|
297
|
-
builder.Services.AddScoped<IEmailService, EmailService>();
|
|
298
|
-
builder.Services.AddSingleton<IMemoryCache, MemoryCache>();
|
|
299
|
-
|
|
300
|
-
// 7. External integrations
|
|
301
|
-
builder.Services.AddHttpClient<IPaymentGateway, StripePaymentGateway>();
|
|
302
|
-
|
|
303
|
-
// 8. Framework services (last)
|
|
304
|
-
builder.Services.AddControllers();
|
|
305
|
-
builder.Services.AddRazorComponents();
|
|
306
|
-
|
|
307
|
-
var app = builder.Build();
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
---
|
|
311
|
-
|
|
312
|
-
## Best Practices
|
|
313
|
-
|
|
314
|
-
### DO
|
|
315
|
-
|
|
316
|
-
✅ **Inject interfaces, not concrete types**
|
|
317
|
-
|
|
318
|
-
```csharp
|
|
319
|
-
// ✅ CORRECT
|
|
320
|
-
public class OrderService(IOrderRepository repository) { }
|
|
321
|
-
|
|
322
|
-
// ❌ WRONG
|
|
323
|
-
public class OrderService(OrderRepository repository) { }
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
✅ **Use primary constructors (.NET 8+)**
|
|
327
|
-
|
|
328
|
-
```csharp
|
|
329
|
-
// ✅ CORRECT (concise)
|
|
330
|
-
public class UserService(IUserRepository repository, ILogger<UserService> logger) : IUserService
|
|
331
|
-
{
|
|
332
|
-
public async Task<User> GetAsync(int id) =>
|
|
333
|
-
await repository.GetByIdAsync(id);
|
|
334
|
-
}
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
✅ **Use factories for DbContext in singletons**
|
|
338
|
-
|
|
339
|
-
```csharp
|
|
340
|
-
// ✅ CORRECT
|
|
341
|
-
public class CacheService(IDbContextFactory<AppDbContext> factory)
|
|
342
|
-
{
|
|
343
|
-
public async Task LoadAsync()
|
|
344
|
-
{
|
|
345
|
-
await using var context = await factory.CreateDbContextAsync();
|
|
346
|
-
// Use context
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
```
|
|
350
|
-
|
|
351
|
-
### DON'T
|
|
352
|
-
|
|
353
|
-
❌ **Don't inject scoped services in singletons**
|
|
354
|
-
|
|
355
|
-
```csharp
|
|
356
|
-
// ❌ WRONG
|
|
357
|
-
builder.Services.AddSingleton<CacheService>();
|
|
358
|
-
builder.Services.AddScoped<IUserRepository, UserRepository>();
|
|
359
|
-
|
|
360
|
-
public class CacheService(IUserRepository repository) // ❌ Scoped in Singleton!
|
|
361
|
-
{
|
|
362
|
-
}
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
❌ **Don't use service locator pattern**
|
|
366
|
-
|
|
367
|
-
```csharp
|
|
368
|
-
// ❌ WRONG (anti-pattern)
|
|
369
|
-
public class OrderService
|
|
370
|
-
{
|
|
371
|
-
public async Task ProcessAsync(int orderId)
|
|
372
|
-
{
|
|
373
|
-
var serviceProvider = ...; // Don't do this!
|
|
374
|
-
var repo = serviceProvider.GetService<IOrderRepository>();
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
// ✅ CORRECT (constructor injection)
|
|
379
|
-
public class OrderService(IOrderRepository repository)
|
|
380
|
-
{
|
|
381
|
-
public async Task ProcessAsync(int orderId)
|
|
382
|
-
{
|
|
383
|
-
var order = await repository.GetByIdAsync(orderId);
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
❌ **Don't create instances with `new`**
|
|
389
|
-
|
|
390
|
-
```csharp
|
|
391
|
-
// ❌ WRONG
|
|
392
|
-
public class OrderService
|
|
393
|
-
{
|
|
394
|
-
public async Task ProcessAsync()
|
|
395
|
-
{
|
|
396
|
-
var emailService = new EmailService(); // Don't create manually!
|
|
397
|
-
await emailService.SendAsync(...);
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
// ✅ CORRECT
|
|
402
|
-
public class OrderService(IEmailService emailService)
|
|
403
|
-
{
|
|
404
|
-
public async Task ProcessAsync()
|
|
405
|
-
{
|
|
406
|
-
await emailService.SendAsync(...);
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
---
|
|
412
|
-
|
|
413
|
-
## Testing with DI
|
|
414
|
-
|
|
415
|
-
### Mock Dependencies
|
|
416
|
-
|
|
417
|
-
```csharp
|
|
418
|
-
[Fact]
|
|
419
|
-
public async Task GetUser_ValidId_ReturnsUser()
|
|
420
|
-
{
|
|
421
|
-
// Arrange
|
|
422
|
-
var mockRepo = new Mock<IUserRepository>();
|
|
423
|
-
mockRepo.Setup(r => r.GetByIdAsync(1))
|
|
424
|
-
.ReturnsAsync(new User { Id = 1, Name = "John" });
|
|
425
|
-
|
|
426
|
-
var service = new UserService(mockRepo.Object, Mock.Of<ILogger<UserService>>());
|
|
427
|
-
|
|
428
|
-
// Act
|
|
429
|
-
var user = await service.GetUserAsync(1);
|
|
430
|
-
|
|
431
|
-
// Assert
|
|
432
|
-
Assert.NotNull(user);
|
|
433
|
-
Assert.Equal("John", user.Name);
|
|
434
|
-
}
|
|
435
|
-
```
|
|
436
|
-
|
|
437
|
-
---
|
|
438
|
-
|
|
439
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
# Program.cs Setup Checklist (Blazor Server)
|
|
2
|
-
|
|
3
|
-
> **Scope:** blazor-azure
|
|
4
|
-
> **Layer:** 2 (on keyword)
|
|
5
|
-
> **Keywords:** program.cs, startup, configuration, blazor, setup
|
|
6
|
-
> **Load When:** blazor project setup
|
|
7
|
-
|
|
8
|
-
## Template
|
|
9
|
-
|
|
10
|
-
```csharp
|
|
11
|
-
var builder = WebApplication.CreateBuilder(args);
|
|
12
|
-
|
|
13
|
-
// === SERVICES ===
|
|
14
|
-
builder.Services.AddRazorComponents().AddInteractiveServerComponents();
|
|
15
|
-
builder.Services.AddHttpClient();
|
|
16
|
-
builder.Services.AddHttpContextAccessor();
|
|
17
|
-
builder.Services.AddScoped(sp =>
|
|
18
|
-
{
|
|
19
|
-
var client = sp.GetRequiredService<IHttpClientFactory>().CreateClient();
|
|
20
|
-
var ctx = sp.GetRequiredService<IHttpContextAccessor>().HttpContext;
|
|
21
|
-
if (ctx != null) client.BaseAddress = new Uri($"{ctx.Request.Scheme}://{ctx.Request.Host}");
|
|
22
|
-
return client;
|
|
23
|
-
});
|
|
24
|
-
builder.Services.AddDbContext<AppDbContext>(o =>
|
|
25
|
-
o.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
|
|
26
|
-
// builder.Services.AddFluentUIComponents(); // or AddMudServices()
|
|
27
|
-
// builder.Services.AddHangfire(...); builder.Services.AddHangfireServer();
|
|
28
|
-
|
|
29
|
-
var app = builder.Build();
|
|
30
|
-
|
|
31
|
-
// === MIDDLEWARE (ORDER CRITICAL!) ===
|
|
32
|
-
if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); }
|
|
33
|
-
app.UseHttpsRedirection();
|
|
34
|
-
app.UseStaticFiles(); // MUST be before UseAntiforgery!
|
|
35
|
-
app.UseAntiforgery();
|
|
36
|
-
app.MapRazorComponents<App>().AddInteractiveServerRenderMode();
|
|
37
|
-
// app.MapControllers();
|
|
38
|
-
// app.MapHangfireDashboard("/hangfire");
|
|
39
|
-
app.Run();
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
## Services Checklist
|
|
43
|
-
|
|
44
|
-
| Service | Required | Error if Missing |
|
|
45
|
-
|---------|----------|------------------|
|
|
46
|
-
| `AddRazorComponents()` + `AddInteractiveServerComponents()` | Yes | Components don't render / static only |
|
|
47
|
-
| `AddHttpClient()` + `AddHttpContextAccessor()` + BaseAddress | **Critical** | DI fails / "Invalid URI" errors |
|
|
48
|
-
| `AddDbContext()` | If EF Core | Can't inject DbContext |
|
|
49
|
-
| `AddFluentUIComponents()` / `AddMudServices()` | If UI lib | Components unstyled |
|
|
50
|
-
| `AddHangfire()` + `AddHangfireServer()` | If background jobs | Can't enqueue jobs |
|
|
51
|
-
|
|
52
|
-
## Middleware Order
|
|
53
|
-
|
|
54
|
-
| # | Middleware | Required | Error if Wrong |
|
|
55
|
-
|---|-----------|----------|----------------|
|
|
56
|
-
| 1 | `UseExceptionHandler()` | Prod only | Unhandled exceptions crash |
|
|
57
|
-
| 2 | `UseHsts()` | Prod only | HTTP allowed in prod |
|
|
58
|
-
| 3 | `UseHttpsRedirection()` | Yes | Security risk |
|
|
59
|
-
| 4 | **`UseStaticFiles()`** | **Critical** | Static files 404 |
|
|
60
|
-
| 5 | `UseAntiforgery()` | Yes | Form submissions fail |
|
|
61
|
-
| 6 | `MapRazorComponents()` | Yes | App doesn't load |
|
|
62
|
-
| 7 | `MapControllers()` | If API | API 404 |
|
|
63
|
-
|
|
64
|
-
## Common Mistakes
|
|
65
|
-
|
|
66
|
-
| Mistake | Symptom | Fix |
|
|
67
|
-
|---------|---------|-----|
|
|
68
|
-
| Missing `UseStaticFiles()` | CSS/JS don't apply | Add before `UseAntiforgery()` |
|
|
69
|
-
| HttpClient without BaseAddress | `InvalidOperationException: Invalid URI` | Set via `IHttpContextAccessor` (see template) |
|
|
70
|
-
| Wrong middleware order | Static 404, forms fail | Follow order above exactly |
|
|
71
|
-
|
|
72
|
-
## UI Library Setup
|
|
73
|
-
|
|
74
|
-
**Fluent UI:** `builder.Services.AddFluentUIComponents()` → wrap in `<FluentProvider Theme="@theme">`
|
|
75
|
-
**MudBlazor:** `builder.Services.AddMudServices()` → add `<MudThemeProvider/>` + `<MudDialogProvider/>` + `<MudSnackbarProvider/>`
|
|
76
|
-
**Hangfire:** `AddHangfire(c => c.UseSqlServerStorage(...))` + `AddHangfireServer()` → `MapHangfireDashboard("/hangfire")`
|
|
77
|
-
|
|
78
|
-
## Quick Checklist
|
|
79
|
-
|
|
80
|
-
- [ ] `AddRazorComponents()` + `AddInteractiveServerComponents()`
|
|
81
|
-
- [ ] `AddHttpClient()` + `AddHttpContextAccessor()` + BaseAddress
|
|
82
|
-
- [ ] `AddDbContext()` (if EF Core)
|
|
83
|
-
- [ ] UI library registered
|
|
84
|
-
- [ ] `UseStaticFiles()` BEFORE `UseAntiforgery()`
|
|
85
|
-
- [ ] Middleware in correct order
|
|
86
|
-
- [ ] `MapRazorComponents<App>().AddInteractiveServerRenderMode()`
|
|
87
|
-
|
|
88
|
-
> **Ref:** [blazor-pitfalls.md](./blazor-pitfalls.md) | [blazor-lifecycle.md](./blazor-lifecycle.md) | [dotnet10-compatibility.md](./dotnet10-compatibility.md)
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
*MORPH-SPEC by Polymorphism Tech*
|