@polymorphism-tech/morph-spec 4.12.0 → 4.13.0

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 (314) hide show
  1. package/README.md +21 -29
  2. package/bin/morph-spec.js +41 -24
  3. package/bin/task-manager.js +962 -1341
  4. package/bin/validate.js +1 -1
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +10 -11
  7. package/docs/QUICKSTART.md +15 -15
  8. package/framework/CLAUDE.md +5 -2
  9. package/framework/agents/README.md +3 -4
  10. package/framework/agents/ai-agents/ai-system-architect.md +6 -10
  11. package/framework/agents/architecture/seo-growth-hacker.md +166 -326
  12. package/framework/agents/architecture/standards-architect.md +21 -31
  13. package/framework/agents/backend/dotnet-senior.md +160 -86
  14. package/framework/agents/backend/ef-modeler.md +2 -6
  15. package/framework/agents/backend/hangfire-orchestrator.md +8 -9
  16. package/framework/agents/backend/ms-agent-expert.md +1 -1
  17. package/framework/agents/frontend/nextjs-expert.md +198 -133
  18. package/framework/agents/frontend/ui-ux-designer.md +226 -267
  19. package/framework/agents/infrastructure/infra-architect.md +191 -27
  20. package/framework/agents/integrations/clerk-auth.md +19 -26
  21. package/framework/agents/integrations/hangfire-integration.md +1 -4
  22. package/framework/agents.json +215 -1453
  23. package/framework/commands/morph-apply.md +4 -4
  24. package/framework/commands/morph-preflight.md +4 -26
  25. package/framework/commands/morph-proposal.md +19 -19
  26. package/framework/commands/morph-status.md +2 -2
  27. package/framework/commands/morph-troubleshoot.md +6 -13
  28. package/framework/hooks/README.md +1 -6
  29. package/framework/hooks/claude-code/post-tool-use/validator-feedback.js +4 -6
  30. package/framework/hooks/claude-code/pre-compact/save-morph-context.js +12 -7
  31. package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +2 -2
  32. package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +2 -2
  33. package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +5 -10
  34. package/framework/hooks/claude-code/session-start/inject-morph-context.js +63 -30
  35. package/framework/hooks/claude-code/session-start/resume-context.js +77 -0
  36. package/framework/hooks/claude-code/statusline.py +4 -5
  37. package/framework/hooks/claude-code/stop/validate-completion.js +4 -4
  38. package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +8 -8
  39. package/framework/hooks/shared/compact-restore.js +28 -5
  40. package/framework/hooks/shared/phase-utils.js +4 -8
  41. package/framework/hooks/shared/state-reader.js +34 -3
  42. package/framework/phases.json +7 -45
  43. package/framework/rules/ai-agents-standards.md +15 -0
  44. package/framework/rules/asaas-standards.md +13 -0
  45. package/framework/rules/clerk-standards.md +13 -0
  46. package/framework/rules/csharp-standards.md +8 -4
  47. package/framework/rules/data-standards.md +18 -0
  48. package/framework/rules/dotnet-templates.md +87 -0
  49. package/framework/rules/frontend-standards.md +13 -13
  50. package/framework/rules/hangfire-standards.md +13 -0
  51. package/framework/rules/infrastructure-standards.md +27 -16
  52. package/framework/rules/morph-workflow.md +73 -13
  53. package/framework/rules/nextjs-standards.md +1 -0
  54. package/framework/rules/nextjs-templates.md +40 -0
  55. package/framework/rules/resend-standards.md +12 -0
  56. package/framework/rules/supabase-standards.md +29 -0
  57. package/framework/skills/README.md +6 -8
  58. package/framework/skills/level-0-meta/mcp-registry.json +21 -99
  59. package/framework/{standards/ai-agents/team-orchestration.md → skills/level-0-meta/morph-agent-teams/SKILL.md} +472 -479
  60. package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +28 -1
  61. package/framework/skills/level-0-meta/morph-checklist/SKILL.md +2 -2
  62. package/framework/skills/level-0-meta/morph-code-review/SKILL.md +1 -5
  63. package/framework/skills/level-0-meta/morph-code-review/scripts/scan-csharp.mjs +1 -1
  64. package/framework/skills/level-0-meta/morph-frontend-review/SKILL.md +23 -41
  65. package/framework/skills/level-0-meta/morph-init/SKILL.md +18 -14
  66. package/framework/skills/level-0-meta/morph-parallel-dispatch/SKILL.md +225 -0
  67. package/framework/skills/level-0-meta/morph-post-implementation/SKILL.md +20 -0
  68. package/framework/skills/level-0-meta/morph-tool-usage-guide/SKILL.md +4 -8
  69. package/framework/skills/level-0-meta/morph-tool-usage-guide/references/tools-per-phase.md +15 -59
  70. package/framework/skills/level-0-meta/morph-verification-before-completion/SKILL.md +7 -19
  71. package/framework/skills/level-0-meta/morph-verification-before-completion/scripts/check-phase-outputs.mjs +8 -8
  72. package/framework/skills/level-1-workflows/README.md +1 -1
  73. package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +49 -50
  74. package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +58 -124
  75. package/framework/skills/level-1-workflows/morph-phase-design/references/architecture-analysis-guide.md +5 -50
  76. package/framework/skills/level-1-workflows/morph-phase-design/references/spec-example.md +1 -1
  77. package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +127 -159
  78. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +4 -3
  79. package/framework/skills/level-1-workflows/morph-phase-implement/prompts/spec-reviewer-prompt.md +2 -2
  80. package/framework/skills/level-1-workflows/morph-phase-implement/references/recap-example.md +1 -1
  81. package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +17 -13
  82. package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +22 -40
  83. package/framework/skills/level-1-workflows/morph-phase-tasks/references/task-planning-patterns.md +0 -2
  84. package/framework/skills/level-1-workflows/morph-phase-tasks/references/tasks-example.md +5 -5
  85. package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +57 -77
  86. package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
  87. package/framework/squad-templates/backend-only.json +6 -6
  88. package/framework/squad-templates/frontend-only.json +17 -8
  89. package/framework/squad-templates/full-stack.json +29 -24
  90. package/framework/standards/STANDARDS.json +1021 -2369
  91. package/framework/standards/backend/dotnet/fluent-validation-vsa.md +200 -0
  92. package/framework/standards/backend/dotnet/result-pattern.md +213 -0
  93. package/framework/standards/backend/dotnet/scalar-ui.md +172 -0
  94. package/framework/standards/backend/dotnet/scrutor.md +158 -0
  95. package/framework/standards/backend/dotnet/vsa-handler-patterns.md +274 -0
  96. package/framework/standards/frontend/nextjs/motion-patterns.md +1 -1
  97. package/framework/standards/infrastructure/supabase/mcp-setup.md +83 -193
  98. package/framework/standards/integration/mcp/mcp-tools.md +91 -77
  99. package/framework/templates/IDE-SNIPPETS.md +2 -6
  100. package/framework/templates/README.md +709 -814
  101. package/framework/templates/REGISTRY.json +223 -762
  102. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -0
  103. package/framework/templates/code/dotnet/abstractions/error.cs +60 -0
  104. package/framework/templates/code/dotnet/abstractions/handler.cs +12 -0
  105. package/framework/templates/code/dotnet/abstractions/result.cs +74 -0
  106. package/framework/templates/code/dotnet/backend/repository.cs +148 -141
  107. package/framework/templates/code/dotnet/constants/api-tags.cs +6 -0
  108. package/framework/templates/code/dotnet/exceptions/exception-handler.cs +32 -0
  109. package/framework/templates/code/dotnet/extensions/database-extensions.cs +20 -0
  110. package/framework/templates/code/dotnet/extensions/handler-registration.cs +38 -0
  111. package/framework/templates/code/dotnet/extensions/health-checks.cs +24 -0
  112. package/framework/templates/code/dotnet/extensions/map-endpoints.cs +35 -0
  113. package/framework/templates/code/dotnet/extensions/result-extensions.cs +29 -0
  114. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -0
  115. package/framework/templates/code/dotnet/feature/entity.cs.hbs +8 -0
  116. package/framework/templates/code/dotnet/feature/errors.cs.hbs +8 -0
  117. package/framework/templates/code/dotnet/feature/handler.cs.hbs +24 -0
  118. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -0
  119. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -0
  120. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -0
  121. package/framework/templates/code/dotnet/jobs/job.cs +21 -17
  122. package/framework/templates/code/dotnet/pipelines/logging-decorator.cs +31 -0
  123. package/framework/templates/code/dotnet/pipelines/validation-decorator.cs +97 -0
  124. package/framework/templates/code/dotnet/test.cs +192 -106
  125. package/framework/templates/context/ARCHITECTURE.md +89 -0
  126. package/framework/templates/context/CONTEXT-FEATURE.md +2 -2
  127. package/framework/templates/context/CONTEXT.md +180 -181
  128. package/framework/templates/context/design-system.md +1 -5
  129. package/framework/templates/docs/onboarding.md +2 -3
  130. package/framework/templates/docs/proposal.md +171 -182
  131. package/framework/templates/docs/spec.md +1 -3
  132. package/framework/templates/docs/ui-components.md +0 -72
  133. package/framework/templates/examples/design-system-examples.md +4 -4
  134. package/framework/templates/feature/decisions.md +0 -66
  135. package/framework/templates/feature/recap.md +1 -2
  136. package/framework/templates/infrastructure/github/README.md +56 -593
  137. package/framework/templates/integrations/clerk-config.cs +0 -41
  138. package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
  139. package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -2
  140. package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +83 -126
  141. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +2 -2
  142. package/framework/templates/project/validate.js +2 -4
  143. package/framework/templates/ui/design-system.css +1 -1
  144. package/framework/workflows/README.md +8 -8
  145. package/framework/workflows/configs/fast-track.json +51 -0
  146. package/framework/workflows/configs/full.json +68 -0
  147. package/framework/workflows/configs/standard.json +7 -3
  148. package/framework/workflows/docs/STORY-DRIVEN-DEVELOPMENT.md +1 -1
  149. package/framework/workflows/docs/enforcement-pipeline.md +18 -19
  150. package/framework/workflows/docs/full-morph.md +69 -76
  151. package/framework/workflows/docs/standard.md +49 -44
  152. package/framework/workflows/docs/ui-refresh.md +1 -1
  153. package/package.json +3 -3
  154. package/src/commands/agents/dispatch-agents.js +55 -116
  155. package/src/commands/context/context-refresh.js +79 -0
  156. package/src/commands/phase/phase-reset.js +1 -1
  157. package/src/commands/project/doctor.js +10 -32
  158. package/src/commands/project/init.js +12 -0
  159. package/src/commands/project/status.js +6 -12
  160. package/src/commands/scaffold/scaffold.js +131 -0
  161. package/src/commands/scope/escalate.js +1 -1
  162. package/src/commands/state/advance-phase.js +15 -29
  163. package/src/commands/state/state.js +20 -5
  164. package/src/commands/tasks/task.js +0 -30
  165. package/src/commands/validation/validate-feature.js +3 -10
  166. package/src/core/paths/output-schema.js +12 -13
  167. package/src/core/state/phase-state-machine.js +211 -217
  168. package/src/core/state/state-manager.js +9 -9
  169. package/src/lib/agents/agents-manager.js +2 -2
  170. package/src/lib/agents/output-collector.js +1 -2
  171. package/src/lib/detectors/design-system-detector.js +4 -4
  172. package/src/lib/detectors/index.js +1 -11
  173. package/src/lib/generators/architecture-scanner.js +640 -0
  174. package/src/lib/generators/context-generator.js +3 -3
  175. package/src/lib/generators/design-system-generator.js +508 -587
  176. package/src/lib/generators/index.js +12 -10
  177. package/src/lib/generators/metadata-extractor.js +386 -387
  178. package/src/lib/generators/recap-generator.js +4 -4
  179. package/src/lib/generators/scaffold-generator.js +317 -0
  180. package/src/lib/generators/settings-generator.js +0 -1
  181. package/src/lib/phase-chain/phase-validator.js +64 -42
  182. package/src/lib/stack/stack-profile.js +2 -2
  183. package/src/lib/standards/digest-builder.js +72 -285
  184. package/src/lib/tasks/task-parser.js +11 -5
  185. package/src/lib/validators/architecture/architecture-validator.js +259 -387
  186. package/src/lib/validators/content/content-validator.js +287 -287
  187. package/src/lib/validators/css/css-validator.js +340 -352
  188. package/src/lib/validators/packages/package-validator.js +347 -360
  189. package/src/lib/validators/shared/issue-counter.js +14 -18
  190. package/src/lib/validators/validation-runner.js +3 -19
  191. package/src/scripts/setup-infra.js +1 -1
  192. package/src/utils/agents-installer.js +24 -3
  193. package/src/utils/file-copier.js +1 -0
  194. package/src/utils/hooks-installer.js +11 -19
  195. package/src/utils/skills-installer.js +178 -178
  196. package/framework/agents/architecture/prompt-engineer.md +0 -195
  197. package/framework/agents/backend/api-designer.md +0 -106
  198. package/framework/agents/frontend/blazor-builder.md +0 -229
  199. package/framework/agents/frontend/nextjs-ui-specialist.md +0 -218
  200. package/framework/agents/infrastructure/azure-architect.md +0 -150
  201. package/framework/agents/infrastructure/azure-deploy-specialist.md +0 -707
  202. package/framework/agents/infrastructure/bicep-architect.md +0 -132
  203. package/framework/agents/infrastructure/container-specialist.md +0 -137
  204. package/framework/agents/infrastructure/devops-engineer.md +0 -126
  205. package/framework/agents/integrations/azure-identity.md +0 -148
  206. package/framework/agents/quality/code-analyzer.md +0 -239
  207. package/framework/agents/quality/testing-specialist.md +0 -130
  208. package/framework/hooks/claude-code/notification/approval-reminder.js +0 -57
  209. package/framework/hooks/claude-code/post-tool-use/context-refresh.js +0 -109
  210. package/framework/hooks/claude-code/post-tool-use/skill-reminder.js +0 -78
  211. package/framework/index/troubleshooting-index.json +0 -184
  212. package/framework/rules/testing-standards.md +0 -14
  213. package/framework/skills/level-0-meta/morph-replicate/SKILL.md +0 -230
  214. package/framework/skills/level-0-meta/morph-replicate/references/blazor-html-mapping.md +0 -70
  215. package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +0 -256
  216. package/framework/skills/level-1-workflows/morph-phase-clarify/references/clarifications-example.md +0 -117
  217. package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +0 -269
  218. package/framework/standards/ai-agents/blazor-ui.md +0 -364
  219. package/framework/standards/architecture/ddd/aggregates.md +0 -120
  220. package/framework/standards/architecture/ddd/bounded-contexts.md +0 -105
  221. package/framework/standards/architecture/ddd/complexity-levels.md +0 -108
  222. package/framework/standards/architecture/ddd/entities.md +0 -99
  223. package/framework/standards/architecture/ddd/ubiquitous-language.md +0 -58
  224. package/framework/standards/architecture/ddd/value-objects.md +0 -124
  225. package/framework/standards/backend/api/minimal-api.md +0 -494
  226. package/framework/standards/backend/api/rest.md +0 -492
  227. package/framework/standards/backend/authentication/passkeys.md +0 -428
  228. package/framework/standards/backend/database/ef-core.md +0 -199
  229. package/framework/standards/backend/database/migrations.md +0 -393
  230. package/framework/standards/backend/database/repository-patterns.md +0 -528
  231. package/framework/standards/backend/dotnet/async.md +0 -366
  232. package/framework/standards/backend/dotnet/core.md +0 -117
  233. package/framework/standards/backend/dotnet/di.md +0 -439
  234. package/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
  235. package/framework/standards/context/analytics.md +0 -96
  236. package/framework/standards/context/bundles.md +0 -110
  237. package/framework/standards/context/priming.md +0 -78
  238. package/framework/standards/core/architecture.md +0 -185
  239. package/framework/standards/core/coding.md +0 -214
  240. package/framework/standards/core/git-branching-strategy.md +0 -403
  241. package/framework/standards/core/git.md +0 -185
  242. package/framework/standards/core/testing.md +0 -295
  243. package/framework/standards/data/nosql/blob-storage.md +0 -102
  244. package/framework/standards/data/vector-search/azure-ai-search.md +0 -121
  245. package/framework/standards/frontend/blazor/design-checklist.md +0 -222
  246. package/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
  247. package/framework/standards/frontend/blazor/fluent-ui.md +0 -137
  248. package/framework/standards/frontend/blazor/html-conversion.md +0 -184
  249. package/framework/standards/frontend/blazor/lifecycle.md +0 -195
  250. package/framework/standards/frontend/blazor/pitfalls.md +0 -198
  251. package/framework/standards/frontend/blazor/state.md +0 -191
  252. package/framework/standards/frontend/design-system/aesthetic-direction.md +0 -266
  253. package/framework/standards/frontend/design-system/design-trends.md +0 -171
  254. package/framework/standards/infrastructure/azure/azure.md +0 -624
  255. package/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
  256. package/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
  257. package/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
  258. package/framework/standards/infrastructure/azure/services/functions.md +0 -486
  259. package/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
  260. package/framework/standards/infrastructure/azure/services/storage.md +0 -407
  261. package/framework/standards/infrastructure/vercel/vercel-database.md +0 -106
  262. package/framework/standards/integration/api/graphql.md +0 -91
  263. package/framework/standards/integration/api/grpc.md +0 -114
  264. package/framework/standards/integration/api/rest-design.md +0 -95
  265. package/framework/standards/integration/event-driven/cqrs.md +0 -101
  266. package/framework/standards/integration/event-driven/event-sourcing.md +0 -124
  267. package/framework/standards/integration/event-driven/service-bus.md +0 -95
  268. package/framework/standards/observability/logging.md +0 -131
  269. package/framework/standards/observability/metrics.md +0 -121
  270. package/framework/standards/observability/monitoring.md +0 -114
  271. package/framework/standards/observability/tracing.md +0 -132
  272. package/framework/standards/workflows/parallel-execution.md +0 -112
  273. package/framework/standards/workflows/thread-management.md +0 -113
  274. package/framework/templates/code/dotnet/backend/service.cs +0 -139
  275. package/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
  276. package/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
  277. package/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
  278. package/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
  279. package/framework/templates/code/dotnet/contracts/contracts-level1.cs +0 -69
  280. package/framework/templates/code/dotnet/contracts/contracts-level2.cs +0 -86
  281. package/framework/templates/code/dotnet/contracts/contracts-level3.cs +0 -41
  282. package/framework/templates/code/dotnet/frontend/component.razor +0 -239
  283. package/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
  284. package/framework/templates/infrastructure/azure/README.md +0 -286
  285. package/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
  286. package/framework/templates/infrastructure/azure/app-service.bicep +0 -164
  287. package/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
  288. package/framework/templates/infrastructure/azure/container-app.bicep +0 -156
  289. package/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
  290. package/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
  291. package/framework/templates/infrastructure/azure/deploy.sh +0 -208
  292. package/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
  293. package/framework/templates/infrastructure/azure/main.bicep +0 -189
  294. package/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
  295. package/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
  296. package/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
  297. package/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
  298. package/framework/templates/infrastructure/azure/storage.bicep +0 -106
  299. package/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
  300. package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
  301. package/framework/templates/integrations/azure-identity-config.cs +0 -288
  302. package/framework/templates/project-structure/dotnet-ddd.md +0 -70
  303. package/framework/templates/saas/subscription.cs +0 -347
  304. package/framework/templates/saas/tenant.cs +0 -338
  305. package/framework/templates/ui/FluentDesignTheme.cs +0 -149
  306. package/framework/templates/ui/MudTheme.cs +0 -281
  307. package/framework/workflows/configs/nodejs-cli.json +0 -40
  308. package/src/commands/standards/context-budget.js +0 -89
  309. package/src/lib/standards/index.js +0 -7
  310. package/src/lib/standards/standards-context-injector.js +0 -302
  311. package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +0 -316
  312. package/src/lib/validators/blazor/blazor-state-validator.js +0 -279
  313. package/src/lib/validators/blazor/blazor-validator.js +0 -369
  314. package/src/lib/validators/blazor/index.js +0 -9
@@ -1,239 +0,0 @@
1
- @* ============================================================
2
- BLAZOR COMPONENT TEMPLATE
3
- Generated by MORPH Framework
4
- ============================================================ *@
5
-
6
- @page "/{{kebabCase FEATURE_NAME}}/{{kebabCase FEATURE_NAME}}s"
7
- @attribute [Authorize(Policy = "CanView{{pascalCase FEATURE_NAME}}")]
8
- @inject I{{pascalCase FEATURE_NAME}}Service {{pascalCase FEATURE_NAME}}Service
9
- @inject ILogger<{{pascalCase FEATURE_NAME}}List> Logger
10
- @inject NavigationManager Navigation
11
-
12
- <PageTitle>{{pascalCase FEATURE_NAME}}s</PageTitle>
13
-
14
- <div class="container-fluid">
15
- <div class="row mb-4">
16
- <div class="col">
17
- <h1>{{pascalCase FEATURE_NAME}}s</h1>
18
- </div>
19
- <div class="col-auto">
20
- <AuthorizeView Policy="CanManage{{pascalCase FEATURE_NAME}}">
21
- <button class="btn btn-primary" @onclick="ShowCreateModal">
22
- <i class="bi bi-plus-lg"></i> New {{pascalCase FEATURE_NAME}}
23
- </button>
24
- </AuthorizeView>
25
- </div>
26
- </div>
27
-
28
- @if (_isLoading)
29
- {
30
- <div class="d-flex justify-content-center py-5">
31
- <div class="spinner-border text-primary" role="status">
32
- <span class="visually-hidden">Loading...</span>
33
- </div>
34
- </div>
35
- }
36
- else if (_error is not null)
37
- {
38
- <div class="alert alert-danger" role="alert">
39
- <i class="bi bi-exclamation-triangle"></i>
40
- @_error
41
- <button class="btn btn-link" @onclick="LoadDataAsync">Retry</button>
42
- </div>
43
- }
44
- else if (_items is null || !_items.Any())
45
- {
46
- <div class="text-center py-5">
47
- <i class="bi bi-inbox display-1 text-muted"></i>
48
- <p class="lead mt-3">No {{kebabCase FEATURE_NAME}}s found</p>
49
- <AuthorizeView Policy="CanManage{{pascalCase FEATURE_NAME}}">
50
- <button class="btn btn-primary" @onclick="ShowCreateModal">
51
- Create your first {{kebabCase FEATURE_NAME}}
52
- </button>
53
- </AuthorizeView>
54
- </div>
55
- }
56
- else
57
- {
58
- <div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-4">
59
- @foreach (var item in _items)
60
- {
61
- <div class="col">
62
- <div class="card h-100">
63
- <div class="card-body">
64
- <h5 class="card-title">@item.Name</h5>
65
- <p class="card-text">
66
- <span class="badge @GetStatusBadgeClass(item.Status)">
67
- @item.Status
68
- </span>
69
- </p>
70
- </div>
71
- <div class="card-footer bg-transparent">
72
- <small class="text-muted">
73
- Created @item.CreatedAt.ToString("d")
74
- </small>
75
- <AuthorizeView Policy="CanManage{{pascalCase FEATURE_NAME}}">
76
- <div class="float-end">
77
- <button class="btn btn-sm btn-outline-primary"
78
- @onclick="() => ShowEditModal(item)">
79
- Edit
80
- </button>
81
- </div>
82
- </AuthorizeView>
83
- </div>
84
- </div>
85
- </div>
86
- }
87
- </div>
88
- }
89
- </div>
90
-
91
- @* Modal for Create/Edit *@
92
- @if (_showModal)
93
- {
94
- <div class="modal fade show d-block" tabindex="-1" style="background: rgba(0,0,0,0.5)">
95
- <div class="modal-dialog">
96
- <div class="modal-content">
97
- <div class="modal-header">
98
- <h5 class="modal-title">
99
- @(_editingItem is null ? "New {{pascalCase FEATURE_NAME}}" : "Edit {{pascalCase FEATURE_NAME}}")
100
- </h5>
101
- <button type="button" class="btn-close" @onclick="CloseModal"></button>
102
- </div>
103
- <EditForm Model="_formModel" OnValidSubmit="HandleSubmitAsync">
104
- <DataAnnotationsValidator />
105
- <div class="modal-body">
106
- <div class="mb-3">
107
- <label class="form-label">Name</label>
108
- <InputText class="form-control" @bind-Value="_formModel.Name" />
109
- <ValidationMessage For="() => _formModel.Name" />
110
- </div>
111
- @* Add more fields as needed *@
112
- </div>
113
- <div class="modal-footer">
114
- <button type="button" class="btn btn-secondary" @onclick="CloseModal">
115
- Cancel
116
- </button>
117
- <button type="submit" class="btn btn-primary" disabled="@_isSaving">
118
- @if (_isSaving)
119
- {
120
- <span class="spinner-border spinner-border-sm"></span>
121
- }
122
- Save
123
- </button>
124
- </div>
125
- </EditForm>
126
- </div>
127
- </div>
128
- </div>
129
- }
130
-
131
- @code {
132
- private List<{{pascalCase FEATURE_NAME}}Dto>? _items;
133
- private bool _isLoading = true;
134
- private bool _showModal;
135
- private bool _isSaving;
136
- private string? _error;
137
- private {{pascalCase FEATURE_NAME}}Dto? _editingItem;
138
- private {{pascalCase FEATURE_NAME}}FormModel _formModel = new();
139
-
140
- protected override async Task OnInitializedAsync()
141
- {
142
- await LoadDataAsync();
143
- }
144
-
145
- private async Task LoadDataAsync()
146
- {
147
- _isLoading = true;
148
- _error = null;
149
-
150
- try
151
- {
152
- _items = await {{pascalCase FEATURE_NAME}}Service.GetAllAsync();
153
- }
154
- catch (Exception ex)
155
- {
156
- Logger.LogError(ex, "Failed to load {{kebabCase FEATURE_NAME}}s");
157
- _error = "Failed to load data. Please try again.";
158
- }
159
- finally
160
- {
161
- _isLoading = false;
162
- }
163
- }
164
-
165
- private void ShowCreateModal()
166
- {
167
- _editingItem = null;
168
- _formModel = new {{pascalCase FEATURE_NAME}}FormModel();
169
- _showModal = true;
170
- }
171
-
172
- private void ShowEditModal({{pascalCase FEATURE_NAME}}Dto item)
173
- {
174
- _editingItem = item;
175
- _formModel = new {{pascalCase FEATURE_NAME}}FormModel
176
- {
177
- Name = item.Name
178
- // Map other fields
179
- };
180
- _showModal = true;
181
- }
182
-
183
- private void CloseModal()
184
- {
185
- _showModal = false;
186
- _formModel = new();
187
- }
188
-
189
- private async Task HandleSubmitAsync()
190
- {
191
- _isSaving = true;
192
-
193
- try
194
- {
195
- if (_editingItem is null)
196
- {
197
- // Create
198
- var request = new Create{{pascalCase FEATURE_NAME}}Request(_formModel.Name);
199
- await {{pascalCase FEATURE_NAME}}Service.CreateAsync(request);
200
- }
201
- else
202
- {
203
- // Update
204
- var request = new Update{{pascalCase FEATURE_NAME}}Request(_formModel.Name);
205
- await {{pascalCase FEATURE_NAME}}Service.UpdateAsync(_editingItem.Id, request);
206
- }
207
-
208
- CloseModal();
209
- await LoadDataAsync();
210
- }
211
- catch (Exception ex)
212
- {
213
- Logger.LogError(ex, "Failed to save {{kebabCase FEATURE_NAME}}");
214
- // Show error to user
215
- }
216
- finally
217
- {
218
- _isSaving = false;
219
- }
220
- }
221
-
222
- private static string GetStatusBadgeClass({{pascalCase FEATURE_NAME}}Status status) => status switch
223
- {
224
- {{pascalCase FEATURE_NAME}}Status.Active => "bg-success",
225
- {{pascalCase FEATURE_NAME}}Status.Pending => "bg-warning text-dark",
226
- {{pascalCase FEATURE_NAME}}Status.Completed => "bg-info",
227
- {{pascalCase FEATURE_NAME}}Status.Failed => "bg-danger",
228
- _ => "bg-secondary"
229
- };
230
-
231
- private class {{pascalCase FEATURE_NAME}}FormModel
232
- {
233
- [Required]
234
- [StringLength(200, MinimumLength = 3)]
235
- public string Name { get; set; } = string.Empty;
236
-
237
- // Add more fields as needed
238
- }
239
- }
@@ -1,82 +0,0 @@
1
- # ==============================================================================
2
- # MORPH-SPEC - .NET 8 Blazor Server Dockerfile
3
- # Multi-stage build for production-ready container
4
- # ==============================================================================
5
-
6
- # ==============================================================================
7
- # Stage 1: Base Runtime
8
- # ==============================================================================
9
- FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
10
-
11
- # Set working directory
12
- WORKDIR /app
13
-
14
- # Expose ports
15
- EXPOSE 8080
16
- EXPOSE 8081
17
-
18
- # Create non-root user for security
19
- RUN adduser --disabled-password --gecos '' appuser && chown -R appuser /app
20
- USER appuser
21
-
22
- # ==============================================================================
23
- # Stage 2: Build
24
- # ==============================================================================
25
- FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
26
-
27
- # Set working directory
28
- WORKDIR /src
29
-
30
- # Copy project files
31
- # Adjust paths according to your solution structure
32
- COPY ["src/YourApp/YourApp.csproj", "src/YourApp/"]
33
- COPY ["src/YourApp.Core/YourApp.Core.csproj", "src/YourApp.Core/"]
34
- COPY ["src/YourApp.Infrastructure/YourApp.Infrastructure.csproj", "src/YourApp.Infrastructure/"]
35
-
36
- # Restore dependencies
37
- RUN dotnet restore "src/YourApp/YourApp.csproj"
38
-
39
- # Copy all source code
40
- COPY . .
41
-
42
- # Build project
43
- WORKDIR "/src/src/YourApp"
44
- RUN dotnet build "YourApp.csproj" -c Release -o /app/build
45
-
46
- # ==============================================================================
47
- # Stage 3: Publish
48
- # ==============================================================================
49
- FROM build AS publish
50
-
51
- # Publish application
52
- RUN dotnet publish "YourApp.csproj" \
53
- -c Release \
54
- -o /app/publish \
55
- /p:UseAppHost=false \
56
- /p:PublishTrimmed=false \
57
- /p:PublishSingleFile=false
58
-
59
- # ==============================================================================
60
- # Stage 4: Final
61
- # ==============================================================================
62
- FROM base AS final
63
-
64
- # Set working directory
65
- WORKDIR /app
66
-
67
- # Copy published files from publish stage
68
- COPY --from=publish /app/publish .
69
-
70
- # Set environment variables
71
- ENV ASPNETCORE_URLS=http://+:8080
72
- ENV ASPNETCORE_ENVIRONMENT=Production
73
- ENV DOTNET_RUNNING_IN_CONTAINER=true
74
- ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
75
-
76
- # Health check endpoint
77
- # Adjust path to match your health check endpoint
78
- HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
79
- CMD curl -f http://localhost:8080/health || exit 1
80
-
81
- # Set entry point
82
- ENTRYPOINT ["dotnet", "YourApp.dll"]
@@ -1,286 +0,0 @@
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*
@@ -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