@polymorphism-tech/morph-spec 4.3.2 → 4.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (414) hide show
  1. package/.morph/analytics/threads-log.jsonl +9 -0
  2. package/{stacks/blazor-azure/.morph → .morph}/config/config.json +9 -9
  3. package/.morph/state.json +48 -0
  4. package/bin/detect-agents.js +1 -2
  5. package/bin/morph-spec.js +2 -15
  6. package/{stacks/nextjs-supabase/.morph/config → framework}/agents.json +948 -948
  7. package/{stacks/nextjs-supabase/.claude → framework}/commands/morph-infra.md +1 -1
  8. package/framework/hooks/README.md +282 -0
  9. package/framework/hooks/agent-stop/validate-and-continue.js +96 -0
  10. package/framework/hooks/agent-stop/validate-checkpoints.js +101 -0
  11. package/framework/hooks/agent-stop/validate-tests.js +109 -0
  12. package/framework/hooks/agent-teams/dispatch.js +67 -0
  13. package/framework/hooks/agent-teams/phase-advanced.js +80 -0
  14. package/framework/hooks/agent-teams/task-completed.js +76 -0
  15. package/framework/hooks/agent-teams/teammate-idle.js +70 -0
  16. package/framework/hooks/commit-msg/conventional-commits.sh +33 -0
  17. package/framework/hooks/pre-commit/agents.sh +25 -0
  18. package/framework/hooks/pre-commit/orchestrator.sh +64 -0
  19. package/framework/hooks/pre-commit/specs.sh +50 -0
  20. package/framework/hooks/pre-push/run-tests.sh +44 -0
  21. package/framework/index/troubleshooting-index.json +184 -0
  22. package/framework/memory/patterns-learned.md +766 -0
  23. package/framework/skills/level-0-meta/README.md +7 -0
  24. package/framework/skills/level-0-meta/code-review.md +226 -0
  25. package/framework/skills/level-0-meta/morph-checklist.md +117 -0
  26. package/framework/skills/level-0-meta/simulation-checklist.md +77 -0
  27. package/framework/skills/level-1-workflows/README.md +7 -0
  28. package/framework/skills/level-1-workflows/morph-replicate.md +213 -0
  29. package/framework/skills/level-1-workflows/phase-clarify.md +131 -0
  30. package/framework/skills/level-1-workflows/phase-design.md +213 -0
  31. package/framework/skills/level-1-workflows/phase-setup.md +106 -0
  32. package/framework/skills/level-1-workflows/phase-tasks.md +164 -0
  33. package/framework/skills/level-1-workflows/phase-uiux.md +169 -0
  34. package/framework/skills/level-2-domains/README.md +14 -0
  35. package/framework/skills/level-2-domains/ai-agents/ai-system-architect.md +192 -0
  36. package/framework/skills/level-2-domains/architecture/po-pm-advisor.md +197 -0
  37. package/framework/skills/level-2-domains/architecture/prompt-engineer.md +189 -0
  38. package/framework/skills/level-2-domains/architecture/seo-growth-hacker.md +320 -0
  39. package/framework/skills/level-2-domains/architecture/standards-architect.md +156 -0
  40. package/framework/skills/level-2-domains/backend/api-designer.md +59 -0
  41. package/framework/skills/level-2-domains/backend/dotnet-senior.md +77 -0
  42. package/framework/skills/level-2-domains/backend/ef-modeler.md +58 -0
  43. package/framework/skills/level-2-domains/backend/hangfire-orchestrator.md +126 -0
  44. package/framework/skills/level-2-domains/backend/ms-agent-expert.md +45 -0
  45. package/framework/skills/level-2-domains/frontend/blazor-builder.md +210 -0
  46. package/framework/skills/level-2-domains/frontend/nextjs-expert.md +154 -0
  47. package/framework/skills/level-2-domains/frontend/ui-ux-designer.md +191 -0
  48. package/framework/skills/level-2-domains/infrastructure/azure-architect.md +142 -0
  49. package/framework/skills/level-2-domains/infrastructure/azure-deploy-specialist.md +699 -0
  50. package/framework/skills/level-2-domains/infrastructure/bicep-architect.md +126 -0
  51. package/framework/skills/level-2-domains/infrastructure/container-specialist.md +131 -0
  52. package/framework/skills/level-2-domains/infrastructure/devops-engineer.md +119 -0
  53. package/framework/skills/level-2-domains/integrations/asaas-financial.md +130 -0
  54. package/framework/skills/level-2-domains/integrations/azure-identity.md +142 -0
  55. package/framework/skills/level-2-domains/integrations/clerk-auth.md +108 -0
  56. package/framework/skills/level-2-domains/integrations/hangfire-orchestrator.md +64 -0
  57. package/framework/skills/level-2-domains/integrations/resend-email.md +119 -0
  58. package/framework/skills/level-2-domains/quality/code-analyzer.md +235 -0
  59. package/framework/skills/level-2-domains/quality/testing-specialist.md +126 -0
  60. package/framework/skills/level-3-technologies/README.md +7 -0
  61. package/framework/skills/level-4-patterns/README.md +7 -0
  62. package/framework/squad-templates/backend-only.json +34 -0
  63. package/framework/squad-templates/frontend-only.json +34 -0
  64. package/framework/squad-templates/full-stack.json +52 -0
  65. package/framework/templates/.idea/morph-templates.xml +92 -0
  66. package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
  67. package/framework/templates/IDE-SNIPPETS.md +266 -0
  68. package/framework/templates/README.md +814 -0
  69. package/framework/templates/REGISTRY.json +1677 -0
  70. package/framework/templates/code/dotnet/backend/repository.cs +141 -0
  71. package/framework/templates/code/dotnet/backend/service.cs +139 -0
  72. package/framework/templates/code/dotnet/contracts/Commands.cs +74 -0
  73. package/framework/templates/code/dotnet/contracts/Entities.cs +25 -0
  74. package/framework/templates/code/dotnet/contracts/Queries.cs +74 -0
  75. package/framework/templates/code/dotnet/contracts/README.md +74 -0
  76. package/framework/templates/code/dotnet/contracts/api-contracts.cs +173 -0
  77. package/framework/templates/code/dotnet/contracts/contracts.cs +217 -0
  78. package/framework/templates/code/dotnet/database/migration.cs +83 -0
  79. package/framework/templates/code/dotnet/frontend/component.razor +239 -0
  80. package/framework/templates/code/dotnet/jobs/agent.cs +163 -0
  81. package/framework/templates/code/dotnet/jobs/job.cs +171 -0
  82. package/framework/templates/code/dotnet/test.cs +239 -0
  83. package/framework/templates/code/sql/rls-policy.sql +57 -0
  84. package/framework/templates/code/sql/supabase-migration.sql +100 -0
  85. package/framework/templates/code/sql/supabase-migration.template.sql +113 -0
  86. package/framework/templates/code/typescript/contracts.ts +168 -0
  87. package/framework/templates/context/CONTEXT-FEATURE.md +276 -0
  88. package/framework/templates/context/CONTEXT.md +181 -0
  89. package/framework/templates/docs/proposal.md +182 -0
  90. package/framework/templates/docs/spec.md +149 -0
  91. package/framework/templates/examples/design-system-examples.md +357 -0
  92. package/framework/templates/examples/spec-examples.md +90 -0
  93. package/framework/templates/feature/decisions.md +187 -0
  94. package/framework/templates/feature/recap.md +146 -0
  95. package/framework/templates/feature/tasks.md +199 -0
  96. package/framework/templates/infrastructure/azure/Dockerfile.example +82 -0
  97. package/framework/templates/infrastructure/azure/README.md +286 -0
  98. package/framework/templates/infrastructure/azure/app-insights.bicep +63 -0
  99. package/framework/templates/infrastructure/azure/app-service.bicep +164 -0
  100. package/framework/templates/infrastructure/azure/container-app-env.bicep +49 -0
  101. package/framework/templates/infrastructure/azure/container-app.bicep +156 -0
  102. package/framework/templates/infrastructure/azure/deploy-checklist.md +426 -0
  103. package/framework/templates/infrastructure/azure/deploy.ps1 +229 -0
  104. package/framework/templates/infrastructure/azure/deploy.sh +208 -0
  105. package/framework/templates/infrastructure/azure/key-vault.bicep +91 -0
  106. package/framework/templates/infrastructure/azure/main.bicep +189 -0
  107. package/framework/templates/infrastructure/azure/parameters.dev.json +29 -0
  108. package/framework/templates/infrastructure/azure/parameters.prod.json +29 -0
  109. package/framework/templates/infrastructure/azure/parameters.staging.json +29 -0
  110. package/framework/templates/infrastructure/azure/sql-database.bicep +103 -0
  111. package/framework/templates/infrastructure/azure/storage.bicep +106 -0
  112. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -0
  113. package/framework/templates/infrastructure/docker/docker-compose.template.yml +67 -0
  114. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -0
  115. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -0
  116. package/framework/templates/infrastructure/docker/easypanel.template.json +54 -0
  117. package/framework/templates/infrastructure/github/README.md +593 -0
  118. package/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +22 -0
  119. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -0
  120. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -0
  121. package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +61 -0
  122. package/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +31 -0
  123. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -0
  124. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -0
  125. package/framework/templates/integrations/asaas-client.cs +387 -0
  126. package/framework/templates/integrations/asaas-webhook.cs +351 -0
  127. package/framework/templates/integrations/azure-identity-config.cs +288 -0
  128. package/framework/templates/integrations/clerk-config.cs +258 -0
  129. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -0
  130. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -0
  131. package/framework/templates/meta-prompts/hops/hop-retry.md +78 -0
  132. package/framework/templates/meta-prompts/hops/hop-validation.md +97 -0
  133. package/framework/templates/meta-prompts/hops/hop-wrapper.md +36 -0
  134. package/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +113 -0
  135. package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +80 -0
  136. package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +90 -0
  137. package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +126 -0
  138. package/framework/templates/meta-prompts/squad-leaders/squad-leader.md +43 -0
  139. package/framework/templates/meta-prompts/validators/checkpoint-validator.md +107 -0
  140. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -0
  141. package/framework/templates/saas/subscription.cs +347 -0
  142. package/framework/templates/saas/tenant.cs +338 -0
  143. package/framework/templates/state.template.json +17 -0
  144. package/framework/templates/ui/FluentDesignTheme.cs +149 -0
  145. package/framework/templates/ui/MudTheme.cs +281 -0
  146. package/framework/templates/ui/design-system.css +226 -0
  147. package/framework/workflows/README.md +1041 -0
  148. package/framework/workflows/configs/design-impl.json +49 -0
  149. package/framework/workflows/configs/fast-track.json +42 -0
  150. package/framework/workflows/configs/full-morph.json +79 -0
  151. package/framework/workflows/configs/fusion.json +39 -0
  152. package/framework/workflows/configs/long-running.json +33 -0
  153. package/framework/workflows/configs/standard.json +60 -0
  154. package/framework/workflows/configs/ui-refresh.json +49 -0
  155. package/framework/workflows/configs/zero-touch.json +75 -0
  156. package/framework/workflows/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -0
  157. package/framework/workflows/docs/design-impl.md +37 -0
  158. package/framework/workflows/docs/enforcement-pipeline.md +668 -0
  159. package/framework/workflows/docs/fast-track.md +29 -0
  160. package/framework/workflows/docs/full-morph.md +76 -0
  161. package/framework/workflows/docs/standard.md +44 -0
  162. package/framework/workflows/docs/ui-refresh.md +39 -0
  163. package/package.json +3 -3
  164. package/src/commands/feature/create-story.js +11 -7
  165. package/src/commands/project/detect-agents.js +1 -2
  166. package/src/commands/project/init.js +78 -31
  167. package/src/commands/project/update.js +9 -5
  168. package/src/commands/templates/template-customize.js +3 -17
  169. package/src/commands/templates/template-list.js +1 -15
  170. package/src/commands/templates/template-render.js +2 -3
  171. package/src/commands/templates/template-show.js +3 -5
  172. package/src/core/templates/template-registry.js +9 -23
  173. package/src/lib/detectors/structure-detector.js +3 -3
  174. package/src/lib/generators/context-generator.js +18 -6
  175. package/src/lib/hooks/hook-executor.js +0 -2
  176. package/src/lib/orchestration/team-orchestrator.js +1 -2
  177. package/src/lib/standards/standards-context-injector.js +3 -4
  178. package/src/lib/troubleshooting/troubleshoot-grep.js +3 -9
  179. package/src/lib/validators/validation-runner.js +1 -2
  180. package/src/utils/file-copier.js +1 -2
  181. package/docs/README.md +0 -144
  182. package/docs/api/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  183. package/docs/api/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  184. package/docs/api/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  185. package/docs/api/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  186. package/docs/api/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  187. package/docs/api/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  188. package/docs/api/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  189. package/docs/api/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  190. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  191. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +0 -978
  192. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  193. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  194. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  195. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  196. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +0 -1049
  197. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  198. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  199. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  200. package/docs/api/scripts/collapse.js +0 -39
  201. package/docs/api/scripts/commonNav.js +0 -28
  202. package/docs/api/scripts/linenumber.js +0 -25
  203. package/docs/api/scripts/nav.js +0 -12
  204. package/docs/api/scripts/polyfill.js +0 -4
  205. package/docs/api/scripts/prettify/Apache-License-2.0.txt +0 -202
  206. package/docs/api/scripts/prettify/lang-css.js +0 -2
  207. package/docs/api/scripts/prettify/prettify.js +0 -28
  208. package/docs/api/scripts/search.js +0 -99
  209. package/docs/api/styles/jsdoc.css +0 -776
  210. package/docs/api/styles/prettify.css +0 -80
  211. package/docs/cli-auto-detection.md +0 -219
  212. package/docs/getting-started.md +0 -296
  213. package/docs/installation.md +0 -361
  214. package/docs/next-generation/AGENTS.md +0 -521
  215. package/docs/next-generation/ANALYSIS.md +0 -555
  216. package/docs/next-generation/ARCHITECTURE.md +0 -436
  217. package/docs/next-generation/CONTEXT-OPTIMIZATION.md +0 -267
  218. package/docs/next-generation/EXECUTION-FLOW.md +0 -274
  219. package/docs/next-generation/FEATURES.md +0 -688
  220. package/docs/next-generation/META-PROMPTS.md +0 -235
  221. package/docs/next-generation/MIGRATION-GUIDE.md +0 -253
  222. package/docs/next-generation/README.md +0 -231
  223. package/docs/next-generation/ROADMAP.md +0 -801
  224. package/docs/next-generation/THREAD-MANAGEMENT.md +0 -240
  225. package/docs/templates.md +0 -418
  226. package/docs/troubleshooting.md +0 -269
  227. package/docs/validation-checklist.md +0 -264
  228. package/scripts/postinstall.js +0 -132
  229. package/src/lib/stacks/index.js +0 -7
  230. package/src/lib/stacks/stack-resolver.js +0 -180
  231. package/stacks/blazor-azure/.claude/commands/morph-deploy.md +0 -529
  232. package/stacks/blazor-azure/.claude/commands/morph-infra.md +0 -209
  233. package/stacks/blazor-azure/.morph/.morphversion +0 -5
  234. package/stacks/blazor-azure/.morph/archive/.gitkeep +0 -25
  235. package/stacks/blazor-azure/.morph/config/agents.json +0 -948
  236. package/stacks/blazor-azure/.morph/config/config.template.json +0 -122
  237. package/stacks/blazor-azure/.morph/features/.gitkeep +0 -25
  238. package/stacks/blazor-azure/.morph/hooks/pre-commit/tests-csharp.sh +0 -61
  239. package/stacks/blazor-azure/.morph/project/context/README.md +0 -17
  240. package/stacks/blazor-azure/.morph/project.md +0 -160
  241. package/stacks/blazor-azure/.morph/schemas/agent.schema.json +0 -296
  242. package/stacks/blazor-azure/.morph/schemas/tasks.schema.json +0 -220
  243. package/stacks/blazor-azure/.morph/specs/.gitkeep +0 -20
  244. package/stacks/blazor-azure/.morph/state.json +0 -18
  245. package/stacks/blazor-azure/.morph/test-infra/example.bicep +0 -59
  246. package/stacks/blazor-azure/CLAUDE.md +0 -155
  247. package/stacks/blazor-azure/README.md +0 -79
  248. package/stacks/nextjs-supabase/.claude/commands/morph-apply.md +0 -221
  249. package/stacks/nextjs-supabase/.claude/commands/morph-archive.md +0 -79
  250. package/stacks/nextjs-supabase/.claude/commands/morph-deploy.md +0 -529
  251. package/stacks/nextjs-supabase/.claude/commands/morph-preflight.md +0 -227
  252. package/stacks/nextjs-supabase/.claude/commands/morph-proposal.md +0 -122
  253. package/stacks/nextjs-supabase/.claude/commands/morph-status.md +0 -86
  254. package/stacks/nextjs-supabase/.claude/commands/morph-troubleshoot.md +0 -122
  255. package/stacks/nextjs-supabase/.morph/.morphversion +0 -5
  256. package/stacks/nextjs-supabase/.morph/config/config.json +0 -9
  257. package/stacks/nextjs-supabase/.morph/config/config.template.json +0 -92
  258. package/stacks/nextjs-supabase/.morph/hooks/pre-commit/tests-typescript.sh +0 -61
  259. package/stacks/nextjs-supabase/.morph/project/context/README.md +0 -17
  260. package/stacks/nextjs-supabase/.morph/project.md +0 -168
  261. package/stacks/nextjs-supabase/.morph/standards/ai-agents/blazor-ui.md +0 -364
  262. package/stacks/nextjs-supabase/.morph/standards/ai-agents/production.md +0 -415
  263. package/stacks/nextjs-supabase/.morph/standards/ai-agents/setup.md +0 -418
  264. package/stacks/nextjs-supabase/.morph/standards/ai-agents/team-orchestration.md +0 -479
  265. package/stacks/nextjs-supabase/.morph/standards/ai-agents/workflows.md +0 -354
  266. package/stacks/nextjs-supabase/.morph/standards/architecture/ddd/aggregates.md +0 -120
  267. package/stacks/nextjs-supabase/.morph/standards/architecture/ddd/entities.md +0 -99
  268. package/stacks/nextjs-supabase/.morph/standards/architecture/ddd/value-objects.md +0 -124
  269. package/stacks/nextjs-supabase/.morph/standards/backend/api/minimal-api.md +0 -494
  270. package/stacks/nextjs-supabase/.morph/standards/backend/api/rest.md +0 -492
  271. package/stacks/nextjs-supabase/.morph/standards/backend/api/validation.md +0 -88
  272. package/stacks/nextjs-supabase/.morph/standards/backend/authentication/passkeys.md +0 -428
  273. package/stacks/nextjs-supabase/.morph/standards/backend/database/ef-core.md +0 -199
  274. package/stacks/nextjs-supabase/.morph/standards/backend/database/migrations.md +0 -393
  275. package/stacks/nextjs-supabase/.morph/standards/backend/database/postgresql/database.md +0 -352
  276. package/stacks/nextjs-supabase/.morph/standards/backend/database/repository-patterns.md +0 -528
  277. package/stacks/nextjs-supabase/.morph/standards/backend/database/vector-search-rag.md +0 -541
  278. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/async.md +0 -366
  279. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/core.md +0 -117
  280. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/di.md +0 -439
  281. package/stacks/nextjs-supabase/.morph/standards/backend/dotnet/program-cs-checklist.md +0 -92
  282. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/asaas/asaas-api.md +0 -216
  283. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/clerk/clerk-auth.md +0 -290
  284. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
  285. package/stacks/nextjs-supabase/.morph/standards/backend/integrations/resend/resend-email.md +0 -385
  286. package/stacks/nextjs-supabase/.morph/standards/context/analytics.md +0 -96
  287. package/stacks/nextjs-supabase/.morph/standards/context/bundles.md +0 -110
  288. package/stacks/nextjs-supabase/.morph/standards/context/priming.md +0 -78
  289. package/stacks/nextjs-supabase/.morph/standards/core/architecture.md +0 -185
  290. package/stacks/nextjs-supabase/.morph/standards/core/coding.md +0 -214
  291. package/stacks/nextjs-supabase/.morph/standards/core/git-branching-strategy.md +0 -403
  292. package/stacks/nextjs-supabase/.morph/standards/core/git.md +0 -185
  293. package/stacks/nextjs-supabase/.morph/standards/core/testing.md +0 -295
  294. package/stacks/nextjs-supabase/.morph/standards/data/nosql/blob-storage.md +0 -102
  295. package/stacks/nextjs-supabase/.morph/standards/data/nosql/cache/redis.md +0 -97
  296. package/stacks/nextjs-supabase/.morph/standards/data/nosql/cosmos-db.md +0 -118
  297. package/stacks/nextjs-supabase/.morph/standards/data/vector-search/azure-ai-search.md +0 -121
  298. package/stacks/nextjs-supabase/.morph/standards/data/vector-search/rag-chunking.md +0 -104
  299. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/design-checklist.md +0 -222
  300. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/fluent-ui-setup.md +0 -595
  301. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/fluent-ui.md +0 -137
  302. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/html-conversion.md +0 -184
  303. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/lifecycle.md +0 -195
  304. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/pitfalls.md +0 -198
  305. package/stacks/nextjs-supabase/.morph/standards/frontend/blazor/state.md +0 -191
  306. package/stacks/nextjs-supabase/.morph/standards/frontend/design-system/animations.md +0 -151
  307. package/stacks/nextjs-supabase/.morph/standards/frontend/design-system/naming.md +0 -64
  308. package/stacks/nextjs-supabase/.morph/standards/frontend/nextjs/nextjs-patterns.md +0 -198
  309. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/azure.md +0 -624
  310. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
  311. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
  312. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/devops/local-development.md +0 -520
  313. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/services/functions.md +0 -486
  314. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/services/service-bus.md +0 -459
  315. package/stacks/nextjs-supabase/.morph/standards/infrastructure/azure/services/storage.md +0 -407
  316. package/stacks/nextjs-supabase/.morph/standards/infrastructure/docker/easypanel-deploy.md +0 -196
  317. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/mcp-setup.md +0 -252
  318. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-auth.md +0 -176
  319. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
  320. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-rls.md +0 -184
  321. package/stacks/nextjs-supabase/.morph/standards/infrastructure/supabase/supabase-storage.md +0 -153
  322. package/stacks/nextjs-supabase/.morph/standards/integration/api/graphql.md +0 -91
  323. package/stacks/nextjs-supabase/.morph/standards/integration/api/grpc.md +0 -114
  324. package/stacks/nextjs-supabase/.morph/standards/integration/api/rest-design.md +0 -95
  325. package/stacks/nextjs-supabase/.morph/standards/integration/event-driven/cqrs.md +0 -101
  326. package/stacks/nextjs-supabase/.morph/standards/integration/event-driven/event-sourcing.md +0 -124
  327. package/stacks/nextjs-supabase/.morph/standards/integration/event-driven/service-bus.md +0 -95
  328. package/stacks/nextjs-supabase/.morph/standards/observability/logging.md +0 -131
  329. package/stacks/nextjs-supabase/.morph/standards/observability/metrics.md +0 -121
  330. package/stacks/nextjs-supabase/.morph/standards/observability/monitoring.md +0 -114
  331. package/stacks/nextjs-supabase/.morph/standards/observability/tracing.md +0 -132
  332. package/stacks/nextjs-supabase/.morph/standards/workflows/parallel-execution.md +0 -112
  333. package/stacks/nextjs-supabase/.morph/standards/workflows/thread-management.md +0 -113
  334. package/stacks/nextjs-supabase/CLAUDE.md +0 -155
  335. package/stacks/nextjs-supabase/README.md +0 -103
  336. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-apply.md +0 -0
  337. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-archive.md +0 -0
  338. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-preflight.md +0 -0
  339. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-proposal.md +0 -0
  340. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-status.md +0 -0
  341. /package/{stacks/blazor-azure/.claude → framework}/commands/morph-troubleshoot.md +0 -0
  342. /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/blazor-ui.md +0 -0
  343. /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/production.md +0 -0
  344. /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/setup.md +0 -0
  345. /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/team-orchestration.md +0 -0
  346. /package/{stacks/blazor-azure/.morph → framework}/standards/ai-agents/workflows.md +0 -0
  347. /package/{stacks/blazor-azure/.morph → framework}/standards/architecture/ddd/aggregates.md +0 -0
  348. /package/{stacks/blazor-azure/.morph → framework}/standards/architecture/ddd/entities.md +0 -0
  349. /package/{stacks/blazor-azure/.morph → framework}/standards/architecture/ddd/value-objects.md +0 -0
  350. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/api/minimal-api.md +0 -0
  351. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/api/rest.md +0 -0
  352. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/api/validation.md +0 -0
  353. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/authentication/passkeys.md +0 -0
  354. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/ef-core.md +0 -0
  355. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/migrations.md +0 -0
  356. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/postgresql/database.md +0 -0
  357. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/repository-patterns.md +0 -0
  358. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/database/vector-search-rag.md +0 -0
  359. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/async.md +0 -0
  360. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/core.md +0 -0
  361. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/di.md +0 -0
  362. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/dotnet/program-cs-checklist.md +0 -0
  363. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/asaas/asaas-api.md +0 -0
  364. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/clerk/clerk-auth.md +0 -0
  365. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -0
  366. /package/{stacks/blazor-azure/.morph → framework}/standards/backend/integrations/resend/resend-email.md +0 -0
  367. /package/{stacks/blazor-azure/.morph → framework}/standards/context/analytics.md +0 -0
  368. /package/{stacks/blazor-azure/.morph → framework}/standards/context/bundles.md +0 -0
  369. /package/{stacks/blazor-azure/.morph → framework}/standards/context/priming.md +0 -0
  370. /package/{stacks/blazor-azure/.morph → framework}/standards/core/architecture.md +0 -0
  371. /package/{stacks/blazor-azure/.morph → framework}/standards/core/coding.md +0 -0
  372. /package/{stacks/blazor-azure/.morph → framework}/standards/core/git-branching-strategy.md +0 -0
  373. /package/{stacks/blazor-azure/.morph → framework}/standards/core/git.md +0 -0
  374. /package/{stacks/blazor-azure/.morph → framework}/standards/core/testing.md +0 -0
  375. /package/{stacks/blazor-azure/.morph → framework}/standards/data/nosql/blob-storage.md +0 -0
  376. /package/{stacks/blazor-azure/.morph → framework}/standards/data/nosql/cache/redis.md +0 -0
  377. /package/{stacks/blazor-azure/.morph → framework}/standards/data/nosql/cosmos-db.md +0 -0
  378. /package/{stacks/blazor-azure/.morph → framework}/standards/data/vector-search/azure-ai-search.md +0 -0
  379. /package/{stacks/blazor-azure/.morph → framework}/standards/data/vector-search/rag-chunking.md +0 -0
  380. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/design-checklist.md +0 -0
  381. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/fluent-ui-setup.md +0 -0
  382. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/fluent-ui.md +0 -0
  383. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/html-conversion.md +0 -0
  384. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/lifecycle.md +0 -0
  385. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/pitfalls.md +0 -0
  386. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/blazor/state.md +0 -0
  387. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/design-system/animations.md +0 -0
  388. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/design-system/naming.md +0 -0
  389. /package/{stacks/blazor-azure/.morph → framework}/standards/frontend/nextjs/nextjs-patterns.md +0 -0
  390. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/azure.md +0 -0
  391. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -0
  392. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -0
  393. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/devops/local-development.md +0 -0
  394. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/services/functions.md +0 -0
  395. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/services/service-bus.md +0 -0
  396. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/azure/services/storage.md +0 -0
  397. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/docker/easypanel-deploy.md +0 -0
  398. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/mcp-setup.md +0 -0
  399. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-auth.md +0 -0
  400. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-pgvector.md +0 -0
  401. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-rls.md +0 -0
  402. /package/{stacks/blazor-azure/.morph → framework}/standards/infrastructure/supabase/supabase-storage.md +0 -0
  403. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/api/graphql.md +0 -0
  404. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/api/grpc.md +0 -0
  405. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/api/rest-design.md +0 -0
  406. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/event-driven/cqrs.md +0 -0
  407. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/event-driven/event-sourcing.md +0 -0
  408. /package/{stacks/blazor-azure/.morph → framework}/standards/integration/event-driven/service-bus.md +0 -0
  409. /package/{stacks/blazor-azure/.morph → framework}/standards/observability/logging.md +0 -0
  410. /package/{stacks/blazor-azure/.morph → framework}/standards/observability/metrics.md +0 -0
  411. /package/{stacks/blazor-azure/.morph → framework}/standards/observability/monitoring.md +0 -0
  412. /package/{stacks/blazor-azure/.morph → framework}/standards/observability/tracing.md +0 -0
  413. /package/{stacks/blazor-azure/.morph → framework}/standards/workflows/parallel-execution.md +0 -0
  414. /package/{stacks/blazor-azure/.morph → framework}/standards/workflows/thread-management.md +0 -0
@@ -0,0 +1,593 @@
1
+ # GitHub Actions Templates for MORPH-SPEC
2
+
3
+ > **Framework-Level CI/CD Templates for Azure App Service & EasyPanel Deployments**
4
+
5
+ ## Overview
6
+
7
+ This directory contains reusable GitHub Actions workflows and composite actions that enable CI/CD automation for both **blazor-azure** (Azure App Service) and **nextjs-supabase** (EasyPanel/Docker) stacks.
8
+
9
+ **Key Features:**
10
+ - ✅ Framework-level reusability across stacks
11
+ - ✅ Handlebars v2.0 templating with helpers
12
+ - ✅ OIDC authentication for Azure (no long-lived secrets)
13
+ - ✅ Composite actions for shared logic
14
+ - ✅ Stack-specific override mechanism
15
+
16
+ ---
17
+
18
+ ## 📁 Structure
19
+
20
+ ```
21
+ infrastructure/github/
22
+ ├── workflows/ # Reusable workflow templates
23
+ │ ├── dotnet-build.yml.hbs # .NET restore, build, test, coverage
24
+ │ ├── docker-build-push.yml.hbs # Docker build & push to registry
25
+ │ ├── deploy-azure-app-service.yml.hbs # Azure App Service deployment
26
+ │ └── deploy-easypanel.yml.hbs # EasyPanel deployment via webhook
27
+
28
+ └── actions/ # Composite action templates
29
+ ├── docker-build-push/action.yml.hbs # Build & push Docker image
30
+ ├── health-check/action.yml.hbs # Poll health endpoint
31
+ └── azure-auth/action.yml.hbs # Azure OIDC login
32
+ ```
33
+
34
+ ---
35
+
36
+ ## 🔄 Reusable Workflows vs Composite Actions
37
+
38
+ | Type | Purpose | When to Use | Example |
39
+ |------|---------|-------------|---------|
40
+ | **Reusable Workflows** | Complete CI/CD pipeline (multiple jobs) | Build + test + deploy | `dotnet-build.yml.hbs`, `deploy-azure-app-service.yml.hbs` |
41
+ | **Composite Actions** | Single responsibility (grouped steps) | Reusable task across workflows | `azure-auth/action.yml.hbs`, `health-check/action.yml.hbs` |
42
+
43
+ ### Reusable Workflows
44
+
45
+ **Characteristics:**
46
+ - Defined with `on: workflow_call`
47
+ - Can have multiple jobs
48
+ - Accept inputs and secrets via `with:` and `secrets: inherit`
49
+ - Called from other workflows using `uses:` at job level
50
+
51
+ **Example Usage:**
52
+ ```yaml
53
+ jobs:
54
+ build:
55
+ uses: ./.github/workflows/dotnet-build.yml
56
+ with:
57
+ dotnet-version: '10.0'
58
+ run-tests: true
59
+ secrets: inherit
60
+ ```
61
+
62
+ ### Composite Actions
63
+
64
+ **Characteristics:**
65
+ - Defined with `runs: using: 'composite'`
66
+ - Bundle related shell commands
67
+ - Lightweight (no containerization needed)
68
+ - Called using `uses:` at step level
69
+
70
+ **Example Usage:**
71
+ ```yaml
72
+ steps:
73
+ - name: Azure Login
74
+ uses: ./.github/actions/azure-auth
75
+ with:
76
+ client-id: ${{ secrets.AZURE_CLIENT_ID }}
77
+ tenant-id: ${{ secrets.AZURE_TENANT_ID }}
78
+ subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
79
+ ```
80
+
81
+ ---
82
+
83
+ ## 🏗️ Deployment Architectures
84
+
85
+ ### Blazor-Azure (Azure App Service)
86
+
87
+ **Deployment Flow:**
88
+ 1. **Build:** `dotnet restore` → `dotnet build` → `dotnet test`
89
+ 2. **Publish:** `dotnet publish -c Release -o ./publish`
90
+ 3. **Infrastructure:** Deploy Bicep (App Service Plan + App Service)
91
+ 4. **Deploy:** `azure/webapps-deploy@v2` with publish folder
92
+ 5. **Health Check:** Poll `/health` endpoint
93
+
94
+ **Key Characteristics:**
95
+ - ✅ Direct .NET publish (no Docker)
96
+ - ✅ OIDC authentication (Federated Identity)
97
+ - ✅ Bicep IaC for infrastructure
98
+ - ✅ App Service deployment slots for blue-green
99
+
100
+ **GitHub Secrets Required:**
101
+ - `AZURE_CLIENT_ID` - Entra ID app registration client ID
102
+ - `AZURE_TENANT_ID` - Azure AD tenant ID
103
+ - `AZURE_SUBSCRIPTION_ID` - Azure subscription ID
104
+
105
+ **Workflows:**
106
+ - Framework: `deploy-azure-app-service.yml.hbs`
107
+ - Stack: `stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/cd-prod.yml.hbs`
108
+
109
+ ### NextJS-Supabase (EasyPanel/Docker)
110
+
111
+ **Deployment Flow:**
112
+ 1. **Build Backend:** `dotnet restore` → `dotnet build` → `dotnet test`
113
+ 2. **Build Frontend:** `npm ci` → `npm run build` → `npm test`
114
+ 3. **Docker:** Multi-stage build for API + Web
115
+ 4. **Push:** Docker image to GitHub Container Registry (ghcr.io)
116
+ 5. **Deploy:** Trigger EasyPanel webhook with image tag
117
+ 6. **Health Check:** Poll `/health` endpoint
118
+
119
+ **Key Characteristics:**
120
+ - ✅ Docker-based deployment
121
+ - ✅ Multi-service (API + Web)
122
+ - ✅ GitHub Container Registry (ghcr.io)
123
+ - ✅ EasyPanel webhook deployment
124
+
125
+ **GitHub Secrets Required:**
126
+ - `GITHUB_TOKEN` - Auto-provided for ghcr.io
127
+ - `EASYPANEL_WEBHOOK_URL` - EasyPanel deployment webhook
128
+ - `EASYPANEL_API_TOKEN` - EasyPanel API authentication
129
+ - `APP_URL` - Application URL for health checks
130
+
131
+ **Workflows:**
132
+ - Framework: `docker-build-push.yml.hbs`, `deploy-easypanel.yml.hbs`
133
+ - Stack: `stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/cd-prod.yml.hbs`
134
+
135
+ ---
136
+
137
+ ## 🔐 Authentication & Security
138
+
139
+ ### Azure OIDC (Blazor-Azure)
140
+
141
+ **Setup Steps:**
142
+
143
+ 1. **Create Entra ID App Registration:**
144
+ ```bash
145
+ az ad app create --display-name "GitHub-Blazor-Azure-OIDC"
146
+ ```
147
+
148
+ 2. **Configure Federated Credentials:**
149
+ ```bash
150
+ az ad app federated-credential create \
151
+ --id <APP_ID> \
152
+ --parameters '{
153
+ "name": "github-prod",
154
+ "issuer": "https://token.actions.githubusercontent.com",
155
+ "subject": "repo:<ORG>/<REPO>:environment:production",
156
+ "audiences": ["api://AzureADTokenExchange"]
157
+ }'
158
+ ```
159
+
160
+ 3. **Assign RBAC Roles:**
161
+ ```bash
162
+ az role assignment create \
163
+ --assignee <APP_ID> \
164
+ --role "Contributor" \
165
+ --scope /subscriptions/<SUBSCRIPTION_ID>
166
+ ```
167
+
168
+ 4. **Configure GitHub Secrets:**
169
+ - `AZURE_CLIENT_ID` - App registration client ID
170
+ - `AZURE_TENANT_ID` - Tenant ID
171
+ - `AZURE_SUBSCRIPTION_ID` - Subscription ID
172
+
173
+ **Workflow Usage:**
174
+ ```yaml
175
+ - name: Azure Login (OIDC)
176
+ uses: azure/login@v1
177
+ with:
178
+ client-id: ${{ secrets.AZURE_CLIENT_ID }}
179
+ tenant-id: ${{ secrets.AZURE_TENANT_ID }}
180
+ subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
181
+ ```
182
+
183
+ ### GitHub Container Registry (NextJS-Supabase)
184
+
185
+ **Setup:**
186
+
187
+ 1. **Enable GHCR:**
188
+ - No additional setup needed - `GITHUB_TOKEN` is auto-provided
189
+
190
+ 2. **Workflow Usage:**
191
+ ```yaml
192
+ - name: Login to GHCR
193
+ uses: docker/login-action@v3
194
+ with:
195
+ registry: ghcr.io
196
+ username: ${{ github.actor }}
197
+ password: ${{ secrets.GITHUB_TOKEN }}
198
+ ```
199
+
200
+ 3. **Image Naming:**
201
+ ```yaml
202
+ image: ghcr.io/${{ github.repository_owner }}/myapp:${{ github.sha }}
203
+ ```
204
+
205
+ ---
206
+
207
+ ## 📝 Handlebars Variables & Helpers
208
+
209
+ ### Auto-Injected Variables
210
+
211
+ | Variable | Example | Source |
212
+ |----------|---------|--------|
213
+ | `{{APP_NAME}}` | `myapp` | config.json → project.name |
214
+ | `{{DOTNET_VERSION}}` | `10.0` | config.json → dotnet.version |
215
+ | `{{GITHUB_OWNER}}` | `myorg` | config.json → repository.owner |
216
+ | `{{DATE}}` | `2026-02-18` | Generated at render time |
217
+ | `{{YEAR}}` | `2026` | Generated at render time |
218
+
219
+ ### Handlebars Helpers
220
+
221
+ | Helper | Input | Output | Use Case |
222
+ |--------|-------|--------|----------|
223
+ | `{{kebabCase str}}` | `MyApp` | `my-app` | Docker image names, Azure resources |
224
+ | `{{pascalCase str}}` | `my-app` | `MyApp` | Class names (rarely needed in YAML) |
225
+ | `{{camelCase str}}` | `my-app` | `myApp` | Variables (rarely needed in YAML) |
226
+
227
+ ### Escaping GitHub Actions Syntax
228
+
229
+ **Problem:** GitHub Actions uses `${{ }}` syntax, which conflicts with Handlebars.
230
+
231
+ **Solution:** Use `{{{{raw}}}}` blocks to preserve GitHub Actions syntax:
232
+
233
+ ```yaml
234
+ # WRONG (Handlebars will interpret this)
235
+ dotnet-version: ${{ inputs.dotnet-version }}
236
+
237
+ # CORRECT (Escaped for GitHub Actions)
238
+ dotnet-version: {{{{raw}}}}${{ inputs.dotnet-version }}{{{{/raw}}}}
239
+ ```
240
+
241
+ **In Templates:**
242
+ ```handlebars
243
+ {{#if run-tests}}
244
+ - name: Test
245
+ run: dotnet test --configuration {{{{raw}}}}${{ inputs.build-configuration }}{{{{/raw}}}}
246
+ {{/if}}
247
+ ```
248
+
249
+ ---
250
+
251
+ ## 🚀 Template Rendering Process
252
+
253
+ ### GitHub Actions Constraint
254
+
255
+ ❌ **GitHub Actions CANNOT reference parent directories**
256
+ - Example: `uses: ../../../../framework/templates/...` ❌ NOT SUPPORTED
257
+
258
+ ✅ **Solution:** Render framework templates into each stack's `.github/` directory
259
+
260
+ **Rendering Flow:**
261
+ ```
262
+ framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs
263
+ ↓ (render with Handlebars)
264
+ stacks/blazor-azure/.github/workflows/dotnet-build.yml
265
+ ↓ (commit to repo)
266
+ GitHub Actions execution
267
+ ```
268
+
269
+ ### Rendering Command (Manual for Now)
270
+
271
+ **Current Approach:**
272
+ ```bash
273
+ # Manual rendering using Node.js script (future: CLI command)
274
+ node scripts/render-github-workflows.js \
275
+ --stack blazor-azure \
276
+ --app-name myapp \
277
+ --dotnet-version 10.0 \
278
+ --output stacks/blazor-azure/.github/
279
+ ```
280
+
281
+ **Future CLI Command:**
282
+ ```bash
283
+ # Planned (not yet implemented)
284
+ morph-spec template render github-workflows \
285
+ --stack blazor-azure \
286
+ --environment prod \
287
+ --output stacks/blazor-azure/.github/
288
+ ```
289
+
290
+ ### What Gets Committed
291
+
292
+ ✅ **Commit:** Rendered `.yml` files in `.github/workflows/` and `.github/actions/`
293
+ ❌ **Don't Commit:** Template sources (`.yml.hbs` files) - these stay in `.morph/templates/`
294
+
295
+ **Example:**
296
+ ```
297
+ # Committed to repo:
298
+ .github/
299
+ ├── workflows/
300
+ │ ├── ci-build.yml # Rendered from template
301
+ │ ├── cd-staging.yml # Rendered from template
302
+ │ └── cd-prod.yml # Rendered from template
303
+ └── actions/
304
+ └── azure-auth/
305
+ └── action.yml # Rendered from template
306
+
307
+ # NOT committed (template sources):
308
+ .morph/templates/infrastructure/github/
309
+ ├── workflows/
310
+ │ ├── ci-build.yml.hbs # Template source
311
+ │ └── ...
312
+ ```
313
+
314
+ ---
315
+
316
+ ## 🔀 Stack Override Mechanism
317
+
318
+ Templates follow the 3-tier resolution hierarchy:
319
+
320
+ 1. **Project-local** (highest priority)
321
+ - `.morph/templates/infrastructure/github/workflows/ci-build.yml.hbs`
322
+ - Use for project-specific customizations
323
+
324
+ 2. **Stack default** (medium priority)
325
+ - `stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/ci-build.yml.hbs`
326
+ - Stack-specific workflows (production, staging, CI)
327
+
328
+ 3. **Framework fallback** (lowest priority)
329
+ - `framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs`
330
+ - Reusable fragments called by stack workflows
331
+
332
+ **Example:**
333
+
334
+ Stack workflow `cd-prod.yml.hbs` **calls** framework workflow `dotnet-build.yml.hbs`:
335
+ ```yaml
336
+ # Stack: stacks/blazor-azure/.morph/templates/.../cd-prod.yml.hbs
337
+ jobs:
338
+ build:
339
+ uses: ./.github/workflows/dotnet-build.yml # Framework template (rendered)
340
+ with:
341
+ dotnet-version: '{{DOTNET_VERSION}}'
342
+ ```
343
+
344
+ ---
345
+
346
+ ## 🧪 Testing & Validation
347
+
348
+ ### Local Testing with `act`
349
+
350
+ Use [act](https://github.com/nektos/act) to test GitHub Actions locally:
351
+
352
+ ```bash
353
+ # Install act
354
+ brew install act # macOS
355
+ # or: choco install act # Windows
356
+
357
+ # List all workflows
358
+ cd stacks/blazor-azure
359
+ act -l
360
+
361
+ # Dry run (validate syntax)
362
+ act --dry-run
363
+
364
+ # Run specific workflow
365
+ act push -W .github/workflows/ci-build.yml
366
+
367
+ # Run with secrets (from .secrets file)
368
+ act push --secret-file .secrets
369
+ ```
370
+
371
+ ### Syntax Validation
372
+
373
+ **Validate YAML syntax:**
374
+ ```bash
375
+ # Using yamllint
376
+ yamllint .github/workflows/*.yml
377
+
378
+ # Using actionlint (GitHub Actions-specific)
379
+ actionlint .github/workflows/*.yml
380
+ ```
381
+
382
+ ### Integration Testing
383
+
384
+ **Test in Staging First:**
385
+ 1. Push to `staging` branch
386
+ 2. Monitor workflow execution in GitHub Actions tab
387
+ 3. Verify deployment to staging environment
388
+ 4. Test health endpoints
389
+ 5. Once validated, merge to `main` for production
390
+
391
+ ---
392
+
393
+ ## 📊 Workflow Examples
394
+
395
+ ### Example 1: CI Build (Blazor-Azure)
396
+
397
+ **Stack Template:** `stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/ci-build.yml.hbs`
398
+
399
+ ```yaml
400
+ name: CI Build
401
+
402
+ on:
403
+ pull_request:
404
+ branches: [main, staging]
405
+ push:
406
+ branches: [main, staging]
407
+
408
+ jobs:
409
+ build:
410
+ uses: ./.github/workflows/dotnet-build.yml
411
+ with:
412
+ dotnet-version: '{{DOTNET_VERSION}}'
413
+ build-configuration: 'Release'
414
+ run-tests: true
415
+
416
+ security:
417
+ runs-on: ubuntu-latest
418
+ steps:
419
+ - uses: actions/checkout@v4
420
+
421
+ - name: Check vulnerable packages
422
+ run: dotnet list package --vulnerable --include-transitive
423
+ ```
424
+
425
+ ### Example 2: Production Deployment (NextJS-Supabase)
426
+
427
+ **Stack Template:** `stacks/nextjs-supabase/.morph/templates/infrastructure/github/workflows/cd-prod.yml.hbs`
428
+
429
+ ```yaml
430
+ name: Deploy to Production
431
+
432
+ on:
433
+ push:
434
+ branches: [main]
435
+
436
+ jobs:
437
+ build-docker:
438
+ uses: ./.github/workflows/docker-build-push.yml
439
+ with:
440
+ registry: 'ghcr.io'
441
+ image-name: '{{GITHUB_OWNER}}/{{kebabCase APP_NAME}}'
442
+ dockerfile-path: 'Dockerfile'
443
+ secrets: inherit
444
+
445
+ deploy:
446
+ needs: build-docker
447
+ uses: ./.github/workflows/deploy-easypanel.yml
448
+ with:
449
+ environment: 'production'
450
+ image: {{{{raw}}}}${{ needs.build-docker.outputs.image-tag }}{{{{/raw}}}}
451
+ secrets: inherit
452
+ ```
453
+
454
+ ---
455
+
456
+ ## 🔧 Customization Guide
457
+
458
+ ### Creating Stack-Specific Workflows
459
+
460
+ 1. **Create override template:**
461
+ ```bash
462
+ mkdir -p stacks/blazor-azure/.morph/templates/infrastructure/github/workflows
463
+ ```
464
+
465
+ 2. **Copy framework template:**
466
+ ```bash
467
+ cp framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs \
468
+ stacks/blazor-azure/.morph/templates/infrastructure/github/workflows/
469
+ ```
470
+
471
+ 3. **Customize:**
472
+ - Add stack-specific jobs (e.g., blue-green deployment)
473
+ - Modify environment variables
474
+ - Add security scanning steps
475
+
476
+ 4. **Render:**
477
+ ```bash
478
+ # Manual rendering (future: CLI command)
479
+ node scripts/render-github-workflows.js --stack blazor-azure
480
+ ```
481
+
482
+ ### Adding Custom Composite Actions
483
+
484
+ 1. **Create action directory:**
485
+ ```bash
486
+ mkdir -p framework/templates/infrastructure/github/actions/my-action
487
+ ```
488
+
489
+ 2. **Create `action.yml.hbs`:**
490
+ ```yaml
491
+ name: 'My Custom Action'
492
+ description: 'Description here'
493
+ inputs:
494
+ my-input:
495
+ description: 'Input description'
496
+ required: true
497
+
498
+ runs:
499
+ using: 'composite'
500
+ steps:
501
+ - name: Do something
502
+ shell: bash
503
+ run: |
504
+ echo "Input: {{{{raw}}}}${{ inputs.my-input }}{{{{/raw}}}}"
505
+ ```
506
+
507
+ 3. **Register in REGISTRY.json:**
508
+ ```json
509
+ {
510
+ "id": "github-action-my-action",
511
+ "name": "My Custom Action",
512
+ "path": "infrastructure/github/actions/my-action/action.yml.hbs",
513
+ "location": "framework",
514
+ "category": "infrastructure",
515
+ "technology": "github-actions",
516
+ "engine": "handlebars"
517
+ }
518
+ ```
519
+
520
+ ---
521
+
522
+ ## 📚 Resources
523
+
524
+ - [GitHub Actions Documentation](https://docs.github.com/en/actions)
525
+ - [Reusable Workflows](https://docs.github.com/en/actions/using-workflows/reusing-workflows)
526
+ - [Composite Actions](https://docs.github.com/en/actions/creating-actions/creating-a-composite-action)
527
+ - [Azure Login Action](https://github.com/Azure/login)
528
+ - [Docker Login Action](https://github.com/docker/login-action)
529
+ - [OIDC in Azure](https://docs.microsoft.com/en-us/azure/active-directory/develop/workload-identity-federation)
530
+
531
+ ---
532
+
533
+ ## 🐛 Troubleshooting
534
+
535
+ ### Common Issues
536
+
537
+ **Issue 1: "uses: path is not valid"**
538
+ ```yaml
539
+ # WRONG
540
+ uses: ../../../../framework/templates/.../workflow.yml
541
+
542
+ # CORRECT
543
+ uses: ./.github/workflows/workflow.yml # Rendered template
544
+ ```
545
+
546
+ **Issue 2: Handlebars placeholders in rendered YAML**
547
+ ```yaml
548
+ # Check for unreplaced placeholders
549
+ grep -r "{{" .github/workflows/
550
+
551
+ # If found, ensure rendering process completed successfully
552
+ ```
553
+
554
+ **Issue 3: OIDC authentication fails**
555
+ ```
556
+ Error: Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable
557
+ ```
558
+
559
+ **Fix:** Ensure federated credentials are configured correctly in Azure AD:
560
+ ```bash
561
+ # Verify federated credential
562
+ az ad app federated-credential show \
563
+ --id <APP_ID> \
564
+ --federated-credential-id github-prod
565
+ ```
566
+
567
+ **Issue 4: Health check fails**
568
+ ```
569
+ curl: (7) Failed to connect to app-myapp-prod.azurewebsites.net
570
+ ```
571
+
572
+ **Fix:** Add startup delay before health check:
573
+ ```yaml
574
+ - name: Wait for app startup
575
+ run: sleep 30
576
+
577
+ - name: Health Check
578
+ run: curl --retry 10 --retry-delay 5 ...
579
+ ```
580
+
581
+ ---
582
+
583
+ ## 🎯 Summary
584
+
585
+ - ✅ **Framework-level reusability** across blazor-azure and nextjs-supabase stacks
586
+ - ✅ **Handlebars v2.0 templating** with helpers (kebabCase, pascalCase, etc.)
587
+ - ✅ **OIDC authentication** for Azure (modern, secure, no long-lived secrets)
588
+ - ✅ **Composite actions** for shared logic (docker-build-push, health-check, azure-auth)
589
+ - ✅ **Reusable workflows** for complete pipelines (dotnet-build, deploy-azure-app-service)
590
+ - ✅ **Stack override mechanism** for customization (3-tier resolution)
591
+ - ✅ **Rendered outputs committed** to `.github/` (GitHub Actions constraint)
592
+
593
+ For questions or issues, see [framework/templates/README.md](../README.md) or open a GitHub issue.
@@ -0,0 +1,22 @@
1
+ name: 'Azure Authentication'
2
+ description: 'Login to Azure using OIDC'
3
+ inputs:
4
+ client-id:
5
+ description: 'Azure Client ID'
6
+ required: true
7
+ tenant-id:
8
+ description: 'Azure Tenant ID'
9
+ required: true
10
+ subscription-id:
11
+ description: 'Azure Subscription ID'
12
+ required: true
13
+
14
+ runs:
15
+ using: 'composite'
16
+ steps:
17
+ - name: Azure Login (OIDC)
18
+ uses: azure/login@v1
19
+ with:
20
+ client-id: ${{{{ inputs.client-id }}}}
21
+ tenant-id: ${{{{ inputs.tenant-id }}}}
22
+ subscription-id: ${{{{ inputs.subscription-id }}}}
@@ -0,0 +1,45 @@
1
+ name: 'Build & Push Docker Image'
2
+ description: 'Build multi-stage Docker image and push to registry'
3
+ inputs:
4
+ registry:
5
+ description: 'Docker registry URL'
6
+ required: true
7
+ image-name:
8
+ description: 'Docker image name'
9
+ required: true
10
+ dockerfile-path:
11
+ description: 'Path to Dockerfile'
12
+ required: false
13
+ default: 'Dockerfile'
14
+ build-context:
15
+ description: 'Docker build context'
16
+ required: false
17
+ default: '.'
18
+ outputs:
19
+ image-tag:
20
+ description: 'Full image tag with registry'
21
+ value: ${{{{ steps.build.outputs.tags }}}}
22
+
23
+ runs:
24
+ using: 'composite'
25
+ steps:
26
+ - name: Set up Docker Buildx
27
+ uses: docker/setup-buildx-action@v3
28
+
29
+ - name: Login to Registry
30
+ uses: docker/login-action@v3
31
+ with:
32
+ registry: ${{{{ inputs.registry }}}}
33
+ username: ${{{{ secrets.REGISTRY_USERNAME }}}}
34
+ password: ${{{{ secrets.REGISTRY_PASSWORD }}}}
35
+
36
+ - name: Build and push
37
+ id: build
38
+ uses: docker/build-push-action@v5
39
+ with:
40
+ context: ${{{{ inputs.build-context }}}}
41
+ file: ${{{{ inputs.dockerfile-path }}}}
42
+ push: true
43
+ tags: ${{{{ inputs.registry }}}}/${{{{ inputs.image-name }}}}:${{{{ github.sha }}}}
44
+ cache-from: type=gha
45
+ cache-to: type=gha,mode=max
@@ -0,0 +1,27 @@
1
+ name: 'Health Check'
2
+ description: 'Poll health endpoint until ready'
3
+ inputs:
4
+ url:
5
+ description: 'Health check URL'
6
+ required: true
7
+ timeout:
8
+ description: 'Timeout in seconds'
9
+ required: false
10
+ default: '300'
11
+ interval:
12
+ description: 'Polling interval in seconds'
13
+ required: false
14
+ default: '5'
15
+
16
+ runs:
17
+ using: 'composite'
18
+ steps:
19
+ - name: Wait for health
20
+ shell: bash
21
+ run: |
22
+ RETRIES=$(($${{{{ inputs.timeout }}}} / ${{{{ inputs.interval }}}}))
23
+ curl --retry $RETRIES \
24
+ --retry-delay ${{{{ inputs.interval }}}} \
25
+ --retry-connrefused \
26
+ --fail \
27
+ ${{{{ inputs.url }}}}