@polymorphism-tech/morph-spec 4.3.3 → 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 (401) 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/blazor-azure/.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 +69 -32
  167. package/src/commands/project/update.js +2 -2
  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/project/context/README.md +0 -17
  235. package/stacks/blazor-azure/CLAUDE.md +0 -155
  236. package/stacks/blazor-azure/README.md +0 -79
  237. package/stacks/nextjs-supabase/.claude/commands/morph-apply.md +0 -221
  238. package/stacks/nextjs-supabase/.claude/commands/morph-archive.md +0 -79
  239. package/stacks/nextjs-supabase/.claude/commands/morph-deploy.md +0 -529
  240. package/stacks/nextjs-supabase/.claude/commands/morph-preflight.md +0 -227
  241. package/stacks/nextjs-supabase/.claude/commands/morph-proposal.md +0 -122
  242. package/stacks/nextjs-supabase/.claude/commands/morph-status.md +0 -86
  243. package/stacks/nextjs-supabase/.claude/commands/morph-troubleshoot.md +0 -122
  244. package/stacks/nextjs-supabase/.morph/.morphversion +0 -5
  245. package/stacks/nextjs-supabase/.morph/config/agents.json +0 -345
  246. package/stacks/nextjs-supabase/.morph/config/config.json +0 -9
  247. package/stacks/nextjs-supabase/.morph/project/context/README.md +0 -17
  248. package/stacks/nextjs-supabase/.morph/standards/ai-agents/blazor-ui.md +0 -364
  249. package/stacks/nextjs-supabase/.morph/standards/ai-agents/production.md +0 -415
  250. package/stacks/nextjs-supabase/.morph/standards/ai-agents/setup.md +0 -418
  251. package/stacks/nextjs-supabase/.morph/standards/ai-agents/team-orchestration.md +0 -479
  252. package/stacks/nextjs-supabase/.morph/standards/ai-agents/workflows.md +0 -354
  253. package/stacks/nextjs-supabase/.morph/standards/architecture/ddd/aggregates.md +0 -120
  254. package/stacks/nextjs-supabase/.morph/standards/architecture/ddd/entities.md +0 -99
  255. package/stacks/nextjs-supabase/.morph/standards/architecture/ddd/value-objects.md +0 -124
  256. package/stacks/nextjs-supabase/.morph/standards/backend/api/minimal-api.md +0 -494
  257. package/stacks/nextjs-supabase/.morph/standards/backend/api/rest.md +0 -492
  258. package/stacks/nextjs-supabase/.morph/standards/backend/api/validation.md +0 -88
  259. package/stacks/nextjs-supabase/.morph/standards/backend/authentication/passkeys.md +0 -428
  260. package/stacks/nextjs-supabase/.morph/standards/backend/database/ef-core.md +0 -199
  261. package/stacks/nextjs-supabase/.morph/standards/backend/database/migrations.md +0 -393
  262. package/stacks/nextjs-supabase/.morph/standards/backend/database/postgresql/database.md +0 -352
  263. package/stacks/nextjs-supabase/.morph/standards/backend/database/repository-patterns.md +0 -528
  264. package/stacks/nextjs-supabase/.morph/standards/backend/database/vector-search-rag.md +0 -541
  265. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/async.md +0 -366
  266. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/core.md +0 -117
  267. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/di.md +0 -439
  268. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/program-cs-checklist.md +0 -92
  269. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/asaas/asaas-api.md +0 -216
  270. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/clerk/clerk-auth.md +0 -290
  271. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
  272. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/resend/resend-email.md +0 -385
  273. package/stacks/nextjs-supabase/.morph/standards/context/analytics.md +0 -96
  274. package/stacks/nextjs-supabase/.morph/standards/context/bundles.md +0 -110
  275. package/stacks/nextjs-supabase/.morph/standards/context/priming.md +0 -78
  276. package/stacks/nextjs-supabase/.morph/standards/core/architecture.md +0 -185
  277. package/stacks/nextjs-supabase/.morph/standards/core/coding.md +0 -214
  278. package/stacks/nextjs-supabase/.morph/standards/core/git-branching-strategy.md +0 -403
  279. package/stacks/nextjs-supabase/.morph/standards/core/git.md +0 -185
  280. package/stacks/nextjs-supabase/.morph/standards/core/testing.md +0 -295
  281. package/stacks/nextjs-supabase/.morph/standards/data/nosql/blob-storage.md +0 -102
  282. package/stacks/nextjs-supabase/.morph/standards/data/nosql/cache/redis.md +0 -97
  283. package/stacks/nextjs-supabase/.morph/standards/data/nosql/cosmos-db.md +0 -118
  284. package/stacks/nextjs-supabase/.morph/standards/data/vector-search/azure-ai-search.md +0 -121
  285. package/stacks/nextjs-supabase/.morph/standards/data/vector-search/rag-chunking.md +0 -104
  286. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/design-checklist.md +0 -222
  287. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/fluent-ui-setup.md +0 -595
  288. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/fluent-ui.md +0 -137
  289. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/html-conversion.md +0 -184
  290. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/lifecycle.md +0 -195
  291. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/pitfalls.md +0 -198
  292. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/state.md +0 -191
  293. package/stacks/nextjs-supabase/.morph/standards/frontend/design-system/animations.md +0 -151
  294. package/stacks/nextjs-supabase/.morph/standards/frontend/design-system/naming.md +0 -64
  295. package/stacks/nextjs-supabase/.morph/standards/frontend/nextjs/nextjs-patterns.md +0 -198
  296. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/azure.md +0 -624
  297. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
  298. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
  299. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/devops/local-development.md +0 -520
  300. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/services/functions.md +0 -486
  301. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/services/service-bus.md +0 -459
  302. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/services/storage.md +0 -407
  303. package/stacks/nextjs-supabase/.morph/standards/infrastructure/docker/easypanel-deploy.md +0 -196
  304. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/mcp-setup.md +0 -252
  305. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-auth.md +0 -176
  306. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
  307. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-rls.md +0 -184
  308. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-storage.md +0 -153
  309. package/stacks/nextjs-supabase/.morph/standards/integration/api/graphql.md +0 -91
  310. package/stacks/nextjs-supabase/.morph/standards/integration/api/grpc.md +0 -114
  311. package/stacks/nextjs-supabase/.morph/standards/integration/api/rest-design.md +0 -95
  312. package/stacks/nextjs-supabase/.morph/standards/integration/event-driven/cqrs.md +0 -101
  313. package/stacks/nextjs-supabase/.morph/standards/integration/event-driven/event-sourcing.md +0 -124
  314. package/stacks/nextjs-supabase/.morph/standards/integration/event-driven/service-bus.md +0 -95
  315. package/stacks/nextjs-supabase/.morph/standards/observability/logging.md +0 -131
  316. package/stacks/nextjs-supabase/.morph/standards/observability/metrics.md +0 -121
  317. package/stacks/nextjs-supabase/.morph/standards/observability/monitoring.md +0 -114
  318. package/stacks/nextjs-supabase/.morph/standards/observability/tracing.md +0 -132
  319. package/stacks/nextjs-supabase/.morph/standards/workflows/parallel-execution.md +0 -112
  320. package/stacks/nextjs-supabase/.morph/standards/workflows/thread-management.md +0 -113
  321. package/stacks/nextjs-supabase/CLAUDE.md +0 -155
  322. package/stacks/nextjs-supabase/README.md +0 -103
  323. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-apply.md +0 -0
  324. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-archive.md +0 -0
  325. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-preflight.md +0 -0
  326. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-proposal.md +0 -0
  327. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-status.md +0 -0
  328. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-troubleshoot.md +0 -0
  329. /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/blazor-ui.md +0 -0
  330. /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/production.md +0 -0
  331. /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/setup.md +0 -0
  332. /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/team-orchestration.md +0 -0
  333. /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/workflows.md +0 -0
  334. /package/{stacks/blazor-azure/.morph → framework}/standards/architecture/ddd/aggregates.md +0 -0
  335. /package/{stacks/blazor-azure/.morph → framework}/standards/architecture/ddd/entities.md +0 -0
  336. /package/{stacks/blazor-azure/.morph → framework}/standards/architecture/ddd/value-objects.md +0 -0
  337. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/api/minimal-api.md +0 -0
  338. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/api/rest.md +0 -0
  339. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/api/validation.md +0 -0
  340. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/authentication/passkeys.md +0 -0
  341. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/ef-core.md +0 -0
  342. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/migrations.md +0 -0
  343. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/postgresql/database.md +0 -0
  344. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/repository-patterns.md +0 -0
  345. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/vector-search-rag.md +0 -0
  346. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/async.md +0 -0
  347. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/core.md +0 -0
  348. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/di.md +0 -0
  349. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/program-cs-checklist.md +0 -0
  350. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/asaas/asaas-api.md +0 -0
  351. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/clerk/clerk-auth.md +0 -0
  352. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -0
  353. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/resend/resend-email.md +0 -0
  354. /package/{stacks/blazor-azure/.morph → framework}/standards/context/analytics.md +0 -0
  355. /package/{stacks/blazor-azure/.morph → framework}/standards/context/bundles.md +0 -0
  356. /package/{stacks/blazor-azure/.morph → framework}/standards/context/priming.md +0 -0
  357. /package/{stacks/blazor-azure/.morph → framework}/standards/core/architecture.md +0 -0
  358. /package/{stacks/blazor-azure/.morph → framework}/standards/core/coding.md +0 -0
  359. /package/{stacks/blazor-azure/.morph → framework}/standards/core/git-branching-strategy.md +0 -0
  360. /package/{stacks/blazor-azure/.morph → framework}/standards/core/git.md +0 -0
  361. /package/{stacks/blazor-azure/.morph → framework}/standards/core/testing.md +0 -0
  362. /package/{stacks/blazor-azure/.morph → framework}/standards/data/nosql/blob-storage.md +0 -0
  363. /package/{stacks/blazor-azure/.morph → framework}/standards/data/nosql/cache/redis.md +0 -0
  364. /package/{stacks/blazor-azure/.morph → framework}/standards/data/nosql/cosmos-db.md +0 -0
  365. /package/{stacks/blazor-azure/.morph → framework}/standards/data/vector-search/azure-ai-search.md +0 -0
  366. /package/{stacks/blazor-azure/.morph → framework}/standards/data/vector-search/rag-chunking.md +0 -0
  367. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/design-checklist.md +0 -0
  368. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/fluent-ui-setup.md +0 -0
  369. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/fluent-ui.md +0 -0
  370. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/html-conversion.md +0 -0
  371. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/lifecycle.md +0 -0
  372. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/pitfalls.md +0 -0
  373. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/state.md +0 -0
  374. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/design-system/animations.md +0 -0
  375. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/design-system/naming.md +0 -0
  376. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/nextjs/nextjs-patterns.md +0 -0
  377. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/azure.md +0 -0
  378. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -0
  379. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -0
  380. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/devops/local-development.md +0 -0
  381. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/services/functions.md +0 -0
  382. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/services/service-bus.md +0 -0
  383. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/services/storage.md +0 -0
  384. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/docker/easypanel-deploy.md +0 -0
  385. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/mcp-setup.md +0 -0
  386. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-auth.md +0 -0
  387. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-pgvector.md +0 -0
  388. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-rls.md +0 -0
  389. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-storage.md +0 -0
  390. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/api/graphql.md +0 -0
  391. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/api/grpc.md +0 -0
  392. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/api/rest-design.md +0 -0
  393. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/event-driven/cqrs.md +0 -0
  394. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/event-driven/event-sourcing.md +0 -0
  395. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/event-driven/service-bus.md +0 -0
  396. /package/{stacks/blazor-azure/.morph → framework}/standards/observability/logging.md +0 -0
  397. /package/{stacks/blazor-azure/.morph → framework}/standards/observability/metrics.md +0 -0
  398. /package/{stacks/blazor-azure/.morph → framework}/standards/observability/monitoring.md +0 -0
  399. /package/{stacks/blazor-azure/.morph → framework}/standards/observability/tracing.md +0 -0
  400. /package/{stacks/blazor-azure/.morph → framework}/standards/workflows/parallel-execution.md +0 -0
  401. /package/{stacks/blazor-azure/.morph → framework}/standards/workflows/thread-management.md +0 -0
@@ -1,354 +0,0 @@
1
- # Microsoft Agent Framework - Workflow Orchestration Patterns
2
-
3
- > **Scope:** universal
4
- > **Layer:** 0 (always load)
5
- > **Keywords:** workflow, orchestration, sequential, parallel, conditional
6
- > **Load When:** always
7
-
8
- **Ref:** `setup.md` — Core setup guide (packages, ChatClientAgent, tools)
9
-
10
- Workflows compose multiple agents and executors into coordinated pipelines using `AgentWorkflowBuilder`.
11
-
12
- ---
13
-
14
- ## Core Concepts
15
-
16
- | Concept | Description |
17
- |---------|-------------|
18
- | **Executor** | Base processing unit. Implements `IMessageHandler<T>`. Agents are executors. |
19
- | **Edge** | Typed connection between executors defining message flow |
20
- | **Workflow** | Composition of executors + edges forming a processing graph |
21
- | **AIAgent** | Chat-based executor (most common type) |
22
-
23
- ### Packages
24
-
25
- ```xml
26
- <PackageReference Include="Microsoft.Agents.AI" Version="1.0.0-preview.*" />
27
- <PackageReference Include="Microsoft.Agents.AI.Workflows" Version="1.0.0-preview.*" />
28
- ```
29
-
30
- ---
31
-
32
- ## 5 Orchestration Patterns
33
-
34
- | Pattern | Topology | Use Case | Coordination |
35
- |---------|----------|----------|--------------|
36
- | **Sequential** | Linear chain | Pipelines, multi-stage processing | Ordered, dependent |
37
- | **Concurrent** | Broadcast | Parallel analysis, ensemble | Independent, aggregated |
38
- | **GroupChat** | Star (manager hub) | Iterative refinement, review | Manager-controlled |
39
- | **Handoff** | Mesh | Dynamic routing, escalation | Agent-decided |
40
- | **Magentic** | Star (planner) | Complex generalist collaboration | Planner-based |
41
-
42
- ---
43
-
44
- ## 1. Sequential Workflow
45
-
46
- Agents execute in order — each agent receives the output of the previous one.
47
-
48
- ```
49
- [Writer] → [Editor] → [Output]
50
- ```
51
-
52
- ```csharp
53
- using Microsoft.Agents.AI;
54
- using Microsoft.Agents.AI.Workflows;
55
-
56
- AIAgent writer = new ChatClientAgent(chatClient, new ChatClientAgentOptions
57
- {
58
- Name = "Writer",
59
- Instructions = "Write stories that are engaging and creative."
60
- });
61
-
62
- AIAgent editor = new ChatClientAgent(chatClient, new ChatClientAgentOptions
63
- {
64
- Name = "Editor",
65
- Instructions = "Make the story more engaging, fix grammar, and enhance plot."
66
- });
67
-
68
- Workflow workflow = AgentWorkflowBuilder.BuildSequential(writer, editor);
69
-
70
- AIAgent workflowAgent = await workflow.AsAgentAsync();
71
- AgentRunResponse response = await workflowAgent.RunAsync(
72
- "Write a short story about a haunted house.");
73
-
74
- Console.WriteLine(response.Text);
75
- ```
76
-
77
- ---
78
-
79
- ## 2. Concurrent Workflow (Fan-Out / Fan-In)
80
-
81
- Same input sent to multiple agents in parallel, results aggregated.
82
-
83
- ```
84
- ┌→ [Agent B1] →┐
85
- [Input] → Fan-Out → [Agent B2] → Fan-In → [Aggregator]
86
- └→ [Agent B3] →┘
87
- ```
88
-
89
- ```csharp
90
- // Create specialized analysis agents
91
- AIAgent securityAnalyst = chatClient.AsAIAgent(
92
- instructions: "Analyze code for security vulnerabilities.",
93
- name: "SecurityAnalyst");
94
-
95
- AIAgent performanceAnalyst = chatClient.AsAIAgent(
96
- instructions: "Analyze code for performance issues.",
97
- name: "PerformanceAnalyst");
98
-
99
- AIAgent readabilityAnalyst = chatClient.AsAIAgent(
100
- instructions: "Analyze code for readability and maintainability.",
101
- name: "ReadabilityAnalyst");
102
-
103
- // Fan-out to all analysts, fan-in results
104
- // Use AddFanOutEdge / AddFanInEdge for custom executors
105
- ```
106
-
107
- **Note:** All executors in the same superstep must complete before downstream executors begin.
108
-
109
- ---
110
-
111
- ## 3. GroupChat Workflow
112
-
113
- Manager-controlled round-robin conversation between agents.
114
-
115
- ```csharp
116
- Workflow workflow = AgentWorkflowBuilder
117
- .CreateGroupChatBuilderWith(agents =>
118
- new AgentWorkflowBuilder.RoundRobinGroupChatManager(agents)
119
- {
120
- MaximumIterationCount = 2 // Max rounds
121
- })
122
- .AddParticipants(writer, editor)
123
- .Build();
124
-
125
- AIAgent workflowAgent = await workflow.AsAgentAsync();
126
- AgentRunResponse response = await workflowAgent.RunAsync(prompt);
127
- ```
128
-
129
- ---
130
-
131
- ## 4. Handoff Workflow
132
-
133
- Agents dynamically pass control based on routing rules. Mesh topology — no central orchestrator.
134
-
135
- ```
136
- [Triage] ──┬→ [Math Tutor] ──→ [Triage]
137
- └→ [History Tutor] → [Triage]
138
- ```
139
-
140
- ```csharp
141
- // Define specialized agents
142
- ChatClientAgent historyTutor = new(chatClient,
143
- "You provide help with historical queries. Only respond about history.",
144
- "history_tutor",
145
- "Specialist agent for historical questions");
146
-
147
- ChatClientAgent mathTutor = new(chatClient,
148
- "You provide help with math problems. Only respond about math.",
149
- "math_tutor",
150
- "Specialist agent for math questions");
151
-
152
- ChatClientAgent triageAgent = new(chatClient,
153
- "You determine which agent to use. ALWAYS handoff to another agent.",
154
- "triage_agent",
155
- "Routes messages to the appropriate specialist");
156
-
157
- // Build handoff workflow
158
- var workflow = AgentWorkflowBuilder.StartHandoffWith(triageAgent)
159
- .WithHandoffs(triageAgent, [mathTutor, historyTutor])
160
- .WithHandoff(mathTutor, triageAgent)
161
- .WithHandoff(historyTutor, triageAgent)
162
- .Build();
163
- ```
164
-
165
- ### Running Handoff with Streaming Events
166
-
167
- ```csharp
168
- List<ChatMessage> messages = new();
169
- messages.Add(new(ChatRole.User, "What is the derivative of x^2?"));
170
-
171
- StreamingRun run = await InProcessExecution.StreamAsync(workflow, messages);
172
- await run.TrySendMessageAsync(new TurnToken(emitEvents: true));
173
-
174
- await foreach (WorkflowEvent evt in run.WatchStreamAsync())
175
- {
176
- if (evt is AgentResponseUpdateEvent e)
177
- Console.WriteLine($"{e.ExecutorId}: {e.Data}");
178
- else if (evt is WorkflowOutputEvent outputEvt)
179
- {
180
- messages.AddRange(((List<ChatMessage>)outputEvt.Data!).Skip(messages.Count));
181
- break;
182
- }
183
- }
184
- ```
185
-
186
- **Handoff characteristics:**
187
- - Receiving agent takes full task ownership
188
- - Full conversation history passed to receiving agent
189
- - Only supports `ChatAgent` with local tool execution
190
-
191
- ---
192
-
193
- ## 5. Magentic Workflow
194
-
195
- Planner-based variant of GroupChat. A manager agent dynamically selects which agent acts next based on planning.
196
-
197
- | Aspect | GroupChat | Magentic |
198
- |--------|-----------|----------|
199
- | Turn order | Fixed (round-robin) | Dynamic (planner decides) |
200
- | Manager | Simple rotation | LLM-based planner |
201
- | Best for | Predictable workflows | Complex, adaptive tasks |
202
-
203
- ---
204
-
205
- ## Workflow-as-Agent
206
-
207
- Any workflow can be encapsulated as a single agent for composition:
208
-
209
- ```csharp
210
- Workflow workflow = AgentWorkflowBuilder.BuildSequential(writer, editor);
211
- AIAgent workflowAgent = await workflow.AsAgentAsync();
212
-
213
- // Use like any other agent
214
- var response = await workflowAgent.RunAsync("Write a report.");
215
-
216
- // Can be composed into larger workflows
217
- Workflow outerWorkflow = AgentWorkflowBuilder.BuildSequential(workflowAgent, reviewer);
218
- ```
219
-
220
- ---
221
-
222
- ## Web API Integration
223
-
224
- ```csharp
225
- // Program.cs
226
- builder.AddAIAgent("Writer", (sp, key) =>
227
- {
228
- var chatClient = sp.GetRequiredService<IChatClient>();
229
- return new ChatClientAgent(chatClient, name: key,
230
- instructions: "You are a creative writing assistant.");
231
- });
232
-
233
- builder.AddAIAgent("Editor",
234
- instructions: "You improve a writer's draft.");
235
-
236
- app.MapGet("/agent/chat", async (
237
- [FromKeyedServices("Writer")] AIAgent writer,
238
- [FromKeyedServices("Editor")] AIAgent editor,
239
- string prompt) =>
240
- {
241
- Workflow workflow = AgentWorkflowBuilder.BuildSequential(writer, editor);
242
- AIAgent workflowAgent = await workflow.AsAgentAsync();
243
- var response = await workflowAgent.RunAsync(prompt);
244
- return Results.Ok(response.Text);
245
- });
246
- ```
247
-
248
- ---
249
-
250
- ## Custom Executors
251
-
252
- For non-agent processing steps (data transformation, external API calls):
253
-
254
- ```csharp
255
- public class PhotoCritiqueExecutor : BaseExecutor, IMessageHandler<WorkflowMessage>
256
- {
257
- public async Task HandleAsync(
258
- WorkflowMessage message,
259
- WorkflowContext context,
260
- CancellationToken cancellationToken)
261
- {
262
- var client = GetVisionClient();
263
- var prompt = await GetPromptAsync("critique-prompt.md");
264
-
265
- var dataContent = new DataContent(
266
- await File.ReadAllBytesAsync(message.ImagePath),
267
- "image/jpeg");
268
-
269
- var fullPrompt = new PromptBuilder()
270
- .AddText(prompt)
271
- .AddImage(dataContent)
272
- .Build();
273
-
274
- var response = await client.GetResponseAsync(fullPrompt);
275
- await context.SendAsync(new CritiqueResult(response));
276
- }
277
- }
278
- ```
279
-
280
- ---
281
-
282
- ## Client Types
283
-
284
- | Type | Method | Input / Output | Use Case |
285
- |------|--------|---------------|----------|
286
- | Conversational | `GetConversationalClient()` | Text → Text | Chat, analysis, generation |
287
- | Vision | `GetVisionClient()` | Image → Text | Image analysis, OCR |
288
- | Image Generation | `GetImageClient()` | Text → Image | Mockups, visualizations |
289
-
290
- ---
291
-
292
- ## Prompt Engineering for Workflows
293
-
294
- Store prompts in external markdown files for:
295
- - Versioning without recompilation
296
- - Independent iteration and testing
297
- - Reuse across agents
298
-
299
- ```csharp
300
- var prompt = await File.ReadAllTextAsync("prompts/analysis.md");
301
- var agent = chatClient.AsAIAgent(instructions: prompt, name: "Analyst");
302
- ```
303
-
304
- ---
305
-
306
- ## When to Use Which Pattern
307
-
308
- | Scenario | Pattern | Why |
309
- |----------|---------|-----|
310
- | ETL / data pipeline | Sequential | Each step depends on previous |
311
- | Code review (security + perf + style) | Concurrent | Independent analyses |
312
- | Content creation + editing | GroupChat | Iterative refinement |
313
- | Customer support routing | Handoff | Dynamic expert selection |
314
- | Complex research tasks | Magentic | Adaptive planning |
315
- | Composing sub-workflows | Workflow-as-Agent | Abstraction |
316
-
317
- ---
318
-
319
- ## Development Tools
320
-
321
- | Tool | Purpose |
322
- |------|---------|
323
- | Mermaid diagrams | Auto-generated workflow visualization |
324
- | Aspire Dashboard | Trace inter-agent calls and performance |
325
- | `dotnet new webapi-ai` | Template: Web API with Agent Framework |
326
- | `dotnet new mcp-server` | Template: MCP Server |
327
-
328
- ---
329
-
330
- ## Checklist
331
-
332
- - [ ] `Microsoft.Agents.AI.Workflows` package installed
333
- - [ ] Orchestration pattern selected and justified
334
- - [ ] Agents have clear, single responsibilities
335
- - [ ] Workflow built with `AgentWorkflowBuilder`
336
- - [ ] Streaming events handled for real-time UI
337
- - [ ] OpenTelemetry enabled for workflow tracing
338
- - [ ] Prompts stored externally (markdown files)
339
- - [ ] Error handling defined per executor
340
-
341
- ---
342
-
343
- ## References
344
-
345
- - [Workflow Orchestrations Overview](https://learn.microsoft.com/agent-framework/user-guide/workflows/orchestrations/overview)
346
- - [Handoff Pattern](https://learn.microsoft.com/agent-framework/user-guide/workflows/orchestrations/handoff)
347
- - [Agents in Workflows](https://learn.microsoft.com/agent-framework/tutorials/workflows/agents-in-workflows)
348
- - [GitHub Samples: Workflows](https://github.com/microsoft/agent-framework/tree/main/dotnet/samples/GettingStarted/Workflows)
349
- - `setup.md` — Core setup
350
- - `production.md` — Middleware, A2A, MCP
351
-
352
- ---
353
-
354
- *MORPH-SPEC by Polymorphism Tech*
@@ -1,120 +0,0 @@
1
- # Architecture Standard: DDD Aggregates
2
-
3
- ## Overview
4
- Aggregates are the primary unit of consistency in DDD. An aggregate root is the only entry point.
5
-
6
- ## Design Rules
7
- 1. **Small aggregates**: Keep aggregates small (3-5 entities max)
8
- 2. **Reference by ID**: Aggregates reference each other by ID only (not navigation properties across aggregate boundaries)
9
- 3. **Consistency boundary**: All invariants within an aggregate must hold after every command
10
- 4. **Single repository**: One repository per aggregate root
11
-
12
- ## Aggregate Root Pattern
13
- ```csharp
14
- public abstract class AggregateRoot : Entity
15
- {
16
- private readonly List<DomainEvent> _domainEvents = [];
17
-
18
- public IReadOnlyList<DomainEvent> DomainEvents => _domainEvents.AsReadOnly();
19
-
20
- protected void RaiseDomainEvent(DomainEvent @event)
21
- {
22
- @event = @event with { Version = _domainEvents.Count + 1 };
23
- _domainEvents.Add(@event);
24
- }
25
-
26
- public void ClearDomainEvents() => _domainEvents.Clear();
27
- }
28
-
29
- public abstract class Entity
30
- {
31
- public Guid Id { get; protected set; } = Guid.NewGuid();
32
- public DateTime CreatedAt { get; protected set; } = DateTime.UtcNow;
33
- public DateTime? UpdatedAt { get; protected set; }
34
- }
35
- ```
36
-
37
- ## Order Aggregate Example
38
- ```csharp
39
- public class Order : AggregateRoot
40
- {
41
- private readonly List<OrderItem> _items = [];
42
-
43
- // Private constructor — use factory method
44
- private Order(Guid userId) { UserId = userId; Status = OrderStatus.Draft; }
45
-
46
- public Guid UserId { get; private set; }
47
- public OrderStatus Status { get; private set; }
48
- public IReadOnlyList<OrderItem> Items => _items.AsReadOnly();
49
- public decimal Total => _items.Sum(i => i.Subtotal);
50
-
51
- // Factory method — validates invariants before creating
52
- public static Order Create(Guid userId, IEnumerable<OrderItem> items)
53
- {
54
- if (userId == Guid.Empty) throw new DomainException("UserId required");
55
- var order = new Order(userId);
56
- foreach (var item in items) order.AddItem(item);
57
- order.RaiseDomainEvent(new OrderCreatedEvent(order.Id, userId));
58
- return order;
59
- }
60
-
61
- public void AddItem(OrderItem item)
62
- {
63
- if (Status != OrderStatus.Draft)
64
- throw new DomainException($"Cannot add items to order in {Status} status");
65
-
66
- var existing = _items.FirstOrDefault(i => i.ProductId == item.ProductId);
67
- if (existing != null)
68
- existing.IncreaseQuantity(item.Quantity);
69
- else
70
- _items.Add(item);
71
-
72
- UpdatedAt = DateTime.UtcNow;
73
- }
74
-
75
- public void Confirm()
76
- {
77
- if (Status != OrderStatus.Draft)
78
- throw new DomainException("Can only confirm draft orders");
79
- if (!_items.Any())
80
- throw new DomainException("Order must have at least one item");
81
-
82
- Status = OrderStatus.Confirmed;
83
- UpdatedAt = DateTime.UtcNow;
84
- RaiseDomainEvent(new OrderConfirmedEvent(Id));
85
- }
86
- }
87
- ```
88
-
89
- ## Repository Interface (per aggregate root)
90
- ```csharp
91
- public interface IOrderRepository
92
- {
93
- Task<Order?> GetAsync(Guid id, CancellationToken ct = default);
94
- Task AddAsync(Order order, CancellationToken ct = default);
95
- Task UpdateAsync(Order order, CancellationToken ct = default);
96
- }
97
- ```
98
-
99
- ## EF Core Configuration
100
- ```csharp
101
- public class OrderConfiguration : IEntityTypeConfiguration<Order>
102
- {
103
- public void Configure(EntityTypeBuilder<Order> builder)
104
- {
105
- builder.HasKey(o => o.Id);
106
- builder.OwnsMany(o => o.Items, items =>
107
- {
108
- items.ToTable("OrderItems");
109
- items.WithOwner().HasForeignKey("OrderId");
110
- });
111
- builder.Ignore(o => o.DomainEvents); // Not persisted
112
- }
113
- }
114
- ```
115
-
116
- ## Anti-Patterns
117
- - Never expose mutable collections: use `IReadOnlyList<>`, never `List<>`
118
- - Never set state directly from outside: all mutations through aggregate methods
119
- - Never cross aggregate boundaries in a single transaction
120
- - Never put query logic in aggregates — use separate read models
@@ -1,99 +0,0 @@
1
- # Architecture Standard: DDD Entities
2
-
3
- ## Overview
4
- Entities have identity — two entities with the same ID are the same, regardless of their attribute values.
5
-
6
- ## Entity Base Class
7
- ```csharp
8
- public abstract class Entity
9
- {
10
- public Guid Id { get; protected set; } = Guid.NewGuid();
11
- public DateTime CreatedAt { get; protected set; } = DateTime.UtcNow;
12
- public DateTime? UpdatedAt { get; protected set; }
13
- public bool IsDeleted { get; private set; }
14
- public DateTime? DeletedAt { get; private set; }
15
-
16
- // Identity equality (not attribute equality)
17
- public override bool Equals(object? obj)
18
- => obj is Entity other && Id == other.Id;
19
-
20
- public override int GetHashCode() => Id.GetHashCode();
21
- public static bool operator ==(Entity? a, Entity? b) => a?.Equals(b) ?? b is null;
22
- public static bool operator !=(Entity? a, Entity? b) => !(a == b);
23
-
24
- // Soft delete support
25
- public void SoftDelete()
26
- {
27
- IsDeleted = true;
28
- DeletedAt = DateTime.UtcNow;
29
- }
30
- }
31
- ```
32
-
33
- ## Entity Lifecycle
34
- ```csharp
35
- // Entities are created through factory methods (never bare constructors from outside the aggregate)
36
- public class OrderItem : Entity
37
- {
38
- private OrderItem() { } // Private for EF Core
39
-
40
- internal static OrderItem Create(Guid productId, string productName, decimal price, int quantity)
41
- {
42
- if (price <= 0) throw new DomainException("Price must be positive");
43
- if (quantity <= 0) throw new DomainException("Quantity must be positive");
44
-
45
- return new OrderItem
46
- {
47
- ProductId = productId,
48
- ProductName = productName,
49
- UnitPrice = price,
50
- Quantity = quantity
51
- };
52
- }
53
-
54
- public Guid ProductId { get; private set; }
55
- public string ProductName { get; private set; } = string.Empty;
56
- public decimal UnitPrice { get; private set; }
57
- public int Quantity { get; private set; }
58
- public decimal Subtotal => UnitPrice * Quantity;
59
-
60
- internal void IncreaseQuantity(int additionalQuantity)
61
- {
62
- if (additionalQuantity <= 0) throw new DomainException("Quantity must be positive");
63
- Quantity += additionalQuantity;
64
- UpdatedAt = DateTime.UtcNow;
65
- }
66
- }
67
- ```
68
-
69
- ## EF Core Mapping
70
-
71
- ### Required Conventions
72
- ```csharp
73
- builder.HasKey(e => e.Id);
74
- builder.Property(e => e.CreatedAt).IsRequired();
75
-
76
- // Soft delete filter (apply globally)
77
- builder.HasQueryFilter(e => !e.IsDeleted);
78
-
79
- // All string properties: max length
80
- builder.Property(e => e.Name)
81
- .IsRequired()
82
- .HasMaxLength(200);
83
- ```
84
-
85
- ### Inheritance (TPH by default)
86
- ```csharp
87
- // Table Per Hierarchy (single table with discriminator)
88
- builder.HasDiscriminator<string>("Type")
89
- .HasValue<ProductOrder>("product")
90
- .HasValue<ServiceOrder>("service");
91
- ```
92
-
93
- ## Entity vs Value Object Decision
94
- | Use Entity When | Use Value Object When |
95
- |----------------|----------------------|
96
- | Has lifecycle (created, updated, deleted) | Immutable by definition |
97
- | Identity matters (two objects with same data are different) | Equality by value |
98
- | Needs to be tracked in a repository | Owned by an entity (no separate table) |
99
- | Examples: User, Order, Product | Examples: Money, Address, DateRange |
@@ -1,124 +0,0 @@
1
- # Architecture Standard: DDD Value Objects
2
-
3
- ## Overview
4
- Value objects have no identity — equality is based on their attribute values. They are immutable.
5
-
6
- ## Value Object Base Class
7
- ```csharp
8
- public abstract class ValueObject
9
- {
10
- protected abstract IEnumerable<object?> GetEqualityComponents();
11
-
12
- public override bool Equals(object? obj)
13
- {
14
- if (obj is null || obj.GetType() != GetType()) return false;
15
- return GetEqualityComponents().SequenceEqual(((ValueObject)obj).GetEqualityComponents());
16
- }
17
-
18
- public override int GetHashCode()
19
- => GetEqualityComponents().Aggregate(0, (hash, c) => HashCode.Combine(hash, c?.GetHashCode() ?? 0));
20
-
21
- public static bool operator ==(ValueObject? a, ValueObject? b) => a?.Equals(b) ?? b is null;
22
- public static bool operator !=(ValueObject? a, ValueObject? b) => !(a == b);
23
- }
24
- ```
25
-
26
- ## Money Value Object
27
- ```csharp
28
- public sealed class Money : ValueObject
29
- {
30
- public decimal Amount { get; }
31
- public string Currency { get; }
32
-
33
- private Money(decimal amount, string currency)
34
- {
35
- Amount = amount;
36
- Currency = currency.ToUpper();
37
- }
38
-
39
- public static Money Of(decimal amount, string currency = "BRL")
40
- {
41
- if (amount < 0) throw new DomainException("Money amount cannot be negative");
42
- if (string.IsNullOrWhiteSpace(currency)) throw new DomainException("Currency required");
43
- return new Money(amount, currency);
44
- }
45
-
46
- public Money Add(Money other)
47
- {
48
- if (Currency != other.Currency)
49
- throw new DomainException($"Cannot add {Currency} and {other.Currency}");
50
- return new Money(Amount + other.Amount, Currency);
51
- }
52
-
53
- public Money Multiply(decimal factor)
54
- => new(Amount * factor, Currency);
55
-
56
- public override string ToString() => $"{Amount:F2} {Currency}";
57
-
58
- protected override IEnumerable<object?> GetEqualityComponents()
59
- {
60
- yield return Amount;
61
- yield return Currency;
62
- }
63
- }
64
- ```
65
-
66
- ## Address Value Object
67
- ```csharp
68
- public sealed class Address : ValueObject
69
- {
70
- public string Street { get; }
71
- public string City { get; }
72
- public string State { get; }
73
- public string ZipCode { get; }
74
- public string Country { get; }
75
-
76
- public Address(string street, string city, string state, string zipCode, string country)
77
- {
78
- Street = street ?? throw new DomainException("Street required");
79
- City = city ?? throw new DomainException("City required");
80
- State = state ?? throw new DomainException("State required");
81
- ZipCode = zipCode ?? throw new DomainException("ZipCode required");
82
- Country = country ?? throw new DomainException("Country required");
83
- }
84
-
85
- protected override IEnumerable<object?> GetEqualityComponents()
86
- {
87
- yield return Street;
88
- yield return City;
89
- yield return State;
90
- yield return ZipCode;
91
- yield return Country;
92
- }
93
- }
94
- ```
95
-
96
- ## EF Core Configuration (Owned Types)
97
- ```csharp
98
- public class OrderConfiguration : IEntityTypeConfiguration<Order>
99
- {
100
- public void Configure(EntityTypeBuilder<Order> builder)
101
- {
102
- // Embedded in same table (no separate table)
103
- builder.OwnsOne(o => o.ShippingAddress, addr =>
104
- {
105
- addr.Property(a => a.Street).HasMaxLength(200).IsRequired();
106
- addr.Property(a => a.City).HasMaxLength(100).IsRequired();
107
- addr.Property(a => a.ZipCode).HasMaxLength(20).IsRequired();
108
- });
109
-
110
- // Money: stored as separate Amount + Currency columns
111
- builder.OwnsOne(o => o.Total, money =>
112
- {
113
- money.Property(m => m.Amount).HasColumnType("decimal(18,2)").IsRequired();
114
- money.Property(m => m.Currency).HasMaxLength(3).IsRequired();
115
- });
116
- }
117
- }
118
- ```
119
-
120
- ## Rules
121
- - Value objects are always immutable — no setters, return new instance from methods
122
- - Use `record` types only when they don't need to inherit from `ValueObject` base class
123
- - Never use value objects as EF Core entity (no `Id` column)
124
- - Never create value objects with invalid state — validate in constructor/factory