@polymorphism-tech/morph-spec 4.7.2 → 4.8.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/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/CHEATSHEET.md +203 -221
- package/docs/QUICKSTART.md +2 -8
- 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 +7 -5
- 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/analytics/threads-log.jsonl +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/.morph/state.json +0 -48
- package/CLAUDE.md +0 -77
- package/docs/ARCHITECTURE.md +0 -331
- package/docs/COMMAND-FLOWS.md +0 -368
- 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/docs/plans/2026-02-22-claude-docs-morph-alignment-analysis.md +0 -512
- package/docs/plans/2026-02-22-claude-settings.md +0 -515
- package/docs/plans/2026-02-22-morph-cc-alignment-impl.md +0 -728
- package/docs/plans/2026-02-22-morph-spec-next.md +0 -478
- package/docs/plans/2026-02-22-native-alignment-design.md +0 -199
- package/docs/plans/2026-02-22-native-alignment-impl.md +0 -925
- package/docs/plans/2026-02-22-native-enrichment-design.md +0 -244
- package/docs/plans/2026-02-22-native-enrichment.md +0 -735
- package/docs/plans/2026-02-23-ddd-architecture-refactor.md +0 -1153
- package/docs/plans/2026-02-23-ddd-nextsteps.md +0 -682
- package/docs/plans/2026-02-23-infra-architect-refactor.md +0 -437
- package/docs/plans/2026-02-23-nextjs-code-review-design.md +0 -156
- package/docs/plans/2026-02-23-nextjs-code-review-impl.md +0 -1254
- package/docs/plans/2026-02-23-nextjs-standards-design.md +0 -149
- package/docs/plans/2026-02-23-nextjs-standards-impl.md +0 -1846
- package/scripts/generate-refs.js +0 -336
- package/scripts/generate-standards-registry.js +0 -44
- package/scripts/scan-nextjs.mjs +0 -169
- package/scripts/validate-real.mjs +0 -255
- 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,96 +0,0 @@
|
|
|
1
|
-
# Context Standard: Context Analytics
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
Context analytics tracks token usage, identifies optimization opportunities, and monitors session efficiency.
|
|
5
|
-
|
|
6
|
-
## Metrics Collected
|
|
7
|
-
|
|
8
|
-
### Session Metrics
|
|
9
|
-
- Session ID, start time, feature, agent
|
|
10
|
-
- Token usage at session start vs end
|
|
11
|
-
- Optimization actions taken
|
|
12
|
-
- Files read (and token cost per file)
|
|
13
|
-
|
|
14
|
-
### Context Efficiency Score
|
|
15
|
-
```
|
|
16
|
-
Efficiency = 1 - (contextTokens / totalContextCapacity)
|
|
17
|
-
Target: > 0.6 (60% of context available for work)
|
|
18
|
-
Warning: < 0.4 (less than 40% available)
|
|
19
|
-
Critical: < 0.2 (less than 20% available)
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Viewing Analytics
|
|
23
|
-
|
|
24
|
-
### Feature Analytics
|
|
25
|
-
```bash
|
|
26
|
-
morph-spec analytics feature morph-next-gen
|
|
27
|
-
|
|
28
|
-
# Context Usage — morph-next-gen
|
|
29
|
-
# ─────────────────────────────────────
|
|
30
|
-
# Sessions: 12
|
|
31
|
-
# Avg session tokens: 45,200
|
|
32
|
-
# Total tokens used: 542,400
|
|
33
|
-
#
|
|
34
|
-
# Efficiency distribution:
|
|
35
|
-
# Excellent (>0.8) ████████░░ 8/12 (67%)
|
|
36
|
-
# Good (0.6-0.8) ██░░░░░░░░ 2/12 (17%)
|
|
37
|
-
# Poor (<0.6) ██░░░░░░░░ 2/12 (17%)
|
|
38
|
-
#
|
|
39
|
-
# Top token consumers:
|
|
40
|
-
# CLAUDE.md 23,000 tokens (42%)
|
|
41
|
-
# standards/coding.md 2,100 tokens (4%)
|
|
42
|
-
# spec.md 1,800 tokens (3%)
|
|
43
|
-
#
|
|
44
|
-
# Optimizations recommended:
|
|
45
|
-
# → Replace CLAUDE.md with priming file (save ~22,500 tokens)
|
|
46
|
-
# → Use context bundle for resume sessions
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### Context Dashboard
|
|
50
|
-
```bash
|
|
51
|
-
morph-spec analytics context
|
|
52
|
-
|
|
53
|
-
# Core Four Status
|
|
54
|
-
# ─────────────────────────────────────
|
|
55
|
-
# Context: [████████░░░░░░░░░░░░] 41% (82,000/200,000 tokens)
|
|
56
|
-
# Model: claude-sonnet-4-6
|
|
57
|
-
# Prompt: 3,200 tokens (current turn)
|
|
58
|
-
# Tools: 12 tools active
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## Optimization Triggers
|
|
62
|
-
|
|
63
|
-
| Condition | Trigger | Action |
|
|
64
|
-
|-----------|---------|--------|
|
|
65
|
-
| Context > 75% | Warning | Suggest bundle creation |
|
|
66
|
-
| Context > 90% | Critical | Auto-suggest micro-agent split |
|
|
67
|
-
| CLAUDE.md loaded | Info | Suggest priming file |
|
|
68
|
-
| > 5 standards loaded | Info | Suggest standards subset |
|
|
69
|
-
| Unused MCP servers | Warning | Suggest MCP hygiene |
|
|
70
|
-
|
|
71
|
-
## Analytics Storage
|
|
72
|
-
Events stored in JSONL format at `.morph/analytics/`:
|
|
73
|
-
- `threads-log.jsonl` — thread lifecycle events
|
|
74
|
-
- `context-log.jsonl` — context optimization events
|
|
75
|
-
- `trust-log.jsonl` — trust/approval events
|
|
76
|
-
|
|
77
|
-
Each event:
|
|
78
|
-
```json
|
|
79
|
-
{
|
|
80
|
-
"timestamp": "2026-02-19T00:00:00Z",
|
|
81
|
-
"type": "context_warning",
|
|
82
|
-
"feature": "morph-next-gen",
|
|
83
|
-
"data": {
|
|
84
|
-
"contextPercent": 82,
|
|
85
|
-
"tokensUsed": 164000,
|
|
86
|
-
"totalCapacity": 200000,
|
|
87
|
-
"recommendation": "CREATE_BUNDLE"
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
## Pruning
|
|
93
|
-
Analytics auto-prune after 90 days. Manual prune:
|
|
94
|
-
```bash
|
|
95
|
-
morph-spec analytics project --prune 30
|
|
96
|
-
```
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
# Context Standard: Context Bundles
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
Context bundles are compressed snapshots of feature state for resuming long-running sessions without re-reading all files.
|
|
5
|
-
|
|
6
|
-
## What a Bundle Contains
|
|
7
|
-
|
|
8
|
-
```json
|
|
9
|
-
{
|
|
10
|
-
"bundleId": "morph-next-gen-20260219-001",
|
|
11
|
-
"feature": "morph-next-gen",
|
|
12
|
-
"createdAt": "2026-02-19T00:00:00Z",
|
|
13
|
-
"tokensEstimated": 14800,
|
|
14
|
-
"compressionRatio": 0.12,
|
|
15
|
-
|
|
16
|
-
"spec": {
|
|
17
|
-
"problem": "1-2 sentence problem statement",
|
|
18
|
-
"solution": "1-2 sentence solution approach",
|
|
19
|
-
"keyRequirements": ["REQ1", "REQ2", "REQ3"],
|
|
20
|
-
"dataModel": ["Entity1 (fields)", "Entity2 (fields)"]
|
|
21
|
-
},
|
|
22
|
-
|
|
23
|
-
"decisions": [
|
|
24
|
-
{ "id": "ADR-001", "summary": "Chose X over Y because Z", "fullPath": "decisions.md#adr-001" }
|
|
25
|
-
],
|
|
26
|
-
|
|
27
|
-
"tasks": {
|
|
28
|
-
"completed": ["T001", "T002", "T003"],
|
|
29
|
-
"inProgress": "T004",
|
|
30
|
-
"pending": ["T005", "T006"],
|
|
31
|
-
"total": 10,
|
|
32
|
-
"progress": "30%"
|
|
33
|
-
},
|
|
34
|
-
|
|
35
|
-
"checkpoints": [
|
|
36
|
-
{ "num": 1, "passed": true, "validatorsRun": ["architecture", "security"] }
|
|
37
|
-
],
|
|
38
|
-
|
|
39
|
-
"agents": ["dotnet-senior", "ef-modeler"],
|
|
40
|
-
|
|
41
|
-
"resumeHints": [
|
|
42
|
-
"Currently implementing: T004 - Create UserService",
|
|
43
|
-
"Last file modified: Services/UserService.cs",
|
|
44
|
-
"Pending issue: DbContext injection pattern needs review"
|
|
45
|
-
]
|
|
46
|
-
}
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## Creating and Using Bundles
|
|
50
|
-
|
|
51
|
-
### Create a Bundle (auto or manual)
|
|
52
|
-
```bash
|
|
53
|
-
# Auto-created on task completion (configured in llm-interaction.json)
|
|
54
|
-
# Manual creation:
|
|
55
|
-
morph-spec bundle create morph-next-gen
|
|
56
|
-
|
|
57
|
-
# Output:
|
|
58
|
-
# ✅ Bundle created: .morph/bundles/morph-next-gen-20260219-001.json
|
|
59
|
-
# Original context: ~180,000 tokens
|
|
60
|
-
# Bundle: ~15,000 tokens (compression: 92%)
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### Load Bundle for Resume
|
|
64
|
-
```bash
|
|
65
|
-
# Load latest bundle for feature
|
|
66
|
-
morph-spec bundle load morph-next-gen
|
|
67
|
-
|
|
68
|
-
# Generates resume context to stdout:
|
|
69
|
-
# "You are resuming the morph-next-gen feature. Current phase: implement.
|
|
70
|
-
# Last completed: T003. Next task: T004 (Create UserService)..."
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
### List Bundles
|
|
74
|
-
```bash
|
|
75
|
-
morph-spec bundle list morph-next-gen
|
|
76
|
-
|
|
77
|
-
# ID Created Tokens Compression
|
|
78
|
-
# morph-next-gen-20260219-001 2026-02-19 14,800 92%
|
|
79
|
-
# morph-next-gen-20260218-001 2026-02-18 12,400 94%
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## Bundle vs Full Context
|
|
83
|
-
|
|
84
|
-
| Scenario | Use |
|
|
85
|
-
|----------|-----|
|
|
86
|
-
| Starting fresh implementation | Full spec + tasks + standards |
|
|
87
|
-
| Resuming mid-session | Bundle (loads in seconds) |
|
|
88
|
-
| Micro-agent handoff | Bundle with agent-specific slice |
|
|
89
|
-
| Cross-day resume | Bundle + load specific changed files |
|
|
90
|
-
|
|
91
|
-
## Auto-Bundle Configuration
|
|
92
|
-
```json
|
|
93
|
-
// .morph/config/llm-interaction.json
|
|
94
|
-
{
|
|
95
|
-
"contextOptimization": {
|
|
96
|
-
"bundles": {
|
|
97
|
-
"enabled": true,
|
|
98
|
-
"directory": ".morph/bundles/",
|
|
99
|
-
"createOnTaskDone": true,
|
|
100
|
-
"maxBundles": 10
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
## Bundle Lifecycle
|
|
107
|
-
- Created: on task completion (if auto-enabled)
|
|
108
|
-
- Retained: last 10 bundles per feature
|
|
109
|
-
- Invalidated: when spec.md is modified (decisions changed)
|
|
110
|
-
- Deleted: when feature is archived
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# Context Standard: Priming Files
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
Priming files are ~500-token summaries replacing the full CLAUDE.md (23K tokens) for focused work sessions.
|
|
5
|
-
|
|
6
|
-
## When to Use Priming Files
|
|
7
|
-
- Starting a new task where full CLAUDE.md is unnecessary
|
|
8
|
-
- Micro-agent sessions with narrow scope
|
|
9
|
-
- Parallel workers that only need domain-specific context
|
|
10
|
-
|
|
11
|
-
## Available Priming Files
|
|
12
|
-
|
|
13
|
-
| File | Focus | When to Use |
|
|
14
|
-
|------|-------|-------------|
|
|
15
|
-
| `.morph/context/feature-prime.md` | Feature implementation | Implementing a new feature |
|
|
16
|
-
| `.morph/context/bug-prime.md` | Bug fixing | Fixing a reported bug |
|
|
17
|
-
| `.morph/context/refactor-prime.md` | Refactoring | Code improvement without behavior change |
|
|
18
|
-
| `.morph/context/design-prime.md` | Design phase | Creating spec.md, decisions.md |
|
|
19
|
-
| `.morph/context/infra-prime.md` | Infrastructure | Bicep, Docker, deployment |
|
|
20
|
-
|
|
21
|
-
## Loading a Priming File
|
|
22
|
-
```bash
|
|
23
|
-
# Load priming file into context
|
|
24
|
-
morph-spec prime feature
|
|
25
|
-
|
|
26
|
-
# Output: contents of feature-prime.md to stdout
|
|
27
|
-
# AI should read this instead of full CLAUDE.md
|
|
28
|
-
|
|
29
|
-
# For micro-agents:
|
|
30
|
-
morph-spec micro-agent create bug-fixer \
|
|
31
|
-
--prime bug \
|
|
32
|
-
--standards "core/coding.md"
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Creating Custom Priming Files
|
|
36
|
-
|
|
37
|
-
Keep priming files under 600 tokens (≈3000 characters):
|
|
38
|
-
```markdown
|
|
39
|
-
# {Context Name} — Quick Reference
|
|
40
|
-
|
|
41
|
-
## Stack
|
|
42
|
-
- Backend: .NET 10 Blazor Server
|
|
43
|
-
- DB: Azure SQL (EF Core)
|
|
44
|
-
- Deploy: Azure Container Apps
|
|
45
|
-
|
|
46
|
-
## Key Patterns
|
|
47
|
-
- Use IDbContextFactory<> (not DbContext directly)
|
|
48
|
-
- Async/await throughout
|
|
49
|
-
- DI order: DbContext → Services → Controllers
|
|
50
|
-
|
|
51
|
-
## Current Feature
|
|
52
|
-
{Feature summary in 2-3 sentences}
|
|
53
|
-
|
|
54
|
-
## Critical Files
|
|
55
|
-
- spec.md: [path]
|
|
56
|
-
- contracts.cs: [path]
|
|
57
|
-
- tasks.json: [path]
|
|
58
|
-
|
|
59
|
-
## Do Not Touch
|
|
60
|
-
- [files to avoid]
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## Token Budget Guidelines
|
|
64
|
-
|
|
65
|
-
| Context Type | Tokens | Use Case |
|
|
66
|
-
|--------------|--------|----------|
|
|
67
|
-
| Full CLAUDE.md | ~23,000 | Full orchestrator session |
|
|
68
|
-
| Priming file | ~500 | Focused task session |
|
|
69
|
-
| Context bundle | ~15,000 | Feature resume (compressed) |
|
|
70
|
-
| Standards subset | ~2,000/file | Domain specialist |
|
|
71
|
-
| Agent prompt | ~1,000 | Micro-agent task |
|
|
72
|
-
|
|
73
|
-
## Optimization Flow
|
|
74
|
-
1. Start with priming file (500 tokens)
|
|
75
|
-
2. Load relevant standards (2,000 tokens/file, max 3 files)
|
|
76
|
-
3. Load spec summary from metadata.json (not full spec.md)
|
|
77
|
-
4. Load tasks.json for current phase only
|
|
78
|
-
5. Total budget: target < 8,000 tokens for routine tasks
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
# Architecture Standards
|
|
2
|
-
|
|
3
|
-
> **Scope:** universal
|
|
4
|
-
> **Layer:** 0 (always load)
|
|
5
|
-
> **Keywords:** architecture, clean, solid, layers, di, separation of concerns
|
|
6
|
-
> **Load When:** always
|
|
7
|
-
|
|
8
|
-
Architecture patterns, layer responsibilities, and structural rules.
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Clean Architecture Layers
|
|
13
|
-
|
|
14
|
-
```
|
|
15
|
-
┌───────────────────────────────────────┐
|
|
16
|
-
│ Web (Blazor/NextJS, API) │ ← Entry, UI, controllers
|
|
17
|
-
│ ┌─────────────────────────────────┐ │
|
|
18
|
-
│ │ Infrastructure (EF, External) │ │ ← Data, services
|
|
19
|
-
│ │ ┌───────────────────────────┐ │ │
|
|
20
|
-
│ │ │ Application (Services) │ │ │ ← Business logic
|
|
21
|
-
│ │ │ ┌───────────────────┐ │ │ │
|
|
22
|
-
│ │ │ │ Domain (Entities) │ │ │ │ ← Core
|
|
23
|
-
│ │ │ └───────────────────┘ │ │ │
|
|
24
|
-
│ │ └───────────────────────────┘ │ │
|
|
25
|
-
│ └─────────────────────────────────┘ │
|
|
26
|
-
└───────────────────────────────────────┘
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
**Dependency Rule:** Inner layers NEVER reference outer layers.
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## Layer Responsibilities
|
|
34
|
-
|
|
35
|
-
| Layer | Contains | References | Key Packages |
|
|
36
|
-
|-------|----------|------------|--------------|
|
|
37
|
-
| **Domain** | Entities, Value Objects, Enums, Interfaces | None | None (pure C#) |
|
|
38
|
-
| **Application** | Services, DTOs, Validators | Domain | FluentValidation, MediatR |
|
|
39
|
-
| **Infrastructure** | DbContext, Repositories, External clients | Domain, Application | EF Core, HttpClient |
|
|
40
|
-
| **Web** | Pages, Components, Controllers, Program.cs | All | Blazor, Fluent UI |
|
|
41
|
-
|
|
42
|
-
---
|
|
43
|
-
|
|
44
|
-
## Project Structure
|
|
45
|
-
|
|
46
|
-
```
|
|
47
|
-
src/{App}.Domain/
|
|
48
|
-
Entities/ Order.cs, Customer.cs
|
|
49
|
-
ValueObjects/ Money.cs, Address.cs
|
|
50
|
-
Enums/ OrderStatus.cs
|
|
51
|
-
Interfaces/ IOrderRepository.cs
|
|
52
|
-
|
|
53
|
-
src/{App}.Application/
|
|
54
|
-
Services/ OrderService.cs
|
|
55
|
-
DTOs/ OrderResponse.cs
|
|
56
|
-
Validators/ CreateOrderValidator.cs
|
|
57
|
-
|
|
58
|
-
src/{App}.Infrastructure/
|
|
59
|
-
Data/
|
|
60
|
-
AppDbContext.cs
|
|
61
|
-
Configurations/ OrderConfiguration.cs
|
|
62
|
-
Repositories/ OrderRepository.cs
|
|
63
|
-
Services/ AsaasPaymentService.cs
|
|
64
|
-
|
|
65
|
-
src/{App}.Web/
|
|
66
|
-
Components/
|
|
67
|
-
Layout/ MainLayout.razor
|
|
68
|
-
Pages/ Orders.razor
|
|
69
|
-
wwwroot/
|
|
70
|
-
Program.cs
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## File Organization
|
|
76
|
-
|
|
77
|
-
| Rule | Description |
|
|
78
|
-
|------|-------------|
|
|
79
|
-
| One class per file | `OrderService.cs` for `OrderService` |
|
|
80
|
-
| Folder = namespace | `Entities/Order.cs` → `MyApp.Domain.Entities` |
|
|
81
|
-
| No nested classes | Except private helpers |
|
|
82
|
-
| Extensions per layer | `ServiceCollectionExtensions.cs` in each project |
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## SOLID Quick Reference
|
|
87
|
-
|
|
88
|
-
| Principle | Rule | Signal |
|
|
89
|
-
|-----------|------|--------|
|
|
90
|
-
| **S** Single Responsibility | One reason to change | Class > 300 lines? Mix DB + email + validation? Split. |
|
|
91
|
-
| **O** Open/Closed | Extend via new classes | `switch` on type? Use polymorphism. |
|
|
92
|
-
| **L** Liskov Substitution | Subtypes substitutable | Override throws `NotSupportedException`? Violation. |
|
|
93
|
-
| **I** Interface Segregation | Small interfaces | Interface with 10+ methods? Split. |
|
|
94
|
-
| **D** Dependency Inversion | Depend on abstractions | Concrete class in constructor? Use interface. |
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## Service Patterns
|
|
99
|
-
|
|
100
|
-
| Pattern | When | Complexity |
|
|
101
|
-
|---------|------|-----------|
|
|
102
|
-
| Direct DbContext | Simple CRUD, < 3 entities | Low |
|
|
103
|
-
| Repository | Data abstraction, testability | Medium |
|
|
104
|
-
| Repository Factory | Background ops, Hangfire | Medium |
|
|
105
|
-
| CQRS | Read/write models differ | Medium-High |
|
|
106
|
-
| MediatR | Decouple handlers, pipelines | Medium |
|
|
107
|
-
|
|
108
|
-
```csharp
|
|
109
|
-
public sealed class OrderService(IOrderRepository repository, ILogger<OrderService> logger) : IOrderService
|
|
110
|
-
{
|
|
111
|
-
public async Task<Result<OrderResponse>> CreateAsync(CreateOrderRequest request, CancellationToken ct = default)
|
|
112
|
-
{
|
|
113
|
-
logger.LogInformation("Creating order for {CustomerId}", request.CustomerId);
|
|
114
|
-
if (request.Items.Count == 0)
|
|
115
|
-
return Result.Failure<OrderResponse>("Order must have items");
|
|
116
|
-
|
|
117
|
-
var order = Order.Create(request.CustomerId, request.Items);
|
|
118
|
-
await repository.AddAsync(order, ct);
|
|
119
|
-
await repository.SaveChangesAsync(ct);
|
|
120
|
-
return Result.Success(order.ToResponse());
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
## DI Registration Pattern
|
|
128
|
-
|
|
129
|
-
```csharp
|
|
130
|
-
// Program.cs
|
|
131
|
-
builder.Services
|
|
132
|
-
.AddApplication()
|
|
133
|
-
.AddInfrastructure(builder.Configuration)
|
|
134
|
-
.AddWeb();
|
|
135
|
-
|
|
136
|
-
// Application/Extensions/ServiceCollectionExtensions.cs
|
|
137
|
-
public static IServiceCollection AddApplication(this IServiceCollection services)
|
|
138
|
-
{
|
|
139
|
-
services.AddScoped<IOrderService, OrderService>();
|
|
140
|
-
services.AddValidatorsFromAssemblyContaining<CreateOrderValidator>();
|
|
141
|
-
return services;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Infrastructure/Extensions/ServiceCollectionExtensions.cs
|
|
145
|
-
public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration config)
|
|
146
|
-
{
|
|
147
|
-
var conn = config.GetConnectionString("Default");
|
|
148
|
-
services.AddDbContext<AppDbContext>(o => o.UseSqlServer(conn));
|
|
149
|
-
services.AddDbContextFactory<AppDbContext>(o => o.UseSqlServer(conn));
|
|
150
|
-
services.AddScoped<IOrderRepository, OrderRepository>();
|
|
151
|
-
return services;
|
|
152
|
-
}
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
## Architecture Smells
|
|
158
|
-
|
|
159
|
-
| Smell | Signal | Fix |
|
|
160
|
-
|-------|--------|-----|
|
|
161
|
-
| Circular dependency | A refs B, B refs A | Extract shared interface to lower layer |
|
|
162
|
-
| Fat controller/page | Page > 50 lines logic | Extract to service |
|
|
163
|
-
| Anemic domain | Entities data-only | Move behavior into entities |
|
|
164
|
-
| God class | > 500 lines, 10+ deps | Split by responsibility |
|
|
165
|
-
| Service locator | `IServiceProvider.GetService<T>()` | Constructor injection |
|
|
166
|
-
| Over-abstraction | Interface, one impl, never mocked | Use concrete class |
|
|
167
|
-
| Under-abstraction | External service called directly | Extract interface |
|
|
168
|
-
| Leaking infrastructure | `DbContext` in Web layer | Route through Application |
|
|
169
|
-
|
|
170
|
-
---
|
|
171
|
-
|
|
172
|
-
## Checklist
|
|
173
|
-
|
|
174
|
-
- [ ] No circular references (`dotnet build` clean)
|
|
175
|
-
- [ ] Domain has zero NuGet packages
|
|
176
|
-
- [ ] No unused project references
|
|
177
|
-
- [ ] Every interface has consumer (no "just in case")
|
|
178
|
-
- [ ] External services through interfaces
|
|
179
|
-
- [ ] Configuration via Options pattern
|
|
180
|
-
- [ ] No hardcoded secrets in code
|
|
181
|
-
- [ ] All secrets in Key Vault or user-secrets
|
|
182
|
-
|
|
183
|
-
---
|
|
184
|
-
|
|
185
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
# C# Coding Standards
|
|
2
|
-
|
|
3
|
-
> **Scope:** universal
|
|
4
|
-
> **Layer:** 0 (always load)
|
|
5
|
-
> **Keywords:** coding, naming, async, style, conventions, csharp
|
|
6
|
-
> **Load When:** always
|
|
7
|
-
|
|
8
|
-
Single source of truth for C# naming conventions, code style, and enforcement.
|
|
9
|
-
Based on [Microsoft C# Coding Conventions](https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions) and [.NET Naming Guidelines](https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/naming-guidelines).
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Naming Conventions
|
|
14
|
-
|
|
15
|
-
| Element | Convention | Example |
|
|
16
|
-
|---------|-----------|---------|
|
|
17
|
-
| Classes | PascalCase | `OrderService` |
|
|
18
|
-
| Interfaces | `I` + PascalCase | `IOrderService` |
|
|
19
|
-
| Methods | PascalCase | `GetOrderAsync` |
|
|
20
|
-
| Async methods | + `Async` suffix | `ProcessPaymentAsync` |
|
|
21
|
-
| Properties | PascalCase | `OrderTotal` |
|
|
22
|
-
| Constants | PascalCase | `DefaultPageSize` **NOT** `DEFAULT_PAGE_SIZE` |
|
|
23
|
-
| Enums / Members | PascalCase | `OrderStatus.PendingPayment` **NOT** `PENDING_PAYMENT` |
|
|
24
|
-
| Namespaces | PascalCase | `MyApp.Domain` |
|
|
25
|
-
| Type parameters | `T` + PascalCase | `TEntity`, `TResult` |
|
|
26
|
-
| Private fields | `_camelCase` | `_orderRepository` |
|
|
27
|
-
| Static private | `s_camelCase` | `s_instance` |
|
|
28
|
-
| Thread-static | `t_camelCase` | `t_contextId` |
|
|
29
|
-
| Locals / Params | camelCase | `orderId`, `orderTotal` |
|
|
30
|
-
|
|
31
|
-
### Acronyms
|
|
32
|
-
|
|
33
|
-
| Length | Rule | Example |
|
|
34
|
-
|--------|------|---------|
|
|
35
|
-
| 2 chars | Both uppercase | `IO`, `UI` |
|
|
36
|
-
| 3+ chars | PascalCase | `Html`, `Xml`, `Http` |
|
|
37
|
-
|
|
38
|
-
### DON'T
|
|
39
|
-
|
|
40
|
-
| Wrong | Right |
|
|
41
|
-
|-------|-------|
|
|
42
|
-
| `strName`, `iCount` | `name`, `count` |
|
|
43
|
-
| `MAX_RETRY_COUNT` | `MaxRetryCount` |
|
|
44
|
-
| `btnSubmit`, `lblName` | `submitButton`, `nameLabel` |
|
|
45
|
-
| `order_total`, `get_order` | `orderTotal`, `GetOrder` |
|
|
46
|
-
| `repo`, `ctx`, `mgr`, `svc` | `repository`, `context`, `manager`, `service` |
|
|
47
|
-
| `Int32 count`, `String name` | `int count`, `string name` |
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## Code Style
|
|
52
|
-
|
|
53
|
-
### Modern C# (10+)
|
|
54
|
-
|
|
55
|
-
```csharp
|
|
56
|
-
namespace MyApp.Application.Services; // File-scoped
|
|
57
|
-
|
|
58
|
-
public sealed class OrderService(IOrderRepository repository) : IOrderService
|
|
59
|
-
{
|
|
60
|
-
public async Task<Result<Order>> GetByIdAsync(int id, CancellationToken ct = default)
|
|
61
|
-
{
|
|
62
|
-
var order = await repository.GetByIdAsync(id, ct);
|
|
63
|
-
return order is null
|
|
64
|
-
? Result.Failure<Order>("Not found")
|
|
65
|
-
: Result.Success(order);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Style Rules
|
|
71
|
-
|
|
72
|
-
| Rule | Wrong | Right |
|
|
73
|
-
|------|-------|-------|
|
|
74
|
-
| `var` when obvious | `OrderDto order = new OrderDto()` | `var order = new OrderDto()` |
|
|
75
|
-
| Target-typed `new` | `OrderDto order = new OrderDto()` | `OrderDto order = new()` |
|
|
76
|
-
| Null checks | `== null`, `!= null` | `is null`, `is not null` |
|
|
77
|
-
| Collections | `new List<int> { 1, 2 }` | `List<int> items = [1, 2]` |
|
|
78
|
-
| Expression body | `{ return _name; }` | `=> _name;` |
|
|
79
|
-
| Nullable refs | Disabled | `<Nullable>enable</Nullable>` |
|
|
80
|
-
| Pattern matching | `if (x is int)` then cast | `if (x is int value)` |
|
|
81
|
-
| Default `sealed` | Unsealed classes | `sealed` unless inheritance needed |
|
|
82
|
-
|
|
83
|
-
### Complexity Thresholds
|
|
84
|
-
|
|
85
|
-
| Metric | Limit |
|
|
86
|
-
|--------|-------|
|
|
87
|
-
| Method length | < 30 lines (prefer < 20) |
|
|
88
|
-
| Method parameters | ≤ 4 (use record for more) |
|
|
89
|
-
| Class length | < 300 lines |
|
|
90
|
-
| Nesting depth | ≤ 3 levels |
|
|
91
|
-
| Cyclomatic complexity | < 10 per method |
|
|
92
|
-
|
|
93
|
-
---
|
|
94
|
-
|
|
95
|
-
## Async Conventions
|
|
96
|
-
|
|
97
|
-
```csharp
|
|
98
|
-
// ALWAYS: Async suffix + CancellationToken
|
|
99
|
-
public async Task<Order> GetOrderAsync(int id, CancellationToken ct = default)
|
|
100
|
-
|
|
101
|
-
// NEVER: .Result or .Wait() (deadlock risk in Blazor Server)
|
|
102
|
-
var order = await service.GetOrderAsync(id, ct); // Correct
|
|
103
|
-
var order = service.GetOrderAsync(id).Result; // DEADLOCK
|
|
104
|
-
|
|
105
|
-
// NEVER: async void (except event handlers)
|
|
106
|
-
public async Task HandleClickAsync() { } // Correct
|
|
107
|
-
public async void HandleClick() { } // exceptions lost
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
## Dependency Injection
|
|
113
|
-
|
|
114
|
-
| Lifetime | When | Example |
|
|
115
|
-
|----------|------|---------|
|
|
116
|
-
| **Scoped** | DbContext, per-request | `AddScoped<IOrderService, OrderService>()` |
|
|
117
|
-
| **Singleton** | Factories, caches | `AddSingleton<IRepositoryFactory>()` |
|
|
118
|
-
| **Transient** | Lightweight, stateless | `AddTransient<IValidator<Order>>()` |
|
|
119
|
-
|
|
120
|
-
```csharp
|
|
121
|
-
// Constructor injection with interfaces
|
|
122
|
-
public sealed class OrderService(IOrderRepository repository, ILogger<OrderService> logger)
|
|
123
|
-
|
|
124
|
-
// Service Locator anti-pattern
|
|
125
|
-
var service = serviceProvider.GetService<IOrderService>();
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
---
|
|
129
|
-
|
|
130
|
-
## Logging
|
|
131
|
-
|
|
132
|
-
```csharp
|
|
133
|
-
// Structured logging with message templates
|
|
134
|
-
logger.LogInformation("Processing order {OrderId} for {CustomerId}", orderId, customerId);
|
|
135
|
-
|
|
136
|
-
// String interpolation defeats structured logging
|
|
137
|
-
logger.LogInformation($"Processing order {orderId}"); // WRONG
|
|
138
|
-
|
|
139
|
-
// Include correlation IDs
|
|
140
|
-
logger.LogError(ex, "Failed to process order {OrderId}", orderId);
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
| Level | When |
|
|
144
|
-
|-------|------|
|
|
145
|
-
| `Trace` | Fine-grained diagnostic (dev only) |
|
|
146
|
-
| `Debug` | Internal state, troubleshooting |
|
|
147
|
-
| `Information` | Normal operations (start, complete, key decisions) |
|
|
148
|
-
| `Warning` | Unexpected but recoverable (retry, fallback) |
|
|
149
|
-
| `Error` | Failure requiring attention |
|
|
150
|
-
| `Critical` | System-level failure (app crash, data corruption) |
|
|
151
|
-
|
|
152
|
-
---
|
|
153
|
-
|
|
154
|
-
## Error Handling
|
|
155
|
-
|
|
156
|
-
```csharp
|
|
157
|
-
// Result pattern for business errors
|
|
158
|
-
public async Task<Result<Order>> ProcessAsync(Guid id, CancellationToken ct)
|
|
159
|
-
{
|
|
160
|
-
var order = await _repository.GetByIdAsync(id, ct);
|
|
161
|
-
if (order is null) return Result.Failure<Order>("Not found");
|
|
162
|
-
if (order.Status >= OrderStatus.Completed)
|
|
163
|
-
return Result.Failure<Order>("Already completed");
|
|
164
|
-
return Result.Success(order);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Exceptions for infrastructure errors only
|
|
168
|
-
// NEVER: empty catch or swallowed exceptions
|
|
169
|
-
try { await _client.SendAsync(request, ct); }
|
|
170
|
-
catch (Exception) { } // WRONG
|
|
171
|
-
|
|
172
|
-
// ALWAYS: preserve inner exception
|
|
173
|
-
catch (HttpRequestException ex)
|
|
174
|
-
{
|
|
175
|
-
throw new PaymentGatewayException("Payment failed", ex);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
// ALWAYS: specific exception types
|
|
179
|
-
catch (DbUpdateConcurrencyException ex) { /* handle */ }
|
|
180
|
-
catch (Exception ex) { /* log and rethrow */ throw; }
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
---
|
|
184
|
-
|
|
185
|
-
## .editorconfig Template
|
|
186
|
-
|
|
187
|
-
Minimal `.editorconfig` for enforcement:
|
|
188
|
-
|
|
189
|
-
```ini
|
|
190
|
-
[*.cs]
|
|
191
|
-
# Naming
|
|
192
|
-
dotnet_naming_rule.interfaces.severity = error
|
|
193
|
-
dotnet_naming_rule.interfaces.symbols = interface
|
|
194
|
-
dotnet_naming_rule.interfaces.style = begins_with_i
|
|
195
|
-
|
|
196
|
-
# File-scoped namespaces
|
|
197
|
-
csharp_style_namespace_declarations = file_scoped:warning
|
|
198
|
-
|
|
199
|
-
# var preferences
|
|
200
|
-
csharp_style_var_when_type_is_apparent = true:suggestion
|
|
201
|
-
|
|
202
|
-
# Null checks
|
|
203
|
-
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning
|
|
204
|
-
|
|
205
|
-
# Async suffix
|
|
206
|
-
dotnet_naming_rule.async_methods.severity = warning
|
|
207
|
-
dotnet_naming_rule.async_methods.required_suffix = Async
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
Full template: `.editorconfig` in project root.
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
*MORPH-SPEC by Polymorphism Tech*
|