@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
@@ -0,0 +1,286 @@
1
+ # MORPH-SPEC - Templates Bicep
2
+
3
+ Templates de infraestrutura para Azure com suporte a App Service e Container Apps.
4
+
5
+ ---
6
+
7
+ ## 🚀 Quick Start
8
+
9
+ ### 1. App Service Free (Desenvolvimento - $0/mês)
10
+
11
+ ```bash
12
+ # Deploy infraestrutura com App Service Free
13
+ az deployment group create \
14
+ --resource-group rg-myapp-dev \
15
+ --template-file main.bicep \
16
+ --parameters @parameters.dev.json \
17
+ --parameters appName=myapp
18
+ ```
19
+
20
+ ### 2. Container Apps (Produção - $5-15/mês)
21
+
22
+ ```bash
23
+ # Build e push imagem para ACR
24
+ az acr build \
25
+ --registry acrXXXX \
26
+ --image myapp:v1.0.0 \
27
+ --file Dockerfile \
28
+ .
29
+
30
+ # Deploy infraestrutura com Container Apps
31
+ az deployment group create \
32
+ --resource-group rg-myapp-prod \
33
+ --template-file main.bicep \
34
+ --parameters @parameters.prod.json \
35
+ --parameters appName=myapp
36
+ ```
37
+
38
+ ---
39
+
40
+ ## 📁 Estrutura de Arquivos
41
+
42
+ ```
43
+ infra/
44
+ ├── main.bicep # Entry point com lógica condicional
45
+ ├── parameters.dev.json # Params dev (App Service Free)
46
+ ├── parameters.prod.json # Params prod (Container Apps)
47
+ ├── app-service.bicep # Template App Service
48
+ ├── container-app.bicep # Template Container App
49
+ ├── container-app-env.bicep # Container Apps Environment
50
+ ├── sql-database.bicep # Azure SQL Database
51
+ ├── storage.bicep # Storage Account
52
+ ├── key-vault.bicep # Key Vault
53
+ └── app-insights.bicep # Application Insights
54
+ ```
55
+
56
+ ---
57
+
58
+ ## ⚙️ Parâmetros Principais
59
+
60
+ ### main.bicep
61
+
62
+ | Parâmetro | Tipo | Default | Descrição |
63
+ |-----------|------|---------|-----------|
64
+ | `environment` | string | `dev` | Ambiente (dev, staging, prod) |
65
+ | `appName` | string | **required** | Nome da aplicação (3-15 chars) |
66
+ | `location` | string | `resourceGroup().location` | Região Azure |
67
+ | `hostingType` | string | `appservice` | Tipo de hosting (`appservice` ou `containerapp`) |
68
+ | `appServiceSku` | string | `F1` | SKU do App Service (F1, B1, S1, P1v2) |
69
+ | `containerImage` | string | `mcr.microsoft.com/hello-world:latest` | Imagem Docker (apenas Container Apps) |
70
+ | `sqlAdminPassword` | securestring | **required** | Senha do SQL Server |
71
+
72
+ ---
73
+
74
+ ## 🌐 Escolhendo o Hosting Type
75
+
76
+ ### App Service (`hostingType: appservice`)
77
+
78
+ **Usar quando:**
79
+ - ✅ Orçamento zero (Free F1)
80
+ - ✅ MVP ou protótipo
81
+ - ✅ Tráfego baixo (<100 req/dia)
82
+ - ✅ App tolerante a cold starts (20 min sleep)
83
+ - ✅ Deploy simplificado (sem Docker)
84
+
85
+ **SKUs disponíveis:**
86
+ - `F1` (Free): $0/mês - 1GB RAM, 60 min CPU/dia, sleep após 20min
87
+ - `B1` (Basic): $13/mês - 1.75GB RAM, always-on
88
+ - `S1` (Standard): $70/mês - 1.75GB RAM, auto-scale, slots
89
+ - `P1v2` (Premium): $85/mês - 3.5GB RAM, melhor performance
90
+
91
+ ### Container Apps (`hostingType: containerapp`)
92
+
93
+ **Usar quando:**
94
+ - ✅ Produção com SLA 24/7
95
+ - ✅ Auto-scaling baseado em demanda
96
+ - ✅ SSL customizado necessário
97
+ - ✅ Background jobs (Hangfire)
98
+ - ✅ Arquitetura microserviços
99
+
100
+ **Custo:** $0-15/mês (scale-to-zero + consumo)
101
+
102
+ ---
103
+
104
+ ## 📝 Configuração por Ambiente
105
+
106
+ ### Development (parameters.dev.json)
107
+
108
+ ```json
109
+ {
110
+ "environment": { "value": "dev" },
111
+ "hostingType": { "value": "appservice" },
112
+ "appServiceSku": { "value": "F1" }
113
+ }
114
+ ```
115
+
116
+ **Infraestrutura:**
117
+ - App Service Free F1
118
+ - Azure SQL Free (32GB)
119
+ - App Insights Free (5GB)
120
+
121
+ **Custo total:** $0/mês
122
+
123
+ ### Staging (parameters.staging.json)
124
+
125
+ ```json
126
+ {
127
+ "environment": { "value": "staging" },
128
+ "hostingType": { "value": "containerapp" },
129
+ "minReplicas": { "value": 0 } // scale-to-zero
130
+ }
131
+ ```
132
+
133
+ **Infraestrutura:**
134
+ - Container Apps (scale-to-zero)
135
+ - Azure SQL Free (32GB)
136
+ - ACR Basic
137
+ - App Insights Free
138
+
139
+ **Custo total:** $5-10/mês
140
+
141
+ ### Production (parameters.prod.json)
142
+
143
+ ```json
144
+ {
145
+ "environment": { "value": "prod" },
146
+ "hostingType": { "value": "containerapp" },
147
+ "minReplicas": { "value": 1 } // always-on
148
+ }
149
+ ```
150
+
151
+ **Infraestrutura:**
152
+ - Container Apps (min 1 replica)
153
+ - Azure SQL Free (ou pago se necessário)
154
+ - ACR Basic
155
+ - App Insights (pode ultrapassar free tier)
156
+
157
+ **Custo total:** $10-20/mês
158
+
159
+ ---
160
+
161
+ ## 🔧 Customização
162
+
163
+ ### Adicionar variáveis de ambiente
164
+
165
+ **App Service:**
166
+ ```bicep
167
+ module appService 'app-service.bicep' = {
168
+ params: {
169
+ envVars: {
170
+ MY_CUSTOM_VAR: 'value'
171
+ ANOTHER_VAR: 'another-value'
172
+ }
173
+ }
174
+ }
175
+ ```
176
+
177
+ **Container Apps:**
178
+ ```bicep
179
+ module containerApp 'container-app.bicep' = {
180
+ params: {
181
+ envVars: [
182
+ {
183
+ name: 'MY_CUSTOM_VAR'
184
+ value: 'value'
185
+ }
186
+ ]
187
+ }
188
+ }
189
+ ```
190
+
191
+ ### Usar secrets do Key Vault
192
+
193
+ ```bicep
194
+ param sqlAdminPassword string {
195
+ reference: {
196
+ keyVault: {
197
+ id: '/subscriptions/.../providers/Microsoft.KeyVault/vaults/kv-myapp'
198
+ }
199
+ secretName: 'sql-admin-password'
200
+ }
201
+ }
202
+ ```
203
+
204
+ ---
205
+
206
+ ## 🔄 Migração App Service → Container Apps
207
+
208
+ Ver guia completo em: `../../standards/migration-guide.md`
209
+
210
+ **Resumo:**
211
+ 1. Criar Dockerfile
212
+ 2. Implementar health checks
213
+ 3. Build e push para ACR
214
+ 4. Atualizar `parameters.json` → `hostingType: containerapp`
215
+ 5. Redeploy
216
+ 6. Testar
217
+ 7. Cutover DNS
218
+
219
+ ---
220
+
221
+ ## 📊 Outputs Gerados
222
+
223
+ Após deploy, os seguintes outputs são gerados:
224
+
225
+ ```bash
226
+ # Obter URL da aplicação
227
+ az deployment group show \
228
+ -g rg-myapp-dev \
229
+ -n deployment-name \
230
+ --query properties.outputs.appUrl.value
231
+
232
+ # Obter connection string SQL
233
+ az deployment group show \
234
+ -g rg-myapp-dev \
235
+ -n deployment-name \
236
+ --query properties.outputs.sqlConnectionString.value
237
+
238
+ # Obter App Insights connection string
239
+ az deployment group show \
240
+ -g rg-myapp-dev \
241
+ -n deployment-name \
242
+ --query properties.outputs.appInsightsConnectionString.value
243
+ ```
244
+
245
+ ---
246
+
247
+ ## 🆘 Troubleshooting
248
+
249
+ ### Erro: "The template deployment 'X' is not valid"
250
+
251
+ Validar template:
252
+ ```bash
253
+ az deployment group validate \
254
+ --resource-group rg-myapp-dev \
255
+ --template-file main.bicep \
256
+ --parameters @parameters.dev.json
257
+ ```
258
+
259
+ ### Erro: "SKU not available in this location"
260
+
261
+ Verificar SKUs disponíveis:
262
+ ```bash
263
+ az appservice list-locations --sku F1
264
+ ```
265
+
266
+ ### Deploy muito lento
267
+
268
+ Container Apps pode levar 5-10 minutos no primeiro deploy. Use `--no-wait` para não bloquear:
269
+ ```bash
270
+ az deployment group create \
271
+ ... \
272
+ --no-wait
273
+ ```
274
+
275
+ ---
276
+
277
+ ## 📚 Referências
278
+
279
+ - [Bicep Documentation](https://learn.microsoft.com/azure/azure-resource-manager/bicep/)
280
+ - [App Service Bicep Reference](https://learn.microsoft.com/azure/templates/microsoft.web/sites)
281
+ - [Container Apps Bicep Reference](https://learn.microsoft.com/azure/templates/microsoft.app/containerapps)
282
+ - [Azure CLI Reference](https://learn.microsoft.com/cli/azure/)
283
+
284
+ ---
285
+
286
+ *MORPH-SPEC by Polymorphism Tech*
@@ -0,0 +1,63 @@
1
+ // ==============================================================================
2
+ // MORPH-SPEC - Application Insights
3
+ // Azure Application Insights for monitoring and telemetry
4
+ // ==============================================================================
5
+
6
+ @description('Application Insights name')
7
+ param name string
8
+
9
+ @description('Location')
10
+ param location string
11
+
12
+ @description('Tags')
13
+ param tags object = {}
14
+
15
+ @description('Log Analytics Workspace ID')
16
+ param logAnalyticsWorkspaceId string
17
+
18
+ @description('Application type')
19
+ @allowed(['web', 'other'])
20
+ param applicationType string = 'web'
21
+
22
+ @description('Retention in days')
23
+ @minValue(30)
24
+ @maxValue(730)
25
+ param retentionInDays int = 90
26
+
27
+ // ==============================================================================
28
+ // APPLICATION INSIGHTS
29
+ // ==============================================================================
30
+
31
+ resource appInsights 'Microsoft.Insights/components@2020-02-02' = {
32
+ name: name
33
+ location: location
34
+ tags: tags
35
+ kind: applicationType
36
+ properties: {
37
+ Application_Type: applicationType
38
+ WorkspaceResourceId: logAnalyticsWorkspaceId
39
+ IngestionMode: 'LogAnalytics'
40
+ publicNetworkAccessForIngestion: 'Enabled'
41
+ publicNetworkAccessForQuery: 'Enabled'
42
+ RetentionInDays: retentionInDays
43
+ }
44
+ }
45
+
46
+ // ==============================================================================
47
+ // OUTPUTS
48
+ // ==============================================================================
49
+
50
+ @description('Application Insights ID')
51
+ output id string = appInsights.id
52
+
53
+ @description('Application Insights name')
54
+ output name string = appInsights.name
55
+
56
+ @description('Instrumentation Key')
57
+ output instrumentationKey string = appInsights.properties.InstrumentationKey
58
+
59
+ @description('Connection String')
60
+ output connectionString string = appInsights.properties.ConnectionString
61
+
62
+ @description('App ID')
63
+ output appId string = appInsights.properties.AppId
@@ -0,0 +1,164 @@
1
+ // ==============================================================================
2
+ // MORPH-SPEC - App Service
3
+ // Azure App Service with Free F1 tier support
4
+ // ==============================================================================
5
+
6
+ @description('App Service name')
7
+ param name string
8
+
9
+ @description('Location')
10
+ param location string
11
+
12
+ @description('Tags')
13
+ param tags object = {}
14
+
15
+ @description('App Service Plan SKU (F1, B1, S1, P1v2)')
16
+ @allowed(['F1', 'B1', 'S1', 'P1v2', 'P2v2'])
17
+ param sku string = 'F1'
18
+
19
+ @description('App Insights connection string')
20
+ param appInsightsConnectionString string = ''
21
+
22
+ @description('.NET version')
23
+ @allowed(['v6.0', 'v7.0', 'v8.0'])
24
+ param dotnetVersion string = 'v8.0'
25
+
26
+ @description('Always On (not available on Free tier)')
27
+ param alwaysOn bool = false
28
+
29
+ @description('Environment variables')
30
+ param envVars object = {}
31
+
32
+ // ==============================================================================
33
+ // VARIABLES
34
+ // ==============================================================================
35
+
36
+ var skuTiers = {
37
+ F1: 'Free'
38
+ B1: 'Basic'
39
+ S1: 'Standard'
40
+ P1v2: 'PremiumV2'
41
+ P2v2: 'PremiumV2'
42
+ }
43
+
44
+ var planName = 'plan-${name}'
45
+
46
+ // Merge default env vars with custom ones
47
+ var defaultEnvVars = {
48
+ ASPNETCORE_ENVIRONMENT: 'Production'
49
+ APPLICATIONINSIGHTS_CONNECTION_STRING: appInsightsConnectionString
50
+ }
51
+
52
+ var mergedEnvVars = union(defaultEnvVars, envVars)
53
+
54
+ // ==============================================================================
55
+ // APP SERVICE PLAN
56
+ // ==============================================================================
57
+
58
+ resource appServicePlan 'Microsoft.Web/serverfarms@2022-09-01' = {
59
+ name: planName
60
+ location: location
61
+ tags: tags
62
+ sku: {
63
+ name: sku
64
+ tier: skuTiers[sku]
65
+ }
66
+ kind: 'linux'
67
+ properties: {
68
+ reserved: true // Required for Linux
69
+ }
70
+ }
71
+
72
+ // ==============================================================================
73
+ // APP SERVICE
74
+ // ==============================================================================
75
+
76
+ resource appService 'Microsoft.Web/sites@2022-09-01' = {
77
+ name: name
78
+ location: location
79
+ tags: tags
80
+ kind: 'app,linux'
81
+ identity: {
82
+ type: 'SystemAssigned'
83
+ }
84
+ properties: {
85
+ serverFarmId: appServicePlan.id
86
+ httpsOnly: true
87
+ siteConfig: {
88
+ linuxFxVersion: 'DOTNETCORE|${dotnetVersion}'
89
+ alwaysOn: alwaysOn
90
+ minTlsVersion: '1.2'
91
+ ftpsState: 'Disabled'
92
+ http20Enabled: true
93
+ healthCheckPath: '/health'
94
+ appSettings: [for key in objectKeys(mergedEnvVars): {
95
+ name: key
96
+ value: mergedEnvVars[key]
97
+ }]
98
+ cors: {
99
+ allowedOrigins: [
100
+ 'https://portal.azure.com'
101
+ ]
102
+ supportCredentials: false
103
+ }
104
+ }
105
+ clientAffinityEnabled: false // Recommended for stateless apps
106
+ }
107
+ }
108
+
109
+ // ==============================================================================
110
+ // DEPLOYMENT SLOT (Only for non-Free tiers)
111
+ // ==============================================================================
112
+
113
+ resource stagingSlot 'Microsoft.Web/sites/slots@2022-09-01' = if (sku != 'F1') {
114
+ name: 'staging'
115
+ parent: appService
116
+ location: location
117
+ tags: tags
118
+ kind: 'app,linux'
119
+ identity: {
120
+ type: 'SystemAssigned'
121
+ }
122
+ properties: {
123
+ serverFarmId: appServicePlan.id
124
+ httpsOnly: true
125
+ siteConfig: {
126
+ linuxFxVersion: 'DOTNETCORE|${dotnetVersion}'
127
+ alwaysOn: alwaysOn
128
+ minTlsVersion: '1.2'
129
+ ftpsState: 'Disabled'
130
+ http20Enabled: true
131
+ healthCheckPath: '/health'
132
+ appSettings: [for key in objectKeys(mergedEnvVars): {
133
+ name: key
134
+ value: mergedEnvVars[key]
135
+ }]
136
+ }
137
+ clientAffinityEnabled: false
138
+ }
139
+ }
140
+
141
+ // ==============================================================================
142
+ // OUTPUTS
143
+ // ==============================================================================
144
+
145
+ @description('App Service ID')
146
+ output id string = appService.id
147
+
148
+ @description('App Service name')
149
+ output name string = appService.name
150
+
151
+ @description('App Service URL')
152
+ output url string = 'https://${appService.properties.defaultHostName}'
153
+
154
+ @description('App Service default hostname')
155
+ output defaultHostName string = appService.properties.defaultHostName
156
+
157
+ @description('App Service Plan ID')
158
+ output planId string = appServicePlan.id
159
+
160
+ @description('App Service Managed Identity Principal ID')
161
+ output principalId string = appService.identity.principalId
162
+
163
+ @description('Staging slot URL (if available)')
164
+ output stagingUrl string = sku != 'F1' ? 'https://${stagingSlot.properties.defaultHostName}' : ''
@@ -0,0 +1,49 @@
1
+ // ==============================================================================
2
+ // MORPH-SPEC - Container Apps Environment
3
+ // Azure Container Apps managed environment
4
+ // ==============================================================================
5
+
6
+ @description('Environment name')
7
+ param name string
8
+
9
+ @description('Location')
10
+ param location string
11
+
12
+ @description('Tags')
13
+ param tags object = {}
14
+
15
+ @description('Log Analytics Workspace ID')
16
+ param logAnalyticsWorkspaceId string
17
+
18
+ // ==============================================================================
19
+ // CONTAINER APPS ENVIRONMENT
20
+ // ==============================================================================
21
+
22
+ resource containerAppEnv 'Microsoft.App/managedEnvironments@2023-05-01' = {
23
+ name: name
24
+ location: location
25
+ tags: tags
26
+ properties: {
27
+ appLogsConfiguration: {
28
+ destination: 'log-analytics'
29
+ logAnalyticsConfiguration: {
30
+ customerId: reference(logAnalyticsWorkspaceId, '2022-10-01').customerId
31
+ sharedKey: listKeys(logAnalyticsWorkspaceId, '2022-10-01').primarySharedKey
32
+ }
33
+ }
34
+ zoneRedundant: false
35
+ }
36
+ }
37
+
38
+ // ==============================================================================
39
+ // OUTPUTS
40
+ // ==============================================================================
41
+
42
+ @description('Container Apps Environment ID')
43
+ output id string = containerAppEnv.id
44
+
45
+ @description('Container Apps Environment name')
46
+ output name string = containerAppEnv.name
47
+
48
+ @description('Default domain')
49
+ output defaultDomain string = containerAppEnv.properties.defaultDomain
@@ -0,0 +1,156 @@
1
+ // ==============================================================================
2
+ // MORPH-SPEC - Container App
3
+ // Azure Container Apps with ingress and auto-scaling
4
+ // ==============================================================================
5
+
6
+ @description('App name')
7
+ param name string
8
+
9
+ @description('Location')
10
+ param location string
11
+
12
+ @description('Tags')
13
+ param tags object = {}
14
+
15
+ @description('Container App Environment ID')
16
+ param environmentId string
17
+
18
+ @description('Container image')
19
+ param containerImage string
20
+
21
+ @description('App Insights connection string')
22
+ param appInsightsConnectionString string = ''
23
+
24
+ @description('CPU cores (0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0)')
25
+ param cpu string = '0.25'
26
+
27
+ @description('Memory (0.5Gi, 1Gi, 1.5Gi, 2Gi, 3Gi, 4Gi)')
28
+ param memory string = '0.5Gi'
29
+
30
+ @description('Minimum replicas (0 = scale to zero)')
31
+ param minReplicas int = 0
32
+
33
+ @description('Maximum replicas')
34
+ param maxReplicas int = 3
35
+
36
+ @description('Target port')
37
+ param targetPort int = 8080
38
+
39
+ @description('Environment variables')
40
+ param envVars array = []
41
+
42
+ // ==============================================================================
43
+ // CONTAINER APP
44
+ // ==============================================================================
45
+
46
+ var secrets = appInsightsConnectionString != '' ? [
47
+ {
48
+ name: 'appinsights-connection-string'
49
+ value: appInsightsConnectionString
50
+ }
51
+ ] : []
52
+
53
+ var defaultEnvVars = appInsightsConnectionString != '' ? [
54
+ {
55
+ name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
56
+ secretRef: 'appinsights-connection-string'
57
+ }
58
+ {
59
+ name: 'ASPNETCORE_ENVIRONMENT'
60
+ value: 'Production'
61
+ }
62
+ ] : [
63
+ {
64
+ name: 'ASPNETCORE_ENVIRONMENT'
65
+ value: 'Production'
66
+ }
67
+ ]
68
+
69
+ resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {
70
+ name: name
71
+ location: location
72
+ tags: tags
73
+ properties: {
74
+ managedEnvironmentId: environmentId
75
+ configuration: {
76
+ ingress: {
77
+ external: true
78
+ targetPort: targetPort
79
+ transport: 'http'
80
+ allowInsecure: false
81
+ traffic: [
82
+ {
83
+ latestRevision: true
84
+ weight: 100
85
+ }
86
+ ]
87
+ }
88
+ secrets: secrets
89
+ }
90
+ template: {
91
+ containers: [
92
+ {
93
+ name: name
94
+ image: containerImage
95
+ resources: {
96
+ cpu: json(cpu)
97
+ memory: memory
98
+ }
99
+ env: concat(defaultEnvVars, envVars)
100
+ probes: [
101
+ {
102
+ type: 'Liveness'
103
+ httpGet: {
104
+ path: '/health'
105
+ port: targetPort
106
+ }
107
+ initialDelaySeconds: 10
108
+ periodSeconds: 30
109
+ failureThreshold: 3
110
+ }
111
+ {
112
+ type: 'Readiness'
113
+ httpGet: {
114
+ path: '/health/ready'
115
+ port: targetPort
116
+ }
117
+ initialDelaySeconds: 5
118
+ periodSeconds: 10
119
+ failureThreshold: 3
120
+ }
121
+ ]
122
+ }
123
+ ]
124
+ scale: {
125
+ minReplicas: minReplicas
126
+ maxReplicas: maxReplicas
127
+ rules: [
128
+ {
129
+ name: 'http-scale'
130
+ http: {
131
+ metadata: {
132
+ concurrentRequests: '100'
133
+ }
134
+ }
135
+ }
136
+ ]
137
+ }
138
+ }
139
+ }
140
+ }
141
+
142
+ // ==============================================================================
143
+ // OUTPUTS
144
+ // ==============================================================================
145
+
146
+ @description('Container App ID')
147
+ output id string = containerApp.id
148
+
149
+ @description('Container App name')
150
+ output name string = containerApp.name
151
+
152
+ @description('Container App URL')
153
+ output url string = 'https://${containerApp.properties.configuration.ingress.fqdn}'
154
+
155
+ @description('Container App FQDN')
156
+ output fqdn string = containerApp.properties.configuration.ingress.fqdn