@polymorphism-tech/morph-spec 3.1.0 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +882 -3
- package/README.md +79 -18
- package/bin/detect-agents.js +1 -1
- package/bin/morph-spec.js +163 -26
- package/bin/task-manager.cjs +101 -7
- package/bin/validate.js +1 -1
- package/docs/cli-auto-detection.md +219 -0
- package/docs/getting-started.md +0 -5
- package/docs/llm-interaction-config.md +735 -0
- package/docs/troubleshooting.md +269 -0
- package/docs/v3.0/AGENTS.md +521 -0
- package/docs/v3.0/ANALYSIS.md +555 -0
- package/docs/v3.0/ARCHITECTURE.md +436 -0
- package/docs/v3.0/EXECUTION-FLOW.md +1304 -0
- package/docs/v3.0/FEATURES.md +688 -0
- package/docs/v3.0/README.md +231 -0
- package/docs/v3.0/ROADMAP.md +801 -0
- package/docs/validation-checklist.md +0 -1
- package/package.json +5 -1
- package/src/commands/agents/index.js +4 -0
- package/src/commands/agents/spawn-team.js +172 -0
- package/src/commands/{create-story.js → feature/create-story.js} +357 -354
- package/src/commands/feature/index.js +6 -0
- package/src/commands/{shard-spec.js → feature/shard-spec.js} +2 -2
- package/src/commands/{sprint-status.js → feature/sprint-status.js} +1 -1
- package/src/commands/{generate-context.js → generation/generate-context.js} +40 -40
- package/src/commands/{generate.js → generation/generate.js} +130 -3
- package/src/commands/generation/index.js +5 -0
- package/src/commands/index.js +16 -0
- package/src/commands/learning/capture-pattern.js +121 -0
- package/src/commands/learning/index.js +5 -0
- package/src/commands/learning/search-patterns.js +126 -0
- package/src/commands/{detect-agents.js → project/detect-agents.js} +178 -178
- package/src/commands/project/detect-workflow.js +174 -0
- package/src/commands/{detect.js → project/detect.js} +104 -104
- package/src/commands/{doctor.js → project/doctor.js} +356 -356
- package/src/commands/project/index.js +10 -0
- package/src/commands/{init.js → project/init.js} +305 -258
- package/src/commands/{sync.js → project/sync.js} +167 -167
- package/src/commands/{update.js → project/update.js} +240 -204
- package/src/commands/{advance-phase.js → state/advance-phase.js} +416 -266
- package/src/commands/state/approve.js +221 -0
- package/src/commands/state/index.js +8 -0
- package/src/commands/{rollback-phase.js → state/rollback-phase.js} +185 -185
- package/src/commands/{state.js → state/state.js} +334 -334
- package/src/commands/{validate-phase.js → state/validate-phase.js} +221 -221
- package/src/commands/tasks/index.js +4 -0
- package/src/commands/{task.js → tasks/task.js} +78 -78
- package/src/commands/templates/index.js +8 -0
- package/src/commands/templates/template-customize.js +101 -0
- package/src/commands/templates/template-list.js +128 -0
- package/src/commands/templates/template-render.js +95 -0
- package/src/commands/templates/template-show.js +131 -0
- package/src/commands/templates/template-validate.js +91 -0
- package/src/commands/utils/index.js +7 -0
- package/src/commands/utils/migrate-state.js +158 -0
- package/src/commands/{session-summary.js → utils/session-summary.js} +291 -291
- package/src/commands/{troubleshoot.js → utils/troubleshoot.js} +222 -222
- package/src/commands/utils/upgrade.js +346 -0
- package/src/commands/{analyze-blazor-concurrency.js → validation/analyze-blazor-concurrency.js} +193 -193
- package/src/commands/validation/index.js +8 -0
- package/src/commands/{lint-fluent.js → validation/lint-fluent.js} +352 -352
- package/src/commands/{validate-blazor-state.js → validation/validate-blazor-state.js} +210 -210
- package/src/commands/{validate-blazor.js → validation/validate-blazor.js} +156 -156
- package/src/commands/{validate-css.js → validation/validate-css.js} +84 -84
- package/src/core/index.js +10 -0
- package/src/core/registry/command-registry.js +302 -0
- package/src/core/registry/index.js +8 -0
- package/src/core/registry/validator-registry.js +204 -0
- package/src/core/state/index.js +8 -0
- package/src/core/state/phase-state-machine.js +214 -0
- package/src/{lib → core/state}/state-manager.js +572 -414
- package/src/core/templates/index.js +9 -0
- package/src/core/templates/template-data-sources.js +325 -0
- package/src/core/templates/template-registry.js +335 -0
- package/src/core/templates/template-renderer.js +477 -0
- package/src/core/templates/template-validator.js +296 -0
- package/src/core/workflows/index.js +7 -0
- package/src/core/workflows/workflow-detector.js +354 -0
- package/src/generator/config-generator.js +206 -0
- package/src/generator/templates/config.json.template +40 -0
- package/src/generator/templates/project.md.template +67 -0
- package/src/lib/{complexity-analyzer.js → analysis/complexity-analyzer.js} +441 -441
- package/src/lib/analysis/index.js +7 -0
- package/src/lib/checkpoints/checkpoint-hooks.js +258 -0
- package/src/lib/checkpoints/index.js +7 -0
- package/src/lib/detectors/config-detector.js +223 -223
- package/src/lib/detectors/conversation-analyzer.js +163 -163
- package/src/lib/{design-system-detector.js → detectors/design-system-detector.js} +187 -187
- package/src/lib/detectors/index.js +87 -84
- package/src/lib/detectors/standards-generator.js +275 -275
- package/src/lib/detectors/structure-detector.js +245 -245
- package/src/lib/{context-generator.js → generators/context-generator.js} +526 -516
- package/src/lib/generators/index.js +10 -0
- package/src/lib/generators/metadata-extractor.js +387 -0
- package/src/lib/{recap-generator.js → generators/recap-generator.js} +205 -205
- package/src/lib/learning/index.js +7 -0
- package/src/lib/orchestration/index.js +7 -0
- package/src/lib/{team-orchestrator.js → orchestration/team-orchestrator.js} +323 -323
- package/src/lib/stacks/index.js +7 -0
- package/src/lib/{stack-resolver.js → stacks/stack-resolver.js} +180 -148
- package/src/lib/standards/index.js +7 -0
- package/src/lib/{standards-context-injector.js → standards/standards-context-injector.js} +298 -288
- package/src/lib/troubleshooting/index.js +8 -0
- package/src/lib/{troubleshoot-grep.js → troubleshooting/troubleshoot-grep.js} +204 -204
- package/src/lib/{troubleshoot-index.js → troubleshooting/troubleshoot-index.js} +144 -144
- package/src/lib/validators/architecture/architecture-validator.js +387 -0
- package/src/lib/validators/architecture/index.js +7 -0
- package/src/lib/validators/architecture-validator.js +40 -367
- package/src/lib/{blazor-concurrency-analyzer.js → validators/blazor/blazor-concurrency-analyzer.js} +277 -288
- package/src/lib/{blazor-state-validator.js → validators/blazor/blazor-state-validator.js} +279 -291
- package/src/lib/{blazor-validator.js → validators/blazor/blazor-validator.js} +369 -374
- package/src/lib/validators/blazor/index.js +9 -0
- package/src/lib/validators/content/content-validator.js +351 -0
- package/src/lib/validators/content/index.js +7 -0
- package/src/lib/validators/content-validator.js +164 -0
- package/src/lib/validators/{contract-compliance-validator.js → contracts/contract-compliance-validator.js} +273 -273
- package/src/lib/validators/contracts/index.js +7 -0
- package/src/lib/{css-validator.js → validators/css/css-validator.js} +352 -352
- package/src/lib/validators/css/index.js +7 -0
- package/src/lib/validators/{design-system-validator.js → design-system/design-system-validator.js} +231 -231
- package/src/lib/validators/design-system/index.js +7 -0
- package/src/lib/validators/package-validator.js +41 -340
- package/src/lib/validators/packages/index.js +7 -0
- package/src/lib/validators/packages/package-validator.js +360 -0
- package/src/lib/validators/shared/index.js +12 -0
- package/src/lib/validators/shared/issue-counter.js +18 -0
- package/src/lib/validators/shared/result-formatter.js +124 -0
- package/src/lib/{spec-validator.js → validators/spec-validator.js} +258 -258
- package/src/lib/validators/ui/index.js +7 -0
- package/src/lib/validators/ui/ui-contrast-validator.js +422 -0
- package/src/lib/validators/ui-contrast-validator.js +31 -409
- package/src/lib/{validation-runner.js → validators/validation-runner.js} +286 -284
- package/src/llm/analyzer.js +215 -0
- package/src/llm/environment-detector.js +43 -0
- package/src/llm/few-shot-examples.js +216 -0
- package/src/llm/project-config-schema.json +188 -0
- package/src/llm/prompt-builder.js +96 -0
- package/src/orchestrator.js +206 -0
- package/src/sanitizer/context-sanitizer.js +221 -0
- package/src/sanitizer/patterns.js +163 -0
- package/src/scanner/project-scanner.js +242 -0
- package/src/ui/diff-display.js +91 -0
- package/src/ui/interactive-wizard.js +96 -0
- package/src/ui/user-review.js +211 -0
- package/src/ui/wizard-questions.js +188 -0
- package/src/utils/color-utils.js +70 -0
- package/src/utils/file-copier.js +188 -189
- package/src/utils/process-handler.js +97 -0
- package/src/writer/file-writer.js +86 -0
- package/stacks/blazor-azure/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +3 -3
- package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/api-designer.md +59 -0
- package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/dotnet-senior.md +45 -255
- package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/ef-modeler.md +33 -88
- package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/ms-agent-expert.md +25 -89
- package/stacks/blazor-azure/.claude/skills/level-2-domains/integrations/hangfire-orchestrator.md +64 -0
- package/stacks/blazor-azure/.morph/config/agents.json +879 -764
- package/stacks/blazor-azure/.morph/hooks/{pre-commit-tests.sh → pre-commit/tests-csharp.sh} +3 -2
- package/stacks/blazor-azure/.morph/templates/.gitkeep +0 -0
- package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/cd-prod.yml.hbs +41 -0
- package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/cd-staging.yml.hbs +24 -0
- package/stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/ci-build.yml.hbs +23 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-apply.md +221 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-archive.md +79 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-deploy.md +529 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-infra.md +209 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-preflight.md +227 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-proposal.md +122 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-status.md +86 -0
- package/stacks/nextjs-supabase/.claude/commands/morph-troubleshoot.md +122 -0
- package/stacks/nextjs-supabase/.claude/settings.local.json +6 -0
- package/stacks/nextjs-supabase/.claude/skills/level-2-domains/integrations/supabase-expert.md +30 -150
- package/stacks/nextjs-supabase/.morph/config/agents.json +345 -345
- package/stacks/nextjs-supabase/.morph/hooks/pre-commit/tests-typescript.sh +61 -0
- package/stacks/nextjs-supabase/.morph/templates/.gitkeep +0 -0
- package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/cd-prod.yml.hbs +22 -0
- package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/cd-staging.yml.hbs +22 -0
- package/stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/ci-build.yml.hbs +35 -0
- package/stacks/nextjs-supabase/README.md +6 -15
- package/bin/render-template.js +0 -303
- package/bin/semantic-detect-agents.js +0 -247
- package/bin/validate-agents-skills.js +0 -257
- package/bin/validate-agents.js +0 -70
- package/bin/validate-phase.js +0 -263
- package/docs/examples.md +0 -328
- package/scripts/reorganize-skills.cjs +0 -175
- package/scripts/validate-agents-structure.cjs +0 -52
- package/scripts/validate-skills.cjs +0 -180
- package/src/commands/deploy.js +0 -780
- package/src/lib/continuous-validator.js +0 -421
- package/src/lib/decision-constraint-loader.js +0 -109
- package/src/lib/design-system-scaffolder.js +0 -299
- package/src/lib/hook-executor.js +0 -257
- package/src/lib/mockup-generator.js +0 -366
- package/src/lib/ui-detector.js +0 -350
- package/stacks/blazor-azure/.azure/README.md +0 -293
- package/stacks/blazor-azure/.azure/docs/azure-devops-setup.md +0 -454
- package/stacks/blazor-azure/.azure/docs/branch-strategy.md +0 -398
- package/stacks/blazor-azure/.azure/docs/local-development.md +0 -515
- package/stacks/blazor-azure/.azure/pipelines/pipeline-variables.yml +0 -34
- package/stacks/blazor-azure/.azure/pipelines/prod-pipeline.yml +0 -319
- package/stacks/blazor-azure/.azure/pipelines/staging-pipeline.yml +0 -234
- package/stacks/blazor-azure/.azure/pipelines/templates/build-dotnet.yml +0 -75
- package/stacks/blazor-azure/.azure/pipelines/templates/deploy-app-service.yml +0 -94
- package/stacks/blazor-azure/.azure/pipelines/templates/deploy-container-app.yml +0 -120
- package/stacks/blazor-azure/.azure/pipelines/templates/infra-deploy.yml +0 -90
- package/stacks/blazor-azure/.claude/settings.local.json +0 -15
- package/stacks/blazor-azure/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +0 -392
- package/stacks/blazor-azure/.morph/docs/workflows/design-impl.md +0 -37
- package/stacks/blazor-azure/.morph/docs/workflows/enforcement-pipeline.md +0 -668
- package/stacks/blazor-azure/.morph/docs/workflows/fast-track.md +0 -29
- package/stacks/blazor-azure/.morph/docs/workflows/full-morph.md +0 -76
- package/stacks/blazor-azure/.morph/docs/workflows/standard.md +0 -44
- package/stacks/blazor-azure/.morph/docs/workflows/ui-refresh.md +0 -39
- package/stacks/blazor-azure/.morph/examples/api-nextjs/README.md +0 -241
- package/stacks/blazor-azure/.morph/examples/api-nextjs/contracts.ts +0 -307
- package/stacks/blazor-azure/.morph/examples/api-nextjs/spec.md +0 -399
- package/stacks/blazor-azure/.morph/examples/api-nextjs/tasks.md +0 -168
- package/stacks/blazor-azure/.morph/examples/micro-saas/README.md +0 -125
- package/stacks/blazor-azure/.morph/examples/micro-saas/contracts.cs +0 -358
- package/stacks/blazor-azure/.morph/examples/micro-saas/decisions.md +0 -246
- package/stacks/blazor-azure/.morph/examples/micro-saas/spec.md +0 -236
- package/stacks/blazor-azure/.morph/examples/micro-saas/tasks.md +0 -150
- package/stacks/blazor-azure/.morph/examples/multi-agent/README.md +0 -309
- package/stacks/blazor-azure/.morph/examples/multi-agent/contracts.cs +0 -433
- package/stacks/blazor-azure/.morph/examples/multi-agent/spec.md +0 -479
- package/stacks/blazor-azure/.morph/examples/multi-agent/tasks.md +0 -185
- package/stacks/blazor-azure/.morph/examples/scheduled-reports/decisions.md +0 -158
- package/stacks/blazor-azure/.morph/examples/scheduled-reports/proposal.md +0 -95
- package/stacks/blazor-azure/.morph/examples/scheduled-reports/spec.md +0 -267
- package/stacks/blazor-azure/.morph/examples/state-v3.json +0 -188
- package/stacks/blazor-azure/.morph/hooks/README.md +0 -348
- package/stacks/blazor-azure/.morph/hooks/pre-commit-agents.sh +0 -24
- package/stacks/blazor-azure/.morph/hooks/pre-commit-all.sh +0 -48
- package/stacks/blazor-azure/.morph/hooks/pre-commit-specs.sh +0 -49
- package/stacks/blazor-azure/.morph/hooks/task-completed.js +0 -73
- package/stacks/blazor-azure/.morph/hooks/teammate-idle.js +0 -68
- package/stacks/blazor-azure/.morph/standards/agent-framework-blazor-ui.md +0 -359
- package/stacks/blazor-azure/.morph/standards/agent-framework-production.md +0 -410
- package/stacks/blazor-azure/.morph/standards/agent-framework-setup.md +0 -413
- package/stacks/blazor-azure/.morph/standards/agent-framework-workflows.md +0 -349
- package/stacks/blazor-azure/.morph/standards/agent-teams-workflow.md +0 -474
- package/stacks/blazor-azure/.morph/standards/architecture.md +0 -325
- package/stacks/blazor-azure/.morph/standards/azure.md +0 -605
- package/stacks/blazor-azure/.morph/standards/coding.md +0 -377
- package/stacks/blazor-azure/.morph/standards/dotnet10-migration.md +0 -520
- package/stacks/blazor-azure/.morph/standards/fluent-ui-setup.md +0 -590
- package/stacks/blazor-azure/.morph/standards/migration-guide.md +0 -514
- package/stacks/blazor-azure/.morph/standards/passkeys-auth.md +0 -423
- package/stacks/blazor-azure/.morph/standards/vector-search-rag.md +0 -536
- package/stacks/blazor-azure/.morph/templates/CONTEXT-FEATURE.md +0 -276
- package/stacks/blazor-azure/.morph/templates/CONTEXT.md +0 -170
- package/stacks/blazor-azure/.morph/templates/FluentDesignTheme.cs +0 -149
- package/stacks/blazor-azure/.morph/templates/MudTheme.cs +0 -281
- package/stacks/blazor-azure/.morph/templates/agent.cs +0 -163
- package/stacks/blazor-azure/.morph/templates/clarify-questions.md +0 -159
- package/stacks/blazor-azure/.morph/templates/component.razor +0 -239
- package/stacks/blazor-azure/.morph/templates/contracts/Commands.cs +0 -74
- package/stacks/blazor-azure/.morph/templates/contracts/Entities.cs +0 -25
- package/stacks/blazor-azure/.morph/templates/contracts/Queries.cs +0 -74
- package/stacks/blazor-azure/.morph/templates/contracts/README.md +0 -74
- package/stacks/blazor-azure/.morph/templates/contracts.cs +0 -217
- package/stacks/blazor-azure/.morph/templates/decisions.md +0 -123
- package/stacks/blazor-azure/.morph/templates/design-system.css +0 -226
- package/stacks/blazor-azure/.morph/templates/infra/.dockerignore.example +0 -89
- package/stacks/blazor-azure/.morph/templates/infra/Dockerfile.example +0 -82
- package/stacks/blazor-azure/.morph/templates/infra/README.md +0 -286
- package/stacks/blazor-azure/.morph/templates/infra/app-insights.bicep +0 -63
- package/stacks/blazor-azure/.morph/templates/infra/app-service.bicep +0 -164
- package/stacks/blazor-azure/.morph/templates/infra/azure-pipelines-deploy.yml +0 -480
- package/stacks/blazor-azure/.morph/templates/infra/container-app-env.bicep +0 -49
- package/stacks/blazor-azure/.morph/templates/infra/container-app.bicep +0 -156
- package/stacks/blazor-azure/.morph/templates/infra/deploy-checklist.md +0 -426
- package/stacks/blazor-azure/.morph/templates/infra/deploy.ps1 +0 -229
- package/stacks/blazor-azure/.morph/templates/infra/deploy.sh +0 -208
- package/stacks/blazor-azure/.morph/templates/infra/key-vault.bicep +0 -91
- package/stacks/blazor-azure/.morph/templates/infra/main.bicep +0 -189
- package/stacks/blazor-azure/.morph/templates/infra/parameters.dev.json +0 -29
- package/stacks/blazor-azure/.morph/templates/infra/parameters.prod.json +0 -29
- package/stacks/blazor-azure/.morph/templates/infra/parameters.staging.json +0 -29
- package/stacks/blazor-azure/.morph/templates/infra/sql-database.bicep +0 -103
- package/stacks/blazor-azure/.morph/templates/infra/storage.bicep +0 -106
- package/stacks/blazor-azure/.morph/templates/integrations/asaas-client.cs +0 -387
- package/stacks/blazor-azure/.morph/templates/integrations/asaas-webhook.cs +0 -351
- package/stacks/blazor-azure/.morph/templates/integrations/azure-identity-config.cs +0 -288
- package/stacks/blazor-azure/.morph/templates/integrations/clerk-config.cs +0 -258
- package/stacks/blazor-azure/.morph/templates/job.cs +0 -171
- package/stacks/blazor-azure/.morph/templates/migration.cs +0 -83
- package/stacks/blazor-azure/.morph/templates/proposal.md +0 -141
- package/stacks/blazor-azure/.morph/templates/recap.md +0 -94
- package/stacks/blazor-azure/.morph/templates/repository.cs +0 -141
- package/stacks/blazor-azure/.morph/templates/saas/subscription.cs +0 -347
- package/stacks/blazor-azure/.morph/templates/saas/tenant.cs +0 -338
- package/stacks/blazor-azure/.morph/templates/service.cs +0 -139
- package/stacks/blazor-azure/.morph/templates/simulation.md +0 -353
- package/stacks/blazor-azure/.morph/templates/spec.md +0 -149
- package/stacks/blazor-azure/.morph/templates/sprint-status.yaml +0 -68
- package/stacks/blazor-azure/.morph/templates/state.template.json +0 -222
- package/stacks/blazor-azure/.morph/templates/story.md +0 -143
- package/stacks/blazor-azure/.morph/templates/tasks.md +0 -257
- package/stacks/blazor-azure/.morph/templates/test.cs +0 -239
- package/stacks/blazor-azure/.morph/templates/ui-components.md +0 -362
- package/stacks/blazor-azure/.morph/templates/ui-design-system.md +0 -286
- package/stacks/blazor-azure/.morph/templates/ui-flows.md +0 -336
- package/stacks/blazor-azure/.morph/templates/ui-mockups.md +0 -133
- package/stacks/nextjs-supabase/.morph/docs/easypanel-setup.md +0 -169
- package/stacks/nextjs-supabase/.morph/docs/supabase-mcp-setup.md +0 -247
- package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/README.md +0 -697
- package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/spec.md +0 -85
- package/stacks/nextjs-supabase/.morph/examples/crud-nextjs-supabase/tasks.md +0 -86
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/README.md +0 -498
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/decisions.md +0 -121
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/spec.md +0 -138
- package/stacks/nextjs-supabase/.morph/examples/saas-nextjs-supabase/tasks.md +0 -162
- package/stacks/nextjs-supabase/.morph/standards/easypanel-deploy.md +0 -191
- package/stacks/nextjs-supabase/.morph/standards/nextjs-patterns.md +0 -193
- package/stacks/nextjs-supabase/.morph/standards/supabase-auth.md +0 -171
- package/stacks/nextjs-supabase/.morph/standards/supabase-pgvector.md +0 -164
- package/stacks/nextjs-supabase/.morph/standards/supabase-rls.md +0 -179
- package/stacks/nextjs-supabase/.morph/standards/supabase-storage.md +0 -148
- package/stacks/nextjs-supabase/.morph/templates/contracts.cs +0 -173
- package/stacks/nextjs-supabase/.morph/templates/contracts.ts +0 -168
- package/stacks/nextjs-supabase/.morph/templates/decisions.md +0 -115
- package/stacks/nextjs-supabase/.morph/templates/dockerfile-api.dockerfile +0 -38
- package/stacks/nextjs-supabase/.morph/templates/dockerfile-web.dockerfile +0 -48
- package/stacks/nextjs-supabase/.morph/templates/proposal.md +0 -145
- package/stacks/nextjs-supabase/.morph/templates/recap.md +0 -134
- package/stacks/nextjs-supabase/.morph/templates/rls-policy.sql +0 -57
- package/stacks/nextjs-supabase/.morph/templates/spec.md +0 -231
- package/stacks/nextjs-supabase/.morph/templates/supabase-migration.sql +0 -100
- package/stacks/nextjs-supabase/.morph/templates/tasks.md +0 -257
- /package/src/lib/{design-system-generator.js → generators/design-system-generator.js} +0 -0
- /package/src/lib/{learning-system.js → learning/learning-system.js} +0 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process Handler - Testable Exit Strategy
|
|
3
|
+
*
|
|
4
|
+
* Replaces direct process.exit() calls with a mockable handler.
|
|
5
|
+
* Makes the codebase testable by allowing exit behavior to be intercepted.
|
|
6
|
+
*
|
|
7
|
+
* @module process-handler
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Process Handler Class
|
|
14
|
+
*
|
|
15
|
+
* Provides testable process exit functionality.
|
|
16
|
+
*/
|
|
17
|
+
export class ProcessHandler {
|
|
18
|
+
/**
|
|
19
|
+
* @param {Function} exitFn - Exit function (defaults to process.exit)
|
|
20
|
+
*/
|
|
21
|
+
constructor(exitFn = process.exit.bind(process)) {
|
|
22
|
+
this.exitFn = exitFn;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Exit the process with optional message
|
|
27
|
+
*
|
|
28
|
+
* @param {number} code - Exit code (0 = success, non-zero = error)
|
|
29
|
+
* @param {string} [message] - Optional message to display
|
|
30
|
+
*/
|
|
31
|
+
exit(code = 0, message = null) {
|
|
32
|
+
if (message) {
|
|
33
|
+
if (code === 0) {
|
|
34
|
+
console.log(message);
|
|
35
|
+
} else {
|
|
36
|
+
console.error(message);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
this.exitFn(code);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Exit with error message (code 1)
|
|
44
|
+
*
|
|
45
|
+
* @param {string} message - Error message
|
|
46
|
+
* @param {number} [code=1] - Error code
|
|
47
|
+
*/
|
|
48
|
+
exitWithError(message, code = 1) {
|
|
49
|
+
this.exit(code, chalk.red(message));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Exit with success message (code 0)
|
|
54
|
+
*
|
|
55
|
+
* @param {string} message - Success message
|
|
56
|
+
*/
|
|
57
|
+
exitWithSuccess(message) {
|
|
58
|
+
this.exit(0, chalk.green(message));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Exit with warning message (code 0, but highlighted)
|
|
63
|
+
*
|
|
64
|
+
* @param {string} message - Warning message
|
|
65
|
+
*/
|
|
66
|
+
exitWithWarning(message) {
|
|
67
|
+
this.exit(0, chalk.yellow(message));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Default instance for general use
|
|
72
|
+
export const processHandler = new ProcessHandler();
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Create a test handler for unit tests
|
|
76
|
+
*
|
|
77
|
+
* @returns {{handler: ProcessHandler, getExitCode: Function, getExited: Function}}
|
|
78
|
+
*/
|
|
79
|
+
export function createTestHandler() {
|
|
80
|
+
let exitCode = null;
|
|
81
|
+
let exited = false;
|
|
82
|
+
|
|
83
|
+
const handler = new ProcessHandler((code) => {
|
|
84
|
+
exitCode = code;
|
|
85
|
+
exited = true;
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
handler,
|
|
90
|
+
getExitCode: () => exitCode,
|
|
91
|
+
getExited: () => exited,
|
|
92
|
+
reset: () => {
|
|
93
|
+
exitCode = null;
|
|
94
|
+
exited = false;
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview FileWriter - Saves generated configs to filesystem
|
|
3
|
+
* @module morph-spec/writer/file-writer
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { writeFile, mkdir, access } from 'fs/promises';
|
|
7
|
+
import { join, dirname } from 'path';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @typedef {import('../types/index.js').GeneratedConfigs} GeneratedConfigs
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* FileWriter - Saves configuration files to .morph/ directory
|
|
16
|
+
* @class
|
|
17
|
+
*/
|
|
18
|
+
export class FileWriter {
|
|
19
|
+
/**
|
|
20
|
+
* Save generated configs to filesystem
|
|
21
|
+
* @param {string} cwd - Current working directory
|
|
22
|
+
* @param {GeneratedConfigs} configs - Configs to save
|
|
23
|
+
* @returns {Promise<void>}
|
|
24
|
+
*/
|
|
25
|
+
async save(cwd, configs) {
|
|
26
|
+
const morphDir = join(cwd, '.morph');
|
|
27
|
+
const configDir = join(morphDir, 'config');
|
|
28
|
+
|
|
29
|
+
// Ensure directories exist
|
|
30
|
+
await this.ensureDirectoryExists(morphDir);
|
|
31
|
+
await this.ensureDirectoryExists(configDir);
|
|
32
|
+
|
|
33
|
+
// Write files
|
|
34
|
+
const projectMdPath = join(morphDir, 'project.md');
|
|
35
|
+
const configJsonPath = join(configDir, 'config.json');
|
|
36
|
+
|
|
37
|
+
await Promise.all([
|
|
38
|
+
this.writeProjectMd(projectMdPath, configs.projectMd),
|
|
39
|
+
this.writeConfigJson(configJsonPath, configs.configJson)
|
|
40
|
+
]);
|
|
41
|
+
|
|
42
|
+
// Display success message
|
|
43
|
+
console.log(chalk.bold.green('\n✅ Configuration files saved:\n'));
|
|
44
|
+
console.log(chalk.cyan(` 📄 ${projectMdPath}`));
|
|
45
|
+
console.log(chalk.cyan(` ⚙️ ${configJsonPath}`));
|
|
46
|
+
console.log();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Write project.md file
|
|
51
|
+
* @param {string} filepath - File path
|
|
52
|
+
* @param {string} content - File content
|
|
53
|
+
* @returns {Promise<void>}
|
|
54
|
+
*/
|
|
55
|
+
async writeProjectMd(filepath, content) {
|
|
56
|
+
await writeFile(filepath, content, 'utf-8');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Write config.json file (with pretty formatting)
|
|
61
|
+
* @param {string} filepath - File path
|
|
62
|
+
* @param {string} content - File content (JSON string)
|
|
63
|
+
* @returns {Promise<void>}
|
|
64
|
+
*/
|
|
65
|
+
async writeConfigJson(filepath, content) {
|
|
66
|
+
// Parse and re-stringify with pretty formatting
|
|
67
|
+
const parsed = JSON.parse(content);
|
|
68
|
+
const formatted = JSON.stringify(parsed, null, 2);
|
|
69
|
+
|
|
70
|
+
await writeFile(filepath, formatted, 'utf-8');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Ensure directory exists (create if not)
|
|
75
|
+
* @param {string} dirPath - Directory path
|
|
76
|
+
* @returns {Promise<void>}
|
|
77
|
+
*/
|
|
78
|
+
async ensureDirectoryExists(dirPath) {
|
|
79
|
+
try {
|
|
80
|
+
await access(dirPath);
|
|
81
|
+
} catch (error) {
|
|
82
|
+
// Directory doesn't exist, create it
|
|
83
|
+
await mkdir(dirPath, { recursive: true });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -4,9 +4,9 @@ Expert in agentic system architecture, multi-agent orchestration, and RAG pipeli
|
|
|
4
4
|
|
|
5
5
|
> **Layer:** 2 | **Load:** on-keyword | **Keywords:** orchestration, multi-agent, rag, vector search, embedding, agentic, memory, reasoning
|
|
6
6
|
|
|
7
|
-
> **Ref:** `
|
|
8
|
-
> **Ref:** `
|
|
9
|
-
> **Ref:** `vector-search-rag.md` — Vector Search + RAG with EF Core 10
|
|
7
|
+
> **Ref:** `framework/standards/ai-agents/workflows.md` — Workflow patterns with AgentWorkflowBuilder
|
|
8
|
+
> **Ref:** `framework/standards/ai-agents/production.md` — Middleware, A2A, MCP, caching
|
|
9
|
+
> **Ref:** `framework/standards/backend/database/vector-search-rag.md` — Vector Search + RAG with EF Core 10
|
|
10
10
|
|
|
11
11
|
## Responsibilities
|
|
12
12
|
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# API Designer
|
|
2
|
+
|
|
3
|
+
**Tier:** 3 (Specialist)
|
|
4
|
+
**Always Active:** No
|
|
5
|
+
**Keywords:** api, endpoint, controller, rest, http, route, dto, request, response
|
|
6
|
+
**Reports to:** dotnet-senior
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Role
|
|
11
|
+
|
|
12
|
+
REST API design specialist for .NET Minimal API and controllers, focusing on clean endpoint design and DTO contracts.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Standards Applied
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
framework/standards/core/coding.md
|
|
20
|
+
framework/standards/backend/dotnet/core.md
|
|
21
|
+
framework/standards/backend/dotnet/async.md
|
|
22
|
+
framework/standards/backend/api/rest.md
|
|
23
|
+
framework/standards/backend/api/validation.md
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Responsibilities
|
|
29
|
+
|
|
30
|
+
- Design REST API endpoints following conventions
|
|
31
|
+
- Create request/response DTOs
|
|
32
|
+
- Implement API controllers or Minimal API endpoints
|
|
33
|
+
- Apply proper HTTP status codes (200, 201, 400, 404, etc.)
|
|
34
|
+
- Implement input validation with FluentValidation
|
|
35
|
+
- Design API versioning strategy
|
|
36
|
+
- Create error response formats
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## When to Use
|
|
41
|
+
|
|
42
|
+
- Creating new API endpoints
|
|
43
|
+
- Designing DTO contracts
|
|
44
|
+
- API refactoring
|
|
45
|
+
- Implementing validation logic
|
|
46
|
+
- Designing error responses
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Collaborates With
|
|
51
|
+
|
|
52
|
+
- **dotnet-senior** - Service layer consumed by endpoints
|
|
53
|
+
- **ef-modeler** - Entity → DTO mapping
|
|
54
|
+
- **blazor-builder** - Frontend consuming API
|
|
55
|
+
- **testing-specialist** - API integration tests
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,286 +1,76 @@
|
|
|
1
1
|
# .NET Senior Engineer
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
> **Ref:** `framework/standards/coding.md` — ALL code output MUST follow these conventions.
|
|
8
|
-
> **Ref:** `framework/standards/architecture.md` — ALL code MUST respect layer boundaries.
|
|
9
|
-
> **Ref:** `.claude/skills/checklists/code-review.md` — Self-check before delivering code.
|
|
3
|
+
**Tier:** 2 (Domain Leader)
|
|
4
|
+
**Always Active:** Yes
|
|
5
|
+
**Reports to:** standards-architect
|
|
6
|
+
**Coordinates:** ef-modeler, api-designer, event-architect, hangfire-orchestrator, ms-agent-expert, ddd-expert, nosql-cache-expert
|
|
10
7
|
|
|
11
8
|
---
|
|
12
9
|
|
|
13
|
-
##
|
|
14
|
-
|
|
15
|
-
### Standard Mode (default)
|
|
16
|
-
|
|
17
|
-
Active for all C# code writing. Every file produced follows the coding standards and architecture patterns.
|
|
18
|
-
|
|
19
|
-
**Trigger:** Any implementation task (always active as Core Agent).
|
|
20
|
-
|
|
21
|
-
### Ultrathink Mode
|
|
22
|
-
|
|
23
|
-
Extended deep-reasoning mode for complex decisions. Think step by step through trade-offs before recommending.
|
|
10
|
+
## Role
|
|
24
11
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
**Use for:**
|
|
28
|
-
- Technology/library selection (MudBlazor vs Fluent UI, Hangfire vs Azure Functions)
|
|
29
|
-
- Architecture pattern decisions (CQRS vs simple, Repository vs direct DbContext)
|
|
30
|
-
- Performance optimization strategy
|
|
31
|
-
- Migration planning (.NET version upgrades, library migrations)
|
|
32
|
-
- Multi-system integration design
|
|
33
|
-
- Database schema design for complex domains
|
|
12
|
+
Senior .NET engineer and Backend Squad Leader. Writes production-quality C# code and coordinates backend domain specialists for all .NET implementation tasks.
|
|
34
13
|
|
|
35
14
|
---
|
|
36
15
|
|
|
37
|
-
##
|
|
38
|
-
|
|
39
|
-
**MANDATORY for ALL C# code output.** No exceptions.
|
|
40
|
-
|
|
41
|
-
### Naming (ref: coding.md)
|
|
42
|
-
|
|
43
|
-
| Element | Convention | Example |
|
|
44
|
-
|---------|-----------|---------|
|
|
45
|
-
| Classes | PascalCase + `sealed` | `public sealed class OrderService` |
|
|
46
|
-
| Interfaces | `I` + PascalCase | `public interface IOrderService` |
|
|
47
|
-
| Methods | PascalCase + `Async` | `public async Task<Result<Order>> GetByIdAsync(...)` |
|
|
48
|
-
| Constants | PascalCase | `private const int MaxRetryCount = 3;` |
|
|
49
|
-
| Private fields | `_camelCase` | `private readonly ILogger<OrderService> _logger;` |
|
|
50
|
-
| Parameters | camelCase | `(int orderId, CancellationToken ct = default)` |
|
|
16
|
+
## Standards Applied
|
|
51
17
|
|
|
52
|
-
### Structure
|
|
53
|
-
|
|
54
|
-
```csharp
|
|
55
|
-
// 1. File-scoped namespace
|
|
56
|
-
namespace MyApp.Application.Services;
|
|
57
|
-
|
|
58
|
-
// 2. Primary constructor for DI (preferred) or traditional constructor
|
|
59
|
-
public sealed class OrderService(
|
|
60
|
-
IOrderRepository repository,
|
|
61
|
-
IPaymentGateway paymentGateway,
|
|
62
|
-
ILogger<OrderService> logger) : IOrderService
|
|
63
|
-
{
|
|
64
|
-
// 3. Constants first (PascalCase)
|
|
65
|
-
private const int MaxRetryCount = 3;
|
|
66
|
-
private const string DefaultCurrency = "BRL";
|
|
67
|
-
|
|
68
|
-
// 4. Public methods (business operations)
|
|
69
|
-
public async Task<Result<OrderResponse>> CreateAsync(
|
|
70
|
-
CreateOrderRequest request,
|
|
71
|
-
CancellationToken ct = default)
|
|
72
|
-
{
|
|
73
|
-
// 5. Entry logging with correlation
|
|
74
|
-
logger.LogInformation("Creating order for customer {CustomerId}", request.CustomerId);
|
|
75
|
-
|
|
76
|
-
// 6. Validation (early return with Result)
|
|
77
|
-
if (request.Items.Count == 0)
|
|
78
|
-
return Result.Failure<OrderResponse>("Order must have at least one item");
|
|
79
|
-
|
|
80
|
-
// 7. Domain logic
|
|
81
|
-
var order = Order.Create(request.CustomerId, request.Items);
|
|
82
|
-
|
|
83
|
-
// 8. Persistence
|
|
84
|
-
await repository.AddAsync(order, ct);
|
|
85
|
-
await repository.SaveChangesAsync(ct);
|
|
86
|
-
|
|
87
|
-
// 9. Exit logging
|
|
88
|
-
logger.LogInformation("Order {OrderId} created successfully", order.Id);
|
|
89
|
-
|
|
90
|
-
// 10. Return mapped response
|
|
91
|
-
return Result.Success(order.ToResponse());
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
18
|
```
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
| **sealed** | All classes sealed unless designed for inheritance | `public sealed class OrderService` |
|
|
104
|
-
| **Nullable types** | Always enabled, `?` only when truly optional | `string? middleName` (optional) vs `string name` (required) |
|
|
105
|
-
| **Primary constructors** | For DI injection (C# 12+) | `class OrderService(IRepo repo)` |
|
|
106
|
-
| **Expression body** | Single-line members | `public int Count => _items.Count;` |
|
|
107
|
-
| **Pattern matching** | `is null` / `is not null` | `if (order is null) return ...` |
|
|
108
|
-
| **Collection expressions** | Prefer `[..]` syntax | `List<int> ids = [1, 2, 3];` |
|
|
109
|
-
|
|
110
|
-
### Entity Pattern
|
|
111
|
-
|
|
112
|
-
```csharp
|
|
113
|
-
namespace MyApp.Domain.Entities;
|
|
114
|
-
|
|
115
|
-
public sealed class Order
|
|
116
|
-
{
|
|
117
|
-
// Private constructor — force factory method
|
|
118
|
-
private Order() { }
|
|
119
|
-
|
|
120
|
-
public Guid Id { get; private set; }
|
|
121
|
-
public int CustomerId { get; private set; }
|
|
122
|
-
public OrderStatus Status { get; private set; }
|
|
123
|
-
public decimal Total { get; private set; }
|
|
124
|
-
public DateTime CreatedAt { get; private set; }
|
|
125
|
-
|
|
126
|
-
// Factory method with validation
|
|
127
|
-
public static Order Create(int customerId, List<OrderItem> items)
|
|
128
|
-
{
|
|
129
|
-
if (items.Count == 0)
|
|
130
|
-
throw new DomainException("Order must have at least one item");
|
|
131
|
-
|
|
132
|
-
return new Order
|
|
133
|
-
{
|
|
134
|
-
Id = Guid.NewGuid(),
|
|
135
|
-
CustomerId = customerId,
|
|
136
|
-
Status = OrderStatus.Created,
|
|
137
|
-
Total = items.Sum(i => i.Price * i.Quantity),
|
|
138
|
-
CreatedAt = DateTime.UtcNow
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Behavior methods (not anemic)
|
|
143
|
-
public void MarkAsPaid()
|
|
144
|
-
{
|
|
145
|
-
if (Status >= OrderStatus.Completed || Status == OrderStatus.Failed)
|
|
146
|
-
throw new DomainException($"Cannot mark order {Id} as paid in status {Status}");
|
|
147
|
-
Status = OrderStatus.PendingPayment;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
### DTO Pattern
|
|
153
|
-
|
|
154
|
-
```csharp
|
|
155
|
-
namespace MyApp.Application.DTOs;
|
|
156
|
-
|
|
157
|
-
// Request: record with required properties
|
|
158
|
-
public sealed record CreateOrderRequest(
|
|
159
|
-
int CustomerId,
|
|
160
|
-
List<OrderItemRequest> Items);
|
|
161
|
-
|
|
162
|
-
// Response: record with computed properties
|
|
163
|
-
public sealed record OrderResponse(
|
|
164
|
-
Guid Id,
|
|
165
|
-
int CustomerId,
|
|
166
|
-
string StatusDisplay,
|
|
167
|
-
decimal Total,
|
|
168
|
-
DateTime CreatedAt);
|
|
169
|
-
|
|
170
|
-
// Enum: PascalCase members, error states at 100+
|
|
171
|
-
public enum OrderStatus
|
|
172
|
-
{
|
|
173
|
-
Created = 0,
|
|
174
|
-
PendingPayment = 1,
|
|
175
|
-
Processing = 2,
|
|
176
|
-
Shipped = 3,
|
|
177
|
-
Completed = 4,
|
|
178
|
-
// Error states (high values for comparison operators)
|
|
179
|
-
Failed = 100,
|
|
180
|
-
Cancelled = 101,
|
|
181
|
-
Refunded = 102
|
|
182
|
-
}
|
|
19
|
+
framework/standards/core/coding.md
|
|
20
|
+
framework/standards/core/architecture.md
|
|
21
|
+
framework/standards/core/testing.md
|
|
22
|
+
framework/standards/backend/dotnet/core.md
|
|
23
|
+
framework/standards/backend/dotnet/async.md
|
|
24
|
+
framework/standards/backend/dotnet/di.md
|
|
25
|
+
framework/standards/backend/database/ef-core.md
|
|
26
|
+
framework/standards/backend/api/rest.md
|
|
183
27
|
```
|
|
184
28
|
|
|
185
29
|
---
|
|
186
30
|
|
|
187
|
-
##
|
|
31
|
+
## Responsibilities
|
|
188
32
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
5. ERROR HANDLING → Result pattern for business? No empty catch?
|
|
197
|
-
6. SEALED → All classes sealed?
|
|
198
|
-
7. NULLABLE → <Nullable>enable</Nullable>? ? only where optional?
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
Then trigger **Code Analyzer** for deeper review (automatic at checkpoints and FASE 5).
|
|
33
|
+
- Lead backend implementation (services, controllers, business logic)
|
|
34
|
+
- Coordinate backend squad (ef-modeler, api-designer, etc.)
|
|
35
|
+
- Ensure code follows all .NET standards
|
|
36
|
+
- Design service layer architecture
|
|
37
|
+
- Implement async patterns with CancellationToken
|
|
38
|
+
- Apply dependency injection correctly
|
|
39
|
+
- Write unit and integration tests
|
|
202
40
|
|
|
203
41
|
---
|
|
204
42
|
|
|
205
|
-
##
|
|
206
|
-
|
|
207
|
-
When in Ultrathink Mode, produce structured analysis:
|
|
43
|
+
## When to Use
|
|
208
44
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
### Constraints
|
|
216
|
-
- {Constraint 1: budget, timeline, team skill, existing tech}
|
|
217
|
-
- {Constraint 2}
|
|
218
|
-
|
|
219
|
-
### Options Analysis
|
|
220
|
-
|
|
221
|
-
| Criterion | Option A: {Name} | Option B: {Name} | Option C: {Name} |
|
|
222
|
-
|-----------|------------------|------------------|------------------|
|
|
223
|
-
| **Performance** | {assessment} | {assessment} | {assessment} |
|
|
224
|
-
| **Complexity** | {Low/Medium/High} | {Low/Medium/High} | {Low/Medium/High} |
|
|
225
|
-
| **Maintainability** | {assessment} | {assessment} | {assessment} |
|
|
226
|
-
| **Cost** | {assessment} | {assessment} | {assessment} |
|
|
227
|
-
| **Risk** | {assessment} | {assessment} | {assessment} |
|
|
228
|
-
| **Team familiarity** | {assessment} | {assessment} | {assessment} |
|
|
229
|
-
|
|
230
|
-
### Option A: {Name}
|
|
231
|
-
**Pros:** {list}
|
|
232
|
-
**Cons:** {list}
|
|
233
|
-
**Best when:** {scenario}
|
|
234
|
-
|
|
235
|
-
### Option B: {Name}
|
|
236
|
-
**Pros:** {list}
|
|
237
|
-
**Cons:** {list}
|
|
238
|
-
**Best when:** {scenario}
|
|
239
|
-
|
|
240
|
-
### Recommendation
|
|
241
|
-
**{Option X}** because {justification tied to constraints and criteria}.
|
|
242
|
-
|
|
243
|
-
### Implementation Impact
|
|
244
|
-
- **Files affected:** {count and key files}
|
|
245
|
-
- **Migrations:** {yes/no, what changes}
|
|
246
|
-
- **Breaking changes:** {yes/no, what breaks}
|
|
247
|
-
- **Estimated effort:** {T-shirt size with rationale}
|
|
248
|
-
- **Rollback plan:** {how to revert if needed}
|
|
249
|
-
```
|
|
45
|
+
- Any .NET/C# code implementation
|
|
46
|
+
- Backend service layer development
|
|
47
|
+
- API controller implementation
|
|
48
|
+
- Business logic implementation
|
|
49
|
+
- Complex architectural decisions (Ultrathink mode)
|
|
250
50
|
|
|
251
51
|
---
|
|
252
52
|
|
|
253
|
-
##
|
|
53
|
+
## Ultrathink Mode
|
|
54
|
+
|
|
55
|
+
**Trigger:** Keywords like "ultrathink", "deep-think", "analyze deeply", "complex decision"
|
|
254
56
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
| Records | Immutable DTOs | `record OrderResponse(Guid Id, ...)` |
|
|
262
|
-
| Pattern matching | Type checks, null checks | `if (x is Order { Status: > 0 } order)` |
|
|
263
|
-
| `required` modifier | Non-nullable init props | `public required string Name { get; init; }` |
|
|
264
|
-
| `sealed` classes | Default for all classes | `public sealed class OrderService` |
|
|
265
|
-
| Extension methods | Add behavior to existing types | `public static class OrderExtensions` |
|
|
266
|
-
| Global usings | Reduce repetitive imports | `global using MyApp.Domain.Entities;` |
|
|
57
|
+
**Use for:**
|
|
58
|
+
- Technology/library selection
|
|
59
|
+
- Architecture pattern decisions (CQRS vs simple)
|
|
60
|
+
- Performance optimization strategy
|
|
61
|
+
- Migration planning
|
|
62
|
+
- Multi-system integration design
|
|
267
63
|
|
|
268
64
|
---
|
|
269
65
|
|
|
270
|
-
##
|
|
66
|
+
## Collaborates With
|
|
271
67
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
| Public fields | Encapsulation broken | Properties with `{ get; private set; }` |
|
|
279
|
-
| `string.Format` in logs | Defeats structured logging | Message templates |
|
|
280
|
-
| `== null` | Not idiomatic C# | `is null` |
|
|
281
|
-
| Unsealed classes | Unintended inheritance | `sealed` keyword |
|
|
282
|
-
| Service Locator | Hidden dependencies | Constructor injection |
|
|
283
|
-
| God class (500+ lines) | Unmaintainable | Split by responsibility |
|
|
68
|
+
- **ef-modeler** - Database/EF Core layer
|
|
69
|
+
- **api-designer** - REST API contracts and endpoints
|
|
70
|
+
- **azure-architect** - Infrastructure provisioning
|
|
71
|
+
- **blazor-builder** - Backend API consumed by frontend
|
|
72
|
+
- **hangfire-orchestrator** - Background job coordination
|
|
73
|
+
- **testing-specialist** - Test coverage and quality
|
|
284
74
|
|
|
285
75
|
---
|
|
286
76
|
|