@polymorphism-tech/morph-spec 2.2.0 → 2.4.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 +314 -1673
- package/LICENSE +72 -72
- package/README.md +515 -516
- package/bin/detect-agents.js +225 -225
- package/bin/morph-spec.js +358 -173
- package/bin/render-template.js +302 -302
- package/bin/semantic-detect-agents.js +246 -246
- package/bin/task-manager.js +429 -0
- package/bin/validate-agents-skills.js +251 -251
- package/bin/validate-agents.js +69 -69
- package/bin/validate-phase.js +263 -263
- package/bin/validate.js +369 -0
- package/content/.azure/README.md +293 -293
- package/content/.azure/docs/azure-devops-setup.md +454 -454
- package/content/.azure/docs/branch-strategy.md +398 -398
- package/content/.azure/docs/local-development.md +515 -515
- package/content/.azure/pipelines/pipeline-variables.yml +34 -34
- package/content/.azure/pipelines/prod-pipeline.yml +319 -319
- package/content/.azure/pipelines/staging-pipeline.yml +234 -234
- package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
- package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
- package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
- package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
- package/content/.claude/commands/morph-apply.md +221 -158
- package/content/.claude/commands/morph-archive.md +79 -79
- package/content/.claude/commands/morph-infra.md +209 -209
- package/content/.claude/commands/morph-preflight.md +227 -0
- package/content/.claude/commands/morph-proposal.md +122 -101
- package/content/.claude/commands/morph-status.md +86 -86
- package/content/.claude/commands/morph-troubleshoot.md +122 -0
- package/content/.claude/settings.local.json +15 -15
- package/content/.claude/skills/checklists/code-review.md +226 -0
- package/content/.claude/skills/checklists/morph-checklist.md +117 -0
- package/content/.claude/skills/checklists/simulation-checklist.md +77 -0
- package/content/.claude/skills/infra/bicep-architect.md +126 -419
- package/content/.claude/skills/infra/container-specialist.md +131 -437
- package/content/.claude/skills/infra/devops-engineer.md +119 -405
- package/content/.claude/skills/integrations/asaas-financial.md +130 -333
- package/content/.claude/skills/integrations/azure-identity.md +142 -309
- package/content/.claude/skills/integrations/clerk-auth.md +108 -290
- package/content/.claude/skills/integrations/resend-email.md +119 -0
- package/content/.claude/skills/specialists/ai-system-architect.md +192 -604
- package/content/.claude/skills/specialists/azure-architect.md +142 -142
- package/content/.claude/skills/specialists/code-analyzer.md +235 -0
- package/content/.claude/skills/specialists/dotnet-senior.md +287 -0
- package/content/.claude/skills/specialists/ef-modeler.md +113 -200
- package/content/.claude/skills/specialists/hangfire-orchestrator.md +126 -245
- package/content/.claude/skills/specialists/ms-agent-expert.md +109 -263
- package/content/.claude/skills/specialists/po-pm-advisor.md +197 -197
- package/content/.claude/skills/specialists/standards-architect.md +156 -78
- package/content/.claude/skills/specialists/testing-specialist.md +126 -0
- package/content/.claude/skills/specialists/ui-ux-designer.md +191 -1060
- package/content/.claude/skills/stacks/dotnet-blazor.md +210 -588
- package/content/.claude/skills/stacks/dotnet-nextjs.md +154 -402
- package/content/.claude/skills/workflows/morph-replicate.md +213 -0
- package/content/.claude/{commands/morph-clarify.md → skills/workflows/phase-clarify.md} +5 -58
- package/content/.claude/{commands/morph-design.md → skills/workflows/phase-design.md} +16 -86
- package/content/.claude/{commands/morph-setup.md → skills/workflows/phase-setup.md} +9 -17
- package/content/.claude/skills/workflows/phase-tasks.md +164 -0
- package/content/.claude/{commands/morph-uiux.md → skills/workflows/phase-uiux.md} +15 -88
- package/content/.morph/.morphversion +5 -5
- package/content/.morph/archive/.gitkeep +25 -25
- package/content/.morph/config/agents.json +378 -242
- package/content/.morph/config/config.template.json +89 -108
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
- package/content/.morph/docs/workflows/design-impl.md +37 -0
- package/content/.morph/docs/workflows/fast-track.md +29 -0
- package/content/.morph/docs/workflows/full-morph.md +76 -0
- package/content/.morph/docs/workflows/standard.md +44 -0
- package/content/.morph/docs/workflows/ui-refresh.md +39 -0
- package/content/.morph/examples/api-nextjs/README.md +241 -241
- package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
- package/content/.morph/examples/api-nextjs/spec.md +399 -399
- package/content/.morph/examples/api-nextjs/tasks.md +168 -168
- package/content/.morph/examples/micro-saas/README.md +125 -125
- package/content/.morph/examples/micro-saas/contracts.cs +358 -358
- package/content/.morph/examples/micro-saas/decisions.md +246 -246
- package/content/.morph/examples/micro-saas/spec.md +236 -236
- package/content/.morph/examples/micro-saas/tasks.md +150 -150
- package/content/.morph/examples/multi-agent/README.md +309 -309
- package/content/.morph/examples/multi-agent/contracts.cs +433 -433
- package/content/.morph/examples/multi-agent/spec.md +479 -479
- package/content/.morph/examples/multi-agent/tasks.md +185 -185
- package/content/.morph/examples/scheduled-reports/decisions.md +158 -0
- package/content/.morph/examples/scheduled-reports/proposal.md +95 -0
- package/content/.morph/examples/scheduled-reports/spec.md +267 -0
- package/content/.morph/examples/state-v3.json +188 -0
- package/content/.morph/features/.gitkeep +25 -25
- package/content/.morph/hooks/README.md +190 -239
- package/content/.morph/hooks/pre-commit-agents.sh +24 -24
- package/content/.morph/hooks/pre-commit-all.sh +48 -48
- package/content/.morph/hooks/pre-commit-specs.sh +49 -49
- package/content/.morph/hooks/pre-commit-tests.sh +60 -60
- package/content/.morph/project.md +160 -160
- package/content/.morph/schemas/agent.schema.json +296 -296
- package/content/.morph/schemas/tasks.schema.json +220 -0
- package/content/.morph/specs/.gitkeep +20 -20
- package/content/.morph/standards/agent-framework-blazor-ui.md +359 -0
- package/content/.morph/standards/agent-framework-production.md +410 -0
- package/content/.morph/standards/agent-framework-setup.md +413 -453
- package/content/.morph/standards/agent-framework-workflows.md +349 -0
- package/content/.morph/standards/architecture.md +325 -325
- package/content/.morph/standards/azure.md +605 -379
- package/content/.morph/standards/coding.md +377 -377
- package/content/.morph/standards/dotnet10-migration.md +520 -494
- package/content/.morph/standards/fluent-ui-setup.md +590 -590
- package/content/.morph/standards/migration-guide.md +514 -514
- package/content/.morph/standards/passkeys-auth.md +423 -423
- package/content/.morph/standards/vector-search-rag.md +536 -536
- package/content/.morph/state.json +17 -17
- package/content/.morph/templates/FluentDesignTheme.cs +149 -149
- package/content/.morph/templates/MudTheme.cs +281 -281
- package/content/.morph/templates/agent.cs +163 -172
- package/content/.morph/templates/clarify-questions.md +159 -0
- package/content/.morph/templates/component.razor +239 -239
- package/content/.morph/templates/contracts/Commands.cs +74 -0
- package/content/.morph/templates/contracts/Entities.cs +25 -0
- package/content/.morph/templates/contracts/Queries.cs +74 -0
- package/content/.morph/templates/contracts/README.md +74 -0
- package/content/.morph/templates/contracts.cs +217 -217
- package/content/.morph/templates/decisions.md +123 -106
- package/content/.morph/templates/design-system.css +226 -226
- package/content/.morph/templates/infra/.dockerignore.example +89 -89
- package/content/.morph/templates/infra/Dockerfile.example +82 -82
- package/content/.morph/templates/infra/README.md +286 -286
- package/content/.morph/templates/infra/app-insights.bicep +63 -63
- package/content/.morph/templates/infra/app-service.bicep +164 -164
- package/content/.morph/templates/infra/container-app-env.bicep +49 -49
- package/content/.morph/templates/infra/container-app.bicep +156 -156
- package/content/.morph/templates/infra/deploy-checklist.md +426 -0
- package/content/.morph/templates/infra/deploy.ps1 +229 -229
- package/content/.morph/templates/infra/deploy.sh +208 -208
- package/content/.morph/templates/infra/key-vault.bicep +91 -91
- package/content/.morph/templates/infra/main.bicep +189 -189
- package/content/.morph/templates/infra/parameters.dev.json +29 -29
- package/content/.morph/templates/infra/parameters.prod.json +29 -29
- package/content/.morph/templates/infra/parameters.staging.json +29 -29
- package/content/.morph/templates/infra/sql-database.bicep +103 -103
- package/content/.morph/templates/infra/storage.bicep +106 -106
- package/content/.morph/templates/integrations/asaas-client.cs +387 -387
- package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
- package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
- package/content/.morph/templates/integrations/clerk-config.cs +258 -258
- package/content/.morph/templates/job.cs +171 -171
- package/content/.morph/templates/migration.cs +83 -83
- package/content/.morph/templates/proposal.md +141 -155
- package/content/.morph/templates/recap.md +94 -105
- package/content/.morph/templates/repository.cs +141 -141
- package/content/.morph/templates/saas/subscription.cs +347 -347
- package/content/.morph/templates/saas/tenant.cs +338 -338
- package/content/.morph/templates/service.cs +139 -139
- package/content/.morph/templates/simulation.md +353 -0
- package/content/.morph/templates/spec.md +149 -148
- package/content/.morph/templates/sprint-status.yaml +68 -68
- package/content/.morph/templates/state.template.json +222 -222
- package/content/.morph/templates/story.md +143 -143
- package/content/.morph/templates/tasks.md +257 -235
- package/content/.morph/templates/test.cs +239 -239
- package/content/.morph/templates/ui-components.md +362 -276
- package/content/.morph/templates/ui-design-system.md +286 -286
- package/content/.morph/templates/ui-flows.md +336 -336
- package/content/.morph/templates/ui-mockups.md +133 -133
- package/content/.morph/test-infra/example.bicep +59 -59
- package/content/CLAUDE.md +150 -442
- package/content/README.md +79 -79
- package/detectors/config-detector.js +223 -223
- package/detectors/conversation-analyzer.js +163 -163
- package/detectors/index.js +84 -84
- package/detectors/standards-generator.js +275 -275
- package/detectors/structure-detector.js +245 -250
- package/docs/README.md +144 -149
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
- package/docs/api/scripts/collapse.js +38 -38
- package/docs/api/scripts/commonNav.js +28 -28
- package/docs/api/scripts/linenumber.js +25 -25
- package/docs/api/scripts/nav.js +12 -12
- package/docs/api/scripts/polyfill.js +3 -3
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
- package/docs/api/scripts/prettify/lang-css.js +2 -2
- package/docs/api/scripts/prettify/prettify.js +28 -28
- package/docs/api/scripts/search.js +98 -98
- package/docs/api/styles/jsdoc.css +776 -776
- package/docs/api/styles/prettify.css +80 -80
- package/docs/examples.md +328 -328
- package/docs/getting-started.md +301 -302
- package/docs/installation.md +361 -361
- package/docs/templates.md +418 -418
- package/docs/validation-checklist.md +265 -266
- package/package.json +80 -80
- package/scripts/postinstall.js +132 -132
- package/src/commands/advance-phase.js +183 -0
- package/src/commands/analyze-blazor-concurrency.js +193 -0
- package/src/commands/create-story.js +351 -351
- package/src/commands/detect-agents.js +139 -0
- package/src/commands/detect.js +104 -104
- package/src/commands/doctor.js +356 -280
- package/src/commands/generate.js +149 -149
- package/src/commands/init.js +258 -245
- package/src/commands/lint-fluent.js +352 -0
- package/src/commands/rollback-phase.js +185 -0
- package/src/commands/session-summary.js +291 -0
- package/src/commands/shard-spec.js +224 -224
- package/src/commands/sprint-status.js +250 -250
- package/src/commands/state.js +333 -333
- package/src/commands/sync.js +167 -167
- package/src/commands/task.js +78 -0
- package/src/commands/troubleshoot.js +222 -0
- package/src/commands/update.js +192 -159
- package/src/commands/validate-blazor-state.js +210 -0
- package/src/commands/validate-blazor.js +156 -0
- package/src/commands/validate-css.js +84 -0
- package/src/commands/validate-phase.js +221 -0
- package/src/lib/blazor-concurrency-analyzer.js +288 -0
- package/src/lib/blazor-state-validator.js +291 -0
- package/src/lib/blazor-validator.js +374 -0
- package/src/lib/complexity-analyzer.js +441 -292
- package/src/lib/continuous-validator.js +421 -0
- package/src/lib/css-validator.js +352 -0
- package/src/lib/decision-constraint-loader.js +109 -0
- package/src/lib/design-system-generator.js +298 -298
- package/src/lib/learning-system.js +520 -0
- package/src/lib/mockup-generator.js +366 -0
- package/src/lib/recap-generator.js +205 -0
- package/src/lib/state-manager.js +397 -340
- package/src/lib/troubleshoot-grep.js +194 -0
- package/src/lib/troubleshoot-index.js +144 -0
- package/src/lib/ui-detector.js +350 -0
- package/src/lib/validation-runner.js +231 -0
- package/src/lib/validators/architecture-validator.js +387 -0
- package/src/lib/validators/contract-compliance-validator.js +273 -0
- package/src/lib/validators/package-validator.js +360 -0
- package/src/lib/validators/ui-contrast-validator.js +422 -0
- package/src/utils/file-copier.js +179 -139
- package/src/utils/logger.js +32 -32
- package/src/utils/version-checker.js +175 -175
- package/content/.claude/commands/morph-costs.md +0 -206
- package/content/.claude/commands/morph-tasks.md +0 -319
- package/content/.claude/skills/specialists/cost-guardian.md +0 -110
- package/content/.claude/skills/stacks/shopify.md +0 -445
- package/content/.morph/config/azure-pricing.json +0 -70
- package/content/.morph/config/azure-pricing.schema.json +0 -50
- package/content/.morph/hooks/pre-commit-costs.sh +0 -91
- package/docs/api/cost-calculator.js.html +0 -513
- package/docs/api/design-system-generator.js.html +0 -382
- package/docs/api/global.html +0 -5263
- package/docs/api/index.html +0 -96
- package/docs/api/state-manager.js.html +0 -423
- package/src/commands/cost.js +0 -181
- package/src/commands/update-pricing.js +0 -206
- package/src/lib/cost-calculator.js +0 -429
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# Code Review Checklist
|
|
2
|
+
|
|
3
|
+
> Comprehensive checklist for .NET code review: naming, architecture, clean code, duplication, and runtime patterns.
|
|
4
|
+
> **Ref:** `framework/standards/coding.md` for naming conventions and style.
|
|
5
|
+
> **Ref:** `framework/standards/architecture.md` for layer rules and SOLID.
|
|
6
|
+
> **Ref:** `framework/standards/blazor-efcore.md` for DbContext patterns and background ops.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Naming & Style (ref: coding.md)
|
|
11
|
+
|
|
12
|
+
- [ ] `[CRITICAL]` Constants use PascalCase (`MaxRetryCount`, NOT `MAX_RETRY_COUNT`)
|
|
13
|
+
- [ ] `[CRITICAL]` No Hungarian notation (`strName`, `iCount`, `btnSubmit`)
|
|
14
|
+
- [ ] `[HIGH]` Private fields use `_camelCase` prefix
|
|
15
|
+
- [ ] `[HIGH]` Async methods have `Async` suffix
|
|
16
|
+
- [ ] `[HIGH]` Interfaces prefixed with `I`
|
|
17
|
+
- [ ] `[MEDIUM]` No abbreviations in public APIs (`repository` not `repo`)
|
|
18
|
+
- [ ] `[MEDIUM]` All classes `sealed` unless designed for inheritance
|
|
19
|
+
- [ ] `[MEDIUM]` File-scoped namespaces used
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Architecture Review (ref: architecture.md)
|
|
24
|
+
|
|
25
|
+
### Layer Integrity
|
|
26
|
+
- [ ] `[CRITICAL]` Domain has zero references to Infrastructure or Web
|
|
27
|
+
- [ ] `[CRITICAL]` No circular dependencies between projects
|
|
28
|
+
- [ ] `[HIGH]` Application does NOT reference Web project
|
|
29
|
+
- [ ] `[HIGH]` Infrastructure details don't leak into Application DTOs
|
|
30
|
+
|
|
31
|
+
### Responsibility & Organization
|
|
32
|
+
- [ ] `[HIGH]` No class > 300 lines (SRP violation)
|
|
33
|
+
- [ ] `[HIGH]` Controllers/pages are thin (< 50 lines logic)
|
|
34
|
+
- [ ] `[MEDIUM]` One class per file, file name = class name
|
|
35
|
+
- [ ] `[MEDIUM]` Files in correct project/folder per architecture.md
|
|
36
|
+
- [ ] `[LOW]` No "God classes" (10+ constructor dependencies)
|
|
37
|
+
|
|
38
|
+
### Dependencies
|
|
39
|
+
- [ ] `[HIGH]` External services accessed through interfaces
|
|
40
|
+
- [ ] `[HIGH]` No hardcoded connection strings, URLs, or secrets
|
|
41
|
+
- [ ] `[MEDIUM]` Configuration via Options pattern (`IOptions<T>`)
|
|
42
|
+
- [ ] `[LOW]` No over-abstraction (interface with 1 impl never mocked)
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Clean Code Review
|
|
47
|
+
|
|
48
|
+
### Method Quality
|
|
49
|
+
- [ ] `[HIGH]` No methods > 30 lines (extract sub-methods)
|
|
50
|
+
- [ ] `[HIGH]` No methods with > 4 parameters (use request object)
|
|
51
|
+
- [ ] `[MEDIUM]` No nested conditionals > 3 levels (use early return)
|
|
52
|
+
- [ ] `[MEDIUM]` No complex conditionals (> 3 conditions — extract to named method)
|
|
53
|
+
|
|
54
|
+
### Magic Values
|
|
55
|
+
- [ ] `[HIGH]` No magic strings in comparisons (use enum or constant)
|
|
56
|
+
- [ ] `[HIGH]` No magic numbers (extract to PascalCase constant)
|
|
57
|
+
- [ ] `[MEDIUM]` No hardcoded URLs, file paths, or config values
|
|
58
|
+
|
|
59
|
+
### Dead Code
|
|
60
|
+
- [ ] `[MEDIUM]` No unused private methods
|
|
61
|
+
- [ ] `[MEDIUM]` No unused parameters
|
|
62
|
+
- [ ] `[LOW]` No commented-out code blocks (> 3 lines)
|
|
63
|
+
- [ ] `[LOW]` No empty or near-empty files
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Duplication Review
|
|
68
|
+
|
|
69
|
+
- [ ] `[HIGH]` No exact/near-exact duplicate methods across classes
|
|
70
|
+
- [ ] `[HIGH]` No duplicate model definitions (same properties in different classes)
|
|
71
|
+
- [ ] `[MEDIUM]` No thin wrappers that only delegate without adding value
|
|
72
|
+
- [ ] `[MEDIUM]` No mirrored interface methods (extract base interface)
|
|
73
|
+
- [ ] `[MEDIUM]` No duplicate enums across projects (centralize in Domain)
|
|
74
|
+
- [ ] `[LOW]` No passthrough service methods (controller -> service with zero logic)
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Async & Cancellation
|
|
79
|
+
|
|
80
|
+
- [ ] `[CRITICAL]` CancellationToken propagated through entire call chain
|
|
81
|
+
- [ ] `[CRITICAL]` No `.Result` or `.Wait()` (deadlock risk in Blazor Server)
|
|
82
|
+
- [ ] `[HIGH]` No `async void` (except event handlers)
|
|
83
|
+
- [ ] `[HIGH]` Timeout configured for external operations
|
|
84
|
+
- [ ] `[MEDIUM]` `ConfigureAwait(false)` only in library code
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Logging
|
|
89
|
+
|
|
90
|
+
- [ ] `[HIGH]` Logs at critical points (entry, exit, errors)
|
|
91
|
+
- [ ] `[HIGH]` No `$""` string interpolation in log methods (use message templates)
|
|
92
|
+
- [ ] `[HIGH]` No sensitive data logged (passwords, tokens, PII)
|
|
93
|
+
- [ ] `[MEDIUM]` Logs include correlation IDs (OrderId, UserId)
|
|
94
|
+
- [ ] `[MEDIUM]` Appropriate log level (Information, Warning, Error)
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Error Handling
|
|
99
|
+
|
|
100
|
+
- [ ] `[CRITICAL]` No empty catch blocks
|
|
101
|
+
- [ ] `[HIGH]` Specific exceptions (not generic `catch (Exception)` without re-throw)
|
|
102
|
+
- [ ] `[HIGH]` Inner exception preserved on re-throw
|
|
103
|
+
- [ ] `[HIGH]` Result pattern for expected business errors, exceptions for infrastructure
|
|
104
|
+
- [ ] `[MEDIUM]` Consistent error handling pattern across all services
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## DI
|
|
109
|
+
|
|
110
|
+
- [ ] `[HIGH]` Constructor injection with interfaces (not concrete types)
|
|
111
|
+
- [ ] `[HIGH]` Correct lifetime (Scoped for DbContext, Singleton for factories)
|
|
112
|
+
- [ ] `[MEDIUM]` No service locator pattern (`IServiceProvider.GetService<T>()` in business code)
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Services
|
|
117
|
+
|
|
118
|
+
### State Validation
|
|
119
|
+
- [ ] `[HIGH]` Validates INVALID states (not valid ones) for future extensibility
|
|
120
|
+
- [ ] `[HIGH]` Error states handled explicitly
|
|
121
|
+
|
|
122
|
+
```csharp
|
|
123
|
+
// Correct: validate INVALID states
|
|
124
|
+
if (order.Status >= OrderStatus.Completed || order.Status == OrderStatus.Failed)
|
|
125
|
+
throw new InvalidOperationException("Cannot process completed or failed order");
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Transactions
|
|
129
|
+
- [ ] `[HIGH]` Multiple operations wrapped in transaction
|
|
130
|
+
- [ ] `[HIGH]` Rollback on error
|
|
131
|
+
|
|
132
|
+
```csharp
|
|
133
|
+
await using var transaction = await _context.Database.BeginTransactionAsync(ct);
|
|
134
|
+
try
|
|
135
|
+
{
|
|
136
|
+
await _repository.AddAsync(order, ct);
|
|
137
|
+
await _paymentService.ChargeAsync(order.Id, ct);
|
|
138
|
+
await transaction.CommitAsync(ct);
|
|
139
|
+
}
|
|
140
|
+
catch { await transaction.RollbackAsync(ct); throw; }
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Background Operations
|
|
146
|
+
|
|
147
|
+
### DbContext Safety
|
|
148
|
+
- [ ] `[CRITICAL]` Uses `IDbContextFactory` (not scoped DbContext)
|
|
149
|
+
- [ ] `[CRITICAL]` Repository created via Factory with `await using`
|
|
150
|
+
- [ ] `[HIGH]` No `Task.Delay` as race condition workaround
|
|
151
|
+
|
|
152
|
+
```csharp
|
|
153
|
+
// Correct pattern
|
|
154
|
+
_ = Task.Run(async () =>
|
|
155
|
+
{
|
|
156
|
+
try
|
|
157
|
+
{
|
|
158
|
+
await using var repo = _repoFactory.CreateScoped();
|
|
159
|
+
var order = await repo.GetByIdAsync(orderId);
|
|
160
|
+
// ...
|
|
161
|
+
}
|
|
162
|
+
catch (Exception ex) { _logger.LogError(ex, "Failed {OrderId}", orderId); }
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Hangfire Jobs
|
|
167
|
+
- [ ] `[HIGH]` `[AutomaticRetry]` configured
|
|
168
|
+
- [ ] `[HIGH]` Job is idempotent (safe to run multiple times)
|
|
169
|
+
- [ ] `[MEDIUM]` CancellationToken used
|
|
170
|
+
- [ ] `[MEDIUM]` No HTTP request state dependency
|
|
171
|
+
|
|
172
|
+
### Resilience
|
|
173
|
+
- [ ] `[MEDIUM]` Retry policy for transient operations
|
|
174
|
+
- [ ] `[MEDIUM]` State persisted before long operation
|
|
175
|
+
- [ ] `[MEDIUM]` Idempotency guaranteed for retries
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## DTOs / Contracts
|
|
180
|
+
|
|
181
|
+
### Naming
|
|
182
|
+
- [ ] `[HIGH]` Descriptive property names (not "Data", "Value", "Info")
|
|
183
|
+
- [ ] `[HIGH]` Correct suffix: `Request` (input), `Response` (output), `Dto` (generic), `Command`/`Query` (CQRS)
|
|
184
|
+
|
|
185
|
+
### Types
|
|
186
|
+
- [ ] `[MEDIUM]` `Stream` for large files, `byte[]` for small in-memory data
|
|
187
|
+
- [ ] `[MEDIUM]` `DateTimeOffset` for timestamps, `DateTime` for local dates
|
|
188
|
+
- [ ] `[MEDIUM]` Nullable `?` only where truly optional
|
|
189
|
+
|
|
190
|
+
### Structure
|
|
191
|
+
- [ ] `[MEDIUM]` Records for immutable DTOs, classes with `init` for mutable entities
|
|
192
|
+
- [ ] `[MEDIUM]` Response DTOs have all properties needed by UI
|
|
193
|
+
- [ ] `[MEDIUM]` Enums have explicit values with logical ordering (errors at 100+)
|
|
194
|
+
|
|
195
|
+
```csharp
|
|
196
|
+
public enum OrderStatus
|
|
197
|
+
{
|
|
198
|
+
Created = 0, PendingPayment = 1, Processing = 2, Completed = 3, // Normal flow
|
|
199
|
+
Failed = 100, Cancelled = 101, Refunded = 102 // Error states
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Service Interfaces
|
|
204
|
+
- [ ] `[HIGH]` Async methods with `Async` suffix
|
|
205
|
+
- [ ] `[HIGH]` CancellationToken as last parameter
|
|
206
|
+
- [ ] `[MEDIUM]` `Task<Result<T>>` for expected business errors
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Quick Pre-Merge Checklist
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
[ ] Naming follows coding.md (PascalCase constants, _camelCase fields, sealed classes)
|
|
214
|
+
[ ] CancellationToken propagated on all async methods
|
|
215
|
+
[ ] Structured logging at critical points (message templates, not $"")
|
|
216
|
+
[ ] No empty catch blocks, Result pattern for business errors
|
|
217
|
+
[ ] Background ops use IDbContextFactory + await using
|
|
218
|
+
[ ] No duplicate code, no magic values, no methods > 30 lines
|
|
219
|
+
[ ] Architecture layers respected (Domain has zero external refs)
|
|
220
|
+
[ ] DTOs have descriptive names + correct types
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
*Consolidated from: code-review-services.md + code-review-background.md + code-review-contracts.md + architecture/clean-code/duplication analysis.*
|
|
226
|
+
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Skill: /morph-checklist
|
|
2
|
+
|
|
3
|
+
> **Layer:** 2 | **Load:** on-keyword | **Keywords:** checklist, deploy, security, seo, performance, accessibility, lgpd, legal
|
|
4
|
+
|
|
5
|
+
Types: `deploy`, `security`, `seo`, `performance`, `accessibility`, `legal-brazil`, `simulation` (see [simulation-checklist.md](simulation-checklist.md))
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Deploy
|
|
10
|
+
|
|
11
|
+
### Pre-Deploy
|
|
12
|
+
- [ ] `dotnet build --configuration Release` passes
|
|
13
|
+
- [ ] `dotnet test` passes
|
|
14
|
+
- [ ] Migrations applied (`dotnet ef database update`)
|
|
15
|
+
- [ ] Env vars configured (connection strings, API keys, feature flags)
|
|
16
|
+
|
|
17
|
+
### Infrastructure
|
|
18
|
+
- [ ] Bicep/IaC updated (`az deployment group what-if`)
|
|
19
|
+
- [ ] SSL/HTTPS configured
|
|
20
|
+
- [ ] DNS pointing correctly
|
|
21
|
+
- [ ] Health checks configured
|
|
22
|
+
|
|
23
|
+
### Security & Monitoring
|
|
24
|
+
- [ ] Secrets in Key Vault (not in code)
|
|
25
|
+
- [ ] Managed Identity configured
|
|
26
|
+
- [ ] CORS configured
|
|
27
|
+
- [ ] Rate limiting enabled
|
|
28
|
+
- [ ] Application Insights + alerts configured
|
|
29
|
+
|
|
30
|
+
### Post-Deploy
|
|
31
|
+
- [ ] Smoke tests executed
|
|
32
|
+
- [ ] Rollback plan documented
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Security
|
|
37
|
+
|
|
38
|
+
### Auth & Authorization
|
|
39
|
+
- [ ] Passwords hashed (bcrypt/Argon2), MFA available
|
|
40
|
+
- [ ] JWT with short expiration + refresh tokens
|
|
41
|
+
- [ ] RBAC + resource-based authorization
|
|
42
|
+
- [ ] Ownership verification (user sees only their data)
|
|
43
|
+
|
|
44
|
+
### Input & Headers
|
|
45
|
+
- [ ] Server-side validation (never trust client)
|
|
46
|
+
- [ ] HTML sanitized (XSS), parametrized queries (SQLi)
|
|
47
|
+
- [ ] File upload validation (type, size, content)
|
|
48
|
+
- [ ] Security headers: `X-Content-Type-Options: nosniff`, `X-Frame-Options: DENY`, `CSP: default-src 'self'`
|
|
49
|
+
|
|
50
|
+
### Data
|
|
51
|
+
- [ ] PII encrypted at rest, masked in logs
|
|
52
|
+
- [ ] Card data never stored (use tokenization)
|
|
53
|
+
- [ ] `dotnet list package --vulnerable` clean
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## SEO
|
|
58
|
+
|
|
59
|
+
- [ ] `<title>` + `<meta description>` (150-160 chars)
|
|
60
|
+
- [ ] `<link rel="canonical">` + `robots.txt` + `sitemap.xml`
|
|
61
|
+
- [ ] Open Graph tags (og:title, og:description, og:image)
|
|
62
|
+
- [ ] URLs friendly, heading hierarchy (H1>H2>H3)
|
|
63
|
+
- [ ] Images optimized (WebP, lazy loading, alt text)
|
|
64
|
+
- [ ] Core Web Vitals: LCP < 2.5s, FID < 100ms, CLS < 0.1
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Performance
|
|
69
|
+
|
|
70
|
+
### Backend
|
|
71
|
+
- [ ] `.AsNoTracking()` for reads, no N+1, projections (`.Select()`)
|
|
72
|
+
- [ ] Indexes on search columns
|
|
73
|
+
- [ ] Response/distributed caching with invalidation
|
|
74
|
+
- [ ] All I/O operations are async (no `.Result` / `.Wait()`)
|
|
75
|
+
|
|
76
|
+
### Frontend (Blazor)
|
|
77
|
+
- [ ] Lazy loading, virtualization for large lists
|
|
78
|
+
- [ ] Debounce search inputs
|
|
79
|
+
- [ ] `@key` in loops, `ShouldRender()` for perf
|
|
80
|
+
|
|
81
|
+
### Infrastructure
|
|
82
|
+
- [ ] CDN for static assets, gzip/brotli compression
|
|
83
|
+
- [ ] Connection pooling, scale-to-zero
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Accessibility (WCAG 2.1)
|
|
88
|
+
|
|
89
|
+
- [ ] Alt text on images, captions on videos
|
|
90
|
+
- [ ] Contrast >= 4.5:1 (AA), color not sole indicator
|
|
91
|
+
- [ ] Keyboard navigation works, focus visible
|
|
92
|
+
- [ ] Skip links, `<html lang="pt-BR">`
|
|
93
|
+
- [ ] Labels on all inputs, clear error messages
|
|
94
|
+
- [ ] Valid HTML, ARIA used correctly
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Legal Brazil (LGPD)
|
|
99
|
+
|
|
100
|
+
### Documentation
|
|
101
|
+
- [ ] Privacy policy (data collected, purpose, legal basis, DPO contact)
|
|
102
|
+
- [ ] Terms of use (service description, responsibilities, forum)
|
|
103
|
+
|
|
104
|
+
### Consent & Rights
|
|
105
|
+
- [ ] Cookie banner with granular options
|
|
106
|
+
- [ ] Explicit consent for marketing, revocation option
|
|
107
|
+
- [ ] Data access, correction, deletion, portability
|
|
108
|
+
|
|
109
|
+
### Technical
|
|
110
|
+
- [ ] Data minimization, defined retention periods
|
|
111
|
+
- [ ] Anonymization/pseudonymization where possible
|
|
112
|
+
- [ ] Access logs for personal data
|
|
113
|
+
- [ ] Incident response plan (ANPD notification in 72h)
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
*MORPH-SPEC Checklist Skill*
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Skill: /morph-checklist simulation
|
|
2
|
+
|
|
3
|
+
> **Layer:** 2 | **Load:** on-keyword | **Keywords:** simulation, mock, fake, external service, sandbox
|
|
4
|
+
|
|
5
|
+
Checklist for simulating external services (AI, payment, email APIs).
|
|
6
|
+
|
|
7
|
+
## Pre-Implementation
|
|
8
|
+
|
|
9
|
+
### 1. Map All Dependencies
|
|
10
|
+
|
|
11
|
+
- [ ] List ALL interfaces in the flow (`grep -r "I{ServiceName}" src/ --include="*.cs" -l`)
|
|
12
|
+
- [ ] Identify **transitive dependencies** (e.g., `ArtGenerationService` → `IReplicateClient` + `IImageDownloader`)
|
|
13
|
+
- [ ] Document dependency trace: services to mock, transitive deps, required lifetimes
|
|
14
|
+
|
|
15
|
+
### 2. Verify Lifetimes
|
|
16
|
+
|
|
17
|
+
| State | Lifetime | Example |
|
|
18
|
+
|-------|----------|---------|
|
|
19
|
+
| Stateful (Dictionary, List) | **Singleton** | `FakeReplicateClient` with prediction store |
|
|
20
|
+
| Stateless | **Scoped** | `FakeEmailClient` that only logs |
|
|
21
|
+
|
|
22
|
+
```csharp
|
|
23
|
+
// ❌ Stateful + Scoped = loses state between requests
|
|
24
|
+
services.AddScoped<IReplicateClient, FakeReplicateClient>();
|
|
25
|
+
// ✅ Stateful + Singleton
|
|
26
|
+
services.AddSingleton<IReplicateClient, FakeReplicateClient>();
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 3. Read Complete Interfaces
|
|
30
|
+
|
|
31
|
+
- [ ] Check full signatures — don't miss optional parameters (`attachments`, `CancellationToken`)
|
|
32
|
+
- [ ] For AI mocks: verify current prompts, model in use, response format
|
|
33
|
+
- [ ] For email mocks: check for attachments/inline images, log simulated sends
|
|
34
|
+
- [ ] For payment mocks: implement state transitions (PENDING → CONFIRMED → REFUNDED), simulate webhooks
|
|
35
|
+
|
|
36
|
+
## Configuration Template
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
// appsettings.Development.json
|
|
40
|
+
{ "Simulation": { "Enabled": true, "ImageDelayMs": 500, "PlaceholderImageUrl": "https://picsum.photos/1024/1024" } }
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
```csharp
|
|
44
|
+
if (configuration.GetValue<bool>("Simulation:Enabled"))
|
|
45
|
+
services.AddSimulationClients(configuration); // Stateful→Singleton, Stateless→Scoped
|
|
46
|
+
else
|
|
47
|
+
services.AddProductionClients(configuration);
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Post-Implementation
|
|
51
|
+
|
|
52
|
+
- [ ] Validate DI: `dotnet build && dotnet run` + health check
|
|
53
|
+
- [ ] Test full flow end-to-end (not just unit tests)
|
|
54
|
+
- [ ] Verify simulation logs — confirm mocks are being called
|
|
55
|
+
|
|
56
|
+
## Common Errors
|
|
57
|
+
|
|
58
|
+
| Error | Cause | Fix |
|
|
59
|
+
|-------|-------|-----|
|
|
60
|
+
| Mock loses state between requests | Scoped lifetime for stateful service | Change to Singleton |
|
|
61
|
+
| `Unable to resolve service` at runtime | Transitive dependency not registered | Map ALL dependencies |
|
|
62
|
+
| Incorrect method signature | Didn't read full interface | Check optional params |
|
|
63
|
+
| Mock returns wrong data | Prompts/model changed | Read current prompts |
|
|
64
|
+
| Works in test, fails at runtime | Test doesn't cover full DI | Test with `dotnet run` |
|
|
65
|
+
|
|
66
|
+
## Checklist
|
|
67
|
+
|
|
68
|
+
- [ ] All interfaces mapped (including transitive)
|
|
69
|
+
- [ ] Lifetimes correct (stateful=Singleton, stateless=Scoped)
|
|
70
|
+
- [ ] Complete interface signatures implemented
|
|
71
|
+
- [ ] Simulation toggle via config
|
|
72
|
+
- [ ] End-to-end flow tested in simulation mode
|
|
73
|
+
- [ ] No real API calls in simulation mode
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
*MORPH-SPEC Simulation Checklist*
|