@polymorphism-tech/morph-spec 4.3.2 → 4.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (414) hide show
  1. package/.morph/analytics/threads-log.jsonl +9 -0
  2. package/{stacks/blazor-azure/.morph → .morph}/config/config.json +9 -9
  3. package/.morph/state.json +48 -0
  4. package/bin/detect-agents.js +1 -2
  5. package/bin/morph-spec.js +2 -15
  6. package/{stacks/nextjs-supabase/.morph/config → framework}/agents.json +948 -948
  7. package/{stacks/nextjs-supabase/.claude → framework}/commands/morph-infra.md +1 -1
  8. package/framework/hooks/README.md +282 -0
  9. package/framework/hooks/agent-stop/validate-and-continue.js +96 -0
  10. package/framework/hooks/agent-stop/validate-checkpoints.js +101 -0
  11. package/framework/hooks/agent-stop/validate-tests.js +109 -0
  12. package/framework/hooks/agent-teams/dispatch.js +67 -0
  13. package/framework/hooks/agent-teams/phase-advanced.js +80 -0
  14. package/framework/hooks/agent-teams/task-completed.js +76 -0
  15. package/framework/hooks/agent-teams/teammate-idle.js +70 -0
  16. package/framework/hooks/commit-msg/conventional-commits.sh +33 -0
  17. package/framework/hooks/pre-commit/agents.sh +25 -0
  18. package/framework/hooks/pre-commit/orchestrator.sh +64 -0
  19. package/framework/hooks/pre-commit/specs.sh +50 -0
  20. package/framework/hooks/pre-push/run-tests.sh +44 -0
  21. package/framework/index/troubleshooting-index.json +184 -0
  22. package/framework/memory/patterns-learned.md +766 -0
  23. package/framework/skills/level-0-meta/README.md +7 -0
  24. package/framework/skills/level-0-meta/code-review.md +226 -0
  25. package/framework/skills/level-0-meta/morph-checklist.md +117 -0
  26. package/framework/skills/level-0-meta/simulation-checklist.md +77 -0
  27. package/framework/skills/level-1-workflows/README.md +7 -0
  28. package/framework/skills/level-1-workflows/morph-replicate.md +213 -0
  29. package/framework/skills/level-1-workflows/phase-clarify.md +131 -0
  30. package/framework/skills/level-1-workflows/phase-design.md +213 -0
  31. package/framework/skills/level-1-workflows/phase-setup.md +106 -0
  32. package/framework/skills/level-1-workflows/phase-tasks.md +164 -0
  33. package/framework/skills/level-1-workflows/phase-uiux.md +169 -0
  34. package/framework/skills/level-2-domains/README.md +14 -0
  35. package/framework/skills/level-2-domains/ai-agents/ai-system-architect.md +192 -0
  36. package/framework/skills/level-2-domains/architecture/po-pm-advisor.md +197 -0
  37. package/framework/skills/level-2-domains/architecture/prompt-engineer.md +189 -0
  38. package/framework/skills/level-2-domains/architecture/seo-growth-hacker.md +320 -0
  39. package/framework/skills/level-2-domains/architecture/standards-architect.md +156 -0
  40. package/framework/skills/level-2-domains/backend/api-designer.md +59 -0
  41. package/framework/skills/level-2-domains/backend/dotnet-senior.md +77 -0
  42. package/framework/skills/level-2-domains/backend/ef-modeler.md +58 -0
  43. package/framework/skills/level-2-domains/backend/hangfire-orchestrator.md +126 -0
  44. package/framework/skills/level-2-domains/backend/ms-agent-expert.md +45 -0
  45. package/framework/skills/level-2-domains/frontend/blazor-builder.md +210 -0
  46. package/framework/skills/level-2-domains/frontend/nextjs-expert.md +154 -0
  47. package/framework/skills/level-2-domains/frontend/ui-ux-designer.md +191 -0
  48. package/framework/skills/level-2-domains/infrastructure/azure-architect.md +142 -0
  49. package/framework/skills/level-2-domains/infrastructure/azure-deploy-specialist.md +699 -0
  50. package/framework/skills/level-2-domains/infrastructure/bicep-architect.md +126 -0
  51. package/framework/skills/level-2-domains/infrastructure/container-specialist.md +131 -0
  52. package/framework/skills/level-2-domains/infrastructure/devops-engineer.md +119 -0
  53. package/framework/skills/level-2-domains/integrations/asaas-financial.md +130 -0
  54. package/framework/skills/level-2-domains/integrations/azure-identity.md +142 -0
  55. package/framework/skills/level-2-domains/integrations/clerk-auth.md +108 -0
  56. package/framework/skills/level-2-domains/integrations/hangfire-orchestrator.md +64 -0
  57. package/framework/skills/level-2-domains/integrations/resend-email.md +119 -0
  58. package/framework/skills/level-2-domains/quality/code-analyzer.md +235 -0
  59. package/framework/skills/level-2-domains/quality/testing-specialist.md +126 -0
  60. package/framework/skills/level-3-technologies/README.md +7 -0
  61. package/framework/skills/level-4-patterns/README.md +7 -0
  62. package/framework/squad-templates/backend-only.json +34 -0
  63. package/framework/squad-templates/frontend-only.json +34 -0
  64. package/framework/squad-templates/full-stack.json +52 -0
  65. package/framework/templates/.idea/morph-templates.xml +92 -0
  66. package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
  67. package/framework/templates/IDE-SNIPPETS.md +266 -0
  68. package/framework/templates/README.md +814 -0
  69. package/framework/templates/REGISTRY.json +1677 -0
  70. package/framework/templates/code/dotnet/backend/repository.cs +141 -0
  71. package/framework/templates/code/dotnet/backend/service.cs +139 -0
  72. package/framework/templates/code/dotnet/contracts/Commands.cs +74 -0
  73. package/framework/templates/code/dotnet/contracts/Entities.cs +25 -0
  74. package/framework/templates/code/dotnet/contracts/Queries.cs +74 -0
  75. package/framework/templates/code/dotnet/contracts/README.md +74 -0
  76. package/framework/templates/code/dotnet/contracts/api-contracts.cs +173 -0
  77. package/framework/templates/code/dotnet/contracts/contracts.cs +217 -0
  78. package/framework/templates/code/dotnet/database/migration.cs +83 -0
  79. package/framework/templates/code/dotnet/frontend/component.razor +239 -0
  80. package/framework/templates/code/dotnet/jobs/agent.cs +163 -0
  81. package/framework/templates/code/dotnet/jobs/job.cs +171 -0
  82. package/framework/templates/code/dotnet/test.cs +239 -0
  83. package/framework/templates/code/sql/rls-policy.sql +57 -0
  84. package/framework/templates/code/sql/supabase-migration.sql +100 -0
  85. package/framework/templates/code/sql/supabase-migration.template.sql +113 -0
  86. package/framework/templates/code/typescript/contracts.ts +168 -0
  87. package/framework/templates/context/CONTEXT-FEATURE.md +276 -0
  88. package/framework/templates/context/CONTEXT.md +181 -0
  89. package/framework/templates/docs/proposal.md +182 -0
  90. package/framework/templates/docs/spec.md +149 -0
  91. package/framework/templates/examples/design-system-examples.md +357 -0
  92. package/framework/templates/examples/spec-examples.md +90 -0
  93. package/framework/templates/feature/decisions.md +187 -0
  94. package/framework/templates/feature/recap.md +146 -0
  95. package/framework/templates/feature/tasks.md +199 -0
  96. package/framework/templates/infrastructure/azure/Dockerfile.example +82 -0
  97. package/framework/templates/infrastructure/azure/README.md +286 -0
  98. package/framework/templates/infrastructure/azure/app-insights.bicep +63 -0
  99. package/framework/templates/infrastructure/azure/app-service.bicep +164 -0
  100. package/framework/templates/infrastructure/azure/container-app-env.bicep +49 -0
  101. package/framework/templates/infrastructure/azure/container-app.bicep +156 -0
  102. package/framework/templates/infrastructure/azure/deploy-checklist.md +426 -0
  103. package/framework/templates/infrastructure/azure/deploy.ps1 +229 -0
  104. package/framework/templates/infrastructure/azure/deploy.sh +208 -0
  105. package/framework/templates/infrastructure/azure/key-vault.bicep +91 -0
  106. package/framework/templates/infrastructure/azure/main.bicep +189 -0
  107. package/framework/templates/infrastructure/azure/parameters.dev.json +29 -0
  108. package/framework/templates/infrastructure/azure/parameters.prod.json +29 -0
  109. package/framework/templates/infrastructure/azure/parameters.staging.json +29 -0
  110. package/framework/templates/infrastructure/azure/sql-database.bicep +103 -0
  111. package/framework/templates/infrastructure/azure/storage.bicep +106 -0
  112. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -0
  113. package/framework/templates/infrastructure/docker/docker-compose.template.yml +67 -0
  114. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -0
  115. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -0
  116. package/framework/templates/infrastructure/docker/easypanel.template.json +54 -0
  117. package/framework/templates/infrastructure/github/README.md +593 -0
  118. package/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +22 -0
  119. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -0
  120. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -0
  121. package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +61 -0
  122. package/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +31 -0
  123. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -0
  124. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -0
  125. package/framework/templates/integrations/asaas-client.cs +387 -0
  126. package/framework/templates/integrations/asaas-webhook.cs +351 -0
  127. package/framework/templates/integrations/azure-identity-config.cs +288 -0
  128. package/framework/templates/integrations/clerk-config.cs +258 -0
  129. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -0
  130. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -0
  131. package/framework/templates/meta-prompts/hops/hop-retry.md +78 -0
  132. package/framework/templates/meta-prompts/hops/hop-validation.md +97 -0
  133. package/framework/templates/meta-prompts/hops/hop-wrapper.md +36 -0
  134. package/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +113 -0
  135. package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +80 -0
  136. package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +90 -0
  137. package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +126 -0
  138. package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +43 -0
  139. package/framework/templates/meta-prompts/validators/checkpoint-validator.md +107 -0
  140. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -0
  141. package/framework/templates/saas/subscription.cs +347 -0
  142. package/framework/templates/saas/tenant.cs +338 -0
  143. package/framework/templates/state.template.json +17 -0
  144. package/framework/templates/ui/FluentDesignTheme.cs +149 -0
  145. package/framework/templates/ui/MudTheme.cs +281 -0
  146. package/framework/templates/ui/design-system.css +226 -0
  147. package/framework/workflows/README.md +1041 -0
  148. package/framework/workflows/configs/design-impl.json +49 -0
  149. package/framework/workflows/configs/fast-track.json +42 -0
  150. package/framework/workflows/configs/full-morph.json +79 -0
  151. package/framework/workflows/configs/fusion.json +39 -0
  152. package/framework/workflows/configs/long-running.json +33 -0
  153. package/framework/workflows/configs/standard.json +60 -0
  154. package/framework/workflows/configs/ui-refresh.json +49 -0
  155. package/framework/workflows/configs/zero-touch.json +75 -0
  156. package/framework/workflows/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -0
  157. package/framework/workflows/docs/design-impl.md +37 -0
  158. package/framework/workflows/docs/enforcement-pipeline.md +668 -0
  159. package/framework/workflows/docs/fast-track.md +29 -0
  160. package/framework/workflows/docs/full-morph.md +76 -0
  161. package/framework/workflows/docs/standard.md +44 -0
  162. package/framework/workflows/docs/ui-refresh.md +39 -0
  163. package/package.json +3 -3
  164. package/src/commands/feature/create-story.js +11 -7
  165. package/src/commands/project/detect-agents.js +1 -2
  166. package/src/commands/project/init.js +78 -31
  167. package/src/commands/project/update.js +9 -5
  168. package/src/commands/templates/template-customize.js +3 -17
  169. package/src/commands/templates/template-list.js +1 -15
  170. package/src/commands/templates/template-render.js +2 -3
  171. package/src/commands/templates/template-show.js +3 -5
  172. package/src/core/templates/template-registry.js +9 -23
  173. package/src/lib/detectors/structure-detector.js +3 -3
  174. package/src/lib/generators/context-generator.js +18 -6
  175. package/src/lib/hooks/hook-executor.js +0 -2
  176. package/src/lib/orchestration/team-orchestrator.js +1 -2
  177. package/src/lib/standards/standards-context-injector.js +3 -4
  178. package/src/lib/troubleshooting/troubleshoot-grep.js +3 -9
  179. package/src/lib/validators/validation-runner.js +1 -2
  180. package/src/utils/file-copier.js +1 -2
  181. package/docs/README.md +0 -144
  182. package/docs/api/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  183. package/docs/api/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  184. package/docs/api/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  185. package/docs/api/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  186. package/docs/api/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  187. package/docs/api/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  188. package/docs/api/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  189. package/docs/api/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  190. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  191. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +0 -978
  192. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  193. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  194. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  195. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  196. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +0 -1049
  197. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  198. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  199. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  200. package/docs/api/scripts/collapse.js +0 -39
  201. package/docs/api/scripts/commonNav.js +0 -28
  202. package/docs/api/scripts/linenumber.js +0 -25
  203. package/docs/api/scripts/nav.js +0 -12
  204. package/docs/api/scripts/polyfill.js +0 -4
  205. package/docs/api/scripts/prettify/Apache-License-2.0.txt +0 -202
  206. package/docs/api/scripts/prettify/lang-css.js +0 -2
  207. package/docs/api/scripts/prettify/prettify.js +0 -28
  208. package/docs/api/scripts/search.js +0 -99
  209. package/docs/api/styles/jsdoc.css +0 -776
  210. package/docs/api/styles/prettify.css +0 -80
  211. package/docs/cli-auto-detection.md +0 -219
  212. package/docs/getting-started.md +0 -296
  213. package/docs/installation.md +0 -361
  214. package/docs/next-generation/AGENTS.md +0 -521
  215. package/docs/next-generation/ANALYSIS.md +0 -555
  216. package/docs/next-generation/ARCHITECTURE.md +0 -436
  217. package/docs/next-generation/CONTEXT-OPTIMIZATION.md +0 -267
  218. package/docs/next-generation/EXECUTION-FLOW.md +0 -274
  219. package/docs/next-generation/FEATURES.md +0 -688
  220. package/docs/next-generation/META-PROMPTS.md +0 -235
  221. package/docs/next-generation/MIGRATION-GUIDE.md +0 -253
  222. package/docs/next-generation/README.md +0 -231
  223. package/docs/next-generation/ROADMAP.md +0 -801
  224. package/docs/next-generation/THREAD-MANAGEMENT.md +0 -240
  225. package/docs/templates.md +0 -418
  226. package/docs/troubleshooting.md +0 -269
  227. package/docs/validation-checklist.md +0 -264
  228. package/scripts/postinstall.js +0 -132
  229. package/src/lib/stacks/index.js +0 -7
  230. package/src/lib/stacks/stack-resolver.js +0 -180
  231. package/stacks/blazor-azure/.claude/commands/morph-deploy.md +0 -529
  232. package/stacks/blazor-azure/.claude/commands/morph-infra.md +0 -209
  233. package/stacks/blazor-azure/.morph/.morphversion +0 -5
  234. package/stacks/blazor-azure/.morph/archive/.gitkeep +0 -25
  235. package/stacks/blazor-azure/.morph/config/agents.json +0 -948
  236. package/stacks/blazor-azure/.morph/config/config.template.json +0 -122
  237. package/stacks/blazor-azure/.morph/features/.gitkeep +0 -25
  238. package/stacks/blazor-azure/.morph/hooks/pre-commit/tests-csharp.sh +0 -61
  239. package/stacks/blazor-azure/.morph/project/context/README.md +0 -17
  240. package/stacks/blazor-azure/.morph/project.md +0 -160
  241. package/stacks/blazor-azure/.morph/schemas/agent.schema.json +0 -296
  242. package/stacks/blazor-azure/.morph/schemas/tasks.schema.json +0 -220
  243. package/stacks/blazor-azure/.morph/specs/.gitkeep +0 -20
  244. package/stacks/blazor-azure/.morph/state.json +0 -18
  245. package/stacks/blazor-azure/.morph/test-infra/example.bicep +0 -59
  246. package/stacks/blazor-azure/CLAUDE.md +0 -155
  247. package/stacks/blazor-azure/README.md +0 -79
  248. package/stacks/nextjs-supabase/.claude/commands/morph-apply.md +0 -221
  249. package/stacks/nextjs-supabase/.claude/commands/morph-archive.md +0 -79
  250. package/stacks/nextjs-supabase/.claude/commands/morph-deploy.md +0 -529
  251. package/stacks/nextjs-supabase/.claude/commands/morph-preflight.md +0 -227
  252. package/stacks/nextjs-supabase/.claude/commands/morph-proposal.md +0 -122
  253. package/stacks/nextjs-supabase/.claude/commands/morph-status.md +0 -86
  254. package/stacks/nextjs-supabase/.claude/commands/morph-troubleshoot.md +0 -122
  255. package/stacks/nextjs-supabase/.morph/.morphversion +0 -5
  256. package/stacks/nextjs-supabase/.morph/config/config.json +0 -9
  257. package/stacks/nextjs-supabase/.morph/config/config.template.json +0 -92
  258. package/stacks/nextjs-supabase/.morph/hooks/pre-commit/tests-typescript.sh +0 -61
  259. package/stacks/nextjs-supabase/.morph/project/context/README.md +0 -17
  260. package/stacks/nextjs-supabase/.morph/project.md +0 -168
  261. package/stacks/nextjs-supabase/.morph/standards/ai-agents/blazor-ui.md +0 -364
  262. package/stacks/nextjs-supabase/.morph/standards/ai-agents/production.md +0 -415
  263. package/stacks/nextjs-supabase/.morph/standards/ai-agents/setup.md +0 -418
  264. package/stacks/nextjs-supabase/.morph/standards/ai-agents/team-orchestration.md +0 -479
  265. package/stacks/nextjs-supabase/.morph/standards/ai-agents/workflows.md +0 -354
  266. package/stacks/nextjs-supabase/.morph/standards/architecture/ddd/aggregates.md +0 -120
  267. package/stacks/nextjs-supabase/.morph/standards/architecture/ddd/entities.md +0 -99
  268. package/stacks/nextjs-supabase/.morph/standards/architecture/ddd/value-objects.md +0 -124
  269. package/stacks/nextjs-supabase/.morph/standards/backend/api/minimal-api.md +0 -494
  270. package/stacks/nextjs-supabase/.morph/standards/backend/api/rest.md +0 -492
  271. package/stacks/nextjs-supabase/.morph/standards/backend/api/validation.md +0 -88
  272. package/stacks/nextjs-supabase/.morph/standards/backend/authentication/passkeys.md +0 -428
  273. package/stacks/nextjs-supabase/.morph/standards/backend/database/ef-core.md +0 -199
  274. package/stacks/nextjs-supabase/.morph/standards/backend/database/migrations.md +0 -393
  275. package/stacks/nextjs-supabase/.morph/standards/backend/database/postgresql/database.md +0 -352
  276. package/stacks/nextjs-supabase/.morph/standards/backend/database/repository-patterns.md +0 -528
  277. package/stacks/nextjs-supabase/.morph/standards/backend/database/vector-search-rag.md +0 -541
  278. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/async.md +0 -366
  279. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/core.md +0 -117
  280. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/di.md +0 -439
  281. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/program-cs-checklist.md +0 -92
  282. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/asaas/asaas-api.md +0 -216
  283. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/clerk/clerk-auth.md +0 -290
  284. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
  285. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/resend/resend-email.md +0 -385
  286. package/stacks/nextjs-supabase/.morph/standards/context/analytics.md +0 -96
  287. package/stacks/nextjs-supabase/.morph/standards/context/bundles.md +0 -110
  288. package/stacks/nextjs-supabase/.morph/standards/context/priming.md +0 -78
  289. package/stacks/nextjs-supabase/.morph/standards/core/architecture.md +0 -185
  290. package/stacks/nextjs-supabase/.morph/standards/core/coding.md +0 -214
  291. package/stacks/nextjs-supabase/.morph/standards/core/git-branching-strategy.md +0 -403
  292. package/stacks/nextjs-supabase/.morph/standards/core/git.md +0 -185
  293. package/stacks/nextjs-supabase/.morph/standards/core/testing.md +0 -295
  294. package/stacks/nextjs-supabase/.morph/standards/data/nosql/blob-storage.md +0 -102
  295. package/stacks/nextjs-supabase/.morph/standards/data/nosql/cache/redis.md +0 -97
  296. package/stacks/nextjs-supabase/.morph/standards/data/nosql/cosmos-db.md +0 -118
  297. package/stacks/nextjs-supabase/.morph/standards/data/vector-search/azure-ai-search.md +0 -121
  298. package/stacks/nextjs-supabase/.morph/standards/data/vector-search/rag-chunking.md +0 -104
  299. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/design-checklist.md +0 -222
  300. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/fluent-ui-setup.md +0 -595
  301. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/fluent-ui.md +0 -137
  302. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/html-conversion.md +0 -184
  303. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/lifecycle.md +0 -195
  304. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/pitfalls.md +0 -198
  305. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/state.md +0 -191
  306. package/stacks/nextjs-supabase/.morph/standards/frontend/design-system/animations.md +0 -151
  307. package/stacks/nextjs-supabase/.morph/standards/frontend/design-system/naming.md +0 -64
  308. package/stacks/nextjs-supabase/.morph/standards/frontend/nextjs/nextjs-patterns.md +0 -198
  309. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/azure.md +0 -624
  310. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
  311. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
  312. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/devops/local-development.md +0 -520
  313. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/services/functions.md +0 -486
  314. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/services/service-bus.md +0 -459
  315. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/services/storage.md +0 -407
  316. package/stacks/nextjs-supabase/.morph/standards/infrastructure/docker/easypanel-deploy.md +0 -196
  317. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/mcp-setup.md +0 -252
  318. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-auth.md +0 -176
  319. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
  320. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-rls.md +0 -184
  321. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-storage.md +0 -153
  322. package/stacks/nextjs-supabase/.morph/standards/integration/api/graphql.md +0 -91
  323. package/stacks/nextjs-supabase/.morph/standards/integration/api/grpc.md +0 -114
  324. package/stacks/nextjs-supabase/.morph/standards/integration/api/rest-design.md +0 -95
  325. package/stacks/nextjs-supabase/.morph/standards/integration/event-driven/cqrs.md +0 -101
  326. package/stacks/nextjs-supabase/.morph/standards/integration/event-driven/event-sourcing.md +0 -124
  327. package/stacks/nextjs-supabase/.morph/standards/integration/event-driven/service-bus.md +0 -95
  328. package/stacks/nextjs-supabase/.morph/standards/observability/logging.md +0 -131
  329. package/stacks/nextjs-supabase/.morph/standards/observability/metrics.md +0 -121
  330. package/stacks/nextjs-supabase/.morph/standards/observability/monitoring.md +0 -114
  331. package/stacks/nextjs-supabase/.morph/standards/observability/tracing.md +0 -132
  332. package/stacks/nextjs-supabase/.morph/standards/workflows/parallel-execution.md +0 -112
  333. package/stacks/nextjs-supabase/.morph/standards/workflows/thread-management.md +0 -113
  334. package/stacks/nextjs-supabase/CLAUDE.md +0 -155
  335. package/stacks/nextjs-supabase/README.md +0 -103
  336. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-apply.md +0 -0
  337. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-archive.md +0 -0
  338. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-preflight.md +0 -0
  339. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-proposal.md +0 -0
  340. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-status.md +0 -0
  341. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-troubleshoot.md +0 -0
  342. /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/blazor-ui.md +0 -0
  343. /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/production.md +0 -0
  344. /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/setup.md +0 -0
  345. /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/team-orchestration.md +0 -0
  346. /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/workflows.md +0 -0
  347. /package/{stacks/blazor-azure/.morph → framework}/standards/architecture/ddd/aggregates.md +0 -0
  348. /package/{stacks/blazor-azure/.morph → framework}/standards/architecture/ddd/entities.md +0 -0
  349. /package/{stacks/blazor-azure/.morph → framework}/standards/architecture/ddd/value-objects.md +0 -0
  350. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/api/minimal-api.md +0 -0
  351. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/api/rest.md +0 -0
  352. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/api/validation.md +0 -0
  353. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/authentication/passkeys.md +0 -0
  354. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/ef-core.md +0 -0
  355. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/migrations.md +0 -0
  356. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/postgresql/database.md +0 -0
  357. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/repository-patterns.md +0 -0
  358. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/vector-search-rag.md +0 -0
  359. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/async.md +0 -0
  360. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/core.md +0 -0
  361. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/di.md +0 -0
  362. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/program-cs-checklist.md +0 -0
  363. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/asaas/asaas-api.md +0 -0
  364. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/clerk/clerk-auth.md +0 -0
  365. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -0
  366. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/resend/resend-email.md +0 -0
  367. /package/{stacks/blazor-azure/.morph → framework}/standards/context/analytics.md +0 -0
  368. /package/{stacks/blazor-azure/.morph → framework}/standards/context/bundles.md +0 -0
  369. /package/{stacks/blazor-azure/.morph → framework}/standards/context/priming.md +0 -0
  370. /package/{stacks/blazor-azure/.morph → framework}/standards/core/architecture.md +0 -0
  371. /package/{stacks/blazor-azure/.morph → framework}/standards/core/coding.md +0 -0
  372. /package/{stacks/blazor-azure/.morph → framework}/standards/core/git-branching-strategy.md +0 -0
  373. /package/{stacks/blazor-azure/.morph → framework}/standards/core/git.md +0 -0
  374. /package/{stacks/blazor-azure/.morph → framework}/standards/core/testing.md +0 -0
  375. /package/{stacks/blazor-azure/.morph → framework}/standards/data/nosql/blob-storage.md +0 -0
  376. /package/{stacks/blazor-azure/.morph → framework}/standards/data/nosql/cache/redis.md +0 -0
  377. /package/{stacks/blazor-azure/.morph → framework}/standards/data/nosql/cosmos-db.md +0 -0
  378. /package/{stacks/blazor-azure/.morph → framework}/standards/data/vector-search/azure-ai-search.md +0 -0
  379. /package/{stacks/blazor-azure/.morph → framework}/standards/data/vector-search/rag-chunking.md +0 -0
  380. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/design-checklist.md +0 -0
  381. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/fluent-ui-setup.md +0 -0
  382. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/fluent-ui.md +0 -0
  383. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/html-conversion.md +0 -0
  384. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/lifecycle.md +0 -0
  385. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/pitfalls.md +0 -0
  386. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/state.md +0 -0
  387. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/design-system/animations.md +0 -0
  388. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/design-system/naming.md +0 -0
  389. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/nextjs/nextjs-patterns.md +0 -0
  390. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/azure.md +0 -0
  391. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -0
  392. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -0
  393. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/devops/local-development.md +0 -0
  394. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/services/functions.md +0 -0
  395. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/services/service-bus.md +0 -0
  396. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/services/storage.md +0 -0
  397. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/docker/easypanel-deploy.md +0 -0
  398. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/mcp-setup.md +0 -0
  399. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-auth.md +0 -0
  400. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-pgvector.md +0 -0
  401. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-rls.md +0 -0
  402. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-storage.md +0 -0
  403. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/api/graphql.md +0 -0
  404. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/api/grpc.md +0 -0
  405. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/api/rest-design.md +0 -0
  406. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/event-driven/cqrs.md +0 -0
  407. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/event-driven/event-sourcing.md +0 -0
  408. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/event-driven/service-bus.md +0 -0
  409. /package/{stacks/blazor-azure/.morph → framework}/standards/observability/logging.md +0 -0
  410. /package/{stacks/blazor-azure/.morph → framework}/standards/observability/metrics.md +0 -0
  411. /package/{stacks/blazor-azure/.morph → framework}/standards/observability/monitoring.md +0 -0
  412. /package/{stacks/blazor-azure/.morph → framework}/standards/observability/tracing.md +0 -0
  413. /package/{stacks/blazor-azure/.morph → framework}/standards/workflows/parallel-execution.md +0 -0
  414. /package/{stacks/blazor-azure/.morph → framework}/standards/workflows/thread-management.md +0 -0
@@ -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