@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.
Files changed (251) hide show
  1. package/CLAUDE.md +314 -1673
  2. package/LICENSE +72 -72
  3. package/README.md +515 -516
  4. package/bin/detect-agents.js +225 -225
  5. package/bin/morph-spec.js +358 -173
  6. package/bin/render-template.js +302 -302
  7. package/bin/semantic-detect-agents.js +246 -246
  8. package/bin/task-manager.js +429 -0
  9. package/bin/validate-agents-skills.js +251 -251
  10. package/bin/validate-agents.js +69 -69
  11. package/bin/validate-phase.js +263 -263
  12. package/bin/validate.js +369 -0
  13. package/content/.azure/README.md +293 -293
  14. package/content/.azure/docs/azure-devops-setup.md +454 -454
  15. package/content/.azure/docs/branch-strategy.md +398 -398
  16. package/content/.azure/docs/local-development.md +515 -515
  17. package/content/.azure/pipelines/pipeline-variables.yml +34 -34
  18. package/content/.azure/pipelines/prod-pipeline.yml +319 -319
  19. package/content/.azure/pipelines/staging-pipeline.yml +234 -234
  20. package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
  21. package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
  22. package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
  23. package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
  24. package/content/.claude/commands/morph-apply.md +221 -158
  25. package/content/.claude/commands/morph-archive.md +79 -79
  26. package/content/.claude/commands/morph-infra.md +209 -209
  27. package/content/.claude/commands/morph-preflight.md +227 -0
  28. package/content/.claude/commands/morph-proposal.md +122 -101
  29. package/content/.claude/commands/morph-status.md +86 -86
  30. package/content/.claude/commands/morph-troubleshoot.md +122 -0
  31. package/content/.claude/settings.local.json +15 -15
  32. package/content/.claude/skills/checklists/code-review.md +226 -0
  33. package/content/.claude/skills/checklists/morph-checklist.md +117 -0
  34. package/content/.claude/skills/checklists/simulation-checklist.md +77 -0
  35. package/content/.claude/skills/infra/bicep-architect.md +126 -419
  36. package/content/.claude/skills/infra/container-specialist.md +131 -437
  37. package/content/.claude/skills/infra/devops-engineer.md +119 -405
  38. package/content/.claude/skills/integrations/asaas-financial.md +130 -333
  39. package/content/.claude/skills/integrations/azure-identity.md +142 -309
  40. package/content/.claude/skills/integrations/clerk-auth.md +108 -290
  41. package/content/.claude/skills/integrations/resend-email.md +119 -0
  42. package/content/.claude/skills/specialists/ai-system-architect.md +192 -604
  43. package/content/.claude/skills/specialists/azure-architect.md +142 -142
  44. package/content/.claude/skills/specialists/code-analyzer.md +235 -0
  45. package/content/.claude/skills/specialists/dotnet-senior.md +287 -0
  46. package/content/.claude/skills/specialists/ef-modeler.md +113 -200
  47. package/content/.claude/skills/specialists/hangfire-orchestrator.md +126 -245
  48. package/content/.claude/skills/specialists/ms-agent-expert.md +109 -263
  49. package/content/.claude/skills/specialists/po-pm-advisor.md +197 -197
  50. package/content/.claude/skills/specialists/standards-architect.md +156 -78
  51. package/content/.claude/skills/specialists/testing-specialist.md +126 -0
  52. package/content/.claude/skills/specialists/ui-ux-designer.md +191 -1060
  53. package/content/.claude/skills/stacks/dotnet-blazor.md +210 -588
  54. package/content/.claude/skills/stacks/dotnet-nextjs.md +154 -402
  55. package/content/.claude/skills/workflows/morph-replicate.md +213 -0
  56. package/content/.claude/{commands/morph-clarify.md → skills/workflows/phase-clarify.md} +5 -58
  57. package/content/.claude/{commands/morph-design.md → skills/workflows/phase-design.md} +16 -86
  58. package/content/.claude/{commands/morph-setup.md → skills/workflows/phase-setup.md} +9 -17
  59. package/content/.claude/skills/workflows/phase-tasks.md +164 -0
  60. package/content/.claude/{commands/morph-uiux.md → skills/workflows/phase-uiux.md} +15 -88
  61. package/content/.morph/.morphversion +5 -5
  62. package/content/.morph/archive/.gitkeep +25 -25
  63. package/content/.morph/config/agents.json +378 -242
  64. package/content/.morph/config/config.template.json +89 -108
  65. package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
  66. package/content/.morph/docs/workflows/design-impl.md +37 -0
  67. package/content/.morph/docs/workflows/fast-track.md +29 -0
  68. package/content/.morph/docs/workflows/full-morph.md +76 -0
  69. package/content/.morph/docs/workflows/standard.md +44 -0
  70. package/content/.morph/docs/workflows/ui-refresh.md +39 -0
  71. package/content/.morph/examples/api-nextjs/README.md +241 -241
  72. package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
  73. package/content/.morph/examples/api-nextjs/spec.md +399 -399
  74. package/content/.morph/examples/api-nextjs/tasks.md +168 -168
  75. package/content/.morph/examples/micro-saas/README.md +125 -125
  76. package/content/.morph/examples/micro-saas/contracts.cs +358 -358
  77. package/content/.morph/examples/micro-saas/decisions.md +246 -246
  78. package/content/.morph/examples/micro-saas/spec.md +236 -236
  79. package/content/.morph/examples/micro-saas/tasks.md +150 -150
  80. package/content/.morph/examples/multi-agent/README.md +309 -309
  81. package/content/.morph/examples/multi-agent/contracts.cs +433 -433
  82. package/content/.morph/examples/multi-agent/spec.md +479 -479
  83. package/content/.morph/examples/multi-agent/tasks.md +185 -185
  84. package/content/.morph/examples/scheduled-reports/decisions.md +158 -0
  85. package/content/.morph/examples/scheduled-reports/proposal.md +95 -0
  86. package/content/.morph/examples/scheduled-reports/spec.md +267 -0
  87. package/content/.morph/examples/state-v3.json +188 -0
  88. package/content/.morph/features/.gitkeep +25 -25
  89. package/content/.morph/hooks/README.md +190 -239
  90. package/content/.morph/hooks/pre-commit-agents.sh +24 -24
  91. package/content/.morph/hooks/pre-commit-all.sh +48 -48
  92. package/content/.morph/hooks/pre-commit-specs.sh +49 -49
  93. package/content/.morph/hooks/pre-commit-tests.sh +60 -60
  94. package/content/.morph/project.md +160 -160
  95. package/content/.morph/schemas/agent.schema.json +296 -296
  96. package/content/.morph/schemas/tasks.schema.json +220 -0
  97. package/content/.morph/specs/.gitkeep +20 -20
  98. package/content/.morph/standards/agent-framework-blazor-ui.md +359 -0
  99. package/content/.morph/standards/agent-framework-production.md +410 -0
  100. package/content/.morph/standards/agent-framework-setup.md +413 -453
  101. package/content/.morph/standards/agent-framework-workflows.md +349 -0
  102. package/content/.morph/standards/architecture.md +325 -325
  103. package/content/.morph/standards/azure.md +605 -379
  104. package/content/.morph/standards/coding.md +377 -377
  105. package/content/.morph/standards/dotnet10-migration.md +520 -494
  106. package/content/.morph/standards/fluent-ui-setup.md +590 -590
  107. package/content/.morph/standards/migration-guide.md +514 -514
  108. package/content/.morph/standards/passkeys-auth.md +423 -423
  109. package/content/.morph/standards/vector-search-rag.md +536 -536
  110. package/content/.morph/state.json +17 -17
  111. package/content/.morph/templates/FluentDesignTheme.cs +149 -149
  112. package/content/.morph/templates/MudTheme.cs +281 -281
  113. package/content/.morph/templates/agent.cs +163 -172
  114. package/content/.morph/templates/clarify-questions.md +159 -0
  115. package/content/.morph/templates/component.razor +239 -239
  116. package/content/.morph/templates/contracts/Commands.cs +74 -0
  117. package/content/.morph/templates/contracts/Entities.cs +25 -0
  118. package/content/.morph/templates/contracts/Queries.cs +74 -0
  119. package/content/.morph/templates/contracts/README.md +74 -0
  120. package/content/.morph/templates/contracts.cs +217 -217
  121. package/content/.morph/templates/decisions.md +123 -106
  122. package/content/.morph/templates/design-system.css +226 -226
  123. package/content/.morph/templates/infra/.dockerignore.example +89 -89
  124. package/content/.morph/templates/infra/Dockerfile.example +82 -82
  125. package/content/.morph/templates/infra/README.md +286 -286
  126. package/content/.morph/templates/infra/app-insights.bicep +63 -63
  127. package/content/.morph/templates/infra/app-service.bicep +164 -164
  128. package/content/.morph/templates/infra/container-app-env.bicep +49 -49
  129. package/content/.morph/templates/infra/container-app.bicep +156 -156
  130. package/content/.morph/templates/infra/deploy-checklist.md +426 -0
  131. package/content/.morph/templates/infra/deploy.ps1 +229 -229
  132. package/content/.morph/templates/infra/deploy.sh +208 -208
  133. package/content/.morph/templates/infra/key-vault.bicep +91 -91
  134. package/content/.morph/templates/infra/main.bicep +189 -189
  135. package/content/.morph/templates/infra/parameters.dev.json +29 -29
  136. package/content/.morph/templates/infra/parameters.prod.json +29 -29
  137. package/content/.morph/templates/infra/parameters.staging.json +29 -29
  138. package/content/.morph/templates/infra/sql-database.bicep +103 -103
  139. package/content/.morph/templates/infra/storage.bicep +106 -106
  140. package/content/.morph/templates/integrations/asaas-client.cs +387 -387
  141. package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
  142. package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
  143. package/content/.morph/templates/integrations/clerk-config.cs +258 -258
  144. package/content/.morph/templates/job.cs +171 -171
  145. package/content/.morph/templates/migration.cs +83 -83
  146. package/content/.morph/templates/proposal.md +141 -155
  147. package/content/.morph/templates/recap.md +94 -105
  148. package/content/.morph/templates/repository.cs +141 -141
  149. package/content/.morph/templates/saas/subscription.cs +347 -347
  150. package/content/.morph/templates/saas/tenant.cs +338 -338
  151. package/content/.morph/templates/service.cs +139 -139
  152. package/content/.morph/templates/simulation.md +353 -0
  153. package/content/.morph/templates/spec.md +149 -148
  154. package/content/.morph/templates/sprint-status.yaml +68 -68
  155. package/content/.morph/templates/state.template.json +222 -222
  156. package/content/.morph/templates/story.md +143 -143
  157. package/content/.morph/templates/tasks.md +257 -235
  158. package/content/.morph/templates/test.cs +239 -239
  159. package/content/.morph/templates/ui-components.md +362 -276
  160. package/content/.morph/templates/ui-design-system.md +286 -286
  161. package/content/.morph/templates/ui-flows.md +336 -336
  162. package/content/.morph/templates/ui-mockups.md +133 -133
  163. package/content/.morph/test-infra/example.bicep +59 -59
  164. package/content/CLAUDE.md +150 -442
  165. package/content/README.md +79 -79
  166. package/detectors/config-detector.js +223 -223
  167. package/detectors/conversation-analyzer.js +163 -163
  168. package/detectors/index.js +84 -84
  169. package/detectors/standards-generator.js +275 -275
  170. package/detectors/structure-detector.js +245 -250
  171. package/docs/README.md +144 -149
  172. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
  173. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
  174. package/docs/api/scripts/collapse.js +38 -38
  175. package/docs/api/scripts/commonNav.js +28 -28
  176. package/docs/api/scripts/linenumber.js +25 -25
  177. package/docs/api/scripts/nav.js +12 -12
  178. package/docs/api/scripts/polyfill.js +3 -3
  179. package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
  180. package/docs/api/scripts/prettify/lang-css.js +2 -2
  181. package/docs/api/scripts/prettify/prettify.js +28 -28
  182. package/docs/api/scripts/search.js +98 -98
  183. package/docs/api/styles/jsdoc.css +776 -776
  184. package/docs/api/styles/prettify.css +80 -80
  185. package/docs/examples.md +328 -328
  186. package/docs/getting-started.md +301 -302
  187. package/docs/installation.md +361 -361
  188. package/docs/templates.md +418 -418
  189. package/docs/validation-checklist.md +265 -266
  190. package/package.json +80 -80
  191. package/scripts/postinstall.js +132 -132
  192. package/src/commands/advance-phase.js +183 -0
  193. package/src/commands/analyze-blazor-concurrency.js +193 -0
  194. package/src/commands/create-story.js +351 -351
  195. package/src/commands/detect-agents.js +139 -0
  196. package/src/commands/detect.js +104 -104
  197. package/src/commands/doctor.js +356 -280
  198. package/src/commands/generate.js +149 -149
  199. package/src/commands/init.js +258 -245
  200. package/src/commands/lint-fluent.js +352 -0
  201. package/src/commands/rollback-phase.js +185 -0
  202. package/src/commands/session-summary.js +291 -0
  203. package/src/commands/shard-spec.js +224 -224
  204. package/src/commands/sprint-status.js +250 -250
  205. package/src/commands/state.js +333 -333
  206. package/src/commands/sync.js +167 -167
  207. package/src/commands/task.js +78 -0
  208. package/src/commands/troubleshoot.js +222 -0
  209. package/src/commands/update.js +192 -159
  210. package/src/commands/validate-blazor-state.js +210 -0
  211. package/src/commands/validate-blazor.js +156 -0
  212. package/src/commands/validate-css.js +84 -0
  213. package/src/commands/validate-phase.js +221 -0
  214. package/src/lib/blazor-concurrency-analyzer.js +288 -0
  215. package/src/lib/blazor-state-validator.js +291 -0
  216. package/src/lib/blazor-validator.js +374 -0
  217. package/src/lib/complexity-analyzer.js +441 -292
  218. package/src/lib/continuous-validator.js +421 -0
  219. package/src/lib/css-validator.js +352 -0
  220. package/src/lib/decision-constraint-loader.js +109 -0
  221. package/src/lib/design-system-generator.js +298 -298
  222. package/src/lib/learning-system.js +520 -0
  223. package/src/lib/mockup-generator.js +366 -0
  224. package/src/lib/recap-generator.js +205 -0
  225. package/src/lib/state-manager.js +397 -340
  226. package/src/lib/troubleshoot-grep.js +194 -0
  227. package/src/lib/troubleshoot-index.js +144 -0
  228. package/src/lib/ui-detector.js +350 -0
  229. package/src/lib/validation-runner.js +231 -0
  230. package/src/lib/validators/architecture-validator.js +387 -0
  231. package/src/lib/validators/contract-compliance-validator.js +273 -0
  232. package/src/lib/validators/package-validator.js +360 -0
  233. package/src/lib/validators/ui-contrast-validator.js +422 -0
  234. package/src/utils/file-copier.js +179 -139
  235. package/src/utils/logger.js +32 -32
  236. package/src/utils/version-checker.js +175 -175
  237. package/content/.claude/commands/morph-costs.md +0 -206
  238. package/content/.claude/commands/morph-tasks.md +0 -319
  239. package/content/.claude/skills/specialists/cost-guardian.md +0 -110
  240. package/content/.claude/skills/stacks/shopify.md +0 -445
  241. package/content/.morph/config/azure-pricing.json +0 -70
  242. package/content/.morph/config/azure-pricing.schema.json +0 -50
  243. package/content/.morph/hooks/pre-commit-costs.sh +0 -91
  244. package/docs/api/cost-calculator.js.html +0 -513
  245. package/docs/api/design-system-generator.js.html +0 -382
  246. package/docs/api/global.html +0 -5263
  247. package/docs/api/index.html +0 -96
  248. package/docs/api/state-manager.js.html +0 -423
  249. package/src/commands/cost.js +0 -181
  250. package/src/commands/update-pricing.js +0 -206
  251. 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*