@polymorphism-tech/morph-spec 4.6.0 → 4.7.1

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 (239) hide show
  1. package/README.md +414 -700
  2. package/docs/ARCHITECTURE.md +331 -0
  3. package/docs/CHEATSHEET.md +221 -0
  4. package/docs/COMMAND-FLOWS.md +368 -0
  5. package/docs/QUICKSTART.md +212 -0
  6. package/docs/examples/order-management/contracts.cs +84 -0
  7. package/docs/examples/order-management/proposal.md +24 -0
  8. package/docs/examples/order-management/spec.md +162 -0
  9. package/docs/plans/2026-02-23-ddd-architecture-refactor.md +1153 -0
  10. package/docs/plans/2026-02-23-ddd-nextsteps.md +682 -0
  11. package/docs/plans/2026-02-23-infra-architect-refactor.md +437 -0
  12. package/docs/plans/2026-02-23-nextjs-code-review-design.md +156 -0
  13. package/docs/plans/2026-02-23-nextjs-code-review-impl.md +1254 -0
  14. package/docs/plans/2026-02-23-nextjs-standards-design.md +149 -0
  15. package/docs/plans/2026-02-23-nextjs-standards-impl.md +1846 -0
  16. package/framework/agents/README.md +14 -14
  17. package/framework/agents/architecture/standards-architect.md +159 -159
  18. package/framework/agents/frontend/nextjs-expert.md +87 -127
  19. package/framework/agents/infrastructure/azure-architect.md +147 -147
  20. package/framework/agents/infrastructure/infra-architect.md +45 -0
  21. package/framework/agents.json +1145 -278
  22. package/framework/rules/frontend-standards.md +0 -3
  23. package/framework/rules/nextjs-standards.md +17 -0
  24. package/framework/skills/level-0-meta/code-review-nextjs/SKILL.md +147 -0
  25. package/framework/skills/level-0-meta/code-review-nextjs/references/review-example-nextjs.md +254 -0
  26. package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +3 -3
  27. package/framework/skills/level-1-workflows/phase-design/SKILL.md +45 -9
  28. package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +38 -0
  29. package/framework/standards/STANDARDS.json +121 -0
  30. package/framework/standards/architecture/ddd/bounded-contexts.md +105 -0
  31. package/framework/standards/architecture/ddd/complexity-levels.md +108 -0
  32. package/framework/standards/architecture/ddd/ubiquitous-language.md +58 -0
  33. package/framework/standards/frontend/nextjs/app-router.md +123 -0
  34. package/framework/standards/frontend/nextjs/components.md +132 -0
  35. package/framework/standards/frontend/nextjs/data-fetching.md +126 -0
  36. package/framework/standards/frontend/nextjs/forms.md +128 -0
  37. package/framework/standards/frontend/nextjs/naming-conventions.md +67 -0
  38. package/framework/standards/frontend/nextjs/project-structure.md +102 -0
  39. package/framework/standards/frontend/nextjs/state-management.md +72 -0
  40. package/framework/standards/frontend/nextjs/testing.md +111 -0
  41. package/framework/templates/REGISTRY.json +538 -142
  42. package/framework/templates/code/dotnet/contracts/contracts-level1.cs +69 -0
  43. package/framework/templates/code/dotnet/contracts/contracts-level2.cs +86 -0
  44. package/framework/templates/code/dotnet/contracts/contracts-level3.cs +41 -0
  45. package/framework/templates/docs/spec.md +49 -0
  46. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -0
  47. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -0
  48. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -0
  49. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -0
  50. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -0
  51. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -0
  52. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -0
  53. package/framework/templates/project-structure/dotnet-ddd.md +70 -0
  54. package/framework/workflows/docs/enforcement-pipeline.md +2 -1
  55. package/package.json +1 -1
  56. package/scripts/scan-nextjs.mjs +169 -0
  57. package/src/commands/project/doctor.js +52 -1
  58. package/src/commands/project/init.js +15 -1
  59. package/src/commands/project/update.js +6 -1
  60. package/src/lib/standards/standards-context-injector.js +5 -0
  61. package/src/lib/validators/nextjs/index.js +6 -0
  62. package/src/lib/validators/nextjs/next-component-validator.js +181 -0
  63. package/src/lib/validators/validation-runner.js +5 -0
  64. package/src/utils/agents-installer.js +14 -2
  65. package/.morph/.morphversion +0 -5
  66. package/.morph/analytics/threads-log.jsonl +0 -6
  67. package/.morph/config/config.json +0 -8
  68. package/.morph/framework/agents.json +0 -948
  69. package/.morph/framework/standards/STANDARDS.json +0 -812
  70. package/.morph/framework/standards/ai-agents/blazor-ui.md +0 -364
  71. package/.morph/framework/standards/ai-agents/production.md +0 -415
  72. package/.morph/framework/standards/ai-agents/setup.md +0 -418
  73. package/.morph/framework/standards/ai-agents/team-orchestration.md +0 -479
  74. package/.morph/framework/standards/ai-agents/workflows.md +0 -354
  75. package/.morph/framework/standards/architecture/ddd/aggregates.md +0 -120
  76. package/.morph/framework/standards/architecture/ddd/entities.md +0 -99
  77. package/.morph/framework/standards/architecture/ddd/value-objects.md +0 -124
  78. package/.morph/framework/standards/backend/api/minimal-api.md +0 -494
  79. package/.morph/framework/standards/backend/api/rest.md +0 -492
  80. package/.morph/framework/standards/backend/api/validation.md +0 -88
  81. package/.morph/framework/standards/backend/authentication/passkeys.md +0 -428
  82. package/.morph/framework/standards/backend/database/ef-core.md +0 -199
  83. package/.morph/framework/standards/backend/database/migrations.md +0 -393
  84. package/.morph/framework/standards/backend/database/postgresql/database.md +0 -352
  85. package/.morph/framework/standards/backend/database/repository-patterns.md +0 -528
  86. package/.morph/framework/standards/backend/database/vector-search-rag.md +0 -541
  87. package/.morph/framework/standards/backend/dotnet/async.md +0 -366
  88. package/.morph/framework/standards/backend/dotnet/core.md +0 -117
  89. package/.morph/framework/standards/backend/dotnet/di.md +0 -439
  90. package/.morph/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
  91. package/.morph/framework/standards/backend/integrations/asaas/asaas-api.md +0 -216
  92. package/.morph/framework/standards/backend/integrations/clerk/clerk-auth.md +0 -290
  93. package/.morph/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
  94. package/.morph/framework/standards/backend/integrations/resend/resend-email.md +0 -385
  95. package/.morph/framework/standards/context/analytics.md +0 -96
  96. package/.morph/framework/standards/context/bundles.md +0 -110
  97. package/.morph/framework/standards/context/priming.md +0 -78
  98. package/.morph/framework/standards/core/architecture.md +0 -185
  99. package/.morph/framework/standards/core/coding.md +0 -214
  100. package/.morph/framework/standards/core/git-branching-strategy.md +0 -403
  101. package/.morph/framework/standards/core/git.md +0 -185
  102. package/.morph/framework/standards/core/testing.md +0 -295
  103. package/.morph/framework/standards/data/nosql/blob-storage.md +0 -102
  104. package/.morph/framework/standards/data/nosql/cache/redis.md +0 -97
  105. package/.morph/framework/standards/data/nosql/cosmos-db.md +0 -118
  106. package/.morph/framework/standards/data/vector-search/azure-ai-search.md +0 -121
  107. package/.morph/framework/standards/data/vector-search/rag-chunking.md +0 -104
  108. package/.morph/framework/standards/frontend/blazor/design-checklist.md +0 -222
  109. package/.morph/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
  110. package/.morph/framework/standards/frontend/blazor/fluent-ui.md +0 -137
  111. package/.morph/framework/standards/frontend/blazor/html-conversion.md +0 -184
  112. package/.morph/framework/standards/frontend/blazor/lifecycle.md +0 -195
  113. package/.morph/framework/standards/frontend/blazor/pitfalls.md +0 -198
  114. package/.morph/framework/standards/frontend/blazor/state.md +0 -191
  115. package/.morph/framework/standards/frontend/design-system/animations.md +0 -151
  116. package/.morph/framework/standards/frontend/design-system/naming.md +0 -64
  117. package/.morph/framework/standards/frontend/nextjs/nextjs-patterns.md +0 -215
  118. package/.morph/framework/standards/infrastructure/azure/azure.md +0 -624
  119. package/.morph/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
  120. package/.morph/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
  121. package/.morph/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
  122. package/.morph/framework/standards/infrastructure/azure/services/functions.md +0 -486
  123. package/.morph/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
  124. package/.morph/framework/standards/infrastructure/azure/services/storage.md +0 -407
  125. package/.morph/framework/standards/infrastructure/docker/easypanel-deploy.md +0 -196
  126. package/.morph/framework/standards/infrastructure/supabase/mcp-setup.md +0 -252
  127. package/.morph/framework/standards/infrastructure/supabase/supabase-auth.md +0 -176
  128. package/.morph/framework/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
  129. package/.morph/framework/standards/infrastructure/supabase/supabase-rls.md +0 -184
  130. package/.morph/framework/standards/infrastructure/supabase/supabase-storage.md +0 -153
  131. package/.morph/framework/standards/integration/api/graphql.md +0 -91
  132. package/.morph/framework/standards/integration/api/grpc.md +0 -114
  133. package/.morph/framework/standards/integration/api/rest-design.md +0 -95
  134. package/.morph/framework/standards/integration/event-driven/cqrs.md +0 -101
  135. package/.morph/framework/standards/integration/event-driven/event-sourcing.md +0 -124
  136. package/.morph/framework/standards/integration/event-driven/service-bus.md +0 -95
  137. package/.morph/framework/standards/integration/mcp/mcp-tools.md +0 -384
  138. package/.morph/framework/standards/observability/logging.md +0 -131
  139. package/.morph/framework/standards/observability/metrics.md +0 -121
  140. package/.morph/framework/standards/observability/monitoring.md +0 -114
  141. package/.morph/framework/standards/observability/tracing.md +0 -132
  142. package/.morph/framework/standards/workflows/parallel-execution.md +0 -112
  143. package/.morph/framework/standards/workflows/thread-management.md +0 -113
  144. package/.morph/framework/templates/.idea/morph-templates.xml +0 -92
  145. package/.morph/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  146. package/.morph/framework/templates/IDE-SNIPPETS.md +0 -266
  147. package/.morph/framework/templates/README.md +0 -814
  148. package/.morph/framework/templates/REGISTRY.json +0 -1492
  149. package/.morph/framework/templates/code/dotnet/backend/repository.cs +0 -141
  150. package/.morph/framework/templates/code/dotnet/backend/service.cs +0 -139
  151. package/.morph/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
  152. package/.morph/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
  153. package/.morph/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
  154. package/.morph/framework/templates/code/dotnet/contracts/README.md +0 -74
  155. package/.morph/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
  156. package/.morph/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
  157. package/.morph/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
  158. package/.morph/framework/templates/code/dotnet/database/migration.cs +0 -83
  159. package/.morph/framework/templates/code/dotnet/frontend/component.razor +0 -239
  160. package/.morph/framework/templates/code/dotnet/jobs/agent.cs +0 -163
  161. package/.morph/framework/templates/code/dotnet/jobs/job.cs +0 -171
  162. package/.morph/framework/templates/code/dotnet/test.cs +0 -239
  163. package/.morph/framework/templates/code/sql/rls-policy.sql +0 -57
  164. package/.morph/framework/templates/code/sql/supabase-migration.sql +0 -100
  165. package/.morph/framework/templates/code/sql/supabase-migration.template.sql +0 -113
  166. package/.morph/framework/templates/code/typescript/contracts.ts +0 -168
  167. package/.morph/framework/templates/context/CONTEXT-FEATURE.md +0 -276
  168. package/.morph/framework/templates/context/CONTEXT.md +0 -181
  169. package/.morph/framework/templates/docs/clarifications.md +0 -253
  170. package/.morph/framework/templates/docs/onboarding.md +0 -123
  171. package/.morph/framework/templates/docs/proposal.md +0 -182
  172. package/.morph/framework/templates/docs/schema-analysis.md +0 -119
  173. package/.morph/framework/templates/docs/spec.md +0 -149
  174. package/.morph/framework/templates/docs/ui-components.md +0 -124
  175. package/.morph/framework/templates/docs/ui-design-system.md +0 -76
  176. package/.morph/framework/templates/docs/ui-flows.md +0 -167
  177. package/.morph/framework/templates/docs/ui-mockups.md +0 -98
  178. package/.morph/framework/templates/docs/user-stories.md +0 -34
  179. package/.morph/framework/templates/examples/design-system-examples.md +0 -357
  180. package/.morph/framework/templates/examples/spec-examples.md +0 -90
  181. package/.morph/framework/templates/feature/decisions.md +0 -187
  182. package/.morph/framework/templates/feature/recap.md +0 -146
  183. package/.morph/framework/templates/feature/tasks.md +0 -199
  184. package/.morph/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
  185. package/.morph/framework/templates/infrastructure/azure/README.md +0 -286
  186. package/.morph/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
  187. package/.morph/framework/templates/infrastructure/azure/app-service.bicep +0 -164
  188. package/.morph/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
  189. package/.morph/framework/templates/infrastructure/azure/container-app.bicep +0 -156
  190. package/.morph/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
  191. package/.morph/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
  192. package/.morph/framework/templates/infrastructure/azure/deploy.sh +0 -208
  193. package/.morph/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
  194. package/.morph/framework/templates/infrastructure/azure/main.bicep +0 -189
  195. package/.morph/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
  196. package/.morph/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
  197. package/.morph/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
  198. package/.morph/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
  199. package/.morph/framework/templates/infrastructure/azure/storage.bicep +0 -106
  200. package/.morph/framework/templates/infrastructure/docker/Dockerfile.template +0 -58
  201. package/.morph/framework/templates/infrastructure/docker/docker-compose.template.yml +0 -67
  202. package/.morph/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +0 -38
  203. package/.morph/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +0 -48
  204. package/.morph/framework/templates/infrastructure/docker/easypanel.template.json +0 -54
  205. package/.morph/framework/templates/infrastructure/github/README.md +0 -593
  206. package/.morph/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
  207. package/.morph/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -45
  208. package/.morph/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +0 -27
  209. package/.morph/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
  210. package/.morph/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -31
  211. package/.morph/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -59
  212. package/.morph/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -39
  213. package/.morph/framework/templates/integrations/asaas-client.cs +0 -387
  214. package/.morph/framework/templates/integrations/asaas-webhook.cs +0 -351
  215. package/.morph/framework/templates/integrations/azure-identity-config.cs +0 -288
  216. package/.morph/framework/templates/integrations/clerk-config.cs +0 -258
  217. package/.morph/framework/templates/meta-prompts/fusion/fusion-agent.md +0 -76
  218. package/.morph/framework/templates/meta-prompts/fusion/fusion-aggregator.md +0 -100
  219. package/.morph/framework/templates/meta-prompts/hops/hop-retry.md +0 -78
  220. package/.morph/framework/templates/meta-prompts/hops/hop-validation.md +0 -97
  221. package/.morph/framework/templates/meta-prompts/hops/hop-wrapper.md +0 -36
  222. package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +0 -113
  223. package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +0 -80
  224. package/.morph/framework/templates/meta-prompts/squad-leaders/backend-squad.md +0 -90
  225. package/.morph/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +0 -126
  226. package/.morph/framework/templates/meta-prompts/squad-leaders/squad-leader.md +0 -43
  227. package/.morph/framework/templates/meta-prompts/validators/checkpoint-validator.md +0 -107
  228. package/.morph/framework/templates/meta-prompts/validators/pre-commit-validator.md +0 -95
  229. package/.morph/framework/templates/saas/subscription.cs +0 -347
  230. package/.morph/framework/templates/saas/tenant.cs +0 -338
  231. package/.morph/framework/templates/state.template.json +0 -17
  232. package/.morph/framework/templates/ui/FluentDesignTheme.cs +0 -149
  233. package/.morph/framework/templates/ui/MudTheme.cs +0 -281
  234. package/.morph/framework/templates/ui/design-system.css +0 -226
  235. package/.morph/logs/tool-failures.log +0 -7
  236. package/.morph/memory/pre-compact-2026-02-23T15-43-03-521Z.json +0 -16
  237. package/.morph/state.json +0 -48
  238. package/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
  239. package/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
@@ -1,63 +0,0 @@
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
@@ -1,164 +0,0 @@
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}' : ''
@@ -1,49 +0,0 @@
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
@@ -1,156 +0,0 @@
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