@polymorphism-tech/morph-spec 4.5.0 → 4.7.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 (292) hide show
  1. package/CLAUDE.md +77 -56
  2. package/README.md +394 -700
  3. package/docs/ARCHITECTURE.md +331 -0
  4. package/docs/CHEATSHEET.md +221 -0
  5. package/docs/COMMAND-FLOWS.md +368 -0
  6. package/docs/QUICKSTART.md +212 -0
  7. package/docs/examples/order-management/contracts.cs +84 -0
  8. package/docs/examples/order-management/proposal.md +24 -0
  9. package/docs/examples/order-management/spec.md +162 -0
  10. package/docs/plans/2026-02-23-ddd-architecture-refactor.md +1153 -0
  11. package/docs/plans/2026-02-23-ddd-nextsteps.md +682 -0
  12. package/docs/plans/2026-02-23-infra-architect-refactor.md +437 -0
  13. package/docs/plans/2026-02-23-nextjs-code-review-design.md +156 -0
  14. package/docs/plans/2026-02-23-nextjs-code-review-impl.md +1254 -0
  15. package/docs/plans/2026-02-23-nextjs-standards-design.md +149 -0
  16. package/docs/plans/2026-02-23-nextjs-standards-impl.md +1846 -0
  17. package/framework/{skills/level-2-domains → agents}/README.md +14 -14
  18. package/framework/{skills/level-2-domains → agents}/ai-agents/ai-system-architect.md +1 -4
  19. package/framework/{skills/level-2-domains → agents}/architecture/po-pm-advisor.md +1 -2
  20. package/framework/{skills/level-2-domains → agents}/architecture/prompt-engineer.md +1 -2
  21. package/framework/{skills/level-2-domains → agents}/architecture/seo-growth-hacker.md +1 -2
  22. package/framework/{skills/level-2-domains → agents}/architecture/standards-architect.md +159 -162
  23. package/framework/agents/backend/api-designer.md +103 -0
  24. package/framework/{skills/level-2-domains → agents}/backend/dotnet-senior.md +1 -2
  25. package/framework/agents/backend/ef-modeler.md +119 -0
  26. package/framework/{skills/level-2-domains → agents}/backend/hangfire-orchestrator.md +1 -4
  27. package/framework/{skills/level-2-domains → agents}/backend/ms-agent-expert.md +1 -4
  28. package/framework/{skills/level-2-domains → agents}/frontend/blazor-builder.md +1 -4
  29. package/framework/agents/frontend/nextjs-expert.md +118 -0
  30. package/framework/{skills/level-2-domains → agents}/frontend/ui-ux-designer.md +1 -2
  31. package/framework/{skills/level-2-domains → agents}/infrastructure/azure-architect.md +147 -148
  32. package/framework/{skills/level-2-domains → agents}/infrastructure/azure-deploy-specialist.md +1 -2
  33. package/framework/{skills/level-2-domains → agents}/infrastructure/bicep-architect.md +1 -4
  34. package/framework/{skills/level-2-domains → agents}/infrastructure/container-specialist.md +1 -4
  35. package/framework/{skills/level-2-domains → agents}/infrastructure/devops-engineer.md +1 -4
  36. package/framework/agents/infrastructure/infra-architect.md +45 -0
  37. package/framework/{skills/level-2-domains → agents}/integrations/asaas-financial.md +1 -4
  38. package/framework/{skills/level-2-domains → agents}/integrations/azure-identity.md +1 -4
  39. package/framework/{skills/level-2-domains → agents}/integrations/clerk-auth.md +1 -4
  40. package/framework/{skills/level-2-domains → agents}/integrations/hangfire-integration.md +1 -2
  41. package/framework/{skills/level-2-domains → agents}/integrations/resend-email.md +1 -4
  42. package/framework/{skills/level-2-domains → agents}/quality/code-analyzer.md +1 -4
  43. package/framework/{skills/level-2-domains → agents}/quality/testing-specialist.md +1 -4
  44. package/framework/agents.json +1145 -278
  45. package/framework/hooks/claude-code/statusline.py +384 -85
  46. package/framework/hooks/shared/phase-utils.js +129 -129
  47. package/framework/rules/frontend-standards.md +0 -3
  48. package/framework/rules/nextjs-standards.md +17 -0
  49. package/framework/skills/README.md +66 -0
  50. package/framework/skills/level-0-meta/{brainstorming.md → brainstorming/SKILL.md} +3 -1
  51. package/framework/skills/level-0-meta/brainstorming/references/proposal-example.md +138 -0
  52. package/framework/skills/level-0-meta/{code-review.md → code-review/SKILL.md} +3 -2
  53. package/framework/skills/level-0-meta/code-review/references/review-example.md +164 -0
  54. package/framework/skills/level-0-meta/code-review/scripts/scan-csharp.mjs +121 -0
  55. package/framework/skills/level-0-meta/code-review-nextjs/SKILL.md +147 -0
  56. package/framework/skills/level-0-meta/code-review-nextjs/references/review-example-nextjs.md +254 -0
  57. package/framework/skills/level-0-meta/{morph-checklist.md → morph-checklist/SKILL.md} +2 -5
  58. package/framework/skills/{level-1-workflows/morph-replicate.md → level-0-meta/morph-replicate/SKILL.md} +6 -7
  59. package/framework/skills/level-0-meta/{simulation-checklist.md → simulation-checklist/SKILL.md} +3 -6
  60. package/framework/skills/level-0-meta/{tool-usage-guide.md → tool-usage-guide/SKILL.md} +4 -5
  61. package/framework/skills/level-0-meta/{verification-before-completion.md → verification-before-completion/SKILL.md} +3 -1
  62. package/framework/skills/level-0-meta/verification-before-completion/scripts/check-phase-outputs.mjs +110 -0
  63. package/framework/skills/level-1-workflows/{phase-clarify.md → phase-clarify/SKILL.md} +3 -3
  64. package/framework/skills/level-1-workflows/phase-clarify/references/clarifications-example.md +117 -0
  65. package/framework/skills/level-1-workflows/{phase-codebase-analysis.md → phase-codebase-analysis/SKILL.md} +2 -3
  66. package/framework/skills/level-1-workflows/{phase-design.md → phase-design/SKILL.md} +46 -182
  67. package/framework/skills/level-1-workflows/phase-design/references/spec-example.md +253 -0
  68. package/framework/skills/level-1-workflows/{phase-implement.md → phase-implement/SKILL.md} +3 -3
  69. package/framework/skills/level-1-workflows/phase-implement/references/recap-example.md +132 -0
  70. package/framework/skills/level-1-workflows/{phase-setup.md → phase-setup/SKILL.md} +2 -3
  71. package/framework/skills/level-1-workflows/{phase-tasks.md → phase-tasks/SKILL.md} +42 -3
  72. package/framework/skills/level-1-workflows/phase-tasks/references/tasks-example.md +231 -0
  73. package/framework/skills/level-1-workflows/phase-tasks/scripts/validate-tasks.mjs +112 -0
  74. package/framework/skills/level-1-workflows/{phase-uiux.md → phase-uiux/SKILL.md} +2 -3
  75. package/framework/standards/STANDARDS.json +121 -0
  76. package/framework/standards/architecture/ddd/bounded-contexts.md +105 -0
  77. package/framework/standards/architecture/ddd/complexity-levels.md +108 -0
  78. package/framework/standards/architecture/ddd/ubiquitous-language.md +58 -0
  79. package/framework/standards/frontend/nextjs/app-router.md +123 -0
  80. package/framework/standards/frontend/nextjs/components.md +132 -0
  81. package/framework/standards/frontend/nextjs/data-fetching.md +126 -0
  82. package/framework/standards/frontend/nextjs/forms.md +128 -0
  83. package/framework/standards/frontend/nextjs/naming-conventions.md +67 -0
  84. package/framework/standards/frontend/nextjs/project-structure.md +102 -0
  85. package/framework/standards/frontend/nextjs/state-management.md +72 -0
  86. package/framework/standards/frontend/nextjs/testing.md +111 -0
  87. package/framework/templates/REGISTRY.json +538 -142
  88. package/framework/templates/code/dotnet/contracts/contracts-level1.cs +69 -0
  89. package/framework/templates/code/dotnet/contracts/contracts-level2.cs +86 -0
  90. package/framework/templates/code/dotnet/contracts/contracts-level3.cs +41 -0
  91. package/framework/templates/docs/spec.md +49 -0
  92. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -0
  93. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -0
  94. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -0
  95. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -0
  96. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -0
  97. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -0
  98. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -0
  99. package/framework/templates/project-structure/dotnet-ddd.md +70 -0
  100. package/framework/workflows/docs/enforcement-pipeline.md +2 -1
  101. package/package.json +1 -1
  102. package/scripts/scan-nextjs.mjs +169 -0
  103. package/src/commands/project/doctor.js +52 -1
  104. package/src/commands/project/init.js +19 -65
  105. package/src/commands/project/update.js +7 -63
  106. package/src/lib/detectors/claude-config-detector.js +1 -3
  107. package/src/lib/standards/standards-context-injector.js +5 -0
  108. package/src/lib/validators/nextjs/index.js +6 -0
  109. package/src/lib/validators/nextjs/next-component-validator.js +181 -0
  110. package/src/lib/validators/validation-runner.js +5 -0
  111. package/src/utils/agents-installer.js +16 -4
  112. package/src/utils/skills-installer.js +59 -15
  113. package/.morph/.morphversion +0 -5
  114. package/.morph/analytics/threads-log.jsonl +0 -44
  115. package/.morph/config/config.json +0 -8
  116. package/.morph/context/README.md +0 -17
  117. package/.morph/framework/agents.json +0 -948
  118. package/.morph/framework/standards/STANDARDS.json +0 -812
  119. package/.morph/framework/standards/ai-agents/blazor-ui.md +0 -364
  120. package/.morph/framework/standards/ai-agents/production.md +0 -415
  121. package/.morph/framework/standards/ai-agents/setup.md +0 -418
  122. package/.morph/framework/standards/ai-agents/team-orchestration.md +0 -479
  123. package/.morph/framework/standards/ai-agents/workflows.md +0 -354
  124. package/.morph/framework/standards/architecture/ddd/aggregates.md +0 -120
  125. package/.morph/framework/standards/architecture/ddd/entities.md +0 -99
  126. package/.morph/framework/standards/architecture/ddd/value-objects.md +0 -124
  127. package/.morph/framework/standards/backend/api/minimal-api.md +0 -494
  128. package/.morph/framework/standards/backend/api/rest.md +0 -492
  129. package/.morph/framework/standards/backend/api/validation.md +0 -88
  130. package/.morph/framework/standards/backend/authentication/passkeys.md +0 -428
  131. package/.morph/framework/standards/backend/database/ef-core.md +0 -199
  132. package/.morph/framework/standards/backend/database/migrations.md +0 -393
  133. package/.morph/framework/standards/backend/database/postgresql/database.md +0 -352
  134. package/.morph/framework/standards/backend/database/repository-patterns.md +0 -528
  135. package/.morph/framework/standards/backend/database/vector-search-rag.md +0 -541
  136. package/.morph/framework/standards/backend/dotnet/async.md +0 -366
  137. package/.morph/framework/standards/backend/dotnet/core.md +0 -117
  138. package/.morph/framework/standards/backend/dotnet/di.md +0 -439
  139. package/.morph/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
  140. package/.morph/framework/standards/backend/integrations/asaas/asaas-api.md +0 -216
  141. package/.morph/framework/standards/backend/integrations/clerk/clerk-auth.md +0 -290
  142. package/.morph/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
  143. package/.morph/framework/standards/backend/integrations/resend/resend-email.md +0 -385
  144. package/.morph/framework/standards/context/analytics.md +0 -96
  145. package/.morph/framework/standards/context/bundles.md +0 -110
  146. package/.morph/framework/standards/context/priming.md +0 -78
  147. package/.morph/framework/standards/core/architecture.md +0 -185
  148. package/.morph/framework/standards/core/coding.md +0 -214
  149. package/.morph/framework/standards/core/git-branching-strategy.md +0 -403
  150. package/.morph/framework/standards/core/git.md +0 -185
  151. package/.morph/framework/standards/core/testing.md +0 -295
  152. package/.morph/framework/standards/data/nosql/blob-storage.md +0 -102
  153. package/.morph/framework/standards/data/nosql/cache/redis.md +0 -97
  154. package/.morph/framework/standards/data/nosql/cosmos-db.md +0 -118
  155. package/.morph/framework/standards/data/vector-search/azure-ai-search.md +0 -121
  156. package/.morph/framework/standards/data/vector-search/rag-chunking.md +0 -104
  157. package/.morph/framework/standards/frontend/blazor/design-checklist.md +0 -222
  158. package/.morph/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
  159. package/.morph/framework/standards/frontend/blazor/fluent-ui.md +0 -137
  160. package/.morph/framework/standards/frontend/blazor/html-conversion.md +0 -184
  161. package/.morph/framework/standards/frontend/blazor/lifecycle.md +0 -195
  162. package/.morph/framework/standards/frontend/blazor/pitfalls.md +0 -198
  163. package/.morph/framework/standards/frontend/blazor/state.md +0 -191
  164. package/.morph/framework/standards/frontend/design-system/animations.md +0 -151
  165. package/.morph/framework/standards/frontend/design-system/naming.md +0 -64
  166. package/.morph/framework/standards/frontend/nextjs/nextjs-patterns.md +0 -198
  167. package/.morph/framework/standards/infrastructure/azure/azure.md +0 -624
  168. package/.morph/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
  169. package/.morph/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
  170. package/.morph/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
  171. package/.morph/framework/standards/infrastructure/azure/services/functions.md +0 -486
  172. package/.morph/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
  173. package/.morph/framework/standards/infrastructure/azure/services/storage.md +0 -407
  174. package/.morph/framework/standards/infrastructure/docker/easypanel-deploy.md +0 -196
  175. package/.morph/framework/standards/infrastructure/supabase/mcp-setup.md +0 -252
  176. package/.morph/framework/standards/infrastructure/supabase/supabase-auth.md +0 -176
  177. package/.morph/framework/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
  178. package/.morph/framework/standards/infrastructure/supabase/supabase-rls.md +0 -184
  179. package/.morph/framework/standards/infrastructure/supabase/supabase-storage.md +0 -153
  180. package/.morph/framework/standards/integration/api/graphql.md +0 -91
  181. package/.morph/framework/standards/integration/api/grpc.md +0 -114
  182. package/.morph/framework/standards/integration/api/rest-design.md +0 -95
  183. package/.morph/framework/standards/integration/event-driven/cqrs.md +0 -101
  184. package/.morph/framework/standards/integration/event-driven/event-sourcing.md +0 -124
  185. package/.morph/framework/standards/integration/event-driven/service-bus.md +0 -95
  186. package/.morph/framework/standards/integration/mcp/mcp-tools.md +0 -384
  187. package/.morph/framework/standards/observability/logging.md +0 -131
  188. package/.morph/framework/standards/observability/metrics.md +0 -121
  189. package/.morph/framework/standards/observability/monitoring.md +0 -114
  190. package/.morph/framework/standards/observability/tracing.md +0 -132
  191. package/.morph/framework/standards/workflows/parallel-execution.md +0 -112
  192. package/.morph/framework/standards/workflows/thread-management.md +0 -113
  193. package/.morph/framework/templates/.idea/morph-templates.xml +0 -92
  194. package/.morph/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  195. package/.morph/framework/templates/IDE-SNIPPETS.md +0 -266
  196. package/.morph/framework/templates/README.md +0 -814
  197. package/.morph/framework/templates/REGISTRY.json +0 -1492
  198. package/.morph/framework/templates/code/dotnet/backend/repository.cs +0 -141
  199. package/.morph/framework/templates/code/dotnet/backend/service.cs +0 -139
  200. package/.morph/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
  201. package/.morph/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
  202. package/.morph/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
  203. package/.morph/framework/templates/code/dotnet/contracts/README.md +0 -74
  204. package/.morph/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
  205. package/.morph/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
  206. package/.morph/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
  207. package/.morph/framework/templates/code/dotnet/database/migration.cs +0 -83
  208. package/.morph/framework/templates/code/dotnet/frontend/component.razor +0 -239
  209. package/.morph/framework/templates/code/dotnet/jobs/agent.cs +0 -163
  210. package/.morph/framework/templates/code/dotnet/jobs/job.cs +0 -171
  211. package/.morph/framework/templates/code/dotnet/test.cs +0 -239
  212. package/.morph/framework/templates/code/sql/rls-policy.sql +0 -57
  213. package/.morph/framework/templates/code/sql/supabase-migration.sql +0 -100
  214. package/.morph/framework/templates/code/sql/supabase-migration.template.sql +0 -113
  215. package/.morph/framework/templates/code/typescript/contracts.ts +0 -168
  216. package/.morph/framework/templates/context/CONTEXT-FEATURE.md +0 -276
  217. package/.morph/framework/templates/context/CONTEXT.md +0 -181
  218. package/.morph/framework/templates/docs/clarifications.md +0 -253
  219. package/.morph/framework/templates/docs/onboarding.md +0 -123
  220. package/.morph/framework/templates/docs/proposal.md +0 -182
  221. package/.morph/framework/templates/docs/schema-analysis.md +0 -119
  222. package/.morph/framework/templates/docs/spec.md +0 -149
  223. package/.morph/framework/templates/docs/ui-components.md +0 -124
  224. package/.morph/framework/templates/docs/ui-design-system.md +0 -76
  225. package/.morph/framework/templates/docs/ui-flows.md +0 -167
  226. package/.morph/framework/templates/docs/ui-mockups.md +0 -98
  227. package/.morph/framework/templates/examples/design-system-examples.md +0 -357
  228. package/.morph/framework/templates/examples/spec-examples.md +0 -90
  229. package/.morph/framework/templates/feature/decisions.md +0 -187
  230. package/.morph/framework/templates/feature/recap.md +0 -146
  231. package/.morph/framework/templates/feature/tasks.md +0 -199
  232. package/.morph/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
  233. package/.morph/framework/templates/infrastructure/azure/README.md +0 -286
  234. package/.morph/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
  235. package/.morph/framework/templates/infrastructure/azure/app-service.bicep +0 -164
  236. package/.morph/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
  237. package/.morph/framework/templates/infrastructure/azure/container-app.bicep +0 -156
  238. package/.morph/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
  239. package/.morph/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
  240. package/.morph/framework/templates/infrastructure/azure/deploy.sh +0 -208
  241. package/.morph/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
  242. package/.morph/framework/templates/infrastructure/azure/main.bicep +0 -189
  243. package/.morph/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
  244. package/.morph/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
  245. package/.morph/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
  246. package/.morph/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
  247. package/.morph/framework/templates/infrastructure/azure/storage.bicep +0 -106
  248. package/.morph/framework/templates/infrastructure/docker/Dockerfile.template +0 -58
  249. package/.morph/framework/templates/infrastructure/docker/docker-compose.template.yml +0 -67
  250. package/.morph/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +0 -38
  251. package/.morph/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +0 -48
  252. package/.morph/framework/templates/infrastructure/docker/easypanel.template.json +0 -54
  253. package/.morph/framework/templates/infrastructure/github/README.md +0 -593
  254. package/.morph/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
  255. package/.morph/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -45
  256. package/.morph/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +0 -27
  257. package/.morph/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
  258. package/.morph/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -31
  259. package/.morph/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -59
  260. package/.morph/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -39
  261. package/.morph/framework/templates/integrations/asaas-client.cs +0 -387
  262. package/.morph/framework/templates/integrations/asaas-webhook.cs +0 -351
  263. package/.morph/framework/templates/integrations/azure-identity-config.cs +0 -288
  264. package/.morph/framework/templates/integrations/clerk-config.cs +0 -258
  265. package/.morph/framework/templates/meta-prompts/fusion/fusion-agent.md +0 -76
  266. package/.morph/framework/templates/meta-prompts/fusion/fusion-aggregator.md +0 -100
  267. package/.morph/framework/templates/meta-prompts/hops/hop-retry.md +0 -78
  268. package/.morph/framework/templates/meta-prompts/hops/hop-validation.md +0 -97
  269. package/.morph/framework/templates/meta-prompts/hops/hop-wrapper.md +0 -36
  270. package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +0 -113
  271. package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +0 -80
  272. package/.morph/framework/templates/meta-prompts/squad-leaders/backend-squad.md +0 -90
  273. package/.morph/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +0 -126
  274. package/.morph/framework/templates/meta-prompts/squad-leaders/squad-leader.md +0 -43
  275. package/.morph/framework/templates/meta-prompts/validators/checkpoint-validator.md +0 -107
  276. package/.morph/framework/templates/meta-prompts/validators/pre-commit-validator.md +0 -95
  277. package/.morph/framework/templates/saas/subscription.cs +0 -347
  278. package/.morph/framework/templates/saas/tenant.cs +0 -338
  279. package/.morph/framework/templates/state.template.json +0 -17
  280. package/.morph/framework/templates/ui/FluentDesignTheme.cs +0 -149
  281. package/.morph/framework/templates/ui/MudTheme.cs +0 -281
  282. package/.morph/framework/templates/ui/design-system.css +0 -226
  283. package/.morph/logs/tool-failures.log +0 -51
  284. package/.morph/memory/pre-compact-2026-02-22T17-01-01-658Z.json +0 -16
  285. package/.morph/state.json +0 -48
  286. package/framework/skills/level-2-domains/backend/api-designer.md +0 -66
  287. package/framework/skills/level-2-domains/backend/ef-modeler.md +0 -65
  288. package/framework/skills/level-2-domains/frontend/nextjs-expert.md +0 -161
  289. package/framework/skills/level-3-technologies/README.md +0 -7
  290. package/framework/skills/level-4-patterns/README.md +0 -7
  291. package/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
  292. package/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
@@ -1,295 +0,0 @@
1
- # Testing Standards
2
-
3
- > **Scope:** universal
4
- > **Layer:** 0 (always load)
5
- > **Keywords:** test, testing, unit, integration, xunit, nunit
6
- > **Load When:** always
7
-
8
- Test patterns and best practices for MORPH-SPEC projects
9
-
10
- ---
11
-
12
- ## Test Pyramid
13
-
14
- ```
15
- /\
16
- / \ E2E Tests (10%)
17
- /____\
18
- / \
19
- / Integration Tests (30%)
20
- /________________\
21
- / \
22
- / Unit Tests (60%) \
23
- /_______________________\
24
- ```
25
-
26
- ### Distribution
27
-
28
- - **Unit Tests (60%)**: Fast, isolated, test single units
29
- - **Integration Tests (30%)**: Test component interactions
30
- - **E2E Tests (10%)**: Full user workflows
31
-
32
- ---
33
-
34
- ## Naming Conventions
35
-
36
- ### Format
37
-
38
- ```
39
- MethodName_Scenario_ExpectedBehavior
40
- ```
41
-
42
- ### Examples
43
-
44
- ```csharp
45
- // .NET (xUnit)
46
- [Fact]
47
- public void Login_ValidCredentials_ReturnsAuthToken() { }
48
-
49
- [Fact]
50
- public void Login_InvalidPassword_ThrowsUnauthorizedException() { }
51
-
52
- [Theory]
53
- [InlineData("user@example.com", "password123")]
54
- public void Register_ValidInput_CreatesUser(string email, string password) { }
55
- ```
56
-
57
- ```typescript
58
- // JavaScript (Jest/Vitest)
59
- describe('UserService', () => {
60
- it('should return auth token for valid credentials', () => {})
61
-
62
- it('should throw error for invalid password', () => {})
63
-
64
- it.each([
65
- ['user@example.com', 'password123'],
66
- ['admin@test.com', 'admin456']
67
- ])('should create user for %s', (email, password) => {})
68
- })
69
- ```
70
-
71
- ---
72
-
73
- ## Unit Testing Best Practices
74
-
75
- ### Arrange-Act-Assert (AAA)
76
-
77
- ```csharp
78
- [Fact]
79
- public void CalculateTotal_WithDiscount_AppliesCorrectPercentage()
80
- {
81
- // Arrange
82
- var cart = new ShoppingCart();
83
- cart.AddItem(new Item { Price = 100 });
84
- var discountService = new DiscountService();
85
-
86
- // Act
87
- var total = discountService.CalculateTotal(cart, discountPercent: 10);
88
-
89
- // Assert
90
- Assert.Equal(90, total);
91
- }
92
- ```
93
-
94
- ### Mocking Dependencies
95
-
96
- ```csharp
97
- [Fact]
98
- public async Task GetUser_ValidId_ReturnsUser()
99
- {
100
- // Arrange
101
- var mockRepo = new Mock<IUserRepository>();
102
- mockRepo.Setup(r => r.GetByIdAsync(1))
103
- .ReturnsAsync(new User { Id = 1, Name = "John" });
104
-
105
- var service = new UserService(mockRepo.Object);
106
-
107
- // Act
108
- var user = await service.GetUserAsync(1);
109
-
110
- // Assert
111
- Assert.NotNull(user);
112
- Assert.Equal("John", user.Name);
113
- }
114
- ```
115
-
116
- ---
117
-
118
- ## Integration Testing
119
-
120
- ### Database Tests
121
-
122
- ```csharp
123
- public class UserRepositoryTests : IClassFixture<DatabaseFixture>
124
- {
125
- private readonly AppDbContext _context;
126
-
127
- public UserRepositoryTests(DatabaseFixture fixture)
128
- {
129
- _context = fixture.CreateContext();
130
- }
131
-
132
- [Fact]
133
- public async Task CreateUser_ValidData_SavesToDatabase()
134
- {
135
- // Arrange
136
- var repo = new UserRepository(_context);
137
- var user = new User { Email = "test@example.com" };
138
-
139
- // Act
140
- await repo.CreateAsync(user);
141
- await _context.SaveChangesAsync();
142
-
143
- // Assert
144
- var saved = await _context.Users.FirstOrDefaultAsync(u => u.Email == "test@example.com");
145
- Assert.NotNull(saved);
146
- }
147
- }
148
- ```
149
-
150
- ### API Tests
151
-
152
- ```csharp
153
- public class AuthControllerTests : IClassFixture<WebApplicationFactory<Program>>
154
- {
155
- private readonly HttpClient _client;
156
-
157
- public AuthControllerTests(WebApplicationFactory<Program> factory)
158
- {
159
- _client = factory.CreateClient();
160
- }
161
-
162
- [Fact]
163
- public async Task Login_ValidCredentials_Returns200AndToken()
164
- {
165
- // Arrange
166
- var request = new LoginRequest { Email = "user@test.com", Password = "password" };
167
-
168
- // Act
169
- var response = await _client.PostAsJsonAsync("/api/auth/login", request);
170
-
171
- // Assert
172
- response.EnsureSuccessStatusCode();
173
- var result = await response.Content.ReadFromJsonAsync<AuthResponse>();
174
- Assert.NotNull(result?.Token);
175
- }
176
- }
177
- ```
178
-
179
- ---
180
-
181
- ## E2E Testing
182
-
183
- ### Playwright Example
184
-
185
- ```typescript
186
- import { test, expect } from '@playwright/test';
187
-
188
- test('user can login and access dashboard', async ({ page }) => {
189
- // Navigate to login
190
- await page.goto('/login');
191
-
192
- // Fill credentials
193
- await page.fill('input[name="email"]', 'user@example.com');
194
- await page.fill('input[name="password"]', 'password123');
195
-
196
- // Submit
197
- await page.click('button[type="submit"]');
198
-
199
- // Verify redirect to dashboard
200
- await expect(page).toHaveURL('/dashboard');
201
- await expect(page.locator('h1')).toContainText('Dashboard');
202
- });
203
- ```
204
-
205
- ---
206
-
207
- ## Test Coverage
208
-
209
- ### Targets
210
-
211
- - **Statements**: ≥ 80%
212
- - **Branches**: ≥ 70%
213
- - **Functions**: ≥ 80%
214
- - **Lines**: ≥ 80%
215
-
216
- ### Running Coverage
217
-
218
- ```bash
219
- # .NET
220
- dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
221
-
222
- # JavaScript
223
- npm run test:coverage
224
- ```
225
-
226
- ---
227
-
228
- ## Best Practices
229
-
230
- ### DO
231
-
232
- ✅ Write tests before or with code (TDD)
233
- ✅ Test edge cases (null, empty, invalid input)
234
- ✅ Use descriptive test names
235
- ✅ Keep tests fast (< 1s per unit test)
236
- ✅ Mock external dependencies
237
- ✅ Test one thing per test
238
-
239
- ### DON'T
240
-
241
- ❌ Test implementation details (test behavior)
242
- ❌ Rely on test execution order
243
- ❌ Use real databases in unit tests
244
- ❌ Hardcode magic values (use constants)
245
- ❌ Skip tests (fix or remove)
246
- ❌ Write tests that depend on external services
247
-
248
- ---
249
-
250
- ## Test Fixtures and Cleanup
251
-
252
- ### xUnit
253
-
254
- ```csharp
255
- public class DatabaseFixture : IDisposable
256
- {
257
- public AppDbContext CreateContext()
258
- {
259
- var options = new DbContextOptionsBuilder<AppDbContext>()
260
- .UseInMemoryDatabase($"TestDb_{Guid.NewGuid()}")
261
- .Options;
262
-
263
- return new AppDbContext(options);
264
- }
265
-
266
- public void Dispose()
267
- {
268
- // Cleanup
269
- }
270
- }
271
- ```
272
-
273
- ### Jest
274
-
275
- ```typescript
276
- beforeEach(() => {
277
- // Setup before each test
278
- });
279
-
280
- afterEach(() => {
281
- // Cleanup after each test
282
- });
283
-
284
- beforeAll(() => {
285
- // Setup once before all tests
286
- });
287
-
288
- afterAll(() => {
289
- // Cleanup once after all tests
290
- });
291
- ```
292
-
293
- ---
294
-
295
- *MORPH-SPEC by Polymorphism Tech*
@@ -1,102 +0,0 @@
1
- # Data Standard: Azure Blob Storage
2
-
3
- ## Overview
4
- Object storage for files, images, documents, and large binary data.
5
-
6
- ## Setup
7
- ```xml
8
- <PackageReference Include="Azure.Storage.Blobs" Version="12.*" />
9
- ```
10
-
11
- ```csharp
12
- // Program.cs
13
- builder.Services.AddSingleton(new BlobServiceClient(
14
- new Uri(config["Storage:AccountUrl"]),
15
- new DefaultAzureCredential())); // Managed Identity — no connection string
16
- ```
17
-
18
- ## Service Pattern
19
- ```csharp
20
- public class BlobStorageService : IFileStorageService
21
- {
22
- private readonly BlobContainerClient _container;
23
-
24
- public BlobStorageService(BlobServiceClient client, IConfiguration config)
25
- {
26
- _container = client.GetBlobContainerClient(config["Storage:ContainerName"]);
27
- }
28
-
29
- public async Task<string> UploadAsync(Stream content, string fileName, string contentType)
30
- {
31
- var blobName = $"{DateTime.UtcNow:yyyy/MM/dd}/{Guid.NewGuid()}/{fileName}";
32
- var blob = _container.GetBlobClient(blobName);
33
-
34
- await blob.UploadAsync(content, new BlobHttpHeaders { ContentType = contentType });
35
- return blobName; // Return blob path, not URL
36
- }
37
-
38
- public async Task<Stream> DownloadAsync(string blobName)
39
- {
40
- var blob = _container.GetBlobClient(blobName);
41
- var response = await blob.DownloadAsync();
42
- return response.Value.Content;
43
- }
44
-
45
- public async Task DeleteAsync(string blobName)
46
- {
47
- var blob = _container.GetBlobClient(blobName);
48
- await blob.DeleteIfExistsAsync();
49
- }
50
-
51
- public Uri GenerateSasUrl(string blobName, TimeSpan expiry)
52
- {
53
- var blob = _container.GetBlobClient(blobName);
54
- return blob.GenerateSasUri(BlobSasPermissions.Read, DateTimeOffset.UtcNow.Add(expiry));
55
- }
56
- }
57
- ```
58
-
59
- ## Security Requirements
60
-
61
- ### Always Use Managed Identity
62
- ```csharp
63
- // ✅ Managed Identity — no secrets
64
- new BlobServiceClient(storageUri, new DefaultAzureCredential())
65
-
66
- // ❌ Connection string — avoid
67
- new BlobServiceClient(connectionString)
68
- ```
69
-
70
- ### SAS Tokens for Client Access
71
- ```csharp
72
- // Generate short-lived SAS for client-side uploads
73
- var sasUri = blob.GenerateSasUri(BlobSasPermissions.Write, DateTimeOffset.UtcNow.AddMinutes(15));
74
- // Send SAS URL to client — they upload directly
75
- ```
76
-
77
- ### Container Access Levels
78
- - `Private`: No public access (default for user documents)
79
- - `Blob`: Public read for specific blobs (CDN-served images)
80
- - `Container`: Public read for all blobs (avoid in most cases)
81
-
82
- ## Content Types + Validation
83
- ```csharp
84
- private static readonly HashSet<string> AllowedTypes = ["image/jpeg", "image/png", "application/pdf"];
85
- private const long MaxFileSizeBytes = 10 * 1024 * 1024; // 10 MB
86
-
87
- public async Task<string> UploadValidatedAsync(IFormFile file)
88
- {
89
- if (!AllowedTypes.Contains(file.ContentType))
90
- throw new ValidationException($"File type {file.ContentType} not allowed");
91
- if (file.Length > MaxFileSizeBytes)
92
- throw new ValidationException("File exceeds 10 MB limit");
93
-
94
- return await UploadAsync(file.OpenReadStream(), file.FileName, file.ContentType);
95
- }
96
- ```
97
-
98
- ## Blob Lifecycle (Cost Management)
99
- - Move to Cool tier after 30 days
100
- - Move to Archive tier after 90 days
101
- - Delete after 365 days (unless legal hold)
102
- - Configure via Storage Account Lifecycle Management rules (Bicep)
@@ -1,97 +0,0 @@
1
- # Data Standard: Redis Cache (Azure Cache for Redis)
2
-
3
- ## Overview
4
- Distributed cache for session data, rate limiting, and frequently-read data.
5
-
6
- ## Setup
7
- ```xml
8
- <PackageReference Include="StackExchange.Redis" Version="2.*" />
9
- <PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="9.*" />
10
- ```
11
-
12
- ```csharp
13
- // Program.cs
14
- builder.Services.AddStackExchangeRedisCache(opts =>
15
- {
16
- opts.Configuration = config["Redis:ConnectionString"]; // from Key Vault
17
- opts.InstanceName = "myapp:"; // Prefix to avoid key collisions
18
- });
19
- ```
20
-
21
- ## Cache-Aside Pattern
22
- ```csharp
23
- public class CachedProductService : IProductService
24
- {
25
- private readonly IDistributedCache _cache;
26
- private readonly IProductRepository _repository;
27
-
28
- public async Task<Product?> GetAsync(Guid id, CancellationToken ct = default)
29
- {
30
- var cacheKey = $"product:{id}";
31
-
32
- // Try cache first
33
- var cached = await _cache.GetStringAsync(cacheKey, ct);
34
- if (cached != null)
35
- return JsonSerializer.Deserialize<Product>(cached);
36
-
37
- // Cache miss → read from DB
38
- var product = await _repository.GetAsync(id, ct);
39
- if (product == null) return null;
40
-
41
- // Cache with TTL
42
- await _cache.SetStringAsync(cacheKey,
43
- JsonSerializer.Serialize(product),
44
- new DistributedCacheEntryOptions
45
- {
46
- AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(15),
47
- SlidingExpiration = TimeSpan.FromMinutes(5)
48
- }, ct);
49
-
50
- return product;
51
- }
52
-
53
- public async Task InvalidateAsync(Guid id, CancellationToken ct = default)
54
- => await _cache.RemoveAsync($"product:{id}", ct);
55
- }
56
- ```
57
-
58
- ## TTL Strategy
59
- | Data Type | TTL | Rationale |
60
- |-----------|-----|-----------|
61
- | User session | 30 min sliding | Active session window |
62
- | Product catalog | 15 min absolute | Inventory changes |
63
- | Rate limit counters | 1 min | Per-minute limiting |
64
- | Computed aggregates | 1 hour | Expensive query results |
65
- | Reference data | 24 hours | Config rarely changes |
66
-
67
- ## Key Naming Convention
68
- ```
69
- {service}:{entity}:{id}
70
- {service}:{entity}:list:{filter}
71
- {service}:ratelimit:{userId}:{endpoint}
72
-
73
- Examples:
74
- product:detail:550e8400-e29b-41d4-a716
75
- product:list:category:electronics
76
- auth:ratelimit:user123:login
77
- ```
78
-
79
- ## Rate Limiting Pattern
80
- ```csharp
81
- public async Task<bool> IsRateLimitedAsync(string userId, string action, int maxPerMinute)
82
- {
83
- var key = $"ratelimit:{action}:{userId}:{DateTime.UtcNow:yyyyMMddHHmm}";
84
- var db = _redis.GetDatabase();
85
-
86
- var count = await db.StringIncrementAsync(key);
87
- if (count == 1) await db.KeyExpireAsync(key, TimeSpan.FromMinutes(1));
88
-
89
- return count > maxPerMinute;
90
- }
91
- ```
92
-
93
- ## Anti-Patterns
94
- - Never cache sensitive data (passwords, tokens, PII) without encryption
95
- - Never use Redis as primary store — it's a cache, not a database
96
- - Never omit TTL — unbounded keys fill memory
97
- - Never catch RedisException silently — degrade gracefully to DB
@@ -1,118 +0,0 @@
1
- # Data Standard: Azure Cosmos DB
2
-
3
- ## Overview
4
- NoSQL document database — use for high-throughput, globally distributed, or schema-flexible data.
5
-
6
- ## When to Use Cosmos DB
7
- ✅ Event store (append-only, high write throughput)
8
- ✅ User activity/session data (variable schema)
9
- ✅ Multi-region writes required
10
- ✅ JSON documents with flexible schema
11
- ❌ Relational data with complex joins (use Azure SQL)
12
- ❌ Small datasets (cost inefficient)
13
-
14
- ## Container Design
15
- ```json
16
- {
17
- "partitionKey": "/tenantId",
18
- "indexingPolicy": {
19
- "includedPaths": [{ "path": "/*" }],
20
- "excludedPaths": [
21
- { "path": "/largePayload/*" },
22
- { "path": "/_etag/?" }
23
- ]
24
- }
25
- }
26
- ```
27
-
28
- ### Partition Key Strategy
29
- - High cardinality: userId, tenantId, orderId
30
- - Even distribution: avoid hot partitions (e.g., /status = "active" for 90% of docs)
31
- - Query alignment: partition key should appear in most queries
32
-
33
- ## SDK Setup
34
- ```csharp
35
- // Program.cs
36
- builder.Services.AddSingleton(sp =>
37
- new CosmosClient(
38
- config["CosmosDb:ConnectionString"],
39
- new CosmosClientOptions
40
- {
41
- SerializerOptions = new CosmosSerializationOptions
42
- {
43
- PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase
44
- },
45
- ApplicationName = "MyApp"
46
- }));
47
-
48
- builder.Services.AddSingleton<ICosmosRepository<Order>>(sp =>
49
- new CosmosRepository<Order>(
50
- sp.GetRequiredService<CosmosClient>(),
51
- config["CosmosDb:DatabaseId"],
52
- "orders"));
53
- ```
54
-
55
- ## Repository Pattern
56
- ```csharp
57
- public class CosmosRepository<T> where T : CosmosDocument
58
- {
59
- private readonly Container _container;
60
-
61
- public async Task<T?> GetAsync(string id, string partitionKey)
62
- {
63
- try
64
- {
65
- var response = await _container.ReadItemAsync<T>(id, new PartitionKey(partitionKey));
66
- return response.Resource;
67
- }
68
- catch (CosmosException ex) when (ex.StatusCode == HttpStatusCode.NotFound)
69
- {
70
- return null;
71
- }
72
- }
73
-
74
- public async Task<IReadOnlyList<T>> QueryAsync(string sql, Dictionary<string, object>? parameters = null)
75
- {
76
- var query = new QueryDefinition(sql);
77
- if (parameters != null)
78
- foreach (var (k, v) in parameters) query = query.WithParameter(k, v);
79
-
80
- var results = new List<T>();
81
- using var feed = _container.GetItemQueryIterator<T>(query);
82
- while (feed.HasMoreResults)
83
- {
84
- var page = await feed.ReadNextAsync();
85
- results.AddRange(page);
86
- }
87
- return results;
88
- }
89
-
90
- public async Task UpsertAsync(T document)
91
- => await _container.UpsertItemAsync(document, new PartitionKey(document.PartitionKey));
92
- }
93
- ```
94
-
95
- ## Document Base Class
96
- ```csharp
97
- public abstract class CosmosDocument
98
- {
99
- [JsonPropertyName("id")]
100
- public string Id { get; set; } = Guid.NewGuid().ToString();
101
-
102
- [JsonPropertyName("_partitionKey")]
103
- public abstract string PartitionKey { get; }
104
-
105
- [JsonPropertyName("type")]
106
- public string Type => GetType().Name;
107
-
108
- [JsonPropertyName("createdAt")]
109
- public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
110
- }
111
- ```
112
-
113
- ## Cost Optimization
114
- - Enable TTL on transient data (session, temp tokens)
115
- - Use serverless mode for dev/test environments
116
- - Index only queried paths (exclude large blobs)
117
- - Batch operations with TransactionalBatch for same partition
118
- - Use bulk execution for large imports